ETH Price: $2,448.17 (+1.90%)

Token

Proof of Chad (POC)
 

Overview

Max Total Supply

723 POC

Holders

336

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 POC
0x8775970f89c03a0ac5bac88d4a3e05d3c2f156d7
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:
ProofOfChad

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-07
*/

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.13;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

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

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. See {ERC721A-_approve}.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     */
    function approve(address to, uint256 tokenId) public payable virtual override {
        _approve(to, tokenId, true);
    }

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

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


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

    /**
     * @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:
     *
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId, bool approvalCheck) internal virtual {
        address owner = ownerOf(tokenId);

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

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

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

abstract contract Ownable {
    address public owner; 
    constructor() { owner = msg.sender; }
    modifier onlyOwner { require(owner == msg.sender, "Not Owner!"); _; }
    function transferOwnership(address new_) external onlyOwner { owner = new_; }
}

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

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);
            }
        }
        _;
    }
}

abstract contract MerkleProof {
    bytes32 internal _merkleRoot;
    bytes32 internal _merkleRoot2;
    function _setMerkleRoot(bytes32 merkleRoot_) internal virtual {
        _merkleRoot = merkleRoot_;
    }

    function _setMerkleRoot2(bytes32 merkleRoot_) internal virtual {
        _merkleRoot2 = merkleRoot_;
    }

    function isWhitelisted(address address_, bytes32[] memory proof_) public view returns (bool) {
        bytes32 _leaf = keccak256(abi.encodePacked(address_));
        for (uint256 i = 0; i < proof_.length; i++) {
            _leaf = _leaf < proof_[i] ? keccak256(abi.encodePacked(_leaf, proof_[i])) : keccak256(abi.encodePacked(proof_[i], _leaf));
        }
        return _leaf == _merkleRoot;
    }

    function isWhitelisted2(address address_, bytes32[] memory proof_) public view returns (bool) {
        bytes32 _leaf = keccak256(abi.encodePacked(address_));
        for (uint256 i = 0; i < proof_.length; i++) {
            _leaf = _leaf < proof_[i] ? keccak256(abi.encodePacked(_leaf, proof_[i])) : keccak256(abi.encodePacked(proof_[i], _leaf));
        }
        return _leaf == _merkleRoot2;
    }
}

/*
/
//
///
//
/
*/

