ETH Price: $2,912.41 (+0.05%)
Gas: 4 Gwei

Token

Mfer Cribs (MferCribs)
 

Overview

Max Total Supply

1,002 MferCribs

Holders

383

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 MferCribs
0xc30782464f06a98d9d1389bb87aa4f5f8801b60f
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:
MferCribs

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-28
*/

/*
    hey mfers.
 */
pragma solidity ^0.8.0;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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 payable private _owner;

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

    constructor() {
        _setOwner(_msgSender());
    }

    function owner() public view virtual returns (address payable) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = payable(newOwner);
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

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

    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

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

    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

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

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

    string private _name;

    string private _symbol;

    mapping(uint256 => address) private _owners;

    mapping(address => uint256) private _balances;

    mapping(uint256 => address) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        return _balances[owner];
    }

    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );
        return owner;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

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

        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId.toString()))
                : "";
    }

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

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI)
        internal
        virtual
    {
        require(
            _exists(tokenId),
            "ERC721URIStorage: URI set of nonexistent token"
        );
        _tokenURIs[tokenId] = _tokenURI;
    }

    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

interface IAccessControl {
    event RoleAdminChanged(
        bytes32 indexed role,
        bytes32 indexed previousAdminRole,
        bytes32 indexed newAdminRole
    );

    event RoleGranted(
        bytes32 indexed role,
        address indexed account,
        address indexed sender
    );

    event RoleRevoked(
        bytes32 indexed role,
        address indexed account,
        address indexed sender
    );

    function hasRole(bytes32 role, address account)
        external
        view
        returns (bool);

    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    function grantRole(bytes32 role, address account) external;

    function revokeRole(bytes32 role, address account) external;

    function renounceRole(bytes32 role, address account) external;
}

abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IAccessControl).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function hasRole(bytes32 role, address account)
        public
        view
        override
        returns (bool)
    {
        return _roles[role].members[account];
    }

    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    function grantRole(bytes32 role, address account)
        public
        virtual
        override
        onlyRole(getRoleAdmin(role))
    {
        _grantRole(role, account);
    }

    function revokeRole(bytes32 role, address account)
        public
        virtual
        override
        onlyRole(getRoleAdmin(role))
    {
        _revokeRole(role, account);
    }

    function renounceRole(bytes32 role, address account)
        public
        virtual
        override
    {
        require(
            account == _msgSender(),
            "AccessControl: can only renounce roles for self"
        );

        _revokeRole(role, account);
    }

    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

