Contract 0x06868079ff0E99177332669Aa984ce52e216B571 1

Contract Overview

Balance:
0 BNB
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xaa480723ca01a392376a8f01903ef3226243ed41560d750765824dd4b8a3f3b4Safe Transfer Fr...130487042021-10-08 14:56:0318 days 6 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00077837
0xa0a6bdf530a0d509fe33c8cc559ee649d012955e18e4ebef70e902af8cd0b26c0x672a9400130486672021-10-08 14:54:1218 days 6 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00283056
0x58f16df88cac3b66e0614e7fada884de6149a6878017643b904a1fc8a05805aeBurn129877342021-10-06 12:04:2820 days 9 hrs ago0x6bf7588c083d5496c659fff9aed6db4ace50512d IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00050003
0xacef97b2000b64353f6aba565264d8333ebad9f3ef93dc1a4b9d2db5be0375330x672a9400129873352021-10-06 11:44:3120 days 9 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00283044
0xed48e2b5a8ef88f8c32b0eba23567bcad678b441f1cae877ecc87be1a706f3e2Safe Transfer Fr...129768752021-10-06 3:01:3120 days 18 hrs ago0x6ea155ec34c9e09ac82c150f66fed996841b58fb IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00062837
0x9529967f11b1f946c023b43a21e85c723ee12d1edb46269d73d09ea517c104e90x672a9400129057902021-10-03 15:04:4623 days 6 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00283044
0x9fd99cd65ec0b58f4d4aefc478a46039001f8f04c8eb12741fdf129062d0b3e9Safe Transfer Fr...128222402021-09-30 17:22:4326 days 3 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00092837
0xe7f1bb1d65c2b2edb907e2ad43567e7ab1f956dbd3d03b031fa8c788564fa5d40x672a9400128221992021-09-30 17:20:4026 days 3 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00283056
0xe1e10a6353b25b11773250dfc1ea6f0b1cfacfea91fc271b8651860d660d19340x672a9400127811952021-09-29 6:46:3627 days 14 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00283056
0x8adfeedf79f684e1970c0b1367f3f8f582f223ad8b56bfec63cda54c02e5d3a90x672a9400127469262021-09-28 2:13:0428 days 19 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00283044
0xa111518dfbb1aef343012ac3651ec554f0d61a1b4801b66338fbd408fb73610c0x672a9400121874402021-09-08 12:34:0348 days 8 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00283056
0x6e5a47618c3baa780b9da4925958f2fe2f6366766e6a652c90008451116e5662Set Approval For...121844892021-09-08 10:06:3048 days 11 hrs ago0x26392d0f2488a89ed56fee2d91e5e9a012511cc2 IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00045306
0xd0514a697f7ee9bb7f3518ca06792cb959b5e3e57afb1ba0fde29accc624e6cdSafe Transfer Fr...121843722021-09-08 10:00:3948 days 11 hrs ago0x95c2bf569df546e09ec1290f86f836627be76028 IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00105713
0xf969586c7e45c48ecd929d450f2b2964ec0fe767c0e45244ae26a4fe7d421ca80x672a9400121795992021-09-08 6:00:3548 days 15 hrs ago0x77aad971973add0770c162c7958dfafdd10a2385 IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00283056
0x59af9299b4796594873e3df58871211164a6124e95b2df48391a39f514c0500aBurn121792162021-09-08 5:41:2648 days 15 hrs ago0x77aad971973add0770c162c7958dfafdd10a2385 IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00060639
0xa81bbb1710d6097d7a6198fb4d436394497600a613cae859c4179152d40e7b240x672a9400121792022021-09-08 5:40:4448 days 15 hrs ago0x77aad971973add0770c162c7958dfafdd10a2385 IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00283056
0xcd1601d8e098688d4cd5207fe5930a082c3a3dba7da254d8dc3c3461e619631e0x672a9400121787682021-09-08 5:19:0248 days 15 hrs ago0x77aad971973add0770c162c7958dfafdd10a2385 IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00283032
0xa3c8224b3e91fdddf8ec80f4e0a5fc386f8e57b50b3d693d3785f870dd6639910x672a9400121786272021-09-08 5:11:5948 days 16 hrs ago0x77aad971973add0770c162c7958dfafdd10a2385 IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.0003357
0x3f842b774dd30093b4ad484b8670b4e2180677882f3a1fda6fa5383334b4b1270x672a9400121767372021-09-08 3:37:2948 days 17 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00283056
0x16510ff6ac6572c06b57d1a71e3e5b56a3caed7e45652c7f6621e6855ebcc89e0x672a9400121759152021-09-08 2:56:2348 days 18 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00283044
0xa8adb16676d75cf4a366d0387926db039d8208cb3e31aa2de0bb12aaa46e9b2dSafe Transfer Fr...121757112021-09-08 2:46:1148 days 18 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00090708
0xa34102f989a87253ba5574d4439dd3e4574c785d1319fcae69622406e4d69324Burn121756562021-09-08 2:43:2648 days 18 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00054203
0xbc7de7239773dadef8f8a2438b1244681cfa6c1d05aef5a9add5a26a51428d04Safe Transfer Fr...121755022021-09-08 2:35:4448 days 18 hrs ago0x6bf7588c083d5496c659fff9aed6db4ace50512d IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00077837
0x1e7a9ae81c0d6f43b60816a1206d53435d19ca4a8ee53759dd568f568f3d62300x672a9400121743572021-09-08 1:38:2948 days 19 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.003216672
0xbaf577a6d49418fdb4e29fdafdf8e00ff10ba71b3b5d1a0adcc96e415e75ad5a0x672a9400121743282021-09-08 1:37:0248 days 19 hrs ago0x370725bc89eb33b517838feb875d3237b68f794b IN  0x06868079ff0e99177332669aa984ce52e216b5710 BNB0.00268056
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x597fe78c629f191fb3f5dc73219b3681501432d562815798b1e6ad25887a413c130487552021-10-08 14:58:3618 days 6 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0x597fe78c629f191fb3f5dc73219b3681501432d562815798b1e6ad25887a413c130487552021-10-08 14:58:3618 days 6 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0x597fe78c629f191fb3f5dc73219b3681501432d562815798b1e6ad25887a413c130487552021-10-08 14:58:3618 days 6 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0x597fe78c629f191fb3f5dc73219b3681501432d562815798b1e6ad25887a413c130487552021-10-08 14:58:3618 days 6 hrs ago 0xfcf7964a6a5adf94cea5a41caec7b9c2113de8b8 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0xf86f4ddc271e7ca0f6de8de2c5e2633ebb682224c0e0c59bb3876243e1df91d4129877182021-10-06 12:03:4020 days 9 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0xf86f4ddc271e7ca0f6de8de2c5e2633ebb682224c0e0c59bb3876243e1df91d4129877182021-10-06 12:03:4020 days 9 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0xf86f4ddc271e7ca0f6de8de2c5e2633ebb682224c0e0c59bb3876243e1df91d4129877182021-10-06 12:03:4020 days 9 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0xf86f4ddc271e7ca0f6de8de2c5e2633ebb682224c0e0c59bb3876243e1df91d4129877182021-10-06 12:03:4020 days 9 hrs ago 0xfcf7964a6a5adf94cea5a41caec7b9c2113de8b8 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0x006af8697dd282ef3ce2e29910788a3ab23ed4667daa508ded33dc69d1849d83129059992021-10-03 15:15:1323 days 6 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0x006af8697dd282ef3ce2e29910788a3ab23ed4667daa508ded33dc69d1849d83129059992021-10-03 15:15:1323 days 6 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0x006af8697dd282ef3ce2e29910788a3ab23ed4667daa508ded33dc69d1849d83129059992021-10-03 15:15:1323 days 6 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0x006af8697dd282ef3ce2e29910788a3ab23ed4667daa508ded33dc69d1849d83129059992021-10-03 15:15:1323 days 6 hrs ago 0xfcf7964a6a5adf94cea5a41caec7b9c2113de8b8 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0xf21dbe89b2b38ee1b7c16e7039e181bcbde689a643c1a12ac6e12c8783da9272129059372021-10-03 15:12:0723 days 6 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0xf21dbe89b2b38ee1b7c16e7039e181bcbde689a643c1a12ac6e12c8783da9272129059372021-10-03 15:12:0723 days 6 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0xf21dbe89b2b38ee1b7c16e7039e181bcbde689a643c1a12ac6e12c8783da9272129059372021-10-03 15:12:0723 days 6 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0xf21dbe89b2b38ee1b7c16e7039e181bcbde689a643c1a12ac6e12c8783da9272129059372021-10-03 15:12:0723 days 6 hrs ago 0xfcf7964a6a5adf94cea5a41caec7b9c2113de8b8 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0xba59f139c7149964b3d036679ddd5da1a2664e9a39c4e7fba077518d2597bf5e127816112021-09-29 7:07:2427 days 14 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0xba59f139c7149964b3d036679ddd5da1a2664e9a39c4e7fba077518d2597bf5e127816112021-09-29 7:07:2427 days 14 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0xba59f139c7149964b3d036679ddd5da1a2664e9a39c4e7fba077518d2597bf5e127816112021-09-29 7:07:2427 days 14 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0xba59f139c7149964b3d036679ddd5da1a2664e9a39c4e7fba077518d2597bf5e127816112021-09-29 7:07:2427 days 14 hrs ago 0xfcf7964a6a5adf94cea5a41caec7b9c2113de8b8 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0x9085d70522772275b5698aad930021808d86b489cccc1ed40a1bc33677dc5714127814292021-09-29 6:58:1827 days 14 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0x9085d70522772275b5698aad930021808d86b489cccc1ed40a1bc33677dc5714127814292021-09-29 6:58:1827 days 14 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0x9085d70522772275b5698aad930021808d86b489cccc1ed40a1bc33677dc5714127814292021-09-29 6:58:1827 days 14 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0x9085d70522772275b5698aad930021808d86b489cccc1ed40a1bc33677dc5714127814292021-09-29 6:58:1827 days 14 hrs ago 0xfcf7964a6a5adf94cea5a41caec7b9c2113de8b8 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
0xab4e7157bce0e249efc64e0f4f9f5d2d199cc38444a917453186afb0cf963561125486332021-09-21 4:16:2335 days 16 hrs ago 0x5ac050d2cc41db23a0cb180f34ccf618d78a1b76 0x06868079ff0e99177332669aa984ce52e216b5710 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MintableToken

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-06-28
*/

pragma solidity ^0.5.0;
pragma experimental ABIEncoderV2;

/*
 * @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 GSN 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.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor() internal {}

    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @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.
 *
 * 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.
 */
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() internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _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 onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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 onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/**
 * @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.
 */