contract ProofOfChad is ERC721A, Ownable, OperatorFilterer, MerkleProof {

    uint256 public maxToken = 5555;
    uint256 public mintMax = 5; 
    uint256 public chadlistMintMax = 3; 

    // booleans for if mint is enabled
    bool public publicMintEnabled = false;
    bool public chadlistMintEnabled = false;

    uint256 public chadlistMintPrice = 0.007 ether;
    uint256 public pbmintPrice = 0.01 ether;

    string private baseTokenURI;

    mapping(address => uint256) public chadlistMinted;
    mapping(address => uint256) public pbMinted;

    constructor() ERC721A("Proof of Chad", "POC") OperatorFilterer(address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6), true) {
        // sethiddenBaseURI("im chad");
    }

    //mint function

    function ownerMint(uint256 _amount, address _address) public onlyOwner { 
        require(_amount + totalSupply() <= maxToken, "No more NFTs");

        _safeMint(_address, _amount);
    }

    function chadlistMint(uint256 _amount, bytes32[] memory proof_) public payable onlySender { 
        require(chadlistMintEnabled == true, "Sale inactive");
        require(_amount + totalSupply() <= maxToken, "No more NFTs");
        require(chadlistMintMax >= _amount, "You've reached max per tx");
        require(chadlistMintMax >= chadlistMinted[msg.sender] + _amount, "You've reached max per address");
        require(isWhitelisted(msg.sender, proof_), "You are not whitelisted!");
        require(msg.value >= chadlistMintPrice * _amount, "Value sent is not correct");
        payable(owner).transfer(msg.value);
        chadlistMinted[msg.sender] += _amount;
        _safeMint(msg.sender, _amount);
    }


    function pbMint(uint256 _amount) public payable onlySender { 
        require(publicMintEnabled == true, "Sale inactive");
        require(_amount + totalSupply() <= maxToken, "No more NFTs");
        require(mintMax >= _amount, "Exceed max per tx");
        require(mintMax >= pbMinted[msg.sender] + _amount, "Exceed max per address");
        require(msg.value >= pbmintPrice * _amount, "Value sent is not correct");
        payable(owner).transfer(msg.value);
        pbMinted[msg.sender] += _amount;
        _safeMint(msg.sender, _amount);
    }

    function teamMint(uint256 _amount, bytes32[] memory proof_) public payable onlySender { 
        require(isWhitelisted2(msg.sender, proof_), "You are not whitelisted!");
        require(msg.value >= pbmintPrice * _amount, "Value sent is not correct");
        payable(owner).transfer(msg.value);

        _safeMint(msg.sender, _amount);
    }
    //owner function

    function togglePublicMint() external onlyOwner {
        publicMintEnabled = !publicMintEnabled;
    }

    function toggleChadlistMint() external onlyOwner {
        chadlistMintEnabled = !chadlistMintEnabled;
    }

    function letsGo(bool soldOut) external onlyOwner {
        chadlistMintEnabled = soldOut;
        publicMintEnabled = soldOut;
    }

    function setMaxMint(uint256 newMax) external onlyOwner {
        mintMax = newMax;
    }

    function cutSupply(uint256 newMaxToken) external onlyOwner {
        maxToken = newMaxToken;
    }

    function setPbPrice(uint256 newPrice) external onlyOwner {
        pbmintPrice = newPrice;
    }

    function setChadlistPrice(uint256 newChadlistPrice) external onlyOwner {
        chadlistMintPrice = newChadlistPrice;
    }

    function setMerkleRoot(bytes32 merkleRoot_) external onlyOwner {
        _setMerkleRoot(merkleRoot_);
    }

    function setMerkleRoot2(bytes32 merkleRoot2_) external onlyOwner {
        _setMerkleRoot2(merkleRoot2_);
    }

    function setBaseURI(string memory uri_) public onlyOwner {
        baseTokenURI = uri_;
    }

    function withdraw() public onlyOwner {
        uint256 sendAmount = address(this).balance;

        address aa = payable(0x8af0828085Ff896a254d43c63175a750694045a8);

        bool success;

        (success, ) = aa.call{value: (sendAmount * 1000/1000)}("");
        require(success, "Failed to withdraw Ether");
    }

    //view function

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

    function currentBaseURI() private view returns (string memory){
        return baseTokenURI;
    }

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

    //modifier

    modifier onlySender() {
        require(msg.sender == tx.origin, "No smart contract");
        _;
    }

    //filterer

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

    function reserveBulk(address[] memory to) external onlyOwner {
        for (uint i = 0; i < to.length;i++) {
            _safeMint(to[i], 1);
        }
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"chadlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"chadlistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chadlistMintMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chadlistMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"chadlistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxToken","type":"uint256"}],"name":"cutSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelisted2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"soldOut","type":"bool"}],"name":"letsGo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"pbMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pbMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pbmintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"}],"name":"reserveBulk","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":"newChadlistPrice","type":"uint256"}],"name":"setChadlistPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot2_","type":"bytes32"}],"name":"setMerkleRoot2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPbPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"toggleChadlistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"new_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526115b3600b556005600c556003600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506618de76816d8000600f55662386f26fc100006010553480156200006d57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600d81526020017f50726f6f66206f662043686164000000000000000000000000000000000000008152506040518060400160405280600381526020017f504f43000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200010992919062000382565b5080600390805190602001906200012292919062000382565b50620001336200037960201b60201c565b600081905550505033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200037157801562000237576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001fd92919062000477565b600060405180830381600087803b1580156200021857600080fd5b505af11580156200022d573d6000803e3d6000fd5b5050505062000370565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002f1576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002b792919062000477565b600060405180830381600087803b158015620002d257600080fd5b505af1158015620002e7573d6000803e3d6000fd5b505050506200036f565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200033a9190620004a4565b600060405180830381600087803b1580156200035557600080fd5b505af11580156200036a573d6000803e3d6000fd5b505050505b5b5b505062000525565b60006001905090565b8280546200039090620004f0565b90600052602060002090601f016020900481019282620003b4576000855562000400565b82601f10620003cf57805160ff191683800117855562000400565b8280016001018555821562000400579182015b82811115620003ff578251825591602001919060010190620003e2565b5b5090506200040f919062000413565b5090565b5b808211156200042e57600081600090555060010162000414565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200045f8262000432565b9050919050565b620004718162000452565b82525050565b60006040820190506200048e600083018562000466565b6200049d602083018462000466565b9392505050565b6000602082019050620004bb600083018462000466565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200050957607f821691505b6020821081036200051f576200051e620004c1565b5b50919050565b614c2c80620005356000396000f3fe60806040526004361061025c5760003560e01c80637ba5b5fb11610144578063bc9817f4116100b6578063d52c57e01161007a578063d52c57e014610885578063df036c80146108ae578063e985e9c5146108d9578063f2fde38b14610916578063f4c445691461093f578063fcf902f0146109685761025c565b8063bc9817f4146107ad578063c2aa94bb146107d6578063c87b56dd14610801578063ca69e3231461083e578063d22b78d6146108695761025c565b8063a12670a811610108578063a12670a8146106b9578063a22cb465146106e4578063a9e0d0391461070d578063b0ee9f7614610738578063b5567be714610754578063b88d4fde146107915761025c565b80637ba5b5fb146105d45780637cb64759146105fd5780638da5cb5b1461062657806395d89b4114610651578063969ce3ed1461067c5761025c565b80633ccfd60b116101dd578063547520fe116101a1578063547520fe146104af57806355f804b3146104d85780635a23dd99146105015780636352211e1461053e578063687003291461057b57806370a08231146105975761025c565b80633ccfd60b146103fd5780634047638d1461041457806342842e0e1461042b5780634d1555611461044757806353c2a239146104725761025c565b80631429577411610224578063142957741461034d57806318160ddd146103765780631c038850146103a15780632220b3b7146103ca57806323b872dd146103e15761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630f4161aa14610322575b600080fd5b34801561026d57600080fd5b50610288600480360381019061028391906137ad565b610991565b60405161029591906137f5565b60405180910390f35b3480156102aa57600080fd5b506102b3610a23565b6040516102c091906138a9565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613901565b610ab5565b6040516102fd919061396f565b60405180910390f35b610320600480360381019061031b91906139b6565b610b34565b005b34801561032e57600080fd5b50610337610b44565b60405161034491906137f5565b60405180910390f35b34801561035957600080fd5b50610374600480360381019061036f9190613a2c565b610b57565b005b34801561038257600080fd5b5061038b610bf3565b6040516103989190613a68565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c39190613901565b610c0a565b005b3480156103d657600080fd5b506103df610ca4565b005b6103fb60048036038101906103f69190613a83565b610d60565b005b34801561040957600080fd5b50610412610f42565b005b34801561042057600080fd5b506104296110bb565b005b61044560048036038101906104409190613a83565b611177565b005b34801561045357600080fd5b5061045c611359565b6040516104699190613a68565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190613c1e565b61135f565b6040516104a691906137f5565b60405180910390f35b3480156104bb57600080fd5b506104d660048036038101906104d19190613901565b611468565b005b3480156104e457600080fd5b506104ff60048036038101906104fa9190613d2f565b611502565b005b34801561050d57600080fd5b5061052860048036038101906105239190613c1e565b6115ac565b60405161053591906137f5565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190613901565b6116b5565b604051610572919061396f565b60405180910390f35b61059560048036038101906105909190613d78565b6116c7565b005b3480156105a357600080fd5b506105be60048036038101906105b99190613dd4565b611a1c565b6040516105cb9190613a68565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f69190613ec4565b611ad4565b005b34801561060957600080fd5b50610624600480360381019061061f9190613a2c565b611bac565b005b34801561063257600080fd5b5061063b611c48565b604051610648919061396f565b60405180910390f35b34801561065d57600080fd5b50610666611c6e565b60405161067391906138a9565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e9190613dd4565b611d00565b6040516106b09190613a68565b60405180910390f35b3480156106c557600080fd5b506106ce611d18565b6040516106db9190613a68565b60405180910390f35b3480156106f057600080fd5b5061070b60048036038101906107069190613f39565b611d1e565b005b34801561071957600080fd5b50610722611e29565b60405161072f9190613a68565b60405180910390f35b610752600480360381019061074d9190613d78565b611e2f565b005b34801561076057600080fd5b5061077b60048036038101906107769190613dd4565b611fad565b6040516107889190613a68565b60405180910390f35b6107ab60048036038101906107a6919061401a565b611fc5565b005b3480156107b957600080fd5b506107d460048036038101906107cf9190613901565b6121aa565b005b3480156107e257600080fd5b506107eb612244565b6040516107f89190613a68565b60405180910390f35b34801561080d57600080fd5b5061082860048036038101906108239190613901565b61224a565b60405161083591906138a9565b60405180910390f35b34801561084a57600080fd5b506108536122cc565b6040516108609190613a68565b60405180910390f35b610883600480360381019061087e9190613901565b6122d2565b005b34801561089157600080fd5b506108ac60048036038101906108a7919061409d565b6125dd565b005b3480156108ba57600080fd5b506108c36126d2565b6040516108d091906137f5565b60405180910390f35b3480156108e557600080fd5b5061090060048036038101906108fb91906140dd565b6126e5565b60405161090d91906137f5565b60405180910390f35b34801561092257600080fd5b5061093d60048036038101906109389190613dd4565b612779565b005b34801561094b57600080fd5b5061096660048036038101906109619190613901565b61284d565b005b34801561097457600080fd5b5061098f600480360381019061098a919061411d565b6128e7565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ec57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610a3290614179565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5e90614179565b8015610aab5780601f10610a8057610100808354040283529160200191610aab565b820191906000526020600020905b815481529060010190602001808311610a8e57829003601f168201915b5050505050905090565b6000610ac0826129ae565b610af6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610b4082826001612a0d565b5050565b600e60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bde906141f6565b60405180910390fd5b610bf081612b5d565b50565b6000610bfd612b67565b6001546000540303905090565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c91906141f6565b60405180910390fd5b80600f8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b906141f6565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610f30573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dd257610dcd848484612b70565b610f3c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610e1b929190614216565b602060405180830381865afa158015610e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5c9190614254565b8015610eee57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610eac929190614216565b602060405180830381865afa158015610ec9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eed9190614254565b5b610f2f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f26919061396f565b60405180910390fd5b5b610f3b848484612b70565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc9906141f6565b60405180910390fd5b60004790506000738af0828085ff896a254d43c63175a750694045a8905060008173ffffffffffffffffffffffffffffffffffffffff166103e8808561101891906142b0565b6110229190614339565b60405161102e9061439b565b60006040518083038185875af1925050503d806000811461106b576040519150601f19603f3d011682016040523d82523d6000602084013e611070565b606091505b505080915050806110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad906143fc565b60405180910390fd5b505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461114b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611142906141f6565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611347573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111e9576111e4848484612e92565b611353565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611232929190614216565b602060405180830381865afa15801561124f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112739190614254565b801561130557506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016112c3929190614216565b602060405180830381865afa1580156112e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113049190614254565b5b61134657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161133d919061396f565b60405180910390fd5b5b611352848484612e92565b5b50505050565b600c5481565b600080836040516020016113739190614464565b60405160208183030381529060405280519060200120905060005b8351811015611459578381815181106113aa576113a961447f565b5b60200260200101518210611400578381815181106113cb576113ca61447f565b5b6020026020010151826040516020016113e59291906144cf565b60405160208183030381529060405280519060200120611444565b818482815181106114145761141361447f565b5b602002602001015160405160200161142d9291906144cf565b604051602081830303815290604052805190602001205b91508080611451906144fb565b91505061138e565b50600a54811491505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef906141f6565b60405180910390fd5b80600c8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611592576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611589906141f6565b60405180910390fd5b80601190805190602001906115a892919061369e565b5050565b600080836040516020016115c09190614464565b60405160208183030381529060405280519060200120905060005b83518110156116a6578381815181106115f7576115f661447f565b5b6020026020010151821061164d578381815181106116185761161761447f565b5b6020026020010151826040516020016116329291906144cf565b60405160208183030381529060405280519060200120611691565b818482815181106116615761166061447f565b5b602002602001015160405160200161167a9291906144cf565b604051602081830303815290604052805190602001205b9150808061169e906144fb565b9150506115db565b50600954811491505092915050565b60006116c082612eb2565b9050919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c9061458f565b60405180910390fd5b60011515600e60019054906101000a900460ff1615151461178b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611782906145fb565b60405180910390fd5b600b54611796610bf3565b836117a1919061461b565b11156117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d9906146bd565b60405180910390fd5b81600d541015611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e90614729565b60405180910390fd5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611872919061461b565b600d5410156118b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ad90614795565b60405180910390fd5b6118c033826115ac565b6118ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f690614801565b60405180910390fd5b81600f5461190d91906142b0565b34101561194f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119469061486d565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156119b7573d6000803e3d6000fd5b5081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a07919061461b565b92505081905550611a183383612f7e565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a83576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5b906141f6565b60405180910390fd5b60005b8151811015611ba857611b95828281518110611b8657611b8561447f565b5b60200260200101516001612f7e565b8080611ba0906144fb565b915050611b67565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c33906141f6565b60405180910390fd5b611c4581612f9c565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054611c7d90614179565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca990614179565b8015611cf65780601f10611ccb57610100808354040283529160200191611cf6565b820191906000526020600020905b815481529060010190602001808311611cd957829003601f168201915b5050505050905090565b60136020528060005260406000206000915090505481565b600f5481565b8060076000611d2b612fa6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dd8612fa6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e1d91906137f5565b60405180910390a35050565b60105481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e949061458f565b60405180910390fd5b611ea7338261135f565b611ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edd90614801565b60405180910390fd5b81601054611ef491906142b0565b341015611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d9061486d565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611f9e573d6000803e3d6000fd5b50611fa93383612f7e565b5050565b60126020528060005260406000206000915090505481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612196573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120385761203385858585612fae565b6121a3565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401612081929190614216565b602060405180830381865afa15801561209e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c29190614254565b801561215457506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401612112929190614216565b602060405180830381865afa15801561212f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121539190614254565b5b61219557336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161218c919061396f565b60405180910390fd5b5b6121a285858585612fae565b5b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461223a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612231906141f6565b60405180910390fd5b8060108190555050565b600d5481565b6060612255826129ae565b612294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228b906148ff565b60405180910390fd5b61229c613021565b6122a5836130b3565b6040516020016122b69291906149a7565b6040516020818303038152906040529050919050565b600b5481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612340576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123379061458f565b60405180910390fd5b60011515600e60009054906101000a900460ff16151514612396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238d906145fb565b60405180910390fd5b600b546123a1610bf3565b826123ac919061461b565b11156123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e4906146bd565b60405180910390fd5b80600c541015612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242990614a22565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461247d919061461b565b600c5410156124c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b890614a8e565b60405180910390fd5b806010546124cf91906142b0565b341015612511576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125089061486d565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612579573d6000803e3d6000fd5b5080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125c9919061461b565b925050819055506125da3382612f7e565b50565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461266d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612664906141f6565b60405180910390fd5b600b54612678610bf3565b83612683919061461b565b11156126c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bb906146bd565b60405180910390fd5b6126ce8183612f7e565b5050565b600e60019054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612809576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612800906141f6565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d4906141f6565b60405180910390fd5b80600b8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296e906141f6565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555080600e60006101000a81548160ff02191690831515021790555050565b6000816129b9612b67565b111580156129c8575060005482105b8015612a06575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000612a18836116b5565b9050818015612a5a57508073ffffffffffffffffffffffffffffffffffffffff16612a41612fa6565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612aa757612a7081612a6b612fa6565b6126e5565b612aa6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b80600a8190555050565b60006001905090565b6000612b7b82612eb2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612be2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612bee84613213565b91509150612c048187612bff612fa6565b61323a565b612c5057612c1986612c14612fa6565b6126e5565b612c4f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612cb6576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cc3868686600161327e565b8015612cce57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550612d9c85612d78888887613284565b7c0200000000000000000000000000000000000000000000000000000000176132ac565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612e225760006001850190506000600460008381526020019081526020016000205403612e20576000548114612e1f578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e8a86868660016132d7565b505050505050565b612ead83838360405180602001604052806000815250611fc5565b505050565b60008082905080612ec1612b67565b11612f4757600054811015612f465760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612f44575b60008103612f3a576004600083600190039350838152602001908152602001600020549050612f10565b8092505050612f79565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b612f988282604051806020016040528060008152506132dd565b5050565b8060098190555050565b600033905090565b612fb9848484610d60565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461301b57612fe48484848461337a565b61301a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606011805461303090614179565b80601f016020809104026020016040519081016040528092919081815260200182805461305c90614179565b80156130a95780601f1061307e576101008083540402835291602001916130a9565b820191906000526020600020905b81548152906001019060200180831161308c57829003601f168201915b5050505050905090565b6060600082036130fa576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061320e565b600082905060005b6000821461312c578080613115906144fb565b915050600a826131259190614339565b9150613102565b60008167ffffffffffffffff81111561314857613147613adb565b5b6040519080825280601f01601f19166020018201604052801561317a5781602001600182028036833780820191505090505b5090505b60008514613207576001826131939190614aae565b9150600a856131a29190614ae2565b60306131ae919061461b565b60f81b8183815181106131c4576131c361447f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132009190614339565b945061317e565b8093505050505b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861329b8686846134ca565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6132e783836134d3565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461337557600080549050600083820390505b613327600086838060010194508661337a565b61335d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061331457816000541461337257600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133a0612fa6565b8786866040518563ffffffff1660e01b81526004016133c29493929190614b68565b6020604051808303816000875af19250505080156133fe57506040513d601f19601f820116820180604052508101906133fb9190614bc9565b60015b613477573d806000811461342e576040519150601f19603f3d011682016040523d82523d6000602084013e613433565b606091505b50600081510361346f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203613513576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613520600084838561327e565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613597836135886000866000613284565b6135918561368e565b176132ac565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461363857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506135fd565b5060008203613673576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061368960008483856132d7565b505050565b60006001821460e11b9050919050565b8280546136aa90614179565b90600052602060002090601f0160209004810192826136cc5760008555613713565b82601f106136e557805160ff1916838001178555613713565b82800160010185558215613713579182015b828111156137125782518255916020019190600101906136f7565b5b5090506137209190613724565b5090565b5b8082111561373d576000816000905550600101613725565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61378a81613755565b811461379557600080fd5b50565b6000813590506137a781613781565b92915050565b6000602082840312156137c3576137c261374b565b5b60006137d184828501613798565b91505092915050565b60008115159050919050565b6137ef816137da565b82525050565b600060208201905061380a60008301846137e6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561384a57808201518184015260208101905061382f565b83811115613859576000848401525b50505050565b6000601f19601f8301169050919050565b600061387b82613810565b613885818561381b565b935061389581856020860161382c565b61389e8161385f565b840191505092915050565b600060208201905081810360008301526138c38184613870565b905092915050565b6000819050919050565b6138de816138cb565b81146138e957600080fd5b50565b6000813590506138fb816138d5565b92915050565b6000602082840312156139175761391661374b565b5b6000613925848285016138ec565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139598261392e565b9050919050565b6139698161394e565b82525050565b60006020820190506139846000830184613960565b92915050565b6139938161394e565b811461399e57600080fd5b50565b6000813590506139b08161398a565b92915050565b600080604083850312156139cd576139cc61374b565b5b60006139db858286016139a1565b92505060206139ec858286016138ec565b9150509250929050565b6000819050919050565b613a09816139f6565b8114613a1457600080fd5b50565b600081359050613a2681613a00565b92915050565b600060208284031215613a4257613a4161374b565b5b6000613a5084828501613a17565b91505092915050565b613a62816138cb565b82525050565b6000602082019050613a7d6000830184613a59565b92915050565b600080600060608486031215613a9c57613a9b61374b565b5b6000613aaa868287016139a1565b9350506020613abb868287016139a1565b9250506040613acc868287016138ec565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b138261385f565b810181811067ffffffffffffffff82111715613b3257613b31613adb565b5b80604052505050565b6000613b45613741565b9050613b518282613b0a565b919050565b600067ffffffffffffffff821115613b7157613b70613adb565b5b602082029050602081019050919050565b600080fd5b6000613b9a613b9584613b56565b613b3b565b90508083825260208201905060208402830185811115613bbd57613bbc613b82565b5b835b81811015613be65780613bd28882613a17565b845260208401935050602081019050613bbf565b5050509392505050565b600082601f830112613c0557613c04613ad6565b5b8135613c15848260208601613b87565b91505092915050565b60008060408385031215613c3557613c3461374b565b5b6000613c43858286016139a1565b925050602083013567ffffffffffffffff811115613c6457613c63613750565b5b613c7085828601613bf0565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613c9a57613c99613adb565b5b613ca38261385f565b9050602081019050919050565b82818337600083830152505050565b6000613cd2613ccd84613c7f565b613b3b565b905082815260208101848484011115613cee57613ced613c7a565b5b613cf9848285613cb0565b509392505050565b600082601f830112613d1657613d15613ad6565b5b8135613d26848260208601613cbf565b91505092915050565b600060208284031215613d4557613d4461374b565b5b600082013567ffffffffffffffff811115613d6357613d62613750565b5b613d6f84828501613d01565b91505092915050565b60008060408385031215613d8f57613d8e61374b565b5b6000613d9d858286016138ec565b925050602083013567ffffffffffffffff811115613dbe57613dbd613750565b5b613dca85828601613bf0565b9150509250929050565b600060208284031215613dea57613de961374b565b5b6000613df8848285016139a1565b91505092915050565b600067ffffffffffffffff821115613e1c57613e1b613adb565b5b602082029050602081019050919050565b6000613e40613e3b84613e01565b613b3b565b90508083825260208201905060208402830185811115613e6357613e62613b82565b5b835b81811015613e8c5780613e7888826139a1565b845260208401935050602081019050613e65565b5050509392505050565b600082601f830112613eab57613eaa613ad6565b5b8135613ebb848260208601613e2d565b91505092915050565b600060208284031215613eda57613ed961374b565b5b600082013567ffffffffffffffff811115613ef857613ef7613750565b5b613f0484828501613e96565b91505092915050565b613f16816137da565b8114613f2157600080fd5b50565b600081359050613f3381613f0d565b92915050565b60008060408385031215613f5057613f4f61374b565b5b6000613f5e858286016139a1565b9250506020613f6f85828601613f24565b9150509250929050565b600067ffffffffffffffff821115613f9457613f93613adb565b5b613f9d8261385f565b9050602081019050919050565b6000613fbd613fb884613f79565b613b3b565b905082815260208101848484011115613fd957613fd8613c7a565b5b613fe4848285613cb0565b509392505050565b600082601f83011261400157614000613ad6565b5b8135614011848260208601613faa565b91505092915050565b600080600080608085870312156140345761403361374b565b5b6000614042878288016139a1565b9450506020614053878288016139a1565b9350506040614064878288016138ec565b925050606085013567ffffffffffffffff81111561408557614084613750565b5b61409187828801613fec565b91505092959194509250565b600080604083850312156140b4576140b361374b565b5b60006140c2858286016138ec565b92505060206140d3858286016139a1565b9150509250929050565b600080604083850312156140f4576140f361374b565b5b6000614102858286016139a1565b9250506020614113858286016139a1565b9150509250929050565b6000602082840312156141335761413261374b565b5b600061414184828501613f24565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061419157607f821691505b6020821081036141a4576141a361414a565b5b50919050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b60006141e0600a8361381b565b91506141eb826141aa565b602082019050919050565b6000602082019050818103600083015261420f816141d3565b9050919050565b600060408201905061422b6000830185613960565b6142386020830184613960565b9392505050565b60008151905061424e81613f0d565b92915050565b60006020828403121561426a5761426961374b565b5b60006142788482850161423f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006142bb826138cb565b91506142c6836138cb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142ff576142fe614281565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614344826138cb565b915061434f836138cb565b92508261435f5761435e61430a565b5b828204905092915050565b600081905092915050565b50565b600061438560008361436a565b915061439082614375565b600082019050919050565b60006143a682614378565b9150819050919050565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b60006143e660188361381b565b91506143f1826143b0565b602082019050919050565b60006020820190508181036000830152614415816143d9565b9050919050565b60008160601b9050919050565b60006144348261441c565b9050919050565b600061444682614429565b9050919050565b61445e6144598261394e565b61443b565b82525050565b6000614470828461444d565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6144c96144c4826139f6565b6144ae565b82525050565b60006144db82856144b8565b6020820191506144eb82846144b8565b6020820191508190509392505050565b6000614506826138cb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361453857614537614281565b5b600182019050919050565b7f4e6f20736d61727420636f6e7472616374000000000000000000000000000000600082015250565b600061457960118361381b565b915061458482614543565b602082019050919050565b600060208201905081810360008301526145a88161456c565b9050919050565b7f53616c6520696e61637469766500000000000000000000000000000000000000600082015250565b60006145e5600d8361381b565b91506145f0826145af565b602082019050919050565b60006020820190508181036000830152614614816145d8565b9050919050565b6000614626826138cb565b9150614631836138cb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561466657614665614281565b5b828201905092915050565b7f4e6f206d6f7265204e4654730000000000000000000000000000000000000000600082015250565b60006146a7600c8361381b565b91506146b282614671565b602082019050919050565b600060208201905081810360008301526146d68161469a565b9050919050565b7f596f752776652072656163686564206d61782070657220747800000000000000600082015250565b600061471360198361381b565b915061471e826146dd565b602082019050919050565b6000602082019050818103600083015261474281614706565b9050919050565b7f596f752776652072656163686564206d61782070657220616464726573730000600082015250565b600061477f601e8361381b565b915061478a82614749565b602082019050919050565b600060208201905081810360008301526147ae81614772565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564210000000000000000600082015250565b60006147eb60188361381b565b91506147f6826147b5565b602082019050919050565b6000602082019050818103600083015261481a816147de565b9050919050565b7f56616c75652073656e74206973206e6f7420636f727265637400000000000000600082015250565b600061485760198361381b565b915061486282614821565b602082019050919050565b600060208201905081810360008301526148868161484a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006148e9602f8361381b565b91506148f48261488d565b604082019050919050565b60006020820190508181036000830152614918816148dc565b9050919050565b600081905092915050565b600061493582613810565b61493f818561491f565b935061494f81856020860161382c565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061499160058361491f565b915061499c8261495b565b600582019050919050565b60006149b3828561492a565b91506149bf828461492a565b91506149ca82614984565b91508190509392505050565b7f457863656564206d617820706572207478000000000000000000000000000000600082015250565b6000614a0c60118361381b565b9150614a17826149d6565b602082019050919050565b60006020820190508181036000830152614a3b816149ff565b9050919050565b7f457863656564206d617820706572206164647265737300000000000000000000600082015250565b6000614a7860168361381b565b9150614a8382614a42565b602082019050919050565b60006020820190508181036000830152614aa781614a6b565b9050919050565b6000614ab9826138cb565b9150614ac4836138cb565b925082821015614ad757614ad6614281565b5b828203905092915050565b6000614aed826138cb565b9150614af8836138cb565b925082614b0857614b0761430a565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614b3a82614b13565b614b448185614b1e565b9350614b5481856020860161382c565b614b5d8161385f565b840191505092915050565b6000608082019050614b7d6000830187613960565b614b8a6020830186613960565b614b976040830185613a59565b8181036060830152614ba98184614b2f565b905095945050505050565b600081519050614bc381613781565b92915050565b600060208284031215614bdf57614bde61374b565b5b6000614bed84828501614bb4565b9150509291505056fea2646970667358221220156e8d090aa85b80a2a8b0ec2ca004264d9a2264de4ec08edbc35cc7990862ed64736f6c634300080d0033