contract MferCribs is ERC721URIStorage, Ownable, AccessControl {
    using SafeMath for uint256;

    bytes32 public constant PRE_SALE_ROLE = keccak256("PRE_SALE_ROLE");
    string private contractUri;
    string private baseUri;
    uint8 private platformRoyalty;
    mapping(uint256 => uint256) tokenSalePrices;
    event TokenSold(
        uint256 tokenId,
        address from,
        address to,
        uint256 price,
        uint256 royaltyPaid
    );

    bool public saleIsActive = false;
    uint256 public MAX_MINT;
    uint256 public constant apePrice = 22000000000000000; //0.022 ETH
    uint256 public constant maxApePurchase = 8888;
    uint256 public totalMintNumber;

    function totalSupply() public view returns (uint256) {
        return totalMintNumber;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, AccessControl)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    constructor() ERC721("Mfer Cribs", "MferCribs") {
      
        contractUri = "http://nft-stage-bwrld.s3-website.us-east-2.amazonaws.com/contract";
        baseUri = "http://nft-stage-bwrld.s3-website.us-east-2.amazonaws.com/ipfs/";

        MAX_MINT = 8888;

        totalMintNumber = 0;
        platformRoyalty = 5;

        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
    }

    function contractURI() public view returns (string memory) {
        return contractUri;
    }

    function setContractUri(string memory newUri) public onlyOwner {
        contractUri = newUri;
    }

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

    function setBaseUri(string memory newUri) public onlyOwner {
        baseUri = newUri;
    }

    function withdraw() public onlyOwner {
        uint amount = address(this).balance;

        (bool success, ) = owner().call{value: amount}("");
        require(success, "Failed to send Ether");
    }

    function platformFee() public view returns (uint8) {
        return platformRoyalty;
    }

    function setPlatformFee(uint8 newFee) public onlyOwner {
        platformRoyalty = newFee;
    }

    function mintNFT(uint256 numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint");
        require(
            numberOfTokens <= maxApePurchase,
            "Can only mint x tokens at a time"
        );
        require(
            totalSupply().add(numberOfTokens) <= MAX_MINT,
            "Purchase would exceed max supply"
        );
        require(
            apePrice.mul(numberOfTokens) <= msg.value,
            "Ether value sent is not correct"
        );

        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 mintIndex = totalSupply();
            if (totalSupply() < MAX_MINT) {
                require(!_exists(mintIndex), "Has already been minted");
                totalMintNumber = totalMintNumber + 1;
                _mint(msg.sender, mintIndex);
            }
        }
    }

    /*
     * Pause sale if active, make active if paused
     */
    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function isApprovedForAll(address _owner, address _operator)
        public
        view
        override
        returns (bool isOperator)
    {
        // Whitelist OpenSea proxy contract for easy trading.

        return isApprovedForAll(_owner, _operator);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override {
        super._beforeTokenTransfer(from, to, tokenId);
        if (tokenSalePrices[tokenId] > 0) {
            tokenSalePrices[tokenId] = 0;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"royaltyPaid","type":"uint256"}],"name":"TokenSold","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_SALE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apePrice","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":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxApePurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","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":"platformFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"setContractUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newFee","type":"uint8"}],"name":"setPlatformFee","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":"totalMintNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600d805460ff191690553480156200001b57600080fd5b50604080518082018252600a8152694d66657220437269627360b01b6020808301918252835180850190945260098452684d666572437269627360b81b9084015281519192916200006f916000916200023a565b508051620000859060019060208401906200023a565b505050620000a26200009c6200013060201b60201c565b62000134565b6040518060800160405280604281526020016200293e604291398051620000d2916009916020909101906200023a565b506040518060600160405280603f8152602001620028ff603f913980516200010391600a916020909101906200023a565b506122b8600e556000600f819055600b805460ff191660051790556200012a903362000186565b6200031d565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62000192828262000196565b5050565b60008281526008602090815260408083206001600160a01b038516845290915290205460ff16620001925760008281526008602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620001f63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b8280546200024890620002e0565b90600052602060002090601f0160209004810192826200026c5760008555620002b7565b82601f106200028757805160ff1916838001178555620002b7565b82800160010185558215620002b7579182015b82811115620002b75782518255916020019190600101906200029a565b50620002c5929150620002c9565b5090565b5b80821115620002c55760008155600101620002ca565b600181811c90821680620002f557607f821691505b602082108114156200031757634e487b7160e01b600052602260045260246000fd5b50919050565b6125d2806200032d6000396000f3fe60806040526004361061021a5760003560e01c80637a3f451e11610123578063b88d4fde116100ab578063e8a3d4851161006f578063e8a3d48514610616578063e985e9c51461062b578063eb8d24441461064b578063f0292a0314610665578063f2fde38b1461067b57600080fd5b8063b88d4fde14610580578063bf5142de146105a0578063c87b56dd146105b6578063ccb4807b146105d6578063d547741f146105f657600080fd5b806392642744116100f2578063926427441461050357806395d89b4114610516578063a0bcfc7f1461052b578063a217fddf1461054b578063a22cb4651461056057600080fd5b80637a3f451e1461048a5780638042853f146104a55780638da5cb5b146104c557806391d14854146104e357600080fd5b806334918dfd116101a657806342842e0e1161017557806342842e0e146103ff578063571dff3b1461041f5780636352211e1461043557806370a0823114610455578063715018a61461047557600080fd5b806334918dfd1461038157806336568abe1461039657806337754d9a146103b65780633ccfd60b146103ea57600080fd5b806318160ddd116101ed57806318160ddd146102d057806323b872dd146102ef578063248a9ca31461030f57806326232a2e1461033f5780632f2ff15d1461036157600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a36600461219e565b61069b565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106ac565b60405161024b919061234a565b34801561028257600080fd5b50610296610291366004612164565b61073e565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102ce6102c936600461213b565b6107cb565b005b3480156102dc57600080fd5b50600f545b60405190815260200161024b565b3480156102fb57600080fd5b506102ce61030a36600461204d565b6108e1565b34801561031b57600080fd5b506102e161032a366004612164565b60009081526008602052604090206001015490565b34801561034b57600080fd5b50600b5460405160ff909116815260200161024b565b34801561036d57600080fd5b506102ce61037c36600461217c565b610912565b34801561038d57600080fd5b506102ce610938565b3480156103a257600080fd5b506102ce6103b136600461217c565b610976565b3480156103c257600080fd5b506102e17f413b964388ffbef8da45753e2ce53bd2bcc66055e28876253fbd02817f2b316581565b3480156103f657600080fd5b506102ce6109f4565b34801561040b57600080fd5b506102ce61041a36600461204d565b610aca565b34801561042b57600080fd5b506102e16122b881565b34801561044157600080fd5b50610296610450366004612164565b610ae5565b34801561046157600080fd5b506102e1610470366004612001565b610b5c565b34801561048157600080fd5b506102ce610be3565b34801561049657600080fd5b506102e1664e28e2290f000081565b3480156104b157600080fd5b506102ce6104c036600461221c565b610c19565b3480156104d157600080fd5b506007546001600160a01b0316610296565b3480156104ef57600080fd5b5061023f6104fe36600461217c565b610c59565b6102ce610511366004612164565b610c84565b34801561052257600080fd5b50610269610e9a565b34801561053757600080fd5b506102ce6105463660046121d6565b610ea9565b34801561055757600080fd5b506102e1600081565b34801561056c57600080fd5b506102ce61057b366004612101565b610ee6565b34801561058c57600080fd5b506102ce61059b366004612088565b610fab565b3480156105ac57600080fd5b506102e1600f5481565b3480156105c257600080fd5b506102696105d1366004612164565b610fe3565b3480156105e257600080fd5b506102ce6105f13660046121d6565b61114d565b34801561060257600080fd5b506102ce61061136600461217c565b61118a565b34801561062257600080fd5b506102696111b0565b34801561063757600080fd5b5061023f61064636600461201b565b6111bf565b34801561065757600080fd5b50600d5461023f9060ff1681565b34801561067157600080fd5b506102e1600e5481565b34801561068757600080fd5b506102ce610696366004612001565b6111d2565b60006106a68261126d565b92915050565b6060600080546106bb906124da565b80601f01602080910402602001604051908101604052809291908181526020018280546106e7906124da565b80156107345780601f1061070957610100808354040283529160200191610734565b820191906000526020600020905b81548152906001019060200180831161071757829003601f168201915b5050505050905090565b600061074982611292565b6107af5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107d682610ae5565b9050806001600160a01b0316836001600160a01b031614156108445760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107a6565b336001600160a01b0382161480610860575061086081336111bf565b6108d25760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107a6565b6108dc83836112af565b505050565b6108eb338261131d565b6109075760405162461bcd60e51b81526004016107a6906123e4565b6108dc8383836113df565b60008281526008602052604090206001015461092e813361158a565b6108dc83836115ee565b6007546001600160a01b031633146109625760405162461bcd60e51b81526004016107a6906123af565b600d805460ff19811660ff90911615179055565b6001600160a01b03811633146109e65760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016107a6565b6109f08282611674565b5050565b6007546001600160a01b03163314610a1e5760405162461bcd60e51b81526004016107a6906123af565b476000610a336007546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610a7d576040519150601f19603f3d011682016040523d82523d6000602084013e610a82565b606091505b50509050806109f05760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016107a6565b6108dc83838360405180602001604052806000815250610fab565b6000818152600260205260408120546001600160a01b0316806106a65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107a6565b60006001600160a01b038216610bc75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107a6565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b03163314610c0d5760405162461bcd60e51b81526004016107a6906123af565b610c1760006116db565b565b6007546001600160a01b03163314610c435760405162461bcd60e51b81526004016107a6906123af565b600b805460ff191660ff92909216919091179055565b60009182526008602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600d5460ff16610cd65760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e74000000000060448201526064016107a6565b6122b8811115610d285760405162461bcd60e51b815260206004820181905260248201527f43616e206f6e6c79206d696e74207820746f6b656e7320617420612074696d6560448201526064016107a6565b600e54610d3e82610d38600f5490565b9061172d565b1115610d8c5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201526064016107a6565b34610d9e664e28e2290f00008361178c565b1115610dec5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016107a6565b60005b818110156109f0576000610e02600f5490565b9050600e54610e10600f5490565b1015610e8757610e1f81611292565b15610e6c5760405162461bcd60e51b815260206004820152601760248201527f48617320616c7265616479206265656e206d696e74656400000000000000000060448201526064016107a6565b600f54610e7a906001612435565b600f55610e87338261180b565b5080610e9281612515565b915050610def565b6060600180546106bb906124da565b6007546001600160a01b03163314610ed35760405162461bcd60e51b81526004016107a6906123af565b80516109f090600a906020840190611ed6565b6001600160a01b038216331415610f3f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107a6565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610fb5338361131d565b610fd15760405162461bcd60e51b81526004016107a6906123e4565b610fdd8484848461194a565b50505050565b6060610fee82611292565b6110545760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b60648201526084016107a6565b6000828152600660205260408120805461106d906124da565b80601f0160208091040260200160405190810160405280929190818152602001828054611099906124da565b80156110e65780601f106110bb576101008083540402835291602001916110e6565b820191906000526020600020905b8154815290600101906020018083116110c957829003601f168201915b5050505050905060006110f761197d565b905080516000141561110a575092915050565b81511561113c578082604051602001611124929190612269565b60405160208183030381529060405292505050919050565b6111458461198c565b949350505050565b6007546001600160a01b031633146111775760405162461bcd60e51b81526004016107a6906123af565b80516109f0906009906020840190611ed6565b6000828152600860205260409020600101546111a6813361158a565b6108dc8383611674565b6060600980546106bb906124da565b60006111cb83836111bf565b9392505050565b6007546001600160a01b031633146111fc5760405162461bcd60e51b81526004016107a6906123af565b6001600160a01b0381166112615760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a6565b61126a816116db565b50565b60006001600160e01b03198216637965db0b60e01b14806106a657506106a682611a56565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906112e482610ae5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061132882611292565b6113895760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107a6565b600061139483610ae5565b9050806001600160a01b0316846001600160a01b031614806113cf5750836001600160a01b03166113c48461073e565b6001600160a01b0316145b80611145575061114581856111bf565b826001600160a01b03166113f282610ae5565b6001600160a01b03161461145a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107a6565b6001600160a01b0382166114bc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107a6565b6114c7838383611aa6565b6114d26000826112af565b6001600160a01b03831660009081526003602052604081208054600192906114fb908490612480565b90915550506001600160a01b0382166000908152600360205260408120805460019290611529908490612435565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6115948282610c59565b6109f0576115ac816001600160a01b03166014611acd565b6115b7836020611acd565b6040516020016115c8929190612298565b60408051601f198184030181529082905262461bcd60e51b82526107a69160040161234a565b6115f88282610c59565b6109f05760008281526008602090815260408083206001600160a01b03851684529091529020805460ff191660011790556116303390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61167e8282610c59565b156109f05760008281526008602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008061173a8385612435565b9050838110156111cb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016107a6565b60008261179b575060006106a6565b60006117a78385612461565b9050826117b4858361244d565b146111cb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016107a6565b6001600160a01b0382166118615760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107a6565b61186a81611292565b156118b75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107a6565b6118c360008383611aa6565b6001600160a01b03821660009081526003602052604081208054600192906118ec908490612435565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6119558484846113df565b61196184848484611caf565b610fdd5760405162461bcd60e51b81526004016107a69061235d565b6060600a80546106bb906124da565b606061199782611292565b6119fb5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107a6565b6000611a0561197d565b90506000815111611a2557604051806020016040528060008152506111cb565b80611a2f84611dbc565b604051602001611a40929190612269565b6040516020818303038152906040529392505050565b60006001600160e01b031982166380ac58cd60e01b1480611a8757506001600160e01b03198216635b5e139f60e01b145b806106a657506301ffc9a760e01b6001600160e01b03198316146106a6565b6000818152600c6020526040902054156108dc576000908152600c60205260408120555050565b60606000611adc836002612461565b611ae7906002612435565b67ffffffffffffffff811115611b0d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b37576020820181803683370190505b509050600360fc1b81600081518110611b6057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611b9d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000611bc1846002612461565b611bcc906001612435565b90505b6001811115611c60576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611c0e57634e487b7160e01b600052603260045260246000fd5b1a60f81b828281518110611c3257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93611c59816124c3565b9050611bcf565b5083156111cb5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016107a6565b60006001600160a01b0384163b15611db157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611cf390339089908890889060040161230d565b602060405180830381600087803b158015611d0d57600080fd5b505af1925050508015611d3d575060408051601f3d908101601f19168201909252611d3a918101906121ba565b60015b611d97573d808015611d6b576040519150601f19603f3d011682016040523d82523d6000602084013e611d70565b606091505b508051611d8f5760405162461bcd60e51b81526004016107a69061235d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611145565b506001949350505050565b606081611de05750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e0a5780611df481612515565b9150611e039050600a8361244d565b9150611de4565b60008167ffffffffffffffff811115611e3357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611e5d576020820181803683370190505b5090505b841561114557611e72600183612480565b9150611e7f600a86612530565b611e8a906030612435565b60f81b818381518110611ead57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611ecf600a8661244d565b9450611e61565b828054611ee2906124da565b90600052602060002090601f016020900481019282611f045760008555611f4a565b82601f10611f1d57805160ff1916838001178555611f4a565b82800160010185558215611f4a579182015b82811115611f4a578251825591602001919060010190611f2f565b50611f56929150611f5a565b5090565b5b80821115611f565760008155600101611f5b565b600067ffffffffffffffff80841115611f8a57611f8a612570565b604051601f8501601f19908116603f01168101908282118183101715611fb257611fb2612570565b81604052809350858152868686011115611fcb57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611ffc57600080fd5b919050565b600060208284031215612012578081fd5b6111cb82611fe5565b6000806040838503121561202d578081fd5b61203683611fe5565b915061204460208401611fe5565b90509250929050565b600080600060608486031215612061578081fd5b61206a84611fe5565b925061207860208501611fe5565b9150604084013590509250925092565b6000806000806080858703121561209d578081fd5b6120a685611fe5565b93506120b460208601611fe5565b925060408501359150606085013567ffffffffffffffff8111156120d6578182fd5b8501601f810187136120e6578182fd5b6120f587823560208401611f6f565b91505092959194509250565b60008060408385031215612113578182fd5b61211c83611fe5565b915060208301358015158114612130578182fd5b809150509250929050565b6000806040838503121561214d578182fd5b61215683611fe5565b946020939093013593505050565b600060208284031215612175578081fd5b5035919050565b6000806040838503121561218e578182fd5b8235915061204460208401611fe5565b6000602082840312156121af578081fd5b81356111cb81612586565b6000602082840312156121cb578081fd5b81516111cb81612586565b6000602082840312156121e7578081fd5b813567ffffffffffffffff8111156121fd578182fd5b8201601f8101841361220d578182fd5b61114584823560208401611f6f565b60006020828403121561222d578081fd5b813560ff811681146111cb578182fd5b60008151808452612255816020860160208601612497565b601f01601f19169290920160200192915050565b6000835161227b818460208801612497565b83519083019061228f818360208801612497565b01949350505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516122d0816017850160208801612497565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612301816028840160208801612497565b01602801949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123409083018461223d565b9695505050505050565b6020815260006111cb602083018461223d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561244857612448612544565b500190565b60008261245c5761245c61255a565b500490565b600081600019048311821515161561247b5761247b612544565b500290565b60008282101561249257612492612544565b500390565b60005b838110156124b257818101518382015260200161249a565b83811115610fdd5750506000910152565b6000816124d2576124d2612544565b506000190190565b600181811c908216806124ee57607f821691505b6020821081141561250f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561252957612529612544565b5060010190565b60008261253f5761253f61255a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461126a57600080fdfea2646970667358221220329b167f9c3886ff568515431868ba9c03b7dc568e6432ca042051b6ebb0582a64736f6c63430008040033687474703a2f2f6e66742d73746167652d6277726c642e73332d776562736974652e75732d656173742d322e616d617a6f6e6177732e636f6d2f697066732f687474703a2f2f6e66742d73746167652d6277726c642e73332d776562736974652e75732d656173742d322e616d617a6f6e6177732e636f6d2f636f6e7472616374

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80637a3f451e11610123578063b88d4fde116100ab578063e8a3d4851161006f578063e8a3d48514610616578063e985e9c51461062b578063eb8d24441461064b578063f0292a0314610665578063f2fde38b1461067b57600080fd5b8063b88d4fde14610580578063bf5142de146105a0578063c87b56dd146105b6578063ccb4807b146105d6578063d547741f146105f657600080fd5b806392642744116100f2578063926427441461050357806395d89b4114610516578063a0bcfc7f1461052b578063a217fddf1461054b578063a22cb4651461056057600080fd5b80637a3f451e1461048a5780638042853f146104a55780638da5cb5b146104c557806391d14854146104e357600080fd5b806334918dfd116101a657806342842e0e1161017557806342842e0e146103ff578063571dff3b1461041f5780636352211e1461043557806370a0823114610455578063715018a61461047557600080fd5b806334918dfd1461038157806336568abe1461039657806337754d9a146103b65780633ccfd60b146103ea57600080fd5b806318160ddd116101ed57806318160ddd146102d057806323b872dd146102ef578063248a9ca31461030f57806326232a2e1461033f5780632f2ff15d1461036157600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a36600461219e565b61069b565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106ac565b60405161024b919061234a565b34801561028257600080fd5b50610296610291366004612164565b61073e565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102ce6102c936600461213b565b6107cb565b005b3480156102dc57600080fd5b50600f545b60405190815260200161024b565b3480156102fb57600080fd5b506102ce61030a36600461204d565b6108e1565b34801561031b57600080fd5b506102e161032a366004612164565b60009081526008602052604090206001015490565b34801561034b57600080fd5b50600b5460405160ff909116815260200161024b565b34801561036d57600080fd5b506102ce61037c36600461217c565b610912565b34801561038d57600080fd5b506102ce610938565b3480156103a257600080fd5b506102ce6103b136600461217c565b610976565b3480156103c257600080fd5b506102e17f413b964388ffbef8da45753e2ce53bd2bcc66055e28876253fbd02817f2b316581565b3480156103f657600080fd5b506102ce6109f4565b34801561040b57600080fd5b506102ce61041a36600461204d565b610aca565b34801561042b57600080fd5b506102e16122b881565b34801561044157600080fd5b50610296610450366004612164565b610ae5565b34801561046157600080fd5b506102e1610470366004612001565b610b5c565b34801561048157600080fd5b506102ce610be3565b34801561049657600080fd5b506102e1664e28e2290f000081565b3480156104b157600080fd5b506102ce6104c036600461221c565b610c19565b3480156104d157600080fd5b506007546001600160a01b0316610296565b3480156104ef57600080fd5b5061023f6104fe36600461217c565b610c59565b6102ce610511366004612164565b610c84565b34801561052257600080fd5b50610269610e9a565b34801561053757600080fd5b506102ce6105463660046121d6565b610ea9565b34801561055757600080fd5b506102e1600081565b34801561056c57600080fd5b506102ce61057b366004612101565b610ee6565b34801561058c57600080fd5b506102ce61059b366004612088565b610fab565b3480156105ac57600080fd5b506102e1600f5481565b3480156105c257600080fd5b506102696105d1366004612164565b610fe3565b3480156105e257600080fd5b506102ce6105f13660046121d6565b61114d565b34801561060257600080fd5b506102ce61061136600461217c565b61118a565b34801561062257600080fd5b506102696111b0565b34801561063757600080fd5b5061023f61064636600461201b565b6111bf565b34801561065757600080fd5b50600d5461023f9060ff1681565b34801561067157600080fd5b506102e1600e5481565b34801561068757600080fd5b506102ce610696366004612001565b6111d2565b60006106a68261126d565b92915050565b6060600080546106bb906124da565b80601f01602080910402602001604051908101604052809291908181526020018280546106e7906124da565b80156107345780601f1061070957610100808354040283529160200191610734565b820191906000526020600020905b81548152906001019060200180831161071757829003601f168201915b5050505050905090565b600061074982611292565b6107af5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107d682610ae5565b9050806001600160a01b0316836001600160a01b031614156108445760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107a6565b336001600160a01b0382161480610860575061086081336111bf565b6108d25760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107a6565b6108dc83836112af565b505050565b6108eb338261131d565b6109075760405162461bcd60e51b81526004016107a6906123e4565b6108dc8383836113df565b60008281526008602052604090206001015461092e813361158a565b6108dc83836115ee565b6007546001600160a01b031633146109625760405162461bcd60e51b81526004016107a6906123af565b600d805460ff19811660ff90911615179055565b6001600160a01b03811633146109e65760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016107a6565b6109f08282611674565b5050565b6007546001600160a01b03163314610a1e5760405162461bcd60e51b81526004016107a6906123af565b476000610a336007546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610a7d576040519150601f19603f3d011682016040523d82523d6000602084013e610a82565b606091505b50509050806109f05760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016107a6565b6108dc83838360405180602001604052806000815250610fab565b6000818152600260205260408120546001600160a01b0316806106a65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107a6565b60006001600160a01b038216610bc75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107a6565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b03163314610c0d5760405162461bcd60e51b81526004016107a6906123af565b610c1760006116db565b565b6007546001600160a01b03163314610c435760405162461bcd60e51b81526004016107a6906123af565b600b805460ff191660ff92909216919091179055565b60009182526008602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600d5460ff16610cd65760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e74000000000060448201526064016107a6565b6122b8811115610d285760405162461bcd60e51b815260206004820181905260248201527f43616e206f6e6c79206d696e74207820746f6b656e7320617420612074696d6560448201526064016107a6565b600e54610d3e82610d38600f5490565b9061172d565b1115610d8c5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201526064016107a6565b34610d9e664e28e2290f00008361178c565b1115610dec5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016107a6565b60005b818110156109f0576000610e02600f5490565b9050600e54610e10600f5490565b1015610e8757610e1f81611292565b15610e6c5760405162461bcd60e51b815260206004820152601760248201527f48617320616c7265616479206265656e206d696e74656400000000000000000060448201526064016107a6565b600f54610e7a906001612435565b600f55610e87338261180b565b5080610e9281612515565b915050610def565b6060600180546106bb906124da565b6007546001600160a01b03163314610ed35760405162461bcd60e51b81526004016107a6906123af565b80516109f090600a906020840190611ed6565b6001600160a01b038216331415610f3f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107a6565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610fb5338361131d565b610fd15760405162461bcd60e51b81526004016107a6906123e4565b610fdd8484848461194a565b50505050565b6060610fee82611292565b6110545760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b60648201526084016107a6565b6000828152600660205260408120805461106d906124da565b80601f0160208091040260200160405190810160405280929190818152602001828054611099906124da565b80156110e65780601f106110bb576101008083540402835291602001916110e6565b820191906000526020600020905b8154815290600101906020018083116110c957829003601f168201915b5050505050905060006110f761197d565b905080516000141561110a575092915050565b81511561113c578082604051602001611124929190612269565b60405160208183030381529060405292505050919050565b6111458461198c565b949350505050565b6007546001600160a01b031633146111775760405162461bcd60e51b81526004016107a6906123af565b80516109f0906009906020840190611ed6565b6000828152600860205260409020600101546111a6813361158a565b6108dc8383611674565b6060600980546106bb906124da565b60006111cb83836111bf565b9392505050565b6007546001600160a01b031633146111fc5760405162461bcd60e51b81526004016107a6906123af565b6001600160a01b0381166112615760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a6565b61126a816116db565b50565b60006001600160e01b03198216637965db0b60e01b14806106a657506106a682611a56565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906112e482610ae5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061132882611292565b6113895760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107a6565b600061139483610ae5565b9050806001600160a01b0316846001600160a01b031614806113cf5750836001600160a01b03166113c48461073e565b6001600160a01b0316145b80611145575061114581856111bf565b826001600160a01b03166113f282610ae5565b6001600160a01b03161461145a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107a6565b6001600160a01b0382166114bc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107a6565b6114c7838383611aa6565b6114d26000826112af565b6001600160a01b03831660009081526003602052604081208054600192906114fb908490612480565b90915550506001600160a01b0382166000908152600360205260408120805460019290611529908490612435565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6115948282610c59565b6109f0576115ac816001600160a01b03166014611acd565b6115b7836020611acd565b6040516020016115c8929190612298565b60408051601f198184030181529082905262461bcd60e51b82526107a69160040161234a565b6115f88282610c59565b6109f05760008281526008602090815260408083206001600160a01b03851684529091529020805460ff191660011790556116303390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61167e8282610c59565b156109f05760008281526008602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008061173a8385612435565b9050838110156111cb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016107a6565b60008261179b575060006106a6565b60006117a78385612461565b9050826117b4858361244d565b146111cb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016107a6565b6001600160a01b0382166118615760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107a6565b61186a81611292565b156118b75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107a6565b6118c360008383611aa6565b6001600160a01b03821660009081526003602052604081208054600192906118ec908490612435565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6119558484846113df565b61196184848484611caf565b610fdd5760405162461bcd60e51b81526004016107a69061235d565b6060600a80546106bb906124da565b606061199782611292565b6119fb5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107a6565b6000611a0561197d565b90506000815111611a2557604051806020016040528060008152506111cb565b80611a2f84611dbc565b604051602001611a40929190612269565b6040516020818303038152906040529392505050565b60006001600160e01b031982166380ac58cd60e01b1480611a8757506001600160e01b03198216635b5e139f60e01b145b806106a657506301ffc9a760e01b6001600160e01b03198316146106a6565b6000818152600c6020526040902054156108dc576000908152600c60205260408120555050565b60606000611adc836002612461565b611ae7906002612435565b67ffffffffffffffff811115611b0d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b37576020820181803683370190505b509050600360fc1b81600081518110611b6057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611b9d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000611bc1846002612461565b611bcc906001612435565b90505b6001811115611c60576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611c0e57634e487b7160e01b600052603260045260246000fd5b1a60f81b828281518110611c3257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93611c59816124c3565b9050611bcf565b5083156111cb5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016107a6565b60006001600160a01b0384163b15611db157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611cf390339089908890889060040161230d565b602060405180830381600087803b158015611d0d57600080fd5b505af1925050508015611d3d575060408051601f3d908101601f19168201909252611d3a918101906121ba565b60015b611d97573d808015611d6b576040519150601f19603f3d011682016040523d82523d6000602084013e611d70565b606091505b508051611d8f5760405162461bcd60e51b81526004016107a69061235d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611145565b506001949350505050565b606081611de05750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e0a5780611df481612515565b9150611e039050600a8361244d565b9150611de4565b60008167ffffffffffffffff811115611e3357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611e5d576020820181803683370190505b5090505b841561114557611e72600183612480565b9150611e7f600a86612530565b611e8a906030612435565b60f81b818381518110611ead57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611ecf600a8661244d565b9450611e61565b828054611ee2906124da565b90600052602060002090601f016020900481019282611f045760008555611f4a565b82601f10611f1d57805160ff1916838001178555611f4a565b82800160010185558215611f4a579182015b82811115611f4a578251825591602001919060010190611f2f565b50611f56929150611f5a565b5090565b5b80821115611f565760008155600101611f5b565b600067ffffffffffffffff80841115611f8a57611f8a612570565b604051601f8501601f19908116603f01168101908282118183101715611fb257611fb2612570565b81604052809350858152868686011115611fcb57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611ffc57600080fd5b919050565b600060208284031215612012578081fd5b6111cb82611fe5565b6000806040838503121561202d578081fd5b61203683611fe5565b915061204460208401611fe5565b90509250929050565b600080600060608486031215612061578081fd5b61206a84611fe5565b925061207860208501611fe5565b9150604084013590509250925092565b6000806000806080858703121561209d578081fd5b6120a685611fe5565b93506120b460208601611fe5565b925060408501359150606085013567ffffffffffffffff8111156120d6578182fd5b8501601f810187136120e6578182fd5b6120f587823560208401611f6f565b91505092959194509250565b60008060408385031215612113578182fd5b61211c83611fe5565b915060208301358015158114612130578182fd5b809150509250929050565b6000806040838503121561214d578182fd5b61215683611fe5565b946020939093013593505050565b600060208284031215612175578081fd5b5035919050565b6000806040838503121561218e578182fd5b8235915061204460208401611fe5565b6000602082840312156121af578081fd5b81356111cb81612586565b6000602082840312156121cb578081fd5b81516111cb81612586565b6000602082840312156121e7578081fd5b813567ffffffffffffffff8111156121fd578182fd5b8201601f8101841361220d578182fd5b61114584823560208401611f6f565b60006020828403121561222d578081fd5b813560ff811681146111cb578182fd5b60008151808452612255816020860160208601612497565b601f01601f19169290920160200192915050565b6000835161227b818460208801612497565b83519083019061228f818360208801612497565b01949350505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516122d0816017850160208801612497565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612301816028840160208801612497565b01602801949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123409083018461223d565b9695505050505050565b6020815260006111cb602083018461223d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561244857612448612544565b500190565b60008261245c5761245c61255a565b500490565b600081600019048311821515161561247b5761247b612544565b500290565b60008282101561249257612492612544565b500390565b60005b838110156124b257818101518382015260200161249a565b83811115610fdd5750506000910152565b6000816124d2576124d2612544565b506000190190565b600181811c908216806124ee57607f821691505b6020821081141561250f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561252957612529612544565b5060010190565b60008261253f5761253f61255a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461126a57600080fdfea2646970667358221220329b167f9c3886ff568515431868ba9c03b7dc568e6432ca042051b6ebb0582a64736f6c63430008040033