contract IERC721 is IERC165 {
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Returns the number of NFTs in `owner`'s account.
     */
    function balanceOf(address owner) public view returns (uint256 balance);

    /**
     * @dev Returns the owner of the NFT specified by `tokenId`.
     */
    function ownerOf(uint256 tokenId) public view returns (address owner);

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     *
     *
     * Requirements:
     * - `from`, `to` cannot be zero.
     * - `tokenId` must be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this
     * NFT by either {approve} or {setApprovalForAll}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public;

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * Requirements:
     * - If the caller is not `from`, it must be approved to move this NFT by
     * either {approve} or {setApprovalForAll}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public;

    function approve(address to, uint256 tokenId) public;

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

    function setApprovalForAll(address operator, bool _approved) public;

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public;
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Metadata is IERC721 {
    function name() external view returns (string memory);

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

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

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a {IERC721-safeTransferFrom}. This function MUST return the function selector,
     * otherwise the caller will revert the transaction. The selector to be
     * returned can be obtained as `this.onERC721Received.selector`. This
     * function MAY throw to revert and reject the transfer.
     * Note: the ERC721 contract address is always the message sender.
     * @param operator The address which called `safeTransferFrom` function
     * @param from The address which previously owned the token
     * @param tokenId The NFT identifier which is being transferred
     * @param data Additional data with no specified format
     * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes memory data
    ) public returns (bytes4);
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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.
     *
     * _Available since v2.4.0._
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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.
     *
     * _Available since v2.4.0._
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash =
            0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account)
        internal
        pure
        returns (address payable)
    {
        return address(uint160(account));
    }

    /**
     * @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].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }
}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId)
        external
        view
        returns (bool)
    {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721 {
    using SafeMath for uint256;
    using Address for address;
    using Counters for Counters.Counter;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from token ID to owner
    mapping(uint256 => address) private _tokenOwner;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to number of owned token
    mapping(address => Counters.Counter) private _ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    constructor() public {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) public view returns (uint256) {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );

        return _ownedTokensCount[owner].current();
    }

    /**
     * @dev Gets the owner of the specified token ID.
     * @param tokenId uint256 ID of the token to query the owner of
     * @return address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _tokenOwner[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );

        return owner;
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) public {
        address owner = 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"
        );

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) public view returns (address) {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf.
     * @param to operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address to, bool approved) public {
        require(to != _msgSender(), "ERC721: approve to caller");

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

    /**
     * @dev Tells whether an operator is approved by a given owner.
     * @param owner owner address which you want to query the approval of
     * @param operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Transfers the ownership of a given token ID to another address.
     * Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     * Requires the msg.sender to be the owner, approved, or operator.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transferFrom(from, to, tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the _msgSender() to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal {
        _transferFrom(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether the specified token exists.
     * @param tokenId uint256 ID of the token to query the existence of
     * @return bool whether the token exists
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        address owner = _tokenOwner[tokenId];
        return owner != address(0);
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID.
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     * is an operator of the owner, or is the owner of the token
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    /**
     * @dev Internal function to safely mint a new token.
     * Reverts if the given token ID already exists.
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _safeMint(address to, uint256 tokenId) internal {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Internal function to safely mint a new token.
     * Reverts if the given token ID already exists.
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     * @param _data bytes data to send along with a safe transfer check
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to].increment();

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

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use {_burn} instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        require(
            ownerOf(tokenId) == owner,
            "ERC721: burn of token that is not own"
        );

        _clearApproval(tokenId);

        _ownedTokensCount[owner].decrement();
        _tokenOwner[tokenId] = address(0);

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

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(uint256 tokenId) internal {
        _burn(ownerOf(tokenId), tokenId);
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        require(
            ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _clearApproval(tokenId);

        _ownedTokensCount[from].decrement();
        _ownedTokensCount[to].increment();

        _tokenOwner[tokenId] = to;

        emit Transfer(from, 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.
     *
     * This is an internal detail of the `ERC721` contract and its use is deprecated.
     * @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
    ) internal returns (bool) {
        if (!to.isContract()) {
            return true;
        }
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) =
            to.call(
                abi.encodeWithSelector(
                    IERC721Receiver(to).onERC721Received.selector,
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            );
        if (!success) {
            if (returndata.length > 0) {
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert("ERC721: transfer to non ERC721Receiver implementer");
            }
        } else {
            bytes4 retval = abi.decode(returndata, (bytes4));
            return (retval == _ERC721_RECEIVED);
        }
    }

    /**
     * @dev Private function to clear current approval of a given token ID.
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }
}

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns a specific ERC721 token.
     * @param tokenId uint256 id of the ERC721 token to be burned.
     */
    function burn(uint256 tokenId) public {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721Burnable: caller is not owner nor approved"
        );
        _burn(tokenId);
    }
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Enumerable is IERC721 {
    function totalSupply() public view returns (uint256);

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

    function tokenByIndex(uint256 index) public view returns (uint256);
}

/**
 * @title ERC-721 Non-Fungible Token with optional enumeration extension logic
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Enumerable is Context, ERC165, ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    /**
     * @dev Constructor function.
     */
    constructor() public {
        // register the supported interface to conform to ERC721Enumerable via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @dev Gets the token ID at a given index of the tokens list of the requested owner.
     * @param owner address owning the tokens list to be accessed
     * @param index uint256 representing the index to be accessed of the requested tokens list
     * @return uint256 token ID at the given index of the tokens list owned by the requested address
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        returns (uint256)
    {
        require(
            index < balanceOf(owner),
            "ERC721Enumerable: owner index out of bounds"
        );
        return _ownedTokens[owner][index];
    }

    /**
     * @dev Gets the total amount of tokens stored by the contract.
     * @return uint256 representing the total amount of tokens
     */
    function totalSupply() public view returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev Gets the token ID at a given index of all the tokens in this contract
     * Reverts if the index is greater or equal to the total number of tokens.
     * @param index uint256 representing the index to be accessed of the tokens list
     * @return uint256 token ID at the given index of the tokens list
     */
    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(
            index < totalSupply(),
            "ERC721Enumerable: global index out of bounds"
        );
        return _allTokens[index];
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to transferFrom, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        super._transferFrom(from, to, tokenId);

        _removeTokenFromOwnerEnumeration(from, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to address the beneficiary that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        super._mint(to, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);

        _addTokenToAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use {ERC721-_burn} instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        _removeTokenFromOwnerEnumeration(owner, tokenId);
        // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund
        _ownedTokensIndex[tokenId] = 0;

        _removeTokenFromAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Gets the list of token IDs of the requested owner.
     * @param owner address owning the tokens
     * @return uint256[] List of token IDs owned by the requested address
     */
    function _tokensOfOwner(address owner)
        internal
        view
        returns (uint256[] storage)
    {
        return _ownedTokens[owner];
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        _ownedTokensIndex[tokenId] = _ownedTokens[to].length;
        _ownedTokens[to].push(tokenId);
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)
        private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        _ownedTokens[from].length--;

        // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by
        // lastTokenId, or just over the end of the array if the token was the last one).
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length.sub(1);
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        _allTokens.length--;
        _allTokensIndex[tokenId] = 0;
    }
}

library UintLibrary {
    function toString(uint256 _i) internal pure returns (string memory) {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len - 1;
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + (_i % 10)));
            _i /= 10;
        }
        return string(bstr);
    }
}

library StringLibrary {
    using UintLibrary for uint256;

    function append(string memory _a, string memory _b)
        internal
        pure
        returns (string memory)
    {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory bab = new bytes(_ba.length + _bb.length);
        uint256 k = 0;
        for (uint256 i = 0; i < _ba.length; i++) bab[k++] = _ba[i];
        for (uint256 i = 0; i < _bb.length; i++) bab[k++] = _bb[i];
        return string(bab);
    }

    function append(
        string memory _a,
        string memory _b,
        string memory _c
    ) internal pure returns (string memory) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory bbb = new bytes(_ba.length + _bb.length + _bc.length);
        uint256 k = 0;
        for (uint256 i = 0; i < _ba.length; i++) bbb[k++] = _ba[i];
        for (uint256 i = 0; i < _bb.length; i++) bbb[k++] = _bb[i];
        for (uint256 i = 0; i < _bc.length; i++) bbb[k++] = _bc[i];
        return string(bbb);
    }

    function recover(
        string memory message,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        bytes memory msgBytes = bytes(message);
        bytes memory fullMessage =
            concat(
                bytes("\x19Ethereum Signed Message:\n"),
                bytes(msgBytes.length.toString()),
                msgBytes,
                new bytes(0),
                new bytes(0),
                new bytes(0),
                new bytes(0)
            );
        return ecrecover(keccak256(fullMessage), v, r, s);
    }

    function concat(
        bytes memory _ba,
        bytes memory _bb,
        bytes memory _bc,
        bytes memory _bd,
        bytes memory _be,
        bytes memory _bf,
        bytes memory _bg
    ) internal pure returns (bytes memory) {
        bytes memory resultBytes =
            new bytes(
                _ba.length +
                    _bb.length +
                    _bc.length +
                    _bd.length +
                    _be.length +
                    _bf.length +
                    _bg.length
            );
        uint256 k = 0;
        for (uint256 i = 0; i < _ba.length; i++) resultBytes[k++] = _ba[i];
        for (uint256 i = 0; i < _bb.length; i++) resultBytes[k++] = _bb[i];
        for (uint256 i = 0; i < _bc.length; i++) resultBytes[k++] = _bc[i];
        for (uint256 i = 0; i < _bd.length; i++) resultBytes[k++] = _bd[i];
        for (uint256 i = 0; i < _be.length; i++) resultBytes[k++] = _be[i];
        for (uint256 i = 0; i < _bf.length; i++) resultBytes[k++] = _bf[i];
        for (uint256 i = 0; i < _bg.length; i++) resultBytes[k++] = _bg[i];
        return resultBytes;
    }
}

contract HasContractURI is ERC165 {
    string public contractURI;

    /*
     * bytes4(keccak256('contractURI()')) == 0xe8a3d485
     */
    bytes4 private constant _INTERFACE_ID_CONTRACT_URI = 0xe8a3d485;

    constructor(string memory _contractURI) public {
        contractURI = _contractURI;
        _registerInterface(_INTERFACE_ID_CONTRACT_URI);
    }

    /**
     * @dev Internal function to set the contract URI
     * @param _contractURI string URI prefix to assign
     */
    function _setContractURI(string memory _contractURI) internal {
        contractURI = _contractURI;
    }
}

contract HasTokenURI {
    using StringLibrary for string;

    //Token URI prefix
    string public tokenURIPrefix;

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

    constructor(string memory _tokenURIPrefix) public {
        tokenURIPrefix = _tokenURIPrefix;
    }

    /**
     * @dev Returns an URI for a given token ID.
     * Throws if the token ID does not exist. May return an empty string.
     * @param tokenId uint256 ID of the token to query
     */
    function _tokenURI(uint256 tokenId) internal view returns (string memory) {
        return tokenURIPrefix.append(_tokenURIs[tokenId]);
    }

    /**
     * @dev Internal function to set the token URI for a given token.
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to set its URI
     * @param uri string URI to assign
     */
    function _setTokenURI(uint256 tokenId, string memory uri) internal {
        _tokenURIs[tokenId] = uri;
    }

    /**
     * @dev Internal function to set the token URI prefix.
     * @param _tokenURIPrefix string URI prefix to assign
     */
    function _setTokenURIPrefix(string memory _tokenURIPrefix) internal {
        tokenURIPrefix = _tokenURIPrefix;
    }

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

contract HasSecondarySaleFees is ERC165 {
    event SecondarySaleFees(
        uint256 tokenId,
        address[] recipients,
        uint256[] bps
    );

    /*
     * bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f
     * bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb
     *
     * => 0x0ebd4c7f ^ 0xb9c4d9fb == 0xb7799584
     */
    bytes4 private constant _INTERFACE_ID_FEES = 0xb7799584;

    constructor() public {
        _registerInterface(_INTERFACE_ID_FEES);
    }

    function getFeeRecipients(uint256 id)
        public
        view
        returns (address payable[] memory);

    function getFeeBps(uint256 id) public view returns (uint256[] memory);
}

/**
 * @title Full ERC721 Token with support for tokenURIPrefix
 * This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Base is
    HasSecondarySaleFees,
    ERC721,
    HasContractURI,
    HasTokenURI,
    ERC721Enumerable
{
    // Token name
    string public name;

    // Token symbol
    string public symbol;

    struct Fee {
        address payable recipient;
        uint256 value;
    }

    // id => fees
    mapping(uint256 => Fee[]) public fees;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /**
     * @dev Constructor function
     */
    constructor(
        string memory _name,
        string memory _symbol,
        string memory contractURI,
        string memory _tokenURIPrefix
    ) public HasContractURI(contractURI) HasTokenURI(_tokenURIPrefix) {
        name = _name;
        symbol = _symbol;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
    }

    function getFeeRecipients(uint256 id)
        public
        view
        returns (address payable[] memory)
    {
        Fee[] memory _fees = fees[id];
        address payable[] memory result = new address payable[](_fees.length);
        for (uint256 i = 0; i < _fees.length; i++) {
            result[i] = _fees[i].recipient;
        }
        return result;
    }

    function getFeeBps(uint256 id) public view returns (uint256[] memory) {
        Fee[] memory _fees = fees[id];
        uint256[] memory result = new uint256[](_fees.length);
        for (uint256 i = 0; i < _fees.length; i++) {
            result[i] = _fees[i].value;
        }
        return result;
    }

    function _mint(
        address to,
        uint256 tokenId,
        Fee[] memory _fees
    ) internal {
        _mint(to, tokenId);
        address[] memory recipients = new address[](_fees.length);
        uint256[] memory bps = new uint256[](_fees.length);
        for (uint256 i = 0; i < _fees.length; i++) {
            require(
                _fees[i].recipient != address(0x0),
                "Recipient should be present"
            );
            require(_fees[i].value != 0, "Fee value should be positive");
            fees[tokenId].push(_fees[i]);
            recipients[i] = _fees[i].recipient;
            bps[i] = _fees[i].value;
        }
        if (_fees.length > 0) {
            emit SecondarySaleFees(tokenId, recipients, bps);
        }
    }

    /**
     * @dev Returns an URI for a given token ID.
     * Throws if the token ID does not exist. May return an empty string.
     * @param tokenId uint256 ID of the token to query
     */
    function tokenURI(uint256 tokenId) external view returns (string memory) {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        return super._tokenURI(tokenId);
    }

    /**
     * @dev Internal function to set the token URI for a given token.
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to set its URI
     * @param uri string URI to assign
     */
    function _setTokenURI(uint256 tokenId, string memory uri) internal {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI set of nonexistent token"
        );
        super._setTokenURI(tokenId, uri);
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use _burn(uint256) instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned by the msg.sender
     */
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);
        _clearTokenURI(tokenId);
    }
}

