ETH Price: $2,355.98 (+0.64%)

Token

Moonknight (MK)
 

Overview

Max Total Supply

422 MK

Holders

214

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
alexjh.eth
Balance
2 MK
0x4a80e4a533d91918c687f04c518316d3be796210
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:
Moonknight

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-17
*/

// File: contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * Returns the auxillary 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 auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

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

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

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

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

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

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

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

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

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

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }
 
    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

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

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

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/finance/PaymentSplitter.sol


// OpenZeppelin Contracts (last updated v4.7.0) (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;




/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned. The distribution of shares is set at the
 * time of contract deployment and can't be updated thereafter.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Getter for the amount of payee's releasable Ether.
     */
    function releasable(address account) public view returns (uint256) {
        uint256 totalReceived = address(this).balance + totalReleased();
        return _pendingPayment(account, totalReceived, released(account));
    }

    /**
     * @dev Getter for the amount of payee's releasable `token` tokens. `token` should be the address of an
     * IERC20 contract.
     */
    function releasable(IERC20 token, address account) public view returns (uint256) {
        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        return _pendingPayment(account, totalReceived, released(token, account));
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 payment = releasable(account);

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 payment = releasable(token, account);

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: contracts/TEST.sol


pragma solidity ^0.8.12;







contract Moonknight is Ownable, ERC721A, PaymentSplitter {

    using Strings for uint;
    using SafeMath for uint256;

    enum Step {
        Before,
        WhitelistSale,
        PublicSale,
        SoldOut,
        Reveal
    }

    uint private constant MAX_SUPPLY = 6666;
    uint private constant MAX_MOONLIST = 1000;
    uint private constant MAX_PUBLIC = 5466;
    uint private constant MAX_GIFT = 200;
    uint256 public publicsaleMaxMint = 3;
    uint256 public mlsaleMaxMint = 2;

    bool public saleIsActive = false;
    bool public mlsaleIsActive = false;
    bool public _revealed = false;


    uint public mlSalePrice = 0 ether;
    string public notRevealedUri;
    string public baseExtension = ".json";
    string public baseURI;
    uint public publicSalePrice = 0.0066 ether;

    bytes32 public merkleRoot;

    

    mapping(address => uint) public Amount_NFT_PerWallet_MLSALE;
    mapping(address => uint) public Amount_NFT_PerWallet_PUBSALE;
    mapping(uint256 => string) private _tokenURIs;

    uint private teamLength;

    constructor(address[] memory _team, uint[] memory _teamShares, bytes32 _merkleRoot, string memory _baseURI, string memory initNotRevealedUri) ERC721A("Moonknight", "MK")
    PaymentSplitter(_team, _teamShares) {
        merkleRoot = _merkleRoot;
        baseURI = _baseURI;
        teamLength = _team.length;
        setNotRevealedURI(initNotRevealedUri);
    }


    function whitelistMint(address _account, uint _quantity, bytes32[] calldata _proof) external payable {
        uint price = mlSalePrice;
        require(mlsaleIsActive, "Whitelist Sale has not activated yet");
        require(isWhiteListed(msg.sender, _proof), "Not whitelisted");
        require(Amount_NFT_PerWallet_MLSALE[msg.sender] + _quantity <= mlsaleMaxMint, "You can only get 1 NFT on the Whitelist Sale");
        require(totalSupply() + _quantity <= MAX_MOONLIST, "Max supply exceeded");
        require(msg.value >= price * _quantity, "Not enought funds");
        Amount_NFT_PerWallet_MLSALE[msg.sender] += _quantity;
        _safeMint(_account, _quantity);
    }


    
    function publicSaleMint(address _account, uint _quantity) external payable {
        uint price = publicSalePrice;
        require(price != 0, "Price is 0");
        require(saleIsActive, "Public sale is not activated");
        require(totalSupply() + _quantity <= MAX_MOONLIST + MAX_PUBLIC, "Max supply exceeded");
        require(Amount_NFT_PerWallet_PUBSALE[msg.sender] + _quantity <= publicsaleMaxMint, "You can only get 10 NFT on the Public Sale");
        require(msg.value >= price * _quantity, "Not enought funds");
        Amount_NFT_PerWallet_PUBSALE[msg.sender] += _quantity;
        _safeMint(_account, _quantity);
    }

    function gift(address _to, uint _quantity) external onlyOwner {
        require(totalSupply() + _quantity <= MAX_SUPPLY, "Reached max Supply");
        _safeMint(_to, _quantity);
    }

    function flipSaleState() external onlyOwner {
        saleIsActive = !saleIsActive;
      }
    
    function flipmlsaleState() external onlyOwner {
        mlsaleIsActive = !mlsaleIsActive;
      }


    function setBaseUri(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }



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

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


        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();
       
          // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return
            string(abi.encodePacked(base, tokenId.toString(), baseExtension));
        }


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



     function flipReveal() public onlyOwner {
        _revealed = !_revealed;
    }

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

    //Whitelist
    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function isWhiteListed(address _account, bytes32[] calldata _proof) public view returns(bool) {
        return _verify(leaf(_account), _proof);
    }

    

    function leaf(address _account) internal pure returns(bytes32) {
        return keccak256(abi.encodePacked(_account));
    }

    function _verify(bytes32 _leaf, bytes32[] memory _proof) internal view returns(bool) {
        return MerkleProof.verify(_proof, merkleRoot, _leaf);
    }

    //ReleaseALL
    function releaseAll() external {
        for(uint i = 0 ; i < teamLength ; i++) {
            release(payable(payee(i)));
        }
    }

    receive() override external payable {
        revert('Only if you mint');
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"_team","type":"address[]"},{"internalType":"uint256[]","name":"_teamShares","type":"uint256[]"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"string","name":"initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":"","type":"address"}],"name":"Amount_NFT_PerWallet_MLSALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Amount_NFT_PerWallet_PUBSALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipmlsaleState","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":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":"_account","type":"address"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mlSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mlsaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mlsaleMaxMint","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":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicsaleMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600360105560026011556000601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff0219169083151502179055506000601260026101000a81548160ff02191690831515021790555060006013556040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060159081620000aa919062000953565b50661772aa3f848000601755348015620000c357600080fd5b506040516200677c3803806200677c8339818101604052810190620000e9919062000e20565b84846040518060400160405280600a81526020017f4d6f6f6e6b6e69676874000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4d4b000000000000000000000000000000000000000000000000000000000000815250620001776200016b620002f060201b60201c565b620002f860201b60201c565b816003908162000188919062000953565b5080600490816200019a919062000953565b50620001ab620003bc60201b60201c565b60018190555050508051825114620001fa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001f19062000fab565b60405180910390fd5b600082511162000241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000238906200101d565b60405180910390fd5b60005b8251811015620002b0576200029a8382815181106200026857620002676200103f565b5b60200260200101518383815181106200028657620002856200103f565b5b6020026020010151620003c160201b60201c565b8080620002a7906200109d565b91505062000244565b505050826018819055508160169081620002cb919062000953565b508451601c81905550620002e581620005fa60201b60201c565b505050505062001388565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000433576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200042a9062001160565b60405180910390fd5b6000811162000479576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200047090620011d2565b60405180910390fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414620004fe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f5906200126a565b60405180910390fd5b600d829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600954620005b591906200128c565b6009819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac8282604051620005ee929190620012e9565b60405180910390a15050565b6200060a6200061f60201b60201c565b80601490816200061b919062000953565b5050565b6200062f620002f060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000655620006b060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620006ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006a59062001366565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200075b57607f821691505b60208210810362000771576200077062000713565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007db7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200079c565b620007e786836200079c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008346200082e6200082884620007ff565b62000809565b620007ff565b9050919050565b6000819050919050565b620008508362000813565b620008686200085f826200083b565b848454620007a9565b825550505050565b600090565b6200087f62000870565b6200088c81848462000845565b505050565b5b81811015620008b457620008a860008262000875565b60018101905062000892565b5050565b601f8211156200090357620008cd8162000777565b620008d8846200078c565b81016020851015620008e8578190505b62000900620008f7856200078c565b83018262000891565b50505b505050565b600082821c905092915050565b6000620009286000198460080262000908565b1980831691505092915050565b600062000943838362000915565b9150826002028217905092915050565b6200095e82620006d9565b67ffffffffffffffff8111156200097a5762000979620006e4565b5b62000986825462000742565b62000993828285620008b8565b600060209050601f831160018114620009cb5760008415620009b6578287015190505b620009c2858262000935565b86555062000a32565b601f198416620009db8662000777565b60005b8281101562000a0557848901518255600182019150602085019450602081019050620009de565b8683101562000a25578489015162000a21601f89168262000915565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000a6f8262000a53565b810181811067ffffffffffffffff8211171562000a915762000a90620006e4565b5b80604052505050565b600062000aa662000a3a565b905062000ab4828262000a64565b919050565b600067ffffffffffffffff82111562000ad75762000ad6620006e4565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b1a8262000aed565b9050919050565b62000b2c8162000b0d565b811462000b3857600080fd5b50565b60008151905062000b4c8162000b21565b92915050565b600062000b6962000b638462000ab9565b62000a9a565b9050808382526020820190506020840283018581111562000b8f5762000b8e62000ae8565b5b835b8181101562000bbc578062000ba7888262000b3b565b84526020840193505060208101905062000b91565b5050509392505050565b600082601f83011262000bde5762000bdd62000a4e565b5b815162000bf084826020860162000b52565b91505092915050565b600067ffffffffffffffff82111562000c175762000c16620006e4565b5b602082029050602081019050919050565b62000c3381620007ff565b811462000c3f57600080fd5b50565b60008151905062000c538162000c28565b92915050565b600062000c7062000c6a8462000bf9565b62000a9a565b9050808382526020820190506020840283018581111562000c965762000c9562000ae8565b5b835b8181101562000cc3578062000cae888262000c42565b84526020840193505060208101905062000c98565b5050509392505050565b600082601f83011262000ce55762000ce462000a4e565b5b815162000cf784826020860162000c59565b91505092915050565b6000819050919050565b62000d158162000d00565b811462000d2157600080fd5b50565b60008151905062000d358162000d0a565b92915050565b600080fd5b600067ffffffffffffffff82111562000d5e5762000d5d620006e4565b5b62000d698262000a53565b9050602081019050919050565b60005b8381101562000d9657808201518184015260208101905062000d79565b60008484015250505050565b600062000db962000db38462000d40565b62000a9a565b90508281526020810184848401111562000dd85762000dd762000d3b565b5b62000de584828562000d76565b509392505050565b600082601f83011262000e055762000e0462000a4e565b5b815162000e1784826020860162000da2565b91505092915050565b600080600080600060a0868803121562000e3f5762000e3e62000a44565b5b600086015167ffffffffffffffff81111562000e605762000e5f62000a49565b5b62000e6e8882890162000bc6565b955050602086015167ffffffffffffffff81111562000e925762000e9162000a49565b5b62000ea08882890162000ccd565b945050604062000eb38882890162000d24565b935050606086015167ffffffffffffffff81111562000ed75762000ed662000a49565b5b62000ee58882890162000ded565b925050608086015167ffffffffffffffff81111562000f095762000f0862000a49565b5b62000f178882890162000ded565b9150509295509295909350565b600082825260208201905092915050565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b600062000f9360328362000f24565b915062000fa08262000f35565b604082019050919050565b6000602082019050818103600083015262000fc68162000f84565b9050919050565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b600062001005601a8362000f24565b9150620010128262000fcd565b602082019050919050565b60006020820190508181036000830152620010388162000ff6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620010aa82620007ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620010df57620010de6200106e565b5b600182019050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b600062001148602c8362000f24565b91506200115582620010ea565b604082019050919050565b600060208201905081810360008301526200117b8162001139565b9050919050565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b6000620011ba601d8362000f24565b9150620011c78262001182565b602082019050919050565b60006020820190508181036000830152620011ed81620011ab565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b600062001252602b8362000f24565b91506200125f82620011f4565b604082019050919050565b60006020820190508181036000830152620012858162001243565b9050919050565b60006200129982620007ff565b9150620012a683620007ff565b9250828201905080821115620012c157620012c06200106e565b5b92915050565b620012d28162000b0d565b82525050565b620012e381620007ff565b82525050565b6000604082019050620013006000830185620012c7565b6200130f6020830184620012d8565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200134e60208362000f24565b91506200135b8262001316565b602082019050919050565b6000602082019050818103600083015262001381816200133f565b9050919050565b6153e480620013986000396000f3fe6080604052600436106103035760003560e01c80638da5cb5b11610190578063c87b56dd116100dc578063e33b7de311610095578063eb8d24441161006f578063eb8d244414610bd0578063f2c4ce1e14610bfb578063f2fde38b14610c24578063f47ee42114610c4d57610343565b8063e33b7de314610b3d578063e985e9c514610b68578063e9f514f214610ba557610343565b8063c87b56dd146109f5578063cbce4c9714610a32578063ce7c2ac214610a5b578063d79779b214610a98578063d86697ee14610ad5578063d979fa9c14610b1257610343565b8063a3f8eace11610149578063bec88e2811610123578063bec88e281461094b578063c45ac05014610976578063c5027fa5146109b3578063c6682862146109ca57610343565b8063a3f8eace146108c9578063ac5ae11b14610906578063b88d4fde1461092257610343565b80638da5cb5b146107b957806395d89b41146107e45780639852595c1461080f5780639b6860c81461084c578063a0bcfc7f14610877578063a22cb465146108a057610343565b8063406072a91161024f5780636352211e1161020857806370a08231116101e257806370a08231146106ff578063715018a61461073c5780637cb64759146107535780638b83209b1461077c57610343565b80636352211e1461066c5780636c0360eb146106a95780636ebeac85146106d457610343565b8063406072a91461056d57806342842e0e146105aa57806348b75044146105d35780634b11faaf146105fc5780635be7fde81461061857806361bdac321461062f57610343565b806319165587116102bc57806333fdc4271161029657806333fdc427146104e957806334918dfd146105145780633a98ef391461052b5780633b84d9c61461055657610343565b8063191655871461046c57806323b872dd146104955780632eb4a7ab146104be57610343565b806301ffc9a71461034857806306fdde0314610385578063081812fc146103b0578063081c8c44146103ed578063095ea7b31461041857806318160ddd1461044157610343565b36610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a906137ba565b60405180910390fd5b600080fd5b34801561035457600080fd5b5061036f600480360381019061036a9190613846565b610c8a565b60405161037c919061388e565b60405180910390f35b34801561039157600080fd5b5061039a610d1c565b6040516103a79190613928565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d29190613980565b610dae565b6040516103e491906139ee565b60405180910390f35b3480156103f957600080fd5b50610402610e2a565b60405161040f9190613928565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613a35565b610eb8565b005b34801561044d57600080fd5b5061045661105e565b6040516104639190613a84565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e9190613add565b611075565b005b3480156104a157600080fd5b506104bc60048036038101906104b79190613b0a565b6111fd565b005b3480156104ca57600080fd5b506104d361120d565b6040516104e09190613b76565b60405180910390f35b3480156104f557600080fd5b506104fe611213565b60405161050b9190613a84565b60405180910390f35b34801561052057600080fd5b50610529611219565b005b34801561053757600080fd5b5061054061124d565b60405161054d9190613a84565b60405180910390f35b34801561056257600080fd5b5061056b611257565b005b34801561057957600080fd5b50610594600480360381019061058f9190613bcf565b61128b565b6040516105a19190613a84565b60405180910390f35b3480156105b657600080fd5b506105d160048036038101906105cc9190613b0a565b611312565b005b3480156105df57600080fd5b506105fa60048036038101906105f59190613bcf565b611332565b005b61061660048036038101906106119190613c74565b61154e565b005b34801561062457600080fd5b5061062d611789565b005b34801561063b57600080fd5b5061065660048036038101906106519190613ce8565b6117bd565b6040516106639190613a84565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190613980565b6117d5565b6040516106a091906139ee565b60405180910390f35b3480156106b557600080fd5b506106be6117e7565b6040516106cb9190613928565b60405180910390f35b3480156106e057600080fd5b506106e9611875565b6040516106f6919061388e565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190613ce8565b611888565b6040516107339190613a84565b60405180910390f35b34801561074857600080fd5b50610751611940565b005b34801561075f57600080fd5b5061077a60048036038101906107759190613d41565b611954565b005b34801561078857600080fd5b506107a3600480360381019061079e9190613980565b611966565b6040516107b091906139ee565b60405180910390f35b3480156107c557600080fd5b506107ce6119ae565b6040516107db91906139ee565b60405180910390f35b3480156107f057600080fd5b506107f96119d7565b6040516108069190613928565b60405180910390f35b34801561081b57600080fd5b5061083660048036038101906108319190613ce8565b611a69565b6040516108439190613a84565b60405180910390f35b34801561085857600080fd5b50610861611ab2565b60405161086e9190613a84565b60405180910390f35b34801561088357600080fd5b5061089e60048036038101906108999190613e9e565b611ab8565b005b3480156108ac57600080fd5b506108c760048036038101906108c29190613f13565b611ad3565b005b3480156108d557600080fd5b506108f060048036038101906108eb9190613ce8565b611c4a565b6040516108fd9190613a84565b60405180910390f35b610920600480360381019061091b9190613a35565b611c7d565b005b34801561092e57600080fd5b5061094960048036038101906109449190613ff4565b611ebc565b005b34801561095757600080fd5b50610960611f2f565b60405161096d9190613a84565b60405180910390f35b34801561098257600080fd5b5061099d60048036038101906109989190613bcf565b611f35565b6040516109aa9190613a84565b60405180910390f35b3480156109bf57600080fd5b506109c8611fe4565b005b3480156109d657600080fd5b506109df612018565b6040516109ec9190613928565b60405180910390f35b348015610a0157600080fd5b50610a1c6004803603810190610a179190613980565b6120a6565b604051610a299190613928565b60405180910390f35b348015610a3e57600080fd5b50610a596004803603810190610a549190613a35565b6122c8565b005b348015610a6757600080fd5b50610a826004803603810190610a7d9190613ce8565b612335565b604051610a8f9190613a84565b60405180910390f35b348015610aa457600080fd5b50610abf6004803603810190610aba9190614077565b61237e565b604051610acc9190613a84565b60405180910390f35b348015610ae157600080fd5b50610afc6004803603810190610af791906140a4565b6123c7565b604051610b09919061388e565b60405180910390f35b348015610b1e57600080fd5b50610b27612425565b604051610b34919061388e565b60405180910390f35b348015610b4957600080fd5b50610b52612438565b604051610b5f9190613a84565b60405180910390f35b348015610b7457600080fd5b50610b8f6004803603810190610b8a9190614104565b612442565b604051610b9c919061388e565b60405180910390f35b348015610bb157600080fd5b50610bba6124d6565b604051610bc79190613a84565b60405180910390f35b348015610bdc57600080fd5b50610be56124dc565b604051610bf2919061388e565b60405180910390f35b348015610c0757600080fd5b50610c226004803603810190610c1d9190613e9e565b6124ef565b005b348015610c3057600080fd5b50610c4b6004803603810190610c469190613ce8565b61250a565b005b348015610c5957600080fd5b50610c746004803603810190610c6f9190613ce8565b61258d565b604051610c819190613a84565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ce557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d155750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610d2b90614173565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5790614173565b8015610da45780601f10610d7957610100808354040283529160200191610da4565b820191906000526020600020905b815481529060010190602001808311610d8757829003601f168201915b5050505050905090565b6000610db9826125a5565b610def576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60148054610e3790614173565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6390614173565b8015610eb05780601f10610e8557610100808354040283529160200191610eb0565b820191906000526020600020905b815481529060010190602001808311610e9357829003601f168201915b505050505081565b6000610ec382612604565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f2a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f496126d0565b73ffffffffffffffffffffffffffffffffffffffff1614610fac57610f7581610f706126d0565b612442565b610fab576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006110686126d8565b6002546001540303905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116110f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ee90614216565b60405180910390fd5b600061110282611c4a565b905060008103611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e906142a8565b60405180910390fd5b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461119691906142f7565b9250508190555080600a60008282546111af91906142f7565b925050819055506111c082826126dd565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05682826040516111f192919061438a565b60405180910390a15050565b6112088383836127d1565b505050565b60185481565b60105481565b611221612b78565b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b6000600954905090565b61125f612b78565b601260029054906101000a900460ff1615601260026101000a81548160ff021916908315150217905550565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61132d83838360405180602001604052806000815250611ebc565b505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116113b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ab90614216565b60405180910390fd5b60006113c08383611f35565b905060008103611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc906142a8565b60405180910390fd5b80600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149191906142f7565b9250508190555080600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114e791906142f7565b925050819055506114f9838383612bf6565b8273ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a83836040516115419291906143b3565b60405180910390a2505050565b60006013549050601260019054906101000a900460ff166115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159b9061444e565b60405180910390fd5b6115af3384846123c7565b6115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e5906144ba565b60405180910390fd5b60115484601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461163c91906142f7565b111561167d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116749061454c565b60405180910390fd5b6103e88461168961105e565b61169391906142f7565b11156116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb906145b8565b60405180910390fd5b83816116e091906145d8565b341015611722576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117199061467e565b60405180910390fd5b83601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461177191906142f7565b925050819055506117828585612c7c565b5050505050565b60005b601c548110156117ba576117a76117a282611966565b611075565b80806117b29061469e565b91505061178c565b50565b601a6020528060005260406000206000915090505481565b60006117e082612604565b9050919050565b601680546117f490614173565b80601f016020809104026020016040519081016040528092919081815260200182805461182090614173565b801561186d5780601f106118425761010080835404028352916020019161186d565b820191906000526020600020905b81548152906001019060200180831161185057829003601f168201915b505050505081565b601260029054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118ef576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611948612b78565b6119526000612c9a565b565b61195c612b78565b8060188190555050565b6000600d828154811061197c5761197b6146e6565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546119e690614173565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1290614173565b8015611a5f5780601f10611a3457610100808354040283529160200191611a5f565b820191906000526020600020905b815481529060010190602001808311611a4257829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60175481565b611ac0612b78565b8060169081611acf91906148b7565b5050565b611adb6126d0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b3f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611b4c6126d0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bf96126d0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c3e919061388e565b60405180910390a35050565b600080611c55612438565b47611c6091906142f7565b9050611c758382611c7086611a69565b612d5e565b915050919050565b6000601754905060008103611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe906149d5565b60405180910390fd5b601260009054906101000a900460ff16611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d90614a41565b60405180910390fd5b61155a6103e8611d2691906142f7565b82611d2f61105e565b611d3991906142f7565b1115611d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d71906145b8565b60405180910390fd5b60105482601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dc891906142f7565b1115611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0090614ad3565b60405180910390fd5b8181611e1591906145d8565b341015611e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4e9061467e565b60405180910390fd5b81601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ea691906142f7565b92505081905550611eb78383612c7c565b505050565b611ec78484846127d1565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f2957611ef284848484612dcc565b611f28576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60135481565b600080611f418461237e565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f7a91906139ee565b602060405180830381865afa158015611f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fbb9190614b08565b611fc591906142f7565b9050611fdb8382611fd6878761128b565b612d5e565b91505092915050565b611fec612b78565b601260019054906101000a900460ff1615601260016101000a81548160ff021916908315150217905550565b6015805461202590614173565b80601f016020809104026020016040519081016040528092919081815260200182805461205190614173565b801561209e5780601f106120735761010080835404028352916020019161209e565b820191906000526020600020905b81548152906001019060200180831161208157829003601f168201915b505050505081565b60606120b1826125a5565b6120f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e790614ba7565b60405180910390fd5b60001515601260029054906101000a900460ff1615150361219d576014805461211890614173565b80601f016020809104026020016040519081016040528092919081815260200182805461214490614173565b80156121915780601f1061216657610100808354040283529160200191612191565b820191906000526020600020905b81548152906001019060200180831161217457829003601f168201915b505050505090506122c3565b6000601b600084815260200190815260200160002080546121bd90614173565b80601f01602080910402602001604051908101604052809291908181526020018280546121e990614173565b80156122365780601f1061220b57610100808354040283529160200191612236565b820191906000526020600020905b81548152906001019060200180831161221957829003601f168201915b505050505090506000612247612f1c565b9050600081510361225c5781925050506122c3565b600082511115612291578082604051602001612279929190614c03565b604051602081830303815290604052925050506122c3565b8061229b85612fae565b60156040516020016122af93929190614caa565b604051602081830303815290604052925050505b919050565b6122d0612b78565b611a0a816122dc61105e565b6122e691906142f7565b1115612327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231e90614d27565b60405180910390fd5b6123318282612c7c565b5050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061241c6123d58561310e565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061313e565b90509392505050565b601260019054906101000a900460ff1681565b6000600a54905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60115481565b601260009054906101000a900460ff1681565b6124f7612b78565b806014908161250691906148b7565b5050565b612512612b78565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257890614db9565b60405180910390fd5b61258a81612c9a565b50565b60196020528060005260406000206000915090505481565b6000816125b06126d8565b111580156125bf575060015482105b80156125fd575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600080829050806126136126d8565b11612699576001548110156126985760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612696575b6000810361268c576005600083600190039350838152602001908152602001600020549050612662565b80925050506126cb565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b80471015612720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271790614e25565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161274690614e76565b60006040518083038185875af1925050503d8060008114612783576040519150601f19603f3d011682016040523d82523d6000602084013e612788565b606091505b50509050806127cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c390614efd565b60405180910390fd5b505050565b60006127dc82612604565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612843576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166128646126d0565b73ffffffffffffffffffffffffffffffffffffffff16148061289357506128928561288d6126d0565b612442565b5b806128d857506128a16126d0565b73ffffffffffffffffffffffffffffffffffffffff166128c084610dae565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612911576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612977576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129848585856001613155565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612a818661315b565b1717600560008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603612b095760006001840190506000600560008381526020019081526020016000205403612b07576001548114612b06578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b718585856001613165565b5050505050565b612b8061316b565b73ffffffffffffffffffffffffffffffffffffffff16612b9e6119ae565b73ffffffffffffffffffffffffffffffffffffffff1614612bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612beb90614f69565b60405180910390fd5b565b612c778363a9059cbb60e01b8484604051602401612c159291906143b3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613173565b505050565b612c9682826040518060200160405280600081525061323a565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600954600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485612daf91906145d8565b612db99190614fb8565b612dc39190614fe9565b90509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df26126d0565b8786866040518563ffffffff1660e01b8152600401612e149493929190615072565b6020604051808303816000875af1925050508015612e5057506040513d601f19601f82011682018060405250810190612e4d91906150d3565b60015b612ec9573d8060008114612e80576040519150601f19603f3d011682016040523d82523d6000602084013e612e85565b606091505b506000815103612ec1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060168054612f2b90614173565b80601f0160208091040260200160405190810160405280929190818152602001828054612f5790614173565b8015612fa45780601f10612f7957610100808354040283529160200191612fa4565b820191906000526020600020905b815481529060010190602001808311612f8757829003601f168201915b5050505050905090565b606060008203612ff5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613109565b600082905060005b600082146130275780806130109061469e565b915050600a826130209190614fb8565b9150612ffd565b60008167ffffffffffffffff81111561304357613042613d73565b5b6040519080825280601f01601f1916602001820160405280156130755781602001600182028036833780820191505090505b5090505b600085146131025760018261308e9190614fe9565b9150600a8561309d9190615100565b60306130a991906142f7565b60f81b8183815181106130bf576130be6146e6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130fb9190614fb8565b9450613079565b8093505050505b919050565b6000816040516020016131219190615179565b604051602081830303815290604052805190602001209050919050565b600061314d82601854856134ee565b905092915050565b50505050565b6000819050919050565b50505050565b600033905090565b60006131d5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135059092919063ffffffff16565b905060008151111561323557808060200190518101906131f591906151a9565b613234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322b90615248565b60405180910390fd5b5b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036132a7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036132e1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132ee6000858386613155565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16133536001851461351d565b901b60a042901b6133638661315b565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14613467575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134176000878480600101955087612dcc565b61344d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106133a857826001541461346257600080fd5b6134d2565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613468575b8160018190555050506134e86000858386613165565b50505050565b6000826134fb8584613527565b1490509392505050565b6060613514848460008561357d565b90509392505050565b6000819050919050565b60008082905060005b84518110156135725761355d828683815181106135505761354f6146e6565b5b6020026020010151613691565b9150808061356a9061469e565b915050613530565b508091505092915050565b6060824710156135c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b9906152da565b60405180910390fd5b6135cb856136bc565b61360a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360190615346565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516136339190615397565b60006040518083038185875af1925050503d8060008114613670576040519150601f19603f3d011682016040523d82523d6000602084013e613675565b606091505b50915091506136858282866136df565b92505050949350505050565b60008183106136a9576136a48284613746565b6136b4565b6136b38383613746565b5b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156136ef5782905061373f565b6000835111156137025782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137369190613928565b60405180910390fd5b9392505050565b600082600052816020526040600020905092915050565b600082825260208201905092915050565b7f4f6e6c7920696620796f75206d696e7400000000000000000000000000000000600082015250565b60006137a460108361375d565b91506137af8261376e565b602082019050919050565b600060208201905081810360008301526137d381613797565b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613823816137ee565b811461382e57600080fd5b50565b6000813590506138408161381a565b92915050565b60006020828403121561385c5761385b6137e4565b5b600061386a84828501613831565b91505092915050565b60008115159050919050565b61388881613873565b82525050565b60006020820190506138a3600083018461387f565b92915050565b600081519050919050565b60005b838110156138d25780820151818401526020810190506138b7565b60008484015250505050565b6000601f19601f8301169050919050565b60006138fa826138a9565b613904818561375d565b93506139148185602086016138b4565b61391d816138de565b840191505092915050565b6000602082019050818103600083015261394281846138ef565b905092915050565b6000819050919050565b61395d8161394a565b811461396857600080fd5b50565b60008135905061397a81613954565b92915050565b600060208284031215613996576139956137e4565b5b60006139a48482850161396b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139d8826139ad565b9050919050565b6139e8816139cd565b82525050565b6000602082019050613a0360008301846139df565b92915050565b613a12816139cd565b8114613a1d57600080fd5b50565b600081359050613a2f81613a09565b92915050565b60008060408385031215613a4c57613a4b6137e4565b5b6000613a5a85828601613a20565b9250506020613a6b8582860161396b565b9150509250929050565b613a7e8161394a565b82525050565b6000602082019050613a996000830184613a75565b92915050565b6000613aaa826139ad565b9050919050565b613aba81613a9f565b8114613ac557600080fd5b50565b600081359050613ad781613ab1565b92915050565b600060208284031215613af357613af26137e4565b5b6000613b0184828501613ac8565b91505092915050565b600080600060608486031215613b2357613b226137e4565b5b6000613b3186828701613a20565b9350506020613b4286828701613a20565b9250506040613b538682870161396b565b9150509250925092565b6000819050919050565b613b7081613b5d565b82525050565b6000602082019050613b8b6000830184613b67565b92915050565b6000613b9c826139cd565b9050919050565b613bac81613b91565b8114613bb757600080fd5b50565b600081359050613bc981613ba3565b92915050565b60008060408385031215613be657613be56137e4565b5b6000613bf485828601613bba565b9250506020613c0585828601613a20565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c3457613c33613c0f565b5b8235905067ffffffffffffffff811115613c5157613c50613c14565b5b602083019150836020820283011115613c6d57613c6c613c19565b5b9250929050565b60008060008060608587031215613c8e57613c8d6137e4565b5b6000613c9c87828801613a20565b9450506020613cad8782880161396b565b935050604085013567ffffffffffffffff811115613cce57613ccd6137e9565b5b613cda87828801613c1e565b925092505092959194509250565b600060208284031215613cfe57613cfd6137e4565b5b6000613d0c84828501613a20565b91505092915050565b613d1e81613b5d565b8114613d2957600080fd5b50565b600081359050613d3b81613d15565b92915050565b600060208284031215613d5757613d566137e4565b5b6000613d6584828501613d2c565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613dab826138de565b810181811067ffffffffffffffff82111715613dca57613dc9613d73565b5b80604052505050565b6000613ddd6137da565b9050613de98282613da2565b919050565b600067ffffffffffffffff821115613e0957613e08613d73565b5b613e12826138de565b9050602081019050919050565b82818337600083830152505050565b6000613e41613e3c84613dee565b613dd3565b905082815260208101848484011115613e5d57613e5c613d6e565b5b613e68848285613e1f565b509392505050565b600082601f830112613e8557613e84613c0f565b5b8135613e95848260208601613e2e565b91505092915050565b600060208284031215613eb457613eb36137e4565b5b600082013567ffffffffffffffff811115613ed257613ed16137e9565b5b613ede84828501613e70565b91505092915050565b613ef081613873565b8114613efb57600080fd5b50565b600081359050613f0d81613ee7565b92915050565b60008060408385031215613f2a57613f296137e4565b5b6000613f3885828601613a20565b9250506020613f4985828601613efe565b9150509250929050565b600067ffffffffffffffff821115613f6e57613f6d613d73565b5b613f77826138de565b9050602081019050919050565b6000613f97613f9284613f53565b613dd3565b905082815260208101848484011115613fb357613fb2613d6e565b5b613fbe848285613e1f565b509392505050565b600082601f830112613fdb57613fda613c0f565b5b8135613feb848260208601613f84565b91505092915050565b6000806000806080858703121561400e5761400d6137e4565b5b600061401c87828801613a20565b945050602061402d87828801613a20565b935050604061403e8782880161396b565b925050606085013567ffffffffffffffff81111561405f5761405e6137e9565b5b61406b87828801613fc6565b91505092959194509250565b60006020828403121561408d5761408c6137e4565b5b600061409b84828501613bba565b91505092915050565b6000806000604084860312156140bd576140bc6137e4565b5b60006140cb86828701613a20565b935050602084013567ffffffffffffffff8111156140ec576140eb6137e9565b5b6140f886828701613c1e565b92509250509250925092565b6000806040838503121561411b5761411a6137e4565b5b600061412985828601613a20565b925050602061413a85828601613a20565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061418b57607f821691505b60208210810361419e5761419d614144565b5b50919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b600061420060268361375d565b915061420b826141a4565b604082019050919050565b6000602082019050818103600083015261422f816141f3565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614292602b8361375d565b915061429d82614236565b604082019050919050565b600060208201905081810360008301526142c181614285565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006143028261394a565b915061430d8361394a565b9250828201905080821115614325576143246142c8565b5b92915050565b6000819050919050565b600061435061434b614346846139ad565b61432b565b6139ad565b9050919050565b600061436282614335565b9050919050565b600061437482614357565b9050919050565b61438481614369565b82525050565b600060408201905061439f600083018561437b565b6143ac6020830184613a75565b9392505050565b60006040820190506143c860008301856139df565b6143d56020830184613a75565b9392505050565b7f57686974656c6973742053616c6520686173206e6f742061637469766174656460008201527f2079657400000000000000000000000000000000000000000000000000000000602082015250565b600061443860248361375d565b9150614443826143dc565b604082019050919050565b600060208201905081810360008301526144678161442b565b9050919050565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b60006144a4600f8361375d565b91506144af8261446e565b602082019050919050565b600060208201905081810360008301526144d381614497565b9050919050565b7f596f752063616e206f6e6c79206765742031204e4654206f6e2074686520576860008201527f6974656c6973742053616c650000000000000000000000000000000000000000602082015250565b6000614536602c8361375d565b9150614541826144da565b604082019050919050565b6000602082019050818103600083015261456581614529565b9050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b60006145a260138361375d565b91506145ad8261456c565b602082019050919050565b600060208201905081810360008301526145d181614595565b9050919050565b60006145e38261394a565b91506145ee8361394a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614627576146266142c8565b5b828202905092915050565b7f4e6f7420656e6f756768742066756e6473000000000000000000000000000000600082015250565b600061466860118361375d565b915061467382614632565b602082019050919050565b600060208201905081810360008301526146978161465b565b9050919050565b60006146a98261394a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146db576146da6142c8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026147777fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261473a565b614781868361473a565b95508019841693508086168417925050509392505050565b60006147b46147af6147aa8461394a565b61432b565b61394a565b9050919050565b6000819050919050565b6147ce83614799565b6147e26147da826147bb565b848454614747565b825550505050565b600090565b6147f76147ea565b6148028184846147c5565b505050565b5b818110156148265761481b6000826147ef565b600181019050614808565b5050565b601f82111561486b5761483c81614715565b6148458461472a565b81016020851015614854578190505b6148686148608561472a565b830182614807565b50505b505050565b600082821c905092915050565b600061488e60001984600802614870565b1980831691505092915050565b60006148a7838361487d565b9150826002028217905092915050565b6148c0826138a9565b67ffffffffffffffff8111156148d9576148d8613d73565b5b6148e38254614173565b6148ee82828561482a565b600060209050601f831160018114614921576000841561490f578287015190505b614919858261489b565b865550614981565b601f19841661492f86614715565b60005b8281101561495757848901518255600182019150602085019450602081019050614932565b868310156149745784890151614970601f89168261487d565b8355505b6001600288020188555050505b505050505050565b7f5072696365206973203000000000000000000000000000000000000000000000600082015250565b60006149bf600a8361375d565b91506149ca82614989565b602082019050919050565b600060208201905081810360008301526149ee816149b2565b9050919050565b7f5075626c69632073616c65206973206e6f742061637469766174656400000000600082015250565b6000614a2b601c8361375d565b9150614a36826149f5565b602082019050919050565b60006020820190508181036000830152614a5a81614a1e565b9050919050565b7f596f752063616e206f6e6c7920676574203130204e4654206f6e20746865205060008201527f75626c69632053616c6500000000000000000000000000000000000000000000602082015250565b6000614abd602a8361375d565b9150614ac882614a61565b604082019050919050565b60006020820190508181036000830152614aec81614ab0565b9050919050565b600081519050614b0281613954565b92915050565b600060208284031215614b1e57614b1d6137e4565b5b6000614b2c84828501614af3565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614b91602f8361375d565b9150614b9c82614b35565b604082019050919050565b60006020820190508181036000830152614bc081614b84565b9050919050565b600081905092915050565b6000614bdd826138a9565b614be78185614bc7565b9350614bf78185602086016138b4565b80840191505092915050565b6000614c0f8285614bd2565b9150614c1b8284614bd2565b91508190509392505050565b60008154614c3481614173565b614c3e8186614bc7565b94506001821660008114614c595760018114614c6e57614ca1565b60ff1983168652811515820286019350614ca1565b614c7785614715565b60005b83811015614c9957815481890152600182019150602081019050614c7a565b838801955050505b50505092915050565b6000614cb68286614bd2565b9150614cc28285614bd2565b9150614cce8284614c27565b9150819050949350505050565b7f52656163686564206d617820537570706c790000000000000000000000000000600082015250565b6000614d1160128361375d565b9150614d1c82614cdb565b602082019050919050565b60006020820190508181036000830152614d4081614d04565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614da360268361375d565b9150614dae82614d47565b604082019050919050565b60006020820190508181036000830152614dd281614d96565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614e0f601d8361375d565b9150614e1a82614dd9565b602082019050919050565b60006020820190508181036000830152614e3e81614e02565b9050919050565b600081905092915050565b50565b6000614e60600083614e45565b9150614e6b82614e50565b600082019050919050565b6000614e8182614e53565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614ee7603a8361375d565b9150614ef282614e8b565b604082019050919050565b60006020820190508181036000830152614f1681614eda565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614f5360208361375d565b9150614f5e82614f1d565b602082019050919050565b60006020820190508181036000830152614f8281614f46565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614fc38261394a565b9150614fce8361394a565b925082614fde57614fdd614f89565b5b828204905092915050565b6000614ff48261394a565b9150614fff8361394a565b9250828203905081811115615017576150166142c8565b5b92915050565b600081519050919050565b600082825260208201905092915050565b60006150448261501d565b61504e8185615028565b935061505e8185602086016138b4565b615067816138de565b840191505092915050565b600060808201905061508760008301876139df565b61509460208301866139df565b6150a16040830185613a75565b81810360608301526150b38184615039565b905095945050505050565b6000815190506150cd8161381a565b92915050565b6000602082840312156150e9576150e86137e4565b5b60006150f7848285016150be565b91505092915050565b600061510b8261394a565b91506151168361394a565b92508261512657615125614f89565b5b828206905092915050565b60008160601b9050919050565b600061514982615131565b9050919050565b600061515b8261513e565b9050919050565b61517361516e826139cd565b615150565b82525050565b60006151858284615162565b60148201915081905092915050565b6000815190506151a381613ee7565b92915050565b6000602082840312156151bf576151be6137e4565b5b60006151cd84828501615194565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615232602a8361375d565b915061523d826151d6565b604082019050919050565b6000602082019050818103600083015261526181615225565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006152c460268361375d565b91506152cf82615268565b604082019050919050565b600060208201905081810360008301526152f3816152b7565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615330601d8361375d565b915061533b826152fa565b602082019050919050565b6000602082019050818103600083015261535f81615323565b9050919050565b60006153718261501d565b61537b8185614e45565b935061538b8185602086016138b4565b80840191505092915050565b60006153a38284615366565b91508190509291505056fea26469706673582212208fac62ed9c1de6f14fe302caf2f737941e1cbc18354480e15a5f0d52f973fa4664736f6c6343000810003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012054ce083110ae346d6c9312c62a393b3355f5a87551d3cfc13a799be77e8c31d500000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000826cb749cbc23e7b3415dd8a08181dbf9afef84d0000000000000000000000007309810d1933919f59060b59d6c630b8194e74f20000000000000000000000005a0a057db1340d8051d7bc056de9d86f2904047b00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d4e617a66797a4c70384a3363424e4631347a75427761585564636b5350463562374631424b7a423867394b522f000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5437397739575834474c4835437643666957715264565261697631387970456a7471596561416a33767964480000000000000000000000