Deployed Bytecode Sourcemap

29795:3912:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30609:226;;;;;;;;;;-1:-1:-1;30609:226:0;;;;;:::i;:::-;;:::i;:::-;;;7779:14:1;;7772:22;7754:41;;7742:2;7727:18;30609:226:0;;;;;;;;17578:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18795:308::-;;;;;;;;;;-1:-1:-1;18795:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6853:32:1;;;6835:51;;6823:2;6808:18;18795:308:0;6790:102:1;18376:411:0;;;;;;;;;;-1:-1:-1;18376:411:0;;;;;:::i;:::-;;:::i;:::-;;30507:94;;;;;;;;;;-1:-1:-1;30578:15:0;;30507:94;;;7952:25:1;;;7940:2;7925:18;30507:94:0;7907:76:1;19668:376:0;;;;;;;;;;-1:-1:-1;19668:376:0;;;;;:::i;:::-;;:::i;28122:123::-;;;;;;;;;;-1:-1:-1;28122:123:0;;;;;:::i;:::-;28188:7;28215:12;;;:6;:12;;;;;:22;;;;28122:123;31876:92;;;;;;;;;;-1:-1:-1;31945:15:0;;31876:92;;31945:15;;;;19010:36:1;;18998:2;18983:18;31876:92:0;18965:87:1;28253:188:0;;;;;;;;;;-1:-1:-1;28253:188:0;;;;;:::i;:::-;;:::i;33036:89::-;;;;;;;;;;;;;:::i;28647:287::-;;;;;;;;;;-1:-1:-1;28647:287:0;;;;;:::i;:::-;;:::i;29900:66::-;;;;;;;;;;;;29940:26;29900:66;;31663:205;;;;;;;;;;;;;:::i;20052:185::-;;;;;;;;;;-1:-1:-1;20052:185:0;;;;;:::i;:::-;;:::i;30416:45::-;;;;;;;;;;;;30457:4;30416:45;;17244:326;;;;;;;;;;-1:-1:-1;17244:326:0;;;;;:::i;:::-;;:::i;16941:295::-;;;;;;;;;;-1:-1:-1;16941:295:0;;;;;:::i;:::-;;:::i;7851:94::-;;;;;;;;;;;;;:::i;30345:52::-;;;;;;;;;;;;30380:17;30345:52;;31976:98;;;;;;;;;;-1:-1:-1;31976:98:0;;;;;:::i;:::-;;:::i;7620:95::-;;;;;;;;;;-1:-1:-1;7701:6:0;;-1:-1:-1;;;;;7701:6:0;7620:95;;27429:180;;;;;;;;;;-1:-1:-1;27429:180:0;;;;;:::i;:::-;;:::i;32082:877::-;;;;;;:::i;:::-;;:::i;17686:104::-;;;;;;;;;;;;;:::i;31561:94::-;;;;;;;;;;-1:-1:-1;31561:94:0;;;;;:::i;:::-;;:::i;26982:49::-;;;;;;;;;;-1:-1:-1;26982:49:0;27027:4;26982:49;;19111:327;;;;;;;;;;-1:-1:-1;19111:327:0;;;;;:::i;:::-;;:::i;20245:365::-;;;;;;;;;;-1:-1:-1;20245:365:0;;;;;:::i;:::-;;:::i;30468:30::-;;;;;;;;;;;;;;;;24792:617;;;;;;;;;;-1:-1:-1;24792:617:0;;;;;:::i;:::-;;:::i;31343:102::-;;;;;;;;;;-1:-1:-1;31343:102:0;;;;;:::i;:::-;;:::i;28449:190::-;;;;;;;;;;-1:-1:-1;28449:190:0;;;;;:::i;:::-;;:::i;31239:96::-;;;;;;;;;;;;;:::i;33133:275::-;;;;;;;;;;-1:-1:-1;33133:275:0;;;;;:::i;:::-;;:::i;30276:32::-;;;;;;;;;;-1:-1:-1;30276:32:0;;;;;;;;30315:23;;;;;;;;;;;;;;;;7953:229;;;;;;;;;;-1:-1:-1;7953:229:0;;;;;:::i;:::-;;:::i;30609:226::-;30762:4;30791:36;30815:11;30791:23;:36::i;:::-;30784:43;30609:226;-1:-1:-1;;30609:226:0:o;17578:100::-;17632:13;17665:5;17658:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17578:100;:::o;18795:308::-;18916:7;18963:16;18971:7;18963;:16::i;:::-;18941:110;;;;-1:-1:-1;;;18941:110:0;;15339:2:1;18941:110:0;;;15321:21:1;15378:2;15358:18;;;15351:30;15417:34;15397:18;;;15390:62;-1:-1:-1;;;15468:18:1;;;15461:42;15520:19;;18941:110:0;;;;;;;;;-1:-1:-1;19071:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;19071:24:0;;18795:308::o;18376:411::-;18457:13;18473:23;18488:7;18473:14;:23::i;:::-;18457:39;;18521:5;-1:-1:-1;;;;;18515:11:0;:2;-1:-1:-1;;;;;18515:11:0;;;18507:57;;;;-1:-1:-1;;;18507:57:0;;16939:2:1;18507:57:0;;;16921:21:1;16978:2;16958:18;;;16951:30;17017:34;16997:18;;;16990:62;-1:-1:-1;;;17068:18:1;;;17061:31;17109:19;;18507:57:0;16911:223:1;18507:57:0;7222:10;-1:-1:-1;;;;;18599:21:0;;;;:62;;-1:-1:-1;18624:37:0;18641:5;7222:10;33133:275;:::i;18624:37::-;18577:168;;;;-1:-1:-1;;;18577:168:0;;12551:2:1;18577:168:0;;;12533:21:1;12590:2;12570:18;;;12563:30;12629:34;12609:18;;;12602:62;12700:26;12680:18;;;12673:54;12744:19;;18577:168:0;12523:246:1;18577:168:0;18758:21;18767:2;18771:7;18758:8;:21::i;:::-;18376:411;;;:::o;19668:376::-;19877:41;7222:10;19910:7;19877:18;:41::i;:::-;19855:140;;;;-1:-1:-1;;;19855:140:0;;;;;;;:::i;:::-;20008:28;20018:4;20024:2;20028:7;20008:9;:28::i;28253:188::-;28188:7;28215:12;;;:6;:12;;;;;:22;;;27083:30;27094:4;7222:10;27083;:30::i;:::-;28408:25:::1;28419:4;28425:7;28408:10;:25::i;33036:89::-:0;7701:6;;-1:-1:-1;;;;;7701:6:0;7222:10;7763:23;7755:68;;;;-1:-1:-1;;;7755:68:0;;;;;;;:::i;:::-;33105:12:::1;::::0;;-1:-1:-1;;33089:28:0;::::1;33105:12;::::0;;::::1;33104:13;33089:28;::::0;;33036:89::o;28647:287::-;-1:-1:-1;;;;;28789:23:0;;7222:10;28789:23;28767:120;;;;-1:-1:-1;;;28767:120:0;;18472:2:1;28767:120:0;;;18454:21:1;18511:2;18491:18;;;18484:30;18550:34;18530:18;;;18523:62;-1:-1:-1;;;18601:18:1;;;18594:45;18656:19;;28767:120:0;18444:237:1;28767:120:0;28900:26;28912:4;28918:7;28900:11;:26::i;:::-;28647:287;;:::o;31663:205::-;7701:6;;-1:-1:-1;;;;;7701:6:0;7222:10;7763:23;7755:68;;;;-1:-1:-1;;;7755:68:0;;;;;;;:::i;:::-;31725:21:::1;31711:11;31778:7;7701:6:::0;;-1:-1:-1;;;;;7701:6:0;;7620:95;31778:7:::1;-1:-1:-1::0;;;;;31778:12:0::1;31798:6;31778:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31759:50;;;31828:7;31820:40;;;::::0;-1:-1:-1;;;31820:40:0;;10314:2:1;31820:40:0::1;::::0;::::1;10296:21:1::0;10353:2;10333:18;;;10326:30;-1:-1:-1;;;10372:18:1;;;10365:50;10432:18;;31820:40:0::1;10286:170:1::0;20052:185:0;20190:39;20207:4;20213:2;20217:7;20190:39;;;;;;;;;;;;:16;:39::i;17244:326::-;17361:7;17402:16;;;:7;:16;;;;;;-1:-1:-1;;;;;17402:16:0;17451:19;17429:110;;;;-1:-1:-1;;;17429:110:0;;13387:2:1;17429:110:0;;;13369:21:1;13426:2;13406:18;;;13399:30;13465:34;13445:18;;;13438:62;-1:-1:-1;;;13516:18:1;;;13509:39;13565:19;;17429:110:0;13359:231:1;16941:295:0;17058:7;-1:-1:-1;;;;;17105:19:0;;17083:111;;;;-1:-1:-1;;;17083:111:0;;12976:2:1;17083:111:0;;;12958:21:1;13015:2;12995:18;;;12988:30;13054:34;13034:18;;;13027:62;-1:-1:-1;;;13105:18:1;;;13098:40;13155:19;;17083:111:0;12948:232:1;17083:111:0;-1:-1:-1;;;;;;17212:16:0;;;;;:9;:16;;;;;;;16941:295::o;7851:94::-;7701:6;;-1:-1:-1;;;;;7701:6:0;7222:10;7763:23;7755:68;;;;-1:-1:-1;;;7755:68:0;;;;;;;:::i;:::-;7916:21:::1;7934:1;7916:9;:21::i;:::-;7851:94::o:0;31976:98::-;7701:6;;-1:-1:-1;;;;;7701:6:0;7222:10;7763:23;7755:68;;;;-1:-1:-1;;;7755:68:0;;;;;;;:::i;:::-;32042:15:::1;:24:::0;;-1:-1:-1;;32042:24:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;31976:98::o;27429:180::-;27543:4;27572:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;27572:29:0;;;;;;;;;;;;;;;27429:180::o;32082:877::-;32157:12;;;;32149:52;;;;-1:-1:-1;;;32149:52:0;;11782:2:1;32149:52:0;;;11764:21:1;11821:2;11801:18;;;11794:30;11860:29;11840:18;;;11833:57;11907:18;;32149:52:0;11754:177:1;32149:52:0;30457:4;32234:14;:32;;32212:114;;;;-1:-1:-1;;;32212:114:0;;17759:2:1;32212:114:0;;;17741:21:1;;;17778:18;;;17771:30;17837:34;17817:18;;;17810:62;17889:18;;32212:114:0;17731:182:1;32212:114:0;32396:8;;32359:33;32377:14;32359:13;30578:15;;;30507:94;32359:13;:17;;:33::i;:::-;:45;;32337:127;;;;-1:-1:-1;;;32337:127:0;;13797:2:1;32337:127:0;;;13779:21:1;;;13816:18;;;13809:30;13875:34;13855:18;;;13848:62;13927:18;;32337:127:0;13769:182:1;32337:127:0;32529:9;32497:28;30380:17;32510:14;32497:12;:28::i;:::-;:41;;32475:122;;;;-1:-1:-1;;;32475:122:0;;11422:2:1;32475:122:0;;;11404:21:1;11461:2;11441:18;;;11434:30;11500:33;11480:18;;;11473:61;11551:18;;32475:122:0;11394:181:1;32475:122:0;32615:9;32610:342;32634:14;32630:1;:18;32610:342;;;32670:17;32690:13;30578:15;;;30507:94;32690:13;32670:33;;32738:8;;32722:13;30578:15;;;30507:94;32722:13;:24;32718:223;;;32776:18;32784:9;32776:7;:18::i;:::-;32775:19;32767:55;;;;-1:-1:-1;;;32767:55:0;;18120:2:1;32767:55:0;;;18102:21:1;18159:2;18139:18;;;18132:30;18198:25;18178:18;;;18171:53;18241:18;;32767:55:0;18092:173:1;32767:55:0;32859:15;;:19;;32877:1;32859:19;:::i;:::-;32841:15;:37;32897:28;32903:10;32915:9;32897:5;:28::i;:::-;-1:-1:-1;32650:3:0;;;;:::i;:::-;;;;32610:342;;17686:104;17742:13;17775:7;17768:14;;;;;:::i;31561:94::-;7701:6;;-1:-1:-1;;;;;7701:6:0;7222:10;7763:23;7755:68;;;;-1:-1:-1;;;7755:68:0;;;;;;;:::i;:::-;31631:16;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;19111:327::-:0;-1:-1:-1;;;;;19246:24:0;;7222:10;19246:24;;19238:62;;;;-1:-1:-1;;;19238:62:0;;11068:2:1;19238:62:0;;;11050:21:1;11107:2;11087:18;;;11080:30;11146:27;11126:18;;;11119:55;11191:18;;19238:62:0;11040:175:1;19238:62:0;7222:10;19313:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;19313:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;19313:53:0;;;;;;;;;;19382:48;;7754:41:1;;;19313:42:0;;7222:10;19382:48;;7727:18:1;19382:48:0;;;;;;;19111:327;;:::o;20245:365::-;20434:41;7222:10;20467:7;20434:18;:41::i;:::-;20412:140;;;;-1:-1:-1;;;20412:140:0;;;;;;;:::i;:::-;20563:39;20577:4;20583:2;20587:7;20596:5;20563:13;:39::i;:::-;20245:365;;;;:::o;24792:617::-;24910:13;24963:16;24971:7;24963;:16::i;:::-;24941:115;;;;-1:-1:-1;;;24941:115:0;;14519:2:1;24941:115:0;;;14501:21:1;14558:2;14538:18;;;14531:30;14597:34;14577:18;;;14570:62;-1:-1:-1;;;14648:18:1;;;14641:47;14705:19;;24941:115:0;14491:239:1;24941:115:0;25069:23;25095:19;;;:10;:19;;;;;25069:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25125:18;25146:10;:8;:10::i;:::-;25125:31;;25179:4;25173:18;25195:1;25173:23;25169:72;;;-1:-1:-1;25220:9:0;24792:617;-1:-1:-1;;24792:617:0:o;25169:72::-;25255:23;;:27;25251:108;;25330:4;25336:9;25313:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25299:48;;;;24792:617;;;:::o;25251:108::-;25378:23;25393:7;25378:14;:23::i;:::-;25371:30;24792:617;-1:-1:-1;;;;24792:617:0:o;31343:102::-;7701:6;;-1:-1:-1;;;;;7701:6:0;7222:10;7763:23;7755:68;;;;-1:-1:-1;;;7755:68:0;;;;;;;:::i;:::-;31417:20;;::::1;::::0;:11:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;28449:190::-:0;28188:7;28215:12;;;:6;:12;;;;;:22;;;27083:30;27094:4;7222:10;27083;:30::i;:::-;28605:26:::1;28617:4;28623:7;28605:11;:26::i;31239:96::-:0;31283:13;31316:11;31309:18;;;;;:::i;33133:275::-;33260:15;33365:35;33382:6;33390:9;33365:16;:35::i;:::-;33358:42;33133:275;-1:-1:-1;;;33133:275:0:o;7953:229::-;7701:6;;-1:-1:-1;;;;;7701:6:0;7222:10;7763:23;7755:68;;;;-1:-1:-1;;;7755:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8056:22:0;::::1;8034:110;;;::::0;-1:-1:-1;;;8034:110:0;;9194:2:1;8034:110:0::1;::::0;::::1;9176:21:1::0;9233:2;9213:18;;;9206:30;9272:34;9252:18;;;9245:62;-1:-1:-1;;;9323:18:1;;;9316:36;9369:19;;8034:110:0::1;9166:228:1::0;8034:110:0::1;8155:19;8165:8;8155:9;:19::i;:::-;7953:229:::0;:::o;27141:280::-;27271:4;-1:-1:-1;;;;;;27313:47:0;;-1:-1:-1;;;27313:47:0;;:100;;;27377:36;27401:11;27377:23;:36::i;20978:127::-;21043:4;21067:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21067:16:0;:30;;;20978:127::o;23349:174::-;23424:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;23424:29:0;-1:-1:-1;;;;;23424:29:0;;;;;;;;:24;;23478:23;23424:24;23478:14;:23::i;:::-;-1:-1:-1;;;;;23469:46:0;;;;;;;;;;;23349:174;;:::o;21113:452::-;21242:4;21286:16;21294:7;21286;:16::i;:::-;21264:110;;;;-1:-1:-1;;;21264:110:0;;12138:2:1;21264:110:0;;;12120:21:1;12177:2;12157:18;;;12150:30;12216:34;12196:18;;;12189:62;-1:-1:-1;;;12267:18:1;;;12260:42;12319:19;;21264:110:0;12110:234:1;21264:110:0;21385:13;21401:23;21416:7;21401:14;:23::i;:::-;21385:39;;21454:5;-1:-1:-1;;;;;21443:16:0;:7;-1:-1:-1;;;;;21443:16:0;;:64;;;;21500:7;-1:-1:-1;;;;;21476:31:0;:20;21488:7;21476:11;:20::i;:::-;-1:-1:-1;;;;;21476:31:0;;21443:64;:113;;;;21524:32;21541:5;21548:7;21524:16;:32::i;22778:563::-;22951:4;-1:-1:-1;;;;;22924:31:0;:23;22939:7;22924:14;:23::i;:::-;-1:-1:-1;;;;;22924:31:0;;22902:122;;;;-1:-1:-1;;;22902:122:0;;16113:2:1;22902:122:0;;;16095:21:1;16152:2;16132:18;;;16125:30;16191:34;16171:18;;;16164:62;-1:-1:-1;;;16242:18:1;;;16235:39;16291:19;;22902:122:0;16085:231:1;22902:122:0;-1:-1:-1;;;;;23043:16:0;;23035:65;;;;-1:-1:-1;;;23035:65:0;;10663:2:1;23035:65:0;;;10645:21:1;10702:2;10682:18;;;10675:30;10741:34;10721:18;;;10714:62;-1:-1:-1;;;10792:18:1;;;10785:34;10836:19;;23035:65:0;10635:226:1;23035:65:0;23113:39;23134:4;23140:2;23144:7;23113:20;:39::i;:::-;23165:29;23182:1;23186:7;23165:8;:29::i;:::-;-1:-1:-1;;;;;23207:15:0;;;;;;:9;:15;;;;;:20;;23226:1;;23207:15;:20;;23226:1;;23207:20;:::i;:::-;;;;-1:-1:-1;;;;;;;23238:13:0;;;;;;:9;:13;;;;;:18;;23255:1;;23238:13;:18;;23255:1;;23238:18;:::i;:::-;;;;-1:-1:-1;;23267:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;23267:21:0;-1:-1:-1;;;;;23267:21:0;;;;;;;;;23306:27;;23267:16;;23306:27;;;;;;;22778:563;;;:::o;27617:497::-;27698:22;27706:4;27712:7;27698;:22::i;:::-;27693:414;;27886:41;27914:7;-1:-1:-1;;;;;27886:41:0;27924:2;27886:19;:41::i;:::-;28000:38;28028:4;28035:2;28000:19;:38::i;:::-;27791:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;27791:270:0;;;;;;;;;;-1:-1:-1;;;27737:358:0;;;;;;;:::i;29321:229::-;29396:22;29404:4;29410:7;29396;:22::i;:::-;29391:152;;29435:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;29435:29:0;;;;;;;;;:36;;-1:-1:-1;;29435:36:0;29467:4;29435:36;;;29518:12;7222:10;;7141:99;29518:12;-1:-1:-1;;;;;29491:40:0;29509:7;-1:-1:-1;;;;;29491:40:0;29503:4;29491:40;;;;;;;;;;29321:229;;:::o;29558:230::-;29633:22;29641:4;29647:7;29633;:22::i;:::-;29629:152;;;29704:5;29672:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;29672:29:0;;;;;;;;;;:37;;-1:-1:-1;;29672:37:0;;;29729:40;7222:10;;29672:12;;29729:40;;29704:5;29729:40;29558:230;;:::o;8190:182::-;8265:6;;;-1:-1:-1;;;;;8282:26:0;;;-1:-1:-1;;;;;;8282:26:0;;;;;;;8324:40;;8265:6;;;8282:26;8265:6;;8324:40;;8246:16;;8324:40;8190:182;;:::o;2339:179::-;2397:7;;2429:5;2433:1;2429;:5;:::i;:::-;2417:17;;2458:1;2453;:6;;2445:46;;;;-1:-1:-1;;;2445:46:0;;9958:2:1;2445:46:0;;;9940:21:1;9997:2;9977:18;;;9970:30;10036:29;10016:18;;;10009:57;10083:18;;2445:46:0;9930:177:1;3218:220:0;3276:7;3300:6;3296:20;;-1:-1:-1;3315:1:0;3308:8;;3296:20;3327:9;3339:5;3343:1;3339;:5;:::i;:::-;3327:17;-1:-1:-1;3372:1:0;3363:5;3367:1;3327:17;3363:5;:::i;:::-;:10;3355:56;;;;-1:-1:-1;;;3355:56:0;;14937:2:1;3355:56:0;;;14919:21:1;14976:2;14956:18;;;14949:30;15015:34;14995:18;;;14988:62;-1:-1:-1;;;15066:18:1;;;15059:31;15107:19;;3355:56:0;14909:223:1;22020:382:0;-1:-1:-1;;;;;22100:16:0;;22092:61;;;;-1:-1:-1;;;22092:61:0;;14158:2:1;22092:61:0;;;14140:21:1;;;14177:18;;;14170:30;14236:34;14216:18;;;14209:62;14288:18;;22092:61:0;14130:182:1;22092:61:0;22173:16;22181:7;22173;:16::i;:::-;22172:17;22164:58;;;;-1:-1:-1;;;22164:58:0;;9601:2:1;22164:58:0;;;9583:21:1;9640:2;9620:18;;;9613:30;9679;9659:18;;;9652:58;9727:18;;22164:58:0;9573:178:1;22164:58:0;22235:45;22264:1;22268:2;22272:7;22235:20;:45::i;:::-;-1:-1:-1;;;;;22293:13:0;;;;;;:9;:13;;;;;:18;;22310:1;;22293:13;:18;;22310:1;;22293:18;:::i;:::-;;;;-1:-1:-1;;22322:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;22322:21:0;-1:-1:-1;;;;;22322:21:0;;;;;;;;22361:33;;22322:16;;;22361:33;;22322:16;;22361:33;22020:382;;:::o;20618:352::-;20775:28;20785:4;20791:2;20795:7;20775:9;:28::i;:::-;20836:48;20859:4;20865:2;20869:7;20878:5;20836:22;:48::i;:::-;20814:148;;;;-1:-1:-1;;;20814:148:0;;;;;;;:::i;31453:100::-;31505:13;31538:7;31531:14;;;;;:::i;17798:468::-;17916:13;17969:16;17977:7;17969;:16::i;:::-;17947:113;;;;-1:-1:-1;;;17947:113:0;;16523:2:1;17947:113:0;;;16505:21:1;16562:2;16542:18;;;16535:30;16601:34;16581:18;;;16574:62;-1:-1:-1;;;16652:18:1;;;16645:45;16707:19;;17947:113:0;16495:237:1;17947:113:0;18073:21;18097:10;:8;:10::i;:::-;18073:34;;18162:1;18144:7;18138:21;:25;:120;;;;;;;;;;;;;;;;;18207:7;18216:18;:7;:16;:18::i;:::-;18190:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18118:140;17798:468;-1:-1:-1;;;17798:468:0:o;16578:355::-;16725:4;-1:-1:-1;;;;;;16767:40:0;;-1:-1:-1;;;16767:40:0;;:105;;-1:-1:-1;;;;;;;16824:48:0;;-1:-1:-1;;;16824:48:0;16767:105;:158;;;-1:-1:-1;;;;;;;;;;8689:40:0;;;16889:36;8530:207;33416:288;33639:1;33612:24;;;:15;:24;;;;;;:28;33608:89;;33684:1;33657:24;;;:15;:24;;;;;:28;-1:-1:-1;;33416:288:0:o;15319:483::-;15421:13;15452:19;15484:10;15488:6;15484:1;:10;:::i;:::-;:14;;15497:1;15484:14;:::i;:::-;15474:25;;;;;;-1:-1:-1;;;15474:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15474:25:0;;15452:47;;-1:-1:-1;;;15510:6:0;15517:1;15510:9;;;;;;-1:-1:-1;;;15510:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;15510:15:0;;;;;;;;;-1:-1:-1;;;15536:6:0;15543:1;15536:9;;;;;;-1:-1:-1;;;15536:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;15536:15:0;;;;;;;;-1:-1:-1;15567:9:0;15579:10;15583:6;15579:1;:10;:::i;:::-;:14;;15592:1;15579:14;:::i;:::-;15567:26;;15562:135;15599:1;15595;:5;15562:135;;;-1:-1:-1;;;15647:5:0;15655:3;15647:11;15634:25;;;;;-1:-1:-1;;;15634:25:0;;;;;;;;;;;;15622:6;15629:1;15622:9;;;;;;-1:-1:-1;;;15622:9:0;;;;;;;;;;;;:37;-1:-1:-1;;;;;15622:37:0;;;;;;;;-1:-1:-1;15684:1:0;15674:11;;;;;15602:3;;;:::i;:::-;;;15562:135;;;-1:-1:-1;15715:10:0;;15707:55;;;;-1:-1:-1;;;15707:55:0;;8414:2:1;15707:55:0;;;8396:21:1;;;8433:18;;;8426:30;8492:34;8472:18;;;8465:62;8544:18;;15707:55:0;8386:182:1;23531:980:0;23686:4;-1:-1:-1;;;;;23707:13:0;;10492:20;10540:8;23703:801;;23760:175;;-1:-1:-1;;;23760:175:0;;-1:-1:-1;;;;;23760:36:0;;;;;:175;;7222:10;;23854:4;;23881:7;;23911:5;;23760:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23760:175:0;;;;;;;;-1:-1:-1;;23760:175:0;;;;;;;;;;;;:::i;:::-;;;23739:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24118:13:0;;24114:320;;24161:108;;-1:-1:-1;;;24161:108:0;;;;;;;:::i;24114:320::-;24384:6;24378:13;24369:6;24365:2;24361:15;24354:38;23739:710;-1:-1:-1;;;;;;23999:51:0;-1:-1:-1;;;23999:51:0;;-1:-1:-1;23992:58:0;;23703:801;-1:-1:-1;24488:4:0;23531:980;;;;;;:::o;14431:532::-;14487:13;14517:10;14513:53;;-1:-1:-1;;14544:10:0;;;;;;;;;;;;-1:-1:-1;;;14544:10:0;;;;;14431:532::o;14513:53::-;14591:5;14576:12;14632:78;14639:9;;14632:78;;14665:8;;;;:::i;:::-;;-1:-1:-1;14688:10:0;;-1:-1:-1;14696:2:0;14688:10;;:::i;:::-;;;14632:78;;;14720:19;14752:6;14742:17;;;;;;-1:-1:-1;;;14742:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14742:17:0;;14720:39;;14770:154;14777:10;;14770:154;;14804:11;14814:1;14804:11;;:::i;:::-;;-1:-1:-1;14873:10:0;14881:2;14873:5;:10;:::i;:::-;14860:24;;:2;:24;:::i;:::-;14847:39;;14830:6;14837;14830:14;;;;;;-1:-1:-1;;;14830:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;14830:56:0;;;;;;;;-1:-1:-1;14901:11:0;14910:2;14901:11;;:::i;:::-;;;14770:154;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;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:2;;;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:2;;;532:1;529;522:12;491:2;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;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:196::-;887:6;940:2;928:9;919:7;915:23;911:32;908:2;;;961:6;953;946:22;908:2;989:29;1008:9;989:29;:::i;1029:270::-;1097:6;1105;1158:2;1146:9;1137:7;1133:23;1129:32;1126:2;;;1179:6;1171;1164:22;1126:2;1207:29;1226:9;1207:29;:::i;:::-;1197:39;;1255:38;1289:2;1278:9;1274:18;1255:38;:::i;:::-;1245:48;;1116:183;;;;;:::o;1304:338::-;1381:6;1389;1397;1450:2;1438:9;1429:7;1425:23;1421:32;1418:2;;;1471:6;1463;1456:22;1418:2;1499:29;1518:9;1499:29;:::i;:::-;1489:39;;1547:38;1581:2;1570:9;1566:18;1547:38;:::i;:::-;1537:48;;1632:2;1621:9;1617:18;1604:32;1594:42;;1408:234;;;;;:::o;1647:696::-;1742:6;1750;1758;1766;1819:3;1807:9;1798:7;1794:23;1790:33;1787:2;;;1841:6;1833;1826:22;1787:2;1869:29;1888:9;1869:29;:::i;:::-;1859:39;;1917:38;1951:2;1940:9;1936:18;1917:38;:::i;:::-;1907:48;;2002:2;1991:9;1987:18;1974:32;1964:42;;2057:2;2046:9;2042:18;2029:32;2084:18;2076:6;2073:30;2070:2;;;2121:6;2113;2106:22;2070:2;2149:22;;2202:4;2194:13;;2190:27;-1:-1:-1;2180:2:1;;2236:6;2228;2221:22;2180:2;2264:73;2329:7;2324:2;2311:16;2306:2;2302;2298:11;2264:73;:::i;:::-;2254:83;;;1777:566;;;;;;;:::o;2348:367::-;2413:6;2421;2474:2;2462:9;2453:7;2449:23;2445:32;2442:2;;;2495:6;2487;2480:22;2442:2;2523:29;2542:9;2523:29;:::i;:::-;2513:39;;2602:2;2591:9;2587:18;2574:32;2649:5;2642:13;2635:21;2628:5;2625:32;2615:2;;2676:6;2668;2661:22;2615:2;2704:5;2694:15;;;2432:283;;;;;:::o;2720:264::-;2788:6;2796;2849:2;2837:9;2828:7;2824:23;2820:32;2817:2;;;2870:6;2862;2855:22;2817:2;2898:29;2917:9;2898:29;:::i;:::-;2888:39;2974:2;2959:18;;;;2946:32;;-1:-1:-1;;;2807:177:1:o;2989:190::-;3048:6;3101:2;3089:9;3080:7;3076:23;3072:32;3069:2;;;3122:6;3114;3107:22;3069:2;-1:-1:-1;3150:23:1;;3059:120;-1:-1:-1;3059:120:1:o;3184:264::-;3252:6;3260;3313:2;3301:9;3292:7;3288:23;3284:32;3281:2;;;3334:6;3326;3319:22;3281:2;3375:9;3362:23;3352:33;;3404:38;3438:2;3427:9;3423:18;3404:38;:::i;3453:255::-;3511:6;3564:2;3552:9;3543:7;3539:23;3535:32;3532:2;;;3585:6;3577;3570:22;3532:2;3629:9;3616:23;3648:30;3672:5;3648:30;:::i;3713:259::-;3782:6;3835:2;3823:9;3814:7;3810:23;3806:32;3803:2;;;3856:6;3848;3841:22;3803:2;3893:9;3887:16;3912:30;3936:5;3912:30;:::i;3977:480::-;4046:6;4099:2;4087:9;4078:7;4074:23;4070:32;4067:2;;;4120:6;4112;4105:22;4067:2;4165:9;4152:23;4198:18;4190:6;4187:30;4184:2;;;4235:6;4227;4220:22;4184:2;4263:22;;4316:4;4308:13;;4304:27;-1:-1:-1;4294:2:1;;4350:6;4342;4335:22;4294:2;4378:73;4443:7;4438:2;4425:16;4420:2;4416;4412:11;4378:73;:::i;4657:289::-;4714:6;4767:2;4755:9;4746:7;4742:23;4738:32;4735:2;;;4788:6;4780;4773:22;4735:2;4832:9;4819:23;4882:4;4875:5;4871:16;4864:5;4861:27;4851:2;;4907:6;4899;4892:22;4951:257;4992:3;5030:5;5024:12;5057:6;5052:3;5045:19;5073:63;5129:6;5122:4;5117:3;5113:14;5106:4;5099:5;5095:16;5073:63;:::i;:::-;5190:2;5169:15;-1:-1:-1;;5165:29:1;5156:39;;;;5197:4;5152:50;;5000:208;-1:-1:-1;;5000:208:1:o;5213:470::-;5392:3;5430:6;5424:13;5446:53;5492:6;5487:3;5480:4;5472:6;5468:17;5446:53;:::i;:::-;5562:13;;5521:16;;;;5584:57;5562:13;5521:16;5618:4;5606:17;;5584:57;:::i;:::-;5657:20;;5400:283;-1:-1:-1;;;;5400:283:1:o;5898:786::-;6309:25;6304:3;6297:38;6279:3;6364:6;6358:13;6380:62;6435:6;6430:2;6425:3;6421:12;6414:4;6406:6;6402:17;6380:62;:::i;:::-;-1:-1:-1;;;6501:2:1;6461:16;;;6493:11;;;6486:40;6551:13;;6573:63;6551:13;6622:2;6614:11;;6607:4;6595:17;;6573:63;:::i;:::-;6656:17;6675:2;6652:26;;6287:397;-1:-1:-1;;;;6287:397:1:o;7121:488::-;-1:-1:-1;;;;;7390:15:1;;;7372:34;;7442:15;;7437:2;7422:18;;7415:43;7489:2;7474:18;;7467:34;;;7537:3;7532:2;7517:18;;7510:31;;;7315:4;;7558:45;;7583:19;;7575:6;7558:45;:::i;:::-;7550:53;7324:285;-1:-1:-1;;;;;;7324:285:1:o;7988:219::-;8137:2;8126:9;8119:21;8100:4;8157:44;8197:2;8186:9;8182:18;8174:6;8157:44;:::i;8573:414::-;8775:2;8757:21;;;8814:2;8794:18;;;8787:30;8853:34;8848:2;8833:18;;8826:62;-1:-1:-1;;;8919:2:1;8904:18;;8897:48;8977:3;8962:19;;8747:240::o;15550:356::-;15752:2;15734:21;;;15771:18;;;15764:30;15830:34;15825:2;15810:18;;15803:62;15897:2;15882:18;;15724:182::o;17139:413::-;17341:2;17323:21;;;17380:2;17360:18;;;17353:30;17419:34;17414:2;17399:18;;17392:62;-1:-1:-1;;;17485:2:1;17470:18;;17463:47;17542:3;17527:19;;17313:239::o;19057:128::-;19097:3;19128:1;19124:6;19121:1;19118:13;19115:2;;;19134:18;;:::i;:::-;-1:-1:-1;19170:9:1;;19105:80::o;19190:120::-;19230:1;19256;19246:2;;19261:18;;:::i;:::-;-1:-1:-1;19295:9:1;;19236:74::o;19315:168::-;19355:7;19421:1;19417;19413:6;19409:14;19406:1;19403:21;19398:1;19391:9;19384:17;19380:45;19377:2;;;19428:18;;:::i;:::-;-1:-1:-1;19468:9:1;;19367:116::o;19488:125::-;19528:4;19556:1;19553;19550:8;19547:2;;;19561:18;;:::i;:::-;-1:-1:-1;19598:9:1;;19537:76::o;19618:258::-;19690:1;19700:113;19714:6;19711:1;19708:13;19700:113;;;19790:11;;;19784:18;19771:11;;;19764:39;19736:2;19729:10;19700:113;;;19831:6;19828:1;19825:13;19822:2;;;-1:-1:-1;;19866:1:1;19848:16;;19841:27;19671:205::o;19881:136::-;19920:3;19948:5;19938:2;;19957:18;;:::i;:::-;-1:-1:-1;;;19993:18:1;;19928:89::o;20022:380::-;20101:1;20097:12;;;;20144;;;20165:2;;20219:4;20211:6;20207:17;20197:27;;20165:2;20272;20264:6;20261:14;20241:18;20238:38;20235:2;;;20318:10;20313:3;20309:20;20306:1;20299:31;20353:4;20350:1;20343:15;20381:4;20378:1;20371:15;20235:2;;20077:325;;;:::o;20407:135::-;20446:3;-1:-1:-1;;20467:17:1;;20464:2;;;20487:18;;:::i;:::-;-1:-1:-1;20534:1:1;20523:13;;20454:88::o;20547:112::-;20579:1;20605;20595:2;;20610:18;;:::i;:::-;-1:-1:-1;20644:9:1;;20585:74::o;20664:127::-;20725:10;20720:3;20716:20;20713:1;20706:31;20756:4;20753:1;20746:15;20780:4;20777:1;20770:15;20796:127;20857:10;20852:3;20848:20;20845:1;20838:31;20888:4;20885:1;20878:15;20912:4;20909:1;20902:15;20928:127;20989:10;20984:3;20980:20;20977:1;20970:31;21020:4;21017:1;21010:15;21044:4;21041:1;21034:15;21060:131;-1:-1:-1;;;;;;21134:32:1;;21124:43;;21114:2;;21181:1;21178;21171:12

Swarm Source

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