ETH Price: $3,423.85 (+4.50%)

Token

Shareholder (SHAREHOLDER)
 

Overview

Max Total Supply

50 SHAREHOLDER

Holders

21

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SHAREHOLDER
0x3c10674a9030e5c3784058b808e738c3cda0d51c
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SHAREHOLDER

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-26
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;


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

contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

    modifier onlyAllowedOperator() virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

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

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

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

    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

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

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

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) {
        return account.code.length > 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 {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

    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 MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
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 0;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     * @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) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        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) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        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) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        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 {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _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 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);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // 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[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, 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 {}
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address _account) external view returns (uint256);
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

contract SHAREHOLDER is ERC721A, Ownable, DefaultOperatorFilterer {

    using Strings for uint256;

    string public uriPrefix = "";
    string public uriSuffix = ".json";

    IERC20 public Token;

    uint256 public cost = 0.01 ether;
    uint256 public TokenCost = 5000 * 10**18;  //1000 Token

    bool public paused;

    uint256 public maxSupply = 50;  

    constructor() ERC721A("Shareholder", "SHAREHOLDER") {}

     modifier mintCompliance(uint256 _mintAmount) {
        require(totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded!");
        _;
    }

    modifier priceCompliance(uint256 _mintAmount) {
        require(msg.value >= cost * _mintAmount, "Insufficient funds!");
        _;
    }

    function publicMint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) priceCompliance(_mintAmount) {
        require(!paused,"Public Mint Paused!!");
        require(tx.origin == msg.sender,"Error: Invalid Caller!");
        _safeMint(msg.sender, _mintAmount);
    }

    function publicTokenMint(uint256 _mintAmount) public mintCompliance(_mintAmount){
        require(!paused,"Public Mint Paused!!");
        require(tx.origin == msg.sender,"Error: Invalid Caller!");
        uint subtotal = _mintAmount * TokenCost;
        Token.transferFrom(msg.sender, address(this), subtotal);
        _safeMint(msg.sender, _mintAmount);
    }

    function mintTeam(address _adr, uint256 _mintAmount) public mintCompliance(_mintAmount) onlyOwner {
        _safeMint(_adr, _mintAmount);
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = _startTokenId();
        uint256 ownedTokenIndex = 0;
        address latestOwnerAddress;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
            TokenOwnership memory ownership = _ownerships[currentTokenId];

            if (!ownership.burned && ownership.addr != address(0)) {
                latestOwnerAddress = ownership.addr;
            }

            if (latestOwnerAddress == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;

                ownedTokenIndex++;
            }

            currentTokenId++;
        }

        return ownedTokenIds;
    }

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

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

        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
            : '';
    }

    function enableDisableMint(bool _status) public onlyOwner {
        paused = _status;
    }

    function setCost(uint256 _newcost) public onlyOwner {
        cost = _newcost;
    }

    function setUriPrefix(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }

    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

    function setTokenMintPrice(uint _newPrice) external onlyOwner {
        TokenCost = _newPrice;
    }

    function setToken(address _token) external onlyOwner {
        Token = IERC20(_token);
    }

    function withdrawToken(address _token) external onlyOwner {
        uint balance = IERC20(_token).balanceOf(address(this));
        IERC20(_token).transfer(msg.sender,balance);
    }

    function withdraw() public onlyOwner {
        (bool os, ) = payable(msg.sender).call{value: address(this).balance}('');
        require(os);
    }

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

    // -------------------------  Opensea Royality Filter  -----------------------

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

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

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

    receive() external payable {}

}

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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"Token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TokenCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"enableDisableMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adr","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicTokenMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newcost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setTokenMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040819052600060808190526200001b91600991620002b6565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200004a91600a91620002b6565b50662386f26fc10000600c5569010f0cf064dd59200000600d556032600f553480156200007657600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600b81526020016a29b430b932b437b63232b960a91b8152506040518060400160405280600b81526020016a29a420a922a427a62222a960a91b8152508160029080519060200190620000ee929190620002b6565b50805162000104906003906020840190620002b6565b5050600160005550620001173362000264565b6daaeb6d7670e522a718067333cd4e3b156200025c578015620001aa57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200018b57600080fd5b505af1158015620001a0573d6000803e3d6000fd5b505050506200025c565b6001600160a01b03821615620001fb5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000170565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200024257600080fd5b505af115801562000257573d6000803e3d6000fd5b505050505b505062000399565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620002c4906200035c565b90600052602060002090601f016020900481019282620002e8576000855562000333565b82601f106200030357805160ff191683800117855562000333565b8280016001018555821562000333579182015b828111156200033357825182559160200191906001019062000316565b506200034192915062000345565b5090565b5b8082111562000341576000815560010162000346565b600181811c908216806200037157607f821691505b602082108114156200039357634e487b7160e01b600052602260045260246000fd5b50919050565b61250e80620003a96000396000f3fe6080604052600436106102135760003560e01c806362b99ad41161011857806395d89b41116100a0578063c24126761161006f578063c2412676146105e9578063c87b56dd14610609578063d5abeb0114610629578063e985e9c51461063f578063f2fde38b1461068857600080fd5b806395d89b4114610574578063a22cb46514610589578063a2dfe7b5146105a9578063b88d4fde146105c957600080fd5b8063715018a6116100e7578063715018a6146104e15780637ec4a659146104f657806389476069146105165780638da5cb5b1461053657806393f84cfe1461055457600080fd5b806362b99ad4146104765780636352211e1461048b5780636eee6274146104ab57806370a08231146104c157600080fd5b806323b872dd1161019b57806342842e0e1161016a57806342842e0e146103da578063438b6300146103fa57806344a0d68a146104275780635503a0e8146104475780635c975abb1461045c57600080fd5b806323b872dd146103725780632db11544146103925780633005a790146103a55780633ccfd60b146103c557600080fd5b80630ff8ea80116101e25780630ff8ea80146102d057806313faede6146102f0578063144fa6d71461031457806316ba10e01461033457806318160ddd1461035457600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae57600080fd5b3661021a57005b600080fd5b34801561022b57600080fd5b5061023f61023a3660046120c8565b6106a8565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106fa565b60405161024b91906122ee565b34801561028257600080fd5b5061029661029136600461214b565b61078c565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102ce6102c9366004612064565b6107d0565b005b3480156102dc57600080fd5b506102ce6102eb36600461214b565b61085e565b3480156102fc57600080fd5b50610306600c5481565b60405190815260200161024b565b34801561032057600080fd5b506102ce61032f366004611f27565b6109dd565b34801561034057600080fd5b506102ce61034f366004612102565b610a29565b34801561036057600080fd5b50610306600154600054036000190190565b34801561037e57600080fd5b506102ce61038d366004611f75565b610a6a565b6102ce6103a036600461214b565b610b2d565b3480156103b157600080fd5b506102ce6103c036600461208e565b610c5b565b3480156103d157600080fd5b506102ce610c98565b3480156103e657600080fd5b506102ce6103f5366004611f75565b610d1a565b34801561040657600080fd5b5061041a610415366004611f27565b610ddd565b60405161024b91906122aa565b34801561043357600080fd5b506102ce61044236600461214b565b610f26565b34801561045357600080fd5b50610269610f55565b34801561046857600080fd5b50600e5461023f9060ff1681565b34801561048257600080fd5b50610269610fe3565b34801561049757600080fd5b506102966104a636600461214b565b610ff0565b3480156104b757600080fd5b50610306600d5481565b3480156104cd57600080fd5b506103066104dc366004611f27565b611002565b3480156104ed57600080fd5b506102ce611051565b34801561050257600080fd5b506102ce610511366004612102565b611087565b34801561052257600080fd5b506102ce610531366004611f27565b6110c4565b34801561054257600080fd5b506008546001600160a01b0316610296565b34801561056057600080fd5b506102ce61056f366004612064565b6111eb565b34801561058057600080fd5b5061026961125d565b34801561059557600080fd5b506102ce6105a436600461202d565b61126c565b3480156105b557600080fd5b506102ce6105c436600461214b565b611302565b3480156105d557600080fd5b506102ce6105e4366004611fb1565b611331565b3480156105f557600080fd5b50600b54610296906001600160a01b031681565b34801561061557600080fd5b5061026961062436600461214b565b6113fb565b34801561063557600080fd5b50610306600f5481565b34801561064b57600080fd5b5061023f61065a366004611f42565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561069457600080fd5b506102ce6106a3366004611f27565b6114c9565b60006001600160e01b031982166380ac58cd60e01b14806106d957506001600160e01b03198216635b5e139f60e01b145b806106f457506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610709906123f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610735906123f2565b80156107825780601f1061075757610100808354040283529160200191610782565b820191906000526020600020905b81548152906001019060200180831161076557829003601f168201915b5050505050905090565b600061079782611561565b6107b4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006107db82610ff0565b9050806001600160a01b0316836001600160a01b031614156108105760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610830575061082e813361065a565b155b1561084e576040516367d9dca160e11b815260040160405180910390fd5b61085983838361159a565b505050565b80600f5481610874600154600054036000190190565b61087e9190612364565b11156108a55760405162461bcd60e51b815260040161089c90612336565b60405180910390fd5b600e5460ff16156108ef5760405162461bcd60e51b81526020600482015260146024820152735075626c6963204d696e7420506175736564212160601b604482015260640161089c565b3233146109375760405162461bcd60e51b81526020600482015260166024820152754572726f723a20496e76616c69642043616c6c65722160501b604482015260640161089c565b6000600d54836109479190612390565b600b546040516323b872dd60e01b8152336004820152306024820152604481018390529192506001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561099a57600080fd5b505af11580156109ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d291906120ab565b5061085933846115f6565b6008546001600160a01b03163314610a075760405162461bcd60e51b815260040161089c90612301565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314610a535760405162461bcd60e51b815260040161089c90612301565b8051610a6690600a906020840190611dfc565b5050565b6daaeb6d7670e522a718067333cd4e3b15610b2257604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0391906120ab565b610b2257604051633b79c77360e21b815233600482015260240161089c565b610859838383611610565b80600f5481610b43600154600054036000190190565b610b4d9190612364565b1115610b6b5760405162461bcd60e51b815260040161089c90612336565b8180600c54610b7a9190612390565b341015610bbf5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b604482015260640161089c565b600e5460ff1615610c095760405162461bcd60e51b81526020600482015260146024820152735075626c6963204d696e7420506175736564212160601b604482015260640161089c565b323314610c515760405162461bcd60e51b81526020600482015260166024820152754572726f723a20496e76616c69642043616c6c65722160501b604482015260640161089c565b61085933846115f6565b6008546001600160a01b03163314610c855760405162461bcd60e51b815260040161089c90612301565b600e805460ff1916911515919091179055565b6008546001600160a01b03163314610cc25760405162461bcd60e51b815260040161089c90612301565b604051600090339047908381818185875af1925050503d8060008114610d04576040519150601f19603f3d011682016040523d82523d6000602084013e610d09565b606091505b5050905080610d1757600080fd5b50565b6daaeb6d7670e522a718067333cd4e3b15610dd257604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381600087803b158015610d7b57600080fd5b505af1158015610d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db391906120ab565b610dd257604051633b79c77360e21b815233600482015260240161089c565b61085983838361161b565b60606000610dea83611002565b905060008167ffffffffffffffff811115610e0757610e0761249e565b604051908082528060200260200182016040528015610e30578160200160208202803683370190505b50905060016000805b8482108015610e4a5750600f548311155b15610f1b57600083815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161580159282018390529091610eb8575080516001600160a01b031615155b15610ec257805191505b876001600160a01b0316826001600160a01b03161415610f085783858481518110610eef57610eef612488565b602090810291909101015282610f048161242d565b9350505b83610f128161242d565b94505050610e39565b509195945050505050565b6008546001600160a01b03163314610f505760405162461bcd60e51b815260040161089c90612301565b600c55565b600a8054610f62906123f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8e906123f2565b8015610fdb5780601f10610fb057610100808354040283529160200191610fdb565b820191906000526020600020905b815481529060010190602001808311610fbe57829003601f168201915b505050505081565b60098054610f62906123f2565b6000610ffb82611636565b5192915050565b60006001600160a01b03821661102b576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b0316331461107b5760405162461bcd60e51b815260040161089c90612301565b611085600061175f565b565b6008546001600160a01b031633146110b15760405162461bcd60e51b815260040161089c90612301565b8051610a66906009906020840190611dfc565b6008546001600160a01b031633146110ee5760405162461bcd60e51b815260040161089c90612301565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561113057600080fd5b505afa158015611144573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111689190612164565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb90604401602060405180830381600087803b1580156111b357600080fd5b505af11580156111c7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085991906120ab565b80600f5481611201600154600054036000190190565b61120b9190612364565b11156112295760405162461bcd60e51b815260040161089c90612336565b6008546001600160a01b031633146112535760405162461bcd60e51b815260040161089c90612301565b61085983836115f6565b606060038054610709906123f2565b6001600160a01b0382163314156112965760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331461132c5760405162461bcd60e51b815260040161089c90612301565b600d55565b6daaeb6d7670e522a718067333cd4e3b156113e957604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381600087803b15801561139257600080fd5b505af11580156113a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ca91906120ab565b6113e957604051633b79c77360e21b815233600482015260240161089c565b6113f5848484846117b1565b50505050565b606061140682611561565b61146a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161089c565b60006114746117fc565b9050600081511161149457604051806020016040528060008152506114c2565b8061149e8461180b565b600a6040516020016114b2939291906121a9565b6040516020818303038152906040525b9392505050565b6008546001600160a01b031633146114f35760405162461bcd60e51b815260040161089c90612301565b6001600160a01b0381166115585760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161089c565b610d178161175f565b600081600111158015611575575060005482105b80156106f4575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610a66828260405180602001604052806000815250611911565b61085983838361191e565b61085983838360405180602001604052806000815250611331565b60408051606081018252600080825260208201819052918101919091528180600111158015611666575060005481105b1561174657600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906117445780516001600160a01b0316156116da579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff161515928101929092521561173f579392505050565b6116da565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6117bc84848461191e565b6001600160a01b0383163b151580156117de57506117dc84848484611b34565b155b156113f5576040516368d2bf6b60e11b815260040160405180910390fd5b606060098054610709906123f2565b60608161182f5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561185957806118438161242d565b91506118529050600a8361237c565b9150611833565b60008167ffffffffffffffff8111156118745761187461249e565b6040519080825280601f01601f19166020018201604052801561189e576020820181803683370190505b5090505b8415611909576118b36001836123af565b91506118c0600a86612448565b6118cb906030612364565b60f81b8183815181106118e0576118e0612488565b60200101906001600160f81b031916908160001a905350611902600a8661237c565b94506118a2565b949350505050565b6108598383836001611c2b565b600061192982611636565b80519091506000906001600160a01b0316336001600160a01b0316148061195757508151611957903361065a565b806119725750336119678461078c565b6001600160a01b0316145b90508061199257604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146119c75760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166119ee57604051633a954ecd60e21b815260040160405180910390fd5b6119fe600084846000015161159a565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116611aea57600054811015611aea578251600082815260046020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611b6990339089908890889060040161226d565b602060405180830381600087803b158015611b8357600080fd5b505af1925050508015611bb3575060408051601f3d908101601f19168201909252611bb0918101906120e5565b60015b611c0e573d808015611be1576040519150601f19603f3d011682016040523d82523d6000602084013e611be6565b606091505b508051611c06576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000546001600160a01b038516611c5457604051622e076360e81b815260040160405180910390fd5b83611c725760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611d2457506001600160a01b0387163b15155b15611dad575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611d756000888480600101955088611b34565b611d92576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611d2a578260005414611da857600080fd5b611df3565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611dae575b50600055611b2d565b828054611e08906123f2565b90600052602060002090601f016020900481019282611e2a5760008555611e70565b82601f10611e4357805160ff1916838001178555611e70565b82800160010185558215611e70579182015b82811115611e70578251825591602001919060010190611e55565b50611e7c929150611e80565b5090565b5b80821115611e7c5760008155600101611e81565b600067ffffffffffffffff80841115611eb057611eb061249e565b604051601f8501601f19908116603f01168101908282118183101715611ed857611ed861249e565b81604052809350858152868686011115611ef157600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611f2257600080fd5b919050565b600060208284031215611f3957600080fd5b6114c282611f0b565b60008060408385031215611f5557600080fd5b611f5e83611f0b565b9150611f6c60208401611f0b565b90509250929050565b600080600060608486031215611f8a57600080fd5b611f9384611f0b565b9250611fa160208501611f0b565b9150604084013590509250925092565b60008060008060808587031215611fc757600080fd5b611fd085611f0b565b9350611fde60208601611f0b565b925060408501359150606085013567ffffffffffffffff81111561200157600080fd5b8501601f8101871361201257600080fd5b61202187823560208401611e95565b91505092959194509250565b6000806040838503121561204057600080fd5b61204983611f0b565b91506020830135612059816124b4565b809150509250929050565b6000806040838503121561207757600080fd5b61208083611f0b565b946020939093013593505050565b6000602082840312156120a057600080fd5b81356114c2816124b4565b6000602082840312156120bd57600080fd5b81516114c2816124b4565b6000602082840312156120da57600080fd5b81356114c2816124c2565b6000602082840312156120f757600080fd5b81516114c2816124c2565b60006020828403121561211457600080fd5b813567ffffffffffffffff81111561212b57600080fd5b8201601f8101841361213c57600080fd5b61190984823560208401611e95565b60006020828403121561215d57600080fd5b5035919050565b60006020828403121561217657600080fd5b5051919050565b600081518084526121958160208601602086016123c6565b601f01601f19169290920160200192915050565b6000845160206121bc8285838a016123c6565b8551918401916121cf8184848a016123c6565b8554920191600090600181811c90808316806121ec57607f831692505b85831081141561220a57634e487b7160e01b85526022600452602485fd5b80801561221e576001811461222f5761225c565b60ff1985168852838801955061225c565b60008b81526020902060005b858110156122545781548a82015290840190880161223b565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906122a09083018461217d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156122e2578351835292840192918401916001016122c6565b50909695505050505050565b6020815260006114c2602083018461217d565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b600082198211156123775761237761245c565b500190565b60008261238b5761238b612472565b500490565b60008160001904831182151516156123aa576123aa61245c565b500290565b6000828210156123c1576123c161245c565b500390565b60005b838110156123e15781810151838201526020016123c9565b838111156113f55750506000910152565b600181811c9082168061240657607f821691505b6020821081141561242757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124415761244161245c565b5060010190565b60008261245757612457612472565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610d1757600080fd5b6001600160e01b031981168114610d1757600080fdfea264697066735822122098191f758518d9da52bd92515cea98218e9dc9fa5b210f481ce603234069989264736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102135760003560e01c806362b99ad41161011857806395d89b41116100a0578063c24126761161006f578063c2412676146105e9578063c87b56dd14610609578063d5abeb0114610629578063e985e9c51461063f578063f2fde38b1461068857600080fd5b806395d89b4114610574578063a22cb46514610589578063a2dfe7b5146105a9578063b88d4fde146105c957600080fd5b8063715018a6116100e7578063715018a6146104e15780637ec4a659146104f657806389476069146105165780638da5cb5b1461053657806393f84cfe1461055457600080fd5b806362b99ad4146104765780636352211e1461048b5780636eee6274146104ab57806370a08231146104c157600080fd5b806323b872dd1161019b57806342842e0e1161016a57806342842e0e146103da578063438b6300146103fa57806344a0d68a146104275780635503a0e8146104475780635c975abb1461045c57600080fd5b806323b872dd146103725780632db11544146103925780633005a790146103a55780633ccfd60b146103c557600080fd5b80630ff8ea80116101e25780630ff8ea80146102d057806313faede6146102f0578063144fa6d71461031457806316ba10e01461033457806318160ddd1461035457600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae57600080fd5b3661021a57005b600080fd5b34801561022b57600080fd5b5061023f61023a3660046120c8565b6106a8565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106fa565b60405161024b91906122ee565b34801561028257600080fd5b5061029661029136600461214b565b61078c565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102ce6102c9366004612064565b6107d0565b005b3480156102dc57600080fd5b506102ce6102eb36600461214b565b61085e565b3480156102fc57600080fd5b50610306600c5481565b60405190815260200161024b565b34801561032057600080fd5b506102ce61032f366004611f27565b6109dd565b34801561034057600080fd5b506102ce61034f366004612102565b610a29565b34801561036057600080fd5b50610306600154600054036000190190565b34801561037e57600080fd5b506102ce61038d366004611f75565b610a6a565b6102ce6103a036600461214b565b610b2d565b3480156103b157600080fd5b506102ce6103c036600461208e565b610c5b565b3480156103d157600080fd5b506102ce610c98565b3480156103e657600080fd5b506102ce6103f5366004611f75565b610d1a565b34801561040657600080fd5b5061041a610415366004611f27565b610ddd565b60405161024b91906122aa565b34801561043357600080fd5b506102ce61044236600461214b565b610f26565b34801561045357600080fd5b50610269610f55565b34801561046857600080fd5b50600e5461023f9060ff1681565b34801561048257600080fd5b50610269610fe3565b34801561049757600080fd5b506102966104a636600461214b565b610ff0565b3480156104b757600080fd5b50610306600d5481565b3480156104cd57600080fd5b506103066104dc366004611f27565b611002565b3480156104ed57600080fd5b506102ce611051565b34801561050257600080fd5b506102ce610511366004612102565b611087565b34801561052257600080fd5b506102ce610531366004611f27565b6110c4565b34801561054257600080fd5b506008546001600160a01b0316610296565b34801561056057600080fd5b506102ce61056f366004612064565b6111eb565b34801561058057600080fd5b5061026961125d565b34801561059557600080fd5b506102ce6105a436600461202d565b61126c565b3480156105b557600080fd5b506102ce6105c436600461214b565b611302565b3480156105d557600080fd5b506102ce6105e4366004611fb1565b611331565b3480156105f557600080fd5b50600b54610296906001600160a01b031681565b34801561061557600080fd5b5061026961062436600461214b565b6113fb565b34801561063557600080fd5b50610306600f5481565b34801561064b57600080fd5b5061023f61065a366004611f42565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561069457600080fd5b506102ce6106a3366004611f27565b6114c9565b60006001600160e01b031982166380ac58cd60e01b14806106d957506001600160e01b03198216635b5e139f60e01b145b806106f457506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610709906123f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610735906123f2565b80156107825780601f1061075757610100808354040283529160200191610782565b820191906000526020600020905b81548152906001019060200180831161076557829003601f168201915b5050505050905090565b600061079782611561565b6107b4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006107db82610ff0565b9050806001600160a01b0316836001600160a01b031614156108105760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610830575061082e813361065a565b155b1561084e576040516367d9dca160e11b815260040160405180910390fd5b61085983838361159a565b505050565b80600f5481610874600154600054036000190190565b61087e9190612364565b11156108a55760405162461bcd60e51b815260040161089c90612336565b60405180910390fd5b600e5460ff16156108ef5760405162461bcd60e51b81526020600482015260146024820152735075626c6963204d696e7420506175736564212160601b604482015260640161089c565b3233146109375760405162461bcd60e51b81526020600482015260166024820152754572726f723a20496e76616c69642043616c6c65722160501b604482015260640161089c565b6000600d54836109479190612390565b600b546040516323b872dd60e01b8152336004820152306024820152604481018390529192506001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561099a57600080fd5b505af11580156109ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d291906120ab565b5061085933846115f6565b6008546001600160a01b03163314610a075760405162461bcd60e51b815260040161089c90612301565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314610a535760405162461bcd60e51b815260040161089c90612301565b8051610a6690600a906020840190611dfc565b5050565b6daaeb6d7670e522a718067333cd4e3b15610b2257604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0391906120ab565b610b2257604051633b79c77360e21b815233600482015260240161089c565b610859838383611610565b80600f5481610b43600154600054036000190190565b610b4d9190612364565b1115610b6b5760405162461bcd60e51b815260040161089c90612336565b8180600c54610b7a9190612390565b341015610bbf5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b604482015260640161089c565b600e5460ff1615610c095760405162461bcd60e51b81526020600482015260146024820152735075626c6963204d696e7420506175736564212160601b604482015260640161089c565b323314610c515760405162461bcd60e51b81526020600482015260166024820152754572726f723a20496e76616c69642043616c6c65722160501b604482015260640161089c565b61085933846115f6565b6008546001600160a01b03163314610c855760405162461bcd60e51b815260040161089c90612301565b600e805460ff1916911515919091179055565b6008546001600160a01b03163314610cc25760405162461bcd60e51b815260040161089c90612301565b604051600090339047908381818185875af1925050503d8060008114610d04576040519150601f19603f3d011682016040523d82523d6000602084013e610d09565b606091505b5050905080610d1757600080fd5b50565b6daaeb6d7670e522a718067333cd4e3b15610dd257604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381600087803b158015610d7b57600080fd5b505af1158015610d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db391906120ab565b610dd257604051633b79c77360e21b815233600482015260240161089c565b61085983838361161b565b60606000610dea83611002565b905060008167ffffffffffffffff811115610e0757610e0761249e565b604051908082528060200260200182016040528015610e30578160200160208202803683370190505b50905060016000805b8482108015610e4a5750600f548311155b15610f1b57600083815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161580159282018390529091610eb8575080516001600160a01b031615155b15610ec257805191505b876001600160a01b0316826001600160a01b03161415610f085783858481518110610eef57610eef612488565b602090810291909101015282610f048161242d565b9350505b83610f128161242d565b94505050610e39565b509195945050505050565b6008546001600160a01b03163314610f505760405162461bcd60e51b815260040161089c90612301565b600c55565b600a8054610f62906123f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8e906123f2565b8015610fdb5780601f10610fb057610100808354040283529160200191610fdb565b820191906000526020600020905b815481529060010190602001808311610fbe57829003601f168201915b505050505081565b60098054610f62906123f2565b6000610ffb82611636565b5192915050565b60006001600160a01b03821661102b576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b0316331461107b5760405162461bcd60e51b815260040161089c90612301565b611085600061175f565b565b6008546001600160a01b031633146110b15760405162461bcd60e51b815260040161089c90612301565b8051610a66906009906020840190611dfc565b6008546001600160a01b031633146110ee5760405162461bcd60e51b815260040161089c90612301565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561113057600080fd5b505afa158015611144573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111689190612164565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb90604401602060405180830381600087803b1580156111b357600080fd5b505af11580156111c7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085991906120ab565b80600f5481611201600154600054036000190190565b61120b9190612364565b11156112295760405162461bcd60e51b815260040161089c90612336565b6008546001600160a01b031633146112535760405162461bcd60e51b815260040161089c90612301565b61085983836115f6565b606060038054610709906123f2565b6001600160a01b0382163314156112965760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331461132c5760405162461bcd60e51b815260040161089c90612301565b600d55565b6daaeb6d7670e522a718067333cd4e3b156113e957604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381600087803b15801561139257600080fd5b505af11580156113a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ca91906120ab565b6113e957604051633b79c77360e21b815233600482015260240161089c565b6113f5848484846117b1565b50505050565b606061140682611561565b61146a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161089c565b60006114746117fc565b9050600081511161149457604051806020016040528060008152506114c2565b8061149e8461180b565b600a6040516020016114b2939291906121a9565b6040516020818303038152906040525b9392505050565b6008546001600160a01b031633146114f35760405162461bcd60e51b815260040161089c90612301565b6001600160a01b0381166115585760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161089c565b610d178161175f565b600081600111158015611575575060005482105b80156106f4575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610a66828260405180602001604052806000815250611911565b61085983838361191e565b61085983838360405180602001604052806000815250611331565b60408051606081018252600080825260208201819052918101919091528180600111158015611666575060005481105b1561174657600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906117445780516001600160a01b0316156116da579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff161515928101929092521561173f579392505050565b6116da565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6117bc84848461191e565b6001600160a01b0383163b151580156117de57506117dc84848484611b34565b155b156113f5576040516368d2bf6b60e11b815260040160405180910390fd5b606060098054610709906123f2565b60608161182f5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561185957806118438161242d565b91506118529050600a8361237c565b9150611833565b60008167ffffffffffffffff8111156118745761187461249e565b6040519080825280601f01601f19166020018201604052801561189e576020820181803683370190505b5090505b8415611909576118b36001836123af565b91506118c0600a86612448565b6118cb906030612364565b60f81b8183815181106118e0576118e0612488565b60200101906001600160f81b031916908160001a905350611902600a8661237c565b94506118a2565b949350505050565b6108598383836001611c2b565b600061192982611636565b80519091506000906001600160a01b0316336001600160a01b0316148061195757508151611957903361065a565b806119725750336119678461078c565b6001600160a01b0316145b90508061199257604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146119c75760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166119ee57604051633a954ecd60e21b815260040160405180910390fd5b6119fe600084846000015161159a565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116611aea57600054811015611aea578251600082815260046020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611b6990339089908890889060040161226d565b602060405180830381600087803b158015611b8357600080fd5b505af1925050508015611bb3575060408051601f3d908101601f19168201909252611bb0918101906120e5565b60015b611c0e573d808015611be1576040519150601f19603f3d011682016040523d82523d6000602084013e611be6565b606091505b508051611c06576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000546001600160a01b038516611c5457604051622e076360e81b815260040160405180910390fd5b83611c725760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611d2457506001600160a01b0387163b15155b15611dad575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611d756000888480600101955088611b34565b611d92576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611d2a578260005414611da857600080fd5b611df3565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611dae575b50600055611b2d565b828054611e08906123f2565b90600052602060002090601f016020900481019282611e2a5760008555611e70565b82601f10611e4357805160ff1916838001178555611e70565b82800160010185558215611e70579182015b82811115611e70578251825591602001919060010190611e55565b50611e7c929150611e80565b5090565b5b80821115611e7c5760008155600101611e81565b600067ffffffffffffffff80841115611eb057611eb061249e565b604051601f8501601f19908116603f01168101908282118183101715611ed857611ed861249e565b81604052809350858152868686011115611ef157600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611f2257600080fd5b919050565b600060208284031215611f3957600080fd5b6114c282611f0b565b60008060408385031215611f5557600080fd5b611f5e83611f0b565b9150611f6c60208401611f0b565b90509250929050565b600080600060608486031215611f8a57600080fd5b611f9384611f0b565b9250611fa160208501611f0b565b9150604084013590509250925092565b60008060008060808587031215611fc757600080fd5b611fd085611f0b565b9350611fde60208601611f0b565b925060408501359150606085013567ffffffffffffffff81111561200157600080fd5b8501601f8101871361201257600080fd5b61202187823560208401611e95565b91505092959194509250565b6000806040838503121561204057600080fd5b61204983611f0b565b91506020830135612059816124b4565b809150509250929050565b6000806040838503121561207757600080fd5b61208083611f0b565b946020939093013593505050565b6000602082840312156120a057600080fd5b81356114c2816124b4565b6000602082840312156120bd57600080fd5b81516114c2816124b4565b6000602082840312156120da57600080fd5b81356114c2816124c2565b6000602082840312156120f757600080fd5b81516114c2816124c2565b60006020828403121561211457600080fd5b813567ffffffffffffffff81111561212b57600080fd5b8201601f8101841361213c57600080fd5b61190984823560208401611e95565b60006020828403121561215d57600080fd5b5035919050565b60006020828403121561217657600080fd5b5051919050565b600081518084526121958160208601602086016123c6565b601f01601f19169290920160200192915050565b6000845160206121bc8285838a016123c6565b8551918401916121cf8184848a016123c6565b8554920191600090600181811c90808316806121ec57607f831692505b85831081141561220a57634e487b7160e01b85526022600452602485fd5b80801561221e576001811461222f5761225c565b60ff1985168852838801955061225c565b60008b81526020902060005b858110156122545781548a82015290840190880161223b565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906122a09083018461217d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156122e2578351835292840192918401916001016122c6565b50909695505050505050565b6020815260006114c2602083018461217d565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b600082198211156123775761237761245c565b500190565b60008261238b5761238b612472565b500490565b60008160001904831182151516156123aa576123aa61245c565b500290565b6000828210156123c1576123c161245c565b500390565b60005b838110156123e15781810151838201526020016123c9565b838111156113f55750506000910152565b600181811c9082168061240657607f821691505b6020821081141561242757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124415761244161245c565b5060010190565b60008261245757612457612472565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610d1757600080fd5b6001600160e01b031981168114610d1757600080fdfea264697066735822122098191f758518d9da52bd92515cea98218e9dc9fa5b210f481ce603234069989264736f6c63430008070033

