ETH Price: $2,710.86 (-1.90%)

ICONOCLAST (ICT)
 

Overview

TokenID

9

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
iconoclastNFT

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-03
*/

// File: https://github.com/0xcert/ethereum-erc721/src/contracts/ownership/ownable.sol


pragma solidity ^0.8.0;

/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
 */
contract Ownable
{

  /**
   * @dev Error constants.
   */
  string public constant NOT_CURRENT_OWNER = "018001";
  string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002";

  /**
   * @dev Current owner address.
   */
  address public owner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev The constructor sets the original `owner` of the contract to the sender account.
   */
  constructor()
  {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner()
  {
    require(msg.sender == owner, NOT_CURRENT_OWNER);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(
    address _newOwner
  )
    public
    onlyOwner
  {
    require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}

// File: https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/erc721-metadata.sol


pragma solidity ^0.8.0;

/**
 * @dev Optional metadata extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Metadata
{

  /**
   * @dev Returns a descriptive name for a collection of NFTs in this contract.
   * @return _name Representing name.
   */
  function name()
    external
    view
    returns (string memory _name);

  /**
   * @dev Returns a abbreviated name for a collection of NFTs in this contract.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    view
    returns (string memory _symbol);

  /**
   * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if
   * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file
   * that conforms to the "ERC721 Metadata JSON Schema".
   * @return URI of _tokenId.
   */
  function tokenURI(uint256 _tokenId)
    external
    view
    returns (string memory);

}

// File: https://github.com/0xcert/ethereum-erc721/src/contracts/utils/address-utils.sol


pragma solidity ^0.8.0;

/**
 * @notice Based on:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
 * Requires EIP-1052.
 * @dev Utility library of inline functions on addresses.
 */
library AddressUtils
{

  /**
   * @dev Returns whether the target address is a contract.
   * @param _addr Address to check.
   * @return addressCheck True if _addr is a contract, false if not.
   */
  function isContract(
    address _addr
  )
    internal
    view
    returns (bool addressCheck)
  {
    // This method relies in extcodesize, which returns 0 for contracts in
    // construction, since the code is only stored at the end of the
    // constructor execution.

    // 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;
    assembly { codehash := extcodehash(_addr) } // solhint-disable-line
    addressCheck = (codehash != 0x0 && codehash != accountHash);
  }

}

// File: https://github.com/0xcert/ethereum-erc721/src/contracts/utils/erc165.sol


pragma solidity ^0.8.0;

/**
 * @dev A standard for detecting smart contract interfaces. 
 * See: https://eips.ethereum.org/EIPS/eip-165.
 */
interface ERC165
{

  /**
   * @dev Checks if the smart contract includes a specific interface.
   * This function uses less than 30,000 gas.
   * @param _interfaceID The interface identifier, as specified in ERC-165.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    view
    returns (bool);
    
}

// File: https://github.com/0xcert/ethereum-erc721/src/contracts/utils/supports-interface.sol


pragma solidity ^0.8.0;


/**
 * @dev Implementation of standard for detect smart contract interfaces.
 */
contract SupportsInterface is
  ERC165
{

  /**
   * @dev Mapping of supported intefraces. You must not set element 0xffffffff to true.
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x01ffc9a7] = true; // ERC165
  }

  /**
   * @dev Function to check which interfaces are suported by this contract.
   * @param _interfaceID Id of the interface.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    override
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceID];
  }

}

// File: https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/erc721-token-receiver.sol


pragma solidity ^0.8.0;

/**
 * @dev ERC-721 interface for accepting safe transfers.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721TokenReceiver
{

  /**
   * @notice The contract address is always the message sender. A wallet/broker/auction application
   * MUST implement the wallet interface if it will accept safe transfers.
   * @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the
   * recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return
   * of other than the magic value MUST result in the transaction being reverted.
   * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing.
   * @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 Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    returns(bytes4);

}

// File: https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/erc721.sol


pragma solidity ^0.8.0;

/**
 * @dev ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721
{

  /**
   * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are
   * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any
   * number of NFTs may be created and assigned without emitting Transfer. At the time of any
   * transfer, the approved address for that NFT (if any) is reset to none.
   */
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero
   * address indicates there is no approved address. When a Transfer event emits, this also
   * indicates that the approved address for that NFT (if any) is reset to none.
   */
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage
   * all NFTs of the owner.
   */
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  /**
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external;

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT.  This function can be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @param _approved The new approved NFT controller.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @param _tokenId The NFT to approve.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The contract MUST allow multiple operators per owner.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external;

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @notice Count all NFTs assigned to an owner.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256);

  /**
   * @notice Find the owner of an NFT.
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single NFT.
   * @param _tokenId The NFT to find the approved address for.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @notice Query if an address is an authorized operator for another address.
   * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    view
    returns (bool);

}

// File: https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/nf-token.sol


pragma solidity ^0.8.0;





/**
 * @dev Implementation of ERC-721 non-fungible token standard.
 */
contract NFToken is
  ERC721,
  SupportsInterface
{
  using AddressUtils for address;

  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant ZERO_ADDRESS = "003001";
  string constant NOT_VALID_NFT = "003002";
  string constant NOT_OWNER_OR_OPERATOR = "003003";
  string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004";
  string constant NOT_ABLE_TO_RECEIVE_NFT = "003005";
  string constant NFT_ALREADY_EXISTS = "003006";
  string constant NOT_OWNER = "003007";
  string constant IS_OWNER = "003008";

  /**
   * @dev Magic value of a smart contract that can receive NFT.
   * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
   */
  bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

  /**
   * @dev A mapping from NFT ID to the address that owns it.
   */
  mapping (uint256 => address) internal idToOwner;

  /**
   * @dev Mapping from NFT ID to approved address.
   */
  mapping (uint256 => address) internal idToApproval;

   /**
   * @dev Mapping from owner address to count of their tokens.
   */
  mapping (address => uint256) private ownerToNFTokenCount;

  /**
   * @dev Mapping from owner address to mapping of operator addresses.
   */
  mapping (address => mapping (address => bool)) internal ownerToOperators;

  /**
   * @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier canOperate(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that the msg.sender is allowed to transfer NFT.
   * @param _tokenId ID of the NFT to transfer.
   */
  modifier canTransfer(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender
      || idToApproval[_tokenId] == msg.sender
      || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_APPROVED_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that _tokenId is a valid Token.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier validNFToken(
    uint256 _tokenId
  )
  {
    require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT);
    _;
  }

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x80ac58cd] = true; // ERC721
  }

  /**
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, _data);
  }

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to "".
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);
  }

  /**
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @param _approved Address to be approved for the given NFT ID.
   * @param _tokenId ID of the token to be approved.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external
    override
    canOperate(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(_approved != tokenOwner, IS_OWNER);

    idToApproval[_tokenId] = _approved;
    emit Approval(tokenOwner, _approved, _tokenId);
  }

  /**
   * @notice This works even if sender doesn't own any tokens at the time.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external
    override
  {
    ownerToOperators[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    override
    view
    returns (uint256)
  {
    require(_owner != address(0), ZERO_ADDRESS);
    return _getOwnerNFTCount(_owner);
  }

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return _owner Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    override
    view
    returns (address _owner)
  {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0), NOT_VALID_NFT);
  }

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single NFT.
   * @param _tokenId ID of the NFT to query the approval of.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (address)
  {
    return idToApproval[_tokenId];
  }

  /**
   * @dev Checks if `_operator` is an approved operator for `_owner`.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    override
    view
    returns (bool)
  {
    return ownerToOperators[_owner][_operator];
  }

  /**
   * @notice Does NO checks.
   * @dev Actually performs the transfer.
   * @param _to Address of a new owner.
   * @param _tokenId The NFT that is being transferred.
   */
  function _transfer(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    address from = idToOwner[_tokenId];
    _clearApproval(_tokenId);

    _removeNFToken(from, _tokenId);
    _addNFToken(_to, _tokenId);

    emit Transfer(from, _to, _tokenId);
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @dev Mints a new NFT.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(_to != address(0), ZERO_ADDRESS);
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    _addNFToken(_to, _tokenId);

    emit Transfer(address(0), _to, _tokenId);
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external burn
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @dev Burns a NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    virtual
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    _clearApproval(_tokenId);
    _removeNFToken(tokenOwner, _tokenId);
    emit Transfer(tokenOwner, address(0), _tokenId);
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Removes a NFT from owner.
   * @param _from Address from which we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    ownerToNFTokenCount[_from] -= 1;
    delete idToOwner[_tokenId];
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Assigns a new NFT to owner.
   * @param _to Address to which we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    idToOwner[_tokenId] = _to;
    ownerToNFTokenCount[_to] += 1;
  }

  /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage (gas optimization) of owner NFT count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    virtual
    view
    returns (uint256)
  {
    return ownerToNFTokenCount[_owner];
  }

  /**
   * @dev Actually perform the safeTransferFrom.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function _safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes memory _data
  )
    private
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);

    if (_to.isContract())
    {
      bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
      require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT);
    }
  }

  /**
   * @dev Clears the current approval of a given NFT ID.
   * @param _tokenId ID of the NFT to be transferred.
   */
  function _clearApproval(
    uint256 _tokenId
  )
    private
  {
    delete idToApproval[_tokenId];
  }

}

// File: https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/nf-token-metadata.sol


pragma solidity ^0.8.0;



/**
 * @dev Optional metadata implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenMetadata is
  NFToken,
  ERC721Metadata
{

  /**
   * @dev A descriptive name for a collection of NFTs.
   */
  string internal nftName;

  /**
   * @dev An abbreviated name for NFTokens.
   */
  string internal nftSymbol;

  /**
   * @dev Mapping from NFT ID to metadata uri.
   */
  mapping (uint256 => string) internal idToUri;

  /**
   * @notice When implementing this contract don't forget to set nftName and nftSymbol.
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
  }

  /**
   * @dev Returns a descriptive name for a collection of NFTokens.
   * @return _name Representing name.
   */
  function name()
    external
    override
    view
    returns (string memory _name)
  {
    _name = nftName;
  }

  /**
   * @dev Returns an abbreviated name for NFTokens.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    override
    view
    returns (string memory _symbol)
  {
    _symbol = nftSymbol;
  }

  /**
   * @dev A distinct URI (RFC 3986) for a given NFT.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */
  function tokenURI(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (string memory)
  {
    return _tokenURI(_tokenId);
  }

  /**
   * @notice This is an internal function that can be overriden if you want to implement a different
   * way to generate token URI.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */
  function _tokenURI(
    uint256 _tokenId
  )
    internal
    virtual
    view
    returns (string memory)
  {
    return idToUri[_tokenId];
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @dev Burns a NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._burn(_tokenId);

    delete idToUri[_tokenId];
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @dev Set a distinct URI (RFC 3986) for a given NFT ID.
   * @param _tokenId Id for which we want URI.
   * @param _uri String representing RFC 3986 URI.
   */
  function _setTokenUri(
    uint256 _tokenId,
    string memory _uri
  )
    internal
    validNFToken(_tokenId)
  {
    idToUri[_tokenId] = _uri;
  }

}

// File: iconoclast.sol


pragma solidity 0.8.6;


 
contract iconoclastNFT is NFTokenMetadata, Ownable {
 
  constructor() {
    nftName = "ICONOCLAST";
    nftSymbol = "ICT";
  }
 
  function mint(address _to, uint256 _tokenId, string calldata _uri) external onlyOwner {
    super._mint(_to, _tokenId);
    super._setTokenUri(_tokenId, _uri);
  }
 
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600a81526020017f49434f4e4f434c415354000000000000000000000000000000000000000000008152506005908051906020019062000193929190620001e8565b506040518060400160405280600381526020017f494354000000000000000000000000000000000000000000000000000000000081525060069080519060200190620001e1929190620001e8565b50620002fd565b828054620001f69062000298565b90600052602060002090601f0160209004810192826200021a576000855562000266565b82601f106200023557805160ff191683800117855562000266565b8280016001018555821562000266579182015b828111156200026557825182559160200191906001019062000248565b5b50905062000275919062000279565b5090565b5b80821115620002945760008160009055506001016200027a565b5090565b60006002820490506001821680620002b157607f821691505b60208210811415620002c857620002c7620002ce565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612d67806200030d6000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c80638da5cb5b116100a2578063c87b56dd11610071578063c87b56dd146102df578063d3fc98641461030f578063e985e9c51461032b578063f2fde38b1461035b578063f3fe3bc31461037757610116565b80638da5cb5b1461026b57806395d89b4114610289578063a22cb465146102a7578063b88d4fde146102c357610116565b806323b872dd116100e957806323b872dd146101b557806342842e0e146101d15780636352211e146101ed57806370a082311461021d578063860d248a1461024d57610116565b806301ffc9a71461011b57806306fdde031461014b578063081812fc14610169578063095ea7b314610199575b600080fd5b610135600480360381019061013091906128cd565b610395565b6040516101429190612a5a565b60405180910390f35b6101536103fc565b6040516101609190612a75565b60405180910390f35b610183600480360381019061017e9190612927565b61048e565b60405161019091906129f3565b60405180910390f35b6101b360048036038101906101ae9190612819565b6105a9565b005b6101cf60048036038101906101ca91906126fe565b61098c565b005b6101eb60048036038101906101e691906126fe565b610dde565b005b61020760048036038101906102029190612927565b610dfe565b60405161021491906129f3565b60405180910390f35b61023760048036038101906102329190612691565b610ee4565b6040516102449190612a97565b60405180910390f35b610255610f9e565b6040516102629190612a75565b60405180910390f35b610273610fd7565b60405161028091906129f3565b60405180910390f35b610291610ffd565b60405161029e9190612a75565b60405180910390f35b6102c160048036038101906102bc91906127d9565b61108f565b005b6102dd60048036038101906102d89190612751565b61118c565b005b6102f960048036038101906102f49190612927565b6111e3565b6040516103069190612a75565b60405180910390f35b61032960048036038101906103249190612859565b6112d3565b005b610345600480360381019061034091906126be565b6113fa565b6040516103529190612a5a565b60405180910390f35b61037560048036038101906103709190612691565b61148e565b005b61037f6116c0565b60405161038c9190612a75565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60606005805461040b90612c1b565b80601f016020809104026020016040519081016040528092919081815260200182805461043790612c1b565b80156104845780601f1061045957610100808354040283529160200191610484565b820191906000526020600020905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061056c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105639190612a75565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806106a25750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610719576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107109190612a75565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906107f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ed9190612a75565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030380000000000000000000000000000000000000000000000000000815250906108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd9190612a75565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610a5d57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610aee5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c9190612a75565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c399190612a75565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090610d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d189190612a75565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc19190612a75565b60405180910390fd5b50610dd586866116f9565b50505050505050565b610df9838383604051806020016040528060008152506117ae565b505050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed59190612a75565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090610f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f849190612a75565b60405180910390fd5b50610f9782611d7c565b9050919050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606006805461100c90612c1b565b80601f016020809104026020016040519081016040528092919081815260200182805461103890612c1b565b80156110855780601f1061105a57610100808354040283529160200191611085565b820191906000526020600020905b81548152906001019060200180831161106857829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111809190612a5a565b60405180910390a35050565b6111dc85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506117ae565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b89190612a75565b60405180910390fd5b506112cb83611dc5565b915050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061139b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113929190612a75565b60405180910390fd5b506113a68484611e6a565b6113f48383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612058565b50505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d9190612a75565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3031383030320000000000000000000000000000000000000000000000000000815250906115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f69190612a75565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061173a82612162565b611744818361219b565b61174e8383612306565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061187f57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806119105750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e9190612a75565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5b9190612a75565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a9190612a75565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be39190612a75565b60405180910390fd5b50611bf787876116f9565b611c168773ffffffffffffffffffffffffffffffffffffffff1661248e565b15611d725760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401611c5c9493929190612a0e565b602060405180830381600087803b158015611c7657600080fd5b505af1158015611c8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cae91906128fa565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f303033303035000000000000000000000000000000000000000000000000000081525090611d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d669190612a75565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600760008381526020019081526020016000208054611de590612c1b565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1190612c1b565b8015611e5e5780601f10611e3357610100808354040283529160200191611e5e565b820191906000526020600020905b815481529060010190602001808311611e4157829003601f168201915b50505050509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f099190612a75565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090611fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe49190612a75565b60405180910390fd5b50611ff88282612306565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b9190612a75565b60405180910390fd5b508160076000858152602001908152602001600020908051906020019061215c9291906124d9565b50505050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090612274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226b9190612a75565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122c59190612b40565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d79190612a75565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124839190612aea565b925050819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156124d05750808214155b92505050919050565b8280546124e590612c1b565b90600052602060002090601f016020900481019282612507576000855561254e565b82601f1061252057805160ff191683800117855561254e565b8280016001018555821561254e579182015b8281111561254d578251825591602001919060010190612532565b5b50905061255b919061255f565b5090565b5b80821115612578576000816000905550600101612560565b5090565b60008135905061258b81612cd5565b92915050565b6000813590506125a081612cec565b92915050565b6000813590506125b581612d03565b92915050565b6000815190506125ca81612d03565b92915050565b60008083601f8401126125e6576125e5612cb0565b5b8235905067ffffffffffffffff81111561260357612602612cab565b5b60208301915083600182028301111561261f5761261e612cb5565b5b9250929050565b60008083601f84011261263c5761263b612cb0565b5b8235905067ffffffffffffffff81111561265957612658612cab565b5b60208301915083600182028301111561267557612674612cb5565b5b9250929050565b60008135905061268b81612d1a565b92915050565b6000602082840312156126a7576126a6612cbf565b5b60006126b58482850161257c565b91505092915050565b600080604083850312156126d5576126d4612cbf565b5b60006126e38582860161257c565b92505060206126f48582860161257c565b9150509250929050565b60008060006060848603121561271757612716612cbf565b5b60006127258682870161257c565b93505060206127368682870161257c565b92505060406127478682870161267c565b9150509250925092565b60008060008060006080868803121561276d5761276c612cbf565b5b600061277b8882890161257c565b955050602061278c8882890161257c565b945050604061279d8882890161267c565b935050606086013567ffffffffffffffff8111156127be576127bd612cba565b5b6127ca888289016125d0565b92509250509295509295909350565b600080604083850312156127f0576127ef612cbf565b5b60006127fe8582860161257c565b925050602061280f85828601612591565b9150509250929050565b600080604083850312156128305761282f612cbf565b5b600061283e8582860161257c565b925050602061284f8582860161267c565b9150509250929050565b6000806000806060858703121561287357612872612cbf565b5b60006128818782880161257c565b94505060206128928782880161267c565b935050604085013567ffffffffffffffff8111156128b3576128b2612cba565b5b6128bf87828801612626565b925092505092959194509250565b6000602082840312156128e3576128e2612cbf565b5b60006128f1848285016125a6565b91505092915050565b6000602082840312156129105761290f612cbf565b5b600061291e848285016125bb565b91505092915050565b60006020828403121561293d5761293c612cbf565b5b600061294b8482850161267c565b91505092915050565b61295d81612b74565b82525050565b61296c81612b86565b82525050565b600061297d82612ab2565b6129878185612ac8565b9350612997818560208601612be8565b6129a081612cc4565b840191505092915050565b60006129b682612abd565b6129c08185612ad9565b93506129d0818560208601612be8565b6129d981612cc4565b840191505092915050565b6129ed81612bde565b82525050565b6000602082019050612a086000830184612954565b92915050565b6000608082019050612a236000830187612954565b612a306020830186612954565b612a3d60408301856129e4565b8181036060830152612a4f8184612972565b905095945050505050565b6000602082019050612a6f6000830184612963565b92915050565b60006020820190508181036000830152612a8f81846129ab565b905092915050565b6000602082019050612aac60008301846129e4565b92915050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612af582612bde565b9150612b0083612bde565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b3557612b34612c4d565b5b828201905092915050565b6000612b4b82612bde565b9150612b5683612bde565b925082821015612b6957612b68612c4d565b5b828203905092915050565b6000612b7f82612bbe565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015612c06578082015181840152602081019050612beb565b83811115612c15576000848401525b50505050565b60006002820490506001821680612c3357607f821691505b60208210811415612c4757612c46612c7c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b612cde81612b74565b8114612ce957600080fd5b50565b612cf581612b86565b8114612d0057600080fd5b50565b612d0c81612b92565b8114612d1757600080fd5b50565b612d2381612bde565b8114612d2e57600080fd5b5056fea26469706673582212203f77eb2f12492a7e8230ba8447ef61d34568ac3a4a731a3ea0081f03fd3b42d964736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101165760003560e01c80638da5cb5b116100a2578063c87b56dd11610071578063c87b56dd146102df578063d3fc98641461030f578063e985e9c51461032b578063f2fde38b1461035b578063f3fe3bc31461037757610116565b80638da5cb5b1461026b57806395d89b4114610289578063a22cb465146102a7578063b88d4fde146102c357610116565b806323b872dd116100e957806323b872dd146101b557806342842e0e146101d15780636352211e146101ed57806370a082311461021d578063860d248a1461024d57610116565b806301ffc9a71461011b57806306fdde031461014b578063081812fc14610169578063095ea7b314610199575b600080fd5b610135600480360381019061013091906128cd565b610395565b6040516101429190612a5a565b60405180910390f35b6101536103fc565b6040516101609190612a75565b60405180910390f35b610183600480360381019061017e9190612927565b61048e565b60405161019091906129f3565b60405180910390f35b6101b360048036038101906101ae9190612819565b6105a9565b005b6101cf60048036038101906101ca91906126fe565b61098c565b005b6101eb60048036038101906101e691906126fe565b610dde565b005b61020760048036038101906102029190612927565b610dfe565b60405161021491906129f3565b60405180910390f35b61023760048036038101906102329190612691565b610ee4565b6040516102449190612a97565b60405180910390f35b610255610f9e565b6040516102629190612a75565b60405180910390f35b610273610fd7565b60405161028091906129f3565b60405180910390f35b610291610ffd565b60405161029e9190612a75565b60405180910390f35b6102c160048036038101906102bc91906127d9565b61108f565b005b6102dd60048036038101906102d89190612751565b61118c565b005b6102f960048036038101906102f49190612927565b6111e3565b6040516103069190612a75565b60405180910390f35b61032960048036038101906103249190612859565b6112d3565b005b610345600480360381019061034091906126be565b6113fa565b6040516103529190612a5a565b60405180910390f35b61037560048036038101906103709190612691565b61148e565b005b61037f6116c0565b60405161038c9190612a75565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60606005805461040b90612c1b565b80601f016020809104026020016040519081016040528092919081815260200182805461043790612c1b565b80156104845780601f1061045957610100808354040283529160200191610484565b820191906000526020600020905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061056c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105639190612a75565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806106a25750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610719576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107109190612a75565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906107f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ed9190612a75565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030380000000000000000000000000000000000000000000000000000815250906108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd9190612a75565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610a5d57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610aee5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c9190612a75565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c399190612a75565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090610d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d189190612a75565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc19190612a75565b60405180910390fd5b50610dd586866116f9565b50505050505050565b610df9838383604051806020016040528060008152506117ae565b505050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed59190612a75565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090610f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f849190612a75565b60405180910390fd5b50610f9782611d7c565b9050919050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606006805461100c90612c1b565b80601f016020809104026020016040519081016040528092919081815260200182805461103890612c1b565b80156110855780601f1061105a57610100808354040283529160200191611085565b820191906000526020600020905b81548152906001019060200180831161106857829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111809190612a5a565b60405180910390a35050565b6111dc85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506117ae565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b89190612a75565b60405180910390fd5b506112cb83611dc5565b915050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061139b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113929190612a75565b60405180910390fd5b506113a68484611e6a565b6113f48383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612058565b50505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d9190612a75565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3031383030320000000000000000000000000000000000000000000000000000815250906115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f69190612a75565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061173a82612162565b611744818361219b565b61174e8383612306565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061187f57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806119105750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e9190612a75565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5b9190612a75565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a9190612a75565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be39190612a75565b60405180910390fd5b50611bf787876116f9565b611c168773ffffffffffffffffffffffffffffffffffffffff1661248e565b15611d725760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401611c5c9493929190612a0e565b602060405180830381600087803b158015611c7657600080fd5b505af1158015611c8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cae91906128fa565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f303033303035000000000000000000000000000000000000000000000000000081525090611d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d669190612a75565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600760008381526020019081526020016000208054611de590612c1b565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1190612c1b565b8015611e5e5780601f10611e3357610100808354040283529160200191611e5e565b820191906000526020600020905b815481529060010190602001808311611e4157829003601f168201915b50505050509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f099190612a75565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090611fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe49190612a75565b60405180910390fd5b50611ff88282612306565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b9190612a75565b60405180910390fd5b508160076000858152602001908152602001600020908051906020019061215c9291906124d9565b50505050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090612274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226b9190612a75565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122c59190612b40565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d79190612a75565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124839190612aea565b925050819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156124d05750808214155b92505050919050565b8280546124e590612c1b565b90600052602060002090601f016020900481019282612507576000855561254e565b82601f1061252057805160ff191683800117855561254e565b8280016001018555821561254e579182015b8281111561254d578251825591602001919060010190612532565b5b50905061255b919061255f565b5090565b5b80821115612578576000816000905550600101612560565b5090565b60008135905061258b81612cd5565b92915050565b6000813590506125a081612cec565b92915050565b6000813590506125b581612d03565b92915050565b6000815190506125ca81612d03565b92915050565b60008083601f8401126125e6576125e5612cb0565b5b8235905067ffffffffffffffff81111561260357612602612cab565b5b60208301915083600182028301111561261f5761261e612cb5565b5b9250929050565b60008083601f84011261263c5761263b612cb0565b5b8235905067ffffffffffffffff81111561265957612658612cab565b5b60208301915083600182028301111561267557612674612cb5565b5b9250929050565b60008135905061268b81612d1a565b92915050565b6000602082840312156126a7576126a6612cbf565b5b60006126b58482850161257c565b91505092915050565b600080604083850312156126d5576126d4612cbf565b5b60006126e38582860161257c565b92505060206126f48582860161257c565b9150509250929050565b60008060006060848603121561271757612716612cbf565b5b60006127258682870161257c565b93505060206127368682870161257c565b92505060406127478682870161267c565b9150509250925092565b60008060008060006080868803121561276d5761276c612cbf565b5b600061277b8882890161257c565b955050602061278c8882890161257c565b945050604061279d8882890161267c565b935050606086013567ffffffffffffffff8111156127be576127bd612cba565b5b6127ca888289016125d0565b92509250509295509295909350565b600080604083850312156127f0576127ef612cbf565b5b60006127fe8582860161257c565b925050602061280f85828601612591565b9150509250929050565b600080604083850312156128305761282f612cbf565b5b600061283e8582860161257c565b925050602061284f8582860161267c565b9150509250929050565b6000806000806060858703121561287357612872612cbf565b5b60006128818782880161257c565b94505060206128928782880161267c565b935050604085013567ffffffffffffffff8111156128b3576128b2612cba565b5b6128bf87828801612626565b925092505092959194509250565b6000602082840312156128e3576128e2612cbf565b5b60006128f1848285016125a6565b91505092915050565b6000602082840312156129105761290f612cbf565b5b600061291e848285016125bb565b91505092915050565b60006020828403121561293d5761293c612cbf565b5b600061294b8482850161267c565b91505092915050565b61295d81612b74565b82525050565b61296c81612b86565b82525050565b600061297d82612ab2565b6129878185612ac8565b9350612997818560208601612be8565b6129a081612cc4565b840191505092915050565b60006129b682612abd565b6129c08185612ad9565b93506129d0818560208601612be8565b6129d981612cc4565b840191505092915050565b6129ed81612bde565b82525050565b6000602082019050612a086000830184612954565b92915050565b6000608082019050612a236000830187612954565b612a306020830186612954565b612a3d60408301856129e4565b8181036060830152612a4f8184612972565b905095945050505050565b6000602082019050612a6f6000830184612963565b92915050565b60006020820190508181036000830152612a8f81846129ab565b905092915050565b6000602082019050612aac60008301846129e4565b92915050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612af582612bde565b9150612b0083612bde565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b3557612b34612c4d565b5b828201905092915050565b6000612b4b82612bde565b9150612b5683612bde565b925082821015612b6957612b68612c4d565b5b828203905092915050565b6000612b7f82612bbe565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015612c06578082015181840152602081019050612beb565b83811115612c15576000848401525b50505050565b60006002820490506001821680612c3357607f821691505b60208210811415612c4757612c46612c7c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b612cde81612b74565b8114612ce957600080fd5b50565b612cf581612b86565b8114612d0057600080fd5b50565b612d0c81612b92565b8114612d1757600080fd5b50565b612d2381612bde565b8114612d2e57600080fd5b5056fea26469706673582212203f77eb2f12492a7e8230ba8447ef61d34568ac3a4a731a3ea0081f03fd3b42d964736f6c63430008060033

Deployed Bytecode Sourcemap

29878:311:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5629:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27613:120;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21578:183;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19363:352;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18589:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17834:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21126:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20652:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;547:65;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;667:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27849:128;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20126:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17214:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28130:183;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30017:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22030:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1492:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;491:51;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5629:172;5739:4;5762:19;:33;5782:12;5762:33;;;;;;;;;;;;;;;;;;;;;;;;;;;5755:40;;5629:172;;;:::o;27613:120::-;27681:19;27720:7;27712:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27613:120;:::o;21578:183::-;21707:7;21683:8;16177:1;16146:33;;:9;:19;16156:8;16146:19;;;;;;;;;;;;;;;;;;;;;:33;;;;16181:13;;;;;;;;;;;;;;;;;16138:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21733:12:::1;:22;21746:8;21733:22;;;;;;;;;;;;;;;;;;;;;21726:29;;21578:183:::0;;;;:::o;19363:352::-;19476:8;15330:18;15351:9;:19;15361:8;15351:19;;;;;;;;;;;;;;;;;;;;;15330:40;;15407:10;15393:24;;:10;:24;;;:68;;;;15421:16;:28;15438:10;15421:28;;;;;;;;;;;;;;;:40;15450:10;15421:40;;;;;;;;;;;;;;;;;;;;;;;;;15393:68;15470:21;;;;;;;;;;;;;;;;;15377:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;19504:8:::1;16177:1;16146:33;;:9;:19;16156:8;16146:19;;;;;;;;;;;;;;;;;;;;;:33;;;;16181:13;;;;;;;;;;;;;;;;::::0;16138:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;19524:18:::2;19545:9;:19;19555:8;19545:19;;;;;;;;;;;;;;;;;;;;;19524:40;;19592:10;19579:23;;:9;:23;;;;19604:8;;;;;;;;;;;;;;;;::::0;19571:42:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;19647:9;19622:12;:22;19635:8;19622:22;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;19700:8;19689:9;19668:41;;19677:10;19668:41;;;;;;;;;;;;19517:198;15505:1:::1;15323:189:::0;19363:352;;;:::o;18589:353::-;18722:8;15710:18;15731:9;:19;15741:8;15731:19;;;;;;;;;;;;;;;;;;;;;15710:40;;15787:10;15773:24;;:10;:24;;;:71;;;;15834:10;15808:36;;:12;:22;15821:8;15808:22;;;;;;;;;;;;;;;;;;;;;:36;;;15773:71;:122;;;;15855:16;:28;15872:10;15855:28;;;;;;;;;;;;;;;:40;15884:10;15855:40;;;;;;;;;;;;;;;;;;;;;;;;;15773:122;15904:30;;;;;;;;;;;;;;;;;15757:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18750:8:::1;16177:1;16146:33;;:9;:19;16156:8;16146:19;;;;;;;;;;;;;;;;;;;;;:33;;;;16181:13;;;;;;;;;;;;;;;;::::0;16138:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18770:18:::2;18791:9;:19;18801:8;18791:19;;;;;;;;;;;;;;;;;;;;;18770:40;;18839:5;18825:19;;:10;:19;;;18846:9;;;;;;;;;;;;;;;;::::0;18817:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18886:1;18871:17;;:3;:17;;;;18890:12;;;;;;;;;;;;;;;;::::0;18863:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18912:24;18922:3;18927:8;18912:9;:24::i;:::-;18763:179;15948:1:::1;15703:252:::0;18589:353;;;;:::o;17834:179::-;17964:43;17982:5;17989:3;17994:8;17964:43;;;;;;;;;;;;:17;:43::i;:::-;17834:179;;;:::o;21126:208::-;21223:14;21258:9;:19;21268:8;21258:19;;;;;;;;;;;;;;;;;;;;;21249:28;;21310:1;21292:20;;:6;:20;;;;21314:13;;;;;;;;;;;;;;;;;21284:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21126:208;;;:::o;20652:204::-;20749:7;20794:1;20776:20;;:6;:20;;;;20798:12;;;;;;;;;;;;;;;;;20768:43;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20825:25;20843:6;20825:17;:25::i;:::-;20818:32;;20652:204;;;:::o;547:65::-;;;;;;;;;;;;;;;;;;;:::o;667:20::-;;;;;;;;;;;;;:::o;27849:128::-;27919:21;27962:9;27952:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27849:128;:::o;20126:232::-;20283:9;20241:16;:28;20258:10;20241:28;;;;;;;;;;;;;;;:39;20270:9;20241:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;20331:9;20304:48;;20319:10;20304:48;;;20342:9;20304:48;;;;;;:::i;:::-;;;;;;;;20126:232;;:::o;17214:209::-;17371:46;17389:5;17396:3;17401:8;17411:5;;17371:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;17214:209;;;;;:::o;28130:183::-;28256:13;28232:8;16177:1;16146:33;;:9;:19;16156:8;16146:19;;;;;;;;;;;;;;;;;;;;;:33;;;;16181:13;;;;;;;;;;;;;;;;;16138:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;28288:19:::1;28298:8;28288:9;:19::i;:::-;28281:26;;28130:183:::0;;;;:::o;30017:166::-;1285:5;;;;;;;;;;;1271:19;;:10;:19;;;1292:17;;;;;;;;;;;;;;;;;1263:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;30110:26:::1;30122:3;30127:8;30110:11;:26::i;:::-;30143:34;30162:8;30172:4;;30143:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:34::i;:::-;30017:166:::0;;;;:::o;22030:192::-;22158:4;22181:16;:24;22198:6;22181:24;;;;;;;;;;;;;;;:35;22206:9;22181:35;;;;;;;;;;;;;;;;;;;;;;;;;22174:42;;22030:192;;;;:::o;1492:238::-;1285:5;;;;;;;;;;;1271:19;;:10;:19;;;1292:17;;;;;;;;;;;;;;;;;1263:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1614:1:::1;1593:23;;:9;:23;;;;1618:31;;;;;;;;;;;;;;;;::::0;1585:65:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1690:9;1662:38;;1683:5;;;;;;;;;;;1662:38;;;;;;;;;;;;1715:9;1707:5;;:17;;;;;;;;;;;;;;;;;;1492:238:::0;:::o;491:51::-;;;;;;;;;;;;;;;;;;;:::o;22413:288::-;22515:12;22530:9;:19;22540:8;22530:19;;;;;;;;;;;;;;;;;;;;;22515:34;;22556:24;22571:8;22556:14;:24::i;:::-;22589:30;22604:4;22610:8;22589:14;:30::i;:::-;22626:26;22638:3;22643:8;22626:11;:26::i;:::-;22686:8;22681:3;22666:29;;22675:4;22666:29;;;;;;;;;;;;22508:193;22413:288;;:::o;25829:590::-;25977:8;15710:18;15731:9;:19;15741:8;15731:19;;;;;;;;;;;;;;;;;;;;;15710:40;;15787:10;15773:24;;:10;:24;;;:71;;;;15834:10;15808:36;;:12;:22;15821:8;15808:22;;;;;;;;;;;;;;;;;;;;;:36;;;15773:71;:122;;;;15855:16;:28;15872:10;15855:28;;;;;;;;;;;;;;;:40;15884:10;15855:40;;;;;;;;;;;;;;;;;;;;;;;;;15773:122;15904:30;;;;;;;;;;;;;;;;;15757:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26005:8:::1;16177:1;16146:33;;:9;:19;16156:8;16146:19;;;;;;;;;;;;;;;;;;;;;:33;;;;16181:13;;;;;;;;;;;;;;;;::::0;16138:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26025:18:::2;26046:9;:19;26056:8;26046:19;;;;;;;;;;;;;;;;;;;;;26025:40;;26094:5;26080:19;;:10;:19;;;26101:9;;;;;;;;;;;;;;;;::::0;26072:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26141:1;26126:17;;:3;:17;;;;26145:12;;;;;;;;;;;;;;;;::::0;26118:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26167:24;26177:3;26182:8;26167:9;:24::i;:::-;26204:16;:3;:14;;;:16::i;:::-;26200:214;;;26236:13;26272:3;26252:41;;;26294:10;26306:5;26313:8;26323:5;26252:77;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26236:93;;14548:10;26356:24;;26346:34;;;:6;:34;;;;26382:23;;;;;;;;;;;;;;;;::::0;26338:68:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26227:187;26200:214;26018:401;15948:1:::1;15703:252:::0;25829:590;;;;;:::o;25388:163::-;25492:7;25518:19;:27;25538:6;25518:27;;;;;;;;;;;;;;;;25511:34;;25388:163;;;:::o;28547:153::-;28645:13;28677:7;:17;28685:8;28677:17;;;;;;;;;;;28670:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28547:153;;;:::o;23092:297::-;23213:1;23198:17;;:3;:17;;;;23217:12;;;;;;;;;;;;;;;;;23190:40;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23276:1;23245:33;;:9;:19;23255:8;23245:19;;;;;;;;;;;;;;;;;;;;;:33;;;23280:18;;;;;;;;;;;;;;;;;23237:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23308:26;23320:3;23325:8;23308:11;:26::i;:::-;23374:8;23369:3;23348:35;;23365:1;23348:35;;;;;;;;;;;;23092:297;;:::o;29652:157::-;29759:8;16177:1;16146:33;;:9;:19;16156:8;16146:19;;;;;;;;;;;;;;;;;;;;;:33;;;;16181:13;;;;;;;;;;;;;;;;;16138:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29799:4:::1;29779:7;:17;29787:8;29779:17;;;;;;;;;;;:24;;;;;;;;;;;;:::i;:::-;;29652:157:::0;;;:::o;26552:110::-;26634:12;:22;26647:8;26634:22;;;;;;;;;;;;26627:29;;;;;;;;;;;26552:110;:::o;24349:234::-;24489:5;24466:28;;:9;:19;24476:8;24466:19;;;;;;;;;;;;;;;;;;;;;:28;;;24496:9;;;;;;;;;;;;;;;;;24458:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24543:1;24513:19;:26;24533:5;24513:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;24558:9;:19;24568:8;24558:19;;;;;;;;;;;;24551:26;;;;;;;;;;;24349:234;;:::o;24850:242::-;24993:1;24962:33;;:9;:19;24972:8;24962:19;;;;;;;;;;;;;;;;;;;;;:33;;;24997:18;;;;;;;;;;;;;;;;;24954:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25047:3;25025:9;:19;25035:8;25025:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;25085:1;25057:19;:24;25077:3;25057:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;24850:242;;:::o;3433:780::-;3516:17;3957:16;3980:19;4002:66;3980:88;;;;4110:5;4098:18;4086:30;;4176:3;4164:15;;:8;:15;;:42;;;;;4195:11;4183:8;:23;;4164:42;4148:59;;3538:675;;3433:780;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:133::-;195:5;233:6;220:20;211:29;;249:30;273:5;249:30;:::i;:::-;201:84;;;;:::o;291:137::-;336:5;374:6;361:20;352:29;;390:32;416:5;390:32;:::i;:::-;342:86;;;;:::o;434:141::-;490:5;521:6;515:13;506:22;;537:32;563:5;537:32;:::i;:::-;496:79;;;;:::o;594:552::-;651:8;661:6;711:3;704:4;696:6;692:17;688:27;678:2;;719:79;;:::i;:::-;678:2;832:6;819:20;809:30;;862:18;854:6;851:30;848:2;;;884:79;;:::i;:::-;848:2;998:4;990:6;986:17;974:29;;1052:3;1044:4;1036:6;1032:17;1022:8;1018:32;1015:41;1012:2;;;1059:79;;:::i;:::-;1012:2;668:478;;;;;:::o;1166:553::-;1224:8;1234:6;1284:3;1277:4;1269:6;1265:17;1261:27;1251:2;;1292:79;;:::i;:::-;1251:2;1405:6;1392:20;1382:30;;1435:18;1427:6;1424:30;1421:2;;;1457:79;;:::i;:::-;1421:2;1571:4;1563:6;1559:17;1547:29;;1625:3;1617:4;1609:6;1605:17;1595:8;1591:32;1588:41;1585:2;;;1632:79;;:::i;:::-;1585:2;1241:478;;;;;:::o;1725:139::-;1771:5;1809:6;1796:20;1787:29;;1825:33;1852:5;1825:33;:::i;:::-;1777:87;;;;:::o;1870:329::-;1929:6;1978:2;1966:9;1957:7;1953:23;1949:32;1946:2;;;1984:79;;:::i;:::-;1946:2;2104:1;2129:53;2174:7;2165:6;2154:9;2150:22;2129:53;:::i;:::-;2119:63;;2075:117;1936:263;;;;:::o;2205:474::-;2273:6;2281;2330:2;2318:9;2309:7;2305:23;2301:32;2298:2;;;2336:79;;:::i;:::-;2298:2;2456:1;2481:53;2526:7;2517:6;2506:9;2502:22;2481:53;:::i;:::-;2471:63;;2427:117;2583:2;2609:53;2654:7;2645:6;2634:9;2630:22;2609:53;:::i;:::-;2599:63;;2554:118;2288:391;;;;;:::o;2685:619::-;2762:6;2770;2778;2827:2;2815:9;2806:7;2802:23;2798:32;2795:2;;;2833:79;;:::i;:::-;2795:2;2953:1;2978:53;3023:7;3014:6;3003:9;2999:22;2978:53;:::i;:::-;2968:63;;2924:117;3080:2;3106:53;3151:7;3142:6;3131:9;3127:22;3106:53;:::i;:::-;3096:63;;3051:118;3208:2;3234:53;3279:7;3270:6;3259:9;3255:22;3234:53;:::i;:::-;3224:63;;3179:118;2785:519;;;;;:::o;3310:963::-;3407:6;3415;3423;3431;3439;3488:3;3476:9;3467:7;3463:23;3459:33;3456:2;;;3495:79;;:::i;:::-;3456:2;3615:1;3640:53;3685:7;3676:6;3665:9;3661:22;3640:53;:::i;:::-;3630:63;;3586:117;3742:2;3768:53;3813:7;3804:6;3793:9;3789:22;3768:53;:::i;:::-;3758:63;;3713:118;3870:2;3896:53;3941:7;3932:6;3921:9;3917:22;3896:53;:::i;:::-;3886:63;;3841:118;4026:2;4015:9;4011:18;3998:32;4057:18;4049:6;4046:30;4043:2;;;4079:79;;:::i;:::-;4043:2;4192:64;4248:7;4239:6;4228:9;4224:22;4192:64;:::i;:::-;4174:82;;;;3969:297;3446:827;;;;;;;;:::o;4279:468::-;4344:6;4352;4401:2;4389:9;4380:7;4376:23;4372:32;4369:2;;;4407:79;;:::i;:::-;4369:2;4527:1;4552:53;4597:7;4588:6;4577:9;4573:22;4552:53;:::i;:::-;4542:63;;4498:117;4654:2;4680:50;4722:7;4713:6;4702:9;4698:22;4680:50;:::i;:::-;4670:60;;4625:115;4359:388;;;;;:::o;4753:474::-;4821:6;4829;4878:2;4866:9;4857:7;4853:23;4849:32;4846:2;;;4884:79;;:::i;:::-;4846:2;5004:1;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4975:117;5131:2;5157:53;5202:7;5193:6;5182:9;5178:22;5157:53;:::i;:::-;5147:63;;5102:118;4836:391;;;;;:::o;5233:819::-;5322:6;5330;5338;5346;5395:2;5383:9;5374:7;5370:23;5366:32;5363:2;;;5401:79;;:::i;:::-;5363:2;5521:1;5546:53;5591:7;5582:6;5571:9;5567:22;5546:53;:::i;:::-;5536:63;;5492:117;5648:2;5674:53;5719:7;5710:6;5699:9;5695:22;5674:53;:::i;:::-;5664:63;;5619:118;5804:2;5793:9;5789:18;5776:32;5835:18;5827:6;5824:30;5821:2;;;5857:79;;:::i;:::-;5821:2;5970:65;6027:7;6018:6;6007:9;6003:22;5970:65;:::i;:::-;5952:83;;;;5747:298;5353:699;;;;;;;:::o;6058:327::-;6116:6;6165:2;6153:9;6144:7;6140:23;6136:32;6133:2;;;6171:79;;:::i;:::-;6133:2;6291:1;6316:52;6360:7;6351:6;6340:9;6336:22;6316:52;:::i;:::-;6306:62;;6262:116;6123:262;;;;:::o;6391:349::-;6460:6;6509:2;6497:9;6488:7;6484:23;6480:32;6477:2;;;6515:79;;:::i;:::-;6477:2;6635:1;6660:63;6715:7;6706:6;6695:9;6691:22;6660:63;:::i;:::-;6650:73;;6606:127;6467:273;;;;:::o;6746:329::-;6805:6;6854:2;6842:9;6833:7;6829:23;6825:32;6822:2;;;6860:79;;:::i;:::-;6822:2;6980:1;7005:53;7050:7;7041:6;7030:9;7026:22;7005:53;:::i;:::-;6995:63;;6951:117;6812:263;;;;:::o;7081:118::-;7168:24;7186:5;7168:24;:::i;:::-;7163:3;7156:37;7146:53;;:::o;7205:109::-;7286:21;7301:5;7286:21;:::i;:::-;7281:3;7274:34;7264:50;;:::o;7320:360::-;7406:3;7434:38;7466:5;7434:38;:::i;:::-;7488:70;7551:6;7546:3;7488:70;:::i;:::-;7481:77;;7567:52;7612:6;7607:3;7600:4;7593:5;7589:16;7567:52;:::i;:::-;7644:29;7666:6;7644:29;:::i;:::-;7639:3;7635:39;7628:46;;7410:270;;;;;:::o;7686:364::-;7774:3;7802:39;7835:5;7802:39;:::i;:::-;7857:71;7921:6;7916:3;7857:71;:::i;:::-;7850:78;;7937:52;7982:6;7977:3;7970:4;7963:5;7959:16;7937:52;:::i;:::-;8014:29;8036:6;8014:29;:::i;:::-;8009:3;8005:39;7998:46;;7778:272;;;;;:::o;8056:118::-;8143:24;8161:5;8143:24;:::i;:::-;8138:3;8131:37;8121:53;;:::o;8180:222::-;8273:4;8311:2;8300:9;8296:18;8288:26;;8324:71;8392:1;8381:9;8377:17;8368:6;8324:71;:::i;:::-;8278:124;;;;:::o;8408:640::-;8603:4;8641:3;8630:9;8626:19;8618:27;;8655:71;8723:1;8712:9;8708:17;8699:6;8655:71;:::i;:::-;8736:72;8804:2;8793:9;8789:18;8780:6;8736:72;:::i;:::-;8818;8886:2;8875:9;8871:18;8862:6;8818:72;:::i;:::-;8937:9;8931:4;8927:20;8922:2;8911:9;8907:18;8900:48;8965:76;9036:4;9027:6;8965:76;:::i;:::-;8957:84;;8608:440;;;;;;;:::o;9054:210::-;9141:4;9179:2;9168:9;9164:18;9156:26;;9192:65;9254:1;9243:9;9239:17;9230:6;9192:65;:::i;:::-;9146:118;;;;:::o;9270:313::-;9383:4;9421:2;9410:9;9406:18;9398:26;;9470:9;9464:4;9460:20;9456:1;9445:9;9441:17;9434:47;9498:78;9571:4;9562:6;9498:78;:::i;:::-;9490:86;;9388:195;;;;:::o;9589:222::-;9682:4;9720:2;9709:9;9705:18;9697:26;;9733:71;9801:1;9790:9;9786:17;9777:6;9733:71;:::i;:::-;9687:124;;;;:::o;9898:98::-;9949:6;9983:5;9977:12;9967:22;;9956:40;;;:::o;10002:99::-;10054:6;10088:5;10082:12;10072:22;;10061:40;;;:::o;10107:168::-;10190:11;10224:6;10219:3;10212:19;10264:4;10259:3;10255:14;10240:29;;10202:73;;;;:::o;10281:169::-;10365:11;10399:6;10394:3;10387:19;10439:4;10434:3;10430:14;10415:29;;10377:73;;;;:::o;10456:305::-;10496:3;10515:20;10533:1;10515:20;:::i;:::-;10510:25;;10549:20;10567:1;10549:20;:::i;:::-;10544:25;;10703:1;10635:66;10631:74;10628:1;10625:81;10622:2;;;10709:18;;:::i;:::-;10622:2;10753:1;10750;10746:9;10739:16;;10500:261;;;;:::o;10767:191::-;10807:4;10827:20;10845:1;10827:20;:::i;:::-;10822:25;;10861:20;10879:1;10861:20;:::i;:::-;10856:25;;10900:1;10897;10894:8;10891:2;;;10905:18;;:::i;:::-;10891:2;10950:1;10947;10943:9;10935:17;;10812:146;;;;:::o;10964:96::-;11001:7;11030:24;11048:5;11030:24;:::i;:::-;11019:35;;11009:51;;;:::o;11066:90::-;11100:7;11143:5;11136:13;11129:21;11118:32;;11108:48;;;:::o;11162:149::-;11198:7;11238:66;11231:5;11227:78;11216:89;;11206:105;;;:::o;11317:126::-;11354:7;11394:42;11387:5;11383:54;11372:65;;11362:81;;;:::o;11449:77::-;11486:7;11515:5;11504:16;;11494:32;;;:::o;11532:307::-;11600:1;11610:113;11624:6;11621:1;11618:13;11610:113;;;11709:1;11704:3;11700:11;11694:18;11690:1;11685:3;11681:11;11674:39;11646:2;11643:1;11639:10;11634:15;;11610:113;;;11741:6;11738:1;11735:13;11732:2;;;11821:1;11812:6;11807:3;11803:16;11796:27;11732:2;11581:258;;;;:::o;11845:320::-;11889:6;11926:1;11920:4;11916:12;11906:22;;11973:1;11967:4;11963:12;11994:18;11984:2;;12050:4;12042:6;12038:17;12028:27;;11984:2;12112;12104:6;12101:14;12081:18;12078:38;12075:2;;;12131:18;;:::i;:::-;12075:2;11896:269;;;;:::o;12171:180::-;12219:77;12216:1;12209:88;12316:4;12313:1;12306:15;12340:4;12337:1;12330:15;12357:180;12405:77;12402:1;12395:88;12502:4;12499:1;12492:15;12526:4;12523:1;12516:15;12543:117;12652:1;12649;12642:12;12666:117;12775:1;12772;12765:12;12789:117;12898:1;12895;12888:12;12912:117;13021:1;13018;13011:12;13035:117;13144:1;13141;13134:12;13158:102;13199:6;13250:2;13246:7;13241:2;13234:5;13230:14;13226:28;13216:38;;13206:54;;;:::o;13266:122::-;13339:24;13357:5;13339:24;:::i;:::-;13332:5;13329:35;13319:2;;13378:1;13375;13368:12;13319:2;13309:79;:::o;13394:116::-;13464:21;13479:5;13464:21;:::i;:::-;13457:5;13454:32;13444:2;;13500:1;13497;13490:12;13444:2;13434:76;:::o;13516:120::-;13588:23;13605:5;13588:23;:::i;:::-;13581:5;13578:34;13568:2;;13626:1;13623;13616:12;13568:2;13558:78;:::o;13642:122::-;13715:24;13733:5;13715:24;:::i;:::-;13708:5;13705:35;13695:2;;13754:1;13751;13744:12;13695:2;13685:79;:::o

Swarm Source

ipfs://3f77eb2f12492a7e8230ba8447ef61d34568ac3a4a731a3ea0081f03fd3b42d9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.