ETH Price: $3,264.35 (+0.10%)
Gas: 1 Gwei

Token

Dirty Taco NFT (DT)
 

Overview

Max Total Supply

333 DT

Holders

154

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 DT
0x4e33ff1df47246080234ee37b64a205471c34d88
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Dirty Taco and Tequila NFT is a collection of 3000 Taco themed NFTs.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DirtyTacoNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-14
*/

// SPDX-License-Identifier: MIT


pragma solidity ^0.8.0; 

abstract contract ReentrancyGuard { 
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
   _status = _ENTERED;

        _;
        _status = _NOT_ENTERED;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
 
    function toString(uint256 value) internal pure returns (string memory) { 
        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);
    }
 
    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);
    }
 
    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);
    }
}
 
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
 
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    function owner() public view virtual returns (address) {
        return _owner;
    } 
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
 
library Address { 
    function isContract(address account) internal view returns (bool) { 
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    } 
    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");
    }
 
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    } 
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
 
    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");
    }
 
    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);
    } 
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
 
    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);
    }
 
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
 
    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);
    }
 
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else { 
            if (returndata.length > 0) { 

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
 
interface IERC721Receiver { 
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
 
interface IERC165 { 
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
 
abstract contract ERC165 is IERC165 { 
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
} 
interface IERC721 is IERC165 { 
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); 
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); 
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved); 
    function balanceOf(address owner) external view returns (uint256 balance); 
    function ownerOf(uint256 tokenId) external view returns (address owner); 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external; 
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external; 
    function approve(address to, uint256 tokenId) external;
 
    function getApproved(uint256 tokenId) external view returns (address operator); 
    function setApprovalForAll(address operator, bool _approved) external; 
    function isApprovedForAll(address owner, address operator) external view returns (bool); 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
} 
interface IERC721Enumerable is IERC721 { 
    function totalSupply() external view returns (uint256); 
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); 
    function tokenByIndex(uint256 index) external view returns (uint256);
}  
interface IERC721Metadata is IERC721 { 
    function name() external view returns (string memory); 
    function symbol() external view returns (string memory); 
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    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;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

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

    // The number of tokens burned.
    uint256 internal _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 _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * 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 See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

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

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].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 {
        _addressData[owner].aux = aux;
    }

    /**
     * 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) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // 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.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

    /**
     * @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, tokenId.toString())) : '';
    }

    /**
     * @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 See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

    /**
     * @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 == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), 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.isContract() && !_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 && !_ownerships[tokenId].burned;
    }

    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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) 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 {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

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

            if (safe && to.isContract()) {
                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 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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // 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 {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is 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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // 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 {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        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 Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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 IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == 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 {}
}

contract DirtyTacoNFT is Ownable, ERC721A, ReentrancyGuard {
    using Strings for uint256;


  uint256 public MAX_PER_Transtion = 10; // maximam amount that user can mint

    uint256 public  PRICE = 0.16 ether; 

  uint256 private constant TotalCollectionSize_ = 3000; // total number of nfts
  uint256 private constant MaxMintPerBatch_ = 10; //max mint per traction


  string private _baseTokenURI;
  uint public reserve = 0;


  uint public status = 0; //0-pause 1-public

  constructor() ERC721A("Dirty Taco NFT","DT") {
  }

  modifier callerIsUser() {
    require(tx.origin == msg.sender, "The caller is another contract");
    _;
  }
 
  function mint(uint256 quantity) external payable callerIsUser {
    require(status == 1 , "Sale is not Active");
    require(totalSupply() + quantity <= TotalCollectionSize_-reserve, "reached max supply");
    require(quantity <= MAX_PER_Transtion,"can not mint this many");
    require(msg.value >= PRICE * quantity, "Need to send more ETH.");
    _safeMint(msg.sender, quantity);
  }

   function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
    string memory baseURI = _baseURI();
    return
      bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, "/", tokenId.toString(), ".json")) : "";
        
  }

  function setBaseURI(string memory baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }
  function _baseURI() internal view virtual override returns (string memory) {
    return _baseTokenURI;
  }
  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }
  function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
  {
    return _ownershipOf(tokenId);
  }

  function withdrawMoney() external onlyOwner nonReentrant {
    (bool success, ) = msg.sender.call{value: address(this).balance}("");
    require(success, "Transfer failed.");
  }

  function changeMintPrice(uint256 _newPrice) external onlyOwner
  {
      PRICE = _newPrice;
  }
  function changeMAX_PER_Transtion(uint256 q) external onlyOwner
  {
      MAX_PER_Transtion = q;
  }

  function setStatus(uint256 s)external onlyOwner{
      status = s;
  }

   function getStatus()public view returns(uint){
      return status;
  }

 function setReserveTokens(uint256 _quantity) public onlyOwner {
        reserve=_quantity;
    }
    
  function getPrice(uint256 _quantity) public view returns (uint256) {
       
        return _quantity*PRICE;
    }

 function mintReserveTokens(uint quantity) public onlyOwner {
        require(quantity <= reserve, "The quantity exceeds the reserve.");
        reserve -= quantity;
        _safeMint(msg.sender, quantity);

    }

  function airdrop(address a, uint q)public onlyOwner{
    require(totalSupply() + q <= TotalCollectionSize_, "reached max supply");
    require(q <= MAX_PER_Transtion,"can not mint this many");
    _safeMint(a, q);
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"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"},{"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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_Transtion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"},{"internalType":"uint256","name":"q","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"changeMAX_PER_Transtion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changeMintPrice","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintReserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"setReserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"s","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a80556702386f26fc100000600b556000600d556000600e553480156200002b57600080fd5b506040518060400160405280600e81526020017f4469727479205461636f204e46540000000000000000000000000000000000008152506040518060400160405280600281526020017f4454000000000000000000000000000000000000000000000000000000000000815250620000b8620000ac6200011060201b60201c565b6200011860201b60201c565b8160039080519060200190620000d0929190620001e5565b508060049080519060200190620000e9929190620001e5565b50620000fa620001dc60201b60201c565b60018190555050506001600981905550620002fa565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b828054620001f39062000295565b90600052602060002090601f01602090048101928262000217576000855562000263565b82601f106200023257805160ff191683800117855562000263565b8280016001018555821562000263579182015b828111156200026257825182559160200191906001019062000245565b5b50905062000272919062000276565b5090565b5b808211156200029157600081600090555060010162000277565b5090565b60006002820490506001821680620002ae57607f821691505b60208210811415620002c557620002c4620002cb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613d7f806200030a6000396000f3fe6080604052600436106101f95760003560e01c80638ba4cc3c1161010d578063af7b26e9116100a0578063d04950a11161006f578063d04950a1146106fa578063dc33e68114610725578063e757223014610762578063e985e9c51461079f578063f2fde38b146107dc576101f9565b8063af7b26e914610640578063b88d4fde14610669578063c87b56dd14610692578063cd3293de146106cf576101f9565b806395d89b41116100dc57806395d89b41146105b9578063a0712d68146105e4578063a22cb46514610600578063ac44600214610629576101f9565b80638ba4cc3c146104fd5780638d859f3e146105265780638da5cb5b146105515780639231ab2a1461057c576101f9565b80633fd17366116101905780636352211e1161015f5780636352211e1461041a57806369ba1a75146104575780636a44e1731461048057806370a08231146104a9578063715018a6146104e6576101f9565b80633fd173661461037457806342842e0e1461039d5780634e69d560146103c657806355f804b3146103f1576101f9565b806318160ddd116101cc57806318160ddd146102cc578063200d2ed2146102f757806323b872dd14610322578063288bd8fd1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612f40565b610805565b60405161023291906133ef565b60405180910390f35b34801561024757600080fd5b506102506108e7565b60405161025d919061340a565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190612fe3565b610979565b60405161029a9190613388565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190612f00565b6109f5565b005b3480156102d857600080fd5b506102e1610b00565b6040516102ee91906135a7565b60405180910390f35b34801561030357600080fd5b5061030c610b17565b60405161031991906135a7565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190612dea565b610b1d565b005b34801561035757600080fd5b50610372600480360381019061036d9190612fe3565b610b2d565b005b34801561038057600080fd5b5061039b60048036038101906103969190612fe3565b610c14565b005b3480156103a957600080fd5b506103c460048036038101906103bf9190612dea565b610c9a565b005b3480156103d257600080fd5b506103db610cba565b6040516103e891906135a7565b60405180910390f35b3480156103fd57600080fd5b5061041860048036038101906104139190612f9a565b610cc4565b005b34801561042657600080fd5b50610441600480360381019061043c9190612fe3565b610d5a565b60405161044e9190613388565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190612fe3565b610d70565b005b34801561048c57600080fd5b506104a760048036038101906104a29190612fe3565b610df6565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190612d7d565b610e7c565b6040516104dd91906135a7565b60405180910390f35b3480156104f257600080fd5b506104fb610f4c565b005b34801561050957600080fd5b50610524600480360381019061051f9190612f00565b610fd4565b005b34801561053257600080fd5b5061053b6110fa565b60405161054891906135a7565b60405180910390f35b34801561055d57600080fd5b50610566611100565b6040516105739190613388565b60405180910390f35b34801561058857600080fd5b506105a3600480360381019061059e9190612fe3565b611129565b6040516105b0919061358c565b60405180910390f35b3480156105c557600080fd5b506105ce611141565b6040516105db919061340a565b60405180910390f35b6105fe60048036038101906105f99190612fe3565b6111d3565b005b34801561060c57600080fd5b5061062760048036038101906106229190612ec0565b61138c565b005b34801561063557600080fd5b5061063e611504565b005b34801561064c57600080fd5b5061066760048036038101906106629190612fe3565b611685565b005b34801561067557600080fd5b50610690600480360381019061068b9190612e3d565b61170b565b005b34801561069e57600080fd5b506106b960048036038101906106b49190612fe3565b611787565b6040516106c6919061340a565b60405180910390f35b3480156106db57600080fd5b506106e461182e565b6040516106f191906135a7565b60405180910390f35b34801561070657600080fd5b5061070f611834565b60405161071c91906135a7565b60405180910390f35b34801561073157600080fd5b5061074c60048036038101906107479190612d7d565b61183a565b60405161075991906135a7565b60405180910390f35b34801561076e57600080fd5b5061078960048036038101906107849190612fe3565b61184c565b60405161079691906135a7565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190612daa565b611863565b6040516107d391906133ef565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe9190612d7d565b6118f7565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108d057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108e057506108df826119ef565b5b9050919050565b6060600380546108f690613876565b80601f016020809104026020016040519081016040528092919081815260200182805461092290613876565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050905090565b600061098482611a59565b6109ba576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a0082610d5a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a68576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a87611aa7565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ab95750610ab781610ab2611aa7565b611863565b155b15610af0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610afb838383611aaf565b505050565b6000610b0a611b61565b6002546001540303905090565b600e5481565b610b28838383611b6a565b505050565b610b35611aa7565b73ffffffffffffffffffffffffffffffffffffffff16610b53611100565b73ffffffffffffffffffffffffffffffffffffffff1614610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba0906134cc565b60405180910390fd5b600d54811115610bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be59061344c565b60405180910390fd5b80600d6000828254610c009190613778565b92505081905550610c113382612020565b50565b610c1c611aa7565b73ffffffffffffffffffffffffffffffffffffffff16610c3a611100565b73ffffffffffffffffffffffffffffffffffffffff1614610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c87906134cc565b60405180910390fd5b80600b8190555050565b610cb58383836040518060200160405280600081525061170b565b505050565b6000600e54905090565b610ccc611aa7565b73ffffffffffffffffffffffffffffffffffffffff16610cea611100565b73ffffffffffffffffffffffffffffffffffffffff1614610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d37906134cc565b60405180910390fd5b80600c9080519060200190610d56929190612b4e565b5050565b6000610d658261203e565b600001519050919050565b610d78611aa7565b73ffffffffffffffffffffffffffffffffffffffff16610d96611100565b73ffffffffffffffffffffffffffffffffffffffff1614610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de3906134cc565b60405180910390fd5b80600e8190555050565b610dfe611aa7565b73ffffffffffffffffffffffffffffffffffffffff16610e1c611100565b73ffffffffffffffffffffffffffffffffffffffff1614610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e69906134cc565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ee4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610f54611aa7565b73ffffffffffffffffffffffffffffffffffffffff16610f72611100565b73ffffffffffffffffffffffffffffffffffffffff1614610fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbf906134cc565b60405180910390fd5b610fd260006122cd565b565b610fdc611aa7565b73ffffffffffffffffffffffffffffffffffffffff16610ffa611100565b73ffffffffffffffffffffffffffffffffffffffff1614611050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611047906134cc565b60405180910390fd5b610bb88161105c610b00565b6110669190613697565b11156110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e906134ac565b60405180910390fd5b600a548111156110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e39061354c565b60405180910390fd5b6110f68282612020565b5050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611131612bd4565b61113a8261203e565b9050919050565b60606004805461115090613876565b80601f016020809104026020016040519081016040528092919081815260200182805461117c90613876565b80156111c95780601f1061119e576101008083540402835291602001916111c9565b820191906000526020600020905b8154815290600101906020018083116111ac57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611241576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112389061348c565b60405180910390fd5b6001600e5414611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d9061346c565b60405180910390fd5b600d54610bb86112969190613778565b8161129f610b00565b6112a99190613697565b11156112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e1906134ac565b60405180910390fd5b600a5481111561132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061354c565b60405180910390fd5b80600b5461133d919061371e565b34101561137f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113769061352c565b60405180910390fd5b6113893382612020565b50565b611394611aa7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113f9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611406611aa7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114b3611aa7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114f891906133ef565b60405180910390a35050565b61150c611aa7565b73ffffffffffffffffffffffffffffffffffffffff1661152a611100565b73ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611577906134cc565b60405180910390fd5b600260095414156115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd9061356c565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516115f490613373565b60006040518083038185875af1925050503d8060008114611631576040519150601f19603f3d011682016040523d82523d6000602084013e611636565b606091505b505090508061167a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116719061350c565b60405180910390fd5b506001600981905550565b61168d611aa7565b73ffffffffffffffffffffffffffffffffffffffff166116ab611100565b73ffffffffffffffffffffffffffffffffffffffff1614611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f8906134cc565b60405180910390fd5b80600a8190555050565b611716848484611b6a565b6117358373ffffffffffffffffffffffffffffffffffffffff16612391565b801561174a5750611748848484846123a4565b155b15611781576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061179282611a59565b6117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c8906134ec565b60405180910390fd5b60006117db612504565b905060008151116117fb5760405180602001604052806000815250611826565b8061180584612596565b604051602001611816929190613339565b6040516020818303038152906040525b915050919050565b600d5481565b600a5481565b6000611845826126f7565b9050919050565b6000600b548261185c919061371e565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118ff611aa7565b73ffffffffffffffffffffffffffffffffffffffff1661191d611100565b73ffffffffffffffffffffffffffffffffffffffff1614611973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196a906134cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da9061342c565b60405180910390fd5b6119ec816122cd565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611a64611b61565b11158015611a73575060015482105b8015611aa0575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611b758261203e565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611be0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611c01611aa7565b73ffffffffffffffffffffffffffffffffffffffff161480611c305750611c2f85611c2a611aa7565b611863565b5b80611c755750611c3e611aa7565b73ffffffffffffffffffffffffffffffffffffffff16611c5d84610979565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611cae576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611d15576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d228585856001612761565b611d2e60008487611aaf565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611fae576001548214611fad57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120198585856001612767565b5050505050565b61203a82826040518060200160405280600081525061276d565b5050565b612046612bd4565b600082905080612054611b61565b11158015612063575060015481105b15612296576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161229457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121785780925050506122c8565b5b60011561229357818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461228e5780925050506122c8565b612179565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123ca611aa7565b8786866040518563ffffffff1660e01b81526004016123ec94939291906133a3565b602060405180830381600087803b15801561240657600080fd5b505af192505050801561243757506040513d601f19601f820116820180604052508101906124349190612f6d565b60015b6124b1573d8060008114612467576040519150601f19603f3d011682016040523d82523d6000602084013e61246c565b606091505b506000815114156124a9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c805461251390613876565b80601f016020809104026020016040519081016040528092919081815260200182805461253f90613876565b801561258c5780601f106125615761010080835404028352916020019161258c565b820191906000526020600020905b81548152906001019060200180831161256f57829003601f168201915b5050505050905090565b606060008214156125de576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126f2565b600082905060005b600082146126105780806125f9906138d9565b915050600a8261260991906136ed565b91506125e6565b60008167ffffffffffffffff81111561262c5761262b613a0f565b5b6040519080825280601f01601f19166020018201604052801561265e5781602001600182028036833780820191505090505b5090505b600085146126eb576001826126779190613778565b9150600a856126869190613922565b60306126929190613697565b60f81b8183815181106126a8576126a76139e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126e491906136ed565b9450612662565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b61277a838383600161277f565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156127ed576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612828576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128356000868387612761565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156129ff57506129fe8773ffffffffffffffffffffffffffffffffffffffff16612391565b5b15612ac5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a7460008884806001019550886123a4565b612aaa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612a05578260015414612ac057600080fd5b612b31565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612ac6575b816001819055505050612b476000868387612767565b5050505050565b828054612b5a90613876565b90600052602060002090601f016020900481019282612b7c5760008555612bc3565b82601f10612b9557805160ff1916838001178555612bc3565b82800160010185558215612bc3579182015b82811115612bc2578251825591602001919060010190612ba7565b5b509050612bd09190612c17565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612c30576000816000905550600101612c18565b5090565b6000612c47612c42846135e7565b6135c2565b905082815260208101848484011115612c6357612c62613a43565b5b612c6e848285613834565b509392505050565b6000612c89612c8484613618565b6135c2565b905082815260208101848484011115612ca557612ca4613a43565b5b612cb0848285613834565b509392505050565b600081359050612cc781613ced565b92915050565b600081359050612cdc81613d04565b92915050565b600081359050612cf181613d1b565b92915050565b600081519050612d0681613d1b565b92915050565b600082601f830112612d2157612d20613a3e565b5b8135612d31848260208601612c34565b91505092915050565b600082601f830112612d4f57612d4e613a3e565b5b8135612d5f848260208601612c76565b91505092915050565b600081359050612d7781613d32565b92915050565b600060208284031215612d9357612d92613a4d565b5b6000612da184828501612cb8565b91505092915050565b60008060408385031215612dc157612dc0613a4d565b5b6000612dcf85828601612cb8565b9250506020612de085828601612cb8565b9150509250929050565b600080600060608486031215612e0357612e02613a4d565b5b6000612e1186828701612cb8565b9350506020612e2286828701612cb8565b9250506040612e3386828701612d68565b9150509250925092565b60008060008060808587031215612e5757612e56613a4d565b5b6000612e6587828801612cb8565b9450506020612e7687828801612cb8565b9350506040612e8787828801612d68565b925050606085013567ffffffffffffffff811115612ea857612ea7613a48565b5b612eb487828801612d0c565b91505092959194509250565b60008060408385031215612ed757612ed6613a4d565b5b6000612ee585828601612cb8565b9250506020612ef685828601612ccd565b9150509250929050565b60008060408385031215612f1757612f16613a4d565b5b6000612f2585828601612cb8565b9250506020612f3685828601612d68565b9150509250929050565b600060208284031215612f5657612f55613a4d565b5b6000612f6484828501612ce2565b91505092915050565b600060208284031215612f8357612f82613a4d565b5b6000612f9184828501612cf7565b91505092915050565b600060208284031215612fb057612faf613a4d565b5b600082013567ffffffffffffffff811115612fce57612fcd613a48565b5b612fda84828501612d3a565b91505092915050565b600060208284031215612ff957612ff8613a4d565b5b600061300784828501612d68565b91505092915050565b613019816137ac565b82525050565b613028816137ac565b82525050565b613037816137be565b82525050565b613046816137be565b82525050565b600061305782613649565b613061818561365f565b9350613071818560208601613843565b61307a81613a52565b840191505092915050565b600061309082613654565b61309a818561367b565b93506130aa818560208601613843565b6130b381613a52565b840191505092915050565b60006130c982613654565b6130d3818561368c565b93506130e3818560208601613843565b80840191505092915050565b60006130fc60268361367b565b915061310782613a63565b604082019050919050565b600061311f60218361367b565b915061312a82613ab2565b604082019050919050565b600061314260128361367b565b915061314d82613b01565b602082019050919050565b6000613165601e8361367b565b915061317082613b2a565b602082019050919050565b600061318860128361367b565b915061319382613b53565b602082019050919050565b60006131ab60058361368c565b91506131b682613b7c565b600582019050919050565b60006131ce60208361367b565b91506131d982613ba5565b602082019050919050565b60006131f1602f8361367b565b91506131fc82613bce565b604082019050919050565b6000613214600083613670565b915061321f82613c1d565b600082019050919050565b600061323760108361367b565b915061324282613c20565b602082019050919050565b600061325a60168361367b565b915061326582613c49565b602082019050919050565b600061327d60168361367b565b915061328882613c72565b602082019050919050565b60006132a0601f8361367b565b91506132ab82613c9b565b602082019050919050565b60006132c360018361368c565b91506132ce82613cc4565b600182019050919050565b6060820160008201516132ef6000850182613010565b506020820151613302602085018261332a565b506040820151613315604085018261302e565b50505050565b61332481613816565b82525050565b61333381613820565b82525050565b600061334582856130be565b9150613350826132b6565b915061335c82846130be565b91506133678261319e565b91508190509392505050565b600061337e82613207565b9150819050919050565b600060208201905061339d600083018461301f565b92915050565b60006080820190506133b8600083018761301f565b6133c5602083018661301f565b6133d2604083018561331b565b81810360608301526133e4818461304c565b905095945050505050565b6000602082019050613404600083018461303d565b92915050565b600060208201905081810360008301526134248184613085565b905092915050565b60006020820190508181036000830152613445816130ef565b9050919050565b6000602082019050818103600083015261346581613112565b9050919050565b6000602082019050818103600083015261348581613135565b9050919050565b600060208201905081810360008301526134a581613158565b9050919050565b600060208201905081810360008301526134c58161317b565b9050919050565b600060208201905081810360008301526134e5816131c1565b9050919050565b60006020820190508181036000830152613505816131e4565b9050919050565b600060208201905081810360008301526135258161322a565b9050919050565b600060208201905081810360008301526135458161324d565b9050919050565b6000602082019050818103600083015261356581613270565b9050919050565b6000602082019050818103600083015261358581613293565b9050919050565b60006060820190506135a160008301846132d9565b92915050565b60006020820190506135bc600083018461331b565b92915050565b60006135cc6135dd565b90506135d882826138a8565b919050565b6000604051905090565b600067ffffffffffffffff82111561360257613601613a0f565b5b61360b82613a52565b9050602081019050919050565b600067ffffffffffffffff82111561363357613632613a0f565b5b61363c82613a52565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006136a282613816565b91506136ad83613816565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136e2576136e1613953565b5b828201905092915050565b60006136f882613816565b915061370383613816565b92508261371357613712613982565b5b828204905092915050565b600061372982613816565b915061373483613816565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561376d5761376c613953565b5b828202905092915050565b600061378382613816565b915061378e83613816565b9250828210156137a1576137a0613953565b5b828203905092915050565b60006137b7826137f6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613861578082015181840152602081019050613846565b83811115613870576000848401525b50505050565b6000600282049050600182168061388e57607f821691505b602082108114156138a2576138a16139b1565b5b50919050565b6138b182613a52565b810181811067ffffffffffffffff821117156138d0576138cf613a0f565b5b80604052505050565b60006138e482613816565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561391757613916613953565b5b600182019050919050565b600061392d82613816565b915061393883613816565b92508261394857613947613982565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546865207175616e74697479206578636565647320746865207265736572766560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b613cf6816137ac565b8114613d0157600080fd5b50565b613d0d816137be565b8114613d1857600080fd5b50565b613d24816137ca565b8114613d2f57600080fd5b50565b613d3b81613816565b8114613d4657600080fd5b5056fea2646970667358221220b25c66e49c30645e6c3b729e08fa9e36fded303c568b377ee00bfb6a6e0fa21864736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101f95760003560e01c80638ba4cc3c1161010d578063af7b26e9116100a0578063d04950a11161006f578063d04950a1146106fa578063dc33e68114610725578063e757223014610762578063e985e9c51461079f578063f2fde38b146107dc576101f9565b8063af7b26e914610640578063b88d4fde14610669578063c87b56dd14610692578063cd3293de146106cf576101f9565b806395d89b41116100dc57806395d89b41146105b9578063a0712d68146105e4578063a22cb46514610600578063ac44600214610629576101f9565b80638ba4cc3c146104fd5780638d859f3e146105265780638da5cb5b146105515780639231ab2a1461057c576101f9565b80633fd17366116101905780636352211e1161015f5780636352211e1461041a57806369ba1a75146104575780636a44e1731461048057806370a08231146104a9578063715018a6146104e6576101f9565b80633fd173661461037457806342842e0e1461039d5780634e69d560146103c657806355f804b3146103f1576101f9565b806318160ddd116101cc57806318160ddd146102cc578063200d2ed2146102f757806323b872dd14610322578063288bd8fd1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612f40565b610805565b60405161023291906133ef565b60405180910390f35b34801561024757600080fd5b506102506108e7565b60405161025d919061340a565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190612fe3565b610979565b60405161029a9190613388565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190612f00565b6109f5565b005b3480156102d857600080fd5b506102e1610b00565b6040516102ee91906135a7565b60405180910390f35b34801561030357600080fd5b5061030c610b17565b60405161031991906135a7565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190612dea565b610b1d565b005b34801561035757600080fd5b50610372600480360381019061036d9190612fe3565b610b2d565b005b34801561038057600080fd5b5061039b60048036038101906103969190612fe3565b610c14565b005b3480156103a957600080fd5b506103c460048036038101906103bf9190612dea565b610c9a565b005b3480156103d257600080fd5b506103db610cba565b6040516103e891906135a7565b60405180910390f35b3480156103fd57600080fd5b5061041860048036038101906104139190612f9a565b610cc4565b005b34801561042657600080fd5b50610441600480360381019061043c9190612fe3565b610d5a565b60405161044e9190613388565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190612fe3565b610d70565b005b34801561048c57600080fd5b506104a760048036038101906104a29190612fe3565b610df6565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190612d7d565b610e7c565b6040516104dd91906135a7565b60405180910390f35b3480156104f257600080fd5b506104fb610f4c565b005b34801561050957600080fd5b50610524600480360381019061051f9190612f00565b610fd4565b005b34801561053257600080fd5b5061053b6110fa565b60405161054891906135a7565b60405180910390f35b34801561055d57600080fd5b50610566611100565b6040516105739190613388565b60405180910390f35b34801561058857600080fd5b506105a3600480360381019061059e9190612fe3565b611129565b6040516105b0919061358c565b60405180910390f35b3480156105c557600080fd5b506105ce611141565b6040516105db919061340a565b60405180910390f35b6105fe60048036038101906105f99190612fe3565b6111d3565b005b34801561060c57600080fd5b5061062760048036038101906106229190612ec0565b61138c565b005b34801561063557600080fd5b5061063e611504565b005b34801561064c57600080fd5b5061066760048036038101906106629190612fe3565b611685565b005b34801561067557600080fd5b50610690600480360381019061068b9190612e3d565b61170b565b005b34801561069e57600080fd5b506106b960048036038101906106b49190612fe3565b611787565b6040516106c6919061340a565b60405180910390f35b3480156106db57600080fd5b506106e461182e565b6040516106f191906135a7565b60405180910390f35b34801561070657600080fd5b5061070f611834565b60405161071c91906135a7565b60405180910390f35b34801561073157600080fd5b5061074c60048036038101906107479190612d7d565b61183a565b60405161075991906135a7565b60405180910390f35b34801561076e57600080fd5b5061078960048036038101906107849190612fe3565b61184c565b60405161079691906135a7565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190612daa565b611863565b6040516107d391906133ef565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe9190612d7d565b6118f7565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108d057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108e057506108df826119ef565b5b9050919050565b6060600380546108f690613876565b80601f016020809104026020016040519081016040528092919081815260200182805461092290613876565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050905090565b600061098482611a59565b6109ba576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a0082610d5a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a68576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a87611aa7565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ab95750610ab781610ab2611aa7565b611863565b155b15610af0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610afb838383611aaf565b505050565b6000610b0a611b61565b6002546001540303905090565b600e5481565b610b28838383611b6a565b505050565b610b35611aa7565b73ffffffffffffffffffffffffffffffffffffffff16610b53611100565b73ffffffffffffffffffffffffffffffffffffffff1614610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba0906134cc565b60405180910390fd5b600d54811115610bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be59061344c565b60405180910390fd5b80600d6000828254610c009190613778565b92505081905550610c113382612020565b50565b610c1c611aa7565b73ffffffffffffffffffffffffffffffffffffffff16610c3a611100565b73ffffffffffffffffffffffffffffffffffffffff1614610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c87906134cc565b60405180910390fd5b80600b8190555050565b610cb58383836040518060200160405280600081525061170b565b505050565b6000600e54905090565b610ccc611aa7565b73ffffffffffffffffffffffffffffffffffffffff16610cea611100565b73ffffffffffffffffffffffffffffffffffffffff1614610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d37906134cc565b60405180910390fd5b80600c9080519060200190610d56929190612b4e565b5050565b6000610d658261203e565b600001519050919050565b610d78611aa7565b73ffffffffffffffffffffffffffffffffffffffff16610d96611100565b73ffffffffffffffffffffffffffffffffffffffff1614610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de3906134cc565b60405180910390fd5b80600e8190555050565b610dfe611aa7565b73ffffffffffffffffffffffffffffffffffffffff16610e1c611100565b73ffffffffffffffffffffffffffffffffffffffff1614610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e69906134cc565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ee4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610f54611aa7565b73ffffffffffffffffffffffffffffffffffffffff16610f72611100565b73ffffffffffffffffffffffffffffffffffffffff1614610fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbf906134cc565b60405180910390fd5b610fd260006122cd565b565b610fdc611aa7565b73ffffffffffffffffffffffffffffffffffffffff16610ffa611100565b73ffffffffffffffffffffffffffffffffffffffff1614611050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611047906134cc565b60405180910390fd5b610bb88161105c610b00565b6110669190613697565b11156110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e906134ac565b60405180910390fd5b600a548111156110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e39061354c565b60405180910390fd5b6110f68282612020565b5050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611131612bd4565b61113a8261203e565b9050919050565b60606004805461115090613876565b80601f016020809104026020016040519081016040528092919081815260200182805461117c90613876565b80156111c95780601f1061119e576101008083540402835291602001916111c9565b820191906000526020600020905b8154815290600101906020018083116111ac57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611241576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112389061348c565b60405180910390fd5b6001600e5414611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d9061346c565b60405180910390fd5b600d54610bb86112969190613778565b8161129f610b00565b6112a99190613697565b11156112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e1906134ac565b60405180910390fd5b600a5481111561132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061354c565b60405180910390fd5b80600b5461133d919061371e565b34101561137f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113769061352c565b60405180910390fd5b6113893382612020565b50565b611394611aa7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113f9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611406611aa7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114b3611aa7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114f891906133ef565b60405180910390a35050565b61150c611aa7565b73ffffffffffffffffffffffffffffffffffffffff1661152a611100565b73ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611577906134cc565b60405180910390fd5b600260095414156115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd9061356c565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516115f490613373565b60006040518083038185875af1925050503d8060008114611631576040519150601f19603f3d011682016040523d82523d6000602084013e611636565b606091505b505090508061167a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116719061350c565b60405180910390fd5b506001600981905550565b61168d611aa7565b73ffffffffffffffffffffffffffffffffffffffff166116ab611100565b73ffffffffffffffffffffffffffffffffffffffff1614611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f8906134cc565b60405180910390fd5b80600a8190555050565b611716848484611b6a565b6117358373ffffffffffffffffffffffffffffffffffffffff16612391565b801561174a5750611748848484846123a4565b155b15611781576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061179282611a59565b6117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c8906134ec565b60405180910390fd5b60006117db612504565b905060008151116117fb5760405180602001604052806000815250611826565b8061180584612596565b604051602001611816929190613339565b6040516020818303038152906040525b915050919050565b600d5481565b600a5481565b6000611845826126f7565b9050919050565b6000600b548261185c919061371e565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118ff611aa7565b73ffffffffffffffffffffffffffffffffffffffff1661191d611100565b73ffffffffffffffffffffffffffffffffffffffff1614611973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196a906134cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da9061342c565b60405180910390fd5b6119ec816122cd565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611a64611b61565b11158015611a73575060015482105b8015611aa0575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611b758261203e565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611be0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611c01611aa7565b73ffffffffffffffffffffffffffffffffffffffff161480611c305750611c2f85611c2a611aa7565b611863565b5b80611c755750611c3e611aa7565b73ffffffffffffffffffffffffffffffffffffffff16611c5d84610979565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611cae576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611d15576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d228585856001612761565b611d2e60008487611aaf565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611fae576001548214611fad57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120198585856001612767565b5050505050565b61203a82826040518060200160405280600081525061276d565b5050565b612046612bd4565b600082905080612054611b61565b11158015612063575060015481105b15612296576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161229457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121785780925050506122c8565b5b60011561229357818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461228e5780925050506122c8565b612179565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123ca611aa7565b8786866040518563ffffffff1660e01b81526004016123ec94939291906133a3565b602060405180830381600087803b15801561240657600080fd5b505af192505050801561243757506040513d601f19601f820116820180604052508101906124349190612f6d565b60015b6124b1573d8060008114612467576040519150601f19603f3d011682016040523d82523d6000602084013e61246c565b606091505b506000815114156124a9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c805461251390613876565b80601f016020809104026020016040519081016040528092919081815260200182805461253f90613876565b801561258c5780601f106125615761010080835404028352916020019161258c565b820191906000526020600020905b81548152906001019060200180831161256f57829003601f168201915b5050505050905090565b606060008214156125de576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126f2565b600082905060005b600082146126105780806125f9906138d9565b915050600a8261260991906136ed565b91506125e6565b60008167ffffffffffffffff81111561262c5761262b613a0f565b5b6040519080825280601f01601f19166020018201604052801561265e5781602001600182028036833780820191505090505b5090505b600085146126eb576001826126779190613778565b9150600a856126869190613922565b60306126929190613697565b60f81b8183815181106126a8576126a76139e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126e491906136ed565b9450612662565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b61277a838383600161277f565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156127ed576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612828576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128356000868387612761565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156129ff57506129fe8773ffffffffffffffffffffffffffffffffffffffff16612391565b5b15612ac5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a7460008884806001019550886123a4565b612aaa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612a05578260015414612ac057600080fd5b612b31565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612ac6575b816001819055505050612b476000868387612767565b5050505050565b828054612b5a90613876565b90600052602060002090601f016020900481019282612b7c5760008555612bc3565b82601f10612b9557805160ff1916838001178555612bc3565b82800160010185558215612bc3579182015b82811115612bc2578251825591602001919060010190612ba7565b5b509050612bd09190612c17565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612c30576000816000905550600101612c18565b5090565b6000612c47612c42846135e7565b6135c2565b905082815260208101848484011115612c6357612c62613a43565b5b612c6e848285613834565b509392505050565b6000612c89612c8484613618565b6135c2565b905082815260208101848484011115612ca557612ca4613a43565b5b612cb0848285613834565b509392505050565b600081359050612cc781613ced565b92915050565b600081359050612cdc81613d04565b92915050565b600081359050612cf181613d1b565b92915050565b600081519050612d0681613d1b565b92915050565b600082601f830112612d2157612d20613a3e565b5b8135612d31848260208601612c34565b91505092915050565b600082601f830112612d4f57612d4e613a3e565b5b8135612d5f848260208601612c76565b91505092915050565b600081359050612d7781613d32565b92915050565b600060208284031215612d9357612d92613a4d565b5b6000612da184828501612cb8565b91505092915050565b60008060408385031215612dc157612dc0613a4d565b5b6000612dcf85828601612cb8565b9250506020612de085828601612cb8565b9150509250929050565b600080600060608486031215612e0357612e02613a4d565b5b6000612e1186828701612cb8565b9350506020612e2286828701612cb8565b9250506040612e3386828701612d68565b9150509250925092565b60008060008060808587031215612e5757612e56613a4d565b5b6000612e6587828801612cb8565b9450506020612e7687828801612cb8565b9350506040612e8787828801612d68565b925050606085013567ffffffffffffffff811115612ea857612ea7613a48565b5b612eb487828801612d0c565b91505092959194509250565b60008060408385031215612ed757612ed6613a4d565b5b6000612ee585828601612cb8565b9250506020612ef685828601612ccd565b9150509250929050565b60008060408385031215612f1757612f16613a4d565b5b6000612f2585828601612cb8565b9250506020612f3685828601612d68565b9150509250929050565b600060208284031215612f5657612f55613a4d565b5b6000612f6484828501612ce2565b91505092915050565b600060208284031215612f8357612f82613a4d565b5b6000612f9184828501612cf7565b91505092915050565b600060208284031215612fb057612faf613a4d565b5b600082013567ffffffffffffffff811115612fce57612fcd613a48565b5b612fda84828501612d3a565b91505092915050565b600060208284031215612ff957612ff8613a4d565b5b600061300784828501612d68565b91505092915050565b613019816137ac565b82525050565b613028816137ac565b82525050565b613037816137be565b82525050565b613046816137be565b82525050565b600061305782613649565b613061818561365f565b9350613071818560208601613843565b61307a81613a52565b840191505092915050565b600061309082613654565b61309a818561367b565b93506130aa818560208601613843565b6130b381613a52565b840191505092915050565b60006130c982613654565b6130d3818561368c565b93506130e3818560208601613843565b80840191505092915050565b60006130fc60268361367b565b915061310782613a63565b604082019050919050565b600061311f60218361367b565b915061312a82613ab2565b604082019050919050565b600061314260128361367b565b915061314d82613b01565b602082019050919050565b6000613165601e8361367b565b915061317082613b2a565b602082019050919050565b600061318860128361367b565b915061319382613b53565b602082019050919050565b60006131ab60058361368c565b91506131b682613b7c565b600582019050919050565b60006131ce60208361367b565b91506131d982613ba5565b602082019050919050565b60006131f1602f8361367b565b91506131fc82613bce565b604082019050919050565b6000613214600083613670565b915061321f82613c1d565b600082019050919050565b600061323760108361367b565b915061324282613c20565b602082019050919050565b600061325a60168361367b565b915061326582613c49565b602082019050919050565b600061327d60168361367b565b915061328882613c72565b602082019050919050565b60006132a0601f8361367b565b91506132ab82613c9b565b602082019050919050565b60006132c360018361368c565b91506132ce82613cc4565b600182019050919050565b6060820160008201516132ef6000850182613010565b506020820151613302602085018261332a565b506040820151613315604085018261302e565b50505050565b61332481613816565b82525050565b61333381613820565b82525050565b600061334582856130be565b9150613350826132b6565b915061335c82846130be565b91506133678261319e565b91508190509392505050565b600061337e82613207565b9150819050919050565b600060208201905061339d600083018461301f565b92915050565b60006080820190506133b8600083018761301f565b6133c5602083018661301f565b6133d2604083018561331b565b81810360608301526133e4818461304c565b905095945050505050565b6000602082019050613404600083018461303d565b92915050565b600060208201905081810360008301526134248184613085565b905092915050565b60006020820190508181036000830152613445816130ef565b9050919050565b6000602082019050818103600083015261346581613112565b9050919050565b6000602082019050818103600083015261348581613135565b9050919050565b600060208201905081810360008301526134a581613158565b9050919050565b600060208201905081810360008301526134c58161317b565b9050919050565b600060208201905081810360008301526134e5816131c1565b9050919050565b60006020820190508181036000830152613505816131e4565b9050919050565b600060208201905081810360008301526135258161322a565b9050919050565b600060208201905081810360008301526135458161324d565b9050919050565b6000602082019050818103600083015261356581613270565b9050919050565b6000602082019050818103600083015261358581613293565b9050919050565b60006060820190506135a160008301846132d9565b92915050565b60006020820190506135bc600083018461331b565b92915050565b60006135cc6135dd565b90506135d882826138a8565b919050565b6000604051905090565b600067ffffffffffffffff82111561360257613601613a0f565b5b61360b82613a52565b9050602081019050919050565b600067ffffffffffffffff82111561363357613632613a0f565b5b61363c82613a52565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006136a282613816565b91506136ad83613816565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136e2576136e1613953565b5b828201905092915050565b60006136f882613816565b915061370383613816565b92508261371357613712613982565b5b828204905092915050565b600061372982613816565b915061373483613816565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561376d5761376c613953565b5b828202905092915050565b600061378382613816565b915061378e83613816565b9250828210156137a1576137a0613953565b5b828203905092915050565b60006137b7826137f6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613861578082015181840152602081019050613846565b83811115613870576000848401525b50505050565b6000600282049050600182168061388e57607f821691505b602082108114156138a2576138a16139b1565b5b50919050565b6138b182613a52565b810181811067ffffffffffffffff821117156138d0576138cf613a0f565b5b80604052505050565b60006138e482613816565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561391757613916613953565b5b600182019050919050565b600061392d82613816565b915061393883613816565b92508261394857613947613982565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546865207175616e74697479206578636565647320746865207265736572766560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b613cf6816137ac565b8114613d0157600080fd5b50565b613d0d816137be565b8114613d1857600080fd5b50565b613d24816137ca565b8114613d2f57600080fd5b50565b613d3b81613816565b8114613d4657600080fd5b5056fea2646970667358221220b25c66e49c30645e6c3b729e08fa9e36fded303c568b377ee00bfb6a6e0fa21864736f6c63430008070033

Deployed Bytecode Sourcemap

30346:3146:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12601:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15714:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17217:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16780:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11850:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30796:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18082:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33043:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32446:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18323:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32735:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31780:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15522:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32656:72;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32813:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12970:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2632:103;;;;;;;;;;;;;:::i;:::-;;33266:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30529:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2409:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32105:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15883:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31019:391;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17493:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32259:181;;;;;;;;;;;;;:::i;:::-;;32548:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18579:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31417:357;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30764:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30446:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31994:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32921:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17851:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2744:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12601:305;12703:4;12755:25;12740:40;;;:11;:40;;;;:105;;;;12812:33;12797:48;;;:11;:48;;;;12740:105;:158;;;;12862:36;12886:11;12862:23;:36::i;:::-;12740:158;12720:178;;12601:305;;;:::o;15714:100::-;15768:13;15801:5;15794:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15714:100;:::o;17217:204::-;17285:7;17310:16;17318:7;17310;:16::i;:::-;17305:64;;17335:34;;;;;;;;;;;;;;17305:64;17389:15;:24;17405:7;17389:24;;;;;;;;;;;;;;;;;;;;;17382:31;;17217:204;;;:::o;16780:371::-;16853:13;16869:24;16885:7;16869:15;:24::i;:::-;16853:40;;16914:5;16908:11;;:2;:11;;;16904:48;;;16928:24;;;;;;;;;;;;;;16904:48;16985:5;16969:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;16995:37;17012:5;17019:12;:10;:12::i;:::-;16995:16;:37::i;:::-;16994:38;16969:63;16965:138;;;17056:35;;;;;;;;;;;;;;16965:138;17115:28;17124:2;17128:7;17137:5;17115:8;:28::i;:::-;16842:309;16780:371;;:::o;11850:303::-;11894:7;12119:15;:13;:15::i;:::-;12104:12;;12088:13;;:28;:46;12081:53;;11850:303;:::o;30796:22::-;;;;:::o;18082:170::-;18216:28;18226:4;18232:2;18236:7;18216:9;:28::i;:::-;18082:170;;;:::o;33043:217::-;2554:12;:10;:12::i;:::-;2543:23;;:7;:5;:7::i;:::-;:23;;;2535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33133:7:::1;;33121:8;:19;;33113:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33200:8;33189:7;;:19;;;;;;;:::i;:::-;;;;;;;;33219:31;33229:10;33241:8;33219:9;:31::i;:::-;33043:217:::0;:::o;32446:98::-;2554:12;:10;:12::i;:::-;2543:23;;:7;:5;:7::i;:::-;:23;;;2535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32529:9:::1;32521:5;:17;;;;32446:98:::0;:::o;18323:185::-;18461:39;18478:4;18484:2;18488:7;18461:39;;;;;;;;;;;;:16;:39::i;:::-;18323:185;;;:::o;32735:73::-;32775:4;32796:6;;32789:13;;32735:73;:::o;31780:98::-;2554:12;:10;:12::i;:::-;2543:23;;:7;:5;:7::i;:::-;:23;;;2535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31865:7:::1;31849:13;:23;;;;;;;;;;;;:::i;:::-;;31780:98:::0;:::o;15522:125::-;15586:7;15613:21;15626:7;15613:12;:21::i;:::-;:26;;;15606:33;;15522:125;;;:::o;32656:72::-;2554:12;:10;:12::i;:::-;2543:23;;:7;:5;:7::i;:::-;:23;;;2535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32721:1:::1;32712:6;:10;;;;32656:72:::0;:::o;32813:98::-;2554:12;:10;:12::i;:::-;2543:23;;:7;:5;:7::i;:::-;:23;;;2535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32894:9:::1;32886:7;:17;;;;32813:98:::0;:::o;12970:206::-;13034:7;13075:1;13058:19;;:5;:19;;;13054:60;;;13086:28;;;;;;;;;;;;;;13054:60;13140:12;:19;13153:5;13140:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;13132:36;;13125:43;;12970:206;;;:::o;2632:103::-;2554:12;:10;:12::i;:::-;2543:23;;:7;:5;:7::i;:::-;:23;;;2535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2697:30:::1;2724:1;2697:18;:30::i;:::-;2632:103::o:0;33266:221::-;2554:12;:10;:12::i;:::-;2543:23;;:7;:5;:7::i;:::-;:23;;;2535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30619:4:::1;33348:1;33332:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:41;;33324:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;33416:17;;33411:1;:22;;33403:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;33466:15;33476:1;33479;33466:9;:15::i;:::-;33266:221:::0;;:::o;30529:34::-;;;;:::o;2409:87::-;2455:7;2482:6;;;;;;;;;;;2475:13;;2409:87;:::o;32105:148::-;32186:21;;:::i;:::-;32226;32239:7;32226:12;:21::i;:::-;32219:28;;32105:148;;;:::o;15883:104::-;15939:13;15972:7;15965:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15883:104;:::o;31019:391::-;30953:10;30940:23;;:9;:23;;;30932:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31106:1:::1;31096:6;;:11;31088:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;31195:7;;30619:4;31174:28;;;;:::i;:::-;31162:8;31146:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:56;;31138:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;31252:17;;31240:8;:29;;31232:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31331:8;31323:5;;:16;;;;:::i;:::-;31310:9;:29;;31302:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31373:31;31383:10;31395:8;31373:9;:31::i;:::-;31019:391:::0;:::o;17493:287::-;17604:12;:10;:12::i;:::-;17592:24;;:8;:24;;;17588:54;;;17625:17;;;;;;;;;;;;;;17588:54;17700:8;17655:18;:32;17674:12;:10;:12::i;:::-;17655:32;;;;;;;;;;;;;;;:42;17688:8;17655:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;17753:8;17724:48;;17739:12;:10;:12::i;:::-;17724:48;;;17763:8;17724:48;;;;;;:::i;:::-;;;;;;;;17493:287;;:::o;32259:181::-;2554:12;:10;:12::i;:::-;2543:23;;:7;:5;:7::i;:::-;:23;;;2535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;191:1:::1;337:7;;:19;;329:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;191:1;398:7;:18;;;;32324:12:::2;32342:10;:15;;32365:21;32342:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32323:68;;;32406:7;32398:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;32316:124;147:1:::1;441:7;:22;;;;32259:181::o:0;32548:102::-;2554:12;:10;:12::i;:::-;2543:23;;:7;:5;:7::i;:::-;:23;;;2535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32643:1:::1;32623:17;:21;;;;32548:102:::0;:::o;18579:369::-;18746:28;18756:4;18762:2;18766:7;18746:9;:28::i;:::-;18789:15;:2;:13;;;:15::i;:::-;:76;;;;;18809:56;18840:4;18846:2;18850:7;18859:5;18809:30;:56::i;:::-;18808:57;18789:76;18785:156;;;18889:40;;;;;;;;;;;;;;18785:156;18579:369;;;;:::o;31417:357::-;31490:13;31520:16;31528:7;31520;:16::i;:::-;31512:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;31594:21;31618:10;:8;:10::i;:::-;31594:34;;31673:1;31655:7;31649:21;:25;:109;;;;;;;;;;;;;;;;;31710:7;31724:18;:7;:16;:18::i;:::-;31693:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31649:109;31635:123;;;31417:357;;;:::o;30764:23::-;;;;:::o;30446:37::-;;;;:::o;31994:107::-;32052:7;32075:20;32089:5;32075:13;:20::i;:::-;32068:27;;31994:107;;;:::o;32921:117::-;32979:7;33025:5;;33015:9;:15;;;;:::i;:::-;33008:22;;32921:117;;;:::o;17851:164::-;17948:4;17972:18;:25;17991:5;17972:25;;;;;;;;;;;;;;;:35;17998:8;17972:35;;;;;;;;;;;;;;;;;;;;;;;;;17965:42;;17851:164;;;;:::o;2744:201::-;2554:12;:10;:12::i;:::-;2543:23;;:7;:5;:7::i;:::-;:23;;;2535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2853:1:::1;2833:22;;:8;:22;;;;2825:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2909:28;2928:8;2909:18;:28::i;:::-;2744:201:::0;:::o;7062:157::-;7147:4;7186:25;7171:40;;;:11;:40;;;;7164:47;;7062:157;;;:::o;19203:174::-;19260:4;19303:7;19284:15;:13;:15::i;:::-;:26;;:53;;;;;19324:13;;19314:7;:23;19284:53;:85;;;;;19342:11;:20;19354:7;19342:20;;;;;;;;;;;:27;;;;;;;;;;;;19341:28;19284:85;19277:92;;19203:174;;;:::o;1952:98::-;2005:7;2032:10;2025:17;;1952:98;:::o;27360:196::-;27502:2;27475:15;:24;27491:7;27475:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;27540:7;27536:2;27520:28;;27529:5;27520:28;;;;;;;;;;;;27360:196;;;:::o;11624:92::-;11680:7;11707:1;11700:8;;11624:92;:::o;22303:2130::-;22418:35;22456:21;22469:7;22456:12;:21::i;:::-;22418:59;;22516:4;22494:26;;:13;:18;;;:26;;;22490:67;;22529:28;;;;;;;;;;;;;;22490:67;22570:22;22612:4;22596:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;22633:36;22650:4;22656:12;:10;:12::i;:::-;22633:16;:36::i;:::-;22596:73;:126;;;;22710:12;:10;:12::i;:::-;22686:36;;:20;22698:7;22686:11;:20::i;:::-;:36;;;22596:126;22570:153;;22741:17;22736:66;;22767:35;;;;;;;;;;;;;;22736:66;22831:1;22817:16;;:2;:16;;;22813:52;;;22842:23;;;;;;;;;;;;;;22813:52;22878:43;22900:4;22906:2;22910:7;22919:1;22878:21;:43::i;:::-;22986:35;23003:1;23007:7;23016:4;22986:8;:35::i;:::-;23347:1;23317:12;:18;23330:4;23317:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23391:1;23363:12;:16;23376:2;23363:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23409:31;23443:11;:20;23455:7;23443:20;;;;;;;;;;;23409:54;;23494:2;23478:8;:13;;;:18;;;;;;;;;;;;;;;;;;23544:15;23511:8;:23;;;:49;;;;;;;;;;;;;;;;;;23812:19;23844:1;23834:7;:11;23812:33;;23860:31;23894:11;:24;23906:11;23894:24;;;;;;;;;;;23860:58;;23962:1;23937:27;;:8;:13;;;;;;;;;;;;:27;;;23933:384;;;24147:13;;24132:11;:28;24128:174;;24201:4;24185:8;:13;;;:20;;;;;;;;;;;;;;;;;;24254:13;:28;;;24228:8;:23;;;:54;;;;;;;;;;;;;;;;;;24128:174;23933:384;23292:1036;;;24364:7;24360:2;24345:27;;24354:4;24345:27;;;;;;;;;;;;24383:42;24404:4;24410:2;24414:7;24423:1;24383:20;:42::i;:::-;22407:2026;;22303:2130;;;:::o;19385:104::-;19454:27;19464:2;19468:8;19454:27;;;;;;;;;;;;:9;:27::i;:::-;19385:104;;:::o;14351:1109::-;14413:21;;:::i;:::-;14447:12;14462:7;14447:22;;14530:4;14511:15;:13;:15::i;:::-;:23;;:47;;;;;14545:13;;14538:4;:20;14511:47;14507:886;;;14579:31;14613:11;:17;14625:4;14613:17;;;;;;;;;;;14579:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14654:9;:16;;;14649:729;;14725:1;14699:28;;:9;:14;;;:28;;;14695:101;;14763:9;14756:16;;;;;;14695:101;15098:261;15105:4;15098:261;;;15138:6;;;;;;;;15183:11;:17;15195:4;15183:17;;;;;;;;;;;15171:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15257:1;15231:28;;:9;:14;;;:28;;;15227:109;;15299:9;15292:16;;;;;;15227:109;15098:261;;;14649:729;14560:833;14507:886;15421:31;;;;;;;;;;;;;;14351:1109;;;;:::o;2954:191::-;3028:16;3047:6;;;;;;;;;;;3028:25;;3073:8;3064:6;;:17;;;;;;;;;;;;;;;;;;3128:8;3097:40;;3118:8;3097:40;;;;;;;;;;;;3017:128;2954:191;:::o;3177:197::-;3237:4;3255:12;3322:7;3310:20;3302:28;;3365:1;3358:4;:8;3351:15;;;3177:197;;;:::o;28048:667::-;28211:4;28248:2;28232:36;;;28269:12;:10;:12::i;:::-;28283:4;28289:7;28298:5;28232:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;28228:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28483:1;28466:6;:13;:18;28462:235;;;28512:40;;;;;;;;;;;;;;28462:235;28655:6;28649:13;28640:6;28636:2;28632:15;28625:38;28228:480;28361:45;;;28351:55;;;:6;:55;;;;28344:62;;;28048:667;;;;;;:::o;31882:108::-;31942:13;31971;31964:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31882:108;:::o;569:533::-;625:13;665:1;656:5;:10;652:53;;;683:10;;;;;;;;;;;;;;;;;;;;;652:53;715:12;730:5;715:20;;746:14;771:78;786:1;778:4;:9;771:78;;804:8;;;;;:::i;:::-;;;;835:2;827:10;;;;;:::i;:::-;;;771:78;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;909:154;925:1;916:5;:10;909:154;;953:1;943:11;;;;;:::i;:::-;;;1020:2;1012:5;:10;;;;:::i;:::-;999:2;:24;;;;:::i;:::-;986:39;;969:6;976;969:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1049:2;1040:11;;;;;:::i;:::-;;;909:154;;;1087:6;1073:21;;;;;569:533;;;;:::o;13258:137::-;13319:7;13354:12;:19;13367:5;13354:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;13346:41;;13339:48;;13258:137;;;:::o;29363:159::-;;;;;:::o;30181:158::-;;;;;:::o;19852:163::-;19975:32;19981:2;19985:8;19995:5;20002:4;19975:5;:32::i;:::-;19852:163;;;:::o;20274:1775::-;20413:20;20436:13;;20413:36;;20478:1;20464:16;;:2;:16;;;20460:48;;;20489:19;;;;;;;;;;;;;;20460:48;20535:1;20523:8;:13;20519:44;;;20545:18;;;;;;;;;;;;;;20519:44;20576:61;20606:1;20610:2;20614:12;20628:8;20576:21;:61::i;:::-;20949:8;20914:12;:16;20927:2;20914:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21013:8;20973:12;:16;20986:2;20973:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21072:2;21039:11;:25;21051:12;21039:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;21139:15;21089:11;:25;21101:12;21089:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;21172:20;21195:12;21172:35;;21222:11;21251:8;21236:12;:23;21222:37;;21280:4;:23;;;;;21288:15;:2;:13;;;:15::i;:::-;21280:23;21276:641;;;21324:314;21380:12;21376:2;21355:38;;21372:1;21355:38;;;;;;;;;;;;21421:69;21460:1;21464:2;21468:14;;;;;;21484:5;21421:30;:69::i;:::-;21416:174;;21526:40;;;;;;;;;;;;;;21416:174;21633:3;21617:12;:19;;21324:314;;21719:12;21702:13;;:29;21698:43;;21733:8;;;21698:43;21276:641;;;21782:120;21838:14;;;;;;21834:2;21813:40;;21830:1;21813:40;;;;;;;;;;;;21897:3;21881:12;:19;;21782:120;;21276:641;21947:12;21931:13;:28;;;;20889:1082;;21981:60;22010:1;22014:2;22018:12;22032:8;21981:20;:60::i;:::-;20402:1647;20274:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:108::-;7235:24;7253:5;7235:24;:::i;:::-;7230:3;7223:37;7158:108;;:::o;7272:118::-;7359:24;7377:5;7359:24;:::i;:::-;7354:3;7347:37;7272:118;;:::o;7396:99::-;7467:21;7482:5;7467:21;:::i;:::-;7462:3;7455:34;7396:99;;:::o;7501:109::-;7582:21;7597:5;7582:21;:::i;:::-;7577:3;7570:34;7501:109;;:::o;7616:360::-;7702:3;7730:38;7762:5;7730:38;:::i;:::-;7784:70;7847:6;7842:3;7784:70;:::i;:::-;7777:77;;7863:52;7908:6;7903:3;7896:4;7889:5;7885:16;7863:52;:::i;:::-;7940:29;7962:6;7940:29;:::i;:::-;7935:3;7931:39;7924:46;;7706:270;7616:360;;;;:::o;7982:364::-;8070:3;8098:39;8131:5;8098:39;:::i;:::-;8153:71;8217:6;8212:3;8153:71;:::i;:::-;8146:78;;8233:52;8278:6;8273:3;8266:4;8259:5;8255:16;8233:52;:::i;:::-;8310:29;8332:6;8310:29;:::i;:::-;8305:3;8301:39;8294:46;;8074:272;7982:364;;;;:::o;8352:377::-;8458:3;8486:39;8519:5;8486:39;:::i;:::-;8541:89;8623:6;8618:3;8541:89;:::i;:::-;8534:96;;8639:52;8684:6;8679:3;8672:4;8665:5;8661:16;8639:52;:::i;:::-;8716:6;8711:3;8707:16;8700:23;;8462:267;8352:377;;;;:::o;8735:366::-;8877:3;8898:67;8962:2;8957:3;8898:67;:::i;:::-;8891:74;;8974:93;9063:3;8974:93;:::i;:::-;9092:2;9087:3;9083:12;9076:19;;8735:366;;;:::o;9107:::-;9249:3;9270:67;9334:2;9329:3;9270:67;:::i;:::-;9263:74;;9346:93;9435:3;9346:93;:::i;:::-;9464:2;9459:3;9455:12;9448:19;;9107:366;;;:::o;9479:::-;9621:3;9642:67;9706:2;9701:3;9642:67;:::i;:::-;9635:74;;9718:93;9807:3;9718:93;:::i;:::-;9836:2;9831:3;9827:12;9820:19;;9479:366;;;:::o;9851:::-;9993:3;10014:67;10078:2;10073:3;10014:67;:::i;:::-;10007:74;;10090:93;10179:3;10090:93;:::i;:::-;10208:2;10203:3;10199:12;10192:19;;9851:366;;;:::o;10223:::-;10365:3;10386:67;10450:2;10445:3;10386:67;:::i;:::-;10379:74;;10462:93;10551:3;10462:93;:::i;:::-;10580:2;10575:3;10571:12;10564:19;;10223:366;;;:::o;10595:400::-;10755:3;10776:84;10858:1;10853:3;10776:84;:::i;:::-;10769:91;;10869:93;10958:3;10869:93;:::i;:::-;10987:1;10982:3;10978:11;10971:18;;10595:400;;;:::o;11001:366::-;11143:3;11164:67;11228:2;11223:3;11164:67;:::i;:::-;11157:74;;11240:93;11329:3;11240:93;:::i;:::-;11358:2;11353:3;11349:12;11342:19;;11001:366;;;:::o;11373:::-;11515:3;11536:67;11600:2;11595:3;11536:67;:::i;:::-;11529:74;;11612:93;11701:3;11612:93;:::i;:::-;11730:2;11725:3;11721:12;11714:19;;11373:366;;;:::o;11745:398::-;11904:3;11925:83;12006:1;12001:3;11925:83;:::i;:::-;11918:90;;12017:93;12106:3;12017:93;:::i;:::-;12135:1;12130:3;12126:11;12119:18;;11745:398;;;:::o;12149:366::-;12291:3;12312:67;12376:2;12371:3;12312:67;:::i;:::-;12305:74;;12388:93;12477:3;12388:93;:::i;:::-;12506:2;12501:3;12497:12;12490:19;;12149:366;;;:::o;12521:::-;12663:3;12684:67;12748:2;12743:3;12684:67;:::i;:::-;12677:74;;12760:93;12849:3;12760:93;:::i;:::-;12878:2;12873:3;12869:12;12862:19;;12521:366;;;:::o;12893:::-;13035:3;13056:67;13120:2;13115:3;13056:67;:::i;:::-;13049:74;;13132:93;13221:3;13132:93;:::i;:::-;13250:2;13245:3;13241:12;13234:19;;12893:366;;;:::o;13265:::-;13407:3;13428:67;13492:2;13487:3;13428:67;:::i;:::-;13421:74;;13504:93;13593:3;13504:93;:::i;:::-;13622:2;13617:3;13613:12;13606:19;;13265:366;;;:::o;13637:400::-;13797:3;13818:84;13900:1;13895:3;13818:84;:::i;:::-;13811:91;;13911:93;14000:3;13911:93;:::i;:::-;14029:1;14024:3;14020:11;14013:18;;13637:400;;;:::o;14113:697::-;14272:4;14267:3;14263:14;14359:4;14352:5;14348:16;14342:23;14378:63;14435:4;14430:3;14426:14;14412:12;14378:63;:::i;:::-;14287:164;14543:4;14536:5;14532:16;14526:23;14562:61;14617:4;14612:3;14608:14;14594:12;14562:61;:::i;:::-;14461:172;14717:4;14710:5;14706:16;14700:23;14736:57;14787:4;14782:3;14778:14;14764:12;14736:57;:::i;:::-;14643:160;14241:569;14113:697;;:::o;14816:118::-;14903:24;14921:5;14903:24;:::i;:::-;14898:3;14891:37;14816:118;;:::o;14940:105::-;15015:23;15032:5;15015:23;:::i;:::-;15010:3;15003:36;14940:105;;:::o;15051:967::-;15433:3;15455:95;15546:3;15537:6;15455:95;:::i;:::-;15448:102;;15567:148;15711:3;15567:148;:::i;:::-;15560:155;;15732:95;15823:3;15814:6;15732:95;:::i;:::-;15725:102;;15844:148;15988:3;15844:148;:::i;:::-;15837:155;;16009:3;16002:10;;15051:967;;;;;:::o;16024:379::-;16208:3;16230:147;16373:3;16230:147;:::i;:::-;16223:154;;16394:3;16387:10;;16024:379;;;:::o;16409:222::-;16502:4;16540:2;16529:9;16525:18;16517:26;;16553:71;16621:1;16610:9;16606:17;16597:6;16553:71;:::i;:::-;16409:222;;;;:::o;16637:640::-;16832:4;16870:3;16859:9;16855:19;16847:27;;16884:71;16952:1;16941:9;16937:17;16928:6;16884:71;:::i;:::-;16965:72;17033:2;17022:9;17018:18;17009:6;16965:72;:::i;:::-;17047;17115:2;17104:9;17100:18;17091:6;17047:72;:::i;:::-;17166:9;17160:4;17156:20;17151:2;17140:9;17136:18;17129:48;17194:76;17265:4;17256:6;17194:76;:::i;:::-;17186:84;;16637:640;;;;;;;:::o;17283:210::-;17370:4;17408:2;17397:9;17393:18;17385:26;;17421:65;17483:1;17472:9;17468:17;17459:6;17421:65;:::i;:::-;17283:210;;;;:::o;17499:313::-;17612:4;17650:2;17639:9;17635:18;17627:26;;17699:9;17693:4;17689:20;17685:1;17674:9;17670:17;17663:47;17727:78;17800:4;17791:6;17727:78;:::i;:::-;17719:86;;17499:313;;;;:::o;17818:419::-;17984:4;18022:2;18011:9;18007:18;17999:26;;18071:9;18065:4;18061:20;18057:1;18046:9;18042:17;18035:47;18099:131;18225:4;18099:131;:::i;:::-;18091:139;;17818:419;;;:::o;18243:::-;18409:4;18447:2;18436:9;18432:18;18424:26;;18496:9;18490:4;18486:20;18482:1;18471:9;18467:17;18460:47;18524:131;18650:4;18524:131;:::i;:::-;18516:139;;18243:419;;;:::o;18668:::-;18834:4;18872:2;18861:9;18857:18;18849:26;;18921:9;18915:4;18911:20;18907:1;18896:9;18892:17;18885:47;18949:131;19075:4;18949:131;:::i;:::-;18941:139;;18668:419;;;:::o;19093:::-;19259:4;19297:2;19286:9;19282:18;19274:26;;19346:9;19340:4;19336:20;19332:1;19321:9;19317:17;19310:47;19374:131;19500:4;19374:131;:::i;:::-;19366:139;;19093:419;;;:::o;19518:::-;19684:4;19722:2;19711:9;19707:18;19699:26;;19771:9;19765:4;19761:20;19757:1;19746:9;19742:17;19735:47;19799:131;19925:4;19799:131;:::i;:::-;19791:139;;19518:419;;;:::o;19943:::-;20109:4;20147:2;20136:9;20132:18;20124:26;;20196:9;20190:4;20186:20;20182:1;20171:9;20167:17;20160:47;20224:131;20350:4;20224:131;:::i;:::-;20216:139;;19943:419;;;:::o;20368:::-;20534:4;20572:2;20561:9;20557:18;20549:26;;20621:9;20615:4;20611:20;20607:1;20596:9;20592:17;20585:47;20649:131;20775:4;20649:131;:::i;:::-;20641:139;;20368:419;;;:::o;20793:::-;20959:4;20997:2;20986:9;20982:18;20974:26;;21046:9;21040:4;21036:20;21032:1;21021:9;21017:17;21010:47;21074:131;21200:4;21074:131;:::i;:::-;21066:139;;20793:419;;;:::o;21218:::-;21384:4;21422:2;21411:9;21407:18;21399:26;;21471:9;21465:4;21461:20;21457:1;21446:9;21442:17;21435:47;21499:131;21625:4;21499:131;:::i;:::-;21491:139;;21218:419;;;:::o;21643:::-;21809:4;21847:2;21836:9;21832:18;21824:26;;21896:9;21890:4;21886:20;21882:1;21871:9;21867:17;21860:47;21924:131;22050:4;21924:131;:::i;:::-;21916:139;;21643:419;;;:::o;22068:::-;22234:4;22272:2;22261:9;22257:18;22249:26;;22321:9;22315:4;22311:20;22307:1;22296:9;22292:17;22285:47;22349:131;22475:4;22349:131;:::i;:::-;22341:139;;22068:419;;;:::o;22493:346::-;22648:4;22686:2;22675:9;22671:18;22663:26;;22699:133;22829:1;22818:9;22814:17;22805:6;22699:133;:::i;:::-;22493:346;;;;:::o;22845:222::-;22938:4;22976:2;22965:9;22961:18;22953:26;;22989:71;23057:1;23046:9;23042:17;23033:6;22989:71;:::i;:::-;22845:222;;;;:::o;23073:129::-;23107:6;23134:20;;:::i;:::-;23124:30;;23163:33;23191:4;23183:6;23163:33;:::i;:::-;23073:129;;;:::o;23208:75::-;23241:6;23274:2;23268:9;23258:19;;23208:75;:::o;23289:307::-;23350:4;23440:18;23432:6;23429:30;23426:56;;;23462:18;;:::i;:::-;23426:56;23500:29;23522:6;23500:29;:::i;:::-;23492:37;;23584:4;23578;23574:15;23566:23;;23289:307;;;:::o;23602:308::-;23664:4;23754:18;23746:6;23743:30;23740:56;;;23776:18;;:::i;:::-;23740:56;23814:29;23836:6;23814:29;:::i;:::-;23806:37;;23898:4;23892;23888:15;23880:23;;23602:308;;;:::o;23916:98::-;23967:6;24001:5;23995:12;23985:22;;23916:98;;;:::o;24020:99::-;24072:6;24106:5;24100:12;24090:22;;24020:99;;;:::o;24125:168::-;24208:11;24242:6;24237:3;24230:19;24282:4;24277:3;24273:14;24258:29;;24125:168;;;;:::o;24299:147::-;24400:11;24437:3;24422:18;;24299:147;;;;:::o;24452:169::-;24536:11;24570:6;24565:3;24558:19;24610:4;24605:3;24601:14;24586:29;;24452:169;;;;:::o;24627:148::-;24729:11;24766:3;24751:18;;24627:148;;;;:::o;24781:305::-;24821:3;24840:20;24858:1;24840:20;:::i;:::-;24835:25;;24874:20;24892:1;24874:20;:::i;:::-;24869:25;;25028:1;24960:66;24956:74;24953:1;24950:81;24947:107;;;25034:18;;:::i;:::-;24947:107;25078:1;25075;25071:9;25064:16;;24781:305;;;;:::o;25092:185::-;25132:1;25149:20;25167:1;25149:20;:::i;:::-;25144:25;;25183:20;25201:1;25183:20;:::i;:::-;25178:25;;25222:1;25212:35;;25227:18;;:::i;:::-;25212:35;25269:1;25266;25262:9;25257:14;;25092:185;;;;:::o;25283:348::-;25323:7;25346:20;25364:1;25346:20;:::i;:::-;25341:25;;25380:20;25398:1;25380:20;:::i;:::-;25375:25;;25568:1;25500:66;25496:74;25493:1;25490:81;25485:1;25478:9;25471:17;25467:105;25464:131;;;25575:18;;:::i;:::-;25464:131;25623:1;25620;25616:9;25605:20;;25283:348;;;;:::o;25637:191::-;25677:4;25697:20;25715:1;25697:20;:::i;:::-;25692:25;;25731:20;25749:1;25731:20;:::i;:::-;25726:25;;25770:1;25767;25764:8;25761:34;;;25775:18;;:::i;:::-;25761:34;25820:1;25817;25813:9;25805:17;;25637:191;;;;:::o;25834:96::-;25871:7;25900:24;25918:5;25900:24;:::i;:::-;25889:35;;25834:96;;;:::o;25936:90::-;25970:7;26013:5;26006:13;25999:21;25988:32;;25936:90;;;:::o;26032:149::-;26068:7;26108:66;26101:5;26097:78;26086:89;;26032:149;;;:::o;26187:126::-;26224:7;26264:42;26257:5;26253:54;26242:65;;26187:126;;;:::o;26319:77::-;26356:7;26385:5;26374:16;;26319:77;;;:::o;26402:101::-;26438:7;26478:18;26471:5;26467:30;26456:41;;26402:101;;;:::o;26509:154::-;26593:6;26588:3;26583;26570:30;26655:1;26646:6;26641:3;26637:16;26630:27;26509:154;;;:::o;26669:307::-;26737:1;26747:113;26761:6;26758:1;26755:13;26747:113;;;26846:1;26841:3;26837:11;26831:18;26827:1;26822:3;26818:11;26811:39;26783:2;26780:1;26776:10;26771:15;;26747:113;;;26878:6;26875:1;26872:13;26869:101;;;26958:1;26949:6;26944:3;26940:16;26933:27;26869:101;26718:258;26669:307;;;:::o;26982:320::-;27026:6;27063:1;27057:4;27053:12;27043:22;;27110:1;27104:4;27100:12;27131:18;27121:81;;27187:4;27179:6;27175:17;27165:27;;27121:81;27249:2;27241:6;27238:14;27218:18;27215:38;27212:84;;;27268:18;;:::i;:::-;27212:84;27033:269;26982:320;;;:::o;27308:281::-;27391:27;27413:4;27391:27;:::i;:::-;27383:6;27379:40;27521:6;27509:10;27506:22;27485:18;27473:10;27470:34;27467:62;27464:88;;;27532:18;;:::i;:::-;27464:88;27572:10;27568:2;27561:22;27351:238;27308:281;;:::o;27595:233::-;27634:3;27657:24;27675:5;27657:24;:::i;:::-;27648:33;;27703:66;27696:5;27693:77;27690:103;;;27773:18;;:::i;:::-;27690:103;27820:1;27813:5;27809:13;27802:20;;27595:233;;;:::o;27834:176::-;27866:1;27883:20;27901:1;27883:20;:::i;:::-;27878:25;;27917:20;27935:1;27917:20;:::i;:::-;27912:25;;27956:1;27946:35;;27961:18;;:::i;:::-;27946:35;28002:1;27999;27995:9;27990:14;;27834:176;;;;:::o;28016:180::-;28064:77;28061:1;28054:88;28161:4;28158:1;28151:15;28185:4;28182:1;28175:15;28202:180;28250:77;28247:1;28240:88;28347:4;28344:1;28337:15;28371:4;28368:1;28361:15;28388:180;28436:77;28433:1;28426:88;28533:4;28530:1;28523:15;28557:4;28554:1;28547:15;28574:180;28622:77;28619:1;28612:88;28719:4;28716:1;28709:15;28743:4;28740:1;28733:15;28760:180;28808:77;28805:1;28798:88;28905:4;28902:1;28895:15;28929:4;28926:1;28919:15;28946:117;29055:1;29052;29045:12;29069:117;29178:1;29175;29168:12;29192:117;29301:1;29298;29291:12;29315:117;29424:1;29421;29414:12;29438:102;29479:6;29530:2;29526:7;29521:2;29514:5;29510:14;29506:28;29496:38;;29438:102;;;:::o;29546:225::-;29686:34;29682:1;29674:6;29670:14;29663:58;29755:8;29750:2;29742:6;29738:15;29731:33;29546:225;:::o;29777:220::-;29917:34;29913:1;29905:6;29901:14;29894:58;29986:3;29981:2;29973:6;29969:15;29962:28;29777:220;:::o;30003:168::-;30143:20;30139:1;30131:6;30127:14;30120:44;30003:168;:::o;30177:180::-;30317:32;30313:1;30305:6;30301:14;30294:56;30177:180;:::o;30363:168::-;30503:20;30499:1;30491:6;30487:14;30480:44;30363:168;:::o;30537:155::-;30677:7;30673:1;30665:6;30661:14;30654:31;30537:155;:::o;30698:182::-;30838:34;30834:1;30826:6;30822:14;30815:58;30698:182;:::o;30886:234::-;31026:34;31022:1;31014:6;31010:14;31003:58;31095:17;31090:2;31082:6;31078:15;31071:42;30886:234;:::o;31126:114::-;;:::o;31246:166::-;31386:18;31382:1;31374:6;31370:14;31363:42;31246:166;:::o;31418:172::-;31558:24;31554:1;31546:6;31542:14;31535:48;31418:172;:::o;31596:::-;31736:24;31732:1;31724:6;31720:14;31713:48;31596:172;:::o;31774:181::-;31914:33;31910:1;31902:6;31898:14;31891:57;31774:181;:::o;31961:151::-;32101:3;32097:1;32089:6;32085:14;32078:27;31961:151;:::o;32118:122::-;32191:24;32209:5;32191:24;:::i;:::-;32184:5;32181:35;32171:63;;32230:1;32227;32220:12;32171:63;32118:122;:::o;32246:116::-;32316:21;32331:5;32316:21;:::i;:::-;32309:5;32306:32;32296:60;;32352:1;32349;32342:12;32296:60;32246:116;:::o;32368:120::-;32440:23;32457:5;32440:23;:::i;:::-;32433:5;32430:34;32420:62;;32478:1;32475;32468:12;32420:62;32368:120;:::o;32494:122::-;32567:24;32585:5;32567:24;:::i;:::-;32560:5;32557:35;32547:63;;32606:1;32603;32596:12;32547:63;32494:122;:::o

Swarm Source

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