Deployed Bytecode Sourcemap

34989:4773:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16735:305;;;;;;;;;;-1:-1:-1;16735:305:0;;;;;:::i;:::-;;:::i;:::-;;;9171:14:1;;9164:22;9146:41;;9134:2;9119:18;16735:305:0;;;;;;;;20120:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21623:204::-;;;;;;;;;;-1:-1:-1;21623:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6864:32:1;;;6846:51;;6834:2;6819:18;21623:204:0;6700:203:1;21186:371:0;;;;;;;;;;-1:-1:-1;21186:371:0;;;;;:::i;:::-;;:::i;:::-;;36032:367;;;;;;;;;;-1:-1:-1;36032:367:0;;;;;:::i;:::-;;:::i;35203:32::-;;;;;;;;;;;;;;;;;;;12372:25:1;;;12360:2;12345:18;35203:32:0;12226:177:1;38503:94:0;;;;;;;;;;-1:-1:-1;38503:94:0;;;;;:::i;:::-;;:::i;38279:106::-;;;;;;;;;;-1:-1:-1;38279:106:0;;;;;:::i;:::-;;:::i;15984:303::-;;;;;;;;;;;;37550:1;16238:12;16028:7;16222:13;:28;-1:-1:-1;;16222:46:0;;15984:303;39160:157;;;;;;;;;;-1:-1:-1;39160:157:0;;;;;:::i;:::-;;:::i;35740:284::-;;;;;;:::i;:::-;;:::i;37970:93::-;;;;;;;;;;-1:-1:-1;37970:93:0;;;;;:::i;:::-;;:::i;38798:150::-;;;;;;;;;;;;;:::i;39325:165::-;;;;;;;;;;-1:-1:-1;39325:165:0;;;;;:::i;:::-;;:::i;36560:890::-;;;;;;;;;;-1:-1:-1;36560:890:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38071:86::-;;;;;;;;;;-1:-1:-1;38071:86:0;;;;;:::i;:::-;;:::i;35133:33::-;;;;;;;;;;;;;:::i;35305:18::-;;;;;;;;;;-1:-1:-1;35305:18:0;;;;;;;;35098:28;;;;;;;;;;;;;:::i;19929:124::-;;;;;;;;;;-1:-1:-1;19929:124:0;;;;;:::i;:::-;;:::i;35242:40::-;;;;;;;;;;;;;;;;17104:206;;;;;;;;;;-1:-1:-1;17104:206:0;;;;;:::i;:::-;;:::i;6461:103::-;;;;;;;;;;;;;:::i;38165:106::-;;;;;;;;;;-1:-1:-1;38165:106:0;;;;;:::i;:::-;;:::i;38605:185::-;;;;;;;;;;-1:-1:-1;38605:185:0;;;;;:::i;:::-;;:::i;6238:87::-;;;;;;;;;;-1:-1:-1;6311:6:0;;-1:-1:-1;;;;;6311:6:0;6238:87;;36407:145;;;;;;;;;;-1:-1:-1;36407:145:0;;;;;:::i;:::-;;:::i;20289:104::-;;;;;;;;;;;;;:::i;21899:279::-;;;;;;;;;;-1:-1:-1;21899:279:0;;;;;:::i;:::-;;:::i;38393:102::-;;;;;;;;;;-1:-1:-1;38393:102:0;;;;;:::i;:::-;;:::i;39498:222::-;;;;;;;;;;-1:-1:-1;39498:222:0;;;;;:::i;:::-;;:::i;35175:19::-;;;;;;;;;;-1:-1:-1;35175:19:0;;;;-1:-1:-1;;;;;35175:19:0;;;37567:395;;;;;;;;;;-1:-1:-1;37567:395:0;;;;;:::i;:::-;;:::i;35332:29::-;;;;;;;;;;;;;;;;22249:164;;;;;;;;;;-1:-1:-1;22249:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;22370:25:0;;;22346:4;22370:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;22249:164;6572:201;;;;;;;;;;-1:-1:-1;6572:201:0;;;;;:::i;:::-;;:::i;16735:305::-;16837:4;-1:-1:-1;;;;;;16874:40:0;;-1:-1:-1;;;16874:40:0;;:105;;-1:-1:-1;;;;;;;16931:48:0;;-1:-1:-1;;;16931:48:0;16874:105;:158;;;-1:-1:-1;;;;;;;;;;11073:40:0;;;16996:36;16854:178;16735:305;-1:-1:-1;;16735:305:0:o;20120:100::-;20174:13;20207:5;20200:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20120:100;:::o;21623:204::-;21691:7;21716:16;21724:7;21716;:16::i;:::-;21711:64;;21741:34;;-1:-1:-1;;;21741:34:0;;;;;;;;;;;21711:64;-1:-1:-1;21795:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;21795:24:0;;21623:204::o;21186:371::-;21259:13;21275:24;21291:7;21275:15;:24::i;:::-;21259:40;;21320:5;-1:-1:-1;;;;;21314:11:0;:2;-1:-1:-1;;;;;21314:11:0;;21310:48;;;21334:24;;-1:-1:-1;;;21334:24:0;;;;;;;;;;;21310:48;5866:10;-1:-1:-1;;;;;21375:21:0;;;;;;:63;;-1:-1:-1;21401:37:0;21418:5;5866:10;22249:164;:::i;21401:37::-;21400:38;21375:63;21371:138;;;21462:35;;-1:-1:-1;;;21462:35:0;;;;;;;;;;;21371:138;21521:28;21530:2;21534:7;21543:5;21521:8;:28::i;:::-;21248:309;21186:371;;:::o;36032:367::-;36100:11;35530:9;;35515:11;35499:13;37550:1;16238:12;16028:7;16222:13;:28;-1:-1:-1;;16222:46:0;;15984:303;35499:13;:27;;;;:::i;:::-;:40;;35491:73;;;;-1:-1:-1;;;35491:73:0;;;;;;;:::i;:::-;;;;;;;;;36132:6:::1;::::0;::::1;;36131:7;36123:39;;;::::0;-1:-1:-1;;;36123:39:0;;10254:2:1;36123:39:0::1;::::0;::::1;10236:21:1::0;10293:2;10273:18;;;10266:30;-1:-1:-1;;;10312:18:1;;;10305:50;10372:18;;36123:39:0::1;10052:344:1::0;36123:39:0::1;36181:9;36194:10;36181:23;36173:57;;;::::0;-1:-1:-1;;;36173:57:0;;11729:2:1;36173:57:0::1;::::0;::::1;11711:21:1::0;11768:2;11748:18;;;11741:30;-1:-1:-1;;;11787:18:1;;;11780:52;11849:18;;36173:57:0::1;11527:346:1::0;36173:57:0::1;36241:13;36271:9;;36257:11;:23;;;;:::i;:::-;36291:5;::::0;:55:::1;::::0;-1:-1:-1;;;36291:55:0;;36310:10:::1;36291:55;::::0;::::1;7457:34:1::0;36330:4:0::1;7507:18:1::0;;;7500:43;7559:18;;;7552:34;;;36241:39:0;;-1:-1:-1;;;;;;36291:5:0::1;::::0;:18:::1;::::0;7392::1;;36291:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36357:34;36367:10;36379:11;36357:9;:34::i;38503:94::-:0;6311:6;;-1:-1:-1;;;;;6311:6:0;5866:10;6373:23;6365:68;;;;-1:-1:-1;;;6365:68:0;;;;;;;:::i;:::-;38567:5:::1;:22:::0;;-1:-1:-1;;;;;;38567:22:0::1;-1:-1:-1::0;;;;;38567:22:0;;;::::1;::::0;;;::::1;::::0;;38503:94::o;38279:106::-;6311:6;;-1:-1:-1;;;;;6311:6:0;5866:10;6373:23;6365:68;;;;-1:-1:-1;;;6365:68:0;;;;;;;:::i;:::-;38355:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;38279:106:::0;:::o;39160:157::-;2301:42;3429:43;:47;3425:225;;3498:67;;-1:-1:-1;;;3498:67:0;;3547:4;3498:67;;;7120:34:1;3554:10:0;7170:18:1;;;7163:43;2301:42:0;;3498:40;;7055:18:1;;3498:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3493:146;;3593:30;;-1:-1:-1;;;3593:30:0;;3612:10;3593:30;;;6846:51:1;6819:18;;3593:30:0;6700:203:1;3493:146:0;39272:37:::1;39291:4;39297:2;39301:7;39272:18;:37::i;35740:284::-:0;35811:11;35530:9;;35515:11;35499:13;37550:1;16238:12;16028:7;16222:13;:28;-1:-1:-1;;16222:46:0;;15984:303;35499:13;:27;;;;:::i;:::-;:40;;35491:73;;;;-1:-1:-1;;;35491:73:0;;;;;;;:::i;:::-;35840:11:::1;35677;35670:4;;:18;;;;:::i;:::-;35657:9;:31;;35649:63;;;::::0;-1:-1:-1;;;35649:63:0;;12080:2:1;35649:63:0::1;::::0;::::1;12062:21:1::0;12119:2;12099:18;;;12092:30;-1:-1:-1;;;12138:18:1;;;12131:49;12197:18;;35649:63:0::1;11878:343:1::0;35649:63:0::1;35873:6:::2;::::0;::::2;;35872:7;35864:39;;;::::0;-1:-1:-1;;;35864:39:0;;10254:2:1;35864:39:0::2;::::0;::::2;10236:21:1::0;10293:2;10273:18;;;10266:30;-1:-1:-1;;;10312:18:1;;;10305:50;10372:18;;35864:39:0::2;10052:344:1::0;35864:39:0::2;35922:9;35935:10;35922:23;35914:57;;;::::0;-1:-1:-1;;;35914:57:0;;11729:2:1;35914:57:0::2;::::0;::::2;11711:21:1::0;11768:2;11748:18;;;11741:30;-1:-1:-1;;;11787:18:1;;;11780:52;11849:18;;35914:57:0::2;11527:346:1::0;35914:57:0::2;35982:34;35992:10;36004:11;35982:9;:34::i;37970:93::-:0;6311:6;;-1:-1:-1;;;;;6311:6:0;5866:10;6373:23;6365:68;;;;-1:-1:-1;;;6365:68:0;;;;;;;:::i;:::-;38039:6:::1;:16:::0;;-1:-1:-1;;38039:16:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37970:93::o;38798:150::-;6311:6;;-1:-1:-1;;;;;6311:6:0;5866:10;6373:23;6365:68;;;;-1:-1:-1;;;6365:68:0;;;;;;;:::i;:::-;38860:58:::1;::::0;38847:7:::1;::::0;38868:10:::1;::::0;38892:21:::1;::::0;38847:7;38860:58;38847:7;38860:58;38892:21;38868:10;38860:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38846:72;;;38937:2;38929:11;;;::::0;::::1;;38835:113;38798:150::o:0;39325:165::-;2301:42;3429:43;:47;3425:225;;3498:67;;-1:-1:-1;;;3498:67:0;;3547:4;3498:67;;;7120:34:1;3554:10:0;7170:18:1;;;7163:43;2301:42:0;;3498:40;;7055:18:1;;3498:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3493:146;;3593:30;;-1:-1:-1;;;3593:30:0;;3612:10;3593:30;;;6846:51:1;6819:18;;3593:30:0;6700:203:1;3493:146:0;39441:41:::1;39464:4;39470:2;39474:7;39441:22;:41::i;36560:890::-:0;36620:16;36649:23;36675:17;36685:6;36675:9;:17::i;:::-;36649:43;;36703:30;36750:15;36736:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36736:30:0;-1:-1:-1;36703:63:0;-1:-1:-1;37550:1:0;36777:22;;36905:505;36930:15;36912;:33;:64;;;;;36967:9;;36949:14;:27;;36912:64;36905:505;;;36993:31;37027:27;;;:11;:27;;;;;;;;;36993:61;;;;;;;;;-1:-1:-1;;;;;36993:61:0;;;;-1:-1:-1;;;36993:61:0;;;;;;;;;;;-1:-1:-1;;;36993:61:0;;;;;;;;;;;;;;;;37075:49;;-1:-1:-1;37096:14:0;;-1:-1:-1;;;;;37096:28:0;;;37075:49;37071:125;;;37166:14;;;-1:-1:-1;37071:125:0;37238:6;-1:-1:-1;;;;;37216:28:0;:18;-1:-1:-1;;;;;37216:28:0;;37212:154;;;37298:14;37265:13;37279:15;37265:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;37333:17;;;;:::i;:::-;;;;37212:154;37382:16;;;;:::i;:::-;;;;36978:432;36905:505;;;-1:-1:-1;37429:13:0;;36560:890;-1:-1:-1;;;;;36560:890:0:o;38071:86::-;6311:6;;-1:-1:-1;;;;;6311:6:0;5866:10;6373:23;6365:68;;;;-1:-1:-1;;;6365:68:0;;;;;;;:::i;:::-;38134:4:::1;:15:::0;38071:86::o;35133:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35098:28::-;;;;;;;:::i;19929:124::-;19993:7;20020:20;20032:7;20020:11;:20::i;:::-;:25;;19929:124;-1:-1:-1;;19929:124:0:o;17104:206::-;17168:7;-1:-1:-1;;;;;17192:19:0;;17188:60;;17220:28;;-1:-1:-1;;;17220:28:0;;;;;;;;;;;17188:60;-1:-1:-1;;;;;;17274:19:0;;;;;:12;:19;;;;;:27;;;;17104:206::o;6461:103::-;6311:6;;-1:-1:-1;;;;;6311:6:0;5866:10;6373:23;6365:68;;;;-1:-1:-1;;;6365:68:0;;;;;;;:::i;:::-;6526:30:::1;6553:1;6526:18;:30::i;:::-;6461:103::o:0;38165:106::-;6311:6;;-1:-1:-1;;;;;6311:6:0;5866:10;6373:23;6365:68;;;;-1:-1:-1;;;6365:68:0;;;;;;;:::i;:::-;38241:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;38605:185::-:0;6311:6;;-1:-1:-1;;;;;6311:6:0;5866:10;6373:23;6365:68;;;;-1:-1:-1;;;6365:68:0;;;;;;;:::i;:::-;38689:39:::1;::::0;-1:-1:-1;;;38689:39:0;;38722:4:::1;38689:39;::::0;::::1;6846:51:1::0;38674:12:0::1;::::0;-1:-1:-1;;;;;38689:24:0;::::1;::::0;::::1;::::0;6819:18:1;;38689:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38739:43;::::0;-1:-1:-1;;;38739:43:0;;38763:10:::1;38739:43;::::0;::::1;8264:51:1::0;8331:18;;;8324:34;;;38674:54:0;;-1:-1:-1;;;;;;38739:23:0;::::1;::::0;::::1;::::0;8237:18:1;;38739:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36407:145::-:0;36482:11;35530:9;;35515:11;35499:13;37550:1;16238:12;16028:7;16222:13;:28;-1:-1:-1;;16222:46:0;;15984:303;35499:13;:27;;;;:::i;:::-;:40;;35491:73;;;;-1:-1:-1;;;35491:73:0;;;;;;;:::i;:::-;6311:6;;-1:-1:-1;;;;;6311:6:0;5866:10;6373:23:::1;6365:68;;;;-1:-1:-1::0;;;6365:68:0::1;;;;;;;:::i;:::-;36516:28:::2;36526:4;36532:11;36516:9;:28::i;20289:104::-:0;20345:13;20378:7;20371:14;;;;;:::i;21899:279::-;-1:-1:-1;;;;;21990:24:0;;5866:10;21990:24;21986:54;;;22023:17;;-1:-1:-1;;;22023:17:0;;;;;;;;;;;21986:54;5866:10;22053:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;22053:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;22053:53:0;;;;;;;;;;22122:48;;9146:41:1;;;22053:42:0;;5866:10;22122:48;;9119:18:1;22122:48:0;;;;;;;21899:279;;:::o;38393:102::-;6311:6;;-1:-1:-1;;;;;6311:6:0;5866:10;6373:23;6365:68;;;;-1:-1:-1;;;6365:68:0;;;;;;;:::i;:::-;38466:9:::1;:21:::0;38393:102::o;39498:222::-;2301:42;3429:43;:47;3425:225;;3498:67;;-1:-1:-1;;;3498:67:0;;3547:4;3498:67;;;7120:34:1;3554:10:0;7170:18:1;;;7163:43;2301:42:0;;3498:40;;7055:18:1;;3498:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3493:146;;3593:30;;-1:-1:-1;;;3593:30:0;;3612:10;3593:30;;;6846:51:1;6819:18;;3593:30:0;6700:203:1;3493:146:0;39665:47:::1;39688:4;39694:2;39698:7;39707:4;39665:22;:47::i;:::-;39498:222:::0;;;;:::o;37567:395::-;37641:13;37675:17;37683:8;37675:7;:17::i;:::-;37667:77;;;;-1:-1:-1;;;37667:77:0;;10964:2:1;37667:77:0;;;10946:21:1;11003:2;10983:18;;;10976:30;11042:34;11022:18;;;11015:62;-1:-1:-1;;;11093:18:1;;;11086:45;11148:19;;37667:77:0;10762:411:1;37667:77:0;37757:28;37788:10;:8;:10::i;:::-;37757:41;;37847:1;37822:14;37816:28;:32;:138;;;;;;;;;;;;;;;;;37888:14;37904:19;:8;:17;:19::i;:::-;37925:9;37871:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37816:138;37809:145;37567:395;-1:-1:-1;;;37567:395:0:o;6572:201::-;6311:6;;-1:-1:-1;;;;;6311:6:0;5866:10;6373:23;6365:68;;;;-1:-1:-1;;;6365:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6661:22:0;::::1;6653:73;;;::::0;-1:-1:-1;;;6653:73:0;;9847:2:1;6653:73:0::1;::::0;::::1;9829:21:1::0;9886:2;9866:18;;;9859:30;9925:34;9905:18;;;9898:62;-1:-1:-1;;;9976:18:1;;;9969:36;10022:19;;6653:73:0::1;9645:402:1::0;6653:73:0::1;6737:28;6756:8;6737:18;:28::i;23601:187::-:0;23658:4;23701:7;37550:1;23682:26;;:53;;;;;23722:13;;23712:7;:23;23682:53;:98;;;;-1:-1:-1;;23753:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;23753:27:0;;;;23752:28;;23601:187::o;31212:196::-;31327:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;31327:29:0;-1:-1:-1;;;;;31327:29:0;;;;;;;;;31372:28;;31327:24;;31372:28;;;;;;;31212:196;;;:::o;23796:104::-;23865:27;23875:2;23879:8;23865:27;;;;;;;;;;;;:9;:27::i;22480:170::-;22614:28;22624:4;22630:2;22634:7;22614:9;:28::i;22721:185::-;22859:39;22876:4;22882:2;22886:7;22859:39;;;;;;;;;;;;:16;:39::i;18759:1108::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;18869:7:0;;37550:1;18918:23;;:47;;;;;18952:13;;18945:4;:20;18918:47;18914:886;;;18986:31;19020:17;;;:11;:17;;;;;;;;;18986:51;;;;;;;;;-1:-1:-1;;;;;18986:51:0;;;;-1:-1:-1;;;18986:51:0;;;;;;;;;;;-1:-1:-1;;;18986:51:0;;;;;;;;;;;;;;19056:729;;19106:14;;-1:-1:-1;;;;;19106:28:0;;19102:101;;19170:9;18759:1108;-1:-1:-1;;;18759:1108:0:o;19102:101::-;-1:-1:-1;;;19545:6:0;19590:17;;;;:11;:17;;;;;;;;;19578:29;;;;;;;;;-1:-1:-1;;;;;19578:29:0;;;;;-1:-1:-1;;;19578:29:0;;;;;;;;;;;-1:-1:-1;;;19578:29:0;;;;;;;;;;;;;19638:28;19634:109;;19706:9;18759:1108;-1:-1:-1;;;18759:1108:0:o;19634:109::-;19505:261;;;18967:833;18914:886;19828:31;;-1:-1:-1;;;19828:31:0;;;;;;;;;;;6781:191;6874:6;;;-1:-1:-1;;;;;6891:17:0;;;-1:-1:-1;;;;;;6891:17:0;;;;;;;6924:40;;6874:6;;;6891:17;6874:6;;6924:40;;6855:16;;6924:40;6844:128;6781:191;:::o;22977:369::-;23144:28;23154:4;23160:2;23164:7;23144:9;:28::i;:::-;-1:-1:-1;;;;;23187:13:0;;7091:19;:23;;23187:76;;;;;23207:56;23238:4;23244:2;23248:7;23257:5;23207:30;:56::i;:::-;23206:57;23187:76;23183:156;;;23287:40;;-1:-1:-1;;;23287:40:0;;;;;;;;;;;38956:110;39016:13;39049:9;39042:16;;;;;:::i;3994:723::-;4050:13;4271:10;4267:53;;-1:-1:-1;;4298:10:0;;;;;;;;;;;;-1:-1:-1;;;4298:10:0;;;;;3994:723::o;4267:53::-;4345:5;4330:12;4386:78;4393:9;;4386:78;;4419:8;;;;:::i;:::-;;-1:-1:-1;4442:10:0;;-1:-1:-1;4450:2:0;4442:10;;:::i;:::-;;;4386:78;;;4474:19;4506:6;4496:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4496:17:0;;4474:39;;4524:154;4531:10;;4524:154;;4558:11;4568:1;4558:11;;:::i;:::-;;-1:-1:-1;4627:10:0;4635:2;4627:5;:10;:::i;:::-;4614:24;;:2;:24;:::i;:::-;4601:39;;4584:6;4591;4584:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4584:56:0;;;;;;;;-1:-1:-1;4655:11:0;4664:2;4655:11;;:::i;:::-;;;4524:154;;;4702:6;3994:723;-1:-1:-1;;;;3994:723:0:o;24263:163::-;24386:32;24392:2;24396:8;24406:5;24413:4;24386:5;:32::i;26714:2112::-;26829:35;26867:20;26879:7;26867:11;:20::i;:::-;26942:18;;26829:58;;-1:-1:-1;26900:22:0;;-1:-1:-1;;;;;26926:34:0;5866:10;-1:-1:-1;;;;;26926:34:0;;:101;;;-1:-1:-1;26994:18:0;;26977:50;;5866:10;22249:164;:::i;26977:50::-;26926:154;;;-1:-1:-1;5866:10:0;27044:20;27056:7;27044:11;:20::i;:::-;-1:-1:-1;;;;;27044:36:0;;26926:154;26900:181;;27099:17;27094:66;;27125:35;;-1:-1:-1;;;27125:35:0;;;;;;;;;;;27094:66;27197:4;-1:-1:-1;;;;;27175:26:0;:13;:18;;;-1:-1:-1;;;;;27175:26:0;;27171:67;;27210:28;;-1:-1:-1;;;27210:28:0;;;;;;;;;;;27171:67;-1:-1:-1;;;;;27253:16:0;;27249:52;;27278:23;;-1:-1:-1;;;27278:23:0;;;;;;;;;;;27249:52;27422:49;27439:1;27443:7;27452:13;:18;;;27422:8;:49::i;:::-;-1:-1:-1;;;;;27767:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;27767:31:0;;;;;;;-1:-1:-1;;27767:31:0;;;;;;;27813:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;27813:29:0;;;;;;;;;;;27859:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;27904:61:0;;;;-1:-1:-1;;;27949:15:0;27904:61;;;;;;;;;;;28239:11;;;28269:24;;;;;:29;28239:11;;28269:29;28265:445;;28494:13;;28480:11;:27;28476:219;;;28564:18;;;28532:24;;;:11;:24;;;;;;;;:50;;28647:28;;;;28605:70;;-1:-1:-1;;;28605:70:0;-1:-1:-1;;;;;;28605:70:0;;;-1:-1:-1;;;;;28532:50:0;;;28605:70;;;;;;;28476:219;27742:979;28757:7;28753:2;-1:-1:-1;;;;;28738:27:0;28747:4;-1:-1:-1;;;;;28738:27:0;;;;;;;;;;;28776:42;26818:2008;;26714:2112;;;:::o;31900:667::-;32084:72;;-1:-1:-1;;;32084:72:0;;32063:4;;-1:-1:-1;;;;;32084:36:0;;;;;:72;;5866:10;;32135:4;;32141:7;;32150:5;;32084:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32084:72:0;;;;;;;;-1:-1:-1;;32084:72:0;;;;;;;;;;;;:::i;:::-;;;32080:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32318:13:0;;32314:235;;32364:40;;-1:-1:-1;;;32364:40:0;;;;;;;;;;;32314:235;32507:6;32501:13;32492:6;32488:2;32484:15;32477:38;32080:480;-1:-1:-1;;;;;;32203:55:0;-1:-1:-1;;;32203:55:0;;-1:-1:-1;31900:667:0;;;;;;:::o;24685:1775::-;24824:20;24847:13;-1:-1:-1;;;;;24875:16:0;;24871:48;;24900:19;;-1:-1:-1;;;24900:19:0;;;;;;;;;;;24871:48;24934:13;24930:44;;24956:18;;-1:-1:-1;;;24956:18:0;;;;;;;;;;;24930:44;-1:-1:-1;;;;;25325:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;25384:49:0;;25325:44;;;;;;;;25384:49;;;;-1:-1:-1;;25325:44:0;;;;;;25384:49;;;;;;;;;;;;;;;;25450:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;25500:66:0;;;;-1:-1:-1;;;25550:15:0;25500:66;;;;;;;;;;25450:25;25647:23;;;25691:4;:23;;;;-1:-1:-1;;;;;;25699:13:0;;7091:19;:23;;25699:15;25687:641;;;25735:314;25766:38;;25791:12;;-1:-1:-1;;;;;25766:38:0;;;25783:1;;25766:38;;25783:1;;25766:38;25832:69;25871:1;25875:2;25879:14;;;;;;25895:5;25832:30;:69::i;:::-;25827:174;;25937:40;;-1:-1:-1;;;25937:40:0;;;;;;;;;;;25827:174;26044:3;26028:12;:19;;25735:314;;26130:12;26113:13;;:29;26109:43;;26144:8;;;26109:43;25687:641;;;26193:120;26224:40;;26249:14;;;;;-1:-1:-1;;;;;26224:40:0;;;26241:1;;26224:40;;26241:1;;26224:40;26308:3;26292:12;:19;;26193:120;;25687:641;-1:-1:-1;26342:13:0;:28;26392:60;39498:222;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:186::-;887:6;940:2;928:9;919:7;915:23;911:32;908:52;;;956:1;953;946:12;908:52;979:29;998:9;979:29;:::i;1019:260::-;1087:6;1095;1148:2;1136:9;1127:7;1123:23;1119:32;1116:52;;;1164:1;1161;1154:12;1116:52;1187:29;1206:9;1187:29;:::i;:::-;1177:39;;1235:38;1269:2;1258:9;1254:18;1235:38;:::i;:::-;1225:48;;1019:260;;;;;:::o;1284:328::-;1361:6;1369;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1469:29;1488:9;1469:29;:::i;:::-;1459:39;;1517:38;1551:2;1540:9;1536:18;1517:38;:::i;:::-;1507:48;;1602:2;1591:9;1587:18;1574:32;1564:42;;1284:328;;;;;:::o;1617:666::-;1712:6;1720;1728;1736;1789:3;1777:9;1768:7;1764:23;1760:33;1757:53;;;1806:1;1803;1796:12;1757:53;1829:29;1848:9;1829:29;:::i;:::-;1819:39;;1877:38;1911:2;1900:9;1896:18;1877:38;:::i;:::-;1867:48;;1962:2;1951:9;1947:18;1934:32;1924:42;;2017:2;2006:9;2002:18;1989:32;2044:18;2036:6;2033:30;2030:50;;;2076:1;2073;2066:12;2030:50;2099:22;;2152:4;2144:13;;2140:27;-1:-1:-1;2130:55:1;;2181:1;2178;2171:12;2130:55;2204:73;2269:7;2264:2;2251:16;2246:2;2242;2238:11;2204:73;:::i;:::-;2194:83;;;1617:666;;;;;;;:::o;2288:315::-;2353:6;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:52;;;2430:1;2427;2420:12;2382:52;2453:29;2472:9;2453:29;:::i;:::-;2443:39;;2532:2;2521:9;2517:18;2504:32;2545:28;2567:5;2545:28;:::i;:::-;2592:5;2582:15;;;2288:315;;;;;:::o;2608:254::-;2676:6;2684;2737:2;2725:9;2716:7;2712:23;2708:32;2705:52;;;2753:1;2750;2743:12;2705:52;2776:29;2795:9;2776:29;:::i;:::-;2766:39;2852:2;2837:18;;;;2824:32;;-1:-1:-1;;;2608:254:1:o;2867:241::-;2923:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:52;;;2992:1;2989;2982:12;2944:52;3031:9;3018:23;3050:28;3072:5;3050:28;:::i;3113:245::-;3180:6;3233:2;3221:9;3212:7;3208:23;3204:32;3201:52;;;3249:1;3246;3239:12;3201:52;3281:9;3275:16;3300:28;3322:5;3300:28;:::i;3363:245::-;3421:6;3474:2;3462:9;3453:7;3449:23;3445:32;3442:52;;;3490:1;3487;3480:12;3442:52;3529:9;3516:23;3548:30;3572:5;3548:30;:::i;3613:249::-;3682:6;3735:2;3723:9;3714:7;3710:23;3706:32;3703:52;;;3751:1;3748;3741:12;3703:52;3783:9;3777:16;3802:30;3826:5;3802:30;:::i;3867:450::-;3936:6;3989:2;3977:9;3968:7;3964:23;3960:32;3957:52;;;4005:1;4002;3995:12;3957:52;4045:9;4032:23;4078:18;4070:6;4067:30;4064:50;;;4110:1;4107;4100:12;4064:50;4133:22;;4186:4;4178:13;;4174:27;-1:-1:-1;4164:55:1;;4215:1;4212;4205:12;4164:55;4238:73;4303:7;4298:2;4285:16;4280:2;4276;4272:11;4238:73;:::i;4322:180::-;4381:6;4434:2;4422:9;4413:7;4409:23;4405:32;4402:52;;;4450:1;4447;4440:12;4402:52;-1:-1:-1;4473:23:1;;4322:180;-1:-1:-1;4322:180:1:o;4507:184::-;4577:6;4630:2;4618:9;4609:7;4605:23;4601:32;4598:52;;;4646:1;4643;4636:12;4598:52;-1:-1:-1;4669:16:1;;4507:184;-1:-1:-1;4507:184:1:o;4696:257::-;4737:3;4775:5;4769:12;4802:6;4797:3;4790:19;4818:63;4874:6;4867:4;4862:3;4858:14;4851:4;4844:5;4840:16;4818:63;:::i;:::-;4935:2;4914:15;-1:-1:-1;;4910:29:1;4901:39;;;;4942:4;4897:50;;4696:257;-1:-1:-1;;4696:257:1:o;4958:1527::-;5182:3;5220:6;5214:13;5246:4;5259:51;5303:6;5298:3;5293:2;5285:6;5281:15;5259:51;:::i;:::-;5373:13;;5332:16;;;;5395:55;5373:13;5332:16;5417:15;;;5395:55;:::i;:::-;5539:13;;5472:20;;;5512:1;;5599;5621:18;;;;5674;;;;5701:93;;5779:4;5769:8;5765:19;5753:31;;5701:93;5842:2;5832:8;5829:16;5809:18;5806:40;5803:167;;;-1:-1:-1;;;5869:33:1;;5925:4;5922:1;5915:15;5955:4;5876:3;5943:17;5803:167;5986:18;6013:110;;;;6137:1;6132:328;;;;5979:481;;6013:110;-1:-1:-1;;6048:24:1;;6034:39;;6093:20;;;;-1:-1:-1;6013:110:1;;6132:328;12481:1;12474:14;;;12518:4;12505:18;;6227:1;6241:169;6255:8;6252:1;6249:15;6241:169;;;6337:14;;6322:13;;;6315:37;6380:16;;;;6272:10;;6241:169;;;6245:3;;6441:8;6434:5;6430:20;6423:27;;5979:481;-1:-1:-1;6476:3:1;;4958:1527;-1:-1:-1;;;;;;;;;;;4958:1527:1:o;7597:488::-;-1:-1:-1;;;;;7866:15:1;;;7848:34;;7918:15;;7913:2;7898:18;;7891:43;7965:2;7950:18;;7943:34;;;8013:3;8008:2;7993:18;;7986:31;;;7791:4;;8034:45;;8059:19;;8051:6;8034:45;:::i;:::-;8026:53;7597:488;-1:-1:-1;;;;;;7597:488:1:o;8369:632::-;8540:2;8592:21;;;8662:13;;8565:18;;;8684:22;;;8511:4;;8540:2;8763:15;;;;8737:2;8722:18;;;8511:4;8806:169;8820:6;8817:1;8814:13;8806:169;;;8881:13;;8869:26;;8950:15;;;;8915:12;;;;8842:1;8835:9;8806:169;;;-1:-1:-1;8992:3:1;;8369:632;-1:-1:-1;;;;;;8369:632:1:o;9421:219::-;9570:2;9559:9;9552:21;9533:4;9590:44;9630:2;9619:9;9615:18;9607:6;9590:44;:::i;10401:356::-;10603:2;10585:21;;;10622:18;;;10615:30;10681:34;10676:2;10661:18;;10654:62;10748:2;10733:18;;10401:356::o;11178:344::-;11380:2;11362:21;;;11419:2;11399:18;;;11392:30;-1:-1:-1;;;11453:2:1;11438:18;;11431:50;11513:2;11498:18;;11178:344::o;12534:128::-;12574:3;12605:1;12601:6;12598:1;12595:13;12592:39;;;12611:18;;:::i;:::-;-1:-1:-1;12647:9:1;;12534:128::o;12667:120::-;12707:1;12733;12723:35;;12738:18;;:::i;:::-;-1:-1:-1;12772:9:1;;12667:120::o;12792:168::-;12832:7;12898:1;12894;12890:6;12886:14;12883:1;12880:21;12875:1;12868:9;12861:17;12857:45;12854:71;;;12905:18;;:::i;:::-;-1:-1:-1;12945:9:1;;12792:168::o;12965:125::-;13005:4;13033:1;13030;13027:8;13024:34;;;13038:18;;:::i;:::-;-1:-1:-1;13075:9:1;;12965:125::o;13095:258::-;13167:1;13177:113;13191:6;13188:1;13185:13;13177:113;;;13267:11;;;13261:18;13248:11;;;13241:39;13213:2;13206:10;13177:113;;;13308:6;13305:1;13302:13;13299:48;;;-1:-1:-1;;13343:1:1;13325:16;;13318:27;13095:258::o;13358:380::-;13437:1;13433:12;;;;13480;;;13501:61;;13555:4;13547:6;13543:17;13533:27;;13501:61;13608:2;13600:6;13597:14;13577:18;13574:38;13571:161;;;13654:10;13649:3;13645:20;13642:1;13635:31;13689:4;13686:1;13679:15;13717:4;13714:1;13707:15;13571:161;;13358:380;;;:::o;13743:135::-;13782:3;-1:-1:-1;;13803:17:1;;13800:43;;;13823:18;;:::i;:::-;-1:-1:-1;13870:1:1;13859:13;;13743:135::o;13883:112::-;13915:1;13941;13931:35;;13946:18;;:::i;:::-;-1:-1:-1;13980:9:1;;13883:112::o;14000:127::-;14061:10;14056:3;14052:20;14049:1;14042:31;14092:4;14089:1;14082:15;14116:4;14113:1;14106:15;14132:127;14193:10;14188:3;14184:20;14181:1;14174:31;14224:4;14221:1;14214:15;14248:4;14245:1;14238:15;14264:127;14325:10;14320:3;14316:20;14313:1;14306:31;14356:4;14353:1;14346:15;14380:4;14377:1;14370:15;14396:127;14457:10;14452:3;14448:20;14445:1;14438:31;14488:4;14485:1;14478:15;14512:4;14509:1;14502:15;14528:118;14614:5;14607:13;14600:21;14593:5;14590:32;14580:60;;14636:1;14633;14626:12;14651:131;-1:-1:-1;;;;;;14725:32:1;;14715:43;;14705:71;;14772:1;14769;14762:12

Swarm Source

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