Deployed Bytecode

0x6080604052600436106103035760003560e01c80638da5cb5b11610190578063c87b56dd116100dc578063e33b7de311610095578063eb8d24441161006f578063eb8d244414610bd0578063f2c4ce1e14610bfb578063f2fde38b14610c24578063f47ee42114610c4d57610343565b8063e33b7de314610b3d578063e985e9c514610b68578063e9f514f214610ba557610343565b8063c87b56dd146109f5578063cbce4c9714610a32578063ce7c2ac214610a5b578063d79779b214610a98578063d86697ee14610ad5578063d979fa9c14610b1257610343565b8063a3f8eace11610149578063bec88e2811610123578063bec88e281461094b578063c45ac05014610976578063c5027fa5146109b3578063c6682862146109ca57610343565b8063a3f8eace146108c9578063ac5ae11b14610906578063b88d4fde1461092257610343565b80638da5cb5b146107b957806395d89b41146107e45780639852595c1461080f5780639b6860c81461084c578063a0bcfc7f14610877578063a22cb465146108a057610343565b8063406072a91161024f5780636352211e1161020857806370a08231116101e257806370a08231146106ff578063715018a61461073c5780637cb64759146107535780638b83209b1461077c57610343565b80636352211e1461066c5780636c0360eb146106a95780636ebeac85146106d457610343565b8063406072a91461056d57806342842e0e146105aa57806348b75044146105d35780634b11faaf146105fc5780635be7fde81461061857806361bdac321461062f57610343565b806319165587116102bc57806333fdc4271161029657806333fdc427146104e957806334918dfd146105145780633a98ef391461052b5780633b84d9c61461055657610343565b8063191655871461046c57806323b872dd146104955780632eb4a7ab146104be57610343565b806301ffc9a71461034857806306fdde0314610385578063081812fc146103b0578063081c8c44146103ed578063095ea7b31461041857806318160ddd1461044157610343565b36610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a906137ba565b60405180910390fd5b600080fd5b34801561035457600080fd5b5061036f600480360381019061036a9190613846565b610c8a565b60405161037c919061388e565b60405180910390f35b34801561039157600080fd5b5061039a610d1c565b6040516103a79190613928565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d29190613980565b610dae565b6040516103e491906139ee565b60405180910390f35b3480156103f957600080fd5b50610402610e2a565b60405161040f9190613928565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613a35565b610eb8565b005b34801561044d57600080fd5b5061045661105e565b6040516104639190613a84565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e9190613add565b611075565b005b3480156104a157600080fd5b506104bc60048036038101906104b79190613b0a565b6111fd565b005b3480156104ca57600080fd5b506104d361120d565b6040516104e09190613b76565b60405180910390f35b3480156104f557600080fd5b506104fe611213565b60405161050b9190613a84565b60405180910390f35b34801561052057600080fd5b50610529611219565b005b34801561053757600080fd5b5061054061124d565b60405161054d9190613a84565b60405180910390f35b34801561056257600080fd5b5061056b611257565b005b34801561057957600080fd5b50610594600480360381019061058f9190613bcf565b61128b565b6040516105a19190613a84565b60405180910390f35b3480156105b657600080fd5b506105d160048036038101906105cc9190613b0a565b611312565b005b3480156105df57600080fd5b506105fa60048036038101906105f59190613bcf565b611332565b005b61061660048036038101906106119190613c74565b61154e565b005b34801561062457600080fd5b5061062d611789565b005b34801561063b57600080fd5b5061065660048036038101906106519190613ce8565b6117bd565b6040516106639190613a84565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190613980565b6117d5565b6040516106a091906139ee565b60405180910390f35b3480156106b557600080fd5b506106be6117e7565b6040516106cb9190613928565b60405180910390f35b3480156106e057600080fd5b506106e9611875565b6040516106f6919061388e565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190613ce8565b611888565b6040516107339190613a84565b60405180910390f35b34801561074857600080fd5b50610751611940565b005b34801561075f57600080fd5b5061077a60048036038101906107759190613d41565b611954565b005b34801561078857600080fd5b506107a3600480360381019061079e9190613980565b611966565b6040516107b091906139ee565b60405180910390f35b3480156107c557600080fd5b506107ce6119ae565b6040516107db91906139ee565b60405180910390f35b3480156107f057600080fd5b506107f96119d7565b6040516108069190613928565b60405180910390f35b34801561081b57600080fd5b5061083660048036038101906108319190613ce8565b611a69565b6040516108439190613a84565b60405180910390f35b34801561085857600080fd5b50610861611ab2565b60405161086e9190613a84565b60405180910390f35b34801561088357600080fd5b5061089e60048036038101906108999190613e9e565b611ab8565b005b3480156108ac57600080fd5b506108c760048036038101906108c29190613f13565b611ad3565b005b3480156108d557600080fd5b506108f060048036038101906108eb9190613ce8565b611c4a565b6040516108fd9190613a84565b60405180910390f35b610920600480360381019061091b9190613a35565b611c7d565b005b34801561092e57600080fd5b5061094960048036038101906109449190613ff4565b611ebc565b005b34801561095757600080fd5b50610960611f2f565b60405161096d9190613a84565b60405180910390f35b34801561098257600080fd5b5061099d60048036038101906109989190613bcf565b611f35565b6040516109aa9190613a84565b60405180910390f35b3480156109bf57600080fd5b506109c8611fe4565b005b3480156109d657600080fd5b506109df612018565b6040516109ec9190613928565b60405180910390f35b348015610a0157600080fd5b50610a1c6004803603810190610a179190613980565b6120a6565b604051610a299190613928565b60405180910390f35b348015610a3e57600080fd5b50610a596004803603810190610a549190613a35565b6122c8565b005b348015610a6757600080fd5b50610a826004803603810190610a7d9190613ce8565b612335565b604051610a8f9190613a84565b60405180910390f35b348015610aa457600080fd5b50610abf6004803603810190610aba9190614077565b61237e565b604051610acc9190613a84565b60405180910390f35b348015610ae157600080fd5b50610afc6004803603810190610af791906140a4565b6123c7565b604051610b09919061388e565b60405180910390f35b348015610b1e57600080fd5b50610b27612425565b604051610b34919061388e565b60405180910390f35b348015610b4957600080fd5b50610b52612438565b604051610b5f9190613a84565b60405180910390f35b348015610b7457600080fd5b50610b8f6004803603810190610b8a9190614104565b612442565b604051610b9c919061388e565b60405180910390f35b348015610bb157600080fd5b50610bba6124d6565b604051610bc79190613a84565b60405180910390f35b348015610bdc57600080fd5b50610be56124dc565b604051610bf2919061388e565b60405180910390f35b348015610c0757600080fd5b50610c226004803603810190610c1d9190613e9e565b6124ef565b005b348015610c3057600080fd5b50610c4b6004803603810190610c469190613ce8565b61250a565b005b348015610c5957600080fd5b50610c746004803603810190610c6f9190613ce8565b61258d565b604051610c819190613a84565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ce557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d155750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610d2b90614173565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5790614173565b8015610da45780601f10610d7957610100808354040283529160200191610da4565b820191906000526020600020905b815481529060010190602001808311610d8757829003601f168201915b5050505050905090565b6000610db9826125a5565b610def576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60148054610e3790614173565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6390614173565b8015610eb05780601f10610e8557610100808354040283529160200191610eb0565b820191906000526020600020905b815481529060010190602001808311610e9357829003601f168201915b505050505081565b6000610ec382612604565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f2a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f496126d0565b73ffffffffffffffffffffffffffffffffffffffff1614610fac57610f7581610f706126d0565b612442565b610fab576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006110686126d8565b6002546001540303905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116110f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ee90614216565b60405180910390fd5b600061110282611c4a565b905060008103611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e906142a8565b60405180910390fd5b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461119691906142f7565b9250508190555080600a60008282546111af91906142f7565b925050819055506111c082826126dd565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05682826040516111f192919061438a565b60405180910390a15050565b6112088383836127d1565b505050565b60185481565b60105481565b611221612b78565b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b6000600954905090565b61125f612b78565b601260029054906101000a900460ff1615601260026101000a81548160ff021916908315150217905550565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61132d83838360405180602001604052806000815250611ebc565b505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116113b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ab90614216565b60405180910390fd5b60006113c08383611f35565b905060008103611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc906142a8565b60405180910390fd5b80600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149191906142f7565b9250508190555080600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114e791906142f7565b925050819055506114f9838383612bf6565b8273ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a83836040516115419291906143b3565b60405180910390a2505050565b60006013549050601260019054906101000a900460ff166115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159b9061444e565b60405180910390fd5b6115af3384846123c7565b6115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e5906144ba565b60405180910390fd5b60115484601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461163c91906142f7565b111561167d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116749061454c565b60405180910390fd5b6103e88461168961105e565b61169391906142f7565b11156116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb906145b8565b60405180910390fd5b83816116e091906145d8565b341015611722576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117199061467e565b60405180910390fd5b83601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461177191906142f7565b925050819055506117828585612c7c565b5050505050565b60005b601c548110156117ba576117a76117a282611966565b611075565b80806117b29061469e565b91505061178c565b50565b601a6020528060005260406000206000915090505481565b60006117e082612604565b9050919050565b601680546117f490614173565b80601f016020809104026020016040519081016040528092919081815260200182805461182090614173565b801561186d5780601f106118425761010080835404028352916020019161186d565b820191906000526020600020905b81548152906001019060200180831161185057829003601f168201915b505050505081565b601260029054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118ef576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611948612b78565b6119526000612c9a565b565b61195c612b78565b8060188190555050565b6000600d828154811061197c5761197b6146e6565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546119e690614173565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1290614173565b8015611a5f5780601f10611a3457610100808354040283529160200191611a5f565b820191906000526020600020905b815481529060010190602001808311611a4257829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60175481565b611ac0612b78565b8060169081611acf91906148b7565b5050565b611adb6126d0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b3f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611b4c6126d0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bf96126d0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c3e919061388e565b60405180910390a35050565b600080611c55612438565b47611c6091906142f7565b9050611c758382611c7086611a69565b612d5e565b915050919050565b6000601754905060008103611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe906149d5565b60405180910390fd5b601260009054906101000a900460ff16611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d90614a41565b60405180910390fd5b61155a6103e8611d2691906142f7565b82611d2f61105e565b611d3991906142f7565b1115611d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d71906145b8565b60405180910390fd5b60105482601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dc891906142f7565b1115611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0090614ad3565b60405180910390fd5b8181611e1591906145d8565b341015611e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4e9061467e565b60405180910390fd5b81601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ea691906142f7565b92505081905550611eb78383612c7c565b505050565b611ec78484846127d1565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f2957611ef284848484612dcc565b611f28576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60135481565b600080611f418461237e565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f7a91906139ee565b602060405180830381865afa158015611f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fbb9190614b08565b611fc591906142f7565b9050611fdb8382611fd6878761128b565b612d5e565b91505092915050565b611fec612b78565b601260019054906101000a900460ff1615601260016101000a81548160ff021916908315150217905550565b6015805461202590614173565b80601f016020809104026020016040519081016040528092919081815260200182805461205190614173565b801561209e5780601f106120735761010080835404028352916020019161209e565b820191906000526020600020905b81548152906001019060200180831161208157829003601f168201915b505050505081565b60606120b1826125a5565b6120f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e790614ba7565b60405180910390fd5b60001515601260029054906101000a900460ff1615150361219d576014805461211890614173565b80601f016020809104026020016040519081016040528092919081815260200182805461214490614173565b80156121915780601f1061216657610100808354040283529160200191612191565b820191906000526020600020905b81548152906001019060200180831161217457829003601f168201915b505050505090506122c3565b6000601b600084815260200190815260200160002080546121bd90614173565b80601f01602080910402602001604051908101604052809291908181526020018280546121e990614173565b80156122365780601f1061220b57610100808354040283529160200191612236565b820191906000526020600020905b81548152906001019060200180831161221957829003601f168201915b505050505090506000612247612f1c565b9050600081510361225c5781925050506122c3565b600082511115612291578082604051602001612279929190614c03565b604051602081830303815290604052925050506122c3565b8061229b85612fae565b60156040516020016122af93929190614caa565b604051602081830303815290604052925050505b919050565b6122d0612b78565b611a0a816122dc61105e565b6122e691906142f7565b1115612327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231e90614d27565b60405180910390fd5b6123318282612c7c565b5050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061241c6123d58561310e565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061313e565b90509392505050565b601260019054906101000a900460ff1681565b6000600a54905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60115481565b601260009054906101000a900460ff1681565b6124f7612b78565b806014908161250691906148b7565b5050565b612512612b78565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257890614db9565b60405180910390fd5b61258a81612c9a565b50565b60196020528060005260406000206000915090505481565b6000816125b06126d8565b111580156125bf575060015482105b80156125fd575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600080829050806126136126d8565b11612699576001548110156126985760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612696575b6000810361268c576005600083600190039350838152602001908152602001600020549050612662565b80925050506126cb565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b80471015612720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271790614e25565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161274690614e76565b60006040518083038185875af1925050503d8060008114612783576040519150601f19603f3d011682016040523d82523d6000602084013e612788565b606091505b50509050806127cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c390614efd565b60405180910390fd5b505050565b60006127dc82612604565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612843576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166128646126d0565b73ffffffffffffffffffffffffffffffffffffffff16148061289357506128928561288d6126d0565b612442565b5b806128d857506128a16126d0565b73ffffffffffffffffffffffffffffffffffffffff166128c084610dae565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612911576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612977576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129848585856001613155565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612a818661315b565b1717600560008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603612b095760006001840190506000600560008381526020019081526020016000205403612b07576001548114612b06578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b718585856001613165565b5050505050565b612b8061316b565b73ffffffffffffffffffffffffffffffffffffffff16612b9e6119ae565b73ffffffffffffffffffffffffffffffffffffffff1614612bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612beb90614f69565b60405180910390fd5b565b612c778363a9059cbb60e01b8484604051602401612c159291906143b3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613173565b505050565b612c9682826040518060200160405280600081525061323a565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600954600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485612daf91906145d8565b612db99190614fb8565b612dc39190614fe9565b90509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df26126d0565b8786866040518563ffffffff1660e01b8152600401612e149493929190615072565b6020604051808303816000875af1925050508015612e5057506040513d601f19601f82011682018060405250810190612e4d91906150d3565b60015b612ec9573d8060008114612e80576040519150601f19603f3d011682016040523d82523d6000602084013e612e85565b606091505b506000815103612ec1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060168054612f2b90614173565b80601f0160208091040260200160405190810160405280929190818152602001828054612f5790614173565b8015612fa45780601f10612f7957610100808354040283529160200191612fa4565b820191906000526020600020905b815481529060010190602001808311612f8757829003601f168201915b5050505050905090565b606060008203612ff5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613109565b600082905060005b600082146130275780806130109061469e565b915050600a826130209190614fb8565b9150612ffd565b60008167ffffffffffffffff81111561304357613042613d73565b5b6040519080825280601f01601f1916602001820160405280156130755781602001600182028036833780820191505090505b5090505b600085146131025760018261308e9190614fe9565b9150600a8561309d9190615100565b60306130a991906142f7565b60f81b8183815181106130bf576130be6146e6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130fb9190614fb8565b9450613079565b8093505050505b919050565b6000816040516020016131219190615179565b604051602081830303815290604052805190602001209050919050565b600061314d82601854856134ee565b905092915050565b50505050565b6000819050919050565b50505050565b600033905090565b60006131d5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135059092919063ffffffff16565b905060008151111561323557808060200190518101906131f591906151a9565b613234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322b90615248565b60405180910390fd5b5b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036132a7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036132e1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132ee6000858386613155565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16133536001851461351d565b901b60a042901b6133638661315b565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14613467575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134176000878480600101955087612dcc565b61344d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106133a857826001541461346257600080fd5b6134d2565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613468575b8160018190555050506134e86000858386613165565b50505050565b6000826134fb8584613527565b1490509392505050565b6060613514848460008561357d565b90509392505050565b6000819050919050565b60008082905060005b84518110156135725761355d828683815181106135505761354f6146e6565b5b6020026020010151613691565b9150808061356a9061469e565b915050613530565b508091505092915050565b6060824710156135c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b9906152da565b60405180910390fd5b6135cb856136bc565b61360a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360190615346565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516136339190615397565b60006040518083038185875af1925050503d8060008114613670576040519150601f19603f3d011682016040523d82523d6000602084013e613675565b606091505b50915091506136858282866136df565b92505050949350505050565b60008183106136a9576136a48284613746565b6136b4565b6136b38383613746565b5b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156136ef5782905061373f565b6000835111156137025782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137369190613928565b60405180910390fd5b9392505050565b600082600052816020526040600020905092915050565b600082825260208201905092915050565b7f4f6e6c7920696620796f75206d696e7400000000000000000000000000000000600082015250565b60006137a460108361375d565b91506137af8261376e565b602082019050919050565b600060208201905081810360008301526137d381613797565b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613823816137ee565b811461382e57600080fd5b50565b6000813590506138408161381a565b92915050565b60006020828403121561385c5761385b6137e4565b5b600061386a84828501613831565b91505092915050565b60008115159050919050565b61388881613873565b82525050565b60006020820190506138a3600083018461387f565b92915050565b600081519050919050565b60005b838110156138d25780820151818401526020810190506138b7565b60008484015250505050565b6000601f19601f8301169050919050565b60006138fa826138a9565b613904818561375d565b93506139148185602086016138b4565b61391d816138de565b840191505092915050565b6000602082019050818103600083015261394281846138ef565b905092915050565b6000819050919050565b61395d8161394a565b811461396857600080fd5b50565b60008135905061397a81613954565b92915050565b600060208284031215613996576139956137e4565b5b60006139a48482850161396b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139d8826139ad565b9050919050565b6139e8816139cd565b82525050565b6000602082019050613a0360008301846139df565b92915050565b613a12816139cd565b8114613a1d57600080fd5b50565b600081359050613a2f81613a09565b92915050565b60008060408385031215613a4c57613a4b6137e4565b5b6000613a5a85828601613a20565b9250506020613a6b8582860161396b565b9150509250929050565b613a7e8161394a565b82525050565b6000602082019050613a996000830184613a75565b92915050565b6000613aaa826139ad565b9050919050565b613aba81613a9f565b8114613ac557600080fd5b50565b600081359050613ad781613ab1565b92915050565b600060208284031215613af357613af26137e4565b5b6000613b0184828501613ac8565b91505092915050565b600080600060608486031215613b2357613b226137e4565b5b6000613b3186828701613a20565b9350506020613b4286828701613a20565b9250506040613b538682870161396b565b9150509250925092565b6000819050919050565b613b7081613b5d565b82525050565b6000602082019050613b8b6000830184613b67565b92915050565b6000613b9c826139cd565b9050919050565b613bac81613b91565b8114613bb757600080fd5b50565b600081359050613bc981613ba3565b92915050565b60008060408385031215613be657613be56137e4565b5b6000613bf485828601613bba565b9250506020613c0585828601613a20565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c3457613c33613c0f565b5b8235905067ffffffffffffffff811115613c5157613c50613c14565b5b602083019150836020820283011115613c6d57613c6c613c19565b5b9250929050565b60008060008060608587031215613c8e57613c8d6137e4565b5b6000613c9c87828801613a20565b9450506020613cad8782880161396b565b935050604085013567ffffffffffffffff811115613cce57613ccd6137e9565b5b613cda87828801613c1e565b925092505092959194509250565b600060208284031215613cfe57613cfd6137e4565b5b6000613d0c84828501613a20565b91505092915050565b613d1e81613b5d565b8114613d2957600080fd5b50565b600081359050613d3b81613d15565b92915050565b600060208284031215613d5757613d566137e4565b5b6000613d6584828501613d2c565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613dab826138de565b810181811067ffffffffffffffff82111715613dca57613dc9613d73565b5b80604052505050565b6000613ddd6137da565b9050613de98282613da2565b919050565b600067ffffffffffffffff821115613e0957613e08613d73565b5b613e12826138de565b9050602081019050919050565b82818337600083830152505050565b6000613e41613e3c84613dee565b613dd3565b905082815260208101848484011115613e5d57613e5c613d6e565b5b613e68848285613e1f565b509392505050565b600082601f830112613e8557613e84613c0f565b5b8135613e95848260208601613e2e565b91505092915050565b600060208284031215613eb457613eb36137e4565b5b600082013567ffffffffffffffff811115613ed257613ed16137e9565b5b613ede84828501613e70565b91505092915050565b613ef081613873565b8114613efb57600080fd5b50565b600081359050613f0d81613ee7565b92915050565b60008060408385031215613f2a57613f296137e4565b5b6000613f3885828601613a20565b9250506020613f4985828601613efe565b9150509250929050565b600067ffffffffffffffff821115613f6e57613f6d613d73565b5b613f77826138de565b9050602081019050919050565b6000613f97613f9284613f53565b613dd3565b905082815260208101848484011115613fb357613fb2613d6e565b5b613fbe848285613e1f565b509392505050565b600082601f830112613fdb57613fda613c0f565b5b8135613feb848260208601613f84565b91505092915050565b6000806000806080858703121561400e5761400d6137e4565b5b600061401c87828801613a20565b945050602061402d87828801613a20565b935050604061403e8782880161396b565b925050606085013567ffffffffffffffff81111561405f5761405e6137e9565b5b61406b87828801613fc6565b91505092959194509250565b60006020828403121561408d5761408c6137e4565b5b600061409b84828501613bba565b91505092915050565b6000806000604084860312156140bd576140bc6137e4565b5b60006140cb86828701613a20565b935050602084013567ffffffffffffffff8111156140ec576140eb6137e9565b5b6140f886828701613c1e565b92509250509250925092565b6000806040838503121561411b5761411a6137e4565b5b600061412985828601613a20565b925050602061413a85828601613a20565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061418b57607f821691505b60208210810361419e5761419d614144565b5b50919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b600061420060268361375d565b915061420b826141a4565b604082019050919050565b6000602082019050818103600083015261422f816141f3565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614292602b8361375d565b915061429d82614236565b604082019050919050565b600060208201905081810360008301526142c181614285565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006143028261394a565b915061430d8361394a565b9250828201905080821115614325576143246142c8565b5b92915050565b6000819050919050565b600061435061434b614346846139ad565b61432b565b6139ad565b9050919050565b600061436282614335565b9050919050565b600061437482614357565b9050919050565b61438481614369565b82525050565b600060408201905061439f600083018561437b565b6143ac6020830184613a75565b9392505050565b60006040820190506143c860008301856139df565b6143d56020830184613a75565b9392505050565b7f57686974656c6973742053616c6520686173206e6f742061637469766174656460008201527f2079657400000000000000000000000000000000000000000000000000000000602082015250565b600061443860248361375d565b9150614443826143dc565b604082019050919050565b600060208201905081810360008301526144678161442b565b9050919050565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b60006144a4600f8361375d565b91506144af8261446e565b602082019050919050565b600060208201905081810360008301526144d381614497565b9050919050565b7f596f752063616e206f6e6c79206765742031204e4654206f6e2074686520576860008201527f6974656c6973742053616c650000000000000000000000000000000000000000602082015250565b6000614536602c8361375d565b9150614541826144da565b604082019050919050565b6000602082019050818103600083015261456581614529565b9050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b60006145a260138361375d565b91506145ad8261456c565b602082019050919050565b600060208201905081810360008301526145d181614595565b9050919050565b60006145e38261394a565b91506145ee8361394a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614627576146266142c8565b5b828202905092915050565b7f4e6f7420656e6f756768742066756e6473000000000000000000000000000000600082015250565b600061466860118361375d565b915061467382614632565b602082019050919050565b600060208201905081810360008301526146978161465b565b9050919050565b60006146a98261394a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146db576146da6142c8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026147777fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261473a565b614781868361473a565b95508019841693508086168417925050509392505050565b60006147b46147af6147aa8461394a565b61432b565b61394a565b9050919050565b6000819050919050565b6147ce83614799565b6147e26147da826147bb565b848454614747565b825550505050565b600090565b6147f76147ea565b6148028184846147c5565b505050565b5b818110156148265761481b6000826147ef565b600181019050614808565b5050565b601f82111561486b5761483c81614715565b6148458461472a565b81016020851015614854578190505b6148686148608561472a565b830182614807565b50505b505050565b600082821c905092915050565b600061488e60001984600802614870565b1980831691505092915050565b60006148a7838361487d565b9150826002028217905092915050565b6148c0826138a9565b67ffffffffffffffff8111156148d9576148d8613d73565b5b6148e38254614173565b6148ee82828561482a565b600060209050601f831160018114614921576000841561490f578287015190505b614919858261489b565b865550614981565b601f19841661492f86614715565b60005b8281101561495757848901518255600182019150602085019450602081019050614932565b868310156149745784890151614970601f89168261487d565b8355505b6001600288020188555050505b505050505050565b7f5072696365206973203000000000000000000000000000000000000000000000600082015250565b60006149bf600a8361375d565b91506149ca82614989565b602082019050919050565b600060208201905081810360008301526149ee816149b2565b9050919050565b7f5075626c69632073616c65206973206e6f742061637469766174656400000000600082015250565b6000614a2b601c8361375d565b9150614a36826149f5565b602082019050919050565b60006020820190508181036000830152614a5a81614a1e565b9050919050565b7f596f752063616e206f6e6c7920676574203130204e4654206f6e20746865205060008201527f75626c69632053616c6500000000000000000000000000000000000000000000602082015250565b6000614abd602a8361375d565b9150614ac882614a61565b604082019050919050565b60006020820190508181036000830152614aec81614ab0565b9050919050565b600081519050614b0281613954565b92915050565b600060208284031215614b1e57614b1d6137e4565b5b6000614b2c84828501614af3565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614b91602f8361375d565b9150614b9c82614b35565b604082019050919050565b60006020820190508181036000830152614bc081614b84565b9050919050565b600081905092915050565b6000614bdd826138a9565b614be78185614bc7565b9350614bf78185602086016138b4565b80840191505092915050565b6000614c0f8285614bd2565b9150614c1b8284614bd2565b91508190509392505050565b60008154614c3481614173565b614c3e8186614bc7565b94506001821660008114614c595760018114614c6e57614ca1565b60ff1983168652811515820286019350614ca1565b614c7785614715565b60005b83811015614c9957815481890152600182019150602081019050614c7a565b838801955050505b50505092915050565b6000614cb68286614bd2565b9150614cc28285614bd2565b9150614cce8284614c27565b9150819050949350505050565b7f52656163686564206d617820537570706c790000000000000000000000000000600082015250565b6000614d1160128361375d565b9150614d1c82614cdb565b602082019050919050565b60006020820190508181036000830152614d4081614d04565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614da360268361375d565b9150614dae82614d47565b604082019050919050565b60006020820190508181036000830152614dd281614d96565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614e0f601d8361375d565b9150614e1a82614dd9565b602082019050919050565b60006020820190508181036000830152614e3e81614e02565b9050919050565b600081905092915050565b50565b6000614e60600083614e45565b9150614e6b82614e50565b600082019050919050565b6000614e8182614e53565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614ee7603a8361375d565b9150614ef282614e8b565b604082019050919050565b60006020820190508181036000830152614f1681614eda565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614f5360208361375d565b9150614f5e82614f1d565b602082019050919050565b60006020820190508181036000830152614f8281614f46565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614fc38261394a565b9150614fce8361394a565b925082614fde57614fdd614f89565b5b828204905092915050565b6000614ff48261394a565b9150614fff8361394a565b9250828203905081811115615017576150166142c8565b5b92915050565b600081519050919050565b600082825260208201905092915050565b60006150448261501d565b61504e8185615028565b935061505e8185602086016138b4565b615067816138de565b840191505092915050565b600060808201905061508760008301876139df565b61509460208301866139df565b6150a16040830185613a75565b81810360608301526150b38184615039565b905095945050505050565b6000815190506150cd8161381a565b92915050565b6000602082840312156150e9576150e86137e4565b5b60006150f7848285016150be565b91505092915050565b600061510b8261394a565b91506151168361394a565b92508261512657615125614f89565b5b828206905092915050565b60008160601b9050919050565b600061514982615131565b9050919050565b600061515b8261513e565b9050919050565b61517361516e826139cd565b615150565b82525050565b60006151858284615162565b60148201915081905092915050565b6000815190506151a381613ee7565b92915050565b6000602082840312156151bf576151be6137e4565b5b60006151cd84828501615194565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615232602a8361375d565b915061523d826151d6565b604082019050919050565b6000602082019050818103600083015261526181615225565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006152c460268361375d565b91506152cf82615268565b604082019050919050565b600060208201905081810360008301526152f3816152b7565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615330601d8361375d565b915061533b826152fa565b602082019050919050565b6000602082019050818103600083015261535f81615323565b9050919050565b60006153718261501d565b61537b8185614e45565b935061538b8185602086016138b4565b80840191505092915050565b60006153a38284615366565b91508190509291505056fea26469706673582212208fac62ed9c1de6f14fe302caf2f737941e1cbc18354480e15a5f0d52f973fa4664736f6c63430008100033

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

