Contract Address Details

0x2f2370C1d12E2A02E0da2633cc2c94D88aFB157e

Token
EWC Duel Monsters (DMS)
Creator
0x5fe5a7–765b03 at 0x36c94f–b9fba4
Balance
0 EWT ( )
Tokens
Fetching tokens...
Transactions
124 Transactions
Transfers
0 Transfers
Gas Used
21,522,634
Last Balance Update
29797262
Contract name:
EWC_DUEL_MONSTERS




Optimization enabled
false
Compiler version
v0.8.4+commit.c7e474f2




EVM Version
default




Verified at
2021-08-28T17:16:27.018804Z

Contract source code

//EWC Duel Monsters contract
//By VulcanBearBull

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library EnumerableSet {

    struct Set {

        bytes32[] _values;

        mapping(bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {

        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                set._values[toDeleteIndex] = lastvalue;

                set._indexes[lastvalue] = valueIndex; 
            }

            set._values.pop();

            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}
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);
    }
}
library Address {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {

            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
interface IERC165 {

    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
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;
}
interface IAccessControlEnumerable is IAccessControl {

    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}
interface IERC721 is IERC165 {

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}
interface IERC721Enumerable is IERC721 {

    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) external view returns (uint256);
}
interface IERC721Metadata is IERC721 {

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}
interface IERC721Receiver {

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
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 ERC165 is IERC165 {

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}
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];
        }
    }
}
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {

    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    mapping(uint256 => uint256) private _ownedTokensIndex;

    uint256[] private _allTokens;

    mapping(uint256 => uint256) private _allTokensIndex;

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

    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId;
            _ownedTokensIndex[lastTokenId] = tokenIndex;
        }

        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId;
        _allTokensIndex[lastTokenId] = tokenIndex;

        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}
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());
        }
    }
}

abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;

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

    function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
        return _roleMembers[role].at(index);
    }

    function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
        return _roleMembers[role].length();
    }

    function grantRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.grantRole(role, account);
        _roleMembers[role].add(account);
    }

    function revokeRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.revokeRole(role, account);
        _roleMembers[role].remove(account);
    }

    function renounceRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.renounceRole(role, account);
        _roleMembers[role].remove(account);
    }

    function _setupRole(bytes32 role, address account) internal virtual override {
        super._setupRole(role, account);
        _roleMembers[role].add(account);
    }
}
pragma experimental ABIEncoderV2;
contract EWC_DUEL_MONSTERS is ERC721Enumerable, ERC721URIStorage, AccessControlEnumerable {

  bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");

  constructor () ERC721("EWC Duel Monsters", "DMS") {
    _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
    _setupRole(MINTER_ROLE, _msgSender());
  }

  function mintWithTokenURI(address to, uint256 tokenId, string memory tokenURI) public returns (bool) {
    require(hasRole(MINTER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: Only VulcanBearBull can mint you pleb!");
    _mint(to, tokenId);
    _setTokenURI(tokenId, tokenURI);
    return true;
  }

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

  function tokenURI(uint256 tokenId) public view virtual override(ERC721, ERC721URIStorage) returns (string memory) {
    return ERC721URIStorage.tokenURI(tokenId);
  }

  function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Enumerable) {
    super._beforeTokenTransfer(from, to, tokenId);
  }

  function _burn(uint256 tokenId) internal virtual override(ERC721, ERC721URIStorage) {
    return ERC721URIStorage._burn(tokenId);
  }

  function mintMultiple(address[] memory to, uint256[] memory tokenId, string[] memory tokenURI) public returns (bool) {
    require(hasRole(MINTER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have minter role to mint");
    for (uint i = 0; i < to.length; i++) {
      _mint(to[i], tokenId[i]);
      _setTokenURI(tokenId[i], tokenURI[i]);
    }
    return true;
  }

  function burn(uint256 tokenId) public virtual {
    //solhint-disable-next-line max-line-length
    require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
    _burn(tokenId);
  }

  function safeTransfer(address to, uint256 tokenId) public {
    safeTransferFrom(_msgSender(), to, tokenId, "");
  }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"approved","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"bool","name":"approved","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"previousAdminRole","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"newAdminRole","internalType":"bytes32","indexed":true}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DEFAULT_ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"MINTER_ROLE","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approve","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getApproved","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getRoleAdmin","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getRoleMember","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getRoleMemberCount","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isApprovedForAll","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mintMultiple","inputs":[{"type":"address[]","name":"to","internalType":"address[]"},{"type":"uint256[]","name":"tokenId","internalType":"uint256[]"},{"type":"string[]","name":"tokenURI","internalType":"string[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mintWithTokenURI","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"string","name":"tokenURI","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ownerOf","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setApprovalForAll","inputs":[{"type":"address","name":"operator","internalType":"address"},{"type":"bool","name":"approved","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenByIndex","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenOfOwnerByIndex","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"tokenURI","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]}]
            

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806350bb4e7f11610104578063a217fddf116100a2578063ca15c87311610071578063ca15c87314610588578063d5391393146105b8578063d547741f146105d6578063e985e9c5146105f2576101cf565b8063a217fddf14610502578063a22cb46514610520578063b88d4fde1461053c578063c87b56dd14610558576101cf565b806370a08231116100de57806370a08231146104545780639010d07c1461048457806391d14854146104b457806395d89b41146104e4576101cf565b806350bb4e7f146103c45780635a9c9eb8146103f45780636352211e14610424576101cf565b80632f2ff15d11610171578063423f6cef1161014b578063423f6cef1461034057806342842e0e1461035c57806342966c68146103785780634f6ccce714610394576101cf565b80632f2ff15d146102d85780632f745c59146102f457806336568abe14610324576101cf565b8063095ea7b3116101ad578063095ea7b31461025257806318160ddd1461026e57806323b872dd1461028c578063248a9ca3146102a8576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e991906138eb565b610622565b6040516101fb9190613e75565b60405180910390f35b61020c610634565b6040516102199190613eab565b60405180910390f35b61023c6004803603810190610237919061393d565b6106c6565b6040516102499190613e0e565b60405180910390f35b61026c60048036038101906102679190613710565b61074b565b005b610276610863565b60405161028391906141ad565b60405180910390f35b6102a660048036038101906102a1919061360a565b610870565b005b6102c260048036038101906102bd919061384a565b6108d0565b6040516102cf9190613e90565b60405180910390f35b6102f260048036038101906102ed9190613873565b6108f0565b005b61030e60048036038101906103099190613710565b610924565b60405161031b91906141ad565b60405180910390f35b61033e60048036038101906103399190613873565b6109c9565b005b61035a60048036038101906103559190613710565b6109fd565b005b6103766004803603810190610371919061360a565b610a23565b005b610392600480360381019061038d919061393d565b610a43565b005b6103ae60048036038101906103a9919061393d565b610a9f565b6040516103bb91906141ad565b60405180910390f35b6103de60048036038101906103d9919061374c565b610b36565b6040516103eb9190613e75565b60405180910390f35b61040e600480360381019061040991906137b3565b610bc7565b60405161041b9190613e75565b60405180910390f35b61043e6004803603810190610439919061393d565b610d78565b60405161044b9190613e0e565b60405180910390f35b61046e600480360381019061046991906135a5565b610e2a565b60405161047b91906141ad565b60405180910390f35b61049e600480360381019061049991906138af565b610ee2565b6040516104ab9190613e0e565b60405180910390f35b6104ce60048036038101906104c99190613873565b610f11565b6040516104db9190613e75565b60405180910390f35b6104ec610f7c565b6040516104f99190613eab565b60405180910390f35b61050a61100e565b6040516105179190613e90565b60405180910390f35b61053a600480360381019061053591906136d4565b611015565b005b61055660048036038101906105519190613659565b611196565b005b610572600480360381019061056d919061393d565b6111f8565b60405161057f9190613eab565b60405180910390f35b6105a2600480360381019061059d919061384a565b61120a565b6040516105af91906141ad565b60405180910390f35b6105c061122e565b6040516105cd9190613e90565b60405180910390f35b6105f060048036038101906105eb9190613873565b611252565b005b61060c600480360381019061060791906135ce565b611286565b6040516106199190613e75565b60405180910390f35b600061062d82611358565b9050919050565b60606000805461064390614515565b80601f016020809104026020016040519081016040528092919081815260200182805461066f90614515565b80156106bc5780601f10610691576101008083540402835291602001916106bc565b820191906000526020600020905b81548152906001019060200180831161069f57829003601f168201915b5050505050905090565b60006106d1826113d2565b610710576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107079061406d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061075682610d78565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107be906140ed565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107e661143e565b73ffffffffffffffffffffffffffffffffffffffff16148061081557506108148161080f61143e565b611286565b5b610854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084b90613fad565b60405180910390fd5b61085e8383611446565b505050565b6000600880549050905090565b61088161087b61143e565b826114ff565b6108c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b79061410d565b60405180910390fd5b6108cb8383836115dd565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b6108fa8282611839565b61091f81600c600085815260200190815260200160002061132890919063ffffffff16565b505050565b600061092f83610e2a565b8210610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096790613eed565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109d38282611862565b6109f881600c60008581526020019081526020016000206118e590919063ffffffff16565b505050565b610a1f610a0861143e565b838360405180602001604052806000815250611196565b5050565b610a3e83838360405180602001604052806000815250611196565b505050565b610a54610a4e61143e565b826114ff565b610a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8a9061416d565b60405180910390fd5b610a9c81611915565b50565b6000610aa9610863565b8210610aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae19061412d565b60405180910390fd5b60088281548110610b24577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000610b697f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610b6461143e565b610f11565b610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f906140cd565b60405180910390fd5b610bb28484611921565b610bbc8383611aef565b600190509392505050565b6000610bfa7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610bf561143e565b610f11565b610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c309061414d565b60405180910390fd5b60005b8451811015610d6c57610ccf858281518110610c81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610cc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611921565b610d59848281518110610d0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848381518110610d4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611aef565b8080610d6490614578565b915050610c3c565b50600190509392505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1890613fed565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9290613fcd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610f0982600c6000868152602001908152602001600020611b6390919063ffffffff16565b905092915050565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610f8b90614515565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb790614515565b80156110045780601f10610fd957610100808354040283529160200191611004565b820191906000526020600020905b815481529060010190602001808311610fe757829003601f168201915b5050505050905090565b6000801b81565b61101d61143e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561108b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108290613f6d565b60405180910390fd5b806005600061109861143e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661114561143e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161118a9190613e75565b60405180910390a35050565b6111a76111a161143e565b836114ff565b6111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd9061410d565b60405180910390fd5b6111f284848484611b7d565b50505050565b606061120382611bd9565b9050919050565b6000611227600c6000848152602001908152602001600020611d2b565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61125c8282611d40565b61128181600c60008581526020019081526020016000206118e590919063ffffffff16565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113248282611d69565b5050565b6000611350836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e4a565b905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113cb57506113ca82611eba565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114b983610d78565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061150a826113d2565b611549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154090613f8d565b60405180910390fd5b600061155483610d78565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806115c357508373ffffffffffffffffffffffffffffffffffffffff166115ab846106c6565b73ffffffffffffffffffffffffffffffffffffffff16145b806115d457506115d38185611286565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115fd82610d78565b73ffffffffffffffffffffffffffffffffffffffff1614611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164a9061408d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ba90613f4d565b60405180910390fd5b6116ce838383611f34565b6116d9600082611446565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461172991906143f7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117809190614316565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611842826108d0565b6118538161184e61143e565b611f44565b61185d8383611d69565b505050565b61186a61143e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ce9061418d565b60405180910390fd5b6118e18282611fe1565b5050565b600061190d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6120c3565b905092915050565b61191e81612249565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611991576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119889061402d565b60405180910390fd5b61199a816113d2565b156119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d190613f2d565b60405180910390fd5b6119e660008383611f34565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a369190614316565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611af8826113d2565b611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e9061400d565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190611b5e929190613198565b505050565b6000611b72836000018361229c565b60001c905092915050565b611b888484846115dd565b611b94848484846122ed565b611bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bca90613f0d565b60405180910390fd5b50505050565b6060611be4826113d2565b611c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1a9061404d565b60405180910390fd5b6000600a60008481526020019081526020016000208054611c4390614515565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6f90614515565b8015611cbc5780601f10611c9157610100808354040283529160200191611cbc565b820191906000526020600020905b815481529060010190602001808311611c9f57829003601f168201915b505050505090506000611ccd612484565b9050600081511415611ce3578192505050611d26565b600082511115611d18578082604051602001611d00929190613db0565b60405160208183030381529060405292505050611d26565b611d218461249b565b925050505b919050565b6000611d3982600001612542565b9050919050565b611d49826108d0565b611d5a81611d5561143e565b611f44565b611d648383611fe1565b505050565b611d738282610f11565b611e46576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611deb61143e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611e568383612553565b611eaf578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611eb4565b600090505b92915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f2d5750611f2c82612576565b5b9050919050565b611f3f8383836125f0565b505050565b611f4e8282610f11565b611fdd57611f738173ffffffffffffffffffffffffffffffffffffffff166014612704565b611f818360001c6020612704565b604051602001611f92929190613dd4565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd49190613eab565b60405180910390fd5b5050565b611feb8282610f11565b156120bf576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061206461143e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000808360010160008481526020019081526020016000205490506000811461223d5760006001826120f591906143f7565b905060006001866000018054905061210d91906143f7565b90508181146121c8576000866000018281548110612154577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508087600001848154811061219e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612202577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612243565b60009150505b92915050565b612252816129fe565b6000600a6000838152602001908152602001600020805461227290614515565b90501461229957600a60008281526020019081526020016000206000612298919061321e565b5b50565b60008260000182815481106122da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600061230e8473ffffffffffffffffffffffffffffffffffffffff16612b0f565b15612477578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261233761143e565b8786866040518563ffffffff1660e01b81526004016123599493929190613e29565b602060405180830381600087803b15801561237357600080fd5b505af19250505080156123a457506040513d601f19601f820116820180604052508101906123a19190613914565b60015b612427573d80600081146123d4576040519150601f19603f3d011682016040523d82523d6000602084013e6123d9565b606091505b5060008151141561241f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241690613f0d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061247c565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606124a6826113d2565b6124e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dc906140ad565b60405180910390fd5b60006124ef612484565b9050600081511161250f576040518060200160405280600081525061253a565b8061251984612b22565b60405160200161252a929190613db0565b6040516020818303038152906040525b915050919050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125e957506125e882612ccf565b5b9050919050565b6125fb838383612db1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561263e5761263981612db6565b61267d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461267c5761267b8382612dff565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126c0576126bb81612f6c565b6126ff565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126fe576126fd82826130af565b5b5b505050565b606060006002836002612717919061439d565b6127219190614316565b67ffffffffffffffff811115612760577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127925781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106127f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061287a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026128ba919061439d565b6128c49190614316565b90505b60018111156129b0577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061292c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110612969577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806129a9906144eb565b90506128c7565b50600084146129f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129eb90613ecd565b60405180910390fd5b8091505092915050565b6000612a0982610d78565b9050612a1781600084611f34565b612a22600083611446565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a7291906143f7565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415612b6a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cca565b600082905060005b60008214612b9c578080612b8590614578565b915050600a82612b95919061436c565b9150612b72565b60008167ffffffffffffffff811115612bde577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c105781602001600182028036833780820191505090505b5090505b60008514612cc357600182612c2991906143f7565b9150600a85612c3891906145c1565b6030612c449190614316565b60f81b818381518110612c80577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cbc919061436c565b9450612c14565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d9a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612daa5750612da98261312e565b5b9050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e0c84610e2a565b612e1691906143f7565b9050600060076000848152602001908152602001600020549050818114612efb576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612f8091906143f7565b9050600060096000848152602001908152602001600020549050600060088381548110612fd6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061301e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613093577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006130ba83610e2a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546131a490614515565b90600052602060002090601f0160209004810192826131c6576000855561320d565b82601f106131df57805160ff191683800117855561320d565b8280016001018555821561320d579182015b8281111561320c5782518255916020019190600101906131f1565b5b50905061321a919061325e565b5090565b50805461322a90614515565b6000825580601f1061323c575061325b565b601f01602090049060005260206000209081019061325a919061325e565b5b50565b5b8082111561327757600081600090555060010161325f565b5090565b600061328e613289846141ed565b6141c8565b905080838252602082019050828560208602820111156132ad57600080fd5b60005b858110156132dd57816132c38882613455565b8452602084019350602083019250506001810190506132b0565b5050509392505050565b60006132fa6132f584614219565b6141c8565b9050808382526020820190508285602086028201111561331957600080fd5b60005b8581101561336357813567ffffffffffffffff81111561333b57600080fd5b8086016133488982613566565b8552602085019450602084019350505060018101905061331c565b5050509392505050565b600061338061337b84614245565b6141c8565b9050808382526020820190508285602086028201111561339f57600080fd5b60005b858110156133cf57816133b58882613590565b8452602084019350602083019250506001810190506133a2565b5050509392505050565b60006133ec6133e784614271565b6141c8565b90508281526020810184848401111561340457600080fd5b61340f8482856144a9565b509392505050565b600061342a613425846142a2565b6141c8565b90508281526020810184848401111561344257600080fd5b61344d8482856144a9565b509392505050565b60008135905061346481614db8565b92915050565b600082601f83011261347b57600080fd5b813561348b84826020860161327b565b91505092915050565b600082601f8301126134a557600080fd5b81356134b58482602086016132e7565b91505092915050565b600082601f8301126134cf57600080fd5b81356134df84826020860161336d565b91505092915050565b6000813590506134f781614dcf565b92915050565b60008135905061350c81614de6565b92915050565b60008135905061352181614dfd565b92915050565b60008151905061353681614dfd565b92915050565b600082601f83011261354d57600080fd5b813561355d8482602086016133d9565b91505092915050565b600082601f83011261357757600080fd5b8135613587848260208601613417565b91505092915050565b60008135905061359f81614e14565b92915050565b6000602082840312156135b757600080fd5b60006135c584828501613455565b91505092915050565b600080604083850312156135e157600080fd5b60006135ef85828601613455565b925050602061360085828601613455565b9150509250929050565b60008060006060848603121561361f57600080fd5b600061362d86828701613455565b935050602061363e86828701613455565b925050604061364f86828701613590565b9150509250925092565b6000806000806080858703121561366f57600080fd5b600061367d87828801613455565b945050602061368e87828801613455565b935050604061369f87828801613590565b925050606085013567ffffffffffffffff8111156136bc57600080fd5b6136c88782880161353c565b91505092959194509250565b600080604083850312156136e757600080fd5b60006136f585828601613455565b9250506020613706858286016134e8565b9150509250929050565b6000806040838503121561372357600080fd5b600061373185828601613455565b925050602061374285828601613590565b9150509250929050565b60008060006060848603121561376157600080fd5b600061376f86828701613455565b935050602061378086828701613590565b925050604084013567ffffffffffffffff81111561379d57600080fd5b6137a986828701613566565b9150509250925092565b6000806000606084860312156137c857600080fd5b600084013567ffffffffffffffff8111156137e257600080fd5b6137ee8682870161346a565b935050602084013567ffffffffffffffff81111561380b57600080fd5b613817868287016134be565b925050604084013567ffffffffffffffff81111561383457600080fd5b61384086828701613494565b9150509250925092565b60006020828403121561385c57600080fd5b600061386a848285016134fd565b91505092915050565b6000806040838503121561388657600080fd5b6000613894858286016134fd565b92505060206138a585828601613455565b9150509250929050565b600080604083850312156138c257600080fd5b60006138d0858286016134fd565b92505060206138e185828601613590565b9150509250929050565b6000602082840312156138fd57600080fd5b600061390b84828501613512565b91505092915050565b60006020828403121561392657600080fd5b600061393484828501613527565b91505092915050565b60006020828403121561394f57600080fd5b600061395d84828501613590565b91505092915050565b61396f8161442b565b82525050565b61397e8161443d565b82525050565b61398d81614449565b82525050565b600061399e826142d3565b6139a881856142e9565b93506139b88185602086016144b8565b6139c1816146ae565b840191505092915050565b60006139d7826142de565b6139e181856142fa565b93506139f18185602086016144b8565b6139fa816146ae565b840191505092915050565b6000613a10826142de565b613a1a818561430b565b9350613a2a8185602086016144b8565b80840191505092915050565b6000613a436020836142fa565b9150613a4e826146bf565b602082019050919050565b6000613a66602b836142fa565b9150613a71826146e8565b604082019050919050565b6000613a896032836142fa565b9150613a9482614737565b604082019050919050565b6000613aac601c836142fa565b9150613ab782614786565b602082019050919050565b6000613acf6024836142fa565b9150613ada826147af565b604082019050919050565b6000613af26019836142fa565b9150613afd826147fe565b602082019050919050565b6000613b15602c836142fa565b9150613b2082614827565b604082019050919050565b6000613b386038836142fa565b9150613b4382614876565b604082019050919050565b6000613b5b602a836142fa565b9150613b66826148c5565b604082019050919050565b6000613b7e6029836142fa565b9150613b8982614914565b604082019050919050565b6000613ba1602e836142fa565b9150613bac82614963565b604082019050919050565b6000613bc46020836142fa565b9150613bcf826149b2565b602082019050919050565b6000613be76031836142fa565b9150613bf2826149db565b604082019050919050565b6000613c0a602c836142fa565b9150613c1582614a2a565b604082019050919050565b6000613c2d6029836142fa565b9150613c3882614a79565b604082019050919050565b6000613c50602f836142fa565b9150613c5b82614ac8565b604082019050919050565b6000613c736046836142fa565b9150613c7e82614b17565b606082019050919050565b6000613c966021836142fa565b9150613ca182614b8c565b604082019050919050565b6000613cb96031836142fa565b9150613cc482614bdb565b604082019050919050565b6000613cdc602c836142fa565b9150613ce782614c2a565b604082019050919050565b6000613cff60178361430b565b9150613d0a82614c79565b601782019050919050565b6000613d22603d836142fa565b9150613d2d82614ca2565b604082019050919050565b6000613d456030836142fa565b9150613d5082614cf1565b604082019050919050565b6000613d6860118361430b565b9150613d7382614d40565b601182019050919050565b6000613d8b602f836142fa565b9150613d9682614d69565b604082019050919050565b613daa8161449f565b82525050565b6000613dbc8285613a05565b9150613dc88284613a05565b91508190509392505050565b6000613ddf82613cf2565b9150613deb8285613a05565b9150613df682613d5b565b9150613e028284613a05565b91508190509392505050565b6000602082019050613e236000830184613966565b92915050565b6000608082019050613e3e6000830187613966565b613e4b6020830186613966565b613e586040830185613da1565b8181036060830152613e6a8184613993565b905095945050505050565b6000602082019050613e8a6000830184613975565b92915050565b6000602082019050613ea56000830184613984565b92915050565b60006020820190508181036000830152613ec581846139cc565b905092915050565b60006020820190508181036000830152613ee681613a36565b9050919050565b60006020820190508181036000830152613f0681613a59565b9050919050565b60006020820190508181036000830152613f2681613a7c565b9050919050565b60006020820190508181036000830152613f4681613a9f565b9050919050565b60006020820190508181036000830152613f6681613ac2565b9050919050565b60006020820190508181036000830152613f8681613ae5565b9050919050565b60006020820190508181036000830152613fa681613b08565b9050919050565b60006020820190508181036000830152613fc681613b2b565b9050919050565b60006020820190508181036000830152613fe681613b4e565b9050919050565b6000602082019050818103600083015261400681613b71565b9050919050565b6000602082019050818103600083015261402681613b94565b9050919050565b6000602082019050818103600083015261404681613bb7565b9050919050565b6000602082019050818103600083015261406681613bda565b9050919050565b6000602082019050818103600083015261408681613bfd565b9050919050565b600060208201905081810360008301526140a681613c20565b9050919050565b600060208201905081810360008301526140c681613c43565b9050919050565b600060208201905081810360008301526140e681613c66565b9050919050565b6000602082019050818103600083015261410681613c89565b9050919050565b6000602082019050818103600083015261412681613cac565b9050919050565b6000602082019050818103600083015261414681613ccf565b9050919050565b6000602082019050818103600083015261416681613d15565b9050919050565b6000602082019050818103600083015261418681613d38565b9050919050565b600060208201905081810360008301526141a681613d7e565b9050919050565b60006020820190506141c26000830184613da1565b92915050565b60006141d26141e3565b90506141de8282614547565b919050565b6000604051905090565b600067ffffffffffffffff8211156142085761420761467f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142345761423361467f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142605761425f61467f565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561428c5761428b61467f565b5b614295826146ae565b9050602081019050919050565b600067ffffffffffffffff8211156142bd576142bc61467f565b5b6142c6826146ae565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143218261449f565b915061432c8361449f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614361576143606145f2565b5b828201905092915050565b60006143778261449f565b91506143828361449f565b92508261439257614391614621565b5b828204905092915050565b60006143a88261449f565b91506143b38361449f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143ec576143eb6145f2565b5b828202905092915050565b60006144028261449f565b915061440d8361449f565b9250828210156144205761441f6145f2565b5b828203905092915050565b60006144368261447f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156144d65780820151818401526020810190506144bb565b838111156144e5576000848401525b50505050565b60006144f68261449f565b9150600082141561450a576145096145f2565b5b600182039050919050565b6000600282049050600182168061452d57607f821691505b6020821081141561454157614540614650565b5b50919050565b614550826146ae565b810181811067ffffffffffffffff8211171561456f5761456e61467f565b5b80604052505050565b60006145838261449f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145b6576145b56145f2565b5b600182019050919050565b60006145cc8261449f565b91506145d78361449f565b9250826145e7576145e6614621565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f4f6e6c792056756c63616e4265617242756c6c2063616e206d696e7420796f7560208201527f20706c6562210000000000000000000000000000000000000000000000000000604082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d7573742068617665206d696e74657220726f6c6520746f206d696e74000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614dc18161442b565b8114614dcc57600080fd5b50565b614dd88161443d565b8114614de357600080fd5b50565b614def81614449565b8114614dfa57600080fd5b50565b614e0681614453565b8114614e1157600080fd5b50565b614e1d8161449f565b8114614e2857600080fd5b5056fea2646970667358221220e683e466d1b4e2e155a22d9a3a32dbce26694cb5fe3b2e561b68f78c1ce4185964736f6c63430008040033