Polygon Sponsored slots available. Book your slot here!
ERC-721
Overview
Max Total Supply
24,044 MEEBMASTER
Holders
6,740
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MEEBMASTERLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
MeebMasterNFT
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-07-22 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.6; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } interface IMeebMasterNFT is IERC721 { function getStats(uint256 tokenId) external view returns ( uint16[] memory pvpStats, uint16 luckStat, uint16 productivityStat, uint256 otherStats ); function totalBurned() external view returns (uint256); function exists(uint256 tokenId) external view returns (bool); function lockedBy(uint256 tokenId) external view returns (address); function lock(uint256 tokenId, address locker) external; function unlock(uint256 tokenId) external; function burn(uint256 tokenId) external; } interface IMeebMasterStats { struct MeebInfo { uint8 id; string Name; string Attribute; uint8 Level; string Passive; } struct MeebPurity { uint8 id; string Name; uint8 Star; } struct MeebBody { uint16 HP; uint16 Atk; uint16 S_Atk; uint16 Energy; uint16 Crit; uint16 Crit_Dmg; uint16 Speed; uint16 AFK_Stat; uint16 Luck; uint16 Productivity; } /** * @dev Returns game info. */ function info() external view returns ( uint256 totalSupply, uint256 totalBurned, uint256 totalFusion, uint256[] memory otherInfo ); /** * @dev Returns MeebMaster stats from the token ID */ function stats(uint256 tokenId) external view returns ( uint16[] memory pvpStats, uint16 luckStat, uint16 productivityStat, uint256 otherStats ); /** * @dev Returns MeebMaster card details from the token ID */ function details(uint256 tokenId) external view returns ( MeebInfo[] memory info, MeebPurity memory purity, MeebBody memory body ); /** * @dev Returns expected price (in MEEB) from the token ID */ function expectedPrice(uint256 tokenId) external view returns (uint256); function setInfo(uint256 tokenId, MeebInfo[] memory newInfo) external; function setPurity(uint256 tokenId, MeebPurity memory newPurity) external; function setBody(uint256 tokenId, MeebBody memory newBody) external; function setDetails( uint256 tokenId, MeebInfo[] memory newInfo, MeebPurity memory newPurity, MeebBody memory newBody ) external; } interface IERC721Locker { function unlock(uint256 tokenId) external; function onERC721Locked( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); function onERC721Unlocked( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. * add admin user. * rewrite ownerOf(uint256) token not mint yet will belong to admin user by default. * rewrite tokenURI(uint256) always return _baseURI() + tokenId; metadata sever will handle no-mint token. * rewrite balanceOf(address), if is admin, return 999999999. * rewrite transferFrom&safeTransferFrom, no-mint token will _mint before transfer, only admin user. */ contract BRC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; address private _admin; mapping(address => bool) _minters; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor( address admin_, string memory name_, string memory symbol_ ) { _admin = admin_; _name = name_; _symbol = symbol_; } modifier onlyAdmin() { require(msg.sender == _admin, "restrict to admin"); _; } modifier onlyMinter() { require(_minters[msg.sender], "restrict to minter"); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. * return magic balance value if is admin user */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. * return admin user address is not mint yet. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; if (owner == address(0)) { return _admin; } return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * return admin user; */ function admin() public view virtual returns (address) { return _admin; } /** * return if the account has minter right; */ function isMinter(address account) public view virtual returns (bool) { return _minters[account]; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = BRC721.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); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ 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); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. * if msg.sender is admin, mint before transfer */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _mintIfNotExist(tokenId); //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. * if msg.sender is admin, mint before transfer */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _mintIfNotExist(tokenId); require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ 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"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = BRC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ 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"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ 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"); require(tokenId > 0, "ERC721: zero id"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = _owners[tokenId]; _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(BRC721.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); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(BRC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /* * mint if msg.sender is admin && tokenId not mint. */ function _mintIfNotExist(uint256 tokenId) private { if (_minters[msg.sender] || msg.sender == _admin) { if (!_exists(tokenId)) { _mint(msg.sender, tokenId); } } } function mint(address to, uint256 tokenId) external onlyMinter { _mint(to, tokenId); } function safeMint(address to, uint256 tokenId) external onlyMinter { _safeMint(to, tokenId); } function changeAdmin(address newAdmin) external onlyAdmin { _admin = newAdmin; } function setMinterStatus(address account, bool _isMinter) external onlyAdmin { _minters[account] = _isMinter; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } abstract contract BRC721Enumerable is BRC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, BRC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < BRC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < BRC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ 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); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = BRC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = BRC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } contract BNFT is BRC721Enumerable, Pausable { using Strings for uint256; string private baseURI; constructor( address admin_, string memory baseURI_, string memory name_, string memory symbol_ ) BRC721(admin_, name_, symbol_) { baseURI = string(abi.encodePacked(baseURI_, symbol_, "/")); } function _baseURI() internal view override returns (string memory) { return baseURI; } /** * override tokenURI(uint256), remove restrict for tokenId exist. */ function tokenURI(uint256 tokenId) public view override returns (string memory) { return string(abi.encodePacked(baseURI, tokenId.toString())); } function setPause() external onlyAdmin { _pause(); } function unsetPause() external onlyAdmin { _unpause(); } function changeBaseURI(string memory newBaseURI) external onlyAdmin { string memory symbol_ = symbol(); baseURI = string(abi.encodePacked(newBaseURI, symbol_, "/")); } /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "BRC721Pausable: token transfer while paused"); } } contract MeebMasterNFT is BNFT, IMeebMasterNFT, ReentrancyGuard { using Address for address; uint256 private _totalBurned; // Mapping from token ID to locker address mapping(uint256 => address) private _lockedBy; address private _meebStats; constructor() BNFT(_msgSender(), "https://nftstatic.meebmaster.com/static/nft/POLYGON/", "MeebMaster.com NFT", "MEEBMASTER") {} function setMeebStats(address newMeebStats) external onlyAdmin { _meebStats = newMeebStats; } /* ========== VIEW FUNCTIONS ========== */ function totalBurned() external view override returns (uint256) { return _totalBurned; } function getStats(uint256 tokenId) external view override returns ( uint16[] memory pvpStats, uint16 luckStat, uint16 productivityStat, uint256 otherStats ) { if (_meebStats != address(0)) { (pvpStats, luckStat, productivityStat, otherStats) = IMeebMasterStats(_meebStats).stats(tokenId); } } function exists(uint256 tokenId) external view virtual override returns (bool) { return _exists(tokenId); } function lockedBy(uint256 tokenId) external view override returns (address) { return _lockedBy[tokenId]; } /* ========== MUTATIVE FUNCTIONS ========== */ function lock(uint256 tokenId, address locker) external override nonReentrant { require(_lockedBy[tokenId] == address(0), "MeebMasterNFT: already locked"); //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _lockedBy[tokenId] = locker; require(_checkOnERC721Locked(ownerOf(tokenId), locker, tokenId, ""), "MeebMasterNFT: lock failed"); } function unlock(uint256 tokenId) external override { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address _locker = _lockedBy[tokenId]; //solhint-disable-next-line max-line-length require(_locker == _msgSender() || admin() == _msgSender(), "MeebMasterNFT: caller is not locker nor admin"); require(_checkOnERC721Unlocked(ownerOf(tokenId), _locker, tokenId, ""), "MeebMasterNFT: unlock failed"); delete _lockedBy[tokenId]; } /** * @dev Internal function to invoke {IERC721Locker-onERC721Locked} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the owner of the given token ID * @param locker target address that will lock the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Locked( address from, address locker, uint256 tokenId, bytes memory _data ) private returns (bool) { if (locker.isContract()) { try IERC721Locker(locker).onERC721Locked(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Locker(locker).onERC721Locked.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("MeebMasterNFT: lock by non ERC721Locker implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Internal function to invoke {IERC721Locker-onERC721Unlocked} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the owner of the given token ID * @param locker target address that will lock the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Unlocked( address from, address locker, uint256 tokenId, bytes memory _data ) private returns (bool) { if (locker.isContract()) { try IERC721Locker(locker).onERC721Unlocked(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Locker(locker).onERC721Unlocked.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("MeebMasterNFT: unlock from a non ERC721Locker implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual override nonReentrant { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); _totalBurned++; } /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the token is not locked or the target (to) is the locker */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (_lockedBy[tokenId] != to) { require(_lockedBy[tokenId] == address(0), "MeebMasterNFT: token transfer while locked"); } else { delete _lockedBy[tokenId]; } } /* ========== EMERGENCY ========== */ function rescueStuckErc20(address _token) external onlyAdmin { IERC20(_token).transfer(admin(), IERC20(_token).balanceOf(address(this))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStats","outputs":[{"internalType":"uint16[]","name":"pvpStats","type":"uint16[]"},{"internalType":"uint16","name":"luckStat","type":"uint16"},{"internalType":"uint16","name":"productivityStat","type":"uint16"},{"internalType":"uint256","name":"otherStats","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"locker","type":"address"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"lockedBy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"rescueStuckErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMeebStats","type":"address"}],"name":"setMeebStats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"_isMinter","type":"bool"}],"name":"setMinterStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPause","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"totalBurned","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":"uint256","name":"tokenId","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unsetPause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5033604051806060016040528060348152602001620040f46034913960408051808201825260128152711359595893585cdd195c8b98dbdb4813919560721b60208083019182528351808501909452600a84526926a2a2a126a0a9aa22a960b11b90840152600280546001600160a01b0319166001600160a01b0387161790558151919291859184918491620000ab91600091906200011b565b508051620000c19060019060208401906200011b565b5050600c805460ff191690555050604051620000e49084908390602001620001ff565b604051602081830303815290604052600d90805190602001906200010a9291906200011b565b50506001600e555062000267915050565b82805462000129906200022a565b90600052602060002090601f0160209004810192826200014d576000855562000198565b82601f106200016857805160ff191683800117855562000198565b8280016001018555821562000198579182015b82811115620001985782518255916020019190600101906200017b565b50620001a6929150620001aa565b5090565b5b80821115620001a65760008155600101620001ab565b6000815160005b81811015620001e45760208185018101518683015201620001c8565b81811115620001f4576000828601525b509290920192915050565b600062000218620002118386620001c1565b84620001c1565b602f60f81b8152600101949350505050565b600181811c908216806200023f57607f821691505b602082108114156200026157634e487b7160e01b600052602260045260246000fd5b50919050565b613e7d80620002776000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c806366dfbfb411610145578063b5d56a41116100bd578063d89135cd1161008c578063e985e9c511610071578063e985e9c514610508578063f00c298d14610551578063f851a4401461056457600080fd5b8063d89135cd146104ca578063e1e77855146104d257600080fd5b8063b5d56a4114610489578063b88d4fde1461049c578063c87b56dd146104af578063d431b1ac146104c257600080fd5b80638f28397011610114578063a1448194116100f9578063a14481941461042a578063a22cb4651461043d578063aa271e1a1461045057600080fd5b80638f2839701461040f57806395d89b411461042257600080fd5b806366dfbfb4146103b357806370a08231146103c65780637b303965146103d957806381ca7eba146103fc57600080fd5b806340c10f19116101d85780634f6ccce7116101a75780635c975abb1161018c5780635c975abb146103825780636198e3391461038d5780636352211e146103a057600080fd5b80634f6ccce7146103675780634f8421431461037a57600080fd5b806340c10f191461031b57806342842e0e1461032e57806342966c68146103415780634f558e791461035457600080fd5b806318160ddd1161021457806318160ddd146102d057806323b872dd146102e25780632f745c59146102f557806339a0c6f91461030857600080fd5b806301ffc9a71461024657806306fdde031461026e578063081812fc14610283578063095ea7b3146102bb575b600080fd5b610259610254366004613892565b610582565b60405190151581526020015b60405180910390f35b6102766105de565b6040516102659190613bae565b610296610291366004613915565b610670565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610265565b6102ce6102c936600461376d565b61074f565b005b600a545b604051908152602001610265565b6102ce6102f036600461367e565b6108dc565b6102d461030336600461376d565b610987565b6102ce6103163660046138cc565b610a56565b6102ce61032936600461376d565b610b1a565b6102ce61033c36600461367e565b610ba1565b6102ce61034f366004613915565b610bbc565b610259610362366004613915565b610ce9565b6102d4610375366004613915565b610d15565b6102ce610dd3565b600c5460ff16610259565b6102ce61039b366004613915565b610e5e565b6102966103ae366004613915565b6110a5565b6102ce6103c1366004613947565b6110ef565b6102d46103d4366004613629565b611362565b6103ec6103e7366004613915565b611430565b6040516102659493929190613b4e565b6102ce61040a366004613629565b61152e565b6102ce61041d366004613629565b61172a565b6102766117f2565b6102ce61043836600461376d565b611801565b6102ce61044b366004613736565b611884565b61025961045e366004613629565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205460ff1690565b6102ce610497366004613629565b61199b565b6102ce6104aa3660046136ba565b611a63565b6102766104bd366004613915565b611b13565b6102ce611b47565b600f546102d4565b6102966104e0366004613915565b60009081526010602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b61025961051636600461364b565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260076020908152604080832093909416825291909152205460ff1690565b6102ce61055f366004613736565b611bd0565b60025473ffffffffffffffffffffffffffffffffffffffff16610296565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806105d857506105d882611ca7565b92915050565b6060600080546105ed90613c7f565b80601f016020809104026020016040519081016040528092919081815260200182805461061990613c7f565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050905090565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16610726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061075a826110a5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161071d565b3373ffffffffffffffffffffffffffffffffffffffff8216148061084157506108418133610516565b6108cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161071d565b6108d78383611d8a565b505050565b6108e581611e2a565b6108f0335b82611e9a565b61097c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161071d565b6108d783838361200a565b600061099283611362565b8210610a20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161071d565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b60025473ffffffffffffffffffffffffffffffffffffffff163314610ad7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b6000610ae16117f2565b90508181604051602001610af69291906139d0565b604051602081830303815290604052600d90805190602001906108d79291906134df565b3360009081526003602052604090205460ff16610b93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f726573747269637420746f206d696e7465720000000000000000000000000000604482015260640161071d565b610b9d828261227c565b5050565b6108d783838360405180602001604052806000815250611a63565b6002600e541415610c29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b6002600e55610c37336108ea565b610cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000606482015260840161071d565b610ccc816124b4565b600f8054906000610cdc83613cd3565b90915550506001600e5550565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff1615156105d8565b6000610d20600a5490565b8210610dae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161071d565b600a8281548110610dc157610dc1613dad565b90600052602060002001549050919050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610e54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b610e5c612657565b565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16610f0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161071d565b60008181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff1633811480610f59575060025473ffffffffffffffffffffffffffffffffffffffff1633145b610fe5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4d6565624d61737465724e46543a2063616c6c6572206973206e6f74206c6f6360448201527f6b6572206e6f722061646d696e00000000000000000000000000000000000000606482015260840161071d565b611008610ff1836110a5565b828460405180602001604052806000815250612738565b61106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4d6565624d61737465724e46543a20756e6c6f636b206661696c656400000000604482015260640161071d565b50600090815260106020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16806105d857505060025473ffffffffffffffffffffffffffffffffffffffff16919050565b6002600e54141561115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b6002600e5560008281526010602052604090205473ffffffffffffffffffffffffffffffffffffffff16156111ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d6565624d61737465724e46543a20616c7265616479206c6f636b6564000000604482015260640161071d565b6111f8335b83611e9a565b611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161071d565b600082815260106020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790556112f36112dc836110a5565b828460405180602001604052806000815250612937565b611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d6565624d61737465724e46543a206c6f636b206661696c6564000000000000604482015260640161071d565b50506001600e55565b600073ffffffffffffffffffffffffffffffffffffffff8216611407576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161071d565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205490565b6011546060906000908190819073ffffffffffffffffffffffffffffffffffffffff1615611527576011546040517fad217ae50000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff9091169063ad217ae59060240160006040518083038186803b1580156114c257600080fd5b505afa1580156114d6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261151c9190810190613797565b929650909450925090505b9193509193565b60025473ffffffffffffffffffffffffffffffffffffffff1633146115af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6115ea60025473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8516906370a082319060240160206040518083038186803b15801561164f57600080fd5b505afa158015611663573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611687919061392e565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401602060405180830381600087803b1580156116f257600080fd5b505af1158015611706573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9d9190613875565b60025473ffffffffffffffffffffffffffffffffffffffff1633146117ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6060600180546105ed90613c7f565b3360009081526003602052604090205460ff1661187a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f726573747269637420746f206d696e7465720000000000000000000000000000604482015260640161071d565b610b9d8282612b23565b73ffffffffffffffffffffffffffffffffffffffff8216331415611904576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161071d565b33600081815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611a1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611a6c82611e2a565b611a75336111f2565b611b01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161071d565b611b0d84848484612b3d565b50505050565b6060600d611b2083612be0565b604051602001611b31929190613a27565b6040516020818303038152906040529050919050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611bc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b610e5c612d12565b60025473ffffffffffffffffffffffffffffffffffffffff163314611c51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611d3a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806105d857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146105d8565b600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190611de4826110a5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b3360009081526003602052604090205460ff1680611e5f575060025473ffffffffffffffffffffffffffffffffffffffff1633145b15611e975760008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16611e9757611e97338261227c565b50565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16611f4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161071d565b6000611f56836110a5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fc557508373ffffffffffffffffffffffffffffffffffffffff16611fad84610670565b73ffffffffffffffffffffffffffffffffffffffff16145b80612002575073ffffffffffffffffffffffffffffffffffffffff80821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661202a826110a5565b73ffffffffffffffffffffffffffffffffffffffff16146120cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161071d565b73ffffffffffffffffffffffffffffffffffffffff821661216f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161071d565b61217a838383612dd2565b612185600082611d8a565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604081208054600192906121bb908490613c3c565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604081208054600192906121f6908490613c10565b909155505060008181526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b73ffffffffffffffffffffffffffffffffffffffff82166122f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161071d565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161071d565b600081116123ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4552433732313a207a65726f2069640000000000000000000000000000000000604482015260640161071d565b6123fb60008383612dd2565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600560205260408120805460019290612431908490613c10565b909155505060008181526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161071d565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff169061259790829084612dd2565b6125a2600083611d8a565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081208054600192906125d8908490613c3c565b909155505060008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555183919073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600c5460ff166126c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161071d565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561292c576040517f8aed3f9c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690638aed3f9c906127af903390899088908890600401613b05565b602060405180830381600087803b1580156127c957600080fd5b505af1925050508015612817575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612814918101906138af565b60015b6128e1573d808015612845576040519150601f19603f3d011682016040523d82523d6000602084013e61284a565b606091505b5080516128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d6565624d61737465724e46543a20756e6c6f636b2066726f6d2061206e6f6e60448201527f204552433732314c6f636b657220696d706c656d656e74657200000000000000606482015260840161071d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f8aed3f9c00000000000000000000000000000000000000000000000000000000149050612002565b506001949350505050565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561292c576040517f9f2c9fd500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690639f2c9fd5906129ae903390899088908890600401613b05565b602060405180830381600087803b1580156129c857600080fd5b505af1925050508015612a16575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612a13918101906138af565b60015b612ad8573d808015612a44576040519150601f19603f3d011682016040523d82523d6000602084013e612a49565b606091505b5080516128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4d6565624d61737465724e46543a206c6f636b206279206e6f6e20455243373260448201527f314c6f636b657220696d706c656d656e74657200000000000000000000000000606482015260840161071d565b7fffffffff00000000000000000000000000000000000000000000000000000000167f9f2c9fd500000000000000000000000000000000000000000000000000000000149050612002565b610b9d828260405180602001604052806000815250612ef5565b612b4884848461200a565b612b5484848484612f98565b611b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161071d565b606081612c2057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612c4a5780612c3481613cd3565b9150612c439050600a83613c28565b9150612c24565b60008167ffffffffffffffff811115612c6557612c65613ddc565b6040519080825280601f01601f191660200182016040528015612c8f576020820181803683370190505b5090505b841561200257612ca4600183613c3c565b9150612cb1600a86613d0c565b612cbc906030613c10565b60f81b818381518110612cd157612cd1613dad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612d0b600a86613c28565b9450612c93565b600c5460ff1615612d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161071d565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861270e3390565b612ddd838383613184565b60008181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff838116911614612ebd5760008181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff16156108d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4d6565624d61737465724e46543a20746f6b656e207472616e7366657220776860448201527f696c65206c6f636b656400000000000000000000000000000000000000000000606482015260840161071d565b600090815260106020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b612eff838361227c565b612f0c6000848484612f98565b6108d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161071d565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561292c576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061300f903390899088908890600401613b05565b602060405180830381600087803b15801561302957600080fd5b505af1925050508015613077575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613074918101906138af565b60015b613139573d8080156130a5576040519150601f19603f3d011682016040523d82523d6000602084013e6130aa565b606091505b5080516128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161071d565b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612002565b61318f838383613222565b600c5460ff16156108d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4252433732315061757361626c653a20746f6b656e207472616e73666572207760448201527f68696c6520706175736564000000000000000000000000000000000000000000606482015260840161071d565b73ffffffffffffffffffffffffffffffffffffffff831661328a5761328581600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b6132c7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132c7576132c78382613328565b73ffffffffffffffffffffffffffffffffffffffff82166132eb576108d7816133df565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146108d7576108d7828261348e565b6000600161333584611362565b61333f9190613c3c565b60008381526009602052604090205490915080821461339f5773ffffffffffffffffffffffffffffffffffffffff841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b50600091825260096020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600881528383209183525290812055565b600a546000906133f190600190613c3c565b6000838152600b6020526040812054600a805493945090928490811061341957613419613dad565b9060005260206000200154905080600a838154811061343a5761343a613dad565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061347257613472613d7e565b6001900381819060005260206000200160009055905550505050565b600061349983611362565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b8280546134eb90613c7f565b90600052602060002090601f01602090048101928261350d5760008555613553565b82601f1061352657805160ff1916838001178555613553565b82800160010185558215613553579182015b82811115613553578251825591602001919060010190613538565b5061355f929150613563565b5090565b5b8082111561355f5760008155600101613564565b600067ffffffffffffffff83111561359257613592613ddc565b6135c360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613bc1565b90508281528383830111156135d757600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461361257600080fd5b919050565b805161ffff8116811461361257600080fd5b60006020828403121561363b57600080fd5b613644826135ee565b9392505050565b6000806040838503121561365e57600080fd5b613667836135ee565b9150613675602084016135ee565b90509250929050565b60008060006060848603121561369357600080fd5b61369c846135ee565b92506136aa602085016135ee565b9150604084013590509250925092565b600080600080608085870312156136d057600080fd5b6136d9856135ee565b93506136e7602086016135ee565b925060408501359150606085013567ffffffffffffffff81111561370a57600080fd5b8501601f8101871361371b57600080fd5b61372a87823560208401613578565b91505092959194509250565b6000806040838503121561374957600080fd5b613752836135ee565b9150602083013561376281613e0b565b809150509250929050565b6000806040838503121561378057600080fd5b613789836135ee565b946020939093013593505050565b600080600080608085870312156137ad57600080fd5b845167ffffffffffffffff808211156137c557600080fd5b818701915087601f8301126137d957600080fd5b81516020828211156137ed576137ed613ddc565b8160051b92506137fe818401613bc1565b8281528181019085830185870184018d101561381957600080fd5b600096505b848710156138435761382f81613617565b83526001969096019591830191830161381e565b5098506138539050898201613617565b96505050505061386560408601613617565b6060959095015193969295505050565b60006020828403121561388757600080fd5b815161364481613e0b565b6000602082840312156138a457600080fd5b813561364481613e19565b6000602082840312156138c157600080fd5b815161364481613e19565b6000602082840312156138de57600080fd5b813567ffffffffffffffff8111156138f557600080fd5b8201601f8101841361390657600080fd5b61200284823560208401613578565b60006020828403121561392757600080fd5b5035919050565b60006020828403121561394057600080fd5b5051919050565b6000806040838503121561395a57600080fd5b82359150613675602084016135ee565b60008151808452613982816020860160208601613c53565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081516139c6818560208601613c53565b9290920192915050565b600083516139e2818460208801613c53565b8351908301906139f6818360208801613c53565b7f2f000000000000000000000000000000000000000000000000000000000000009101908152600101949350505050565b600080845481600182811c915080831680613a4357607f831692505b6020808410821415613a7c577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015613a905760018114613abf57613aec565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613aec565b60008b81526020902060005b86811015613ae45781548b820152908501908301613acb565b505084890196505b505050505050613afc81856139b4565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152613b44608083018461396a565b9695505050505050565b6080808252855190820181905260009060209060a0840190828901845b82811015613b8b57815161ffff1684529284019290840190600101613b6b565b50505061ffff968716918401919091529390941660408201526060015292915050565b602081526000613644602083018461396a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c0857613c08613ddc565b604052919050565b60008219821115613c2357613c23613d20565b500190565b600082613c3757613c37613d4f565b500490565b600082821015613c4e57613c4e613d20565b500390565b60005b83811015613c6e578181015183820152602001613c56565b83811115611b0d5750506000910152565b600181811c90821680613c9357607f821691505b60208210811415613ccd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d0557613d05613d20565b5060010190565b600082613d1b57613d1b613d4f565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8015158114611e9757600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611e9757600080fdfea2646970667358221220db0d16cc55a06d37306a8c1b3722e04a4d7a49eeb5385238234adb318c90e81864736f6c6343000806003368747470733a2f2f6e66747374617469632e6d6565626d61737465722e636f6d2f7374617469632f6e66742f504f4c59474f4e2f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102415760003560e01c806366dfbfb411610145578063b5d56a41116100bd578063d89135cd1161008c578063e985e9c511610071578063e985e9c514610508578063f00c298d14610551578063f851a4401461056457600080fd5b8063d89135cd146104ca578063e1e77855146104d257600080fd5b8063b5d56a4114610489578063b88d4fde1461049c578063c87b56dd146104af578063d431b1ac146104c257600080fd5b80638f28397011610114578063a1448194116100f9578063a14481941461042a578063a22cb4651461043d578063aa271e1a1461045057600080fd5b80638f2839701461040f57806395d89b411461042257600080fd5b806366dfbfb4146103b357806370a08231146103c65780637b303965146103d957806381ca7eba146103fc57600080fd5b806340c10f19116101d85780634f6ccce7116101a75780635c975abb1161018c5780635c975abb146103825780636198e3391461038d5780636352211e146103a057600080fd5b80634f6ccce7146103675780634f8421431461037a57600080fd5b806340c10f191461031b57806342842e0e1461032e57806342966c68146103415780634f558e791461035457600080fd5b806318160ddd1161021457806318160ddd146102d057806323b872dd146102e25780632f745c59146102f557806339a0c6f91461030857600080fd5b806301ffc9a71461024657806306fdde031461026e578063081812fc14610283578063095ea7b3146102bb575b600080fd5b610259610254366004613892565b610582565b60405190151581526020015b60405180910390f35b6102766105de565b6040516102659190613bae565b610296610291366004613915565b610670565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610265565b6102ce6102c936600461376d565b61074f565b005b600a545b604051908152602001610265565b6102ce6102f036600461367e565b6108dc565b6102d461030336600461376d565b610987565b6102ce6103163660046138cc565b610a56565b6102ce61032936600461376d565b610b1a565b6102ce61033c36600461367e565b610ba1565b6102ce61034f366004613915565b610bbc565b610259610362366004613915565b610ce9565b6102d4610375366004613915565b610d15565b6102ce610dd3565b600c5460ff16610259565b6102ce61039b366004613915565b610e5e565b6102966103ae366004613915565b6110a5565b6102ce6103c1366004613947565b6110ef565b6102d46103d4366004613629565b611362565b6103ec6103e7366004613915565b611430565b6040516102659493929190613b4e565b6102ce61040a366004613629565b61152e565b6102ce61041d366004613629565b61172a565b6102766117f2565b6102ce61043836600461376d565b611801565b6102ce61044b366004613736565b611884565b61025961045e366004613629565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205460ff1690565b6102ce610497366004613629565b61199b565b6102ce6104aa3660046136ba565b611a63565b6102766104bd366004613915565b611b13565b6102ce611b47565b600f546102d4565b6102966104e0366004613915565b60009081526010602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b61025961051636600461364b565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260076020908152604080832093909416825291909152205460ff1690565b6102ce61055f366004613736565b611bd0565b60025473ffffffffffffffffffffffffffffffffffffffff16610296565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806105d857506105d882611ca7565b92915050565b6060600080546105ed90613c7f565b80601f016020809104026020016040519081016040528092919081815260200182805461061990613c7f565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050905090565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16610726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061075a826110a5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161071d565b3373ffffffffffffffffffffffffffffffffffffffff8216148061084157506108418133610516565b6108cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161071d565b6108d78383611d8a565b505050565b6108e581611e2a565b6108f0335b82611e9a565b61097c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161071d565b6108d783838361200a565b600061099283611362565b8210610a20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161071d565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b60025473ffffffffffffffffffffffffffffffffffffffff163314610ad7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b6000610ae16117f2565b90508181604051602001610af69291906139d0565b604051602081830303815290604052600d90805190602001906108d79291906134df565b3360009081526003602052604090205460ff16610b93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f726573747269637420746f206d696e7465720000000000000000000000000000604482015260640161071d565b610b9d828261227c565b5050565b6108d783838360405180602001604052806000815250611a63565b6002600e541415610c29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b6002600e55610c37336108ea565b610cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000606482015260840161071d565b610ccc816124b4565b600f8054906000610cdc83613cd3565b90915550506001600e5550565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff1615156105d8565b6000610d20600a5490565b8210610dae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161071d565b600a8281548110610dc157610dc1613dad565b90600052602060002001549050919050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610e54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b610e5c612657565b565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16610f0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161071d565b60008181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff1633811480610f59575060025473ffffffffffffffffffffffffffffffffffffffff1633145b610fe5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4d6565624d61737465724e46543a2063616c6c6572206973206e6f74206c6f6360448201527f6b6572206e6f722061646d696e00000000000000000000000000000000000000606482015260840161071d565b611008610ff1836110a5565b828460405180602001604052806000815250612738565b61106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4d6565624d61737465724e46543a20756e6c6f636b206661696c656400000000604482015260640161071d565b50600090815260106020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16806105d857505060025473ffffffffffffffffffffffffffffffffffffffff16919050565b6002600e54141561115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b6002600e5560008281526010602052604090205473ffffffffffffffffffffffffffffffffffffffff16156111ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d6565624d61737465724e46543a20616c7265616479206c6f636b6564000000604482015260640161071d565b6111f8335b83611e9a565b611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161071d565b600082815260106020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790556112f36112dc836110a5565b828460405180602001604052806000815250612937565b611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d6565624d61737465724e46543a206c6f636b206661696c6564000000000000604482015260640161071d565b50506001600e55565b600073ffffffffffffffffffffffffffffffffffffffff8216611407576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161071d565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205490565b6011546060906000908190819073ffffffffffffffffffffffffffffffffffffffff1615611527576011546040517fad217ae50000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff9091169063ad217ae59060240160006040518083038186803b1580156114c257600080fd5b505afa1580156114d6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261151c9190810190613797565b929650909450925090505b9193509193565b60025473ffffffffffffffffffffffffffffffffffffffff1633146115af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6115ea60025473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8516906370a082319060240160206040518083038186803b15801561164f57600080fd5b505afa158015611663573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611687919061392e565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401602060405180830381600087803b1580156116f257600080fd5b505af1158015611706573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9d9190613875565b60025473ffffffffffffffffffffffffffffffffffffffff1633146117ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6060600180546105ed90613c7f565b3360009081526003602052604090205460ff1661187a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f726573747269637420746f206d696e7465720000000000000000000000000000604482015260640161071d565b610b9d8282612b23565b73ffffffffffffffffffffffffffffffffffffffff8216331415611904576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161071d565b33600081815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611a1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611a6c82611e2a565b611a75336111f2565b611b01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161071d565b611b0d84848484612b3d565b50505050565b6060600d611b2083612be0565b604051602001611b31929190613a27565b6040516020818303038152906040529050919050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611bc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b610e5c612d12565b60025473ffffffffffffffffffffffffffffffffffffffff163314611c51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f726573747269637420746f2061646d696e000000000000000000000000000000604482015260640161071d565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611d3a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806105d857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146105d8565b600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190611de4826110a5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b3360009081526003602052604090205460ff1680611e5f575060025473ffffffffffffffffffffffffffffffffffffffff1633145b15611e975760008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16611e9757611e97338261227c565b50565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16611f4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161071d565b6000611f56836110a5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fc557508373ffffffffffffffffffffffffffffffffffffffff16611fad84610670565b73ffffffffffffffffffffffffffffffffffffffff16145b80612002575073ffffffffffffffffffffffffffffffffffffffff80821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661202a826110a5565b73ffffffffffffffffffffffffffffffffffffffff16146120cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161071d565b73ffffffffffffffffffffffffffffffffffffffff821661216f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161071d565b61217a838383612dd2565b612185600082611d8a565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604081208054600192906121bb908490613c3c565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604081208054600192906121f6908490613c10565b909155505060008181526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b73ffffffffffffffffffffffffffffffffffffffff82166122f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161071d565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161071d565b600081116123ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4552433732313a207a65726f2069640000000000000000000000000000000000604482015260640161071d565b6123fb60008383612dd2565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600560205260408120805460019290612431908490613c10565b909155505060008181526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161071d565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff169061259790829084612dd2565b6125a2600083611d8a565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081208054600192906125d8908490613c3c565b909155505060008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555183919073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600c5460ff166126c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161071d565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561292c576040517f8aed3f9c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690638aed3f9c906127af903390899088908890600401613b05565b602060405180830381600087803b1580156127c957600080fd5b505af1925050508015612817575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612814918101906138af565b60015b6128e1573d808015612845576040519150601f19603f3d011682016040523d82523d6000602084013e61284a565b606091505b5080516128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d6565624d61737465724e46543a20756e6c6f636b2066726f6d2061206e6f6e60448201527f204552433732314c6f636b657220696d706c656d656e74657200000000000000606482015260840161071d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f8aed3f9c00000000000000000000000000000000000000000000000000000000149050612002565b506001949350505050565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561292c576040517f9f2c9fd500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690639f2c9fd5906129ae903390899088908890600401613b05565b602060405180830381600087803b1580156129c857600080fd5b505af1925050508015612a16575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612a13918101906138af565b60015b612ad8573d808015612a44576040519150601f19603f3d011682016040523d82523d6000602084013e612a49565b606091505b5080516128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4d6565624d61737465724e46543a206c6f636b206279206e6f6e20455243373260448201527f314c6f636b657220696d706c656d656e74657200000000000000000000000000606482015260840161071d565b7fffffffff00000000000000000000000000000000000000000000000000000000167f9f2c9fd500000000000000000000000000000000000000000000000000000000149050612002565b610b9d828260405180602001604052806000815250612ef5565b612b4884848461200a565b612b5484848484612f98565b611b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161071d565b606081612c2057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612c4a5780612c3481613cd3565b9150612c439050600a83613c28565b9150612c24565b60008167ffffffffffffffff811115612c6557612c65613ddc565b6040519080825280601f01601f191660200182016040528015612c8f576020820181803683370190505b5090505b841561200257612ca4600183613c3c565b9150612cb1600a86613d0c565b612cbc906030613c10565b60f81b818381518110612cd157612cd1613dad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612d0b600a86613c28565b9450612c93565b600c5460ff1615612d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161071d565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861270e3390565b612ddd838383613184565b60008181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff838116911614612ebd5760008181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff16156108d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4d6565624d61737465724e46543a20746f6b656e207472616e7366657220776860448201527f696c65206c6f636b656400000000000000000000000000000000000000000000606482015260840161071d565b600090815260106020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b612eff838361227c565b612f0c6000848484612f98565b6108d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161071d565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561292c576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061300f903390899088908890600401613b05565b602060405180830381600087803b15801561302957600080fd5b505af1925050508015613077575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613074918101906138af565b60015b613139573d8080156130a5576040519150601f19603f3d011682016040523d82523d6000602084013e6130aa565b606091505b5080516128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161071d565b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612002565b61318f838383613222565b600c5460ff16156108d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4252433732315061757361626c653a20746f6b656e207472616e73666572207760448201527f68696c6520706175736564000000000000000000000000000000000000000000606482015260840161071d565b73ffffffffffffffffffffffffffffffffffffffff831661328a5761328581600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b6132c7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132c7576132c78382613328565b73ffffffffffffffffffffffffffffffffffffffff82166132eb576108d7816133df565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146108d7576108d7828261348e565b6000600161333584611362565b61333f9190613c3c565b60008381526009602052604090205490915080821461339f5773ffffffffffffffffffffffffffffffffffffffff841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b50600091825260096020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600881528383209183525290812055565b600a546000906133f190600190613c3c565b6000838152600b6020526040812054600a805493945090928490811061341957613419613dad565b9060005260206000200154905080600a838154811061343a5761343a613dad565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061347257613472613d7e565b6001900381819060005260206000200160009055905550505050565b600061349983611362565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b8280546134eb90613c7f565b90600052602060002090601f01602090048101928261350d5760008555613553565b82601f1061352657805160ff1916838001178555613553565b82800160010185558215613553579182015b82811115613553578251825591602001919060010190613538565b5061355f929150613563565b5090565b5b8082111561355f5760008155600101613564565b600067ffffffffffffffff83111561359257613592613ddc565b6135c360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613bc1565b90508281528383830111156135d757600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461361257600080fd5b919050565b805161ffff8116811461361257600080fd5b60006020828403121561363b57600080fd5b613644826135ee565b9392505050565b6000806040838503121561365e57600080fd5b613667836135ee565b9150613675602084016135ee565b90509250929050565b60008060006060848603121561369357600080fd5b61369c846135ee565b92506136aa602085016135ee565b9150604084013590509250925092565b600080600080608085870312156136d057600080fd5b6136d9856135ee565b93506136e7602086016135ee565b925060408501359150606085013567ffffffffffffffff81111561370a57600080fd5b8501601f8101871361371b57600080fd5b61372a87823560208401613578565b91505092959194509250565b6000806040838503121561374957600080fd5b613752836135ee565b9150602083013561376281613e0b565b809150509250929050565b6000806040838503121561378057600080fd5b613789836135ee565b946020939093013593505050565b600080600080608085870312156137ad57600080fd5b845167ffffffffffffffff808211156137c557600080fd5b818701915087601f8301126137d957600080fd5b81516020828211156137ed576137ed613ddc565b8160051b92506137fe818401613bc1565b8281528181019085830185870184018d101561381957600080fd5b600096505b848710156138435761382f81613617565b83526001969096019591830191830161381e565b5098506138539050898201613617565b96505050505061386560408601613617565b6060959095015193969295505050565b60006020828403121561388757600080fd5b815161364481613e0b565b6000602082840312156138a457600080fd5b813561364481613e19565b6000602082840312156138c157600080fd5b815161364481613e19565b6000602082840312156138de57600080fd5b813567ffffffffffffffff8111156138f557600080fd5b8201601f8101841361390657600080fd5b61200284823560208401613578565b60006020828403121561392757600080fd5b5035919050565b60006020828403121561394057600080fd5b5051919050565b6000806040838503121561395a57600080fd5b82359150613675602084016135ee565b60008151808452613982816020860160208601613c53565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081516139c6818560208601613c53565b9290920192915050565b600083516139e2818460208801613c53565b8351908301906139f6818360208801613c53565b7f2f000000000000000000000000000000000000000000000000000000000000009101908152600101949350505050565b600080845481600182811c915080831680613a4357607f831692505b6020808410821415613a7c577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015613a905760018114613abf57613aec565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613aec565b60008b81526020902060005b86811015613ae45781548b820152908501908301613acb565b505084890196505b505050505050613afc81856139b4565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152613b44608083018461396a565b9695505050505050565b6080808252855190820181905260009060209060a0840190828901845b82811015613b8b57815161ffff1684529284019290840190600101613b6b565b50505061ffff968716918401919091529390941660408201526060015292915050565b602081526000613644602083018461396a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c0857613c08613ddc565b604052919050565b60008219821115613c2357613c23613d20565b500190565b600082613c3757613c37613d4f565b500490565b600082821015613c4e57613c4e613d20565b500390565b60005b83811015613c6e578181015183820152602001613c56565b83811115611b0d5750506000910152565b600181811c90821680613c9357607f821691505b60208210811415613ccd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d0557613d05613d20565b5060010190565b600082613d1b57613d1b613d4f565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8015158114611e9757600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611e9757600080fdfea2646970667358221220db0d16cc55a06d37306a8c1b3722e04a4d7a49eeb5385238234adb318c90e81864736f6c63430008060033
Deployed Bytecode Sourcemap
53585:6600:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43754:224;;;;;;:::i;:::-;;:::i;:::-;;;10500:14:1;;10493:22;10475:41;;10463:2;10448:18;43754:224:0;;;;;;;;29804:100;;;:::i;:::-;;;;;;;:::i;31542:221::-;;;;;;:::i;:::-;;:::i;:::-;;;8557:42:1;8545:55;;;8527:74;;8515:2;8500:18;31542:221:0;8482:125:1;31102:374:0;;;;;;:::i;:::-;;:::i;:::-;;44394:113;44482:10;:17;44394:113;;;22171:25:1;;;22159:2;22144:18;44394:113:0;22126:76:1;32485:374:0;;;;;;:::i;:::-;;:::i;44062:256::-;;;;;;:::i;:::-;;:::i;52958:190::-;;;;;;:::i;:::-;;:::i;41113:100::-;;;;;;:::i;:::-;;:::i;32930:185::-;;;;;;:::i;:::-;;:::i;59094:292::-;;;;;;:::i;:::-;;:::i;54712:121::-;;;;;;:::i;:::-;;:::i;44584:233::-;;;;;;:::i;:::-;;:::i;52880:70::-;;;:::i;50885:86::-;50956:7;;;;50885:86;;55520:514;;;;;;:::i;:::-;;:::i;29507:230::-;;;;;;:::i;:::-;;:::i;55023:489::-;;;;;;:::i;:::-;;:::i;29186:208::-;;;;;;:::i;:::-;;:::i;54274:430::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;60029:153::-;;;;;;:::i;:::-;;:::i;41337:94::-;;;;;;:::i;:::-;;:::i;29973:104::-;;;:::i;41221:108::-;;;;;;:::i;:::-;;:::i;31835:295::-;;;;;;:::i;:::-;;:::i;30696:113::-;;;;;;:::i;:::-;30784:17;;30760:4;30784:17;;;:8;:17;;;;;;;;;30696:113;53999:107;;;;;;:::i;:::-;;:::i;33239:363::-;;;;;;:::i;:::-;;:::i;52639:159::-;;;;;;:::i;:::-;;:::i;52806:66::-;;;:::i;54164:102::-;54246:12;;54164:102;;54841:120;;;;;;:::i;:::-;54908:7;54935:18;;;:9;:18;;;;;;;;;54841:120;32201:164;;;;;;:::i;:::-;32322:25;;;;32298:4;32322:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32201:164;41439:125;;;;;;:::i;:::-;;:::i;30535:87::-;30608:6;;;;30535:87;;43754:224;43856:4;43880:50;;;43895:35;43880:50;;:90;;;43934:36;43958:11;43934:23;:36::i;:::-;43873:97;43754:224;-1:-1:-1;;43754:224:0:o;29804:100::-;29858:13;29891:5;29884:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29804:100;:::o;31542:221::-;31618:7;35201:16;;;:7;:16;;;;;;:30;:16;31638:73;;;;;;;17780:2:1;31638:73:0;;;17762:21:1;17819:2;17799:18;;;17792:30;17858:34;17838:18;;;17831:62;17929:14;17909:18;;;17902:42;17961:19;;31638:73:0;;;;;;;;;-1:-1:-1;31731:24:0;;;;:15;:24;;;;;;;;;31542:221::o;31102:374::-;31183:13;31199:23;31214:7;31199:14;:23::i;:::-;31183:39;;31247:5;31241:11;;:2;:11;;;;31233:57;;;;;;;18603:2:1;31233:57:0;;;18585:21:1;18642:2;18622:18;;;18615:30;18681:34;18661:18;;;18654:62;18752:3;18732:18;;;18725:31;18773:19;;31233:57:0;18575:223:1;31233:57:0;23846:10;31311:21;;;;;:62;;-1:-1:-1;31336:37:0;31353:5;23846:10;32201:164;:::i;31336:37::-;31303:131;;;;;;;15822:2:1;31303:131:0;;;15804:21:1;15861:2;15841:18;;;15834:30;15900:34;15880:18;;;15873:62;15971:26;15951:18;;;15944:54;16015:19;;31303:131:0;15794:246:1;31303:131:0;31447:21;31456:2;31460:7;31447:8;:21::i;:::-;31172:304;31102:374;;:::o;32485:::-;32619:24;32635:7;32619:15;:24::i;:::-;32715:41;23846:10;32734:12;32748:7;32715:18;:41::i;:::-;32707:103;;;;;;;19005:2:1;32707:103:0;;;18987:21:1;19044:2;19024:18;;;19017:30;19083:34;19063:18;;;19056:62;19154:19;19134:18;;;19127:47;19191:19;;32707:103:0;18977:239:1;32707:103:0;32823:28;32833:4;32839:2;32843:7;32823:9;:28::i;44062:256::-;44159:7;44195:23;44212:5;44195:16;:23::i;:::-;44187:5;:31;44179:87;;;;;;;12015:2:1;44179:87:0;;;11997:21:1;12054:2;12034:18;;;12027:30;12093:34;12073:18;;;12066:62;12164:13;12144:18;;;12137:41;12195:19;;44179:87:0;11987:233:1;44179:87:0;-1:-1:-1;44284:19:0;;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;44062:256::o;52958:190::-;28572:6;;;;28558:10;:20;28550:50;;;;;;;15476:2:1;28550:50:0;;;15458:21:1;15515:2;15495:18;;;15488:30;15554:19;15534:18;;;15527:47;15591:18;;28550:50:0;15448:167:1;28550:50:0;53037:21:::1;53061:8;:6;:8::i;:::-;53037:32;;53114:10;53126:7;53097:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53080:7;:60;;;;;;;;;;;;:::i;41113:100::-:0;28678:10;28669:20;;;;:8;:20;;;;;;;;28661:51;;;;;;;16658:2:1;28661:51:0;;;16640:21:1;16697:2;16677:18;;;16670:30;16736:20;16716:18;;;16709:48;16774:18;;28661:51:0;16630:168:1;28661:51:0;41187:18:::1;41193:2;41197:7;41187:5;:18::i;:::-;41113:100:::0;;:::o;32930:185::-;33068:39;33085:4;33091:2;33095:7;33068:39;;;;;;;;;;;;:16;:39::i;59094:292::-;4459:1;5055:7;;:19;;5047:63;;;;;;;21450:2:1;5047:63:0;;;21432:21:1;21489:2;21469:18;;;21462:30;21528:33;21508:18;;;21501:61;21579:18;;5047:63:0;21422:181:1;5047:63:0;4459:1;5188:7;:18;59234:41:::1;23846:10:::0;59253:12:::1;23766:98:::0;59234:41:::1;59226:102;;;::::0;::::1;::::0;;21810:2:1;59226:102:0::1;::::0;::::1;21792:21:1::0;21849:2;21829:18;;;21822:30;21888:34;21868:18;;;21861:62;21959:18;21939;;;21932:46;21995:19;;59226:102:0::1;21782:238:1::0;59226:102:0::1;59339:14;59345:7;59339:5;:14::i;:::-;59364:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;4415:1:0;5367:7;:22;-1:-1:-1;59094:292:0:o;54712:121::-;54785:4;35201:16;;;:7;:16;;;;;;:30;:16;:30;;54809:16;35112:127;44584:233;44659:7;44695:30;44482:10;:17;;44394:113;44695:30;44687:5;:38;44679:95;;;;;;;19780:2:1;44679:95:0;;;19762:21:1;19819:2;19799:18;;;19792:30;19858:34;19838:18;;;19831:62;19929:14;19909:18;;;19902:42;19961:19;;44679:95:0;19752:234:1;44679:95:0;44792:10;44803:5;44792:17;;;;;;;;:::i;:::-;;;;;;;;;44785:24;;44584:233;;;:::o;52880:70::-;28572:6;;;;28558:10;:20;28550:50;;;;;;;15476:2:1;28550:50:0;;;15458:21:1;15515:2;15495:18;;;15488:30;15554:19;15534:18;;;15527:47;15591:18;;28550:50:0;15448:167:1;28550:50:0;52932:10:::1;:8;:10::i;:::-;52880:70::o:0;55520:514::-;35177:4;35201:16;;;:7;:16;;;;;;:30;:16;55582:73;;;;;;;14718:2:1;55582:73:0;;;14700:21:1;14757:2;14737:18;;;14730:30;14796:34;14776:18;;;14769:62;14867:14;14847:18;;;14840:42;14899:19;;55582:73:0;14690:234:1;55582:73:0;55666:15;55684:18;;;:9;:18;;;;;;;;23846:10;55774:23;;;:50;;-1:-1:-1;30608:6:0;;55801:23;30608:6;23846:10;55801:23;55774:50;55766:108;;;;;;;17005:2:1;55766:108:0;;;16987:21:1;17044:2;17024:18;;;17017:30;17083:34;17063:18;;;17056:62;17154:15;17134:18;;;17127:43;17187:19;;55766:108:0;16977:235:1;55766:108:0;55893:62;55916:16;55924:7;55916;:16::i;:::-;55934:7;55943;55893:62;;;;;;;;;;;;:22;:62::i;:::-;55885:103;;;;;;;19423:2:1;55885:103:0;;;19405:21:1;19462:2;19442:18;;;19435:30;19501;19481:18;;;19474:58;19549:18;;55885:103:0;19395:178:1;55885:103:0;-1:-1:-1;56008:18:0;;;;:9;:18;;;;;56001:25;;;;;;55520:514::o;29507:230::-;29579:7;29615:16;;;:7;:16;;;;;;;;29646:19;29642:65;;-1:-1:-1;;29689:6:0;;;;;29507:230;-1:-1:-1;29507:230:0:o;55023:489::-;4459:1;5055:7;;:19;;5047:63;;;;;;;21450:2:1;5047:63:0;;;21432:21:1;21489:2;21469:18;;;21462:30;21528:33;21508:18;;;21501:61;21579:18;;5047:63:0;21422:181:1;5047:63:0;4459:1;5188:7;:18;55150:1:::1;55120:18:::0;;;:9:::1;:18;::::0;;;;;:32:::1;:18;:32:::0;55112:74:::1;;;::::0;::::1;::::0;;10953:2:1;55112:74:0::1;::::0;::::1;10935:21:1::0;10992:2;10972:18;;;10965:30;11031:31;11011:18;;;11004:59;11080:18;;55112:74:0::1;10925:179:1::0;55112:74:0::1;55260:41;23846:10:::0;55279:12:::1;55293:7;55260:18;:41::i;:::-;55252:103;;;::::0;::::1;::::0;;19005:2:1;55252:103:0::1;::::0;::::1;18987:21:1::0;19044:2;19024:18;;;19017:30;19083:34;19063:18;;;19056:62;19154:19;19134:18;;;19127:47;19191:19;;55252:103:0::1;18977:239:1::0;55252:103:0::1;55368:18;::::0;;;:9:::1;:18;::::0;;;;:27;;;::::1;;::::0;::::1;;::::0;;55414:59:::1;55435:16;55368:18:::0;55435:7:::1;:16::i;:::-;55453:6;55461:7;55414:59;;;;;;;;;;;::::0;:20:::1;:59::i;:::-;55406:98;;;::::0;::::1;::::0;;11660:2:1;55406:98:0::1;::::0;::::1;11642:21:1::0;11699:2;11679:18;;;11672:30;11738:28;11718:18;;;11711:56;11784:18;;55406:98:0::1;11632:176:1::0;55406:98:0::1;-1:-1:-1::0;;4415:1:0;5367:7;:22;55023:489::o;29186:208::-;29258:7;29286:19;;;29278:74;;;;;;;16247:2:1;29278:74:0;;;16229:21:1;16286:2;16266:18;;;16259:30;16325:34;16305:18;;;16298:62;16396:12;16376:18;;;16369:40;16426:19;;29278:74:0;16219:232:1;29278:74:0;-1:-1:-1;29370:16:0;;;;;;:9;:16;;;;;;;29186:208::o;54274:430::-;54548:10;;54391:24;;54430:15;;;;;;54548:24;:10;:24;54544:153;;54659:10;;54642:43;;;;;;;;22171:25:1;;;54659:10:0;;;;;54642:34;;22144:18:1;;54642:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54589:96;;-1:-1:-1;54589:96:0;;-1:-1:-1;54589:96:0;-1:-1:-1;54589:96:0;-1:-1:-1;54544:153:0;54274:430;;;;;:::o;60029:153::-;28572:6;;;;28558:10;:20;28550:50;;;;;;;15476:2:1;28550:50:0;;;15458:21:1;15515:2;15495:18;;;15488:30;15554:19;15534:18;;;15527:47;15591:18;;28550:50:0;15448:167:1;28550:50:0;60108:6:::1;60101:23;;;60125:7;30608:6:::0;;;;;30535:87;60125:7:::1;60134:39;::::0;;;;60167:4:::1;60134:39;::::0;::::1;8527:74:1::0;60134:24:0::1;::::0;::::1;::::0;::::1;::::0;8500:18:1;;60134:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60101:73;::::0;;::::1;::::0;;;;;;9332:42:1;9320:55;;;60101:73:0::1;::::0;::::1;9302:74:1::0;9392:18;;;9385:34;9275:18;;60101:73:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;41337:94::-:0;28572:6;;;;28558:10;:20;28550:50;;;;;;;15476:2:1;28550:50:0;;;15458:21:1;15515:2;15495:18;;;15488:30;15554:19;15534:18;;;15527:47;15591:18;;28550:50:0;15448:167:1;28550:50:0;41406:6:::1;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;41337:94::o;29973:104::-;30029:13;30062:7;30055:14;;;;;:::i;41221:108::-;28678:10;28669:20;;;;:8;:20;;;;;;;;28661:51;;;;;;;16658:2:1;28661:51:0;;;16640:21:1;16697:2;16677:18;;;16670:30;16736:20;16716:18;;;16709:48;16774:18;;28661:51:0;16630:168:1;28661:51:0;41299:22:::1;41309:2;41313:7;41299:9;:22::i;31835:295::-:0;31938:24;;;23846:10;31938:24;;31930:62;;;;;;;14364:2:1;31930:62:0;;;14346:21:1;14403:2;14383:18;;;14376:30;14442:27;14422:18;;;14415:55;14487:18;;31930:62:0;14336:175:1;31930:62:0;23846:10;32005:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;32074:48;;10475:41:1;;;32005:42:0;;23846:10;32074:48;;10448:18:1;32074:48:0;;;;;;;31835:295;;:::o;53999:107::-;28572:6;;;;28558:10;:20;28550:50;;;;;;;15476:2:1;28550:50:0;;;15458:21:1;15515:2;15495:18;;;15488:30;15554:19;15534:18;;;15527:47;15591:18;;28550:50:0;15448:167:1;28550:50:0;54073:10:::1;:25:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;53999:107::o;33239:363::-;33406:24;33422:7;33406:15;:24::i;:::-;33449:41;23846:10;33468:12;23766:98;33449:41;33441:103;;;;;;;19005:2:1;33441:103:0;;;18987:21:1;19044:2;19024:18;;;19017:30;19083:34;19063:18;;;19056:62;19154:19;19134:18;;;19127:47;19191:19;;33441:103:0;18977:239:1;33441:103:0;33555:39;33569:4;33575:2;33579:7;33588:5;33555:13;:39::i;:::-;33239:363;;;;:::o;52639:159::-;52704:13;52761:7;52770:18;:7;:16;:18::i;:::-;52744:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52730:60;;52639:159;;;:::o;52806:66::-;28572:6;;;;28558:10;:20;28550:50;;;;;;;15476:2:1;28550:50:0;;;15458:21:1;15515:2;15495:18;;;15488:30;15554:19;15534:18;;;15527:47;15591:18;;28550:50:0;15448:167:1;28550:50:0;52856:8:::1;:6;:8::i;41439:125::-:0;28572:6;;;;28558:10;:20;28550:50;;;;;;;15476:2:1;28550:50:0;;;15458:21:1;15515:2;15495:18;;;15488:30;15554:19;15534:18;;;15527:47;15591:18;;28550:50:0;15448:167:1;28550:50:0;41527:17:::1;::::0;;;::::1;;::::0;;;:8:::1;:17;::::0;;;;:29;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;41439:125::o;28804:266::-;28906:4;28930:40;;;28945:25;28930:40;;:92;;-1:-1:-1;28974:48:0;;;28989:33;28974:48;28930:92;:132;;;-1:-1:-1;26787:25:0;26772:40;;;;29026:36;26663:157;39184:174;39259:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;39313:23;39259:24;39313:14;:23::i;:::-;39304:46;;;;;;;;;;;;39184:174;;:::o;40877:228::-;40951:10;40942:20;;;;:8;:20;;;;;;;;;:44;;-1:-1:-1;40980:6:0;;;;40966:10;:20;40942:44;40938:160;;;35177:4;35201:16;;;:7;:16;;;;;;:30;:16;41003:84;;41045:26;41051:10;41063:7;41045:5;:26::i;:::-;40877:228;:::o;35406:348::-;35499:4;35201:16;;;:7;:16;;;;;;:30;:16;35516:73;;;;;;;14718:2:1;35516:73:0;;;14700:21:1;14757:2;14737:18;;;14730:30;14796:34;14776:18;;;14769:62;14867:14;14847:18;;;14840:42;14899:19;;35516:73:0;14690:234:1;35516:73:0;35600:13;35616:23;35631:7;35616:14;:23::i;:::-;35600:39;;35669:5;35658:16;;:7;:16;;;:51;;;;35702:7;35678:31;;:20;35690:7;35678:11;:20::i;:::-;:31;;;35658:51;:87;;;-1:-1:-1;32322:25:0;;;;32298:4;32322:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;35713:32;35650:96;35406:348;-1:-1:-1;;;;35406:348:0:o;38488:578::-;38647:4;38620:31;;:23;38635:7;38620:14;:23::i;:::-;:31;;;38612:85;;;;;;;18193:2:1;38612:85:0;;;18175:21:1;18232:2;18212:18;;;18205:30;18271:34;18251:18;;;18244:62;18342:11;18322:18;;;18315:39;18371:19;;38612:85:0;18165:231:1;38612:85:0;38716:16;;;38708:65;;;;;;;13959:2:1;38708:65:0;;;13941:21:1;13998:2;13978:18;;;13971:30;14037:34;14017:18;;;14010:62;14108:6;14088:18;;;14081:34;14132:19;;38708:65:0;13931:226:1;38708:65:0;38786:39;38807:4;38813:2;38817:7;38786:20;:39::i;:::-;38890:29;38907:1;38911:7;38890:8;:29::i;:::-;38932:15;;;;;;;:9;:15;;;;;:20;;38951:1;;38932:15;:20;;38951:1;;38932:20;:::i;:::-;;;;-1:-1:-1;;38963:13:0;;;;;;;:9;:13;;;;;:18;;38980:1;;38963:13;:18;;38980:1;;38963:18;:::i;:::-;;;;-1:-1:-1;;38992:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;39031:27;;38992:16;;39031:27;;;;;;;38488:578;;;:::o;37053:432::-;37133:16;;;37125:61;;;;;;;17419:2:1;37125:61:0;;;17401:21:1;;;17438:18;;;17431:30;17497:34;17477:18;;;17470:62;17549:18;;37125:61:0;17391:182:1;37125:61:0;35177:4;35201:16;;;:7;:16;;;;;;:30;:16;:30;37197:58;;;;;;;12846:2:1;37197:58:0;;;12828:21:1;12885:2;12865:18;;;12858:30;12924;12904:18;;;12897:58;12972:18;;37197:58:0;12818:178:1;37197:58:0;37284:1;37274:7;:11;37266:39;;;;;;;13615:2:1;37266:39:0;;;13597:21:1;13654:2;13634:18;;;13627:30;13693:17;13673:18;;;13666:45;13728:18;;37266:39:0;13587:165:1;37266:39:0;37318:45;37347:1;37351:2;37355:7;37318:20;:45::i;:::-;37376:13;;;;;;;:9;:13;;;;;:18;;37393:1;;37376:13;:18;;37393:1;;37376:18;:::i;:::-;;;;-1:-1:-1;;37405:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;37444:33;;37405:16;;;37444:33;;37405:16;;37444:33;37053:432;;:::o;37714:437::-;35177:4;35201:16;;;:7;:16;;;;;;:30;:16;37774:73;;;;;;;14718:2:1;37774:73:0;;;14700:21:1;14757:2;14737:18;;;14730:30;14796:34;14776:18;;;14769:62;14867:14;14847:18;;;14840:42;14899:19;;37774:73:0;14690:234:1;37774:73:0;37858:13;37874:16;;;:7;:16;;;;;;;;;37903:48;;37874:16;;37882:7;37903:20;:48::i;:::-;37992:29;38009:1;38013:7;37992:8;:29::i;:::-;38034:16;;;;;;;:9;:16;;;;;:21;;38054:1;;38034:16;:21;;38054:1;;38034:21;:::i;:::-;;;;-1:-1:-1;;38073:16:0;;;;:7;:16;;;;;;38066:23;;;;;;38107:36;38081:7;;38073:16;38066:23;38107:36;;;;;38073:16;;38107:36;37763:388;37714:437;:::o;51944:120::-;50956:7;;;;51480:41;;;;;;;11311:2:1;51480:41:0;;;11293:21:1;11350:2;11330:18;;;11323:30;11389:22;11369:18;;;11362:50;11429:18;;51480:41:0;11283:170:1;51480:41:0;52003:7:::1;:15:::0;;;::::1;::::0;;52034:22:::1;23846:10:::0;52043:12:::1;52034:22;::::0;8557:42:1;8545:55;;;8527:74;;8515:2;8500:18;52034:22:0::1;;;;;;;51944:120::o:0;58021:891::-;58180:4;58201:17;;;16436:20;16484:8;58197:708;;58241:74;;;;;:38;;;;;;:74;;23846:10;;58294:4;;58300:7;;58309:5;;58241:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58241:74:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58237:613;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58491:13:0;;58487:348;;58534:67;;;;;20604:2:1;58534:67:0;;;20586:21:1;20643:2;20623:18;;;20616:30;20682:34;20662:18;;;20655:62;20753:27;20733:18;;;20726:55;20798:19;;58534:67:0;20576:247:1;58487:348:0;58785:6;58779:13;58770:6;58766:2;58762:15;58755:38;58237:613;58366:57;;58376:47;58366:57;;-1:-1:-1;58359:64:0;;58197:708;-1:-1:-1;58889:4:0;58021:891;;;;;;:::o;56587:879::-;56744:4;56765:17;;;16436:20;16484:8;56761:698;;56805:72;;;;;:36;;;;;;:72;;23846:10;;56856:4;;56862:7;;56871:5;;56805:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56805:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56801:603;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57051:13:0;;57047:342;;57094:61;;;;;21030:2:1;57094:61:0;;;21012:21:1;21069:2;21049:18;;;21042:30;21108:34;21088:18;;;21081:62;21179:21;21159:18;;;21152:49;21218:19;;57094:61:0;21002:241:1;56801:603:0;56928:55;;56938:45;56928:55;;-1:-1:-1;56921:62:0;;36096:110;36172:26;36182:2;36186:7;36172:26;;;;;;;;;;;;:9;:26::i;34484:315::-;34641:28;34651:4;34657:2;34661:7;34641:9;:28::i;:::-;34688:48;34711:4;34717:2;34721:7;34730:5;34688:22;:48::i;:::-;34680:111;;;;;;;12427:2:1;34680:111:0;;;12409:21:1;12466:2;12446:18;;;12439:30;12505:34;12485:18;;;12478:62;12576:20;12556:18;;;12549:48;12614:19;;34680:111:0;12399:240:1;24206:723:0;24262:13;24483:10;24479:53;;-1:-1:-1;;24510:10:0;;;;;;;;;;;;;;;;;;24206:723::o;24479:53::-;24557:5;24542:12;24598:78;24605:9;;24598:78;;24631:8;;;;:::i;:::-;;-1:-1:-1;24654:10:0;;-1:-1:-1;24662:2:0;24654:10;;:::i;:::-;;;24598:78;;;24686:19;24718:6;24708:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24708:17:0;;24686:39;;24736:154;24743:10;;24736:154;;24770:11;24780:1;24770:11;;:::i;:::-;;-1:-1:-1;24839:10:0;24847:2;24839:5;:10;:::i;:::-;24826:24;;:2;:24;:::i;:::-;24813:39;;24796:6;24803;24796:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;24867:11:0;24876:2;24867:11;;:::i;:::-;;;24736:154;;51685:118;50956:7;;;;51210:9;51202:38;;;;;;;15131:2:1;51202:38:0;;;15113:21:1;15170:2;15150:18;;;15143:30;15209:18;15189;;;15182:46;15245:18;;51202:38:0;15103:166:1;51202:38:0;51745:7:::1;:14:::0;;;::::1;51755:4;51745:14;::::0;;51775:20:::1;51782:12;23846:10:::0;;23766:98;59565:411;59709:45;59736:4;59742:2;59746:7;59709:26;:45::i;:::-;59771:18;;;;:9;:18;;;;;;:24;;;;:18;;:24;59767:202;;59850:1;59820:18;;;:9;:18;;;;;;:32;:18;:32;59812:87;;;;;;;20193:2:1;59812:87:0;;;20175:21:1;20232:2;20212:18;;;20205:30;20271:34;20251:18;;;20244:62;20342:12;20322:18;;;20315:40;20372:19;;59812:87:0;20165:232:1;59767:202:0;59939:18;;;;:9;:18;;;;;59932:25;;;;;;-1:-1:-1;;59565:411:0:o;36433:284::-;36563:18;36569:2;36573:7;36563:5;:18::i;:::-;36600:54;36631:1;36635:2;36639:7;36648:5;36600:22;:54::i;:::-;36592:117;;;;;;;12427:2:1;36592:117:0;;;12409:21:1;12466:2;12446:18;;;12439:30;12505:34;12485:18;;;12478:62;12576:20;12556:18;;;12549:48;12614:19;;36592:117:0;12399:240:1;39923:872:0;40078:4;40099:13;;;16436:20;16484:8;40095:693;;40135:72;;;;;:36;;;;;;:72;;23846:10;;40186:4;;40192:7;;40201:5;;40135:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40135:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40131:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40381:13:0;;40377:341;;40424:60;;;;;12427:2:1;40424:60:0;;;12409:21:1;12466:2;12446:18;;;12439:30;12505:34;12485:18;;;12478:62;12576:20;12556:18;;;12549:48;12614:19;;40424:60:0;12399:240:1;40131:602:0;40258:55;;40268:45;40258:55;;-1:-1:-1;40251:62:0;;53303:275;53447:45;53474:4;53480:2;53484:7;53447:26;:45::i;:::-;50956:7;;;;53513:9;53505:65;;;;;;;13203:2:1;53505:65:0;;;13185:21:1;13242:2;13222:18;;;13215:30;13281:34;13261:18;;;13254:62;13352:13;13332:18;;;13325:41;13383:19;;53505:65:0;13175:233:1;45430:589:0;45636:18;;;45632:187;;45671:40;45703:7;46846:10;:17;;46819:24;;;;:15;:24;;;;;:44;;;46874:24;;;;;;;;;;;;46742:164;45671:40;45632:187;;;45741:2;45733:10;;:4;:10;;;45729:90;;45760:47;45793:4;45799:7;45760:32;:47::i;:::-;45833:16;;;45829:183;;45866:45;45903:7;45866:36;:45::i;45829:183::-;45939:4;45933:10;;:2;:10;;;45929:83;;45960:40;45988:2;45992:7;45960:27;:40::i;47533:988::-;47799:22;47849:1;47824:22;47841:4;47824:16;:22::i;:::-;:26;;;;:::i;:::-;47861:18;47882:26;;;:17;:26;;;;;;47799:51;;-1:-1:-1;48015:28:0;;;48011:328;;48082:18;;;48060:19;48082:18;;;:12;:18;;;;;;;;:34;;;;;;;;;48133:30;;;;;;:44;;;48250:30;;:17;:30;;;;;:43;;;48011:328;-1:-1:-1;48435:26:0;;;;:17;:26;;;;;;;;48428:33;;;48479:18;;;;;;:12;:18;;;;;:34;;;;;;;48472:41;47533:988::o;48816:1079::-;49094:10;:17;49069:22;;49094:21;;49114:1;;49094:21;:::i;:::-;49126:18;49147:24;;;:15;:24;;;;;;49520:10;:26;;49069:46;;-1:-1:-1;49147:24:0;;49069:46;;49520:26;;;;;;:::i;:::-;;;;;;;;;49498:48;;49584:11;49559:10;49570;49559:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;49664:28;;;:15;:28;;;;;;;:41;;;49836:24;;;;;49829:31;49871:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;48887:1008;;;48816:1079;:::o;46320:221::-;46405:14;46422:20;46439:2;46422:16;:20::i;:::-;46453:16;;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;46498:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;46320:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:465:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:116;282:4;213:66;208:2;200:6;196:15;192:88;188:99;172:116;:::i;:::-;163:125;;311:6;304:5;297:21;351:3;342:6;337:3;333:16;330:25;327:2;;;368:1;365;358:12;327:2;417:6;412:3;405:4;398:5;394:16;381:43;471:1;464:4;455:6;448:5;444:18;440:29;433:40;88:391;;;;;:::o;484:196::-;552:20;;612:42;601:54;;591:65;;581:2;;670:1;667;660:12;581:2;533:147;;;:::o;685:163::-;763:13;;816:6;805:18;;795:29;;785:2;;838:1;835;828:12;853:186;912:6;965:2;953:9;944:7;940:23;936:32;933:2;;;981:1;978;971:12;933:2;1004:29;1023:9;1004:29;:::i;:::-;994:39;923:116;-1:-1:-1;;;923:116:1:o;1044:260::-;1112:6;1120;1173:2;1161:9;1152:7;1148:23;1144:32;1141:2;;;1189:1;1186;1179:12;1141:2;1212:29;1231:9;1212:29;:::i;:::-;1202:39;;1260:38;1294:2;1283:9;1279:18;1260:38;:::i;:::-;1250:48;;1131:173;;;;;:::o;1309:328::-;1386:6;1394;1402;1455:2;1443:9;1434:7;1430:23;1426:32;1423:2;;;1471:1;1468;1461:12;1423:2;1494:29;1513:9;1494:29;:::i;:::-;1484:39;;1542:38;1576:2;1565:9;1561:18;1542:38;:::i;:::-;1532:48;;1627:2;1616:9;1612:18;1599:32;1589:42;;1413:224;;;;;:::o;1642:666::-;1737:6;1745;1753;1761;1814:3;1802:9;1793:7;1789:23;1785:33;1782:2;;;1831:1;1828;1821:12;1782:2;1854:29;1873:9;1854:29;:::i;:::-;1844:39;;1902:38;1936:2;1925:9;1921:18;1902:38;:::i;:::-;1892:48;;1987:2;1976:9;1972:18;1959:32;1949:42;;2042:2;2031:9;2027:18;2014:32;2069:18;2061:6;2058:30;2055:2;;;2101:1;2098;2091:12;2055:2;2124:22;;2177:4;2169:13;;2165:27;-1:-1:-1;2155:2:1;;2206:1;2203;2196:12;2155:2;2229:73;2294:7;2289:2;2276:16;2271:2;2267;2263:11;2229:73;:::i;:::-;2219:83;;;1772:536;;;;;;;:::o;2313:315::-;2378:6;2386;2439:2;2427:9;2418:7;2414:23;2410:32;2407:2;;;2455:1;2452;2445:12;2407:2;2478:29;2497:9;2478:29;:::i;:::-;2468:39;;2557:2;2546:9;2542:18;2529:32;2570:28;2592:5;2570:28;:::i;:::-;2617:5;2607:15;;;2397:231;;;;;:::o;2633:254::-;2701:6;2709;2762:2;2750:9;2741:7;2737:23;2733:32;2730:2;;;2778:1;2775;2768:12;2730:2;2801:29;2820:9;2801:29;:::i;:::-;2791:39;2877:2;2862:18;;;;2849:32;;-1:-1:-1;;;2720:167:1:o;2892:1199::-;3011:6;3019;3027;3035;3088:3;3076:9;3067:7;3063:23;3059:33;3056:2;;;3105:1;3102;3095:12;3056:2;3138:9;3132:16;3167:18;3208:2;3200:6;3197:14;3194:2;;;3224:1;3221;3214:12;3194:2;3262:6;3251:9;3247:22;3237:32;;3307:7;3300:4;3296:2;3292:13;3288:27;3278:2;;3329:1;3326;3319:12;3278:2;3358;3352:9;3380:4;3403:2;3399;3396:10;3393:2;;;3409:18;;:::i;:::-;3455:2;3452:1;3448:10;3438:20;;3478:28;3502:2;3498;3494:11;3478:28;:::i;:::-;3540:15;;;3571:12;;;;3603:11;;;3633;;;3629:20;;3626:33;-1:-1:-1;3623:2:1;;;3672:1;3669;3662:12;3623:2;3694:1;3685:10;;3704:179;3718:2;3715:1;3712:9;3704:179;;;3775:33;3804:3;3775:33;:::i;:::-;3763:46;;3736:1;3729:9;;;;;3829:12;;;;3861;;3704:179;;;-1:-1:-1;3902:5:1;-1:-1:-1;3926:48:1;;-1:-1:-1;3955:18:1;;;3926:48;:::i;:::-;3916:58;;;;;;3993:48;4037:2;4026:9;4022:18;3993:48;:::i;:::-;4081:2;4066:18;;;;4060:25;3046:1045;;;;-1:-1:-1;;;3046:1045:1:o;4096:245::-;4163:6;4216:2;4204:9;4195:7;4191:23;4187:32;4184:2;;;4232:1;4229;4222:12;4184:2;4264:9;4258:16;4283:28;4305:5;4283:28;:::i;4346:245::-;4404:6;4457:2;4445:9;4436:7;4432:23;4428:32;4425:2;;;4473:1;4470;4463:12;4425:2;4512:9;4499:23;4531:30;4555:5;4531:30;:::i;4596:249::-;4665:6;4718:2;4706:9;4697:7;4693:23;4689:32;4686:2;;;4734:1;4731;4724:12;4686:2;4766:9;4760:16;4785:30;4809:5;4785:30;:::i;4850:450::-;4919:6;4972:2;4960:9;4951:7;4947:23;4943:32;4940:2;;;4988:1;4985;4978:12;4940:2;5028:9;5015:23;5061:18;5053:6;5050:30;5047:2;;;5093:1;5090;5083:12;5047:2;5116:22;;5169:4;5161:13;;5157:27;-1:-1:-1;5147:2:1;;5198:1;5195;5188:12;5147:2;5221:73;5286:7;5281:2;5268:16;5263:2;5259;5255:11;5221:73;:::i;5305:180::-;5364:6;5417:2;5405:9;5396:7;5392:23;5388:32;5385:2;;;5433:1;5430;5423:12;5385:2;-1:-1:-1;5456:23:1;;5375:110;-1:-1:-1;5375:110:1:o;5490:184::-;5560:6;5613:2;5601:9;5592:7;5588:23;5584:32;5581:2;;;5629:1;5626;5619:12;5581:2;-1:-1:-1;5652:16:1;;5571:103;-1:-1:-1;5571:103:1:o;5679:254::-;5747:6;5755;5808:2;5796:9;5787:7;5783:23;5779:32;5776:2;;;5824:1;5821;5814:12;5776:2;5860:9;5847:23;5837:33;;5889:38;5923:2;5912:9;5908:18;5889:38;:::i;5938:316::-;5979:3;6017:5;6011:12;6044:6;6039:3;6032:19;6060:63;6116:6;6109:4;6104:3;6100:14;6093:4;6086:5;6082:16;6060:63;:::i;:::-;6168:2;6156:15;6173:66;6152:88;6143:98;;;;6243:4;6139:109;;5987:267;-1:-1:-1;;5987:267:1:o;6259:185::-;6301:3;6339:5;6333:12;6354:52;6399:6;6394:3;6387:4;6380:5;6376:16;6354:52;:::i;:::-;6422:16;;;;;6309:135;-1:-1:-1;;6309:135:1:o;6449:633::-;6729:3;6767:6;6761:13;6783:53;6829:6;6824:3;6817:4;6809:6;6805:17;6783:53;:::i;:::-;6899:13;;6858:16;;;;6921:57;6899:13;6858:16;6955:4;6943:17;;6921:57;:::i;:::-;7043:3;7000:20;;7029:18;;;7074:1;7063:13;;6737:345;-1:-1:-1;;;;6737:345:1:o;7087:1289::-;7263:3;7292:1;7325:6;7319:13;7355:3;7377:1;7405:9;7401:2;7397:18;7387:28;;7465:2;7454:9;7450:18;7487;7477:2;;7531:4;7523:6;7519:17;7509:27;;7477:2;7557;7605;7597:6;7594:14;7574:18;7571:38;7568:2;;;7644:77;7639:3;7632:90;7745:4;7742:1;7735:15;7775:4;7770:3;7763:17;7568:2;7806:18;7833:162;;;;8009:1;8004:320;;;;7799:525;;7833:162;7881:66;7870:9;7866:82;7861:3;7854:95;7978:6;7973:3;7969:16;7962:23;;7833:162;;8004:320;22619:1;22612:14;;;22656:4;22643:18;;8099:1;8113:165;8127:6;8124:1;8121:13;8113:165;;;8205:14;;8192:11;;;8185:35;8248:16;;;;8142:10;;8113:165;;;8117:3;;8307:6;8302:3;8298:16;8291:23;;7799:525;;;;;;;8340:30;8366:3;8358:6;8340:30;:::i;:::-;8333:37;7271:1105;-1:-1:-1;;;;;7271:1105:1:o;8612:511::-;8806:4;8835:42;8916:2;8908:6;8904:15;8893:9;8886:34;8968:2;8960:6;8956:15;8951:2;8940:9;8936:18;8929:43;;9008:6;9003:2;8992:9;8988:18;8981:34;9051:3;9046:2;9035:9;9031:18;9024:31;9072:45;9112:3;9101:9;9097:19;9089:6;9072:45;:::i;:::-;9064:53;8815:308;-1:-1:-1;;;;;;8815:308:1:o;9430:900::-;9698:3;9711:22;;;9782:13;;9683:19;;;9804:22;;;9650:4;;9880;;9857:3;9842:19;;;9907:15;;;9650:4;9950:182;9964:6;9961:1;9958:13;9950:182;;;10029:13;;10044:6;10025:26;10013:39;;10072:12;;;;10107:15;;;;9986:1;9979:9;9950:182;;;-1:-1:-1;;;10171:6:1;10213:15;;;10193:18;;;10186:43;;;;10265:15;;;;10260:2;10245:18;;10238:43;10312:2;10297:18;10290:34;10149:3;9659:671;-1:-1:-1;;9659:671:1:o;10527:219::-;10676:2;10665:9;10658:21;10639:4;10696:44;10736:2;10725:9;10721:18;10713:6;10696:44;:::i;22207:334::-;22278:2;22272:9;22334:2;22324:13;;22339:66;22320:86;22308:99;;22437:18;22422:34;;22458:22;;;22419:62;22416:2;;;22484:18;;:::i;:::-;22520:2;22513:22;22252:289;;-1:-1:-1;22252:289:1:o;22672:128::-;22712:3;22743:1;22739:6;22736:1;22733:13;22730:2;;;22749:18;;:::i;:::-;-1:-1:-1;22785:9:1;;22720:80::o;22805:120::-;22845:1;22871;22861:2;;22876:18;;:::i;:::-;-1:-1:-1;22910:9:1;;22851:74::o;22930:125::-;22970:4;22998:1;22995;22992:8;22989:2;;;23003:18;;:::i;:::-;-1:-1:-1;23040:9:1;;22979:76::o;23060:258::-;23132:1;23142:113;23156:6;23153:1;23150:13;23142:113;;;23232:11;;;23226:18;23213:11;;;23206:39;23178:2;23171:10;23142:113;;;23273:6;23270:1;23267:13;23264:2;;;-1:-1:-1;;23308:1:1;23290:16;;23283:27;23113:205::o;23323:437::-;23402:1;23398:12;;;;23445;;;23466:2;;23520:4;23512:6;23508:17;23498:27;;23466:2;23573;23565:6;23562:14;23542:18;23539:38;23536:2;;;23610:77;23607:1;23600:88;23711:4;23708:1;23701:15;23739:4;23736:1;23729:15;23536:2;;23378:382;;;:::o;23765:195::-;23804:3;23835:66;23828:5;23825:77;23822:2;;;23905:18;;:::i;:::-;-1:-1:-1;23952:1:1;23941:13;;23812:148::o;23965:112::-;23997:1;24023;24013:2;;24028:18;;:::i;:::-;-1:-1:-1;24062:9:1;;24003:74::o;24082:184::-;24134:77;24131:1;24124:88;24231:4;24228:1;24221:15;24255:4;24252:1;24245:15;24271:184;24323:77;24320:1;24313:88;24420:4;24417:1;24410:15;24444:4;24441:1;24434:15;24460:184;24512:77;24509:1;24502:88;24609:4;24606:1;24599:15;24633:4;24630:1;24623:15;24649:184;24701:77;24698:1;24691:88;24798:4;24795:1;24788:15;24822:4;24819:1;24812:15;24838:184;24890:77;24887:1;24880:88;24987:4;24984:1;24977:15;25011:4;25008:1;25001:15;25027:118;25113:5;25106:13;25099:21;25092:5;25089:32;25079:2;;25135:1;25132;25125:12;25150:177;25235:66;25228:5;25224:78;25217:5;25214:89;25204:2;;25317:1;25314;25307:12
Swarm Source
ipfs://db0d16cc55a06d37306a8c1b3722e04a4d7a49eeb5385238234adb318c90e818
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.