00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012054ce083110ae346d6c9312c62a393b3355f5a87551d3cfc13a799be77e8c31d500000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000826cb749cbc23e7b3415dd8a08181dbf9afef84d0000000000000000000000007309810d1933919f59060b59d6c630b8194e74f20000000000000000000000005a0a057db1340d8051d7bc056de9d86f2904047b00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d4e617a66797a4c70384a3363424e4631347a75427761585564636b5350463562374631424b7a423867394b522f000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5437397739575834474c4835437643666957715264565261697631387970456a7471596561416a33767964480000000000000000000000

-----Decoded View---------------
Arg [0] : _team (address[]): 0x826CB749Cbc23E7b3415DD8A08181DBf9afef84d,0x7309810D1933919F59060b59D6C630B8194E74F2,0x5a0A057DB1340D8051d7Bc056DE9D86f2904047B
Arg [1] : _teamShares (uint256[]): 20,55,25
Arg [2] : _merkleRoot (bytes32): 0x54ce083110ae346d6c9312c62a393b3355f5a87551d3cfc13a799be77e8c31d5
Arg [3] : _baseURI (string): ipfs://QmNazfyzLp8J3cBNF14zuBwaXUdckSPF5b7F1BKzB8g9KR/
Arg [4] : initNotRevealedUri (string): ipfs://QmT79w9WX4GLH5CvCfiWqRdVRaiv18ypEjtqYeaAj3vydH