/**
 * @title MintableToken
 * @dev anyone can mint token.
 */
contract MintableToken is
    Ownable,
    IERC721,
    IERC721Metadata,
    ERC721Burnable,
    ERC721Base
{
    constructor(
        string memory name,
        string memory symbol,
        address newOwner,
        string memory contractURI,
        string memory tokenURIPrefix
    ) public ERC721Base(name, symbol, contractURI, tokenURIPrefix) {
        _registerInterface(bytes4(keccak256("MINT_WITH_ADDRESS")));
        transferOwnership(newOwner);
    }

    function mint(
        uint256 tokenId,
        uint8 v,
        bytes32 r,
        bytes32 s,
        Fee[] memory _fees,
        string memory tokenURI
    ) public {
        require(
            owner() ==
                ecrecover(keccak256(abi.encodePacked(this, tokenId)), v, r, s),
            "owner should sign tokenId"
        );
        _mint(msg.sender, tokenId, _fees);
        _setTokenURI(tokenId, tokenURI);
    }

    function setTokenURIPrefix(string memory tokenURIPrefix) public onlyOwner {
        _setTokenURIPrefix(tokenURIPrefix);
    }

    function setContractURI(string memory contractURI) public onlyOwner {
        _setContractURI(contractURI);
    }
}

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"string","name":"contractURI","type":"string"},{"internalType":"string","name":"tokenURIPrefix","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"recipients","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"name":"SecondarySaleFees","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"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"fees","outputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"components":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct ERC721Base.Fee[]","name":"_fees","type":"tuple[]"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"contractURI","type":"string"}],"name":"setContractURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"tokenURIPrefix","type":"string"}],"name":"setTokenURIPrefix","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenURIPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200355f3803806200355f833981016040819052620000349162000431565b84848383808260006200004f6001600160e01b03620001d216565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350916000805160206200353f833981519152908290a350620000a36301ffc9a760e01b6001600160e01b03620001d716565b620000be632dde656160e21b6001600160e01b03620001d716565b620000d96380ac58cd60e01b6001600160e01b03620001d716565b8051620000ee90600690602084019062000320565b506200010a63e8a3d48560e01b6001600160e01b03620001d716565b5080516200012090600790602084019062000320565b506200013e905063780e9d6360e01b6001600160e01b03620001d716565b83516200015390600d90602087019062000320565b5082516200016990600e90602086019062000320565b5062000185635b5e139f60e01b6001600160e01b03620001d716565b50505050620001b36040516200019b90620005ff565b6040519081900390206001600160e01b03620001d716565b620001c7836001600160e01b036200023516565b5050505050620006fb565b335b90565b6001600160e01b031980821614156200020d5760405162461bcd60e51b815260040162000204906200061e565b60405180910390fd5b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b620002486001600160e01b036200027e16565b620002675760405162461bcd60e51b8152600401620002049062000630565b6200027b816001600160e01b03620002ad16565b50565b600080546001600160a01b03166200029e6001600160e01b03620001d216565b6001600160a01b031614905090565b6001600160a01b038116620002d65760405162461bcd60e51b815260040162000204906200060c565b600080546040516001600160a01b03808516939216916000805160206200353f83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200036357805160ff191683800117855562000393565b8280016001018555821562000393579182015b828111156200039357825182559160200191906001019062000376565b50620003a1929150620003a5565b5090565b620001d491905b80821115620003a15760008155600101620003ac565b8051620003cf81620006e4565b92915050565b600082601f830112620003e757600080fd5b8151620003fe620003f88262000669565b62000642565b915080825260208301602083018583830111156200041b57600080fd5b62000428838284620006b1565b50505092915050565b600080600080600060a086880312156200044a57600080fd5b85516001600160401b038111156200046157600080fd5b6200046f88828901620003d5565b95505060208601516001600160401b038111156200048c57600080fd5b6200049a88828901620003d5565b9450506040620004ad88828901620003c2565b93505060608601516001600160401b03811115620004ca57600080fd5b620004d888828901620003d5565b92505060808601516001600160401b03811115620004f557600080fd5b6200050388828901620003d5565b9150509295509295909350565b60006200051f60268362000691565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600062000569601c8362000691565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000815260200192915050565b6000620005a460208362000691565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000620005df6011836200069a565b704d494e545f574954485f4144445245535360781b815260110192915050565b6000620003cf82620005d0565b60208082528101620003cf8162000510565b60208082528101620003cf816200055a565b60208082528101620003cf8162000595565b6040518181016001600160401b03811182821017156200066157600080fd5b604052919050565b60006001600160401b038211156200068057600080fd5b506020601f91909101601f19160190565b90815260200190565b919050565b60006001600160a01b038216620003cf565b60005b83811015620006ce578181015183820152602001620006b4565b83811115620006de576000848401525b50505050565b620006ef816200069f565b81146200027b57600080fd5b612e34806200070b6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063a22cb465116100a2578063c87b56dd11610071578063c87b56dd146103c9578063e8a3d485146103dc578063e985e9c5146103e4578063f2fde38b146103f7576101cf565b8063a22cb4651461037b578063b88d4fde1461038e578063b9c4d9fb146103a1578063c0ac9983146103c1576101cf565b80638f32d59b116100de5780638f32d59b14610345578063938e3d7b1461034d57806395d89b411461036057806399e0dd7c14610368576101cf565b806370a0823114610322578063715018a6146103355780638da5cb5b1461033d576101cf565b80632f745c59116101715780634f6ccce71161014b5780634f6ccce7146102c85780636308f1cd146102db5780636352211e146102fc578063672a94001461030f576101cf565b80632f745c591461028f57806342842e0e146102a257806342966c68146102b5576101cf565b8063095ea7b3116101ad578063095ea7b3146102325780630ebd4c7f1461024757806318160ddd1461026757806323b872dd1461027c576101cf565b806301ffc9a7146101d457806306fdde03146101fd578063081812fc14610212575b600080fd5b6101e76101e2366004611fda565b61040a565b6040516101f49190612a7f565b60405180910390f35b610205610429565b6040516101f49190612acb565b61022561022036600461204b565b6104b7565b6040516101f491906129f0565b610245610240366004611faa565b610503565b005b61025a61025536600461204b565b6105e8565b6040516101f49190612a6e565b61026f6106db565b6040516101f49190612c5c565b61024561028a366004611eb4565b6106e2565b61026f61029d366004611faa565b61071f565b6102456102b0366004611eb4565b610780565b6102456102c336600461204b565b61079b565b61026f6102d636600461204b565b6107ce565b6102ee6102e9366004612069565b610815565b6040516101f4929190612a42565b61022561030a36600461204b565b610858565b61024561031d366004612088565b61088d565b61026f610330366004611e5c565b610958565b6102456109a1565b610225610a0f565b6101e7610a1e565b61024561035b366004612016565b610a42565b610205610a6f565b610245610376366004612016565b610aca565b610245610389366004611f7a565b610af7565b61024561039c366004611f01565b610bc5565b6103b46103af36600461204b565b610c04565b6040516101f49190612a5d565b610205610cfc565b6102056103d736600461204b565b610d57565b610205610d87565b6101e76103f2366004611e7a565b610de2565b610245610405366004611e5c565b610e10565b6001600160e01b03191660009081526001602052604090205460ff1690565b600d805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104af5780601f10610484576101008083540402835291602001916104af565b820191906000526020600020905b81548152906001019060200180831161049257829003601f168201915b505050505081565b60006104c282610e3d565b6104e75760405162461bcd60e51b81526004016104de90612bac565b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b600061050e82610858565b9050806001600160a01b0316836001600160a01b031614156105425760405162461bcd60e51b81526004016104de90612bfc565b806001600160a01b0316610554610e5a565b6001600160a01b031614806105705750610570816103f2610e5a565b61058c5760405162461bcd60e51b81526004016104de90612b6c565b60008281526003602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600f602090815260408083208054825181850281018501909352808352606094859484015b8282101561065a576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101610612565b5050505090506060815160405190808252806020026020018201604052801561068d578160200160208202803883390190505b50905060005b82518110156106d3578281815181106106a857fe5b6020026020010151602001518282815181106106c057fe5b6020908102919091010152600101610693565b509392505050565b600b545b90565b6106f36106ed610e5a565b82610e5e565b61070f5760405162461bcd60e51b81526004016104de90612c0c565b61071a838383610ee3565b505050565b600061072a83610958565b82106107485760405162461bcd60e51b81526004016104de90612aec565b6001600160a01b038316600090815260096020526040902080548390811061076c57fe5b906000526020600020015490505b92915050565b61071a83838360405180602001604052806000815250610bc5565b6107a66106ed610e5a565b6107c25760405162461bcd60e51b81526004016104de90612c4c565b6107cb81610f02565b50565b60006107d86106db565b82106107f65760405162461bcd60e51b81526004016104de90612c1c565b600b828154811061080357fe5b90600052602060002001549050919050565b600f602052816000526040600020818154811061082e57fe5b6000918252602090912060029091020180546001909101546001600160a01b039091169250905082565b6000818152600260205260408120546001600160a01b03168061077a5760405162461bcd60e51b81526004016104de90612b8c565b600130876040516020016108a29291906129ca565b60405160208183030381529060405280519060200120868686604051600081526020016040526040516108d89493929190612a8d565b6020604051602081039080840390855afa1580156108fa573d6000803e3d6000fd5b505050602060405103516001600160a01b0316610915610a0f565b6001600160a01b03161461093b5760405162461bcd60e51b81526004016104de90612b5c565b610946338784610f14565b6109508682611139565b505050505050565b60006001600160a01b0382166109805760405162461bcd60e51b81526004016104de90612b7c565b6001600160a01b038216600090815260046020526040902061077a9061116c565b6109a9610a1e565b6109c55760405162461bcd60e51b81526004016104de90612bcc565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b600080546001600160a01b0316610a33610e5a565b6001600160a01b031614905090565b610a4a610a1e565b610a665760405162461bcd60e51b81526004016104de90612bcc565b6107cb81611170565b600e805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104af5780601f10610484576101008083540402835291602001916104af565b610ad2610a1e565b610aee5760405162461bcd60e51b81526004016104de90612bcc565b6107cb81611183565b610aff610e5a565b6001600160a01b0316826001600160a01b03161415610b305760405162461bcd60e51b81526004016104de90612b3c565b8060056000610b3d610e5a565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610b81610e5a565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610bb99190612a7f565b60405180910390a35050565b610bd6610bd0610e5a565b83610e5e565b610bf25760405162461bcd60e51b81526004016104de90612c0c565b610bfe84848484611196565b50505050565b6000818152600f602090815260408083208054825181850281018501909352808352606094859484015b82821015610c76576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101610c2e565b50505050905060608151604051908082528060200260200182016040528015610ca9578160200160208202803883390190505b50905060005b82518110156106d357828181518110610cc457fe5b602002602001015160000151828281518110610cdc57fe5b6001600160a01b0390921660209283029190910190910152600101610caf565b6007805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104af5780601f10610484576101008083540402835291602001916104af565b6060610d6282610e3d565b610d7e5760405162461bcd60e51b81526004016104de90612bec565b61077a826111c9565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104af5780601f10610484576101008083540402835291602001916104af565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610e18610a1e565b610e345760405162461bcd60e51b81526004016104de90612bcc565b6107cb81611304565b6000908152600260205260409020546001600160a01b0316151590565b3390565b6000610e6982610e3d565b610e855760405162461bcd60e51b81526004016104de90612b4c565b6000610e9083610858565b9050806001600160a01b0316846001600160a01b03161480610ecb5750836001600160a01b0316610ec0846104b7565b6001600160a01b0316145b80610edb5750610edb8185610de2565b949350505050565b610eee838383611385565b610ef8838261148b565b61071a8282611579565b6107cb610f0e82610858565b826115b7565b610f1e83836115ca565b60608151604051908082528060200260200182016040528015610f4b578160200160208202803883390190505b50905060608251604051908082528060200260200182016040528015610f7b578160200160208202803883390190505b50905060005b83518110156110ee5760006001600160a01b0316848281518110610fa157fe5b6020026020010151600001516001600160a01b03161415610fd45760405162461bcd60e51b81526004016104de90612c3c565b838181518110610fe057fe5b6020026020010151602001516000141561100c5760405162461bcd60e51b81526004016104de90612adc565b6000858152600f60205260409020845185908390811061102857fe5b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b03909216919091178155910151910155835184908290811061107f57fe5b60200260200101516000015183828151811061109757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508381815181106110c357fe5b6020026020010151602001518282815181106110db57fe5b6020908102919091010152600101610f81565b50825115611132577f99aba1d63749cfd5ad1afda7c4663840924d54eb5f005bbbeadedc6ec13674b284838360405161112993929190612c6a565b60405180910390a15b5050505050565b61114282610e3d565b61115e5760405162461bcd60e51b81526004016104de90612bbc565b61116882826115e7565b5050565b5490565b8051611168906006906020840190611c07565b8051611168906007906020840190611c07565b6111a1848484610ee3565b6111ad84848484611606565b610bfe5760405162461bcd60e51b81526004016104de90612afc565b6000818152600860209081526040918290208054835160026001831615610100026000190190921691909104601f810184900484028201840190945283815260609361077a939192918301828280156112635780601f1061123857610100808354040283529160200191611263565b820191906000526020600020905b81548152906001019060200180831161124657829003601f168201915b505060078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152955091935091508301828280156112f15780601f106112c6576101008083540402835291602001916112f1565b820191906000526020600020905b8154815290600101906020018083116112d457829003601f168201915b505050505061174090919063ffffffff16565b6001600160a01b03811661132a5760405162461bcd60e51b81526004016104de90612b0c565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b826001600160a01b031661139882610858565b6001600160a01b0316146113be5760405162461bcd60e51b81526004016104de90612bdc565b6001600160a01b0382166113e45760405162461bcd60e51b81526004016104de90612b2c565b6113ed81611835565b6001600160a01b038316600090815260046020526040902061140e90611870565b6001600160a01b038216600090815260046020526040902061142f90611887565b60008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152600960205260408120546114b590600163ffffffff61189016565b6000838152600a6020526040902054909150808214611550576001600160a01b03841660009081526009602052604081208054849081106114f257fe5b906000526020600020015490508060096000876001600160a01b03166001600160a01b03168152602001908152602001600020838154811061153057fe5b6000918252602080832090910192909255918252600a9052604090208190555b6001600160a01b0384166000908152600960205260409020805490611132906000198301611c85565b6001600160a01b0390911660009081526009602081815260408084208054868652600a84529185208290559282526001810183559183529091200155565b6115c182826118d9565b61116881611905565b6115d48282611943565b6115de8282611579565b61116881611a0a565b6000828152600860209081526040909120825161071a92840190611c07565b600061161a846001600160a01b0316611a4e565b61162657506001610edb565b600060606001600160a01b038616630a85bd0160e11b611644610e5a565b89888860405160240161165a94939291906129fe565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161169891906129be565b6000604051808303816000865af19150503d80600081146116d5576040519150601f19603f3d011682016040523d82523d6000602084013e6116da565b606091505b50915091508161170c578051156116f45780518082602001fd5b60405162461bcd60e51b81526004016104de90612afc565b6000818060200190516117229190810190611ff8565b6001600160e01b031916630a85bd0160e11b149350610edb92505050565b6060808390506060839050606081518351016040519080825280601f01601f19166020018201604052801561177c576020820181803883390190505b5090506000805b84518110156117d45784818151811061179857fe5b602001015160f81c60f81b8383806001019450815181106117b557fe5b60200101906001600160f81b031916908160001a905350600101611783565b5060005b8351811015611829578381815181106117ed57fe5b602001015160f81c60f81b83838060010194508151811061180a57fe5b60200101906001600160f81b031916908160001a9053506001016117d8565b50909695505050505050565b6000818152600360205260409020546001600160a01b0316156107cb57600090815260036020526040902080546001600160a01b0319169055565b805461188390600163ffffffff61189016565b9055565b80546001019055565b60006118d283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611a87565b9392505050565b6118e38282611ab3565b6118ed828261148b565b6000818152600a602052604081205561116881611b6b565b60008181526008602052604090205460026000196101006001841615020190911604156107cb5760008181526008602052604081206107cb91611ca9565b6001600160a01b0382166119695760405162461bcd60e51b81526004016104de90612b9c565b61197281610e3d565b1561198f5760405162461bcd60e51b81526004016104de90612b1c565b600081815260026020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558352600490915290206119ce90611887565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600b80546000838152600c60205260408120829055600182018355919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610edb575050151592915050565b60008184841115611aab5760405162461bcd60e51b81526004016104de9190612acb565b505050900390565b816001600160a01b0316611ac682610858565b6001600160a01b031614611aec5760405162461bcd60e51b81526004016104de90612c2c565b611af581611835565b6001600160a01b0382166000908152600460205260409020611b1690611870565b60008181526002602052604080822080546001600160a01b0319169055518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600b54600090611b8290600163ffffffff61189016565b6000838152600c6020526040812054600b8054939450909284908110611ba457fe5b9060005260206000200154905080600b8381548110611bbf57fe5b6000918252602080832090910192909255828152600c90915260409020829055600b805490611bf2906000198301611c85565b505050600091825250600c6020526040812055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611c4857805160ff1916838001178555611c75565b82800160010185558215611c75579182015b82811115611c75578251825591602001919060010190611c5a565b50611c81929150611ce9565b5090565b81548183558181111561071a5760008381526020902061071a918101908301611ce9565b50805460018160011615610100020316600290046000825580601f10611ccf57506107cb565b601f0160209004906000526020600020908101906107cb91905b6106df91905b80821115611c815760008155600101611cef565b803561077a81612db9565b600082601f830112611d1f57600080fd5b8135611d32611d2d82612cc5565b612c9e565b91508181835260208401935060208101905083856040840282011115611d5757600080fd5b60005b83811015611d855781611d6d8882611e0a565b84525060209092019160409190910190600101611d5a565b5050505092915050565b803561077a81612dcd565b803561077a81612dd6565b803561077a81612ddf565b805161077a81612ddf565b600082601f830112611dcc57600080fd5b8135611dda611d2d82612ce6565b91508082526020830160208301858383011115611df657600080fd5b611e01838284612d60565b50505092915050565b600060408284031215611e1c57600080fd5b611e266040612c9e565b90506000611e348484611d03565b8252506020611e4584848301611d9a565b60208301525092915050565b803561077a81612de8565b600060208284031215611e6e57600080fd5b6000610edb8484611d03565b60008060408385031215611e8d57600080fd5b6000611e998585611d03565b9250506020611eaa85828601611d03565b9150509250929050565b600080600060608486031215611ec957600080fd5b6000611ed58686611d03565b9350506020611ee686828701611d03565b9250506040611ef786828701611d9a565b9150509250925092565b60008060008060808587031215611f1757600080fd5b6000611f238787611d03565b9450506020611f3487828801611d03565b9350506040611f4587828801611d9a565b925050606085013567ffffffffffffffff811115611f6257600080fd5b611f6e87828801611dbb565b91505092959194509250565b60008060408385031215611f8d57600080fd5b6000611f998585611d03565b9250506020611eaa85828601611d8f565b60008060408385031215611fbd57600080fd5b6000611fc98585611d03565b9250506020611eaa85828601611d9a565b600060208284031215611fec57600080fd5b6000610edb8484611da5565b60006020828403121561200a57600080fd5b6000610edb8484611db0565b60006020828403121561202857600080fd5b813567ffffffffffffffff81111561203f57600080fd5b610edb84828501611dbb565b60006020828403121561205d57600080fd5b6000610edb8484611d9a565b6000806040838503121561207c57600080fd5b6000611fc98585611d9a565b60008060008060008060c087890312156120a157600080fd5b60006120ad8989611d9a565b96505060206120be89828a01611e51565b95505060406120cf89828a01611d9a565b94505060606120e089828a01611d9a565b935050608087013567ffffffffffffffff8111156120fd57600080fd5b61210989828a01611d0e565b92505060a087013567ffffffffffffffff81111561212657600080fd5b61213289828a01611dbb565b9150509295509295509295565b600061214b838361215f565b505060200190565b600061214b838361226c565b61216881612d26565b82525050565b600061217982612d14565b6121838185612d18565b935061218e83612d0e565b8060005b838110156121bc5781516121a6888261213f565b97506121b183612d0e565b925050600101612192565b509495945050505050565b60006121d282612d14565b6121dc8185612d18565b93506121e783612d0e565b8060005b838110156121bc5781516121ff888261213f565b975061220a83612d0e565b9250506001016121eb565b600061222082612d14565b61222a8185612d18565b935061223583612d0e565b8060005b838110156121bc57815161224d8882612153565b975061225883612d0e565b925050600101612239565b61216881612d31565b612168816106df565b600061228082612d14565b61228a8185612d18565b935061229a818560208601612d6c565b6122a381612da9565b9093019392505050565b60006122b882612d14565b6122c28185612d21565b93506122d2818560208601612d6c565b9290920192915050565b6121686122e882612d55565b612d98565b60006122fa601c83612d18565b7f4665652076616c75652073686f756c6420626520706f73697469766500000000815260200192915050565b6000612333602b83612d18565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7581526a74206f6620626f756e647360a81b602082015260400192915050565b6000612380603283612d18565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526581527131b2b4bb32b91034b6b83632b6b2b73a32b960711b602082015260400192915050565b60006123d4602683612d18565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061241c601c83612d18565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000815260200192915050565b6000612455602483612d18565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164648152637265737360e01b602082015260400192915050565b600061249b601983612d18565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000815260200192915050565b60006124d4602c83612d18565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657881526b34b9ba32b73a103a37b5b2b760a11b602082015260400192915050565b6000612522601983612d18565b7f6f776e65722073686f756c64207369676e20746f6b656e496400000000000000815260200192915050565b600061255b603883612d18565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7781527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015260400192915050565b60006125ba602a83612d18565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a65815269726f206164647265737360b01b602082015260400192915050565b6000612606602983612d18565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737481526832b73a103a37b5b2b760b91b602082015260400192915050565b6000612651602083612d18565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373815260200192915050565b600061268a602c83612d18565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657881526b34b9ba32b73a103a37b5b2b760a11b602082015260400192915050565b60006126d8602c83612d18565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e657881526b34b9ba32b73a103a37b5b2b760a11b602082015260400192915050565b6000612726602083612d18565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b600061275f602983612d18565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206981526839903737ba1037bbb760b91b602082015260400192915050565b60006127aa602f83612d18565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f81526e3732bc34b9ba32b73a103a37b5b2b760891b602082015260400192915050565b60006127fb602183612d18565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e658152603960f91b602082015260400192915050565b600061283e603183612d18565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f8152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b602082015260400192915050565b6000612891602c83612d18565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f81526b7574206f6620626f756e647360a01b602082015260400192915050565b60006128df602583612d18565b7f4552433732313a206275726e206f6620746f6b656e2074686174206973206e6f8152643a1037bbb760d91b602082015260400192915050565b6000612926601b83612d18565b7f526563697069656e742073686f756c642062652070726573656e740000000000815260200192915050565b600061295f603083612d18565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7781526f1b995c881b9bdc88185c1c1c9bdd995960821b602082015260400192915050565b6121686129b0826106df565b6106df565b61216881612d4f565b60006118d282846122ad565b60006129d682856122dc565b6014820191506129e682846129a4565b5060200192915050565b6020810161077a828461215f565b60808101612a0c828761215f565b612a19602083018661215f565b612a26604083018561226c565b8181036060830152612a388184612275565b9695505050505050565b60408101612a50828561215f565b6118d2602083018461226c565b602080825281016118d281846121c7565b602080825281016118d28184612215565b6020810161077a8284612263565b60808101612a9b828761226c565b612aa860208301866129b5565b612ab5604083018561226c565b612ac2606083018461226c565b95945050505050565b602080825281016118d28184612275565b6020808252810161077a816122ed565b6020808252810161077a81612326565b6020808252810161077a81612373565b6020808252810161077a816123c7565b6020808252810161077a8161240f565b6020808252810161077a81612448565b6020808252810161077a8161248e565b6020808252810161077a816124c7565b6020808252810161077a81612515565b6020808252810161077a8161254e565b6020808252810161077a816125ad565b6020808252810161077a816125f9565b6020808252810161077a81612644565b6020808252810161077a8161267d565b6020808252810161077a816126cb565b6020808252810161077a81612719565b6020808252810161077a81612752565b6020808252810161077a8161279d565b6020808252810161077a816127ee565b6020808252810161077a81612831565b6020808252810161077a81612884565b6020808252810161077a816128d2565b6020808252810161077a81612919565b6020808252810161077a81612952565b6020810161077a828461226c565b60608101612c78828661226c565b8181036020830152612c8a818561216e565b90508181036040830152612ac28184612215565b60405181810167ffffffffffffffff81118282101715612cbd57600080fd5b604052919050565b600067ffffffffffffffff821115612cdc57600080fd5b5060209081020190565b600067ffffffffffffffff821115612cfd57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b919050565b600061077a82612d43565b151590565b6001600160e01b03191690565b6001600160a01b031690565b60ff1690565b600061077a82612d26565b82818337506000910152565b60005b83811015612d87578181015183820152602001612d6f565b83811115610bfe5750506000910152565b600061077a82600061077a82612db3565b601f01601f191690565b60601b90565b612dc281612d26565b81146107cb57600080fd5b612dc281612d31565b612dc2816106df565b612dc281612d36565b612dc281612d4f56fea365627a7a72315820a5b22d946070f04c000b73386751482c859a122115fd179cadf269b4c6cfd11d6c6578706572696d656e74616cf564736f6c634300051100408be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000d6e323d7215ea5349a7b83ca3c4b415993fef96000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000f546f6b656e706c617920546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003544f50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000d6e323d7215ea5349a7b83ca3c4b415993fef96000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000f546f6b656e706c617920546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003544f50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Tokenplay Token
Arg [1] : symbol (string): TOP
Arg [2] : newOwner (address): 0xd6e323d7215ea5349a7b83ca3c4b415993fef960
Arg [3] : contractURI (string):
Arg [4] : tokenURIPrefix (string):

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 000000000000000000000000d6e323d7215ea5349a7b83ca3c4b415993fef960
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [6] : 546f6b656e706c617920546f6b656e0000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 544f500000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