Deployed Bytecode

0x60806040526004361061025c5760003560e01c80637ba5b5fb11610144578063bc9817f4116100b6578063d52c57e01161007a578063d52c57e014610885578063df036c80146108ae578063e985e9c5146108d9578063f2fde38b14610916578063f4c445691461093f578063fcf902f0146109685761025c565b8063bc9817f4146107ad578063c2aa94bb146107d6578063c87b56dd14610801578063ca69e3231461083e578063d22b78d6146108695761025c565b8063a12670a811610108578063a12670a8146106b9578063a22cb465146106e4578063a9e0d0391461070d578063b0ee9f7614610738578063b5567be714610754578063b88d4fde146107915761025c565b80637ba5b5fb146105d45780637cb64759146105fd5780638da5cb5b1461062657806395d89b4114610651578063969ce3ed1461067c5761025c565b80633ccfd60b116101dd578063547520fe116101a1578063547520fe146104af57806355f804b3146104d85780635a23dd99146105015780636352211e1461053e578063687003291461057b57806370a08231146105975761025c565b80633ccfd60b146103fd5780634047638d1461041457806342842e0e1461042b5780634d1555611461044757806353c2a239146104725761025c565b80631429577411610224578063142957741461034d57806318160ddd146103765780631c038850146103a15780632220b3b7146103ca57806323b872dd146103e15761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630f4161aa14610322575b600080fd5b34801561026d57600080fd5b50610288600480360381019061028391906137ad565b610991565b60405161029591906137f5565b60405180910390f35b3480156102aa57600080fd5b506102b3610a23565b6040516102c091906138a9565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613901565b610ab5565b6040516102fd919061396f565b60405180910390f35b610320600480360381019061031b91906139b6565b610b34565b005b34801561032e57600080fd5b50610337610b44565b60405161034491906137f5565b60405180910390f35b34801561035957600080fd5b50610374600480360381019061036f9190613a2c565b610b57565b005b34801561038257600080fd5b5061038b610bf3565b6040516103989190613a68565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c39190613901565b610c0a565b005b3480156103d657600080fd5b506103df610ca4565b005b6103fb60048036038101906103f69190613a83565b610d60565b005b34801561040957600080fd5b50610412610f42565b005b34801561042057600080fd5b506104296110bb565b005b61044560048036038101906104409190613a83565b611177565b005b34801561045357600080fd5b5061045c611359565b6040516104699190613a68565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190613c1e565b61135f565b6040516104a691906137f5565b60405180910390f35b3480156104bb57600080fd5b506104d660048036038101906104d19190613901565b611468565b005b3480156104e457600080fd5b506104ff60048036038101906104fa9190613d2f565b611502565b005b34801561050d57600080fd5b5061052860048036038101906105239190613c1e565b6115ac565b60405161053591906137f5565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190613901565b6116b5565b604051610572919061396f565b60405180910390f35b61059560048036038101906105909190613d78565b6116c7565b005b3480156105a357600080fd5b506105be60048036038101906105b99190613dd4565b611a1c565b6040516105cb9190613a68565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f69190613ec4565b611ad4565b005b34801561060957600080fd5b50610624600480360381019061061f9190613a2c565b611bac565b005b34801561063257600080fd5b5061063b611c48565b604051610648919061396f565b60405180910390f35b34801561065d57600080fd5b50610666611c6e565b60405161067391906138a9565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e9190613dd4565b611d00565b6040516106b09190613a68565b60405180910390f35b3480156106c557600080fd5b506106ce611d18565b6040516106db9190613a68565b60405180910390f35b3480156106f057600080fd5b5061070b60048036038101906107069190613f39565b611d1e565b005b34801561071957600080fd5b50610722611e29565b60405161072f9190613a68565b60405180910390f35b610752600480360381019061074d9190613d78565b611e2f565b005b34801561076057600080fd5b5061077b60048036038101906107769190613dd4565b611fad565b6040516107889190613a68565b60405180910390f35b6107ab60048036038101906107a6919061401a565b611fc5565b005b3480156107b957600080fd5b506107d460048036038101906107cf9190613901565b6121aa565b005b3480156107e257600080fd5b506107eb612244565b6040516107f89190613a68565b60405180910390f35b34801561080d57600080fd5b5061082860048036038101906108239190613901565b61224a565b60405161083591906138a9565b60405180910390f35b34801561084a57600080fd5b506108536122cc565b6040516108609190613a68565b60405180910390f35b610883600480360381019061087e9190613901565b6122d2565b005b34801561089157600080fd5b506108ac60048036038101906108a7919061409d565b6125dd565b005b3480156108ba57600080fd5b506108c36126d2565b6040516108d091906137f5565b60405180910390f35b3480156108e557600080fd5b5061090060048036038101906108fb91906140dd565b6126e5565b60405161090d91906137f5565b60405180910390f35b34801561092257600080fd5b5061093d60048036038101906109389190613dd4565b612779565b005b34801561094b57600080fd5b5061096660048036038101906109619190613901565b61284d565b005b34801561097457600080fd5b5061098f600480360381019061098a919061411d565b6128e7565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ec57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610a3290614179565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5e90614179565b8015610aab5780601f10610a8057610100808354040283529160200191610aab565b820191906000526020600020905b815481529060010190602001808311610a8e57829003601f168201915b5050505050905090565b6000610ac0826129ae565b610af6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610b4082826001612a0d565b5050565b600e60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bde906141f6565b60405180910390fd5b610bf081612b5d565b50565b6000610bfd612b67565b6001546000540303905090565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c91906141f6565b60405180910390fd5b80600f8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b906141f6565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610f30573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dd257610dcd848484612b70565b610f3c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610e1b929190614216565b602060405180830381865afa158015610e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5c9190614254565b8015610eee57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610eac929190614216565b602060405180830381865afa158015610ec9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eed9190614254565b5b610f2f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f26919061396f565b60405180910390fd5b5b610f3b848484612b70565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc9906141f6565b60405180910390fd5b60004790506000738af0828085ff896a254d43c63175a750694045a8905060008173ffffffffffffffffffffffffffffffffffffffff166103e8808561101891906142b0565b6110229190614339565b60405161102e9061439b565b60006040518083038185875af1925050503d806000811461106b576040519150601f19603f3d011682016040523d82523d6000602084013e611070565b606091505b505080915050806110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad906143fc565b60405180910390fd5b505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461114b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611142906141f6565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611347573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111e9576111e4848484612e92565b611353565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611232929190614216565b602060405180830381865afa15801561124f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112739190614254565b801561130557506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016112c3929190614216565b602060405180830381865afa1580156112e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113049190614254565b5b61134657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161133d919061396f565b60405180910390fd5b5b611352848484612e92565b5b50505050565b600c5481565b600080836040516020016113739190614464565b60405160208183030381529060405280519060200120905060005b8351811015611459578381815181106113aa576113a961447f565b5b60200260200101518210611400578381815181106113cb576113ca61447f565b5b6020026020010151826040516020016113e59291906144cf565b60405160208183030381529060405280519060200120611444565b818482815181106114145761141361447f565b5b602002602001015160405160200161142d9291906144cf565b604051602081830303815290604052805190602001205b91508080611451906144fb565b91505061138e565b50600a54811491505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef906141f6565b60405180910390fd5b80600c8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611592576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611589906141f6565b60405180910390fd5b80601190805190602001906115a892919061369e565b5050565b600080836040516020016115c09190614464565b60405160208183030381529060405280519060200120905060005b83518110156116a6578381815181106115f7576115f661447f565b5b6020026020010151821061164d578381815181106116185761161761447f565b5b6020026020010151826040516020016116329291906144cf565b60405160208183030381529060405280519060200120611691565b818482815181106116615761166061447f565b5b602002602001015160405160200161167a9291906144cf565b604051602081830303815290604052805190602001205b9150808061169e906144fb565b9150506115db565b50600954811491505092915050565b60006116c082612eb2565b9050919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c9061458f565b60405180910390fd5b60011515600e60019054906101000a900460ff1615151461178b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611782906145fb565b60405180910390fd5b600b54611796610bf3565b836117a1919061461b565b11156117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d9906146bd565b60405180910390fd5b81600d541015611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e90614729565b60405180910390fd5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611872919061461b565b600d5410156118b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ad90614795565b60405180910390fd5b6118c033826115ac565b6118ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f690614801565b60405180910390fd5b81600f5461190d91906142b0565b34101561194f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119469061486d565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156119b7573d6000803e3d6000fd5b5081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a07919061461b565b92505081905550611a183383612f7e565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a83576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5b906141f6565b60405180910390fd5b60005b8151811015611ba857611b95828281518110611b8657611b8561447f565b5b60200260200101516001612f7e565b8080611ba0906144fb565b915050611b67565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c33906141f6565b60405180910390fd5b611c4581612f9c565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054611c7d90614179565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca990614179565b8015611cf65780601f10611ccb57610100808354040283529160200191611cf6565b820191906000526020600020905b815481529060010190602001808311611cd957829003601f168201915b5050505050905090565b60136020528060005260406000206000915090505481565b600f5481565b8060076000611d2b612fa6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dd8612fa6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e1d91906137f5565b60405180910390a35050565b60105481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e949061458f565b60405180910390fd5b611ea7338261135f565b611ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edd90614801565b60405180910390fd5b81601054611ef491906142b0565b341015611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d9061486d565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611f9e573d6000803e3d6000fd5b50611fa93383612f7e565b5050565b60126020528060005260406000206000915090505481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612196573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120385761203385858585612fae565b6121a3565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401612081929190614216565b602060405180830381865afa15801561209e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c29190614254565b801561215457506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401612112929190614216565b602060405180830381865afa15801561212f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121539190614254565b5b61219557336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161218c919061396f565b60405180910390fd5b5b6121a285858585612fae565b5b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461223a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612231906141f6565b60405180910390fd5b8060108190555050565b600d5481565b6060612255826129ae565b612294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228b906148ff565b60405180910390fd5b61229c613021565b6122a5836130b3565b6040516020016122b69291906149a7565b6040516020818303038152906040529050919050565b600b5481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612340576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123379061458f565b60405180910390fd5b60011515600e60009054906101000a900460ff16151514612396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238d906145fb565b60405180910390fd5b600b546123a1610bf3565b826123ac919061461b565b11156123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e4906146bd565b60405180910390fd5b80600c541015612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242990614a22565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461247d919061461b565b600c5410156124c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b890614a8e565b60405180910390fd5b806010546124cf91906142b0565b341015612511576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125089061486d565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612579573d6000803e3d6000fd5b5080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125c9919061461b565b925050819055506125da3382612f7e565b50565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461266d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612664906141f6565b60405180910390fd5b600b54612678610bf3565b83612683919061461b565b11156126c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bb906146bd565b60405180910390fd5b6126ce8183612f7e565b5050565b600e60019054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612809576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612800906141f6565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d4906141f6565b60405180910390fd5b80600b8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296e906141f6565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555080600e60006101000a81548160ff02191690831515021790555050565b6000816129b9612b67565b111580156129c8575060005482105b8015612a06575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000612a18836116b5565b9050818015612a5a57508073ffffffffffffffffffffffffffffffffffffffff16612a41612fa6565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612aa757612a7081612a6b612fa6565b6126e5565b612aa6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b80600a8190555050565b60006001905090565b6000612b7b82612eb2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612be2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612bee84613213565b91509150612c048187612bff612fa6565b61323a565b612c5057612c1986612c14612fa6565b6126e5565b612c4f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612cb6576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cc3868686600161327e565b8015612cce57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550612d9c85612d78888887613284565b7c0200000000000000000000000000000000000000000000000000000000176132ac565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612e225760006001850190506000600460008381526020019081526020016000205403612e20576000548114612e1f578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e8a86868660016132d7565b505050505050565b612ead83838360405180602001604052806000815250611fc5565b505050565b60008082905080612ec1612b67565b11612f4757600054811015612f465760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612f44575b60008103612f3a576004600083600190039350838152602001908152602001600020549050612f10565b8092505050612f79565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b612f988282604051806020016040528060008152506132dd565b5050565b8060098190555050565b600033905090565b612fb9848484610d60565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461301b57612fe48484848461337a565b61301a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606011805461303090614179565b80601f016020809104026020016040519081016040528092919081815260200182805461305c90614179565b80156130a95780601f1061307e576101008083540402835291602001916130a9565b820191906000526020600020905b81548152906001019060200180831161308c57829003601f168201915b5050505050905090565b6060600082036130fa576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061320e565b600082905060005b6000821461312c578080613115906144fb565b915050600a826131259190614339565b9150613102565b60008167ffffffffffffffff81111561314857613147613adb565b5b6040519080825280601f01601f19166020018201604052801561317a5781602001600182028036833780820191505090505b5090505b60008514613207576001826131939190614aae565b9150600a856131a29190614ae2565b60306131ae919061461b565b60f81b8183815181106131c4576131c361447f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132009190614339565b945061317e565b8093505050505b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861329b8686846134ca565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6132e783836134d3565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461337557600080549050600083820390505b613327600086838060010194508661337a565b61335d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061331457816000541461337257600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133a0612fa6565b8786866040518563ffffffff1660e01b81526004016133c29493929190614b68565b6020604051808303816000875af19250505080156133fe57506040513d601f19601f820116820180604052508101906133fb9190614bc9565b60015b613477573d806000811461342e576040519150601f19603f3d011682016040523d82523d6000602084013e613433565b606091505b50600081510361346f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203613513576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613520600084838561327e565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613597836135886000866000613284565b6135918561368e565b176132ac565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461363857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506135fd565b5060008203613673576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061368960008483856132d7565b505050565b60006001821460e11b9050919050565b8280546136aa90614179565b90600052602060002090601f0160209004810192826136cc5760008555613713565b82601f106136e557805160ff1916838001178555613713565b82800160010185558215613713579182015b828111156137125782518255916020019190600101906136f7565b5b5090506137209190613724565b5090565b5b8082111561373d576000816000905550600101613725565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61378a81613755565b811461379557600080fd5b50565b6000813590506137a781613781565b92915050565b6000602082840312156137c3576137c261374b565b5b60006137d184828501613798565b91505092915050565b60008115159050919050565b6137ef816137da565b82525050565b600060208201905061380a60008301846137e6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561384a57808201518184015260208101905061382f565b83811115613859576000848401525b50505050565b6000601f19601f8301169050919050565b600061387b82613810565b613885818561381b565b935061389581856020860161382c565b61389e8161385f565b840191505092915050565b600060208201905081810360008301526138c38184613870565b905092915050565b6000819050919050565b6138de816138cb565b81146138e957600080fd5b50565b6000813590506138fb816138d5565b92915050565b6000602082840312156139175761391661374b565b5b6000613925848285016138ec565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139598261392e565b9050919050565b6139698161394e565b82525050565b60006020820190506139846000830184613960565b92915050565b6139938161394e565b811461399e57600080fd5b50565b6000813590506139b08161398a565b92915050565b600080604083850312156139cd576139cc61374b565b5b60006139db858286016139a1565b92505060206139ec858286016138ec565b9150509250929050565b6000819050919050565b613a09816139f6565b8114613a1457600080fd5b50565b600081359050613a2681613a00565b92915050565b600060208284031215613a4257613a4161374b565b5b6000613a5084828501613a17565b91505092915050565b613a62816138cb565b82525050565b6000602082019050613a7d6000830184613a59565b92915050565b600080600060608486031215613a9c57613a9b61374b565b5b6000613aaa868287016139a1565b9350506020613abb868287016139a1565b9250506040613acc868287016138ec565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b138261385f565b810181811067ffffffffffffffff82111715613b3257613b31613adb565b5b80604052505050565b6000613b45613741565b9050613b518282613b0a565b919050565b600067ffffffffffffffff821115613b7157613b70613adb565b5b602082029050602081019050919050565b600080fd5b6000613b9a613b9584613b56565b613b3b565b90508083825260208201905060208402830185811115613bbd57613bbc613b82565b5b835b81811015613be65780613bd28882613a17565b845260208401935050602081019050613bbf565b5050509392505050565b600082601f830112613c0557613c04613ad6565b5b8135613c15848260208601613b87565b91505092915050565b60008060408385031215613c3557613c3461374b565b5b6000613c43858286016139a1565b925050602083013567ffffffffffffffff811115613c6457613c63613750565b5b613c7085828601613bf0565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613c9a57613c99613adb565b5b613ca38261385f565b9050602081019050919050565b82818337600083830152505050565b6000613cd2613ccd84613c7f565b613b3b565b905082815260208101848484011115613cee57613ced613c7a565b5b613cf9848285613cb0565b509392505050565b600082601f830112613d1657613d15613ad6565b5b8135613d26848260208601613cbf565b91505092915050565b600060208284031215613d4557613d4461374b565b5b600082013567ffffffffffffffff811115613d6357613d62613750565b5b613d6f84828501613d01565b91505092915050565b60008060408385031215613d8f57613d8e61374b565b5b6000613d9d858286016138ec565b925050602083013567ffffffffffffffff811115613dbe57613dbd613750565b5b613dca85828601613bf0565b9150509250929050565b600060208284031215613dea57613de961374b565b5b6000613df8848285016139a1565b91505092915050565b600067ffffffffffffffff821115613e1c57613e1b613adb565b5b602082029050602081019050919050565b6000613e40613e3b84613e01565b613b3b565b90508083825260208201905060208402830185811115613e6357613e62613b82565b5b835b81811015613e8c5780613e7888826139a1565b845260208401935050602081019050613e65565b5050509392505050565b600082601f830112613eab57613eaa613ad6565b5b8135613ebb848260208601613e2d565b91505092915050565b600060208284031215613eda57613ed961374b565b5b600082013567ffffffffffffffff811115613ef857613ef7613750565b5b613f0484828501613e96565b91505092915050565b613f16816137da565b8114613f2157600080fd5b50565b600081359050613f3381613f0d565b92915050565b60008060408385031215613f5057613f4f61374b565b5b6000613f5e858286016139a1565b9250506020613f6f85828601613f24565b9150509250929050565b600067ffffffffffffffff821115613f9457613f93613adb565b5b613f9d8261385f565b9050602081019050919050565b6000613fbd613fb884613f79565b613b3b565b905082815260208101848484011115613fd957613fd8613c7a565b5b613fe4848285613cb0565b509392505050565b600082601f83011261400157614000613ad6565b5b8135614011848260208601613faa565b91505092915050565b600080600080608085870312156140345761403361374b565b5b6000614042878288016139a1565b9450506020614053878288016139a1565b9350506040614064878288016138ec565b925050606085013567ffffffffffffffff81111561408557614084613750565b5b61409187828801613fec565b91505092959194509250565b600080604083850312156140b4576140b361374b565b5b60006140c2858286016138ec565b92505060206140d3858286016139a1565b9150509250929050565b600080604083850312156140f4576140f361374b565b5b6000614102858286016139a1565b9250506020614113858286016139a1565b9150509250929050565b6000602082840312156141335761413261374b565b5b600061414184828501613f24565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061419157607f821691505b6020821081036141a4576141a361414a565b5b50919050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b60006141e0600a8361381b565b91506141eb826141aa565b602082019050919050565b6000602082019050818103600083015261420f816141d3565b9050919050565b600060408201905061422b6000830185613960565b6142386020830184613960565b9392505050565b60008151905061424e81613f0d565b92915050565b60006020828403121561426a5761426961374b565b5b60006142788482850161423f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006142bb826138cb565b91506142c6836138cb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142ff576142fe614281565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614344826138cb565b915061434f836138cb565b92508261435f5761435e61430a565b5b828204905092915050565b600081905092915050565b50565b600061438560008361436a565b915061439082614375565b600082019050919050565b60006143a682614378565b9150819050919050565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b60006143e660188361381b565b91506143f1826143b0565b602082019050919050565b60006020820190508181036000830152614415816143d9565b9050919050565b60008160601b9050919050565b60006144348261441c565b9050919050565b600061444682614429565b9050919050565b61445e6144598261394e565b61443b565b82525050565b6000614470828461444d565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6144c96144c4826139f6565b6144ae565b82525050565b60006144db82856144b8565b6020820191506144eb82846144b8565b6020820191508190509392505050565b6000614506826138cb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361453857614537614281565b5b600182019050919050565b7f4e6f20736d61727420636f6e7472616374000000000000000000000000000000600082015250565b600061457960118361381b565b915061458482614543565b602082019050919050565b600060208201905081810360008301526145a88161456c565b9050919050565b7f53616c6520696e61637469766500000000000000000000000000000000000000600082015250565b60006145e5600d8361381b565b91506145f0826145af565b602082019050919050565b60006020820190508181036000830152614614816145d8565b9050919050565b6000614626826138cb565b9150614631836138cb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561466657614665614281565b5b828201905092915050565b7f4e6f206d6f7265204e4654730000000000000000000000000000000000000000600082015250565b60006146a7600c8361381b565b91506146b282614671565b602082019050919050565b600060208201905081810360008301526146d68161469a565b9050919050565b7f596f752776652072656163686564206d61782070657220747800000000000000600082015250565b600061471360198361381b565b915061471e826146dd565b602082019050919050565b6000602082019050818103600083015261474281614706565b9050919050565b7f596f752776652072656163686564206d61782070657220616464726573730000600082015250565b600061477f601e8361381b565b915061478a82614749565b602082019050919050565b600060208201905081810360008301526147ae81614772565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564210000000000000000600082015250565b60006147eb60188361381b565b91506147f6826147b5565b602082019050919050565b6000602082019050818103600083015261481a816147de565b9050919050565b7f56616c75652073656e74206973206e6f7420636f727265637400000000000000600082015250565b600061485760198361381b565b915061486282614821565b602082019050919050565b600060208201905081810360008301526148868161484a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006148e9602f8361381b565b91506148f48261488d565b604082019050919050565b60006020820190508181036000830152614918816148dc565b9050919050565b600081905092915050565b600061493582613810565b61493f818561491f565b935061494f81856020860161382c565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061499160058361491f565b915061499c8261495b565b600582019050919050565b60006149b3828561492a565b91506149bf828461492a565b91506149ca82614984565b91508190509392505050565b7f457863656564206d617820706572207478000000000000000000000000000000600082015250565b6000614a0c60118361381b565b9150614a17826149d6565b602082019050919050565b60006020820190508181036000830152614a3b816149ff565b9050919050565b7f457863656564206d617820706572206164647265737300000000000000000000600082015250565b6000614a7860168361381b565b9150614a8382614a42565b602082019050919050565b60006020820190508181036000830152614aa781614a6b565b9050919050565b6000614ab9826138cb565b9150614ac4836138cb565b925082821015614ad757614ad6614281565b5b828203905092915050565b6000614aed826138cb565b9150614af8836138cb565b925082614b0857614b0761430a565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614b3a82614b13565b614b448185614b1e565b9350614b5481856020860161382c565b614b5d8161385f565b840191505092915050565b6000608082019050614b7d6000830187613960565b614b8a6020830186613960565b614b976040830185613a59565b8181036060830152614ba98184614b2f565b905095945050505050565b600081519050614bc381613781565b92915050565b600060208284031215614bdf57614bde61374b565b5b6000614bed84828501614bb4565b9150509291505056fea2646970667358221220156e8d090aa85b80a2a8b0ec2ca004264d9a2264de4ec08edbc35cc7990862ed64736f6c634300080d0033