-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 54ce083110ae346d6c9312c62a393b3355f5a87551d3cfc13a799be77e8c31d5
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 000000000000000000000000826cb749cbc23e7b3415dd8a08181dbf9afef84d
Arg [7] : 0000000000000000000000007309810d1933919f59060b59d6c630b8194e74f2
Arg [8] : 0000000000000000000000005a0a057db1340d8051d7bc056de9d86f2904047b
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000037
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [14] : 697066733a2f2f516d4e617a66797a4c70384a3363424e4631347a7542776158
Arg [15] : 5564636b5350463562374631424b7a423867394b522f00000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [17] : 697066733a2f2f516d5437397739575834474c48354376436669577152645652
Arg [18] : 61697631387970456a7471596561416a33767964480000000000000000000000


Deployed Bytecode Sourcemap

86777:5561:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92299:26;;;;;;;;;;:::i;:::-;;;;;;;;86777:5561;;;;13055:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18068:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20137:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87456:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19597:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12109:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81671:453;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21023:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87614:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87212:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89798:93;;;;;;;;;;;;;:::i;:::-;;79281:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91266:80;;;;;;;;;;;;;:::i;:::-;;80410:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21264:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82392:514;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88252:685;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92103:141;;;;;;;;;;;;;:::i;:::-;;87722:60;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17857:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87535:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87376:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13734:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85887:103;;;;;;;;;;;;;:::i;:::-;;91506:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80636:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85239:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18237:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80132:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87563:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90012:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20413:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80826:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88953:642;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21520:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87416:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81211:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89903:99;;;;;;;;;;;;;:::i;:::-;;87491:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90125:1010;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89603:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79928:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79718:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91620:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87335:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79466:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20792:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87255:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87296;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91355:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86145:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87656:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13055:615;13140:4;13455:10;13440:25;;:11;:25;;;;:102;;;;13532:10;13517:25;;:11;:25;;;;13440:102;:179;;;;13609:10;13594:25;;:11;:25;;;;13440:179;13420:199;;13055:615;;;:::o;18068:100::-;18122:13;18155:5;18148:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18068:100;:::o;20137:204::-;20205:7;20230:16;20238:7;20230;:16::i;:::-;20225:64;;20255:34;;;;;;;;;;;;;;20225:64;20309:15;:24;20325:7;20309:24;;;;;;;;;;;;;;;;;;;;;20302:31;;20137:204;;;:::o;87456:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19597:474::-;19670:13;19702:27;19721:7;19702:18;:27::i;:::-;19670:61;;19752:5;19746:11;;:2;:11;;;19742:48;;19766:24;;;;;;;;;;;;;;19742:48;19830:5;19807:28;;:19;:17;:19::i;:::-;:28;;;19803:175;;19855:44;19872:5;19879:19;:17;:19::i;:::-;19855:16;:44::i;:::-;19850:128;;19927:35;;;;;;;;;;;;;;19850:128;19803:175;20017:2;19990:15;:24;20006:7;19990:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20055:7;20051:2;20035:28;;20044:5;20035:28;;;;;;;;;;;;19659:412;19597:474;;:::o;12109:315::-;12162:7;12390:15;:13;:15::i;:::-;12375:12;;12359:13;;:28;:46;12352:53;;12109:315;:::o;81671:453::-;81766:1;81747:7;:16;81755:7;81747:16;;;;;;;;;;;;;;;;:20;81739:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;81823:15;81841:19;81852:7;81841:10;:19::i;:::-;81823:37;;81892:1;81881:7;:12;81873:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;81976:7;81954:9;:18;81964:7;81954:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;82012:7;81994:14;;:25;;;;;;;:::i;:::-;;;;;;;;82032:35;82050:7;82059;82032:17;:35::i;:::-;82083:33;82099:7;82108;82083:33;;;;;;;:::i;:::-;;;;;;;;81728:396;81671:453;:::o;21023:170::-;21157:28;21167:4;21173:2;21177:7;21157:9;:28::i;:::-;21023:170;;;:::o;87614:25::-;;;;:::o;87212:36::-;;;;:::o;89798:93::-;85125:13;:11;:13::i;:::-;89869:12:::1;;;;;;;;;;;89868:13;89853:12;;:28;;;;;;;;;;;;;;;;;;89798:93::o:0;79281:91::-;79325:7;79352:12;;79345:19;;79281:91;:::o;91266:80::-;85125:13;:11;:13::i;:::-;91329:9:::1;;;;;;;;;;;91328:10;91316:9;;:22;;;;;;;;;;;;;;;;;;91266:80::o:0;80410:135::-;80480:7;80507:14;:21;80522:5;80507:21;;;;;;;;;;;;;;;:30;80529:7;80507:30;;;;;;;;;;;;;;;;80500:37;;80410:135;;;;:::o;21264:185::-;21402:39;21419:4;21425:2;21429:7;21402:39;;;;;;;;;;;;:16;:39::i;:::-;21264:185;;;:::o;82392:514::-;82493:1;82474:7;:16;82482:7;82474:16;;;;;;;;;;;;;;;;:20;82466:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;82550:15;82568:26;82579:5;82586:7;82568:10;:26::i;:::-;82550:44;;82626:1;82615:7;:12;82607:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82722:7;82688:14;:21;82703:5;82688:21;;;;;;;;;;;;;;;:30;82710:7;82688:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;82770:7;82740:19;:26;82760:5;82740:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;82790:47;82813:5;82820:7;82829;82790:22;:47::i;:::-;82874:5;82853:45;;;82881:7;82890;82853:45;;;;;;;:::i;:::-;;;;;;;;82455:451;82392:514;;:::o;88252:685::-;88364:10;88377:11;;88364:24;;88407:14;;;;;;;;;;;88399:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;88481:33;88495:10;88507:6;;88481:13;:33::i;:::-;88473:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;88608:13;;88595:9;88553:27;:39;88581:10;88553:39;;;;;;;;;;;;;;;;:51;;;;:::i;:::-;:68;;88545:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;87112:4;88705:9;88689:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:41;;88681:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;88794:9;88786:5;:17;;;;:::i;:::-;88773:9;:30;;88765:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;88879:9;88836:27;:39;88864:10;88836:39;;;;;;;;;;;;;;;;:52;;;;;;;:::i;:::-;;;;;;;;88899:30;88909:8;88919:9;88899;:30::i;:::-;88353:584;88252:685;;;;:::o;92103:141::-;92149:6;92145:92;92166:10;;92162:1;:14;92145:92;;;92199:26;92215:8;92221:1;92215:5;:8::i;:::-;92199:7;:26::i;:::-;92179:3;;;;;:::i;:::-;;;;92145:92;;;;92103:141::o;87722:60::-;;;;;;;;;;;;;;;;;:::o;17857:144::-;17921:7;17964:27;17983:7;17964:18;:27::i;:::-;17941:52;;17857:144;;;:::o;87535:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;87376:29::-;;;;;;;;;;;;;:::o;13734:224::-;13798:7;13839:1;13822:19;;:5;:19;;;13818:60;;13850:28;;;;;;;;;;;;;;13818:60;9073:13;13896:18;:25;13915:5;13896:25;;;;;;;;;;;;;;;;:54;13889:61;;13734:224;;;:::o;85887:103::-;85125:13;:11;:13::i;:::-;85952:30:::1;85979:1;85952:18;:30::i;:::-;85887:103::o:0;91506:106::-;85125:13;:11;:13::i;:::-;91593:11:::1;91580:10;:24;;;;91506:106:::0;:::o;80636:100::-;80687:7;80714;80722:5;80714:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;80707:21;;80636:100;;;:::o;85239:87::-;85285:7;85312:6;;;;;;;;;;;85305:13;;85239:87;:::o;18237:104::-;18293:13;18326:7;18319:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18237:104;:::o;80132:109::-;80188:7;80215:9;:18;80225:7;80215:18;;;;;;;;;;;;;;;;80208:25;;80132:109;;;:::o;87563:42::-;;;;:::o;90012:100::-;85125:13;:11;:13::i;:::-;90096:8:::1;90086:7;:18;;;;;;:::i;:::-;;90012:100:::0;:::o;20413:308::-;20524:19;:17;:19::i;:::-;20512:31;;:8;:31;;;20508:61;;20552:17;;;;;;;;;;;;;;20508:61;20634:8;20582:18;:39;20601:19;:17;:19::i;:::-;20582:39;;;;;;;;;;;;;;;:49;20622:8;20582:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20694:8;20658:55;;20673:19;:17;:19::i;:::-;20658:55;;;20704:8;20658:55;;;;;;:::i;:::-;;;;;;;;20413:308;;:::o;80826:225::-;80884:7;80904:21;80952:15;:13;:15::i;:::-;80928:21;:39;;;;:::i;:::-;80904:63;;80985:58;81001:7;81010:13;81025:17;81034:7;81025:8;:17::i;:::-;80985:15;:58::i;:::-;80978:65;;;80826:225;;;:::o;88953:642::-;89039:10;89052:15;;89039:28;;89095:1;89086:5;:10;89078:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;89130:12;;;;;;;;;;;89122:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;87158:4;87112;89223:25;;;;:::i;:::-;89210:9;89194:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:54;;89186:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;89347:17;;89334:9;89291:28;:40;89320:10;89291:40;;;;;;;;;;;;;;;;:52;;;;:::i;:::-;:73;;89283:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;89451:9;89443:5;:17;;;;:::i;:::-;89430:9;:30;;89422:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;89537:9;89493:28;:40;89522:10;89493:40;;;;;;;;;;;;;;;;:53;;;;;;;:::i;:::-;;;;;;;;89557:30;89567:8;89577:9;89557;:30::i;:::-;89028:567;88953:642;;:::o;21520:396::-;21687:28;21697:4;21703:2;21707:7;21687:9;:28::i;:::-;21748:1;21730:2;:14;;;:19;21726:183;;21769:56;21800:4;21806:2;21810:7;21819:5;21769:30;:56::i;:::-;21764:145;;21853:40;;;;;;;;;;;;;;21764:145;21726:183;21520:396;;;;:::o;87416:33::-;;;;:::o;81211:260::-;81283:7;81303:21;81360:20;81374:5;81360:13;:20::i;:::-;81327:5;:15;;;81351:4;81327:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;81303:77;;81398:65;81414:7;81423:13;81438:24;81447:5;81454:7;81438:8;:24::i;:::-;81398:15;:65::i;:::-;81391:72;;;81211:260;;;;:::o;89903:99::-;85125:13;:11;:13::i;:::-;89978:14:::1;;;;;;;;;;;89977:15;89960:14;;:32;;;;;;;;;;;;;;;;;;89903:99::o:0;87491:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;90125:1010::-;90243:13;90299:16;90307:7;90299;:16::i;:::-;90277:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;90420:5;90407:18;;:9;;;;;;;;;;;:18;;;90403:72;;90449:14;90442:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90403:72;90489:23;90515:10;:19;90526:7;90515:19;;;;;;;;;;;90489:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90545:18;90566:10;:8;:10::i;:::-;90545:31;;90683:1;90667:4;90661:18;:23;90657:72;;90708:9;90701:16;;;;;;90657:72;90859:1;90839:9;90833:23;:27;90829:108;;;90908:4;90914:9;90891:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;90877:48;;;;;;90829:108;91082:4;91088:18;:7;:16;:18::i;:::-;91108:13;91065:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;91038:85;;;;90125:1010;;;;:::o;89603:187::-;85125:13;:11;:13::i;:::-;87064:4:::1;89700:9;89684:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;89676:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;89757:25;89767:3;89772:9;89757;:25::i;:::-;89603:187:::0;;:::o;79928:105::-;79982:7;80009;:16;80017:7;80009:16;;;;;;;;;;;;;;;;80002:23;;79928:105;;;:::o;79718:119::-;79776:7;79803:19;:26;79823:5;79803:26;;;;;;;;;;;;;;;;79796:33;;79718:119;;;:::o;91620:151::-;91708:4;91732:31;91740:14;91745:8;91740:4;:14::i;:::-;91756:6;;91732:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:31::i;:::-;91725:38;;91620:151;;;;;:::o;87335:34::-;;;;;;;;;;;;;:::o;79466:95::-;79512:7;79539:14;;79532:21;;79466:95;:::o;20792:164::-;20889:4;20913:18;:25;20932:5;20913:25;;;;;;;;;;;;;;;:35;20939:8;20913:35;;;;;;;;;;;;;;;;;;;;;;;;;20906:42;;20792:164;;;;:::o;87255:32::-;;;;:::o;87296:::-;;;;;;;;;;;;;:::o;91355:126::-;85125:13;:11;:13::i;:::-;91458:15:::1;91441:14;:32;;;;;;:::i;:::-;;91355:126:::0;:::o;86145:201::-;85125:13;:11;:13::i;:::-;86254:1:::1;86234:22;;:8;:22;;::::0;86226:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;86310:28;86329:8;86310:18;:28::i;:::-;86145:201:::0;:::o;87656:59::-;;;;;;;;;;;;;;;;;:::o;22171:273::-;22228:4;22284:7;22265:15;:13;:15::i;:::-;:26;;:66;;;;;22318:13;;22308:7;:23;22265:66;:152;;;;;22416:1;9843:8;22369:17;:26;22387:7;22369:26;;;;;;;;;;;;:43;:48;22265:152;22245:172;;22171:273;;;:::o;15372:1129::-;15439:7;15459:12;15474:7;15459:22;;15542:4;15523:15;:13;:15::i;:::-;:23;15519:915;;15576:13;;15569:4;:20;15565:869;;;15614:14;15631:17;:23;15649:4;15631:23;;;;;;;;;;;;15614:40;;15747:1;9843:8;15720:6;:23;:28;15716:699;;16239:113;16256:1;16246:6;:11;16239:113;;16299:17;:25;16317:6;;;;;;;16299:25;;;;;;;;;;;;16290:34;;16239:113;;;16385:6;16378:13;;;;;;15716:699;15591:843;15565:869;15519:915;16462:31;;;;;;;;;;;;;;15372:1129;;;;:::o;36153:105::-;36213:7;36240:10;36233:17;;36153:105;:::o;11632:92::-;11688:7;11632:92;:::o;50360:317::-;50475:6;50450:21;:31;;50442:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50529:12;50547:9;:14;;50569:6;50547:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50528:52;;;50599:7;50591:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;50431:246;50360:317;;:::o;27410:2515::-;27525:27;27555;27574:7;27555:18;:27::i;:::-;27525:57;;27640:4;27599:45;;27615:19;27599:45;;;27595:86;;27653:28;;;;;;;;;;;;;;27595:86;27694:22;27743:4;27720:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;27764:43;27781:4;27787:19;:17;:19::i;:::-;27764:16;:43::i;:::-;27720:87;:147;;;;27848:19;:17;:19::i;:::-;27824:43;;:20;27836:7;27824:11;:20::i;:::-;:43;;;27720:147;27694:174;;27886:17;27881:66;;27912:35;;;;;;;;;;;;;;27881:66;27976:1;27962:16;;:2;:16;;;27958:52;;27987:23;;;;;;;;;;;;;;27958:52;28023:43;28045:4;28051:2;28055:7;28064:1;28023:21;:43::i;:::-;28139:15;:24;28155:7;28139:24;;;;;;;;;;;;28132:31;;;;;;;;;;;28531:18;:24;28550:4;28531:24;;;;;;;;;;;;;;;;28529:26;;;;;;;;;;;;28600:18;:22;28619:2;28600:22;;;;;;;;;;;;;;;;28598:24;;;;;;;;;;;10125:8;9727:3;28981:15;:41;;28939:21;28957:2;28939:17;:21::i;:::-;:84;:128;28893:17;:26;28911:7;28893:26;;;;;;;;;;;:174;;;;29237:1;10125:8;29187:19;:46;:51;29183:626;;29259:19;29291:1;29281:7;:11;29259:33;;29448:1;29414:17;:30;29432:11;29414:30;;;;;;;;;;;;:35;29410:384;;29552:13;;29537:11;:28;29533:242;;29732:19;29699:17;:30;29717:11;29699:30;;;;;;;;;;;:52;;;;29533:242;29410:384;29240:569;29183:626;29856:7;29852:2;29837:27;;29846:4;29837:27;;;;;;;;;;;;29875:42;29896:4;29902:2;29906:7;29915:1;29875:20;:42::i;:::-;27514:2411;;27410:2515;;;:::o;85404:132::-;85479:12;:10;:12::i;:::-;85468:23;;:7;:5;:7::i;:::-;:23;;;85460:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;85404:132::o;62377:211::-;62494:86;62514:5;62544:23;;;62569:2;62573:5;62521:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62494:19;:86::i;:::-;62377:211;;;:::o;22528:104::-;22597:27;22607:2;22611:8;22597:27;;;;;;;;;;;;:9;:27::i;:::-;22528:104;;:::o;86506:191::-;86580:16;86599:6;;;;;;;;;;;86580:25;;86625:8;86616:6;;:17;;;;;;;;;;;;;;;;;;86680:8;86649:40;;86670:8;86649:40;;;;;;;;;;;;86569:128;86506:191;:::o;83084:248::-;83230:7;83309:15;83294:12;;83274:7;:16;83282:7;83274:16;;;;;;;;;;;;;;;;83258:13;:32;;;;:::i;:::-;83257:49;;;;:::i;:::-;:67;;;;:::i;:::-;83250:74;;83084:248;;;;;:::o;33622:716::-;33785:4;33831:2;33806:45;;;33852:19;:17;:19::i;:::-;33873:4;33879:7;33888:5;33806:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33802:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34106:1;34089:6;:13;:18;34085:235;;34135:40;;;;;;;;;;;;;;34085:235;34278:6;34272:13;34263:6;34259:2;34255:15;34248:38;33802:529;33975:54;;;33965:64;;;:6;:64;;;;33958:71;;;33622:716;;;;;;:::o;91145:108::-;91205:13;91238:7;91231:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91145:108;:::o;38758:723::-;38814:13;39044:1;39035:5;:10;39031:53;;39062:10;;;;;;;;;;;;;;;;;;;;;39031:53;39094:12;39109:5;39094:20;;39125:14;39150:78;39165:1;39157:4;:9;39150:78;;39183:8;;;;;:::i;:::-;;;;39214:2;39206:10;;;;;:::i;:::-;;;39150:78;;;39238:19;39270:6;39260:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39238:39;;39288:154;39304:1;39295:5;:10;39288:154;;39332:1;39322:11;;;;;:::i;:::-;;;39399:2;39391:5;:10;;;;:::i;:::-;39378:2;:24;;;;:::i;:::-;39365:39;;39348:6;39355;39348:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;39428:2;39419:11;;;;;:::i;:::-;;;39288:154;;;39466:6;39452:21;;;;;38758:723;;;;:::o;91787:126::-;91841:7;91895:8;91878:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;91868:37;;;;;;91861:44;;91787:126;;;:::o;91921:156::-;92000:4;92024:45;92043:6;92051:10;;92063:5;92024:18;:45::i;:::-;92017:52;;91921:156;;;;:::o;34986:159::-;;;;;:::o;19158:148::-;19222:14;19283:5;19273:15;;19158:148;;;:::o;35804:158::-;;;;;:::o;75571:98::-;75624:7;75651:10;75644:17;;75571:98;:::o;65444:716::-;65868:23;65894:69;65922:4;65894:69;;;;;;;;;;;;;;;;;65902:5;65894:27;;;;:69;;;;;:::i;:::-;65868:95;;65998:1;65978:10;:17;:21;65974:179;;;66075:10;66064:30;;;;;;;;;;;;:::i;:::-;66056:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;65974:179;65514:646;65444:716;;:::o;23005:2236::-;23128:20;23151:13;;23128:36;;23193:1;23179:16;;:2;:16;;;23175:48;;23204:19;;;;;;;;;;;;;;23175:48;23250:1;23238:8;:13;23234:44;;23260:18;;;;;;;;;;;;;;23234:44;23291:61;23321:1;23325:2;23329:12;23343:8;23291:21;:61::i;:::-;23895:1;9210:2;23866:1;:25;;23865:31;23853:8;:44;23827:18;:22;23846:2;23827:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;9990:3;24296:29;24323:1;24311:8;:13;24296:14;:29::i;:::-;:56;;9727:3;24233:15;:41;;24191:21;24209:2;24191:17;:21::i;:::-;:84;:162;24140:17;:31;24158:12;24140:31;;;;;;;;;;;:213;;;;24370:20;24393:12;24370:35;;24420:11;24449:8;24434:12;:23;24420:37;;24496:1;24478:2;:14;;;:19;24474:635;;24518:313;24574:12;24570:2;24549:38;;24566:1;24549:38;;;;;;;;;;;;24615:69;24654:1;24658:2;24662:14;;;;;;24678:5;24615:30;:69::i;:::-;24610:174;;24720:40;;;;;;;;;;;;;;24610:174;24826:3;24811:12;:18;24518:313;;24912:12;24895:13;;:29;24891:43;;24926:8;;;24891:43;24474:635;;;24975:119;25031:14;;;;;;25027:2;25006:40;;25023:1;25006:40;;;;;;;;;;;;25089:3;25074:12;:18;24975:119;;24474:635;25139:12;25123:13;:28;;;;23604:1559;;25173:60;25202:1;25206:2;25210:12;25224:8;25173:20;:60::i;:::-;23117:2124;23005:2236;;;:::o;67386:190::-;67511:4;67564;67535:25;67548:5;67555:4;67535:12;:25::i;:::-;:33;67528:40;;67386:190;;;;;:::o;51844:229::-;51981:12;52013:52;52035:6;52043:4;52049:1;52052:12;52013:21;:52::i;:::-;52006:59;;51844:229;;;;;:::o;19393:142::-;19451:14;19512:5;19502:15;;19393:142;;;:::o;68253:296::-;68336:7;68356:20;68379:4;68356:27;;68399:9;68394:118;68418:5;:12;68414:1;:16;68394:118;;;68467:33;68477:12;68491:5;68497:1;68491:8;;;;;;;;:::i;:::-;;;;;;;;68467:9;:33::i;:::-;68452:48;;68432:3;;;;;:::i;:::-;;;;68394:118;;;;68529:12;68522:19;;;68253:296;;;;:::o;52964:510::-;53134:12;53192:5;53167:21;:30;;53159:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;53259:18;53270:6;53259:10;:18::i;:::-;53251:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;53325:12;53339:23;53366:6;:11;;53385:5;53392:4;53366:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53324:73;;;;53415:51;53432:7;53441:10;53453:12;53415:16;:51::i;:::-;53408:58;;;;52964:510;;;;;;:::o;74460:149::-;74523:7;74554:1;74550;:5;:51;;74581:20;74596:1;74599;74581:14;:20::i;:::-;74550:51;;;74558:20;74573:1;74576;74558:14;:20::i;:::-;74550:51;74543:58;;74460:149;;;;:::o;49099:326::-;49159:4;49416:1;49394:7;:19;;;:23;49387:30;;49099:326;;;:::o;55650:762::-;55800:12;55829:7;55825:580;;;55860:10;55853:17;;;;55825:580;55994:1;55974:10;:17;:21;55970:424;;;56222:10;56216:17;56283:15;56270:10;56266:2;56262:19;56255:44;55970:424;56365:12;56358:20;;;;;;;;;;;:::i;:::-;;;;;;;;55650:762;;;;;;:::o;74617:268::-;74685:13;74792:1;74786:4;74779:15;74821:1;74815:4;74808:15;74862:4;74856;74846:21;74837:30;;74617:268;;;;:::o;7:169:1:-;91:11;125:6;120:3;113:19;165:4;160:3;156:14;141:29;;7:169;;;;:::o;182:166::-;322:18;318:1;310:6;306:14;299:42;182:166;:::o;354:366::-;496:3;517:67;581:2;576:3;517:67;:::i;:::-;510:74;;593:93;682:3;593:93;:::i;:::-;711:2;706:3;702:12;695:19;;354:366;;;:::o;726:419::-;892:4;930:2;919:9;915:18;907:26;;979:9;973:4;969:20;965:1;954:9;950:17;943:47;1007:131;1133:4;1007:131;:::i;:::-;999:139;;726:419;;;:::o;1151:75::-;1184:6;1217:2;1211:9;1201:19;;1151:75;:::o;1232:117::-;1341:1;1338;1331:12;1355:117;1464:1;1461;1454:12;1478:149;1514:7;1554:66;1547:5;1543:78;1532:89;;1478:149;;;:::o;1633:120::-;1705:23;1722:5;1705:23;:::i;:::-;1698:5;1695:34;1685:62;;1743:1;1740;1733:12;1685:62;1633:120;:::o;1759:137::-;1804:5;1842:6;1829:20;1820:29;;1858:32;1884:5;1858:32;:::i;:::-;1759:137;;;;:::o;1902:327::-;1960:6;2009:2;1997:9;1988:7;1984:23;1980:32;1977:119;;;2015:79;;:::i;:::-;1977:119;2135:1;2160:52;2204:7;2195:6;2184:9;2180:22;2160:52;:::i;:::-;2150:62;;2106:116;1902:327;;;;:::o;2235:90::-;2269:7;2312:5;2305:13;2298:21;2287:32;;2235:90;;;:::o;2331:109::-;2412:21;2427:5;2412:21;:::i;:::-;2407:3;2400:34;2331:109;;:::o;2446:210::-;2533:4;2571:2;2560:9;2556:18;2548:26;;2584:65;2646:1;2635:9;2631:17;2622:6;2584:65;:::i;:::-;2446:210;;;;:::o;2662:99::-;2714:6;2748:5;2742:12;2732:22;;2662:99;;;:::o;2767:246::-;2848:1;2858:113;2872:6;2869:1;2866:13;2858:113;;;2957:1;2952:3;2948:11;2942:18;2938:1;2933:3;2929:11;2922:39;2894:2;2891:1;2887:10;2882:15;;2858:113;;;3005:1;2996:6;2991:3;2987:16;2980:27;2829:184;2767:246;;;:::o;3019:102::-;3060:6;3111:2;3107:7;3102:2;3095:5;3091:14;3087:28;3077:38;;3019:102;;;:::o;3127:377::-;3215:3;3243:39;3276:5;3243:39;:::i;:::-;3298:71;3362:6;3357:3;3298:71;:::i;:::-;3291:78;;3378:65;3436:6;3431:3;3424:4;3417:5;3413:16;3378:65;:::i;:::-;3468:29;3490:6;3468:29;:::i;:::-;3463:3;3459:39;3452:46;;3219:285;3127:377;;;;:::o;3510:313::-;3623:4;3661:2;3650:9;3646:18;3638:26;;3710:9;3704:4;3700:20;3696:1;3685:9;3681:17;3674:47;3738:78;3811:4;3802:6;3738:78;:::i;:::-;3730:86;;3510:313;;;;:::o;3829:77::-;3866:7;3895:5;3884:16;;3829:77;;;:::o;3912:122::-;3985:24;4003:5;3985:24;:::i;:::-;3978:5;3975:35;3965:63;;4024:1;4021;4014:12;3965:63;3912:122;:::o;4040:139::-;4086:5;4124:6;4111:20;4102:29;;4140:33;4167:5;4140:33;:::i;:::-;4040:139;;;;:::o;4185:329::-;4244:6;4293:2;4281:9;4272:7;4268:23;4264:32;4261:119;;;4299:79;;:::i;:::-;4261:119;4419:1;4444:53;4489:7;4480:6;4469:9;4465:22;4444:53;:::i;:::-;4434:63;;4390:117;4185:329;;;;:::o;4520:126::-;4557:7;4597:42;4590:5;4586:54;4575:65;;4520:126;;;:::o;4652:96::-;4689:7;4718:24;4736:5;4718:24;:::i;:::-;4707:35;;4652:96;;;:::o;4754:118::-;4841:24;4859:5;4841:24;:::i;:::-;4836:3;4829:37;4754:118;;:::o;4878:222::-;4971:4;5009:2;4998:9;4994:18;4986:26;;5022:71;5090:1;5079:9;5075:17;5066:6;5022:71;:::i;:::-;4878:222;;;;:::o;5106:122::-;5179:24;5197:5;5179:24;:::i;:::-;5172:5;5169:35;5159:63;;5218:1;5215;5208:12;5159:63;5106:122;:::o;5234:139::-;5280:5;5318:6;5305:20;5296:29;;5334:33;5361:5;5334:33;:::i;:::-;5234:139;;;;:::o;5379:474::-;5447:6;5455;5504:2;5492:9;5483:7;5479:23;5475:32;5472:119;;;5510:79;;:::i;:::-;5472:119;5630:1;5655:53;5700:7;5691:6;5680:9;5676:22;5655:53;:::i;:::-;5645:63;;5601:117;5757:2;5783:53;5828:7;5819:6;5808:9;5804:22;5783:53;:::i;:::-;5773:63;;5728:118;5379:474;;;;;:::o;5859:118::-;5946:24;5964:5;5946:24;:::i;:::-;5941:3;5934:37;5859:118;;:::o;5983:222::-;6076:4;6114:2;6103:9;6099:18;6091:26;;6127:71;6195:1;6184:9;6180:17;6171:6;6127:71;:::i;:::-;5983:222;;;;:::o;6211:104::-;6256:7;6285:24;6303:5;6285:24;:::i;:::-;6274:35;;6211:104;;;:::o;6321:138::-;6402:32;6428:5;6402:32;:::i;:::-;6395:5;6392:43;6382:71;;6449:1;6446;6439:12;6382:71;6321:138;:::o;6465:155::-;6519:5;6557:6;6544:20;6535:29;;6573:41;6608:5;6573:41;:::i;:::-;6465:155;;;;:::o;6626:345::-;6693:6;6742:2;6730:9;6721:7;6717:23;6713:32;6710:119;;;6748:79;;:::i;:::-;6710:119;6868:1;6893:61;6946:7;6937:6;6926:9;6922:22;6893:61;:::i;:::-;6883:71;;6839:125;6626:345;;;;:::o;6977:619::-;7054:6;7062;7070;7119:2;7107:9;7098:7;7094:23;7090:32;7087:119;;;7125:79;;:::i;:::-;7087:119;7245:1;7270:53;7315:7;7306:6;7295:9;7291:22;7270:53;:::i;:::-;7260:63;;7216:117;7372:2;7398:53;7443:7;7434:6;7423:9;7419:22;7398:53;:::i;:::-;7388:63;;7343:118;7500:2;7526:53;7571:7;7562:6;7551:9;7547:22;7526:53;:::i;:::-;7516:63;;7471:118;6977:619;;;;;:::o;7602:77::-;7639:7;7668:5;7657:16;;7602:77;;;:::o;7685:118::-;7772:24;7790:5;7772:24;:::i;:::-;7767:3;7760:37;7685:118;;:::o;7809:222::-;7902:4;7940:2;7929:9;7925:18;7917:26;;7953:71;8021:1;8010:9;8006:17;7997:6;7953:71;:::i;:::-;7809:222;;;;:::o;8037:111::-;8089:7;8118:24;8136:5;8118:24;:::i;:::-;8107:35;;8037:111;;;:::o;8154:152::-;8242:39;8275:5;8242:39;:::i;:::-;8235:5;8232:50;8222:78;;8296:1;8293;8286:12;8222:78;8154:152;:::o;8312:169::-;8373:5;8411:6;8398:20;8389:29;;8427:48;8469:5;8427:48;:::i;:::-;8312:169;;;;:::o;8487:504::-;8570:6;8578;8627:2;8615:9;8606:7;8602:23;8598:32;8595:119;;;8633:79;;:::i;:::-;8595:119;8753:1;8778:68;8838:7;8829:6;8818:9;8814:22;8778:68;:::i;:::-;8768:78;;8724:132;8895:2;8921:53;8966:7;8957:6;8946:9;8942:22;8921:53;:::i;:::-;8911:63;;8866:118;8487:504;;;;;:::o;8997:117::-;9106:1;9103;9096:12;9120:117;9229:1;9226;9219:12;9243:117;9352:1;9349;9342:12;9383:568;9456:8;9466:6;9516:3;9509:4;9501:6;9497:17;9493:27;9483:122;;9524:79;;:::i;:::-;9483:122;9637:6;9624:20;9614:30;;9667:18;9659:6;9656:30;9653:117;;;9689:79;;:::i;:::-;9653:117;9803:4;9795:6;9791:17;9779:29;;9857:3;9849:4;9841:6;9837:17;9827:8;9823:32;9820:41;9817:128;;;9864:79;;:::i;:::-;9817:128;9383:568;;;;;:::o;9957:849::-;10061:6;10069;10077;10085;10134:2;10122:9;10113:7;10109:23;10105:32;10102:119;;;10140:79;;:::i;:::-;10102:119;10260:1;10285:53;10330:7;10321:6;10310:9;10306:22;10285:53;:::i;:::-;10275:63;;10231:117;10387:2;10413:53;10458:7;10449:6;10438:9;10434:22;10413:53;:::i;:::-;10403:63;;10358:118;10543:2;10532:9;10528:18;10515:32;10574:18;10566:6;10563:30;10560:117;;;10596:79;;:::i;:::-;10560:117;10709:80;10781:7;10772:6;10761:9;10757:22;10709:80;:::i;:::-;10691:98;;;;10486:313;9957:849;;;;;;;:::o;10812:329::-;10871:6;10920:2;10908:9;10899:7;10895:23;10891:32;10888:119;;;10926:79;;:::i;:::-;10888:119;11046:1;11071:53;11116:7;11107:6;11096:9;11092:22;11071:53;:::i;:::-;11061:63;;11017:117;10812:329;;;;:::o;11147:122::-;11220:24;11238:5;11220:24;:::i;:::-;11213:5;11210:35;11200:63;;11259:1;11256;11249:12;11200:63;11147:122;:::o;11275:139::-;11321:5;11359:6;11346:20;11337:29;;11375:33;11402:5;11375:33;:::i;:::-;11275:139;;;;:::o;11420:329::-;11479:6;11528:2;11516:9;11507:7;11503:23;11499:32;11496:119;;;11534:79;;:::i;:::-;11496:119;11654:1;11679:53;11724:7;11715:6;11704:9;11700:22;11679:53;:::i;:::-;11669:63;;11625:117;11420:329;;;;:::o;11755:117::-;11864:1;11861;11854:12;11878:180;11926:77;11923:1;11916:88;12023:4;12020:1;12013:15;12047:4;12044:1;12037:15;12064:281;12147:27;12169:4;12147:27;:::i;:::-;12139:6;12135:40;12277:6;12265:10;12262:22;12241:18;12229:10;12226:34;12223:62;12220:88;;;12288:18;;:::i;:::-;12220:88;12328:10;12324:2;12317:22;12107:238;12064:281;;:::o;12351:129::-;12385:6;12412:20;;:::i;:::-;12402:30;;12441:33;12469:4;12461:6;12441:33;:::i;:::-;12351:129;;;:::o;12486:308::-;12548:4;12638:18;12630:6;12627:30;12624:56;;;12660:18;;:::i;:::-;12624:56;12698:29;12720:6;12698:29;:::i;:::-;12690:37;;12782:4;12776;12772:15;12764:23;;12486:308;;;:::o;12800:146::-;12897:6;12892:3;12887;12874:30;12938:1;12929:6;12924:3;12920:16;12913:27;12800:146;;;:::o;12952:425::-;13030:5;13055:66;13071:49;13113:6;13071:49;:::i;:::-;13055:66;:::i;:::-;13046:75;;13144:6;13137:5;13130:21;13182:4;13175:5;13171:16;13220:3;13211:6;13206:3;13202:16;13199:25;13196:112;;;13227:79;;:::i;:::-;13196:112;13317:54;13364:6;13359:3;13354;13317:54;:::i;:::-;13036:341;12952:425;;;;;:::o;13397:340::-;13453:5;13502:3;13495:4;13487:6;13483:17;13479:27;13469:122;;13510:79;;:::i;:::-;13469:122;13627:6;13614:20;13652:79;13727:3;13719:6;13712:4;13704:6;13700:17;13652:79;:::i;:::-;13643:88;;13459:278;13397:340;;;;:::o;13743:509::-;13812:6;13861:2;13849:9;13840:7;13836:23;13832:32;13829:119;;;13867:79;;:::i;:::-;13829:119;14015:1;14004:9;14000:17;13987:31;14045:18;14037:6;14034:30;14031:117;;;14067:79;;:::i;:::-;14031:117;14172:63;14227:7;14218:6;14207:9;14203:22;14172:63;:::i;:::-;14162:73;;13958:287;13743:509;;;;:::o;14258:116::-;14328:21;14343:5;14328:21;:::i;:::-;14321:5;14318:32;14308:60;;14364:1;14361;14354:12;14308:60;14258:116;:::o;14380:133::-;14423:5;14461:6;14448:20;14439:29;;14477:30;14501:5;14477:30;:::i;:::-;14380:133;;;;:::o;14519:468::-;14584:6;14592;14641:2;14629:9;14620:7;14616:23;14612:32;14609:119;;;14647:79;;:::i;:::-;14609:119;14767:1;14792:53;14837:7;14828:6;14817:9;14813:22;14792:53;:::i;:::-;14782:63;;14738:117;14894:2;14920:50;14962:7;14953:6;14942:9;14938:22;14920:50;:::i;:::-;14910:60;;14865:115;14519:468;;;;;:::o;14993:307::-;15054:4;15144:18;15136:6;15133:30;15130:56;;;15166:18;;:::i;:::-;15130:56;15204:29;15226:6;15204:29;:::i;:::-;15196:37;;15288:4;15282;15278:15;15270:23;;14993:307;;;:::o;15306:423::-;15383:5;15408:65;15424:48;15465:6;15424:48;:::i;:::-;15408:65;:::i;:::-;15399:74;;15496:6;15489:5;15482:21;15534:4;15527:5;15523:16;15572:3;15563:6;15558:3;15554:16;15551:25;15548:112;;;15579:79;;:::i;:::-;15548:112;15669:54;15716:6;15711:3;15706;15669:54;:::i;:::-;15389:340;15306:423;;;;;:::o;15748:338::-;15803:5;15852:3;15845:4;15837:6;15833:17;15829:27;15819:122;;15860:79;;:::i;:::-;15819:122;15977:6;15964:20;16002:78;16076:3;16068:6;16061:4;16053:6;16049:17;16002:78;:::i;:::-;15993:87;;15809:277;15748:338;;;;:::o;16092:943::-;16187:6;16195;16203;16211;16260:3;16248:9;16239:7;16235:23;16231:33;16228:120;;;16267:79;;:::i;:::-;16228:120;16387:1;16412:53;16457:7;16448:6;16437:9;16433:22;16412:53;:::i;:::-;16402:63;;16358:117;16514:2;16540:53;16585:7;16576:6;16565:9;16561:22;16540:53;:::i;:::-;16530:63;;16485:118;16642:2;16668:53;16713:7;16704:6;16693:9;16689:22;16668:53;:::i;:::-;16658:63;;16613:118;16798:2;16787:9;16783:18;16770:32;16829:18;16821:6;16818:30;16815:117;;;16851:79;;:::i;:::-;16815:117;16956:62;17010:7;17001:6;16990:9;16986:22;16956:62;:::i;:::-;16946:72;;16741:287;16092:943;;;;;;;:::o;17041:359::-;17115:6;17164:2;17152:9;17143:7;17139:23;17135:32;17132:119;;;17170:79;;:::i;:::-;17132:119;17290:1;17315:68;17375:7;17366:6;17355:9;17351:22;17315:68;:::i;:::-;17305:78;;17261:132;17041:359;;;;:::o;17406:704::-;17501:6;17509;17517;17566:2;17554:9;17545:7;17541:23;17537:32;17534:119;;;17572:79;;:::i;:::-;17534:119;17692:1;17717:53;17762:7;17753:6;17742:9;17738:22;17717:53;:::i;:::-;17707:63;;17663:117;17847:2;17836:9;17832:18;17819:32;17878:18;17870:6;17867:30;17864:117;;;17900:79;;:::i;:::-;17864:117;18013:80;18085:7;18076:6;18065:9;18061:22;18013:80;:::i;:::-;17995:98;;;;17790:313;17406:704;;;;;:::o;18116:474::-;18184:6;18192;18241:2;18229:9;18220:7;18216:23;18212:32;18209:119;;;18247:79;;:::i;:::-;18209:119;18367:1;18392:53;18437:7;18428:6;18417:9;18413:22;18392:53;:::i;:::-;18382:63;;18338:117;18494:2;18520:53;18565:7;18556:6;18545:9;18541:22;18520:53;:::i;:::-;18510:63;;18465:118;18116:474;;;;;:::o;18596:180::-;18644:77;18641:1;18634:88;18741:4;18738:1;18731:15;18765:4;18762:1;18755:15;18782:320;18826:6;18863:1;18857:4;18853:12;18843:22;;18910:1;18904:4;18900:12;18931:18;18921:81;;18987:4;18979:6;18975:17;18965:27;;18921:81;19049:2;19041:6;19038:14;19018:18;19015:38;19012:84;;19068:18;;:::i;:::-;19012:84;18833:269;18782:320;;;:::o;19108:225::-;19248:34;19244:1;19236:6;19232:14;19225:58;19317:8;19312:2;19304:6;19300:15;19293:33;19108:225;:::o;19339:366::-;19481:3;19502:67;19566:2;19561:3;19502:67;:::i;:::-;19495:74;;19578:93;19667:3;19578:93;:::i;:::-;19696:2;19691:3;19687:12;19680:19;;19339:366;;;:::o;19711:419::-;19877:4;19915:2;19904:9;19900:18;19892:26;;19964:9;19958:4;19954:20;19950:1;19939:9;19935:17;19928:47;19992:131;20118:4;19992:131;:::i;:::-;19984:139;;19711:419;;;:::o;20136:230::-;20276:34;20272:1;20264:6;20260:14;20253:58;20345:13;20340:2;20332:6;20328:15;20321:38;20136:230;:::o;20372:366::-;20514:3;20535:67;20599:2;20594:3;20535:67;:::i;:::-;20528:74;;20611:93;20700:3;20611:93;:::i;:::-;20729:2;20724:3;20720:12;20713:19;;20372:366;;;:::o;20744:419::-;20910:4;20948:2;20937:9;20933:18;20925:26;;20997:9;20991:4;20987:20;20983:1;20972:9;20968:17;20961:47;21025:131;21151:4;21025:131;:::i;:::-;21017:139;;20744:419;;;:::o;21169:180::-;21217:77;21214:1;21207:88;21314:4;21311:1;21304:15;21338:4;21335:1;21328:15;21355:191;21395:3;21414:20;21432:1;21414:20;:::i;:::-;21409:25;;21448:20;21466:1;21448:20;:::i;:::-;21443:25;;21491:1;21488;21484:9;21477:16;;21512:3;21509:1;21506:10;21503:36;;;21519:18;;:::i;:::-;21503:36;21355:191;;;;:::o;21552:60::-;21580:3;21601:5;21594:12;;21552:60;;;:::o;21618:142::-;21668:9;21701:53;21719:34;21728:24;21746:5;21728:24;:::i;:::-;21719:34;:::i;:::-;21701:53;:::i;:::-;21688:66;;21618:142;;;:::o;21766:126::-;21816:9;21849:37;21880:5;21849:37;:::i;:::-;21836:50;;21766:126;;;:::o;21898:134::-;21956:9;21989:37;22020:5;21989:37;:::i;:::-;21976:50;;21898:134;;;:::o;22038:147::-;22133:45;22172:5;22133:45;:::i;:::-;22128:3;22121:58;22038:147;;:::o;22191:348::-;22320:4;22358:2;22347:9;22343:18;22335:26;;22371:79;22447:1;22436:9;22432:17;22423:6;22371:79;:::i;:::-;22460:72;22528:2;22517:9;22513:18;22504:6;22460:72;:::i;:::-;22191:348;;;;;:::o;22545:332::-;22666:4;22704:2;22693:9;22689:18;22681:26;;22717:71;22785:1;22774:9;22770:17;22761:6;22717:71;:::i;:::-;22798:72;22866:2;22855:9;22851:18;22842:6;22798:72;:::i;:::-;22545:332;;;;;:::o;22883:223::-;23023:34;23019:1;23011:6;23007:14;23000:58;23092:6;23087:2;23079:6;23075:15;23068:31;22883:223;:::o;23112:366::-;23254:3;23275:67;23339:2;23334:3;23275:67;:::i;:::-;23268:74;;23351:93;23440:3;23351:93;:::i;:::-;23469:2;23464:3;23460:12;23453:19;;23112:366;;;:::o;23484:419::-;23650:4;23688:2;23677:9;23673:18;23665:26;;23737:9;23731:4;23727:20;23723:1;23712:9;23708:17;23701:47;23765:131;23891:4;23765:131;:::i;:::-;23757:139;;23484:419;;;:::o;23909:165::-;24049:17;24045:1;24037:6;24033:14;24026:41;23909:165;:::o;24080:366::-;24222:3;24243:67;24307:2;24302:3;24243:67;:::i;:::-;24236:74;;24319:93;24408:3;24319:93;:::i;:::-;24437:2;24432:3;24428:12;24421:19;;24080:366;;;:::o;24452:419::-;24618:4;24656:2;24645:9;24641:18;24633:26;;24705:9;24699:4;24695:20;24691:1;24680:9;24676:17;24669:47;24733:131;24859:4;24733:131;:::i;:::-;24725:139;;24452:419;;;:::o;24877:231::-;25017:34;25013:1;25005:6;25001:14;24994:58;25086:14;25081:2;25073:6;25069:15;25062:39;24877:231;:::o;25114:366::-;25256:3;25277:67;25341:2;25336:3;25277:67;:::i;:::-;25270:74;;25353:93;25442:3;25353:93;:::i;:::-;25471:2;25466:3;25462:12;25455:19;;25114:366;;;:::o;25486:419::-;25652:4;25690:2;25679:9;25675:18;25667:26;;25739:9;25733:4;25729:20;25725:1;25714:9;25710:17;25703:47;25767:131;25893:4;25767:131;:::i;:::-;25759:139;;25486:419;;;:::o;25911:169::-;26051:21;26047:1;26039:6;26035:14;26028:45;25911:169;:::o;26086:366::-;26228:3;26249:67;26313:2;26308:3;26249:67;:::i;:::-;26242:74;;26325:93;26414:3;26325:93;:::i;:::-;26443:2;26438:3;26434:12;26427:19;;26086:366;;;:::o;26458:419::-;26624:4;26662:2;26651:9;26647:18;26639:26;;26711:9;26705:4;26701:20;26697:1;26686:9;26682:17;26675:47;26739:131;26865:4;26739:131;:::i;:::-;26731:139;;26458:419;;;:::o;26883:348::-;26923:7;26946:20;26964:1;26946:20;:::i;:::-;26941:25;;26980:20;26998:1;26980:20;:::i;:::-;26975:25;;27168:1;27100:66;27096:74;27093:1;27090:81;27085:1;27078:9;27071:17;27067:105;27064:131;;;27175:18;;:::i;:::-;27064:131;27223:1;27220;27216:9;27205:20;;26883:348;;;;:::o;27237:167::-;27377:19;27373:1;27365:6;27361:14;27354:43;27237:167;:::o;27410:366::-;27552:3;27573:67;27637:2;27632:3;27573:67;:::i;:::-;27566:74;;27649:93;27738:3;27649:93;:::i;:::-;27767:2;27762:3;27758:12;27751:19;;27410:366;;;:::o;27782:419::-;27948:4;27986:2;27975:9;27971:18;27963:26;;28035:9;28029:4;28025:20;28021:1;28010:9;28006:17;27999:47;28063:131;28189:4;28063:131;:::i;:::-;28055:139;;27782:419;;;:::o;28207:233::-;28246:3;28269:24;28287:5;28269:24;:::i;:::-;28260:33;;28315:66;28308:5;28305:77;28302:103;;28385:18;;:::i;:::-;28302:103;28432:1;28425:5;28421:13;28414:20;;28207:233;;;:::o;28446:180::-;28494:77;28491:1;28484:88;28591:4;28588:1;28581:15;28615:4;28612:1;28605:15;28632:141;28681:4;28704:3;28696:11;;28727:3;28724:1;28717:14;28761:4;28758:1;28748:18;28740:26;;28632:141;;;:::o;28779:93::-;28816:6;28863:2;28858;28851:5;28847:14;28843:23;28833:33;;28779:93;;;:::o;28878:107::-;28922:8;28972:5;28966:4;28962:16;28941:37;;28878:107;;;;:::o;28991:393::-;29060:6;29110:1;29098:10;29094:18;29133:97;29163:66;29152:9;29133:97;:::i;:::-;29251:39;29281:8;29270:9;29251:39;:::i;:::-;29239:51;;29323:4;29319:9;29312:5;29308:21;29299:30;;29372:4;29362:8;29358:19;29351:5;29348:30;29338:40;;29067:317;;28991:393;;;;;:::o;29390:142::-;29440:9;29473:53;29491:34;29500:24;29518:5;29500:24;:::i;:::-;29491:34;:::i;:::-;29473:53;:::i;:::-;29460:66;;29390:142;;;:::o;29538:75::-;29581:3;29602:5;29595:12;;29538:75;;;:::o;29619:269::-;29729:39;29760:7;29729:39;:::i;:::-;29790:91;29839:41;29863:16;29839:41;:::i;:::-;29831:6;29824:4;29818:11;29790:91;:::i;:::-;29784:4;29777:105;29695:193;29619:269;;;:::o;29894:73::-;29939:3;29894:73;:::o;29973:189::-;30050:32;;:::i;:::-;30091:65;30149:6;30141;30135:4;30091:65;:::i;:::-;30026:136;29973:189;;:::o;30168:186::-;30228:120;30245:3;30238:5;30235:14;30228:120;;;30299:39;30336:1;30329:5;30299:39;:::i;:::-;30272:1;30265:5;30261:13;30252:22;;30228:120;;;30168:186;;:::o;30360:543::-;30461:2;30456:3;30453:11;30450:446;;;30495:38;30527:5;30495:38;:::i;:::-;30579:29;30597:10;30579:29;:::i;:::-;30569:8;30565:44;30762:2;30750:10;30747:18;30744:49;;;30783:8;30768:23;;30744:49;30806:80;30862:22;30880:3;30862:22;:::i;:::-;30852:8;30848:37;30835:11;30806:80;:::i;:::-;30465:431;;30450:446;30360:543;;;:::o;30909:117::-;30963:8;31013:5;31007:4;31003:16;30982:37;;30909:117;;;;:::o;31032:169::-;31076:6;31109:51;31157:1;31153:6;31145:5;31142:1;31138:13;31109:51;:::i;:::-;31105:56;31190:4;31184;31180:15;31170:25;;31083:118;31032:169;;;;:::o;31206:295::-;31282:4;31428:29;31453:3;31447:4;31428:29;:::i;:::-;31420:37;;31490:3;31487:1;31483:11;31477:4;31474:21;31466:29;;31206:295;;;;:::o;31506:1395::-;31623:37;31656:3;31623:37;:::i;:::-;31725:18;31717:6;31714:30;31711:56;;;31747:18;;:::i;:::-;31711:56;31791:38;31823:4;31817:11;31791:38;:::i;:::-;31876:67;31936:6;31928;31922:4;31876:67;:::i;:::-;31970:1;31994:4;31981:17;;32026:2;32018:6;32015:14;32043:1;32038:618;;;;32700:1;32717:6;32714:77;;;32766:9;32761:3;32757:19;32751:26;32742:35;;32714:77;32817:67;32877:6;32870:5;32817:67;:::i;:::-;32811:4;32804:81;32673:222;32008:887;;32038:618;32090:4;32086:9;32078:6;32074:22;32124:37;32156:4;32124:37;:::i;:::-;32183:1;32197:208;32211:7;32208:1;32205:14;32197:208;;;32290:9;32285:3;32281:19;32275:26;32267:6;32260:42;32341:1;32333:6;32329:14;32319:24;;32388:2;32377:9;32373:18;32360:31;;32234:4;32231:1;32227:12;32222:17;;32197:208;;;32433:6;32424:7;32421:19;32418:179;;;32491:9;32486:3;32482:19;32476:26;32534:48;32576:4;32568:6;32564:17;32553:9;32534:48;:::i;:::-;32526:6;32519:64;32441:156;32418:179;32643:1;32639;32631:6;32627:14;32623:22;32617:4;32610:36;32045:611;;;32008:887;;31598:1303;;;31506:1395;;:::o;32907:160::-;33047:12;33043:1;33035:6;33031:14;33024:36;32907:160;:::o;33073:366::-;33215:3;33236:67;33300:2;33295:3;33236:67;:::i;:::-;33229:74;;33312:93;33401:3;33312:93;:::i;:::-;33430:2;33425:3;33421:12;33414:19;;33073:366;;;:::o;33445:419::-;33611:4;33649:2;33638:9;33634:18;33626:26;;33698:9;33692:4;33688:20;33684:1;33673:9;33669:17;33662:47;33726:131;33852:4;33726:131;:::i;:::-;33718:139;;33445:419;;;:::o;33870:178::-;34010:30;34006:1;33998:6;33994:14;33987:54;33870:178;:::o;34054:366::-;34196:3;34217:67;34281:2;34276:3;34217:67;:::i;:::-;34210:74;;34293:93;34382:3;34293:93;:::i;:::-;34411:2;34406:3;34402:12;34395:19;;34054:366;;;:::o;34426:419::-;34592:4;34630:2;34619:9;34615:18;34607:26;;34679:9;34673:4;34669:20;34665:1;34654:9;34650:17;34643:47;34707:131;34833:4;34707:131;:::i;:::-;34699:139;;34426:419;;;:::o;34851:229::-;34991:34;34987:1;34979:6;34975:14;34968:58;35060:12;35055:2;35047:6;35043:15;35036:37;34851:229;:::o;35086:366::-;35228:3;35249:67;35313:2;35308:3;35249:67;:::i;:::-;35242:74;;35325:93;35414:3;35325:93;:::i;:::-;35443:2;35438:3;35434:12;35427:19;;35086:366;;;:::o;35458:419::-;35624:4;35662:2;35651:9;35647:18;35639:26;;35711:9;35705:4;35701:20;35697:1;35686:9;35682:17;35675:47;35739:131;35865:4;35739:131;:::i;:::-;35731:139;;35458:419;;;:::o;35883:143::-;35940:5;35971:6;35965:13;35956:22;;35987:33;36014:5;35987:33;:::i;:::-;35883:143;;;;:::o;36032:351::-;36102:6;36151:2;36139:9;36130:7;36126:23;36122:32;36119:119;;;36157:79;;:::i;:::-;36119:119;36277:1;36302:64;36358:7;36349:6;36338:9;36334:22;36302:64;:::i;:::-;36292:74;;36248:128;36032:351;;;;:::o;36389:234::-;36529:34;36525:1;36517:6;36513:14;36506:58;36598:17;36593:2;36585:6;36581:15;36574:42;36389:234;:::o;36629:366::-;36771:3;36792:67;36856:2;36851:3;36792:67;:::i;:::-;36785:74;;36868:93;36957:3;36868:93;:::i;:::-;36986:2;36981:3;36977:12;36970:19;;36629:366;;;:::o;37001:419::-;37167:4;37205:2;37194:9;37190:18;37182:26;;37254:9;37248:4;37244:20;37240:1;37229:9;37225:17;37218:47;37282:131;37408:4;37282:131;:::i;:::-;37274:139;;37001:419;;;:::o;37426:148::-;37528:11;37565:3;37550:18;;37426:148;;;;:::o;37580:390::-;37686:3;37714:39;37747:5;37714:39;:::i;:::-;37769:89;37851:6;37846:3;37769:89;:::i;:::-;37762:96;;37867:65;37925:6;37920:3;37913:4;37906:5;37902:16;37867:65;:::i;:::-;37957:6;37952:3;37948:16;37941:23;;37690:280;37580:390;;;;:::o;37976:435::-;38156:3;38178:95;38269:3;38260:6;38178:95;:::i;:::-;38171:102;;38290:95;38381:3;38372:6;38290:95;:::i;:::-;38283:102;;38402:3;38395:10;;37976:435;;;;;:::o;38441:874::-;38544:3;38581:5;38575:12;38610:36;38636:9;38610:36;:::i;:::-;38662:89;38744:6;38739:3;38662:89;:::i;:::-;38655:96;;38782:1;38771:9;38767:17;38798:1;38793:166;;;;38973:1;38968:341;;;;38760:549;;38793:166;38877:4;38873:9;38862;38858:25;38853:3;38846:38;38939:6;38932:14;38925:22;38917:6;38913:35;38908:3;38904:45;38897:52;;38793:166;;38968:341;39035:38;39067:5;39035:38;:::i;:::-;39095:1;39109:154;39123:6;39120:1;39117:13;39109:154;;;39197:7;39191:14;39187:1;39182:3;39178:11;39171:35;39247:1;39238:7;39234:15;39223:26;;39145:4;39142:1;39138:12;39133:17;;39109:154;;;39292:6;39287:3;39283:16;39276:23;;38975:334;;38760:549;;38548:767;;38441:874;;;;:::o;39321:589::-;39546:3;39568:95;39659:3;39650:6;39568:95;:::i;:::-;39561:102;;39680:95;39771:3;39762:6;39680:95;:::i;:::-;39673:102;;39792:92;39880:3;39871:6;39792:92;:::i;:::-;39785:99;;39901:3;39894:10;;39321:589;;;;;;:::o;39916:168::-;40056:20;40052:1;40044:6;40040:14;40033:44;39916:168;:::o;40090:366::-;40232:3;40253:67;40317:2;40312:3;40253:67;:::i;:::-;40246:74;;40329:93;40418:3;40329:93;:::i;:::-;40447:2;40442:3;40438:12;40431:19;;40090:366;;;:::o;40462:419::-;40628:4;40666:2;40655:9;40651:18;40643:26;;40715:9;40709:4;40705:20;40701:1;40690:9;40686:17;40679:47;40743:131;40869:4;40743:131;:::i;:::-;40735:139;;40462:419;;;:::o;40887:225::-;41027:34;41023:1;41015:6;41011:14;41004:58;41096:8;41091:2;41083:6;41079:15;41072:33;40887:225;:::o;41118:366::-;41260:3;41281:67;41345:2;41340:3;41281:67;:::i;:::-;41274:74;;41357:93;41446:3;41357:93;:::i;:::-;41475:2;41470:3;41466:12;41459:19;;41118:366;;;:::o;41490:419::-;41656:4;41694:2;41683:9;41679:18;41671:26;;41743:9;41737:4;41733:20;41729:1;41718:9;41714:17;41707:47;41771:131;41897:4;41771:131;:::i;:::-;41763:139;;41490:419;;;:::o;41915:179::-;42055:31;42051:1;42043:6;42039:14;42032:55;41915:179;:::o;42100:366::-;42242:3;42263:67;42327:2;42322:3;42263:67;:::i;:::-;42256:74;;42339:93;42428:3;42339:93;:::i;:::-;42457:2;42452:3;42448:12;42441:19;;42100:366;;;:::o;42472:419::-;42638:4;42676:2;42665:9;42661:18;42653:26;;42725:9;42719:4;42715:20;42711:1;42700:9;42696:17;42689:47;42753:131;42879:4;42753:131;:::i;:::-;42745:139;;42472:419;;;:::o;42897:147::-;42998:11;43035:3;43020:18;;42897:147;;;;:::o;43050:114::-;;:::o;43170:398::-;43329:3;43350:83;43431:1;43426:3;43350:83;:::i;:::-;43343:90;;43442:93;43531:3;43442:93;:::i;:::-;43560:1;43555:3;43551:11;43544:18;;43170:398;;;:::o;43574:379::-;43758:3;43780:147;43923:3;43780:147;:::i;:::-;43773:154;;43944:3;43937:10;;43574:379;;;:::o;43959:245::-;44099:34;44095:1;44087:6;44083:14;44076:58;44168:28;44163:2;44155:6;44151:15;44144:53;43959:245;:::o;44210:366::-;44352:3;44373:67;44437:2;44432:3;44373:67;:::i;:::-;44366:74;;44449:93;44538:3;44449:93;:::i;:::-;44567:2;44562:3;44558:12;44551:19;;44210:366;;;:::o;44582:419::-;44748:4;44786:2;44775:9;44771:18;44763:26;;44835:9;44829:4;44825:20;44821:1;44810:9;44806:17;44799:47;44863:131;44989:4;44863:131;:::i;:::-;44855:139;;44582:419;;;:::o;45007:182::-;45147:34;45143:1;45135:6;45131:14;45124:58;45007:182;:::o;45195:366::-;45337:3;45358:67;45422:2;45417:3;45358:67;:::i;:::-;45351:74;;45434:93;45523:3;45434:93;:::i;:::-;45552:2;45547:3;45543:12;45536:19;;45195:366;;;:::o;45567:419::-;45733:4;45771:2;45760:9;45756:18;45748:26;;45820:9;45814:4;45810:20;45806:1;45795:9;45791:17;45784:47;45848:131;45974:4;45848:131;:::i;:::-;45840:139;;45567:419;;;:::o;45992:180::-;46040:77;46037:1;46030:88;46137:4;46134:1;46127:15;46161:4;46158:1;46151:15;46178:185;46218:1;46235:20;46253:1;46235:20;:::i;:::-;46230:25;;46269:20;46287:1;46269:20;:::i;:::-;46264:25;;46308:1;46298:35;;46313:18;;:::i;:::-;46298:35;46355:1;46352;46348:9;46343:14;;46178:185;;;;:::o;46369:194::-;46409:4;46429:20;46447:1;46429:20;:::i;:::-;46424:25;;46463:20;46481:1;46463:20;:::i;:::-;46458:25;;46507:1;46504;46500:9;46492:17;;46531:1;46525:4;46522:11;46519:37;;;46536:18;;:::i;:::-;46519:37;46369:194;;;;:::o;46569:98::-;46620:6;46654:5;46648:12;46638:22;;46569:98;;;:::o;46673:168::-;46756:11;46790:6;46785:3;46778:19;46830:4;46825:3;46821:14;46806:29;;46673:168;;;;:::o;46847:373::-;46933:3;46961:38;46993:5;46961:38;:::i;:::-;47015:70;47078:6;47073:3;47015:70;:::i;:::-;47008:77;;47094:65;47152:6;47147:3;47140:4;47133:5;47129:16;47094:65;:::i;:::-;47184:29;47206:6;47184:29;:::i;:::-;47179:3;47175:39;47168:46;;46937:283;46847:373;;;;:::o;47226:640::-;47421:4;47459:3;47448:9;47444:19;47436:27;;47473:71;47541:1;47530:9;47526:17;47517:6;47473:71;:::i;:::-;47554:72;47622:2;47611:9;47607:18;47598:6;47554:72;:::i;:::-;47636;47704:2;47693:9;47689:18;47680:6;47636:72;:::i;:::-;47755:9;47749:4;47745:20;47740:2;47729:9;47725:18;47718:48;47783:76;47854:4;47845:6;47783:76;:::i;:::-;47775:84;;47226:640;;;;;;;:::o;47872:141::-;47928:5;47959:6;47953:13;47944:22;;47975:32;48001:5;47975:32;:::i;:::-;47872:141;;;;:::o;48019:349::-;48088:6;48137:2;48125:9;48116:7;48112:23;48108:32;48105:119;;;48143:79;;:::i;:::-;48105:119;48263:1;48288:63;48343:7;48334:6;48323:9;48319:22;48288:63;:::i;:::-;48278:73;;48234:127;48019:349;;;;:::o;48374:176::-;48406:1;48423:20;48441:1;48423:20;:::i;:::-;48418:25;;48457:20;48475:1;48457:20;:::i;:::-;48452:25;;48496:1;48486:35;;48501:18;;:::i;:::-;48486:35;48542:1;48539;48535:9;48530:14;;48374:176;;;;:::o;48556:94::-;48589:8;48637:5;48633:2;48629:14;48608:35;;48556:94;;;:::o;48656:::-;48695:7;48724:20;48738:5;48724:20;:::i;:::-;48713:31;;48656:94;;;:::o;48756:100::-;48795:7;48824:26;48844:5;48824:26;:::i;:::-;48813:37;;48756:100;;;:::o;48862:157::-;48967:45;48987:24;49005:5;48987:24;:::i;:::-;48967:45;:::i;:::-;48962:3;48955:58;48862:157;;:::o;49025:256::-;49137:3;49152:75;49223:3;49214:6;49152:75;:::i;:::-;49252:2;49247:3;49243:12;49236:19;;49272:3;49265:10;;49025:256;;;;:::o;49287:137::-;49341:5;49372:6;49366:13;49357:22;;49388:30;49412:5;49388:30;:::i;:::-;49287:137;;;;:::o;49430:345::-;49497:6;49546:2;49534:9;49525:7;49521:23;49517:32;49514:119;;;49552:79;;:::i;:::-;49514:119;49672:1;49697:61;49750:7;49741:6;49730:9;49726:22;49697:61;:::i;:::-;49687:71;;49643:125;49430:345;;;;:::o;49781:229::-;49921:34;49917:1;49909:6;49905:14;49898:58;49990:12;49985:2;49977:6;49973:15;49966:37;49781:229;:::o;50016:366::-;50158:3;50179:67;50243:2;50238:3;50179:67;:::i;:::-;50172:74;;50255:93;50344:3;50255:93;:::i;:::-;50373:2;50368:3;50364:12;50357:19;;50016:366;;;:::o;50388:419::-;50554:4;50592:2;50581:9;50577:18;50569:26;;50641:9;50635:4;50631:20;50627:1;50616:9;50612:17;50605:47;50669:131;50795:4;50669:131;:::i;:::-;50661:139;;50388:419;;;:::o;50813:225::-;50953:34;50949:1;50941:6;50937:14;50930:58;51022:8;51017:2;51009:6;51005:15;50998:33;50813:225;:::o;51044:366::-;51186:3;51207:67;51271:2;51266:3;51207:67;:::i;:::-;51200:74;;51283:93;51372:3;51283:93;:::i;:::-;51401:2;51396:3;51392:12;51385:19;;51044:366;;;:::o;51416:419::-;51582:4;51620:2;51609:9;51605:18;51597:26;;51669:9;51663:4;51659:20;51655:1;51644:9;51640:17;51633:47;51697:131;51823:4;51697:131;:::i;:::-;51689:139;;51416:419;;;:::o;51841:179::-;51981:31;51977:1;51969:6;51965:14;51958:55;51841:179;:::o;52026:366::-;52168:3;52189:67;52253:2;52248:3;52189:67;:::i;:::-;52182:74;;52265:93;52354:3;52265:93;:::i;:::-;52383:2;52378:3;52374:12;52367:19;;52026:366;;;:::o;52398:419::-;52564:4;52602:2;52591:9;52587:18;52579:26;;52651:9;52645:4;52641:20;52637:1;52626:9;52622:17;52615:47;52679:131;52805:4;52679:131;:::i;:::-;52671:139;;52398:419;;;:::o;52823:386::-;52927:3;52955:38;52987:5;52955:38;:::i;:::-;53009:88;53090:6;53085:3;53009:88;:::i;:::-;53002:95;;53106:65;53164:6;53159:3;53152:4;53145:5;53141:16;53106:65;:::i;:::-;53196:6;53191:3;53187:16;53180:23;;52931:278;52823:386;;;;:::o;53215:271::-;53345:3;53367:93;53456:3;53447:6;53367:93;:::i;:::-;53360:100;;53477:3;53470:10;;53215:271;;;;:::o

Swarm Source

ipfs://8fac62ed9c1de6f14fe302caf2f737941e1cbc18354480e15a5f0d52f973fa46
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.