57443:1191:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57443:1191:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19287:167;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;53447:18;;;:::i;:::-;;;;;;;;24262:241;;;;;;;;;:::i;:::-;;;;;;;;23530:439;;;;;;;;;:::i;:::-;;54883:312;;;;;;;;;:::i;:::-;;;;;;;;39882:96;;;:::i;:::-;;;;;;;;26014:363;;;;;;;;;:::i;39422:301::-;;;;;;;;;:::i;27039:168::-;;;;;;;;;:::i;37016:274::-;;;;;;;;;:::i;40324:236::-;;;;;;;;;:::i;53630:37::-;;;;;;;;;:::i;:::-;;;;;;;;;22834:265;;;;;;;;;:::i;57929:444::-;;;;;;;;;:::i;22360:248::-;;;;;;;;;:::i;2885:140::-;;;:::i;2074:79::-;;;:::i;2440:94::-;;;:::i;58516:115::-;;;;;;;;;:::i;53495:20::-;;;:::i;58381:127::-;;;;;;;;;:::i;24804:254::-;;;;;;;;;:::i;27944:352::-;;;;;;;;;:::i;54496:379::-;;;;;;;;;:::i;:::-;;;;;;;;50887:28;;;:::i;56198:247::-;;;;;;;;;:::i;50216:25::-;;;:::i;25388:179::-;;;;;;;;;:::i;3180:109::-;;;;;;;;;:::i;19287:167::-;-1:-1:-1;;;;;;19413:33:0;19384:4;19413:33;;;:20;:33;;;;;;;;;19287:167::o;53447:18::-;;;;;;;;;;;;;;;-1:-1:-1;;53447:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24262:241::-;24321:7;24363:16;24371:7;24363;:16::i;:::-;24341:110;;;;-1:-1:-1;;;24341:110:0;;;;;;;;;;;;;;;;;-1:-1:-1;24471:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24471:24:0;;24262:241::o;23530:439::-;23594:13;23610:16;23618:7;23610;:16::i;:::-;23594:32;;23651:5;-1:-1:-1;;;;;23645:11:0;:2;-1:-1:-1;;;;;23645:11:0;;;23637:57;;;;-1:-1:-1;;;23637:57:0;;;;;;;;;23745:5;-1:-1:-1;;;;;23729:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;23729:21:0;;:62;;;;23754:37;23771:5;23778:12;:10;:12::i;23754:37::-;23707:168;;;;-1:-1:-1;;;23707:168:0;;;;;;;;;23888:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;23888:29:0;-1:-1:-1;;;;;23888:29:0;;;;;;;;;23933:28;;23888:24;;23933:28;;;;;;;23530:439;;;:::o;54883:312::-;54985:8;;;;:4;:8;;;;;;;;54964:29;;;;;;;;;;;;;;;;;54935:16;;;;54964:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54964:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55004:23;55044:5;:12;55030:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;55030:27:0;-1:-1:-1;55004:53:0;-1:-1:-1;55073:9:0;55068:96;55092:5;:12;55088:1;:16;55068:96;;;55138:5;55144:1;55138:8;;;;;;;;;;;;;;:14;;;55126:6;55133:1;55126:9;;;;;;;;;;;;;;;;;:26;55106:3;;55068:96;;;-1:-1:-1;55181:6:0;54883:312;-1:-1:-1;;;54883:312:0:o;39882:96::-;39953:10;:17;39882:96;;:::o;26014:363::-;26206:41;26225:12;:10;:12::i;:::-;26239:7;26206:18;:41::i;:::-;26184:140;;;;-1:-1:-1;;;26184:140:0;;;;;;;;;26337:32;26351:4;26357:2;26361:7;26337:13;:32::i;:::-;26014:363;;;:::o;39422:301::-;39529:7;39584:16;39594:5;39584:9;:16::i;:::-;39576:5;:24;39554:117;;;;-1:-1:-1;;;39554:117:0;;;;;;;;;-1:-1:-1;;;;;39689:19:0;;;;;;:12;:19;;;;;:26;;39709:5;;39689:26;;;;;;;;;;;;;;39682:33;;39422:301;;;;;:::o;27039:168::-;27160:39;27177:4;27183:2;27187:7;27160:39;;;;;;;;;;;;:16;:39::i;37016:274::-;37140:41;37159:12;:10;:12::i;37140:41::-;37118:139;;;;-1:-1:-1;;;37118:139:0;;;;;;;;;37268:14;37274:7;37268:5;:14::i;:::-;37016:274;:::o;40324:236::-;40382:7;40432:13;:11;:13::i;:::-;40424:5;:21;40402:115;;;;-1:-1:-1;;;40402:115:0;;;;;;;;;40535:10;40546:5;40535:17;;;;;;;;;;;;;;;;40528:24;;40324:236;;;:::o;53630:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53630:37:0;;;;-1:-1:-1;53630:37:0;-1:-1:-1;53630:37:0;:::o;22834:265::-;22889:7;22925:20;;;:11;:20;;;;;;-1:-1:-1;;;;;22925:20:0;22978:19;22956:110;;;;-1:-1:-1;;;22956:110:0;;;;;;;;57929:444;58164:62;58201:4;58207:7;58184:31;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;58184:31:0;;;58174:42;;;;;;58218:1;58221;58224;58164:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58164:62:0;;;;;;;;-1:-1:-1;;;;;58136:90:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;58136:90:0;;58114:165;;;;-1:-1:-1;;;58114:165:0;;;;;;;;;58290:33;58296:10;58308:7;58317:5;58290;:33::i;:::-;58334:31;58347:7;58356:8;58334:12;:31::i;:::-;57929:444;;;;;;:::o;22360:248::-;22415:7;-1:-1:-1;;;;;22457:19:0;;22435:111;;;;-1:-1:-1;;;22435:111:0;;;;;;;;;-1:-1:-1;;;;;22566:24:0;;;;;;:17;:24;;;;;:34;;:32;:34::i;2885:140::-;2286:9;:7;:9::i;:::-;2278:54;;;;-1:-1:-1;;;2278:54:0;;;;;;;;;2984:1;2968:6;;2947:40;;-1:-1:-1;;;;;2968:6:0;;;;2947:40;;2984:1;;2947:40;3015:1;2998:19;;-1:-1:-1;;;;;;2998:19:0;;;2885:140::o;2074:79::-;2112:7;2139:6;-1:-1:-1;;;;;2139:6:0;2074:79;:::o;2440:94::-;2480:4;2520:6;;-1:-1:-1;;;;;2520:6:0;2504:12;:10;:12::i;:::-;-1:-1:-1;;;;;2504:22:0;;2497:29;;2440:94;:::o;58516:115::-;2286:9;:7;:9::i;:::-;2278:54;;;;-1:-1:-1;;;2278:54:0;;;;;;;;;58595:28;58611:11;58595:15;:28::i;53495:20::-;;;;;;;;;;;;;;;-1:-1:-1;;53495:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58381:127;2286:9;:7;:9::i;:::-;2278:54;;;;-1:-1:-1;;;2278:54:0;;;;;;;;;58466:34;58485:14;58466:18;:34::i;24804:254::-;24890:12;:10;:12::i;:::-;-1:-1:-1;;;;;24884:18:0;:2;-1:-1:-1;;;;;24884:18:0;;;24876:56;;;;-1:-1:-1;;;24876:56:0;;;;;;;;;24984:8;24945:18;:32;24964:12;:10;:12::i;:::-;-1:-1:-1;;;;;24945:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;24945:32:0;;;:36;;;;;;;;;;;;:47;;-1:-1:-1;;24945:47:0;;;;;;;;;;;25023:12;:10;:12::i;:::-;-1:-1:-1;;;;;25008:42:0;;25041:8;25008:42;;;;;;;;;;;;;;;24804:254;;:::o;27944:352::-;28116:41;28135:12;:10;:12::i;:::-;28149:7;28116:18;:41::i;:::-;28094:140;;;;-1:-1:-1;;;28094:140:0;;;;;;;;;28245:43;28263:4;28269:2;28273:7;28282:5;28245:17;:43::i;:::-;27944:352;;;;:::o;54496:379::-;54645:8;;;;:4;:8;;;;;;;;54624:29;;;;;;;;;;;;;;;;;54582:24;;;;54624:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54624:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54664:31;54720:5;:12;54698:35;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;54698:35:0;-1:-1:-1;54664:69:0;-1:-1:-1;54749:9:0;54744:100;54768:5;:12;54764:1;:16;54744:100;;;54814:5;54820:1;54814:8;;;;;;;;;;;;;;:18;;;54802:6;54809:1;54802:9;;;;;;;;-1:-1:-1;;;;;54802:30:0;;;:9;;;;;;;;;;;:30;54782:3;;54744:100;;50887:28;;;;;;;;;;;;;;;-1:-1:-1;;50887:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56198:247;56256:13;56304:16;56312:7;56304;:16::i;:::-;56282:113;;;;-1:-1:-1;;;56282:113:0;;;;;;;;;56413:24;56429:7;56413:15;:24::i;50216:25::-;;;;;;;;;;;;;;;-1:-1:-1;;50216:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25388:179;-1:-1:-1;;;;;25524:25:0;;;25495:4;25524:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25388:179::o;3180:109::-;2286:9;:7;:9::i;:::-;2278:54;;;;-1:-1:-1;;;2278:54:0;;;;;;;;;3253:28;3272:8;3253:18;:28::i;29569:155::-;29626:4;29659:20;;;:11;:20;;;;;;-1:-1:-1;;;;;29659:20:0;29697:19;;;29569:155::o;841:98::-;921:10;841:98;:::o;30094:428::-;30206:4;30250:16;30258:7;30250;:16::i;:::-;30228:110;;;;-1:-1:-1;;;30228:110:0;;;;;;;;;30349:13;30365:16;30373:7;30365;:16::i;:::-;30349:32;;30411:5;-1:-1:-1;;;;;30400:16:0;:7;-1:-1:-1;;;;;30400:16:0;;:64;;;;30457:7;-1:-1:-1;;;;;30433:31:0;:20;30445:7;30433:11;:20::i;:::-;-1:-1:-1;;;;;30433:31:0;;30400:64;:113;;;;30481:32;30498:5;30505:7;30481:16;:32::i;:::-;30392:122;30094:428;-1:-1:-1;;;;30094:428:0:o;40944:279::-;41064:38;41084:4;41090:2;41094:7;41064:19;:38::i;:::-;41115:47;41148:4;41154:7;41115:32;:47::i;:::-;41175:40;41203:2;41207:7;41175:27;:40::i;33515:92::-;33567:32;33573:16;33581:7;33573;:16::i;:::-;33591:7;33567:5;:32::i;55203:788::-;55321:18;55327:2;55331:7;55321:5;:18::i;:::-;55350:27;55394:5;:12;55380:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;55380:27:0;;55350:57;;55418:20;55455:5;:12;55441:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;55441:27:0;-1:-1:-1;55418:50:0;-1:-1:-1;55484:9:0;55479:398;55503:5;:12;55499:1;:16;55479:398;;;55593:3;-1:-1:-1;;;;;55563:34:0;:5;55569:1;55563:8;;;;;;;;;;;;;;:18;;;-1:-1:-1;;;;;55563:34:0;;;55537:123;;;;-1:-1:-1;;;55537:123:0;;;;;;;;;55683:5;55689:1;55683:8;;;;;;;;;;;;;;:14;;;55701:1;55683:19;;55675:60;;;;-1:-1:-1;;;55675:60:0;;;;;;;;;55750:13;;;;:4;:13;;;;;55769:8;;:5;;55775:1;;55769:8;;;;;;;;;;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;55750:28:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;55750:28:0;-1:-1:-1;;;;;55750:28:0;;;;;;;;;;;;;;;55809:8;;;;55815:1;;55809:8;;;;;;;;;;;;:18;;;55793:10;55804:1;55793:13;;;;;;;;;;;;;:34;-1:-1:-1;;;;;55793:34:0;;;-1:-1:-1;;;;;55793:34:0;;;;;55851:5;55857:1;55851:8;;;;;;;;;;;;;;:14;;;55842:3;55846:1;55842:6;;;;;;;;;;;;;;;;;:23;55517:3;;55479:398;;;-1:-1:-1;55891:12:0;;:16;55887:97;;55929:43;55947:7;55956:10;55968:3;55929:43;;;;;;;;;;;;;;;;;55887:97;55203:788;;;;;:::o;56692:239::-;56792:16;56800:7;56792;:16::i;:::-;56770:110;;;;-1:-1:-1;;;56770:110:0;;;;;;;;;56891:32;56910:7;56919:3;56891:18;:32::i;:::-;56692:239;;:::o;17967:114::-;18059:14;;17967:114::o;50682:107::-;50755:26;;;;:11;;:26;;;;;:::i;51971:119::-;52050:32;;;;:14;;:32;;;;;:::i;29015:352::-;29168:32;29182:4;29188:2;29192:7;29168:13;:32::i;:::-;29233:48;29256:4;29262:2;29266:7;29275:5;29233:22;:48::i;:::-;29211:148;;;;-1:-1:-1;;;29211:148:0;;;;;;;;51326:142;51440:19;;;;:10;:19;;;;;;;;;51418:42;;;;;;;;;;;-1:-1:-1;;51418:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;51385:13;;51418:42;;;;51440:19;51418:42;;51440:19;51418:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51418:14:0;:21;;;;;;;;-1:-1:-1;;51418:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51418:14:0;;-1:-1:-1;51418:21:0;-1:-1:-1;51418:21:0;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;;:::i;3395:266::-;-1:-1:-1;;;;;3483:22:0;;3461:110;;;;-1:-1:-1;;;3461:110:0;;;;;;;;;3608:6;;;3587:38;;-1:-1:-1;;;;;3587:38:0;;;;3608:6;;;3587:38;;;3636:6;:17;;-1:-1:-1;;;;;;3636:17:0;-1:-1:-1;;;;;3636:17:0;;;;;;;;;;3395:266::o;33993:530::-;34155:4;-1:-1:-1;;;;;34135:24:0;:16;34143:7;34135;:16::i;:::-;-1:-1:-1;;;;;34135:24:0;;34113:115;;;;-1:-1:-1;;;34113:115:0;;;;;;;;;-1:-1:-1;;;;;34247:16:0;;34239:65;;;;-1:-1:-1;;;34239:65:0;;;;;;;;;34317:23;34332:7;34317:14;:23::i;:::-;-1:-1:-1;;;;;34353:23:0;;;;;;:17;:23;;;;;:35;;:33;:35::i;:::-;-1:-1:-1;;;;;34399:21:0;;;;;;:17;:21;;;;;:33;;:31;:33::i;:::-;34445:20;;;;:11;:20;;;;;;:25;;-1:-1:-1;;;;;;34445:25:0;-1:-1:-1;;;;;34445:25:0;;;;;;;;;34488:27;;34445:20;;34488:27;;;;;;;33993:530;;;:::o;44195:1162::-;-1:-1:-1;;;;;44500:18:0;;44475:22;44500:18;;;:12;:18;;;;;:25;:32;;44530:1;44500:32;:29;:32;:::i;:::-;44543:18;44564:26;;;:17;:26;;;;;;44475:57;;-1:-1:-1;44697:28:0;;;44693:328;;-1:-1:-1;;;;;44764:18:0;;44742:19;44764:18;;;:12;:18;;;;;:34;;44783:14;;44764:34;;;;;;;;;;;;;;44742:56;;44848:11;44815:12;:18;44828:4;-1:-1:-1;;;;;44815:18:0;-1:-1:-1;;;;;44815:18:0;;;;;;;;;;;;44834:10;44815:30;;;;;;;;;;;;;;;;;;;:44;;;;44932:30;;;:17;:30;;;;;:43;;;44693:328;-1:-1:-1;;;;;45110:18:0;;;;;;:12;:18;;;;;:27;;;;;-1:-1:-1;;45110:27:0;;;:::i;43017:186::-;-1:-1:-1;;;;;43131:16:0;;;;;;;:12;:16;;;;;;;;:23;;43102:26;;;:17;:26;;;;;:52;;;43165:16;;;39:1:-1;23:18;;45:23;;43165:30:0;;;;;;;;43017:186::o;57233:136::-;57300:27;57312:5;57319:7;57300:11;:27::i;:::-;57338:23;57353:7;57338:14;:23::i;41488:202::-;41552:24;41564:2;41568:7;41552:11;:24::i;:::-;41589:40;41617:2;41621:7;41589:27;:40::i;:::-;41642;41674:7;41642:31;:40::i;51715:111::-;51793:19;;;;:10;:19;;;;;;;;:25;;;;;;;;:::i;35175:1201::-;35331:4;35353:15;:2;-1:-1:-1;;;;;35353:13:0;;:15::i;:::-;35348:60;;-1:-1:-1;35392:4:0;35385:11;;35348:60;35479:12;35493:23;-1:-1:-1;;;;;35533:7:0;;-1:-1:-1;;;35672:12:0;:10;:12::i;:::-;35707:4;35734:7;35764:5;35559:229;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;35559:229:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;35559:229:0;;;179:29:-1;;;;160:49;;;35533:270:0;;;;35559:229;35533:270;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;35478:325:0;;;;35819:7;35814:555;;35847:17;;:21;35843:384;;36015:10;36009:17;36076:15;36063:10;36059:2;36055:19;36048:44;35963:148;36151:60;;-1:-1:-1;;;36151:60:0;;;;;;;;35814:555;36259:13;36286:10;36275:32;;;;;;;;;;;;;;-1:-1:-1;;;;;;36330:26:0;-1:-1:-1;;;36330:26:0;;-1:-1:-1;36322:35:0;;-1:-1:-1;;;36322:35:0;47324:463;47426:13;47457:16;47482:2;47457:28;;47496:16;47521:2;47496:28;;47535:16;47577:3;:10;47564:3;:10;:23;47554:34;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;47554:34:0;87::-1;135:17;;-1:-1;47554:34:0;-1:-1:-1;47535:53:0;-1:-1:-1;47599:9:0;;47623:58;47647:3;:10;47643:1;:14;47623:58;;;47675:3;47679:1;47675:6;;;;;;;;;;;;;;;;47664:3;47668;;;;;;47664:8;;;;;;;;;;;:17;-1:-1:-1;;;;;47664:17:0;;;;;;;;-1:-1:-1;47659:3:0;;47623:58;;;-1:-1:-1;47697:9:0;47692:58;47716:3;:10;47712:1;:14;47692:58;;;47744:3;47748:1;47744:6;;;;;;;;;;;;;;;;47733:3;47737;;;;;;47733:8;;;;;;;;;;;:17;-1:-1:-1;;;;;47733:17:0;;;;;;;;-1:-1:-1;47728:3:0;;47692:58;;;-1:-1:-1;47775:3:0;;47324:463;-1:-1:-1;;;;;;47324:463:0:o;36544:175::-;36644:1;36608:24;;;:15;:24;;;;;;-1:-1:-1;;;;;36608:24:0;:38;36604:108;;36698:1;36663:24;;;:15;:24;;;;;:37;;-1:-1:-1;;;;;;36663:37:0;;;36544:175::o;18278:110::-;18359:14;;:21;;18378:1;18359:21;:18;:21;:::i;:::-;18342:38;;18278:110::o;18089:181::-;18243:19;;18261:1;18243:19;;;18089:181::o;9555:136::-;9613:7;9640:43;9644:1;9647;9640:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;9633:50;9555:136;-1:-1:-1;;;9555:136:0:o;41974:372::-;42041:27;42053:5;42060:7;42041:11;:27::i;:::-;42081:48;42114:5;42121:7;42081:32;:48::i;:::-;42279:1;42250:26;;;:17;:26;;;;;:30;42293:45;42268:7;42293:36;:45::i;52098:165::-;52169:19;;;;:10;:19;;;;;52163:33;;-1:-1:-1;;52163:33:0;;;;;;;;;;;:38;52159:97;;52225:19;;;;:10;:19;;;;;52218:26;;;:::i;32345:335::-;-1:-1:-1;;;;;32417:16:0;;32409:61;;;;-1:-1:-1;;;32409:61:0;;;;;;;;;32490:16;32498:7;32490;:16::i;:::-;32489:17;32481:58;;;;-1:-1:-1;;;32481:58:0;;;;;;;;;32552:20;;;;:11;:20;;;;;;;;:25;;-1:-1:-1;;;;;;32552:25:0;-1:-1:-1;;;;;32552:25:0;;;;;;;;32588:21;;:17;:21;;;;;:33;;:31;:33::i;:::-;32639;;32664:7;;-1:-1:-1;;;;;32639:33:0;;;32656:1;;32639:33;;32656:1;;32639:33;32345:335;;:::o;43404:164::-;43508:10;:17;;43481:24;;;;:15;:24;;;;;:44;;;39:1:-1;23:18;;45:23;;43536:24:0;;;;;;;43404:164::o;14479:654::-;14539:4;15033:20;;14863:66;15082:23;;;;;;:42;;-1:-1:-1;;15109:15:0;;;15074:51;-1:-1:-1;;14479:654:0:o;10028:226::-;10148:7;10184:12;10176:6;;;;10168:29;;;;-1:-1:-1;;;10168:29:0;;;;;;;;;;-1:-1:-1;;;10220:5:0;;;10028:226::o;32957:370::-;33066:5;-1:-1:-1;;;;;33046:25:0;:16;33054:7;33046;:16::i;:::-;-1:-1:-1;;;;;33046:25:0;;33024:112;;;;-1:-1:-1;;;33024:112:0;;;;;;;;;33149:23;33164:7;33149:14;:23::i;:::-;-1:-1:-1;;;;;33185:24:0;;;;;;:17;:24;;;;;:36;;:34;:36::i;:::-;33263:1;33232:20;;;:11;:20;;;;;;:33;;-1:-1:-1;;;;;;33232:33:0;;;33283:36;33244:7;;33263:1;-1:-1:-1;;;;;33283:36:0;;;;;33263:1;;33283:36;32957:370;;:::o;45652:1082::-;45930:10;:17;45905:22;;45930:24;;45952:1;45930:24;:21;:24;:::i;:::-;45965:18;45986:24;;;:15;:24;;;;;;46359:10;:26;;45905:49;;-1:-1:-1;45986:24:0;;45905:49;;46359:26;;;;;;;;;;;;;;46337:48;;46423:11;46398:10;46409;46398:22;;;;;;;;;;;;;;;;;;;:36;;;;46503:28;;;:15;:28;;;;;;:41;;;46668:10;:19;;;;;-1:-1:-1;;46668:19:0;;;:::i;:::-;-1:-1:-1;;;46725:1:0;46698:24;;;-1:-1:-1;46698:15:0;:24;;;;;:28;45652:1082::o;57443:1191::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57443:1191:0;;;-1:-1:-1;57443:1191:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:130:-1;72:20;;97:33;72:20;97:33;;327:758;;461:3;454:4;446:6;442:17;438:27;428:2;;479:1;476;469:12;428:2;516:6;503:20;538:97;553:81;627:6;553:81;;;538:97;;;529:106;;652:5;677:6;670:5;663:21;707:4;699:6;695:17;685:27;;729:4;724:3;720:14;713:21;;782:6;829:3;821:4;813:6;809:17;804:3;800:27;797:36;794:2;;;846:1;843;836:12;794:2;871:1;856:223;881:6;878:1;875:13;856:223;;;939:3;961:54;1011:3;999:10;961:54;;;949:67;;-1:-1;1039:4;1030:14;;;;1067:4;1058:14;;;;;903:1;896:9;856:223;;;860:14;421:664;;;;;;;;1093:124;1157:20;;1182:30;1157:20;1182:30;;1224:130;1291:20;;1316:33;1291:20;1316:33;;1361:128;1427:20;;1452:32;1427:20;1452:32;;1496:132;1573:13;;1591:32;1573:13;1591:32;;1636:440;;1737:3;1730:4;1722:6;1718:17;1714:27;1704:2;;1755:1;1752;1745:12;1704:2;1792:6;1779:20;1814:64;1829:48;1870:6;1829:48;;1814:64;1805:73;;1898:6;1891:5;1884:21;1934:4;1926:6;1922:17;1967:4;1960:5;1956:16;2002:3;1993:6;1988:3;1984:16;1981:25;1978:2;;;2019:1;2016;2009:12;1978:2;2029:41;2063:6;2058:3;2053;2029:41;;;1697:379;;;;;;;;2563:473;;2669:4;2657:9;2652:3;2648:19;2644:30;2641:2;;;2687:1;2684;2677:12;2641:2;2705:20;2720:4;2705:20;;;2696:29;-1:-1;2780:1;2812:57;2865:3;2845:9;2812:57;;;2787:83;;-1:-1;2932:2;2965:49;3010:3;2986:22;;;2965:49;;;2958:4;2951:5;2947:16;2940:75;2891:135;2635:401;;;;;3180:126;3245:20;;3270:31;3245:20;3270:31;;3313:241;;3417:2;3405:9;3396:7;3392:23;3388:32;3385:2;;;3433:1;3430;3423:12;3385:2;3468:1;3485:53;3530:7;3510:9;3485:53;;3561:366;;;3682:2;3670:9;3661:7;3657:23;3653:32;3650:2;;;3698:1;3695;3688:12;3650:2;3733:1;3750:53;3795:7;3775:9;3750:53;;;3740:63;;3712:97;3840:2;3858:53;3903:7;3894:6;3883:9;3879:22;3858:53;;;3848:63;;3819:98;3644:283;;;;;;3934:491;;;;4072:2;4060:9;4051:7;4047:23;4043:32;4040:2;;;4088:1;4085;4078:12;4040:2;4123:1;4140:53;4185:7;4165:9;4140:53;;;4130:63;;4102:97;4230:2;4248:53;4293:7;4284:6;4273:9;4269:22;4248:53;;;4238:63;;4209:98;4338:2;4356:53;4401:7;4392:6;4381:9;4377:22;4356:53;;;4346:63;;4317:98;4034:391;;;;;;4432:721;;;;;4596:3;4584:9;4575:7;4571:23;4567:33;4564:2;;;4613:1;4610;4603:12;4564:2;4648:1;4665:53;4710:7;4690:9;4665:53;;;4655:63;;4627:97;4755:2;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;;;4763:63;;4734:98;4863:2;4881:53;4926:7;4917:6;4906:9;4902:22;4881:53;;;4871:63;;4842:98;4999:2;4988:9;4984:18;4971:32;5023:18;5015:6;5012:30;5009:2;;;5055:1;5052;5045:12;5009:2;5075:62;5129:7;5120:6;5109:9;5105:22;5075:62;;;5065:72;;4950:193;4558:595;;;;;;;;5160:360;;;5278:2;5266:9;5257:7;5253:23;5249:32;5246:2;;;5294:1;5291;5284:12;5246:2;5329:1;5346:53;5391:7;5371:9;5346:53;;;5336:63;;5308:97;5436:2;5454:50;5496:7;5487:6;5476:9;5472:22;5454:50;;5527:366;;;5648:2;5636:9;5627:7;5623:23;5619:32;5616:2;;;5664:1;5661;5654:12;5616:2;5699:1;5716:53;5761:7;5741:9;5716:53;;;5706:63;;5678:97;5806:2;5824:53;5869:7;5860:6;5849:9;5845:22;5824:53;;5900:239;;6003:2;5991:9;5982:7;5978:23;5974:32;5971:2;;;6019:1;6016;6009:12;5971:2;6054:1;6071:52;6115:7;6095:9;6071:52;;6146:261;;6260:2;6248:9;6239:7;6235:23;6231:32;6228:2;;;6276:1;6273;6266:12;6228:2;6311:1;6328:63;6383:7;6363:9;6328:63;;6414:347;;6528:2;6516:9;6507:7;6503:23;6499:32;6496:2;;;6544:1;6541;6534:12;6496:2;6579:31;;6630:18;6619:30;;6616:2;;;6662:1;6659;6652:12;6616:2;6682:63;6737:7;6728:6;6717:9;6713:22;6682:63;;6768:241;;6872:2;6860:9;6851:7;6847:23;6843:32;6840:2;;;6888:1;6885;6878:12;6840:2;6923:1;6940:53;6985:7;6965:9;6940:53;;7016:366;;;7137:2;7125:9;7116:7;7112:23;7108:32;7105:2;;;7153:1;7150;7143:12;7105:2;7188:1;7205:53;7250:7;7230:9;7205:53;;7389:1141;;;;;;;7628:3;7616:9;7607:7;7603:23;7599:33;7596:2;;;7645:1;7642;7635:12;7596:2;7680:1;7697:53;7742:7;7722:9;7697:53;;;7687:63;;7659:97;7787:2;7805:51;7848:7;7839:6;7828:9;7824:22;7805:51;;;7795:61;;7766:96;7893:2;7911:53;7956:7;7947:6;7936:9;7932:22;7911:53;;;7901:63;;7872:98;8001:2;8019:53;8064:7;8055:6;8044:9;8040:22;8019:53;;;8009:63;;7980:98;8137:3;8126:9;8122:19;8109:33;8162:18;8154:6;8151:30;8148:2;;;8194:1;8191;8184:12;8148:2;8214:95;8301:7;8292:6;8281:9;8277:22;8214:95;;;8204:105;;8088:227;8374:3;8363:9;8359:19;8346:33;8399:18;8391:6;8388:30;8385:2;;;8431:1;8428;8421:12;8385:2;8451:63;8506:7;8497:6;8486:9;8482:22;8451:63;;;8441:73;;8325:195;7590:940;;;;;;;;;8538:205;;8641:62;8699:3;8691:6;8641:62;;;-1:-1;;8732:4;8723:14;;8634:109;8934:173;;9021:46;9063:3;9055:6;9021:46;;9115:127;9204:32;9230:5;9204:32;;;9199:3;9192:45;9186:56;;;9654:690;;9799:54;9847:5;9799:54;;;9866:86;9945:6;9940:3;9866:86;;;9859:93;;9973:56;10023:5;9973:56;;;10049:7;10077:1;10062:260;10087:6;10084:1;10081:13;10062:260;;;10154:6;10148:13;10175:63;10234:3;10219:13;10175:63;;;10168:70;;10255:60;10308:6;10255:60;;;10245:70;-1:-1;;10109:1;10102:9;10062:260;;;-1:-1;10335:3;;9778:566;-1:-1;;;;;9778:566;10399:754;;10560:62;10616:5;10560:62;;;10635:94;10722:6;10717:3;10635:94;;;10628:101;;10750:64;10808:5;10750:64;;;10834:7;10862:1;10847:284;10872:6;10869:1;10866:13;10847:284;;;10939:6;10933:13;10960:79;11035:3;11020:13;10960:79;;;10953:86;;11056:68;11117:6;11056:68;;;11046:78;-1:-1;;10894:1;10887:9;10847:284;;11192:690;;11337:54;11385:5;11337:54;;;11404:86;11483:6;11478:3;11404:86;;;11397:93;;11511:56;11561:5;11511:56;;;11587:7;11615:1;11600:260;11625:6;11622:1;11619:13;11600:260;;;11692:6;11686:13;11713:63;11772:3;11757:13;11713:63;;;11706:70;;11793:60;11846:6;11793:60;;;11783:70;-1:-1;;11647:1;11640:9;11600:260;;11890:104;11967:21;11982:5;11967:21;;12001:113;12084:24;12102:5;12084:24;;12121:343;;12231:38;12263:5;12231:38;;;12281:70;12344:6;12339:3;12281:70;;;12274:77;;12356:52;12401:6;12396:3;12389:4;12382:5;12378:16;12356:52;;;12429:29;12451:6;12429:29;;;12420:39;;;;12211:253;-1:-1;;;12211:253;12471:356;;12599:38;12631:5;12599:38;;;12649:88;12730:6;12725:3;12649:88;;;12642:95;;12742:52;12787:6;12782:3;12775:4;12768:5;12764:16;12742:52;;;12806:16;;;;;12579:248;-1:-1;;12579:248;12834:209;12957:80;12977:59;13030:5;12977:59;;;12957:80;;13751:328;;13911:67;13975:2;13970:3;13911:67;;;14011:30;13991:51;;14070:2;14061:12;;13897:182;-1:-1;;13897:182;14088:380;;14248:67;14312:2;14307:3;14248:67;;;14348:34;14328:55;;-1:-1;;;14412:2;14403:12;;14396:35;14459:2;14450:12;;14234:234;-1:-1;;14234:234;14477:387;;14637:67;14701:2;14696:3;14637:67;;;14737:34;14717:55;;-1:-1;;;14801:2;14792:12;;14785:42;14855:2;14846:12;;14623:241;-1:-1;;14623:241;14873:375;;15033:67;15097:2;15092:3;15033:67;;;15133:34;15113:55;;-1:-1;;;15197:2;15188:12;;15181:30;15239:2;15230:12;;15019:229;-1:-1;;15019:229;15257:328;;15417:67;15481:2;15476:3;15417:67;;;15517:30;15497:51;;15576:2;15567:12;;15403:182;-1:-1;;15403:182;15594:373;;15754:67;15818:2;15813:3;15754:67;;;15854:34;15834:55;;-1:-1;;;15918:2;15909:12;;15902:28;15958:2;15949:12;;15740:227;-1:-1;;15740:227;15976:325;;16136:67;16200:2;16195:3;16136:67;;;16236:27;16216:48;;16292:2;16283:12;;16122:179;-1:-1;;16122:179;16310:381;;16470:67;16534:2;16529:3;16470:67;;;16570:34;16550:55;;-1:-1;;;16634:2;16625:12;;16618:36;16682:2;16673:12;;16456:235;-1:-1;;16456:235;16700:325;;16860:67;16924:2;16919:3;16860:67;;;16960:27;16940:48;;17016:2;17007:12;;16846:179;-1:-1;;16846:179;17034:393;;17194:67;17258:2;17253:3;17194:67;;;17294:34;17274:55;;17363:26;17358:2;17349:12;;17342:48;17418:2;17409:12;;17180:247;-1:-1;;17180:247;17436:379;;17596:67;17660:2;17655:3;17596:67;;;17696:34;17676:55;;-1:-1;;;17760:2;17751:12;;17744:34;17806:2;17797:12;;17582:233;-1:-1;;17582:233;17824:378;;17984:67;18048:2;18043:3;17984:67;;;18084:34;18064:55;;-1:-1;;;18148:2;18139:12;;18132:33;18193:2;18184:12;;17970:232;-1:-1;;17970:232;18211:332;;18371:67;18435:2;18430:3;18371:67;;;18471:34;18451:55;;18534:2;18525:12;;18357:186;-1:-1;;18357:186;18552:381;;18712:67;18776:2;18771:3;18712:67;;;18812:34;18792:55;;-1:-1;;;18876:2;18867:12;;18860:36;18924:2;18915:12;;18698:235;-1:-1;;18698:235;18942:381;;19102:67;19166:2;19161:3;19102:67;;;19202:34;19182:55;;-1:-1;;;19266:2;19257:12;;19250:36;19314:2;19305:12;;19088:235;-1:-1;;19088:235;19332:332;;19492:67;19556:2;19551:3;19492:67;;;19592:34;19572:55;;19655:2;19646:12;;19478:186;-1:-1;;19478:186;19673:378;;19833:67;19897:2;19892:3;19833:67;;;19933:34;19913:55;;-1:-1;;;19997:2;19988:12;;19981:33;20042:2;20033:12;;19819:232;-1:-1;;19819:232;20060:384;;20220:67;20284:2;20279:3;20220:67;;;20320:34;20300:55;;-1:-1;;;20384:2;20375:12;;20368:39;20435:2;20426:12;;20206:238;-1:-1;;20206:238;20453:370;;20613:67;20677:2;20672:3;20613:67;;;20713:34;20693:55;;-1:-1;;;20777:2;20768:12;;20761:25;20814:2;20805:12;;20599:224;-1:-1;;20599:224;20832:386;;20992:67;21056:2;21051:3;20992:67;;;21092:34;21072:55;;-1:-1;;;21156:2;21147:12;;21140:41;21209:2;21200:12;;20978:240;-1:-1;;20978:240;21227:381;;21387:67;21451:2;21446:3;21387:67;;;21487:34;21467:55;;-1:-1;;;21551:2;21542:12;;21535:36;21599:2;21590:12;;21373:235;-1:-1;;21373:235;21617:374;;21777:67;21841:2;21836:3;21777:67;;;21877:34;21857:55;;-1:-1;;;21941:2;21932:12;;21925:29;21982:2;21973:12;;21763:228;-1:-1;;21763:228;22000:327;;22160:67;22224:2;22219:3;22160:67;;;22260:29;22240:50;;22318:2;22309:12;;22146:181;-1:-1;;22146:181;22336:385;;22496:67;22560:2;22555:3;22496:67;;;22596:34;22576:55;;-1:-1;;;22660:2;22651:12;;22644:40;22712:2;22703:12;;22482:239;-1:-1;;22482:239;22959:152;23060:45;23080:24;23098:5;23080:24;;;23060:45;;23118:107;23197:22;23213:5;23197:22;;23232:262;;23376:93;23465:3;23456:6;23376:93;;23501:427;;23670:97;23763:3;23754:6;23670:97;;;23789:2;23784:3;23780:12;23773:19;;23803:75;23874:3;23865:6;23803:75;;;-1:-1;23900:2;23891:12;;23658:270;-1:-1;;23658:270;23935:213;24053:2;24038:18;;24067:71;24042:9;24111:6;24067:71;;24155:663;24391:3;24376:19;;24406:87;24380:9;24466:6;24406:87;;;24504:72;24572:2;24561:9;24557:18;24548:6;24504:72;;;24587;24655:2;24644:9;24640:18;24631:6;24587:72;;;24707:9;24701:4;24697:20;24692:2;24681:9;24677:18;24670:48;24732:76;24803:4;24794:6;24732:76;;;24724:84;24362:456;-1:-1;;;;;;24362:456;24825:356;24987:2;24972:18;;25001:87;24976:9;25061:6;25001:87;;;25099:72;25167:2;25156:9;25152:18;25143:6;25099:72;;25188:393;25372:2;25386:47;;;25357:18;;25447:124;25357:18;25557:6;25447:124;;25588:361;25756:2;25770:47;;;25741:18;;25831:108;25741:18;25925:6;25831:108;;25956:201;26068:2;26053:18;;26082:65;26057:9;26120:6;26082:65;;26164:539;26362:3;26347:19;;26377:71;26351:9;26421:6;26377:71;;;26459:68;26523:2;26512:9;26508:18;26499:6;26459:68;;;26538:72;26606:2;26595:9;26591:18;26582:6;26538:72;;;26621;26689:2;26678:9;26674:18;26665:6;26621:72;;;26333:370;;;;;;;;26710:293;26844:2;26858:47;;;26829:18;;26919:74;26829:18;26979:6;26919:74;;27318:407;27509:2;27523:47;;;27494:18;;27584:131;27494:18;27584:131;;27732:407;27923:2;27937:47;;;27908:18;;27998:131;27908:18;27998:131;;28146:407;28337:2;28351:47;;;28322:18;;28412:131;28322:18;28412:131;;28560:407;28751:2;28765:47;;;28736:18;;28826:131;28736:18;28826:131;;28974:407;29165:2;29179:47;;;29150:18;;29240:131;29150:18;29240:131;;29388:407;29579:2;29593:47;;;29564:18;;29654:131;29564:18;29654:131;;29802:407;29993:2;30007:47;;;29978:18;;30068:131;29978:18;30068:131;;30216:407;30407:2;30421:47;;;30392:18;;30482:131;30392:18;30482:131;;30630:407;30821:2;30835:47;;;30806:18;;30896:131;30806:18;30896:131;;31044:407;31235:2;31249:47;;;31220:18;;31310:131;31220:18;31310:131;;31458:407;31649:2;31663:47;;;31634:18;;31724:131;31634:18;31724:131;;31872:407;32063:2;32077:47;;;32048:18;;32138:131;32048:18;32138:131;;32286:407;32477:2;32491:47;;;32462:18;;32552:131;32462:18;32552:131;;32700:407;32891:2;32905:47;;;32876:18;;32966:131;32876:18;32966:131;;33114:407;33305:2;33319:47;;;33290:18;;33380:131;33290:18;33380:131;;33528:407;33719:2;33733:47;;;33704:18;;33794:131;33704:18;33794:131;;33942:407;34133:2;34147:47;;;34118:18;;34208:131;34118:18;34208:131;;34356:407;34547:2;34561:47;;;34532:18;;34622:131;34532:18;34622:131;;34770:407;34961:2;34975:47;;;34946:18;;35036:131;34946:18;35036:131;;35184:407;35375:2;35389:47;;;35360:18;;35450:131;35360:18;35450:131;;35598:407;35789:2;35803:47;;;35774:18;;35864:131;35774:18;35864:131;;36012:407;36203:2;36217:47;;;36188:18;;36278:131;36188:18;36278:131;;36426:407;36617:2;36631:47;;;36602:18;;36692:131;36602:18;36692:131;;36840:407;37031:2;37045:47;;;37016:18;;37106:131;37016:18;37106:131;;37254:213;37372:2;37357:18;;37386:71;37361:9;37430:6;37386:71;;37474:731;37748:2;37733:18;;37762:71;37737:9;37806:6;37762:71;;;37881:9;37875:4;37871:20;37866:2;37855:9;37851:18;37844:48;37906:108;38009:4;38000:6;37906:108;;;37898:116;;38062:9;38056:4;38052:20;38047:2;38036:9;38032:18;38025:48;38087:108;38190:4;38181:6;38087:108;;38212:256;38274:2;38268:9;38300:17;;;38375:18;38360:34;;38396:22;;;38357:62;38354:2;;;38432:1;38429;38422:12;38354:2;38448;38441:22;38252:216;;-1:-1;38252:216;38475:321;;38651:18;38643:6;38640:30;38637:2;;;38683:1;38680;38673:12;38637:2;-1:-1;38718:4;38706:17;;;38771:15;;38574:222;38803:321;;38946:18;38938:6;38935:30;38932:2;;;38978:1;38975;38968:12;38932:2;-1:-1;39109:4;39045;39022:17;;;;-1:-1;;39018:33;39099:15;;38869:255;39460:151;39584:4;39575:14;;39532:79;39942:137;40045:12;;40016:63;41118:178;41236:19;;;41285:4;41276:14;;41229:67;41858:144;41993:3;41971:31;-1:-1;41971:31;42182:91;;42244:24;42262:5;42244:24;;42386:85;42452:13;42445:21;;42428:43;42557:144;-1:-1;;;;;;42618:78;;42601:100;42708:121;-1:-1;;;;;42770:54;;42753:76;42915:81;42986:4;42975:16;;42958:38;43003:165;;43104:59;43157:5;43104:59;;43313:145;43394:6;43389:3;43384;43371:30;-1:-1;43450:1;43432:16;;43425:27;43364:94;43467:268;43532:1;43539:101;43553:6;43550:1;43547:13;43539:101;;;43620:11;;;43614:18;43601:11;;;43594:39;43575:2;43568:10;43539:101;;;43655:6;43652:1;43649:13;43646:2;;;-1:-1;;43720:1;43702:16;;43695:27;43516:219;43743:95;;43807:26;43827:5;43845:89;43909:20;43923:5;43909:20;;44022:97;44110:2;44090:14;-1:-1;;44086:28;;44070:49;44127:94;44201:2;44197:14;;44169:52;44229:117;44298:24;44316:5;44298:24;;;44291:5;44288:35;44278:2;;44337:1;44334;44327:12;44493:111;44559:21;44574:5;44559:21;;44611:117;44680:24;44698:5;44680:24;;44735:115;44803:23;44820:5;44803:23;;44981:113;45048:22;45064:5;45048:22;

Swarm Source

bzzr://a5b22d946070f04c000b73386751482c859a122115fd179cadf269b4c6cfd11d
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading