Token ART

 

Overview ERC-721

Total Supply:
0 Artion

Holders:
251 addresses
Balance
0 Artion
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Artion

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

/**
 * @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;
}


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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


/**
 * @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}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // 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(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

    /**
     * @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())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    /**
     * @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}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        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 = ERC721.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");

        _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 {
        address owner = ERC721.ownerOf(tokenId);

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

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

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

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

    /**
     * @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(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // 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(ERC721.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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @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 {}
}


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

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

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

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


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

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


// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

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

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

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


interface IERC2981Royalties is IERC165 {
    /// ERC165 bytes to add to interface array - set in parent contract
    /// implementing this standard
    ///
    /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
    /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
    /// _registerInterface(_INTERFACE_ID_ERC2981);

    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _salePrice - the sale price of the NFT asset specified by _tokenId
    /// @return receiver - address of who should be sent the royalty payment
    /// @return royaltyAmount - the royalty payment amount for _salePrice
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


interface IERC2981RoyaltySetter is IERC165 {
    // bytes4(keccak256('setDefaultRoyalty(address,uint16)')) == 0x4331f639
    // bytes4(keccak256('setTokenRoyalty(uint256,address,uint16)')) == 0x78db6c53
    // => Interface ID = 0x4331f639 ^ 0x78db6c53 == 0x3bea9a6a

    // Set collection-wide default royalty.
    function setDefaultRoyalty(address _receiver, uint16 _royaltyPercent) external;

    // Set royalty for the given token.
    function setTokenRoyalty(uint256 _tokenId, address _receiver, uint16 _royaltyPercent) external;
}


/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981 is ERC165, IERC2981Royalties, IERC2981RoyaltySetter {
    struct RoyaltyInfo {
        address recipient;
        uint24 amount;
    }

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            interfaceId == type(IERC2981RoyaltySetter).interfaceId ||
            super.supportsInterface(interfaceId);
    }
}


/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981PerTokenRoyalties is ERC2981 {
    // map of known royalties; tokenID => RoyaltyInfo; #0 => collection-wide royalty
    mapping(uint256 => RoyaltyInfo) internal _royalties;

    /// @dev Sets token royalties
    /// @param _tokenId the token id for which we register the royalties
    /// @param _recipient recipient of the royalties
    /// @param _value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function _setTokenRoyalty(
        uint256 _tokenId,
        address _recipient,
        uint256 _value
    ) internal {
        require(_value <= 10000, "ERC2981PerTokenRoyalties: Royalty Too high");

        RoyaltyInfo memory royalty = _royalties[_tokenId];
        require(royalty.recipient == address(0), "ERC2981PerTokenRoyalties: Royalty already set");

        _royalties[_tokenId] = RoyaltyInfo(_recipient, uint24(_value));
    }

    /// @dev Sets a new royalty recipient for the given tokenID. Only existing recipient can make the change.
    function setTokenRoyaltyRecipient(uint256 _tokenId, address _recipient) external {
        // the royalty must be set and the caller must be the current recipient of the royalty
        RoyaltyInfo memory royalty = _royalties[_tokenId];
        require(royalty.recipient != address(0) && royalty.recipient == msg.sender, "ERC2981PerTokenRoyalties: Current recipient only");

        _royalties[_tokenId].recipient = _recipient;
    }

    /// @dev Sets collection-wide royalty
    /// @param _recipient recipient of the royalties
    /// @param _value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function _setDefaultRoyalty(address _recipient, uint256 _value) internal {
        require(_value <= 10000, "ERC2981PerTokenRoyalties: Royalty too high");
        _royalties[0] = RoyaltyInfo(_recipient, uint24(_value));
    }

    /// @dev Provides value and recipient for a royalty of the given token and for the given price.
    /// @param _tokenId the token id fir which we register the royalties
    /// @param _salePrice The base amount used to calculate the royalty.
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view override returns (address _receiver, uint256 _royaltyAmount) {
        RoyaltyInfo memory royalty = _royalties[_tokenId];

        // fallback to collection-wide royalty, if set
        if (royalty.recipient == address(0)) {
            royalty = _royalties[0];
        }

        // do the math and return results
        _receiver = royalty.recipient;
        _royaltyAmount = (_salePrice * royalty.amount) / 10000;
        return (_receiver, _royaltyAmount);
    }
}


contract Artion is ERC721URIStorage, ERC2981PerTokenRoyalties, Ownable {
    using SafeMath for uint256;

    /// @dev Events of the contract
    event Minted(
        uint256 tokenId,
        address beneficiary,
        string tokenUri,
        address minter
    );

    event UpdatePlatformFee(uint256 platformFee);
    event UpdatePlatformFeeRecipient(address payable platformFeeRecipient);

    /// @dev current max tokenId
    uint256 public tokenIdPointer;

    /// @dev TokenID -> Creator address
    mapping(uint256 => address) public creators;

    /// @notice Platform fee
    uint256 public platformFee;

    /// @notice Platform fee recipient
    address payable public feeRecipient;

    /// @notice Contract constructor
    constructor(address payable _feeRecipient, uint256 _platformFee)
        ERC721("ART", "Artion")
    {
        platformFee = _platformFee;
        feeRecipient = _feeRecipient;
    }

    /**
     @notice Mints a NFT AND when minting to a contract checks if the beneficiary is a 721 compatible
     @param _beneficiary Recipient of the NFT
     @param _tokenUri URI for the token being minted
     @return uint256 The token ID of the token that was minted
     */
    function mint(
        address _beneficiary,
        string calldata _tokenUri,
        address _royaltyRecipient,
        uint256 _royaltyValue
    ) external payable returns (uint256) {
        require(msg.value >= platformFee, "Insufficient funds to mint.");

        // Valid args
        _assertMintingParamsValid(_tokenUri, _msgSender());

        tokenIdPointer = tokenIdPointer.add(1);
        uint256 tokenId = tokenIdPointer;

        // Mint token and set token URI
        _safeMint(_beneficiary, tokenId);
        _setTokenURI(tokenId, _tokenUri);

        // set royalty, if the user requested the royalty to be set
        if (_royaltyRecipient != address(0)) {
            _setTokenRoyalty(tokenId, _royaltyRecipient, _royaltyValue);
        }

        // Send FTM fee to fee recipient
        feeRecipient.transfer(msg.value);

        // Associate garment designer
        creators[tokenId] = _msgSender();

        emit Minted(tokenId, _beneficiary, _tokenUri, _msgSender());
        return tokenId;
    }

    /**
     @notice Burns a NFT
     @dev Only the owner or an approved sender can call this method
     @param _tokenId the token ID to burn
     */
    function burn(uint256 _tokenId) external {
        address operator = _msgSender();
        require(
            ownerOf(_tokenId) == operator || isApproved(_tokenId, operator),
            "Only owner or approved"
        );

        // Destroy token mappings
        _burn(_tokenId);

        // Clean up designer mapping
        delete creators[_tokenId];
    }

    function _extractIncomingTokenId() internal pure returns (uint256) {
        // Extract out the embedded token ID from the sender
        uint256 _receiverTokenId;
        uint256 _index = msg.data.length - 32;
        assembly {
            _receiverTokenId := calldataload(_index)
        }
        return _receiverTokenId;
    }

    // Set collection-wide default royalty.
    function setDefaultRoyalty(address _receiver, uint16 _royaltyPercent) external override onlyOwner {
        _setDefaultRoyalty(_receiver, _royaltyPercent);
    }

    // Set royalty for the given token.
    function setTokenRoyalty(uint256 _tokenId, address _receiver, uint16 _royaltyPercent) external override {
        // only token owner can make the change
        address operator = _msgSender();
        require(ownerOf(_tokenId) == operator || isApproved(_tokenId, operator), "Only owner or approved");

        _setTokenRoyalty(_tokenId, _receiver, _royaltyPercent);
    }

    /////////////////
    // View Methods /
    /////////////////

    /**
     @notice View method for checking whether a token has been minted
     @param _tokenId ID of the token being checked
     */
    function exists(uint256 _tokenId) external view returns (bool) {
        return _exists(_tokenId);
    }

    /**
     * @dev checks the given token ID is approved either for all or the single token ID
     */
    function isApproved(uint256 _tokenId, address _operator)
        public
        view
        returns (bool)
    {
        return
            isApprovedForAll(ownerOf(_tokenId), _operator) ||
            getApproved(_tokenId) == _operator;
    }

    /**
     @notice Method for updating platform fee
     @dev Only admin
     @param _platformFee uint256 the platform fee to set
     */
    function updatePlatformFee(uint256 _platformFee) external onlyOwner {
        platformFee = _platformFee;
        emit UpdatePlatformFee(_platformFee);
    }

    /**
     @notice Method for updating platform fee address
     @dev Only admin
     @param _platformFeeRecipient payable address the address to sends the funds to
     */
    function updatePlatformFeeRecipient(address payable _platformFeeRecipient)
        external
        onlyOwner
    {
        feeRecipient = _platformFeeRecipient;
        emit UpdatePlatformFeeRecipient(_platformFeeRecipient);
    }

    /////////////////////////
    // Internal and Private /
    /////////////////////////

    /**
     @notice Checks that the URI is not empty and the designer is a real address
     @param _tokenUri URI supplied on minting
     @param _designer Address supplied on minting
     */
    function _assertMintingParamsValid(
        string calldata _tokenUri,
        address _designer
    ) internal pure {
        require(
            bytes(_tokenUri).length > 0,
            "_assertMintingParamsValid: Token URI is empty"
        );
        require(
            _designer != address(0),
            "_assertMintingParamsValid: Designer is zero address"
        );
    }

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, ERC2981)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"_feeRecipient","type":"address"},{"internalType":"uint256","name":"_platformFee","type":"uint256"}],"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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"string","name":"tokenUri","type":"string"},{"indexed":false,"internalType":"address","name":"minter","type":"address"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"platformFee","type":"uint256"}],"name":"UpdatePlatformFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable","name":"platformFeeRecipient","type":"address"}],"name":"UpdatePlatformFeeRecipient","type":"event"},{"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":"uint256","name":"","type":"uint256"}],"name":"creators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"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"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"string","name":"_tokenUri","type":"string"},{"internalType":"address","name":"_royaltyRecipient","type":"address"},{"internalType":"uint256","name":"_royaltyValue","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint16","name":"_royaltyPercent","type":"uint16"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint16","name":"_royaltyPercent","type":"uint16"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"setTokenRoyaltyRecipient","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":[],"name":"tokenIdPointer","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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_platformFee","type":"uint256"}],"name":"updatePlatformFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_platformFeeRecipient","type":"address"}],"name":"updatePlatformFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162002ba338038062002ba38339810160408190526200003491620001d5565b604080518082018252600381526210549560ea1b60208083019182528351808501909452600684526520b93a34b7b760d11b9084015281519192916200007d916000916200012f565b508051620000939060019060208401906200012f565b505050620000b0620000aa620000d960201b60201c565b620000dd565b600b55600c80546001600160a01b0319166001600160a01b03929092169190911790556200024c565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013d906200020f565b90600052602060002090601f016020900481019282620001615760008555620001ac565b82601f106200017c57805160ff1916838001178555620001ac565b82800160010185558215620001ac579182015b82811115620001ac5782518255916020019190600101906200018f565b50620001ba929150620001be565b5090565b5b80821115620001ba5760008155600101620001bf565b60008060408385031215620001e8578182fd5b82516001600160a01b0381168114620001ff578283fd5b6020939093015192949293505050565b6002810460018216806200022457607f821691505b602082108114156200024657634e487b7160e01b600052602260045260246000fd5b50919050565b612947806200025c6000396000f3fe6080604052600436106101cd5760003560e01c806370a08231116100f7578063aa0b598811610095578063da14cbbc11610064578063da14cbbc14610512578063e985e9c514610525578063f2fde38b14610545578063f5fe7f7114610565576101cd565b8063aa0b598814610492578063b88d4fde146104b2578063c87b56dd146104d2578063cd53d08e146104f2576101cd565b80638b82d693116100d15780638b82d693146104285780638da5cb5b1461044857806395d89b411461045d578063a22cb46514610472576101cd565b806370a08231146103d3578063715018a6146103f357806378db6c5314610408576101cd565b80633b3a1a7a1161016f578063469048401161013e578063469048401461035e5780634f558e791461037357806356c31637146103935780636352211e146103b3576101cd565b80633b3a1a7a146102e957806342842e0e146102fe57806342966c681461031e5780634331f6391461033e576101cd565b8063095ea7b3116101ab578063095ea7b31461025757806323b872dd1461027957806326232a2e146102995780632a55205a146102bb576101cd565b806301ffc9a7146101d257806306fdde0314610208578063081812fc1461022a575b600080fd5b3480156101de57600080fd5b506101f26101ed366004611e5d565b610585565b6040516101ff9190611ff4565b60405180910390f35b34801561021457600080fd5b5061021d610598565b6040516101ff9190611fff565b34801561023657600080fd5b5061024a610245366004611e95565b61062a565b6040516101ff9190611f8a565b34801561026357600080fd5b50610277610272366004611e32565b610676565b005b34801561028557600080fd5b50610277610294366004611c22565b61070e565b3480156102a557600080fd5b506102ae610746565b6040516101ff919061274f565b3480156102c757600080fd5b506102db6102d6366004611f0e565b61074c565b6040516101ff929190611fdb565b3480156102f557600080fd5b506102ae610816565b34801561030a57600080fd5b50610277610319366004611c22565b61081c565b34801561032a57600080fd5b50610277610339366004611e95565b610837565b34801561034a57600080fd5b50610277610359366004611dfe565b6108b4565b34801561036a57600080fd5b5061024a610905565b34801561037f57600080fd5b506101f261038e366004611e95565b610914565b34801561039f57600080fd5b506101f26103ae366004611ead565b61091f565b3480156103bf57600080fd5b5061024a6103ce366004611e95565b61095e565b3480156103df57600080fd5b506102ae6103ee366004611bce565b610993565b3480156103ff57600080fd5b506102776109d7565b34801561041457600080fd5b50610277610423366004611ed1565b610a22565b34801561043457600080fd5b50610277610443366004611ead565b610a8c565b34801561045457600080fd5b5061024a610b2a565b34801561046957600080fd5b5061021d610b39565b34801561047e57600080fd5b5061027761048d366004611d32565b610b48565b34801561049e57600080fd5b506102776104ad366004611e95565b610c16565b3480156104be57600080fd5b506102776104cd366004611c62565b610c95565b3480156104de57600080fd5b5061021d6104ed366004611e95565b610cce565b3480156104fe57600080fd5b5061024a61050d366004611e95565b610def565b6102ae610520366004611d63565b610e0a565b34801561053157600080fd5b506101f2610540366004611bea565b610f75565b34801561055157600080fd5b50610277610560366004611bce565b610fa3565b34801561057157600080fd5b50610277610580366004611bce565b611014565b60006105908261109e565b90505b919050565b6060600080546105a79061283a565b80601f01602080910402602001604051908101604052809291908181526020018280546105d39061283a565b80156106205780601f106105f557610100808354040283529160200191610620565b820191906000526020600020905b81548152906001019060200180831161060357829003601f168201915b5050505050905090565b6000610635826110de565b61065a5760405162461bcd60e51b815260040161065190612484565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106818261095e565b9050806001600160a01b0316836001600160a01b031614156106b55760405162461bcd60e51b81526004016106519061259d565b806001600160a01b03166106c76110fb565b6001600160a01b031614806106e357506106e3816105406110fb565b6106ff5760405162461bcd60e51b815260040161065190612276565b61070983836110ff565b505050565b61071f6107196110fb565b8261116d565b61073b5760405162461bcd60e51b81526004016106519061265e565b6107098383836111ea565b600b5481565b60008281526007602090815260408083208151808301909252546001600160a01b038116808352600160a01b90910462ffffff169282019290925282916107e557506000805260076020908152604080518082019091527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df546001600160a01b0381168252600160a01b900462ffffff16918101919091525b80516020820151909350612710906108029062ffffff16866127d8565b61080c91906127c4565b9150509250929050565b60095481565b61070983838360405180602001604052806000815250610c95565b60006108416110fb565b9050806001600160a01b03166108568361095e565b6001600160a01b031614806108705750610870828261091f565b61088c5760405162461bcd60e51b8152600401610651906125de565b61089582611317565b506000908152600a6020526040902080546001600160a01b0319169055565b6108bc6110fb565b6001600160a01b03166108cd610b2a565b6001600160a01b0316146108f35760405162461bcd60e51b8152600401610651906124d0565b610901828261ffff16611357565b5050565b600c546001600160a01b031681565b6000610590826110de565b600061093361092d8461095e565b83610f75565b806109575750816001600160a01b031661094c8461062a565b6001600160a01b0316145b9392505050565b6000818152600260205260408120546001600160a01b0316806105905760405162461bcd60e51b81526004016106519061231d565b60006001600160a01b0382166109bb5760405162461bcd60e51b8152600401610651906122d3565b506001600160a01b031660009081526003602052604090205490565b6109df6110fb565b6001600160a01b03166109f0610b2a565b6001600160a01b031614610a165760405162461bcd60e51b8152600401610651906124d0565b610a2060006113f7565b565b6000610a2c6110fb565b9050806001600160a01b0316610a418561095e565b6001600160a01b03161480610a5b5750610a5b848261091f565b610a775760405162461bcd60e51b8152600401610651906125de565b610a8684848461ffff16611449565b50505050565b6000828152600760209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910462ffffff169183019190915215801590610adf575080516001600160a01b031633145b610afb5760405162461bcd60e51b81526004016106519061260e565b5060009182526007602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6008546001600160a01b031690565b6060600180546105a79061283a565b610b506110fb565b6001600160a01b0316826001600160a01b03161415610b815760405162461bcd60e51b81526004016106519061215c565b8060056000610b8e6110fb565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610bd26110fb565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c0a9190611ff4565b60405180910390a35050565b610c1e6110fb565b6001600160a01b0316610c2f610b2a565b6001600160a01b031614610c555760405162461bcd60e51b8152600401610651906124d0565b600b8190556040517f2644fd26359c107ff7991b6dfc36ce902b334ce4e3891bbecacc5922aa620efa90610c8a90839061274f565b60405180910390a150565b610ca6610ca06110fb565b8361116d565b610cc25760405162461bcd60e51b81526004016106519061265e565b610a8684848484611525565b6060610cd9826110de565b610cf55760405162461bcd60e51b815260040161065190612433565b60008281526006602052604081208054610d0e9061283a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3a9061283a565b8015610d875780601f10610d5c57610100808354040283529160200191610d87565b820191906000526020600020905b815481529060010190602001808311610d6a57829003601f168201915b505050505090506000610d98611558565b9050805160001415610dac57509050610593565b815115610dde578082604051602001610dc6929190611f5b565b60405160208183030381529060405292505050610593565b610de78461156a565b949350505050565b600a602052600090815260409020546001600160a01b031681565b6000600b54341015610e2e5760405162461bcd60e51b815260040161065190612012565b610e408585610e3b6110fb565b6115ec565b600954610e4e90600161162f565b6009819055610e5d878261163b565b610e9d8187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061165592505050565b6001600160a01b03841615610eb757610eb7818585611449565b600c546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015610ef0573d6000803e3d6000fd5b50610ef96110fb565b6000828152600a6020526040902080546001600160a01b0319166001600160a01b03929092169190911790557f997115af5924f5e38964c6d65c804d4cb85129b65e62eb20a8ca6329dbe57e1881888888610f526110fb565b604051610f63959493929190612758565b60405180910390a19695505050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610fab6110fb565b6001600160a01b0316610fbc610b2a565b6001600160a01b031614610fe25760405162461bcd60e51b8152600401610651906124d0565b6001600160a01b0381166110085760405162461bcd60e51b81526004016106519061209b565b611011816113f7565b50565b61101c6110fb565b6001600160a01b031661102d610b2a565b6001600160a01b0316146110535760405162461bcd60e51b8152600401610651906124d0565b600c80546001600160a01b0319166001600160a01b0383161790556040517fe57e7c1f36cc83fade34e32351e6eee7eb9da532662b1b5da10c631e8222aca790610c8a908390611f8a565b60006001600160e01b0319821663152a902d60e11b14806110cf57506001600160e01b03198216631df54d3560e11b145b80610590575061059082611699565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906111348261095e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611178826110de565b6111945760405162461bcd60e51b815260040161065190612193565b600061119f8361095e565b9050806001600160a01b0316846001600160a01b031614806111da5750836001600160a01b03166111cf8461062a565b6001600160a01b0316145b80610de75750610de78185610f75565b826001600160a01b03166111fd8261095e565b6001600160a01b0316146112235760405162461bcd60e51b815260040161065190612505565b6001600160a01b0382166112495760405162461bcd60e51b815260040161065190612118565b611254838383610709565b61125f6000826110ff565b6001600160a01b03831660009081526003602052604081208054600192906112889084906127f7565b90915550506001600160a01b03821660009081526003602052604081208054600192906112b69084906127ac565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611320816116d9565b600081815260066020526040902080546113399061283a565b15905061101157600081815260066020526040812061101191611ae7565b6127108111156113795760405162461bcd60e51b8152600401610651906121df565b604080518082019091526001600160a01b03928316815262ffffff9182166020808301918252600080526007905290517f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df805492516001600160a01b0319909316919094161762ffffff60a01b1916600160a01b9190921602179055565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61271081111561146b5760405162461bcd60e51b8152600401610651906123b4565b6000838152600760209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910462ffffff1691830191909152156114c45760405162461bcd60e51b815260040161065190612229565b506040805180820182526001600160a01b03938416815262ffffff928316602080830191825260009687526007905291909420935184549151909216600160a01b0262ffffff60a01b19929093166001600160a01b03199091161716179055565b6115308484846111ea565b61153c84848484611780565b610a865760405162461bcd60e51b815260040161065190612049565b60408051602081019091526000815290565b6060611575826110de565b6115915760405162461bcd60e51b81526004016106519061254e565b600061159b611558565b905060008151116115bb5760405180602001604052806000815250610957565b806115c58461189b565b6040516020016115d6929190611f5b565b6040516020818303038152906040529392505050565b816116095760405162461bcd60e51b8152600401610651906126af565b6001600160a01b0381166107095760405162461bcd60e51b8152600401610651906126fc565b600061095782846127ac565b6109018282604051806020016040528060008152506119b6565b61165e826110de565b61167a5760405162461bcd60e51b815260040161065190612366565b6000828152600660209081526040909120825161070992840190611b23565b60006001600160e01b031982166380ac58cd60e01b14806116ca57506001600160e01b03198216635b5e139f60e01b145b806105905750610590826119e9565b60006116e48261095e565b90506116f281600084610709565b6116fd6000836110ff565b6001600160a01b03811660009081526003602052604081208054600192906117269084906127f7565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000611794846001600160a01b0316611a02565b1561189057836001600160a01b031663150b7a026117b06110fb565b8786866040518563ffffffff1660e01b81526004016117d29493929190611f9e565b602060405180830381600087803b1580156117ec57600080fd5b505af192505050801561181c575060408051601f3d908101601f1916820190925261181991810190611e79565b60015b611876573d80801561184a576040519150601f19603f3d011682016040523d82523d6000602084013e61184f565b606091505b50805161186e5760405162461bcd60e51b815260040161065190612049565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610de7565b506001949350505050565b6060816118c057506040805180820190915260018152600360fc1b6020820152610593565b8160005b81156118ea57806118d481612875565b91506118e39050600a836127c4565b91506118c4565b60008167ffffffffffffffff81111561191357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561193d576020820181803683370190505b5090505b8415610de7576119526001836127f7565b915061195f600a86612890565b61196a9060306127ac565b60f81b81838151811061198d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506119af600a866127c4565b9450611941565b6119c08383611a08565b6119cd6000848484611780565b6107095760405162461bcd60e51b815260040161065190612049565b6001600160e01b031981166301ffc9a760e01b14919050565b3b151590565b6001600160a01b038216611a2e5760405162461bcd60e51b8152600401610651906123fe565b611a37816110de565b15611a545760405162461bcd60e51b8152600401610651906120e1565b611a6060008383610709565b6001600160a01b0382166000908152600360205260408120805460019290611a899084906127ac565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b508054611af39061283a565b6000825580601f10611b055750611011565b601f0160209004906000526020600020908101906110119190611ba7565b828054611b2f9061283a565b90600052602060002090601f016020900481019282611b515760008555611b97565b82601f10611b6a57805160ff1916838001178555611b97565b82800160010185558215611b97579182015b82811115611b97578251825591602001919060010190611b7c565b50611ba3929150611ba7565b5090565b5b80821115611ba35760008155600101611ba8565b803561ffff8116811461059357600080fd5b600060208284031215611bdf578081fd5b8135610957816128e6565b60008060408385031215611bfc578081fd5b8235611c07816128e6565b91506020830135611c17816128e6565b809150509250929050565b600080600060608486031215611c36578081fd5b8335611c41816128e6565b92506020840135611c51816128e6565b929592945050506040919091013590565b60008060008060808587031215611c77578081fd5b8435611c82816128e6565b9350602085810135611c93816128e6565b935060408601359250606086013567ffffffffffffffff80821115611cb6578384fd5b818801915088601f830112611cc9578384fd5b813581811115611cdb57611cdb6128d0565b604051601f8201601f1916810185018381118282101715611cfe57611cfe6128d0565b60405281815283820185018b1015611d14578586fd5b81858501868301379081019093019390935250939692955090935050565b60008060408385031215611d44578182fd5b8235611d4f816128e6565b915060208301358015158114611c17578182fd5b600080600080600060808688031215611d7a578081fd5b8535611d85816128e6565b9450602086013567ffffffffffffffff80821115611da1578283fd5b818801915088601f830112611db4578283fd5b813581811115611dc2578384fd5b896020828501011115611dd3578384fd5b6020830196508095505050506040860135611ded816128e6565b949793965091946060013592915050565b60008060408385031215611e10578182fd5b8235611e1b816128e6565b9150611e2960208401611bbc565b90509250929050565b60008060408385031215611e44578182fd5b8235611e4f816128e6565b946020939093013593505050565b600060208284031215611e6e578081fd5b8135610957816128fb565b600060208284031215611e8a578081fd5b8151610957816128fb565b600060208284031215611ea6578081fd5b5035919050565b60008060408385031215611ebf578182fd5b823591506020830135611c17816128e6565b600080600060608486031215611ee5578081fd5b833592506020840135611ef7816128e6565b9150611f0560408501611bbc565b90509250925092565b60008060408385031215611f20578182fd5b50508035926020909101359150565b60008151808452611f4781602086016020860161280e565b601f01601f19169290920160200192915050565b60008351611f6d81846020880161280e565b835190830190611f8181836020880161280e565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fd190830184611f2f565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526109576020830184611f2f565b6020808252601b908201527f496e73756666696369656e742066756e647320746f206d696e742e0000000000604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252602a908201527f45524332393831506572546f6b656e526f79616c746965733a20526f79616c746040820152690f240e8dede40d0d2ced60b31b606082015260800190565b6020808252602d908201527f45524332393831506572546f6b656e526f79616c746965733a20526f79616c7460408201526c1e48185b1c9958591e481cd95d609a1b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201526d32bc34b9ba32b73a103a37b5b2b760911b606082015260800190565b6020808252602a908201527f45524332393831506572546f6b656e526f79616c746965733a20526f79616c746040820152690f240a8dede40d0d2ced60b31b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526016908201527513db9b1e481bdddb995c881bdc88185c1c1c9bdd995960521b604082015260600190565b60208082526030908201527f45524332393831506572546f6b656e526f79616c746965733a2043757272656e60408201526f7420726563697069656e74206f6e6c7960801b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602d908201527f5f6173736572744d696e74696e67506172616d7356616c69643a20546f6b656e60408201526c2055524920697320656d70747960981b606082015260800190565b60208082526033908201527f5f6173736572744d696e74696e67506172616d7356616c69643a2044657369676040820152726e6572206973207a65726f206164647265737360681b606082015260800190565b90815260200190565b8581526001600160a01b0385811660208301526080604083018190528201849052600090848660a085013782850160a090810192909252929092166060820152601f909201601f1916909101019392505050565b600082198211156127bf576127bf6128a4565b500190565b6000826127d3576127d36128ba565b500490565b60008160001904831182151516156127f2576127f26128a4565b500290565b600082821015612809576128096128a4565b500390565b60005b83811015612829578181015183820152602001612811565b83811115610a865750506000910152565b60028104600182168061284e57607f821691505b6020821081141561286f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612889576128896128a4565b5060010190565b60008261289f5761289f6128ba565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461101157600080fd5b6001600160e01b03198116811461101157600080fdfea26469706673582212201cd19c0e961837a3bb41b903d036ab3a8dae592921aa6cf7c3f6cd721b0aaca764736f6c6343000800003300000000000000000000000048f7572cfbc4f246600cf816c668271034d81f8f0000000000000000000000000000000000000000000000000de0b6b3a7640000

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000048f7572cfbc4f246600cf816c668271034d81f8f0000000000000000000000000000000000000000000000000de0b6b3a7640000

-----Decoded View---------------
Arg [0] : _feeRecipient (address): 0x48f7572cfbc4f246600cf816c668271034d81f8f
Arg [1] : _platformFee (uint256): 1000000000000000000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000048f7572cfbc4f246600cf816c668271034d81f8f
Arg [1] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000


Deployed ByteCode Sourcemap

47680:6221:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53678:220;;;;;;;;;;-1:-1:-1;53678:220:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20800:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22359:221::-;;;;;;;;;;-1:-1:-1;22359:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21882:411::-;;;;;;;;;;-1:-1:-1;21882:411:0;;;;;:::i;:::-;;:::i;:::-;;23249:339;;;;;;;;;;-1:-1:-1;23249:339:0;;;;;:::i;:::-;;:::i;48290:26::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47119:552::-;;;;;;;;;;-1:-1:-1;47119:552:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;48129:29::-;;;;;;;;;;;;;:::i;23659:185::-;;;;;;;;;;-1:-1:-1;23659:185:0;;;;;:::i;:::-;;:::i;50147:376::-;;;;;;;;;;-1:-1:-1;50147:376:0;;;;;:::i;:::-;;:::i;50923:163::-;;;;;;;;;;-1:-1:-1;50923:163:0;;;;;:::i;:::-;;:::i;48365:35::-;;;;;;;;;;;;;:::i;51734:106::-;;;;;;;;;;-1:-1:-1;51734:106:0;;;;;:::i;:::-;;:::i;51955:252::-;;;;;;;;;;-1:-1:-1;51955:252:0;;;;;:::i;:::-;;:::i;20494:239::-;;;;;;;;;;-1:-1:-1;20494:239:0;;;;;:::i;:::-;;:::i;20224:208::-;;;;;;;;;;-1:-1:-1;20224:208:0;;;;;:::i;:::-;;:::i;35353:94::-;;;;;;;;;;;;;:::i;51135:379::-;;;;;;;;;;-1:-1:-1;51135:379:0;;;;;:::i;:::-;;:::i;46016:439::-;;;;;;;;;;-1:-1:-1;46016:439:0;;;;;:::i;:::-;;:::i;34702:87::-;;;;;;;;;;;;;:::i;20969:104::-;;;;;;;;;;;;;:::i;22652:295::-;;;;;;;;;;-1:-1:-1;22652:295:0;;;;;:::i;:::-;;:::i;52360:160::-;;;;;;;;;;-1:-1:-1;52360:160:0;;;;;:::i;:::-;;:::i;23915:328::-;;;;;;;;;;-1:-1:-1;23915:328:0;;;;;:::i;:::-;;:::i;32296:679::-;;;;;;;;;;-1:-1:-1;32296:679:0;;;;;:::i;:::-;;:::i;48208:43::-;;;;;;;;;;-1:-1:-1;48208:43:0;;;;;:::i;:::-;;:::i;48928:1055::-;;;;;;:::i;:::-;;:::i;23018:164::-;;;;;;;;;;-1:-1:-1;23018:164:0;;;;;:::i;:::-;;:::i;35602:192::-;;;;;;;;;;-1:-1:-1;35602:192:0;;;;;:::i;:::-;;:::i;52708:237::-;;;;;;;;;;-1:-1:-1;52708:237:0;;;;;:::i;:::-;;:::i;53678:220::-;53825:4;53854:36;53878:11;53854:23;:36::i;:::-;53847:43;;53678:220;;;;:::o;20800:100::-;20854:13;20887:5;20880:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20800:100;:::o;22359:221::-;22435:7;22463:16;22471:7;22463;:16::i;:::-;22455:73;;;;-1:-1:-1;;;22455:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;22548:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22548:24:0;;22359:221::o;21882:411::-;21963:13;21979:23;21994:7;21979:14;:23::i;:::-;21963:39;;22027:5;-1:-1:-1;;;;;22021:11:0;:2;-1:-1:-1;;;;;22021:11:0;;;22013:57;;;;-1:-1:-1;;;22013:57:0;;;;;;;:::i;:::-;22121:5;-1:-1:-1;;;;;22105:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;22105:21:0;;:62;;;;22130:37;22147:5;22154:12;:10;:12::i;22130:37::-;22083:168;;;;-1:-1:-1;;;22083:168:0;;;;;;;:::i;:::-;22264:21;22273:2;22277:7;22264:8;:21::i;:::-;21882:411;;;:::o;23249:339::-;23444:41;23463:12;:10;:12::i;:::-;23477:7;23444:18;:41::i;:::-;23436:103;;;;-1:-1:-1;;;23436:103:0;;;;;;;:::i;:::-;23552:28;23562:4;23568:2;23572:7;23552:9;:28::i;48290:26::-;;;;:::o;47119:552::-;47210:17;47293:20;;;:10;:20;;;;;;;;47264:49;;;;;;;;;-1:-1:-1;;;;;47264:49:0;;;;;-1:-1:-1;;;47264:49:0;;;;;;;;;;;;47210:17;;47382:87;;-1:-1:-1;47444:13:0;;;:10;:13;;;;;47434:23;;;;;;;;47444:13;47434:23;-1:-1:-1;;;;;47434:23:0;;;;-1:-1:-1;;;47434:23:0;;;;;;;;;;;47382:87;47536:17;;47595:14;;;;47536:17;;-1:-1:-1;47613:5:0;;47582:27;;;;:10;:27;:::i;:::-;47581:37;;;;:::i;:::-;47564:54;;47629:34;47119:552;;;;;:::o;48129:29::-;;;;:::o;23659:185::-;23797:39;23814:4;23820:2;23824:7;23797:39;;;;;;;;;;;;:16;:39::i;50147:376::-;50199:16;50218:12;:10;:12::i;:::-;50199:31;;50284:8;-1:-1:-1;;;;;50263:29:0;:17;50271:8;50263:7;:17::i;:::-;-1:-1:-1;;;;;50263:29:0;;:63;;;;50296:30;50307:8;50317;50296:10;:30::i;:::-;50241:135;;;;-1:-1:-1;;;50241:135:0;;;;;;;:::i;:::-;50424:15;50430:8;50424:5;:15::i;:::-;-1:-1:-1;50497:18:0;;;;:8;:18;;;;;50490:25;;-1:-1:-1;;;;;;50490:25:0;;;50147:376::o;50923:163::-;34933:12;:10;:12::i;:::-;-1:-1:-1;;;;;34922:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34922:23:0;;34914:68;;;;-1:-1:-1;;;34914:68:0;;;;;;;:::i;:::-;51032:46:::1;51051:9;51062:15;51032:46;;:18;:46::i;:::-;50923:163:::0;;:::o;48365:35::-;;;-1:-1:-1;;;;;48365:35:0;;:::o;51734:106::-;51791:4;51815:17;51823:8;51815:7;:17::i;51955:252::-;52060:4;52102:46;52119:17;52127:8;52119:7;:17::i;:::-;52138:9;52102:16;:46::i;:::-;:97;;;;52190:9;-1:-1:-1;;;;;52165:34:0;:21;52177:8;52165:11;:21::i;:::-;-1:-1:-1;;;;;52165:34:0;;52102:97;52082:117;51955:252;-1:-1:-1;;;51955:252:0:o;20494:239::-;20566:7;20602:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20602:16:0;20637:19;20629:73;;;;-1:-1:-1;;;20629:73:0;;;;;;;:::i;20224:208::-;20296:7;-1:-1:-1;;;;;20324:19:0;;20316:74;;;;-1:-1:-1;;;20316:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;20408:16:0;;;;;:9;:16;;;;;;;20224:208::o;35353:94::-;34933:12;:10;:12::i;:::-;-1:-1:-1;;;;;34922:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34922:23:0;;34914:68;;;;-1:-1:-1;;;34914:68:0;;;;;;;:::i;:::-;35418:21:::1;35436:1;35418:9;:21::i;:::-;35353:94::o:0;51135:379::-;51299:16;51318:12;:10;:12::i;:::-;51299:31;;51370:8;-1:-1:-1;;;;;51349:29:0;:17;51357:8;51349:7;:17::i;:::-;-1:-1:-1;;;;;51349:29:0;;:63;;;;51382:30;51393:8;51403;51382:10;:30::i;:::-;51341:98;;;;-1:-1:-1;;;51341:98:0;;;;;;;:::i;:::-;51452:54;51469:8;51479:9;51490:15;51452:54;;:16;:54::i;:::-;51135:379;;;;:::o;46016:439::-;46204:26;46233:20;;;:10;:20;;;;;;;;;46204:49;;;;;;;;;-1:-1:-1;;;;;46204:49:0;;;;;-1:-1:-1;;;46204:49:0;;;;;;;;;;;;46272:31;;;;:66;;-1:-1:-1;46307:17:0;;-1:-1:-1;;;;;46307:31:0;46328:10;46307:31;46272:66;46264:127;;;;-1:-1:-1;;;46264:127:0;;;;;;;:::i;:::-;-1:-1:-1;46404:20:0;;;;:10;:20;;;;;;:43;;-1:-1:-1;;;;;;46404:43:0;-1:-1:-1;;;;;46404:43:0;;;;;;;;;46016:439::o;34702:87::-;34775:6;;-1:-1:-1;;;;;34775:6:0;34702:87;:::o;20969:104::-;21025:13;21058:7;21051:14;;;;;:::i;22652:295::-;22767:12;:10;:12::i;:::-;-1:-1:-1;;;;;22755:24:0;:8;-1:-1:-1;;;;;22755:24:0;;;22747:62;;;;-1:-1:-1;;;22747:62:0;;;;;;;:::i;:::-;22867:8;22822:18;:32;22841:12;:10;:12::i;:::-;-1:-1:-1;;;;;22822:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;22822:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;22822:53:0;;;;;;;;;;;22906:12;:10;:12::i;:::-;-1:-1:-1;;;;;22891:48:0;;22930:8;22891:48;;;;;;:::i;:::-;;;;;;;;22652:295;;:::o;52360:160::-;34933:12;:10;:12::i;:::-;-1:-1:-1;;;;;34922:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34922:23:0;;34914:68;;;;-1:-1:-1;;;34914:68:0;;;;;;;:::i;:::-;52439:11:::1;:26:::0;;;52481:31:::1;::::0;::::1;::::0;::::1;::::0;52453:12;;52481:31:::1;:::i;:::-;;;;;;;;52360:160:::0;:::o;23915:328::-;24090:41;24109:12;:10;:12::i;:::-;24123:7;24090:18;:41::i;:::-;24082:103;;;;-1:-1:-1;;;24082:103:0;;;;;;;:::i;:::-;24196:39;24210:4;24216:2;24220:7;24229:5;24196:13;:39::i;32296:679::-;32369:13;32403:16;32411:7;32403;:16::i;:::-;32395:78;;;;-1:-1:-1;;;32395:78:0;;;;;;;:::i;:::-;32486:23;32512:19;;;:10;:19;;;;;32486:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32542:18;32563:10;:8;:10::i;:::-;32542:31;;32655:4;32649:18;32671:1;32649:23;32645:72;;;-1:-1:-1;32696:9:0;-1:-1:-1;32689:16:0;;32645:72;32821:23;;:27;32817:108;;32896:4;32902:9;32879:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32865:48;;;;;;32817:108;32944:23;32959:7;32944:14;:23::i;:::-;32937:30;32296:679;-1:-1:-1;;;;32296:679:0:o;48208:43::-;;;;;;;;;;;;-1:-1:-1;;;;;48208:43:0;;:::o;48928:1055::-;49110:7;49151:11;;49138:9;:24;;49130:64;;;;-1:-1:-1;;;49130:64:0;;;;;;;:::i;:::-;49230:50;49256:9;;49267:12;:10;:12::i;:::-;49230:25;:50::i;:::-;49310:14;;:21;;49329:1;49310:18;:21::i;:::-;49293:14;:38;;;49428:32;49438:12;49293:38;49428:9;:32::i;:::-;49471;49484:7;49493:9;;49471:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49471:12:0;;-1:-1:-1;;;49471:32:0:i;:::-;-1:-1:-1;;;;;49589:31:0;;;49585:123;;49637:59;49654:7;49663:17;49682:13;49637:16;:59::i;:::-;49762:12;;:32;;-1:-1:-1;;;;;49762:12:0;;;;49784:9;49762:32;;;;;:12;:32;:12;:32;49784:9;49762:12;:32;;;;;;;;;;;;;;;;;;;;;49866:12;:10;:12::i;:::-;49846:17;;;;:8;:17;;;;;:32;;-1:-1:-1;;;;;;49846:32:0;-1:-1:-1;;;;;49846:32:0;;;;;;;;;;49896:54;49846:17;49912:12;49926:9;;49937:12;:10;:12::i;:::-;49896:54;;;;;;;;;;:::i;:::-;;;;;;;;49968:7;48928:1055;-1:-1:-1;;;;;;48928:1055:0:o;23018:164::-;-1:-1:-1;;;;;23139:25:0;;;23115:4;23139:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23018:164::o;35602:192::-;34933:12;:10;:12::i;:::-;-1:-1:-1;;;;;34922:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34922:23:0;;34914:68;;;;-1:-1:-1;;;34914:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35691:22:0;::::1;35683:73;;;;-1:-1:-1::0;;;35683:73:0::1;;;;;;;:::i;:::-;35767:19;35777:8;35767:9;:19::i;:::-;35602:192:::0;:::o;52708:237::-;34933:12;:10;:12::i;:::-;-1:-1:-1;;;;;34922:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34922:23:0;;34914:68;;;;-1:-1:-1;;;34914:68:0;;;;;;;:::i;:::-;52836:12:::1;:36:::0;;-1:-1:-1;;;;;;52836:36:0::1;-1:-1:-1::0;;;;;52836:36:0;::::1;;::::0;;52888:49:::1;::::0;::::1;::::0;::::1;::::0;52836:36;;52888:49:::1;:::i;44548:371::-:0;44695:4;-1:-1:-1;;;;;;44737:50:0;;-1:-1:-1;;;44737:50:0;;:121;;-1:-1:-1;;;;;;;44804:54:0;;-1:-1:-1;;;44804:54:0;44737:121;:174;;;;44875:36;44899:11;44875:23;:36::i;25753:127::-;25818:4;25842:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25842:16:0;:30;;;25753:127::o;15561:98::-;15641:10;15561:98;:::o;29735:174::-;29810:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29810:29:0;-1:-1:-1;;;;;29810:29:0;;;;;;;;:24;;29864:23;29810:24;29864:14;:23::i;:::-;-1:-1:-1;;;;;29855:46:0;;;;;;;;;;;29735:174;;:::o;26047:348::-;26140:4;26165:16;26173:7;26165;:16::i;:::-;26157:73;;;;-1:-1:-1;;;26157:73:0;;;;;;;:::i;:::-;26241:13;26257:23;26272:7;26257:14;:23::i;:::-;26241:39;;26310:5;-1:-1:-1;;;;;26299:16:0;:7;-1:-1:-1;;;;;26299:16:0;;:51;;;;26343:7;-1:-1:-1;;;;;26319:31:0;:20;26331:7;26319:11;:20::i;:::-;-1:-1:-1;;;;;26319:31:0;;26299:51;:87;;;;26354:32;26371:5;26378:7;26354:16;:32::i;29039:578::-;29198:4;-1:-1:-1;;;;;29171:31:0;:23;29186:7;29171:14;:23::i;:::-;-1:-1:-1;;;;;29171:31:0;;29163:85;;;;-1:-1:-1;;;29163:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29267:16:0;;29259:65;;;;-1:-1:-1;;;29259:65:0;;;;;;;:::i;:::-;29337:39;29358:4;29364:2;29368:7;29337:20;:39::i;:::-;29441:29;29458:1;29462:7;29441:8;:29::i;:::-;-1:-1:-1;;;;;29483:15:0;;;;;;:9;:15;;;;;:20;;29502:1;;29483:15;:20;;29502:1;;29483:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29514:13:0;;;;;;:9;:13;;;;;:18;;29531:1;;29514:13;:18;;29531:1;;29514:18;:::i;:::-;;;;-1:-1:-1;;29543:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29543:21:0;-1:-1:-1;;;;;29543:21:0;;;;;;;;;29582:27;;29543:16;;29582:27;;;;;;;29039:578;;;:::o;33577:206::-;33646:20;33658:7;33646:11;:20::i;:::-;33689:19;;;;:10;:19;;;;;33683:33;;;;;:::i;:::-;:38;;-1:-1:-1;33679:97:0;;33745:19;;;;:10;:19;;;;;33738:26;;;:::i;46634:228::-;46736:5;46726:6;:15;;46718:70;;;;-1:-1:-1;;;46718:70:0;;;;;;;:::i;:::-;46815:39;;;;;;;;;-1:-1:-1;;;;;46815:39:0;;;;;;;;;;;;;;;;-1:-1:-1;46799:13:0;;:10;:13;;:55;;:13;:55;;;;-1:-1:-1;;;;;;46799:55:0;;;;;;;;-1:-1:-1;;;;46799:55:0;-1:-1:-1;;;46799:55:0;;;;;;;;46634:228::o;35802:173::-;35877:6;;;-1:-1:-1;;;;;35894:17:0;;;-1:-1:-1;;;;;;35894:17:0;;;;;;;35927:40;;35877:6;;;35894:17;35877:6;;35927:40;;35858:16;;35927:40;35802:173;;:::o;45448:449::-;45600:5;45590:6;:15;;45582:70;;;;-1:-1:-1;;;45582:70:0;;;;;;;:::i;:::-;45665:26;45694:20;;;:10;:20;;;;;;;;;45665:49;;;;;;;;;-1:-1:-1;;;;;45665:49:0;;;;;-1:-1:-1;;;45665:49:0;;;;;;;;;;;;45733:31;45725:89;;;;-1:-1:-1;;;45725:89:0;;;;;;;:::i;:::-;-1:-1:-1;45850:39:0;;;;;;;;-1:-1:-1;;;;;45850:39:0;;;;;;;;;;;;;;;;-1:-1:-1;45827:20:0;;;:10;:20;;;;;;:62;;;;;;;;;-1:-1:-1;;;45827:62:0;-1:-1:-1;;;;45827:62:0;;;;-1:-1:-1;;;;;;45827:62:0;;;;;;;;45448:449::o;25125:315::-;25282:28;25292:4;25298:2;25302:7;25282:9;:28::i;:::-;25329:48;25352:4;25358:2;25362:7;25371:5;25329:22;:48::i;:::-;25321:111;;;;-1:-1:-1;;;25321:111:0;;;;;;;:::i;21726:94::-;21803:9;;;;;;;;;-1:-1:-1;21803:9:0;;21726:94;:::o;21144:334::-;21217:13;21251:16;21259:7;21251;:16::i;:::-;21243:76;;;;-1:-1:-1;;;21243:76:0;;;;;;;:::i;:::-;21332:21;21356:10;:8;:10::i;:::-;21332:34;;21408:1;21390:7;21384:21;:25;:86;;;;;;;;;;;;;;;;;21436:7;21445:18;:7;:16;:18::i;:::-;21419:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21377:93;21144:334;-1:-1:-1;;;21144:334:0:o;53246:396::-;53399:27;53377:122;;;;-1:-1:-1;;;53377:122:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53532:23:0;;53510:124;;;;-1:-1:-1;;;53510:124:0;;;;;;;:::i;38685:98::-;38743:7;38770:5;38774:1;38770;:5;:::i;26737:110::-;26813:26;26823:2;26827:7;26813:26;;;;;;;;;;;;:9;:26::i;33131:217::-;33231:16;33239:7;33231;:16::i;:::-;33223:75;;;;-1:-1:-1;;;33223:75:0;;;;;;;:::i;:::-;33309:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;19855:305::-;19957:4;-1:-1:-1;;;;;;19994:40:0;;-1:-1:-1;;;19994:40:0;;:105;;-1:-1:-1;;;;;;;20051:48:0;;-1:-1:-1;;;20051:48:0;19994:105;:158;;;;20116:36;20140:11;20116:23;:36::i;28342:360::-;28402:13;28418:23;28433:7;28418:14;:23::i;:::-;28402:39;;28454:48;28475:5;28490:1;28494:7;28454:20;:48::i;:::-;28543:29;28560:1;28564:7;28543:8;:29::i;:::-;-1:-1:-1;;;;;28585:16:0;;;;;;:9;:16;;;;;:21;;28605:1;;28585:16;:21;;28605:1;;28585:21;:::i;:::-;;;;-1:-1:-1;;28624:16:0;;;;:7;:16;;;;;;28617:23;;-1:-1:-1;;;;;;28617:23:0;;;28658:36;28632:7;;28624:16;-1:-1:-1;;;;;28658:36:0;;;;;28624:16;;28658:36;28342:360;;:::o;30474:799::-;30629:4;30650:15;:2;-1:-1:-1;;;;;30650:13:0;;:15::i;:::-;30646:620;;;30702:2;-1:-1:-1;;;;;30686:36:0;;30723:12;:10;:12::i;:::-;30737:4;30743:7;30752:5;30686:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30686:72:0;;;;;;;;-1:-1:-1;;30686:72:0;;;;;;;;;;;;:::i;:::-;;;30682:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30928:13:0;;30924:272;;30971:60;;-1:-1:-1;;;30971:60:0;;;;;;;:::i;30924:272::-;31146:6;31140:13;31131:6;31127:2;31123:15;31116:38;30682:529;-1:-1:-1;;;;;;30809:51:0;-1:-1:-1;;;30809:51:0;;-1:-1:-1;30802:58:0;;30646:620;-1:-1:-1;31250:4:0;30474:799;;;;;;:::o;16003:723::-;16059:13;16280:10;16276:53;;-1:-1:-1;16307:10:0;;;;;;;;;;;;-1:-1:-1;;;16307:10:0;;;;;;16276:53;16354:5;16339:12;16395:78;16402:9;;16395:78;;16428:8;;;;:::i;:::-;;-1:-1:-1;16451:10:0;;-1:-1:-1;16459:2:0;16451:10;;:::i;:::-;;;16395:78;;;16483:19;16515:6;16505:17;;;;;;-1:-1:-1;;;16505:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16505:17:0;;16483:39;;16533:154;16540:10;;16533:154;;16567:11;16577:1;16567:11;;:::i;:::-;;-1:-1:-1;16636:10:0;16644:2;16636:5;:10;:::i;:::-;16623:24;;:2;:24;:::i;:::-;16610:39;;16593:6;16600;16593:14;;;;;;-1:-1:-1;;;16593:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;16593:56:0;;;;;;;;-1:-1:-1;16664:11:0;16673:2;16664:11;;:::i;:::-;;;16533:154;;27074:321;27204:18;27210:2;27214:7;27204:5;:18::i;:::-;27255:54;27286:1;27290:2;27294:7;27303:5;27255:22;:54::i;:::-;27233:154;;;;-1:-1:-1;;;27233:154:0;;;;;;;:::i;18462:157::-;-1:-1:-1;;;;;;18571:40:0;;-1:-1:-1;;;18571:40:0;18462:157;;;:::o;7688:387::-;8011:20;8059:8;;;7688:387::o;27731:382::-;-1:-1:-1;;;;;27811:16:0;;27803:61;;;;-1:-1:-1;;;27803:61:0;;;;;;;:::i;:::-;27884:16;27892:7;27884;:16::i;:::-;27883:17;27875:58;;;;-1:-1:-1;;;27875:58:0;;;;;;;:::i;:::-;27946:45;27975:1;27979:2;27983:7;27946:20;:45::i;:::-;-1:-1:-1;;;;;28004:13:0;;;;;;:9;:13;;;;;:18;;28021:1;;28004:13;:18;;28021:1;;28004:18;:::i;:::-;;;;-1:-1:-1;;28033:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28033:21:0;-1:-1:-1;;;;;28033:21:0;;;;;;;;28072:33;;28033:16;;;28072:33;;28033:16;;28072:33;27731:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:161:1;83:20;;143:6;132:18;;122:29;;112:2;;165:1;162;155:12;180:259;;292:2;280:9;271:7;267:23;263:32;260:2;;;313:6;305;298:22;260:2;357:9;344:23;376:33;403:5;376:33;:::i;716:402::-;;;845:2;833:9;824:7;820:23;816:32;813:2;;;866:6;858;851:22;813:2;910:9;897:23;929:33;956:5;929:33;:::i;:::-;981:5;-1:-1:-1;1038:2:1;1023:18;;1010:32;1051:35;1010:32;1051:35;:::i;:::-;1105:7;1095:17;;;803:315;;;;;:::o;1123:470::-;;;;1269:2;1257:9;1248:7;1244:23;1240:32;1237:2;;;1290:6;1282;1275:22;1237:2;1334:9;1321:23;1353:33;1380:5;1353:33;:::i;:::-;1405:5;-1:-1:-1;1462:2:1;1447:18;;1434:32;1475:35;1434:32;1475:35;:::i;:::-;1227:366;;1529:7;;-1:-1:-1;;;1583:2:1;1568:18;;;;1555:32;;1227:366::o;1598:1306::-;;;;;1770:3;1758:9;1749:7;1745:23;1741:33;1738:2;;;1792:6;1784;1777:22;1738:2;1836:9;1823:23;1855:33;1882:5;1855:33;:::i;:::-;1907:5;-1:-1:-1;1931:2:1;1970:18;;;1957:32;1998:35;1957:32;1998:35;:::i;:::-;2052:7;-1:-1:-1;2106:2:1;2091:18;;2078:32;;-1:-1:-1;2161:2:1;2146:18;;2133:32;2184:18;2214:14;;;2211:2;;;2246:6;2238;2231:22;2211:2;2289:6;2278:9;2274:22;2264:32;;2334:7;2327:4;2323:2;2319:13;2315:27;2305:2;;2361:6;2353;2346:22;2305:2;2402;2389:16;2424:2;2420;2417:10;2414:2;;;2430:18;;:::i;:::-;2479:2;2473:9;2548:2;2529:13;;-1:-1:-1;;2525:27:1;2513:40;;2509:49;;2573:18;;;2593:22;;;2570:46;2567:2;;;2619:18;;:::i;:::-;2655:2;2648:22;2679:18;;;2716:11;;;2712:20;;2709:33;-1:-1:-1;2706:2:1;;;2760:6;2752;2745:22;2706:2;2821;2816;2812;2808:11;2803:2;2795:6;2791:15;2778:46;2844:15;;;2840:24;;;2833:40;;;;-1:-1:-1;1728:1176:1;;;;-1:-1:-1;1728:1176:1;;-1:-1:-1;;1728:1176:1:o;2909:438::-;;;3035:2;3023:9;3014:7;3010:23;3006:32;3003:2;;;3056:6;3048;3041:22;3003:2;3100:9;3087:23;3119:33;3146:5;3119:33;:::i;:::-;3171:5;-1:-1:-1;3228:2:1;3213:18;;3200:32;3270:15;;3263:23;3251:36;;3241:2;;3306:6;3298;3291:22;3352:991;;;;;;3535:3;3523:9;3514:7;3510:23;3506:33;3503:2;;;3557:6;3549;3542:22;3503:2;3601:9;3588:23;3620:33;3647:5;3620:33;:::i;:::-;3672:5;-1:-1:-1;3728:2:1;3713:18;;3700:32;3751:18;3781:14;;;3778:2;;;3813:6;3805;3798:22;3778:2;3856:6;3845:9;3841:22;3831:32;;3901:7;3894:4;3890:2;3886:13;3882:27;3872:2;;3928:6;3920;3913:22;3872:2;3973;3960:16;3999:2;3991:6;3988:14;3985:2;;;4020:6;4012;4005:22;3985:2;4070:7;4065:2;4056:6;4052:2;4048:15;4044:24;4041:37;4038:2;;;4096:6;4088;4081:22;4038:2;4132;4128;4124:11;4114:21;;4154:6;4144:16;;;;;4212:2;4201:9;4197:18;4184:32;4225:35;4252:7;4225:35;:::i;:::-;3493:850;;;;-1:-1:-1;3493:850:1;;4333:2;4318:18;4305:32;;3493:850;-1:-1:-1;;3493:850:1:o;4348:333::-;;;4476:2;4464:9;4455:7;4451:23;4447:32;4444:2;;;4497:6;4489;4482:22;4444:2;4541:9;4528:23;4560:33;4587:5;4560:33;:::i;:::-;4612:5;-1:-1:-1;4636:39:1;4671:2;4656:18;;4636:39;:::i;:::-;4626:49;;4434:247;;;;;:::o;4686:327::-;;;4815:2;4803:9;4794:7;4790:23;4786:32;4783:2;;;4836:6;4828;4821:22;4783:2;4880:9;4867:23;4899:33;4926:5;4899:33;:::i;:::-;4951:5;5003:2;4988:18;;;;4975:32;;-1:-1:-1;;;4773:240:1:o;5018:257::-;;5129:2;5117:9;5108:7;5104:23;5100:32;5097:2;;;5150:6;5142;5135:22;5097:2;5194:9;5181:23;5213:32;5239:5;5213:32;:::i;5280:261::-;;5402:2;5390:9;5381:7;5377:23;5373:32;5370:2;;;5423:6;5415;5408:22;5370:2;5460:9;5454:16;5479:32;5505:5;5479:32;:::i;5546:190::-;;5658:2;5646:9;5637:7;5633:23;5629:32;5626:2;;;5679:6;5671;5664:22;5626:2;-1:-1:-1;5707:23:1;;5616:120;-1:-1:-1;5616:120:1:o;5741:327::-;;;5870:2;5858:9;5849:7;5845:23;5841:32;5838:2;;;5891:6;5883;5876:22;5838:2;5932:9;5919:23;5909:33;;5992:2;5981:9;5977:18;5964:32;6005:33;6032:5;6005:33;:::i;6073:401::-;;;;6218:2;6206:9;6197:7;6193:23;6189:32;6186:2;;;6239:6;6231;6224:22;6186:2;6280:9;6267:23;6257:33;;6340:2;6329:9;6325:18;6312:32;6353:33;6380:5;6353:33;:::i;:::-;6405:5;-1:-1:-1;6429:39:1;6464:2;6449:18;;6429:39;:::i;:::-;6419:49;;6176:298;;;;;:::o;6479:258::-;;;6608:2;6596:9;6587:7;6583:23;6579:32;6576:2;;;6629:6;6621;6614:22;6576:2;-1:-1:-1;;6657:23:1;;;6727:2;6712:18;;;6699:32;;-1:-1:-1;6566:171:1:o;6742:259::-;;6823:5;6817:12;6850:6;6845:3;6838:19;6866:63;6922:6;6915:4;6910:3;6906:14;6899:4;6892:5;6888:16;6866:63;:::i;:::-;6983:2;6962:15;-1:-1:-1;;6958:29:1;6949:39;;;;6990:4;6945:50;;6793:208;-1:-1:-1;;6793:208:1:o;7006:470::-;;7223:6;7217:13;7239:53;7285:6;7280:3;7273:4;7265:6;7261:17;7239:53;:::i;:::-;7355:13;;7314:16;;;;7377:57;7355:13;7314:16;7411:4;7399:17;;7377:57;:::i;:::-;7450:20;;7193:283;-1:-1:-1;;;;7193:283:1:o;7481:203::-;-1:-1:-1;;;;;7645:32:1;;;;7627:51;;7615:2;7600:18;;7582:102::o;7913:490::-;-1:-1:-1;;;;;8182:15:1;;;8164:34;;8234:15;;8229:2;8214:18;;8207:43;8281:2;8266:18;;8259:34;;;8329:3;8324:2;8309:18;;8302:31;;;7913:490;;8350:47;;8377:19;;8369:6;8350:47;:::i;:::-;8342:55;8116:287;-1:-1:-1;;;;;;8116:287:1:o;8408:274::-;-1:-1:-1;;;;;8600:32:1;;;;8582:51;;8664:2;8649:18;;8642:34;8570:2;8555:18;;8537:145::o;8687:187::-;8852:14;;8845:22;8827:41;;8815:2;8800:18;;8782:92::o;8879:221::-;;9028:2;9017:9;9010:21;9048:46;9090:2;9079:9;9075:18;9067:6;9048:46;:::i;9105:351::-;9307:2;9289:21;;;9346:2;9326:18;;;9319:30;9385:29;9380:2;9365:18;;9358:57;9447:2;9432:18;;9279:177::o;9461:414::-;9663:2;9645:21;;;9702:2;9682:18;;;9675:30;9741:34;9736:2;9721:18;;9714:62;-1:-1:-1;;;9807:2:1;9792:18;;9785:48;9865:3;9850:19;;9635:240::o;9880:402::-;10082:2;10064:21;;;10121:2;10101:18;;;10094:30;10160:34;10155:2;10140:18;;10133:62;-1:-1:-1;;;10226:2:1;10211:18;;10204:36;10272:3;10257:19;;10054:228::o;10287:352::-;10489:2;10471:21;;;10528:2;10508:18;;;10501:30;10567;10562:2;10547:18;;10540:58;10630:2;10615:18;;10461:178::o;10644:400::-;10846:2;10828:21;;;10885:2;10865:18;;;10858:30;10924:34;10919:2;10904:18;;10897:62;-1:-1:-1;;;10990:2:1;10975:18;;10968:34;11034:3;11019:19;;10818:226::o;11049:349::-;11251:2;11233:21;;;11290:2;11270:18;;;11263:30;11329:27;11324:2;11309:18;;11302:55;11389:2;11374:18;;11223:175::o;11403:408::-;11605:2;11587:21;;;11644:2;11624:18;;;11617:30;11683:34;11678:2;11663:18;;11656:62;-1:-1:-1;;;11749:2:1;11734:18;;11727:42;11801:3;11786:19;;11577:234::o;11816:406::-;12018:2;12000:21;;;12057:2;12037:18;;;12030:30;12096:34;12091:2;12076:18;;12069:62;-1:-1:-1;;;12162:2:1;12147:18;;12140:40;12212:3;12197:19;;11990:232::o;12227:409::-;12429:2;12411:21;;;12468:2;12448:18;;;12441:30;12507:34;12502:2;12487:18;;12480:62;-1:-1:-1;;;12573:2:1;12558:18;;12551:43;12626:3;12611:19;;12401:235::o;12641:420::-;12843:2;12825:21;;;12882:2;12862:18;;;12855:30;12921:34;12916:2;12901:18;;12894:62;12992:26;12987:2;12972:18;;12965:54;13051:3;13036:19;;12815:246::o;13066:406::-;13268:2;13250:21;;;13307:2;13287:18;;;13280:30;13346:34;13341:2;13326:18;;13319:62;-1:-1:-1;;;13412:2:1;13397:18;;13390:40;13462:3;13447:19;;13240:232::o;13477:405::-;13679:2;13661:21;;;13718:2;13698:18;;;13691:30;13757:34;13752:2;13737:18;;13730:62;-1:-1:-1;;;13823:2:1;13808:18;;13801:39;13872:3;13857:19;;13651:231::o;13887:410::-;14089:2;14071:21;;;14128:2;14108:18;;;14101:30;14167:34;14162:2;14147:18;;14140:62;-1:-1:-1;;;14233:2:1;14218:18;;14211:44;14287:3;14272:19;;14061:236::o;14302:406::-;14504:2;14486:21;;;14543:2;14523:18;;;14516:30;14582:34;14577:2;14562:18;;14555:62;-1:-1:-1;;;14648:2:1;14633:18;;14626:40;14698:3;14683:19;;14476:232::o;14713:356::-;14915:2;14897:21;;;14934:18;;;14927:30;14993:34;14988:2;14973:18;;14966:62;15060:2;15045:18;;14887:182::o;15074:413::-;15276:2;15258:21;;;15315:2;15295:18;;;15288:30;15354:34;15349:2;15334:18;;15327:62;-1:-1:-1;;;15420:2:1;15405:18;;15398:47;15477:3;15462:19;;15248:239::o;15492:408::-;15694:2;15676:21;;;15733:2;15713:18;;;15706:30;15772:34;15767:2;15752:18;;15745:62;-1:-1:-1;;;15838:2:1;15823:18;;15816:42;15890:3;15875:19;;15666:234::o;15905:356::-;16107:2;16089:21;;;16126:18;;;16119:30;16185:34;16180:2;16165:18;;16158:62;16252:2;16237:18;;16079:182::o;16266:405::-;16468:2;16450:21;;;16507:2;16487:18;;;16480:30;16546:34;16541:2;16526:18;;16519:62;-1:-1:-1;;;16612:2:1;16597:18;;16590:39;16661:3;16646:19;;16440:231::o;16676:411::-;16878:2;16860:21;;;16917:2;16897:18;;;16890:30;16956:34;16951:2;16936:18;;16929:62;-1:-1:-1;;;17022:2:1;17007:18;;17000:45;17077:3;17062:19;;16850:237::o;17092:397::-;17294:2;17276:21;;;17333:2;17313:18;;;17306:30;17372:34;17367:2;17352:18;;17345:62;-1:-1:-1;;;17438:2:1;17423:18;;17416:31;17479:3;17464:19;;17266:223::o;17494:346::-;17696:2;17678:21;;;17735:2;17715:18;;;17708:30;-1:-1:-1;;;17769:2:1;17754:18;;17747:52;17831:2;17816:18;;17668:172::o;17845:412::-;18047:2;18029:21;;;18086:2;18066:18;;;18059:30;18125:34;18120:2;18105:18;;18098:62;-1:-1:-1;;;18191:2:1;18176:18;;18169:46;18247:3;18232:19;;18019:238::o;18262:413::-;18464:2;18446:21;;;18503:2;18483:18;;;18476:30;18542:34;18537:2;18522:18;;18515:62;-1:-1:-1;;;18608:2:1;18593:18;;18586:47;18665:3;18650:19;;18436:239::o;18680:409::-;18882:2;18864:21;;;18921:2;18901:18;;;18894:30;18960:34;18955:2;18940:18;;18933:62;-1:-1:-1;;;19026:2:1;19011:18;;19004:43;19079:3;19064:19;;18854:235::o;19094:415::-;19296:2;19278:21;;;19335:2;19315:18;;;19308:30;19374:34;19369:2;19354:18;;19347:62;-1:-1:-1;;;19440:2:1;19425:18;;19418:49;19499:3;19484:19;;19268:241::o;19514:177::-;19660:25;;;19648:2;19633:18;;19615:76::o;19696:667::-;19921:25;;;-1:-1:-1;;;;;20020:15:1;;;20015:2;20000:18;;19993:43;20072:3;20067:2;20052:18;;20045:31;;;20092:19;;20085:35;;;19696:667;;20113:6;20163;19973:3;20142:19;;20129:49;20198:22;;;20222:3;20194:32;;;20187:46;;;;20341:15;;;;20336:2;20321:18;;20314:43;20294:2;20273:15;;;-1:-1:-1;;20269:29:1;20254:45;;;20250:55;;19911:452;-1:-1:-1;;;19911:452:1:o;20368:128::-;;20439:1;20435:6;20432:1;20429:13;20426:2;;;20445:18;;:::i;:::-;-1:-1:-1;20481:9:1;;20416:80::o;20501:120::-;;20567:1;20557:2;;20572:18;;:::i;:::-;-1:-1:-1;20606:9:1;;20547:74::o;20626:168::-;;20732:1;20728;20724:6;20720:14;20717:1;20714:21;20709:1;20702:9;20695:17;20691:45;20688:2;;;20739:18;;:::i;:::-;-1:-1:-1;20779:9:1;;20678:116::o;20799:125::-;;20867:1;20864;20861:8;20858:2;;;20872:18;;:::i;:::-;-1:-1:-1;20909:9:1;;20848:76::o;20929:258::-;21001:1;21011:113;21025:6;21022:1;21019:13;21011:113;;;21101:11;;;21095:18;21082:11;;;21075:39;21047:2;21040:10;21011:113;;;21142:6;21139:1;21136:13;21133:2;;;-1:-1:-1;;21177:1:1;21159:16;;21152:27;20982:205::o;21192:380::-;21277:1;21267:12;;21324:1;21314:12;;;21335:2;;21389:4;21381:6;21377:17;21367:27;;21335:2;21442;21434:6;21431:14;21411:18;21408:38;21405:2;;;21488:10;21483:3;21479:20;21476:1;21469:31;21523:4;21520:1;21513:15;21551:4;21548:1;21541:15;21405:2;;21247:325;;;:::o;21577:135::-;;-1:-1:-1;;21637:17:1;;21634:2;;;21657:18;;:::i;:::-;-1:-1:-1;21704:1:1;21693:13;;21624:88::o;21717:112::-;;21775:1;21765:2;;21780:18;;:::i;:::-;-1:-1:-1;21814:9:1;;21755:74::o;21834:127::-;21895:10;21890:3;21886:20;21883:1;21876:31;21926:4;21923:1;21916:15;21950:4;21947:1;21940:15;21966:127;22027:10;22022:3;22018:20;22015:1;22008:31;22058:4;22055:1;22048:15;22082:4;22079:1;22072:15;22098:127;22159:10;22154:3;22150:20;22147:1;22140:31;22190:4;22187:1;22180:15;22214:4;22211:1;22204:15;22230:133;-1:-1:-1;;;;;22307:31:1;;22297:42;;22287:2;;22353:1;22350;22343:12;22368:133;-1:-1:-1;;;;;;22444:32:1;;22434:43;;22424:2;;22491:1;22488;22481:12

Swarm Source

ipfs://1cd19c0e961837a3bb41b903d036ab3a8dae592921aa6cf7c3f6cd721b0aaca7
Loading