Deployed Bytecode Sourcemap

59553:5687:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20193:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21095:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27058:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26775:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59789:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63140:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16846:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62889:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62316:110;;;;;;;;;;;;;:::i;:::-;;64375:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63364:326;;;;;;;;;;;;;:::i;:::-;;62204:104;;;;;;;;;;;;;:::i;:::-;;64764:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59671:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59110:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62577:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63261:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58697:405;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22488:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60528:722;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18030:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64595:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63023:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53968:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21271:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60074:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59881:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27616:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59934:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61826:348;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60018:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64992:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62783:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59705:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63938:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59634:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61260:558;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60328:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59833:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28007:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54114:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62675:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62434:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20193:639;20278:4;20617:10;20602:25;;:11;:25;;;;:102;;;;20694:10;20679:25;;:11;:25;;;;20602:102;:179;;;;20771:10;20756:25;;:11;:25;;;;20602:179;20582:199;;20193:639;;;:::o;21095:100::-;21149:13;21182:5;21175:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21095:100;:::o;27058:218::-;27134:7;27159:16;27167:7;27159;:16::i;:::-;27154:64;;27184:34;;;;;;;;;;;;;;27154:64;27238:15;:24;27254:7;27238:24;;;;;;;;;;;:30;;;;;;;;;;;;27231:37;;27058:218;;;:::o;26775:124::-;26864:27;26873:2;26877:7;26886:4;26864:8;:27::i;:::-;26775:124;;:::o;59789:37::-;;;;;;;;;;;;;:::o;63140:113::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63216:29:::1;63232:12;63216:15;:29::i;:::-;63140:113:::0;:::o;16846:323::-;16907:7;17135:15;:13;:15::i;:::-;17120:12;;17104:13;;:28;:46;17097:53;;16846:323;:::o;62889:126::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62991:16:::1;62971:17;:36;;;;62889:126:::0;:::o;62316:110::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62399:19:::1;;;;;;;;;;;62398:20;62376:19;;:42;;;;;;;;;;;;;;;;;;62316:110::o:0;64375:212::-;64520:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;64542:37:::1;64561:4;64567:2;64571:7;64542:18;:37::i;:::-;57976:7:::0;;57913:85;56498:42;58058:40;;;58107:4;58114:10;58058:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;56498:42;58154:40;;;58203:4;58210;58154:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58058:157;58012:310;;58295:10;58276:30;;;;;;;;;;;:::i;:::-;;;;;;;;58012:310;57634:699;64542:37:::1;64561:4;64567:2;64571:7;64542:18;:37::i;:::-;64375:212:::0;;;;;:::o;63364:326::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63412:18:::1;63433:21;63412:42;;63467:10;63488:42;63467:64;;63544:12;63583:2;:7;;63617:4;63612::::0;63599:10:::1;:17;;;;:::i;:::-;:22;;;;:::i;:::-;63583:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63569:58;;;;;63646:7;63638:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;63401:289;;;63364:326::o:0;62204:104::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62283:17:::1;;;;;;;;;;;62282:18;62262:17;;:38;;;;;;;;;;;;;;;;;;62204:104::o:0;64764:220::-;64913:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;64935:41:::1;64958:4;64964:2;64968:7;64935:22;:41::i;:::-;57976:7:::0;;57913:85;56498:42;58058:40;;;58107:4;58114:10;58058:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;56498:42;58154:40;;;58203:4;58210;58154:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58058:157;58012:310;;58295:10;58276:30;;;;;;;;;;;:::i;:::-;;;;;;;;58012:310;57634:699;64935:41:::1;64958:4;64964:2;64968:7;64935:22;:41::i;:::-;64764:220:::0;;;;;:::o;59671:26::-;;;;:::o;59110:407::-;59198:4;59215:13;59258:8;59241:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;59231:37;;;;;;59215:53;;59284:9;59279:192;59303:6;:13;59299:1;:17;59279:192;;;59354:6;59361:1;59354:9;;;;;;;;:::i;:::-;;;;;;;;59346:5;:17;:113;;59441:6;59448:1;59441:9;;;;;;;;:::i;:::-;;;;;;;;59452:5;59424:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59414:45;;;;;;59346:113;;;59393:5;59400:6;59407:1;59400:9;;;;;;;;:::i;:::-;;;;;;;;59376:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59366:45;;;;;;59346:113;59338:121;;59318:3;;;;;:::i;:::-;;;;59279:192;;;;59497:12;;59488:5;:21;59481:28;;;59110:407;;;;:::o;62577:90::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62653:6:::1;62643:7;:16;;;;62577:90:::0;:::o;63261:95::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63344:4:::1;63329:12;:19;;;;;;;;;;;;:::i;:::-;;63261:95:::0;:::o;58697:405::-;58784:4;58801:13;58844:8;58827:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;58817:37;;;;;;58801:53;;58870:9;58865:192;58889:6;:13;58885:1;:17;58865:192;;;58940:6;58947:1;58940:9;;;;;;;;:::i;:::-;;;;;;;;58932:5;:17;:113;;59027:6;59034:1;59027:9;;;;;;;;:::i;:::-;;;;;;;;59038:5;59010:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59000:45;;;;;;58932:113;;;58979:5;58986:6;58993:1;58986:9;;;;;;;;:::i;:::-;;;;;;;;58962:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58952:45;;;;;;58932:113;58924:121;;58904:3;;;;;:::i;:::-;;;;58865:192;;;;59083:11;;59074:5;:20;59067:27;;;58697:405;;;;:::o;22488:152::-;22560:7;22603:27;22622:7;22603:18;:27::i;:::-;22580:52;;22488:152;;;:::o;60528:722::-;64298:9;64284:23;;:10;:23;;;64276:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60661:4:::1;60638:27;;:19;;;;;;;;;;;:27;;;60630:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60729:8;;60712:13;:11;:13::i;:::-;60702:7;:23;;;;:::i;:::-;:35;;60694:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;60792:7;60773:15;;:26;;60765:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;60896:7;60867:14;:26;60882:10;60867:26;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;60848:15;;:55;;60840:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;60957:33;60971:10;60983:6;60957:13;:33::i;:::-;60949:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;61071:7;61051:17;;:27;;;;:::i;:::-;61038:9;:40;;61030:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;61127:5;;;;;;;;;;;61119:23;;:34;61143:9;61119:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;61194:7;61164:14;:26;61179:10;61164:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;61212:30;61222:10;61234:7;61212:9;:30::i;:::-;60528:722:::0;;:::o;18030:233::-;18102:7;18143:1;18126:19;;:5;:19;;;18122:60;;18154:28;;;;;;;;;;;;;;18122:60;12189:13;18200:18;:25;18219:5;18200:25;;;;;;;;;;;;;;;;:55;18193:62;;18030:233;;;:::o;64595:161::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;64672:6:::1;64667:82;64688:2;:9;64684:1;:13;64667:82;;;64718:19;64728:2;64731:1;64728:5;;;;;;;;:::i;:::-;;;;;;;;64735:1;64718:9;:19::i;:::-;64698:3;;;;;:::i;:::-;;;;64667:82;;;;64595:161:::0;:::o;63023:109::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63097:27:::1;63112:11;63097:14;:27::i;:::-;63023:109:::0;:::o;53968:20::-;;;;;;;;;;;;;:::o;21271:104::-;21327:13;21360:7;21353:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21271:104;:::o;60074:43::-;;;;;;;;;;;;;;;;;:::o;59881:46::-;;;;:::o;27616:234::-;27763:8;27711:18;:39;27730:19;:17;:19::i;:::-;27711:39;;;;;;;;;;;;;;;:49;27751:8;27711:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;27823:8;27787:55;;27802:19;:17;:19::i;:::-;27787:55;;;27833:8;27787:55;;;;;;:::i;:::-;;;;;;;;27616:234;;:::o;59934:39::-;;;;:::o;61826:348::-;64298:9;64284:23;;:10;:23;;;64276:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;61932:34:::1;61947:10;61959:6;61932:14;:34::i;:::-;61924:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;62041:7;62027:11;;:21;;;;:::i;:::-;62014:9;:34;;62006:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;62097:5;;;;;;;;;;;62089:23;;:34;62113:9;62089:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;62136:30;62146:10;62158:7;62136:9;:30::i;:::-;61826:348:::0;;:::o;60018:49::-;;;;;;;;;;;;;;;;;:::o;64992:245::-;65160:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;65182:47:::1;65205:4;65211:2;65215:7;65224:4;65182:22;:47::i;:::-;57976:7:::0;;57913:85;56498:42;58058:40;;;58107:4;58114:10;58058:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;56498:42;58154:40;;;58203:4;58210;58154:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58058:157;58012:310;;58295:10;58276:30;;;;;;;;;;;:::i;:::-;;;;;;;;58012:310;57634:699;65182:47:::1;65205:4;65211:2;65215:7;65224:4;65182:22;:47::i;:::-;64992:245:::0;;;;;;:::o;62783:98::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62865:8:::1;62851:11;:22;;;;62783:98:::0;:::o;59705:34::-;;;;:::o;63938:279::-;64011:13;64045:16;64053:7;64045;:16::i;:::-;64037:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;64155:16;:14;:16::i;:::-;64173:25;64190:7;64173:16;:25::i;:::-;64138:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64124:85;;63938:279;;;:::o;59634:30::-;;;;:::o;61260:558::-;64298:9;64284:23;;:10;:23;;;64276:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;61360:4:::1;61339:25;;:17;;;;;;;;;;;:25;;;61331:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;61428:8;;61411:13;:11;:13::i;:::-;61401:7;:23;;;;:::i;:::-;:35;;61393:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;61483:7;61472;;:18;;61464:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;61565:7;61542:8;:20;61551:10;61542:20;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;61531:7;;:41;;61523:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;61645:7;61631:11;;:21;;;;:::i;:::-;61618:9;:34;;61610:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;61701:5;;;;;;;;;;;61693:23;;:34;61717:9;61693:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;61762:7;61738:8;:20;61747:10;61738:20;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;61780:30;61790:10;61802:7;61780:9;:30::i;:::-;61260:558:::0;:::o;60328:192::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;60446:8:::1;;60429:13;:11;:13::i;:::-;60419:7;:23;;;;:::i;:::-;:35;;60411:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;60484:28;60494:8;60504:7;60484:9;:28::i;:::-;60328:192:::0;;:::o;59833:39::-;;;;;;;;;;;;;:::o;28007:164::-;28104:4;28128:18;:25;28147:5;28128:25;;;;;;;;;;;;;;;:35;28154:8;28128:35;;;;;;;;;;;;;;;;;;;;;;;;;28121:42;;28007:164;;;;:::o;54114:77::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;54184:4:::1;54176:5;;:12;;;;;;;;;;;;;;;;;;54114:77:::0;:::o;62675:100::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62756:11:::1;62745:8;:22;;;;62675:100:::0;:::o;62434:135::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62516:7:::1;62494:19;;:29;;;;;;;;;;;;;;;;;;62554:7;62534:17;;:27;;;;;;;;;;;;;;;;;;62434:135:::0;:::o;28429:282::-;28494:4;28550:7;28531:15;:13;:15::i;:::-;:26;;:66;;;;;28584:13;;28574:7;:23;28531:66;:153;;;;;28683:1;12965:8;28635:17;:26;28653:7;28635:26;;;;;;;;;;;;:44;:49;28531:153;28511:173;;28429:282;;;:::o;45489:431::-;45584:13;45600:16;45608:7;45600;:16::i;:::-;45584:32;;45633:13;:45;;;;;45673:5;45650:28;;:19;:17;:19::i;:::-;:28;;;;45633:45;45629:192;;;45698:44;45715:5;45722:19;:17;:19::i;:::-;45698:16;:44::i;:::-;45693:128;;45770:35;;;;;;;;;;;;;;45693:128;45629:192;45866:2;45833:15;:24;45849:7;45833:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;45904:7;45900:2;45884:28;;45893:5;45884:28;;;;;;;;;;;;45573:347;45489:431;;;:::o;58581:108::-;58670:11;58655:12;:26;;;;58581:108;:::o;63721:101::-;63786:7;63813:1;63806:8;;63721:101;:::o;30697:2825::-;30839:27;30869;30888:7;30869:18;:27::i;:::-;30839:57;;30954:4;30913:45;;30929:19;30913:45;;;30909:86;;30967:28;;;;;;;;;;;;;;30909:86;31009:27;31038:23;31065:35;31092:7;31065:26;:35::i;:::-;31008:92;;;;31200:68;31225:15;31242:4;31248:19;:17;:19::i;:::-;31200:24;:68::i;:::-;31195:180;;31288:43;31305:4;31311:19;:17;:19::i;:::-;31288:16;:43::i;:::-;31283:92;;31340:35;;;;;;;;;;;;;;31283:92;31195:180;31406:1;31392:16;;:2;:16;;;31388:52;;31417:23;;;;;;;;;;;;;;31388:52;31453:43;31475:4;31481:2;31485:7;31494:1;31453:21;:43::i;:::-;31589:15;31586:160;;;31729:1;31708:19;31701:30;31586:160;32126:18;:24;32145:4;32126:24;;;;;;;;;;;;;;;;32124:26;;;;;;;;;;;;32195:18;:22;32214:2;32195:22;;;;;;;;;;;;;;;;32193:24;;;;;;;;;;;32517:146;32554:2;32603:45;32618:4;32624:2;32628:19;32603:14;:45::i;:::-;13245:8;32575:73;32517:18;:146::i;:::-;32488:17;:26;32506:7;32488:26;;;;;;;;;;;:175;;;;32834:1;13245:8;32783:19;:47;:52;32779:627;;32856:19;32888:1;32878:7;:11;32856:33;;33045:1;33011:17;:30;33029:11;33011:30;;;;;;;;;;;;:35;33007:384;;33149:13;;33134:11;:28;33130:242;;33329:19;33296:17;:30;33314:11;33296:30;;;;;;;;;;;:52;;;;33130:242;33007:384;32837:569;32779:627;33453:7;33449:2;33434:27;;33443:4;33434:27;;;;;;;;;;;;33472:42;33493:4;33499:2;33503:7;33512:1;33472:20;:42::i;:::-;30828:2694;;;30697:2825;;;:::o;33618:193::-;33764:39;33781:4;33787:2;33791:7;33764:39;;;;;;;;;;;;:16;:39::i;:::-;33618:193;;;:::o;23643:1275::-;23710:7;23730:12;23745:7;23730:22;;23813:4;23794:15;:13;:15::i;:::-;:23;23790:1061;;23847:13;;23840:4;:20;23836:1015;;;23885:14;23902:17;:23;23920:4;23902:23;;;;;;;;;;;;23885:40;;24019:1;12965:8;23991:6;:24;:29;23987:845;;24656:113;24673:1;24663:6;:11;24656:113;;24716:17;:25;24734:6;;;;;;;24716:25;;;;;;;;;;;;24707:34;;24656:113;;;24802:6;24795:13;;;;;;23987:845;23862:989;23836:1015;23790:1061;24879:31;;;;;;;;;;;;;;23643:1275;;;;:::o;44569:112::-;44646:27;44656:2;44660:8;44646:27;;;;;;;;;;;;:9;:27::i;:::-;44569:112;;:::o;58467:106::-;58554:11;58540;:25;;;;58467:106;:::o;51976:105::-;52036:7;52063:10;52056:17;;51976:105;:::o;34409:407::-;34584:31;34597:4;34603:2;34607:7;34584:12;:31::i;:::-;34648:1;34630:2;:14;;;:19;34626:183;;34669:56;34700:4;34706:2;34710:7;34719:5;34669:30;:56::i;:::-;34664:145;;34753:40;;;;;;;;;;;;;;34664:145;34626:183;34409:407;;;;:::o;63830:100::-;63878:13;63910:12;63903:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63830:100;:::o;258:723::-;314:13;544:1;535:5;:10;531:53;;562:10;;;;;;;;;;;;;;;;;;;;;531:53;594:12;609:5;594:20;;625:14;650:78;665:1;657:4;:9;650:78;;683:8;;;;;:::i;:::-;;;;714:2;706:10;;;;;:::i;:::-;;;650:78;;;738:19;770:6;760:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;738:39;;788:154;804:1;795:5;:10;788:154;;832:1;822:11;;;;;:::i;:::-;;;899:2;891:5;:10;;;;:::i;:::-;878:2;:24;;;;:::i;:::-;865:39;;848:6;855;848:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;788:154;;;966:6;952:21;;;;;258:723;;;;:::o;29592:485::-;29694:27;29723:23;29764:38;29805:15;:24;29821:7;29805:24;;;;;;;;;;;29764:65;;29982:18;29959:41;;30039:19;30033:26;30014:45;;29944:126;29592:485;;;:::o;28820:659::-;28969:11;29134:16;29127:5;29123:28;29114:37;;29294:16;29283:9;29279:32;29266:45;;29444:15;29433:9;29430:30;29422:5;29411:9;29408:20;29405:56;29395:66;;28820:659;;;;;:::o;35478:159::-;;;;;:::o;51285:311::-;51420:7;51440:16;13369:3;51466:19;:41;;51440:68;;13369:3;51534:31;51545:4;51551:2;51555:9;51534:10;:31::i;:::-;51526:40;;:62;;51519:69;;;51285:311;;;;;:::o;25466:450::-;25546:14;25714:16;25707:5;25703:28;25694:37;;25891:5;25877:11;25852:23;25848:41;25845:52;25838:5;25835:63;25825:73;;25466:450;;;;:::o;36302:158::-;;;;;:::o;43796:689::-;43927:19;43933:2;43937:8;43927:5;:19::i;:::-;44006:1;43988:2;:14;;;:19;43984:483;;44028:11;44042:13;;44028:27;;44074:13;44096:8;44090:3;:14;44074:30;;44123:233;44154:62;44193:1;44197:2;44201:7;;;;;;44210:5;44154:30;:62::i;:::-;44149:167;;44252:40;;;;;;;;;;;;;;44149:167;44351:3;44343:5;:11;44123:233;;44438:3;44421:13;;:20;44417:34;;44443:8;;;44417:34;44009:458;;43984:483;43796:689;;;:::o;36900:716::-;37063:4;37109:2;37084:45;;;37130:19;:17;:19::i;:::-;37151:4;37157:7;37166:5;37084:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37080:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37384:1;37367:6;:13;:18;37363:235;;37413:40;;;;;;;;;;;;;;37363:235;37556:6;37550:13;37541:6;37537:2;37533:15;37526:38;37080:529;37253:54;;;37243:64;;;:6;:64;;;;37236:71;;;36900:716;;;;;;:::o;50986:147::-;51123:6;50986:147;;;;;:::o;38078:2966::-;38151:20;38174:13;;38151:36;;38214:1;38202:8;:13;38198:44;;38224:18;;;;;;;;;;;;;;38198:44;38255:61;38285:1;38289:2;38293:12;38307:8;38255:21;:61::i;:::-;38799:1;12327:2;38769:1;:26;;38768:32;38756:8;:45;38730:18;:22;38749:2;38730:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;39078:139;39115:2;39169:33;39192:1;39196:2;39200:1;39169:14;:33::i;:::-;39136:30;39157:8;39136:20;:30::i;:::-;:66;39078:18;:139::i;:::-;39044:17;:31;39062:12;39044:31;;;;;;;;;;;:173;;;;39234:16;39265:11;39294:8;39279:12;:23;39265:37;;39815:16;39811:2;39807:25;39795:37;;40187:12;40147:8;40106:1;40044:25;39985:1;39924;39897:335;40558:1;40544:12;40540:20;40498:346;40599:3;40590:7;40587:16;40498:346;;40817:7;40807:8;40804:1;40777:25;40774:1;40771;40766:59;40652:1;40643:7;40639:15;40628:26;;40498:346;;;40502:77;40889:1;40877:8;:13;40873:45;;40899:19;;;;;;;;;;;;;;40873:45;40951:3;40935:13;:19;;;;38504:2462;;40976:60;41005:1;41009:2;41013:12;41027:8;40976:20;:60::i;:::-;38140:2904;38078:2966;;:::o;26018:324::-;26088:14;26321:1;26311:8;26308:15;26282:24;26278:46;26268:56;;26018:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:77::-;4975:7;5004:5;4993:16;;4938:77;;;:::o;5021:122::-;5094:24;5112:5;5094:24;:::i;:::-;5087:5;5084:35;5074:63;;5133:1;5130;5123:12;5074:63;5021:122;:::o;5149:139::-;5195:5;5233:6;5220:20;5211:29;;5249:33;5276:5;5249:33;:::i;:::-;5149:139;;;;:::o;5294:329::-;5353:6;5402:2;5390:9;5381:7;5377:23;5373:32;5370:119;;;5408:79;;:::i;:::-;5370:119;5528:1;5553:53;5598:7;5589:6;5578:9;5574:22;5553:53;:::i;:::-;5543:63;;5499:117;5294:329;;;;:::o;5629:118::-;5716:24;5734:5;5716:24;:::i;:::-;5711:3;5704:37;5629:118;;:::o;5753:222::-;5846:4;5884:2;5873:9;5869:18;5861:26;;5897:71;5965:1;5954:9;5950:17;5941:6;5897:71;:::i;:::-;5753:222;;;;:::o;5981:619::-;6058:6;6066;6074;6123:2;6111:9;6102:7;6098:23;6094:32;6091:119;;;6129:79;;:::i;:::-;6091:119;6249:1;6274:53;6319:7;6310:6;6299:9;6295:22;6274:53;:::i;:::-;6264:63;;6220:117;6376:2;6402:53;6447:7;6438:6;6427:9;6423:22;6402:53;:::i;:::-;6392:63;;6347:118;6504:2;6530:53;6575:7;6566:6;6555:9;6551:22;6530:53;:::i;:::-;6520:63;;6475:118;5981:619;;;;;:::o;6606:117::-;6715:1;6712;6705:12;6729:180;6777:77;6774:1;6767:88;6874:4;6871:1;6864:15;6898:4;6895:1;6888:15;6915:281;6998:27;7020:4;6998:27;:::i;:::-;6990:6;6986:40;7128:6;7116:10;7113:22;7092:18;7080:10;7077:34;7074:62;7071:88;;;7139:18;;:::i;:::-;7071:88;7179:10;7175:2;7168:22;6958:238;6915:281;;:::o;7202:129::-;7236:6;7263:20;;:::i;:::-;7253:30;;7292:33;7320:4;7312:6;7292:33;:::i;:::-;7202:129;;;:::o;7337:311::-;7414:4;7504:18;7496:6;7493:30;7490:56;;;7526:18;;:::i;:::-;7490:56;7576:4;7568:6;7564:17;7556:25;;7636:4;7630;7626:15;7618:23;;7337:311;;;:::o;7654:117::-;7763:1;7760;7753:12;7794:710;7890:5;7915:81;7931:64;7988:6;7931:64;:::i;:::-;7915:81;:::i;:::-;7906:90;;8016:5;8045:6;8038:5;8031:21;8079:4;8072:5;8068:16;8061:23;;8132:4;8124:6;8120:17;8112:6;8108:30;8161:3;8153:6;8150:15;8147:122;;;8180:79;;:::i;:::-;8147:122;8295:6;8278:220;8312:6;8307:3;8304:15;8278:220;;;8387:3;8416:37;8449:3;8437:10;8416:37;:::i;:::-;8411:3;8404:50;8483:4;8478:3;8474:14;8467:21;;8354:144;8338:4;8333:3;8329:14;8322:21;;8278:220;;;8282:21;7896:608;;7794:710;;;;;:::o;8527:370::-;8598:5;8647:3;8640:4;8632:6;8628:17;8624:27;8614:122;;8655:79;;:::i;:::-;8614:122;8772:6;8759:20;8797:94;8887:3;8879:6;8872:4;8864:6;8860:17;8797:94;:::i;:::-;8788:103;;8604:293;8527:370;;;;:::o;8903:684::-;8996:6;9004;9053:2;9041:9;9032:7;9028:23;9024:32;9021:119;;;9059:79;;:::i;:::-;9021:119;9179:1;9204:53;9249:7;9240:6;9229:9;9225:22;9204:53;:::i;:::-;9194:63;;9150:117;9334:2;9323:9;9319:18;9306:32;9365:18;9357:6;9354:30;9351:117;;;9387:79;;:::i;:::-;9351:117;9492:78;9562:7;9553:6;9542:9;9538:22;9492:78;:::i;:::-;9482:88;;9277:303;8903:684;;;;;:::o;9593:117::-;9702:1;9699;9692:12;9716:308;9778:4;9868:18;9860:6;9857:30;9854:56;;;9890:18;;:::i;:::-;9854:56;9928:29;9950:6;9928:29;:::i;:::-;9920:37;;10012:4;10006;10002:15;9994:23;;9716:308;;;:::o;10030:154::-;10114:6;10109:3;10104;10091:30;10176:1;10167:6;10162:3;10158:16;10151:27;10030:154;;;:::o;10190:412::-;10268:5;10293:66;10309:49;10351:6;10309:49;:::i;:::-;10293:66;:::i;:::-;10284:75;;10382:6;10375:5;10368:21;10420:4;10413:5;10409:16;10458:3;10449:6;10444:3;10440:16;10437:25;10434:112;;;10465:79;;:::i;:::-;10434:112;10555:41;10589:6;10584:3;10579;10555:41;:::i;:::-;10274:328;10190:412;;;;;:::o;10622:340::-;10678:5;10727:3;10720:4;10712:6;10708:17;10704:27;10694:122;;10735:79;;:::i;:::-;10694:122;10852:6;10839:20;10877:79;10952:3;10944:6;10937:4;10929:6;10925:17;10877:79;:::i;:::-;10868:88;;10684:278;10622:340;;;;:::o;10968:509::-;11037:6;11086:2;11074:9;11065:7;11061:23;11057:32;11054:119;;;11092:79;;:::i;:::-;11054:119;11240:1;11229:9;11225:17;11212:31;11270:18;11262:6;11259:30;11256:117;;;11292:79;;:::i;:::-;11256:117;11397:63;11452:7;11443:6;11432:9;11428:22;11397:63;:::i;:::-;11387:73;;11183:287;10968:509;;;;:::o;11483:684::-;11576:6;11584;11633:2;11621:9;11612:7;11608:23;11604:32;11601:119;;;11639:79;;:::i;:::-;11601:119;11759:1;11784:53;11829:7;11820:6;11809:9;11805:22;11784:53;:::i;:::-;11774:63;;11730:117;11914:2;11903:9;11899:18;11886:32;11945:18;11937:6;11934:30;11931:117;;;11967:79;;:::i;:::-;11931:117;12072:78;12142:7;12133:6;12122:9;12118:22;12072:78;:::i;:::-;12062:88;;11857:303;11483:684;;;;;:::o;12173:329::-;12232:6;12281:2;12269:9;12260:7;12256:23;12252:32;12249:119;;;12287:79;;:::i;:::-;12249:119;12407:1;12432:53;12477:7;12468:6;12457:9;12453:22;12432:53;:::i;:::-;12422:63;;12378:117;12173:329;;;;:::o;12508:311::-;12585:4;12675:18;12667:6;12664:30;12661:56;;;12697:18;;:::i;:::-;12661:56;12747:4;12739:6;12735:17;12727:25;;12807:4;12801;12797:15;12789:23;;12508:311;;;:::o;12842:710::-;12938:5;12963:81;12979:64;13036:6;12979:64;:::i;:::-;12963:81;:::i;:::-;12954:90;;13064:5;13093:6;13086:5;13079:21;13127:4;13120:5;13116:16;13109:23;;13180:4;13172:6;13168:17;13160:6;13156:30;13209:3;13201:6;13198:15;13195:122;;;13228:79;;:::i;:::-;13195:122;13343:6;13326:220;13360:6;13355:3;13352:15;13326:220;;;13435:3;13464:37;13497:3;13485:10;13464:37;:::i;:::-;13459:3;13452:50;13531:4;13526:3;13522:14;13515:21;;13402:144;13386:4;13381:3;13377:14;13370:21;;13326:220;;;13330:21;12944:608;;12842:710;;;;;:::o;13575:370::-;13646:5;13695:3;13688:4;13680:6;13676:17;13672:27;13662:122;;13703:79;;:::i;:::-;13662:122;13820:6;13807:20;13845:94;13935:3;13927:6;13920:4;13912:6;13908:17;13845:94;:::i;:::-;13836:103;;13652:293;13575:370;;;;:::o;13951:539::-;14035:6;14084:2;14072:9;14063:7;14059:23;14055:32;14052:119;;;14090:79;;:::i;:::-;14052:119;14238:1;14227:9;14223:17;14210:31;14268:18;14260:6;14257:30;14254:117;;;14290:79;;:::i;:::-;14254:117;14395:78;14465:7;14456:6;14445:9;14441:22;14395:78;:::i;:::-;14385:88;;14181:302;13951:539;;;;:::o;14496:116::-;14566:21;14581:5;14566:21;:::i;:::-;14559:5;14556:32;14546:60;;14602:1;14599;14592:12;14546:60;14496:116;:::o;14618:133::-;14661:5;14699:6;14686:20;14677:29;;14715:30;14739:5;14715:30;:::i;:::-;14618:133;;;;:::o;14757:468::-;14822:6;14830;14879:2;14867:9;14858:7;14854:23;14850:32;14847:119;;;14885:79;;:::i;:::-;14847:119;15005:1;15030:53;15075:7;15066:6;15055:9;15051:22;15030:53;:::i;:::-;15020:63;;14976:117;15132:2;15158:50;15200:7;15191:6;15180:9;15176:22;15158:50;:::i;:::-;15148:60;;15103:115;14757:468;;;;;:::o;15231:307::-;15292:4;15382:18;15374:6;15371:30;15368:56;;;15404:18;;:::i;:::-;15368:56;15442:29;15464:6;15442:29;:::i;:::-;15434:37;;15526:4;15520;15516:15;15508:23;;15231:307;;;:::o;15544:410::-;15621:5;15646:65;15662:48;15703:6;15662:48;:::i;:::-;15646:65;:::i;:::-;15637:74;;15734:6;15727:5;15720:21;15772:4;15765:5;15761:16;15810:3;15801:6;15796:3;15792:16;15789:25;15786:112;;;15817:79;;:::i;:::-;15786:112;15907:41;15941:6;15936:3;15931;15907:41;:::i;:::-;15627:327;15544:410;;;;;:::o;15973:338::-;16028:5;16077:3;16070:4;16062:6;16058:17;16054:27;16044:122;;16085:79;;:::i;:::-;16044:122;16202:6;16189:20;16227:78;16301:3;16293:6;16286:4;16278:6;16274:17;16227:78;:::i;:::-;16218:87;;16034:277;15973:338;;;;:::o;16317:943::-;16412:6;16420;16428;16436;16485:3;16473:9;16464:7;16460:23;16456:33;16453:120;;;16492:79;;:::i;:::-;16453:120;16612:1;16637:53;16682:7;16673:6;16662:9;16658:22;16637:53;:::i;:::-;16627:63;;16583:117;16739:2;16765:53;16810:7;16801:6;16790:9;16786:22;16765:53;:::i;:::-;16755:63;;16710:118;16867:2;16893:53;16938:7;16929:6;16918:9;16914:22;16893:53;:::i;:::-;16883:63;;16838:118;17023:2;17012:9;17008:18;16995:32;17054:18;17046:6;17043:30;17040:117;;;17076:79;;:::i;:::-;17040:117;17181:62;17235:7;17226:6;17215:9;17211:22;17181:62;:::i;:::-;17171:72;;16966:287;16317:943;;;;;;;:::o;17266:474::-;17334:6;17342;17391:2;17379:9;17370:7;17366:23;17362:32;17359:119;;;17397:79;;:::i;:::-;17359:119;17517:1;17542:53;17587:7;17578:6;17567:9;17563:22;17542:53;:::i;:::-;17532:63;;17488:117;17644:2;17670:53;17715:7;17706:6;17695:9;17691:22;17670:53;:::i;:::-;17660:63;;17615:118;17266:474;;;;;:::o;17746:::-;17814:6;17822;17871:2;17859:9;17850:7;17846:23;17842:32;17839:119;;;17877:79;;:::i;:::-;17839:119;17997:1;18022:53;18067:7;18058:6;18047:9;18043:22;18022:53;:::i;:::-;18012:63;;17968:117;18124:2;18150:53;18195:7;18186:6;18175:9;18171:22;18150:53;:::i;:::-;18140:63;;18095:118;17746:474;;;;;:::o;18226:323::-;18282:6;18331:2;18319:9;18310:7;18306:23;18302:32;18299:119;;;18337:79;;:::i;:::-;18299:119;18457:1;18482:50;18524:7;18515:6;18504:9;18500:22;18482:50;:::i;:::-;18472:60;;18428:114;18226:323;;;;:::o;18555:180::-;18603:77;18600:1;18593:88;18700:4;18697:1;18690:15;18724:4;18721:1;18714:15;18741:320;18785:6;18822:1;18816:4;18812:12;18802:22;;18869:1;18863:4;18859:12;18890:18;18880:81;;18946:4;18938:6;18934:17;18924:27;;18880:81;19008:2;19000:6;18997:14;18977:18;18974:38;18971:84;;19027:18;;:::i;:::-;18971:84;18792:269;18741:320;;;:::o;19067:160::-;19207:12;19203:1;19195:6;19191:14;19184:36;19067:160;:::o;19233:366::-;19375:3;19396:67;19460:2;19455:3;19396:67;:::i;:::-;19389:74;;19472:93;19561:3;19472:93;:::i;:::-;19590:2;19585:3;19581:12;19574:19;;19233:366;;;:::o;19605:419::-;19771:4;19809:2;19798:9;19794:18;19786:26;;19858:9;19852:4;19848:20;19844:1;19833:9;19829:17;19822:47;19886:131;20012:4;19886:131;:::i;:::-;19878:139;;19605:419;;;:::o;20030:332::-;20151:4;20189:2;20178:9;20174:18;20166:26;;20202:71;20270:1;20259:9;20255:17;20246:6;20202:71;:::i;:::-;20283:72;20351:2;20340:9;20336:18;20327:6;20283:72;:::i;:::-;20030:332;;;;;:::o;20368:137::-;20422:5;20453:6;20447:13;20438:22;;20469:30;20493:5;20469:30;:::i;:::-;20368:137;;;;:::o;20511:345::-;20578:6;20627:2;20615:9;20606:7;20602:23;20598:32;20595:119;;;20633:79;;:::i;:::-;20595:119;20753:1;20778:61;20831:7;20822:6;20811:9;20807:22;20778:61;:::i;:::-;20768:71;;20724:125;20511:345;;;;:::o;20862:180::-;20910:77;20907:1;20900:88;21007:4;21004:1;20997:15;21031:4;21028:1;21021:15;21048:348;21088:7;21111:20;21129:1;21111:20;:::i;:::-;21106:25;;21145:20;21163:1;21145:20;:::i;:::-;21140:25;;21333:1;21265:66;21261:74;21258:1;21255:81;21250:1;21243:9;21236:17;21232:105;21229:131;;;21340:18;;:::i;:::-;21229:131;21388:1;21385;21381:9;21370:20;;21048:348;;;;:::o;21402:180::-;21450:77;21447:1;21440:88;21547:4;21544:1;21537:15;21571:4;21568:1;21561:15;21588:185;21628:1;21645:20;21663:1;21645:20;:::i;:::-;21640:25;;21679:20;21697:1;21679:20;:::i;:::-;21674:25;;21718:1;21708:35;;21723:18;;:::i;:::-;21708:35;21765:1;21762;21758:9;21753:14;;21588:185;;;;:::o;21779:147::-;21880:11;21917:3;21902:18;;21779:147;;;;:::o;21932:114::-;;:::o;22052:398::-;22211:3;22232:83;22313:1;22308:3;22232:83;:::i;:::-;22225:90;;22324:93;22413:3;22324:93;:::i;:::-;22442:1;22437:3;22433:11;22426:18;;22052:398;;;:::o;22456:379::-;22640:3;22662:147;22805:3;22662:147;:::i;:::-;22655:154;;22826:3;22819:10;;22456:379;;;:::o;22841:174::-;22981:26;22977:1;22969:6;22965:14;22958:50;22841:174;:::o;23021:366::-;23163:3;23184:67;23248:2;23243:3;23184:67;:::i;:::-;23177:74;;23260:93;23349:3;23260:93;:::i;:::-;23378:2;23373:3;23369:12;23362:19;;23021:366;;;:::o;23393:419::-;23559:4;23597:2;23586:9;23582:18;23574:26;;23646:9;23640:4;23636:20;23632:1;23621:9;23617:17;23610:47;23674:131;23800:4;23674:131;:::i;:::-;23666:139;;23393:419;;;:::o;23818:94::-;23851:8;23899:5;23895:2;23891:14;23870:35;;23818:94;;;:::o;23918:::-;23957:7;23986:20;24000:5;23986:20;:::i;:::-;23975:31;;23918:94;;;:::o;24018:100::-;24057:7;24086:26;24106:5;24086:26;:::i;:::-;24075:37;;24018:100;;;:::o;24124:157::-;24229:45;24249:24;24267:5;24249:24;:::i;:::-;24229:45;:::i;:::-;24224:3;24217:58;24124:157;;:::o;24287:256::-;24399:3;24414:75;24485:3;24476:6;24414:75;:::i;:::-;24514:2;24509:3;24505:12;24498:19;;24534:3;24527:10;;24287:256;;;;:::o;24549:180::-;24597:77;24594:1;24587:88;24694:4;24691:1;24684:15;24718:4;24715:1;24708:15;24735:79;24774:7;24803:5;24792:16;;24735:79;;;:::o;24820:157::-;24925:45;24945:24;24963:5;24945:24;:::i;:::-;24925:45;:::i;:::-;24920:3;24913:58;24820:157;;:::o;24983:397::-;25123:3;25138:75;25209:3;25200:6;25138:75;:::i;:::-;25238:2;25233:3;25229:12;25222:19;;25251:75;25322:3;25313:6;25251:75;:::i;:::-;25351:2;25346:3;25342:12;25335:19;;25371:3;25364:10;;24983:397;;;;;:::o;25386:233::-;25425:3;25448:24;25466:5;25448:24;:::i;:::-;25439:33;;25494:66;25487:5;25484:77;25481:103;;25564:18;;:::i;:::-;25481:103;25611:1;25604:5;25600:13;25593:20;;25386:233;;;:::o;25625:167::-;25765:19;25761:1;25753:6;25749:14;25742:43;25625:167;:::o;25798:366::-;25940:3;25961:67;26025:2;26020:3;25961:67;:::i;:::-;25954:74;;26037:93;26126:3;26037:93;:::i;:::-;26155:2;26150:3;26146:12;26139:19;;25798:366;;;:::o;26170:419::-;26336:4;26374:2;26363:9;26359:18;26351:26;;26423:9;26417:4;26413:20;26409:1;26398:9;26394:17;26387:47;26451:131;26577:4;26451:131;:::i;:::-;26443:139;;26170:419;;;:::o;26595:163::-;26735:15;26731:1;26723:6;26719:14;26712:39;26595:163;:::o;26764:366::-;26906:3;26927:67;26991:2;26986:3;26927:67;:::i;:::-;26920:74;;27003:93;27092:3;27003:93;:::i;:::-;27121:2;27116:3;27112:12;27105:19;;26764:366;;;:::o;27136:419::-;27302:4;27340:2;27329:9;27325:18;27317:26;;27389:9;27383:4;27379:20;27375:1;27364:9;27360:17;27353:47;27417:131;27543:4;27417:131;:::i;:::-;27409:139;;27136:419;;;:::o;27561:305::-;27601:3;27620:20;27638:1;27620:20;:::i;:::-;27615:25;;27654:20;27672:1;27654:20;:::i;:::-;27649:25;;27808:1;27740:66;27736:74;27733:1;27730:81;27727:107;;;27814:18;;:::i;:::-;27727:107;27858:1;27855;27851:9;27844:16;;27561:305;;;;:::o;27872:162::-;28012:14;28008:1;28000:6;27996:14;27989:38;27872:162;:::o;28040:366::-;28182:3;28203:67;28267:2;28262:3;28203:67;:::i;:::-;28196:74;;28279:93;28368:3;28279:93;:::i;:::-;28397:2;28392:3;28388:12;28381:19;;28040:366;;;:::o;28412:419::-;28578:4;28616:2;28605:9;28601:18;28593:26;;28665:9;28659:4;28655:20;28651:1;28640:9;28636:17;28629:47;28693:131;28819:4;28693:131;:::i;:::-;28685:139;;28412:419;;;:::o;28837:175::-;28977:27;28973:1;28965:6;28961:14;28954:51;28837:175;:::o;29018:366::-;29160:3;29181:67;29245:2;29240:3;29181:67;:::i;:::-;29174:74;;29257:93;29346:3;29257:93;:::i;:::-;29375:2;29370:3;29366:12;29359:19;;29018:366;;;:::o;29390:419::-;29556:4;29594:2;29583:9;29579:18;29571:26;;29643:9;29637:4;29633:20;29629:1;29618:9;29614:17;29607:47;29671:131;29797:4;29671:131;:::i;:::-;29663:139;;29390:419;;;:::o;29815:180::-;29955:32;29951:1;29943:6;29939:14;29932:56;29815:180;:::o;30001:366::-;30143:3;30164:67;30228:2;30223:3;30164:67;:::i;:::-;30157:74;;30240:93;30329:3;30240:93;:::i;:::-;30358:2;30353:3;30349:12;30342:19;;30001:366;;;:::o;30373:419::-;30539:4;30577:2;30566:9;30562:18;30554:26;;30626:9;30620:4;30616:20;30612:1;30601:9;30597:17;30590:47;30654:131;30780:4;30654:131;:::i;:::-;30646:139;;30373:419;;;:::o;30798:174::-;30938:26;30934:1;30926:6;30922:14;30915:50;30798:174;:::o;30978:366::-;31120:3;31141:67;31205:2;31200:3;31141:67;:::i;:::-;31134:74;;31217:93;31306:3;31217:93;:::i;:::-;31335:2;31330:3;31326:12;31319:19;;30978:366;;;:::o;31350:419::-;31516:4;31554:2;31543:9;31539:18;31531:26;;31603:9;31597:4;31593:20;31589:1;31578:9;31574:17;31567:47;31631:131;31757:4;31631:131;:::i;:::-;31623:139;;31350:419;;;:::o;31775:175::-;31915:27;31911:1;31903:6;31899:14;31892:51;31775:175;:::o;31956:366::-;32098:3;32119:67;32183:2;32178:3;32119:67;:::i;:::-;32112:74;;32195:93;32284:3;32195:93;:::i;:::-;32313:2;32308:3;32304:12;32297:19;;31956:366;;;:::o;32328:419::-;32494:4;32532:2;32521:9;32517:18;32509:26;;32581:9;32575:4;32571:20;32567:1;32556:9;32552:17;32545:47;32609:131;32735:4;32609:131;:::i;:::-;32601:139;;32328:419;;;:::o;32753:234::-;32893:34;32889:1;32881:6;32877:14;32870:58;32962:17;32957:2;32949:6;32945:15;32938:42;32753:234;:::o;32993:366::-;33135:3;33156:67;33220:2;33215:3;33156:67;:::i;:::-;33149:74;;33232:93;33321:3;33232:93;:::i;:::-;33350:2;33345:3;33341:12;33334:19;;32993:366;;;:::o;33365:419::-;33531:4;33569:2;33558:9;33554:18;33546:26;;33618:9;33612:4;33608:20;33604:1;33593:9;33589:17;33582:47;33646:131;33772:4;33646:131;:::i;:::-;33638:139;;33365:419;;;:::o;33790:148::-;33892:11;33929:3;33914:18;;33790:148;;;;:::o;33944:377::-;34050:3;34078:39;34111:5;34078:39;:::i;:::-;34133:89;34215:6;34210:3;34133:89;:::i;:::-;34126:96;;34231:52;34276:6;34271:3;34264:4;34257:5;34253:16;34231:52;:::i;:::-;34308:6;34303:3;34299:16;34292:23;;34054:267;33944:377;;;;:::o;34327:155::-;34467:7;34463:1;34455:6;34451:14;34444:31;34327:155;:::o;34488:400::-;34648:3;34669:84;34751:1;34746:3;34669:84;:::i;:::-;34662:91;;34762:93;34851:3;34762:93;:::i;:::-;34880:1;34875:3;34871:11;34864:18;;34488:400;;;:::o;34894:701::-;35175:3;35197:95;35288:3;35279:6;35197:95;:::i;:::-;35190:102;;35309:95;35400:3;35391:6;35309:95;:::i;:::-;35302:102;;35421:148;35565:3;35421:148;:::i;:::-;35414:155;;35586:3;35579:10;;34894:701;;;;;:::o;35601:167::-;35741:19;35737:1;35729:6;35725:14;35718:43;35601:167;:::o;35774:366::-;35916:3;35937:67;36001:2;35996:3;35937:67;:::i;:::-;35930:74;;36013:93;36102:3;36013:93;:::i;:::-;36131:2;36126:3;36122:12;36115:19;;35774:366;;;:::o;36146:419::-;36312:4;36350:2;36339:9;36335:18;36327:26;;36399:9;36393:4;36389:20;36385:1;36374:9;36370:17;36363:47;36427:131;36553:4;36427:131;:::i;:::-;36419:139;;36146:419;;;:::o;36571:172::-;36711:24;36707:1;36699:6;36695:14;36688:48;36571:172;:::o;36749:366::-;36891:3;36912:67;36976:2;36971:3;36912:67;:::i;:::-;36905:74;;36988:93;37077:3;36988:93;:::i;:::-;37106:2;37101:3;37097:12;37090:19;;36749:366;;;:::o;37121:419::-;37287:4;37325:2;37314:9;37310:18;37302:26;;37374:9;37368:4;37364:20;37360:1;37349:9;37345:17;37338:47;37402:131;37528:4;37402:131;:::i;:::-;37394:139;;37121:419;;;:::o;37546:191::-;37586:4;37606:20;37624:1;37606:20;:::i;:::-;37601:25;;37640:20;37658:1;37640:20;:::i;:::-;37635:25;;37679:1;37676;37673:8;37670:34;;;37684:18;;:::i;:::-;37670:34;37729:1;37726;37722:9;37714:17;;37546:191;;;;:::o;37743:176::-;37775:1;37792:20;37810:1;37792:20;:::i;:::-;37787:25;;37826:20;37844:1;37826:20;:::i;:::-;37821:25;;37865:1;37855:35;;37870:18;;:::i;:::-;37855:35;37911:1;37908;37904:9;37899:14;;37743:176;;;;:::o;37925:98::-;37976:6;38010:5;38004:12;37994:22;;37925:98;;;:::o;38029:168::-;38112:11;38146:6;38141:3;38134:19;38186:4;38181:3;38177:14;38162:29;;38029:168;;;;:::o;38203:360::-;38289:3;38317:38;38349:5;38317:38;:::i;:::-;38371:70;38434:6;38429:3;38371:70;:::i;:::-;38364:77;;38450:52;38495:6;38490:3;38483:4;38476:5;38472:16;38450:52;:::i;:::-;38527:29;38549:6;38527:29;:::i;:::-;38522:3;38518:39;38511:46;;38293:270;38203:360;;;;:::o;38569:640::-;38764:4;38802:3;38791:9;38787:19;38779:27;;38816:71;38884:1;38873:9;38869:17;38860:6;38816:71;:::i;:::-;38897:72;38965:2;38954:9;38950:18;38941:6;38897:72;:::i;:::-;38979;39047:2;39036:9;39032:18;39023:6;38979:72;:::i;:::-;39098:9;39092:4;39088:20;39083:2;39072:9;39068:18;39061:48;39126:76;39197:4;39188:6;39126:76;:::i;:::-;39118:84;;38569:640;;;;;;;:::o;39215:141::-;39271:5;39302:6;39296:13;39287:22;;39318:32;39344:5;39318:32;:::i;:::-;39215:141;;;;:::o;39362:349::-;39431:6;39480:2;39468:9;39459:7;39455:23;39451:32;39448:119;;;39486:79;;:::i;:::-;39448:119;39606:1;39631:63;39686:7;39677:6;39666:9;39662:22;39631:63;:::i;:::-;39621:73;;39577:127;39362:349;;;;:::o

Swarm Source

ipfs://156e8d090aa85b80a2a8b0ec2ca004264d9a2264de4ec08edbc35cc7990862ed
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.