ETH Price: $3,166.62 (+3.41%)

Token

Portion Art Token (PAT)
 

Overview

Max Total Supply

1,000,064,236 PAT

Holders

1,249

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Portion is an online marketplace connecting artists and collectors through Blockchain technology to easily sell, invest and own art and collectibles with complete transparency.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ArtTokenERC1155

Compiler Version
v0.7.4+commit.3f05b770

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 13: ArtTokenERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.4;

import "./Ownable.sol";
import './ERC1155.sol';
import './ERC1155MintBurn.sol';
import './IERC1155Metadata.sol';
import "./StringsUtil.sol";

contract ArtTokenERC1155 is IERC1155Metadata, ERC1155, ERC1155MintBurn, Ownable {
  using StringsUtil for string;

  uint256 private _currentTokenID = 0;
  mapping (uint256 => uint256) public tokenSupply;

  string internal baseMetadataURI;
  mapping (uint256 => string) internal _tokenURIs;


  /*
   * @notice Will emit default URI log event for corresponding token _id
   * @param _tokenIDs Array of IDs of tokens to log default URI
   */
  //  function _logURIs(uint256[] memory _tokenIDs) internal {
  //    string memory baseURL = baseMetadataURI;
  //    string memory tokenURI;
  //
  //    for (uint256 i = 0; i < _tokenIDs.length; i++) {
  //      tokenURI = string(abi.encodePacked(baseURL, _uint2str(_tokenIDs[i]), ".json"));
  //      emit URI(tokenURI, _tokenIDs[i]);
  //    }
  //  }

  // Contract name
  string public name;
  // Contract symbol
  string public symbol;

  mapping (uint256 => address) public creators;

  mapping(bytes32 => bool) private _uniqTitleSet;

  constructor() {
    name = "Portion Art Token";
    symbol = "PAT";
  }

  /**
   * @dev Will update the base URL of token's URI
   * @param _newBaseMetadataURI New base URL of token's URI
   */
  function setBaseMetadataURI(
    string memory _newBaseMetadataURI
  ) public onlyOwner {
    _setBaseMetadataURI(_newBaseMetadataURI);
  }

  /**
    * @dev Creates a new token type and assigns _quantity to an creator (i.e. the message sender)
    * @param _title unique art title
    * @param _quantity art's quantity
    * @param _uri token's type metadata uri
    * @param _data Data to pass if receiver is contract
    * @return The newly created token ID
    */
  function createArt(
    bytes32 _title,
    uint256 _quantity,
    string calldata _uri,
    bytes calldata _data
  ) external returns (uint) {
    bytes32 hash = keccak256(abi.encodePacked(_title));
    require(!_uniqTitleSet[hash], "ArtTokenERC1155#createArt: TITLE_NOT_UNIQUE");
    _uniqTitleSet[hash] = true;

    _currentTokenID += 1;
    uint256 _id = _currentTokenID;

    creators[_id] = msg.sender;

    if (bytes(_uri).length > 0) {
      _tokenURIs[_id] = _uri;
      emit URI(_uri, _id);
    } else {
      require(bytes(baseMetadataURI).length > 0, "ArtTokenERC1155#createArt: NO_DEFAULT_URI");
    }

    _mint(_msgSender(), _id, _quantity, _data);
    tokenSupply[_id] = _quantity;
    return _id;
  }


  /**
    * @dev Returns the total quantity for a token ID
    * @param _id uint256 ID of the token to query
    * @return amount of token in existence
    */
  function totalSupply(
    uint256 _id
  ) public view returns (uint256) {
    return tokenSupply[_id];
  }


  function uri(
    uint256 _id
  ) public override view returns (string memory) {
    require(_exists(_id), "ERC721Tradable#uri: NONEXISTENT_TOKEN");

    string memory _tokenURI = _tokenURIs[_id];

    if (bytes(baseMetadataURI).length == 0) {
      return _tokenURI;
    }

    return StringsUtil.strConcat(baseMetadataURI, StringsUtil.uint2str(_id), ".json");
  }

  /**
   * @notice Will update the base URL of token's URI
   * @param _newBaseMetadataURI New base URL of token's URI
   */
  function _setBaseMetadataURI(string memory _newBaseMetadataURI) internal {
    baseMetadataURI = _newBaseMetadataURI;
  }

  /**
   * @notice Query if a contract implements an interface
   * @param _interfaceID  The interface identifier, as specified in ERC-165
   * @return `true` if the contract implements `_interfaceID` and
   */
  function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {
    if (_interfaceID == type(IERC1155Metadata).interfaceId) {
      return true;
    }
    return super.supportsInterface(_interfaceID);
  }

  /**
    * @dev Returns whether the specified token exists by checking to see if it has a creator
    * @param _id uint256 ID of the token to query the existence of
    * @return bool whether the token exists
    */
  function _exists(
    uint256 _id
  ) internal view returns (bool) {
    return creators[_id] != address(0);
  }
}

File 1 of 13: Address.sol
pragma solidity 0.7.4;


/**
 * Utility library of inline functions on addresses
 */
library Address {

  // Default hash for EOA accounts returned by extcodehash
  bytes32 constant internal ACCOUNT_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract.
   * @param _address address of the account to check
   * @return Whether the target address is a contract
   */
  function isContract(address _address) internal view returns (bool) {
    bytes32 codehash;

    // Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address or if it has a non-zero code hash or account hash
    assembly { codehash := extcodehash(_address) }
    return (codehash != 0x0 && codehash != ACCOUNT_HASH);
  }
}

File 3 of 13: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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

File 4 of 13: ERC1155.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.4;

import "./SafeMath.sol";
import "./IERC1155TokenReceiver.sol";
import "./IERC1155.sol";
import "./Address.sol";
import "./ERC165.sol";


/**
 * @dev Implementation of Multi-Token Standard contract
 */
contract ERC1155 is IERC1155, ERC165 {
  using SafeMath for uint256;
  using Address for address;

  /***********************************|
  |        Variables and Events       |
  |__________________________________*/

  // onReceive function signatures
  bytes4 constant internal ERC1155_RECEIVED_VALUE = 0xf23a6e61;
  bytes4 constant internal ERC1155_BATCH_RECEIVED_VALUE = 0xbc197c81;

  // Objects balances
  mapping (address => mapping(uint256 => uint256)) internal balances;

  // Operator Functions
  mapping (address => mapping(address => bool)) internal operators;


  /***********************************|
  |     Public Transfer Functions     |
  |__________________________________*/

  /**
   * @notice Transfers amount amount of an _id from the _from address to the _to address specified
   * @param _from    Source address
   * @param _to      Target address
   * @param _id      ID of the token type
   * @param _amount  Transfered amount
   * @param _data    Additional data with no specified format, sent in call to `_to`
   */
  function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes memory _data)
    public override
  {
    require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155#safeTransferFrom: INVALID_OPERATOR");
    require(_to != address(0),"ERC1155#safeTransferFrom: INVALID_RECIPIENT");
    // require(_amount <= balances[_from][_id]) is not necessary since checked with safemath operations

    _safeTransferFrom(_from, _to, _id, _amount);
    _callonERC1155Received(_from, _to, _id, _amount, gasleft(), _data);
  }

  /**
   * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
   * @param _from     Source addresses
   * @param _to       Target addresses
   * @param _ids      IDs of each token type
   * @param _amounts  Transfer amounts per token type
   * @param _data     Additional data with no specified format, sent in call to `_to`
   */
  function safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data)
    public override
  {
    // Requirements
    require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155#safeBatchTransferFrom: INVALID_OPERATOR");
    require(_to != address(0), "ERC1155#safeBatchTransferFrom: INVALID_RECIPIENT");

    _safeBatchTransferFrom(_from, _to, _ids, _amounts);
    _callonERC1155BatchReceived(_from, _to, _ids, _amounts, gasleft(), _data);
  }


  /***********************************|
  |    Internal Transfer Functions    |
  |__________________________________*/

  /**
   * @notice Transfers amount amount of an _id from the _from address to the _to address specified
   * @param _from    Source address
   * @param _to      Target address
   * @param _id      ID of the token type
   * @param _amount  Transfered amount
   */
  function _safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount)
    internal
  {
    // Update balances
    balances[_from][_id] = balances[_from][_id].sub(_amount); // Subtract amount
    balances[_to][_id] = balances[_to][_id].add(_amount);     // Add amount

    // Emit event
    emit TransferSingle(msg.sender, _from, _to, _id, _amount);
  }

  /**
   * @notice Verifies if receiver is contract and if so, calls (_to).onERC1155Received(...)
   */
  function _callonERC1155Received(address _from, address _to, uint256 _id, uint256 _amount, uint256 _gasLimit, bytes memory _data)
    internal
  {
    // Check if recipient is contract
    if (_to.isContract()) {
      bytes4 retval = IERC1155TokenReceiver(_to).onERC1155Received{gas: _gasLimit}(msg.sender, _from, _id, _amount, _data);
      require(retval == ERC1155_RECEIVED_VALUE, "ERC1155#_callonERC1155Received: INVALID_ON_RECEIVE_MESSAGE");
    }
  }

  /**
   * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
   * @param _from     Source addresses
   * @param _to       Target addresses
   * @param _ids      IDs of each token type
   * @param _amounts  Transfer amounts per token type
   */
  function _safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts)
    internal
  {
    require(_ids.length == _amounts.length, "ERC1155#_safeBatchTransferFrom: INVALID_ARRAYS_LENGTH");

    // Number of transfer to execute
    uint256 nTransfer = _ids.length;

    // Executing all transfers
    for (uint256 i = 0; i < nTransfer; i++) {
      // Update storage balance of previous bin
      balances[_from][_ids[i]] = balances[_from][_ids[i]].sub(_amounts[i]);
      balances[_to][_ids[i]] = balances[_to][_ids[i]].add(_amounts[i]);
    }

    // Emit event
    emit TransferBatch(msg.sender, _from, _to, _ids, _amounts);
  }

  /**
   * @notice Verifies if receiver is contract and if so, calls (_to).onERC1155BatchReceived(...)
   */
  function _callonERC1155BatchReceived(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, uint256 _gasLimit, bytes memory _data)
    internal
  {
    // Pass data if recipient is contract
    if (_to.isContract()) {
      bytes4 retval = IERC1155TokenReceiver(_to).onERC1155BatchReceived{gas: _gasLimit}(msg.sender, _from, _ids, _amounts, _data);
      require(retval == ERC1155_BATCH_RECEIVED_VALUE, "ERC1155#_callonERC1155BatchReceived: INVALID_ON_RECEIVE_MESSAGE");
    }
  }


  /***********************************|
  |         Operator Functions        |
  |__________________________________*/

  /**
   * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens
   * @param _operator  Address to add to the set of authorized operators
   * @param _approved  True if the operator is approved, false to revoke approval
   */
  function setApprovalForAll(address _operator, bool _approved)
    external override
  {
    // Update operator status
    operators[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  /**
   * @notice Queries the approval status of an operator for a given owner
   * @param _owner     The owner of the Tokens
   * @param _operator  Address of authorized operator
   * @return isOperator True if the operator is approved, false if not
   */
  function isApprovedForAll(address _owner, address _operator)
    public override view returns (bool isOperator)
  {
    return operators[_owner][_operator];
  }


  /***********************************|
  |         Balance Functions         |
  |__________________________________*/

  /**
   * @notice Get the balance of an account's Tokens
   * @param _owner  The address of the token holder
   * @param _id     ID of the Token
   * @return The _owner's balance of the Token type requested
   */
  function balanceOf(address _owner, uint256 _id)
    public override view returns (uint256)
  {
    return balances[_owner][_id];
  }

  /**
   * @notice Get the balance of multiple account/token pairs
   * @param _owners The addresses of the token holders
   * @param _ids    ID of the Tokens
   * @return        The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)
   */
  function balanceOfBatch(address[] memory _owners, uint256[] memory _ids)
    public override view returns (uint256[] memory)
  {
    require(_owners.length == _ids.length, "ERC1155#balanceOfBatch: INVALID_ARRAY_LENGTH");

    // Variables
    uint256[] memory batchBalances = new uint256[](_owners.length);

    // Iterate over each owner and token ID
    for (uint256 i = 0; i < _owners.length; i++) {
      batchBalances[i] = balances[_owners[i]][_ids[i]];
    }

    return batchBalances;
  }


  /***********************************|
  |          ERC165 Functions         |
  |__________________________________*/

  /**
   * @notice Query if a contract implements an interface
   * @param _interfaceID  The interface identifier, as specified in ERC-165
   * @return `true` if the contract implements `_interfaceID` and
   */
  function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {
    if (_interfaceID == type(IERC1155).interfaceId) {
      return true;
    }
    return super.supportsInterface(_interfaceID);
  }
}

File 5 of 13: ERC1155Metadata.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.4;
import "./IERC1155Metadata.sol";
import "./ERC165.sol";


/**
 * @notice Contract that handles metadata related methods.
 * @dev Methods assume a deterministic generation of URI based on token IDs.
 *      Methods also assume that URI uses hex representation of token IDs.
 */
contract ERC1155Metadata is IERC1155Metadata, ERC165 {
  // URI's default URI prefix
  string internal baseMetadataURI;

  /***********************************|
  |     Metadata Public Function s    |
  |__________________________________*/

  /**
   * @notice A distinct Uniform Resource Identifier (URI) for a given token.
   * @dev URIs are defined in RFC 3986.
   *      URIs are assumed to be deterministically generated based on token ID
   * @return URI string
   */
  function uri(uint256 _id) public override view returns (string memory) {
    return string(abi.encodePacked(baseMetadataURI, _uint2str(_id), ".json"));
  }


  /***********************************|
  |    Metadata Internal Functions    |
  |__________________________________*/

  /**
   * @notice Will emit default URI log event for corresponding token _id
   * @param _tokenIDs Array of IDs of tokens to log default URI
   */
  function _logURIs(uint256[] memory _tokenIDs) internal {
    string memory baseURL = baseMetadataURI;
    string memory tokenURI;

    for (uint256 i = 0; i < _tokenIDs.length; i++) {
      tokenURI = string(abi.encodePacked(baseURL, _uint2str(_tokenIDs[i]), ".json"));
      emit URI(tokenURI, _tokenIDs[i]);
    }
  }

  /**
   * @notice Will update the base URL of token's URI
   * @param _newBaseMetadataURI New base URL of token's URI
   */
  function _setBaseMetadataURI(string memory _newBaseMetadataURI) internal {
    baseMetadataURI = _newBaseMetadataURI;
  }

  /**
   * @notice Query if a contract implements an interface
   * @param _interfaceID  The interface identifier, as specified in ERC-165
   * @return `true` if the contract implements `_interfaceID` and
   */
  function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {
    if (_interfaceID == type(IERC1155Metadata).interfaceId) {
      return true;
    }
    return super.supportsInterface(_interfaceID);
  }


  /***********************************|
  |    Utility Internal Functions     |
  |__________________________________*/

  /**
   * @notice Convert uint256 to string
   * @param _i Unsigned integer to convert to string
   */
  function _uint2str(uint256 _i) internal pure returns (string memory _uintAsString) {
    if (_i == 0) {
      return "0";
    }

    uint256 j = _i;
    uint256 ii = _i;
    uint256 len;

    // Get number of bytes
    while (j != 0) {
      len++;
      j /= 10;
    }

    bytes memory bstr = new bytes(len);
    uint256 k = len - 1;

    // Get each individual ASCII
    while (ii != 0) {
      bstr[k--] = byte(uint8(48 + ii % 10));
      ii /= 10;
    }

    // Convert to string
    return string(bstr);
  }
}

File 6 of 13: ERC1155MintBurn.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.4;
import "./ERC1155.sol";


/**
 * @dev Multi-Fungible Tokens with minting and burning methods. These methods assume
 *      a parent contract to be executed as they are `internal` functions
 */
contract ERC1155MintBurn is ERC1155 {
  using SafeMath for uint256;

  /****************************************|
  |            Minting Functions           |
  |_______________________________________*/

  /**
   * @notice Mint _amount of tokens of a given id
   * @param _to      The address to mint tokens to
   * @param _id      Token id to mint
   * @param _amount  The amount to be minted
   * @param _data    Data to pass if receiver is contract
   */
  function _mint(address _to, uint256 _id, uint256 _amount, bytes memory _data)
    internal
  {
    // Add _amount
    balances[_to][_id] = balances[_to][_id].add(_amount);

    // Emit event
    emit TransferSingle(msg.sender, address(0x0), _to, _id, _amount);

    // Calling onReceive method if recipient is contract
    _callonERC1155Received(address(0x0), _to, _id, _amount, gasleft(), _data);
  }

  /**
   * @notice Mint tokens for each ids in _ids
   * @param _to       The address to mint tokens to
   * @param _ids      Array of ids to mint
   * @param _amounts  Array of amount of tokens to mint per id
   * @param _data    Data to pass if receiver is contract
   */
  function _batchMint(address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data)
    internal
  {
    require(_ids.length == _amounts.length, "ERC1155MintBurn#batchMint: INVALID_ARRAYS_LENGTH");

    // Number of mints to execute
    uint256 nMint = _ids.length;

     // Executing all minting
    for (uint256 i = 0; i < nMint; i++) {
      // Update storage balance
      balances[_to][_ids[i]] = balances[_to][_ids[i]].add(_amounts[i]);
    }

    // Emit batch mint event
    emit TransferBatch(msg.sender, address(0x0), _to, _ids, _amounts);

    // Calling onReceive method if recipient is contract
    _callonERC1155BatchReceived(address(0x0), _to, _ids, _amounts, gasleft(), _data);
  }


  /****************************************|
  |            Burning Functions           |
  |_______________________________________*/

  /**
   * @notice Burn _amount of tokens of a given token id
   * @param _from    The address to burn tokens from
   * @param _id      Token id to burn
   * @param _amount  The amount to be burned
   */
  function _burn(address _from, uint256 _id, uint256 _amount)
    internal
  {
    //Substract _amount
    balances[_from][_id] = balances[_from][_id].sub(_amount);

    // Emit event
    emit TransferSingle(msg.sender, _from, address(0x0), _id, _amount);
  }

  /**
   * @notice Burn tokens of given token id for each (_ids[i], _amounts[i]) pair
   * @param _from     The address to burn tokens from
   * @param _ids      Array of token ids to burn
   * @param _amounts  Array of the amount to be burned
   */
  function _batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts)
    internal
  {
    // Number of mints to execute
    uint256 nBurn = _ids.length;
    require(nBurn == _amounts.length, "ERC1155MintBurn#batchBurn: INVALID_ARRAYS_LENGTH");

    // Executing all minting
    for (uint256 i = 0; i < nBurn; i++) {
      // Update storage balance
      balances[_from][_ids[i]] = balances[_from][_ids[i]].sub(_amounts[i]);
    }

    // Emit batch mint event
    emit TransferBatch(msg.sender, _from, address(0x0), _ids, _amounts);
  }
}

File 7 of 13: ERC165.sol
pragma solidity 0.7.4;

abstract contract ERC165 {
  /**
   * @notice Query if a contract implements an interface
   * @param _interfaceID The interface identifier, as specified in ERC-165
   * @return `true` if the contract implements `_interfaceID`
   */
  function supportsInterface(bytes4 _interfaceID) virtual public pure returns (bool) {
    return _interfaceID == this.supportsInterface.selector;
  }
}

File 8 of 13: IERC1155.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.4;


interface IERC1155 {

  /****************************************|
  |                 Events                 |
  |_______________________________________*/

  /**
   * @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, including zero amount transfers as well as minting or burning
   *   Operator MUST be msg.sender
   *   When minting/creating tokens, the `_from` field MUST be set to `0x0`
   *   When burning/destroying tokens, the `_to` field MUST be set to `0x0`
   *   The total amount transferred from address 0x0 minus the total amount transferred to 0x0 may be used by clients and exchanges to be added to the "circulating supply" for a given token ID
   *   To broadcast the existence of a token ID with no initial balance, the contract SHOULD emit the TransferSingle event from `0x0` to `0x0`, with the token creator as `_operator`, and a `_amount` of 0
   */
  event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _amount);

  /**
   * @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, including zero amount transfers as well as minting or burning
   *   Operator MUST be msg.sender
   *   When minting/creating tokens, the `_from` field MUST be set to `0x0`
   *   When burning/destroying tokens, the `_to` field MUST be set to `0x0`
   *   The total amount transferred from address 0x0 minus the total amount transferred to 0x0 may be used by clients and exchanges to be added to the "circulating supply" for a given token ID
   *   To broadcast the existence of multiple token IDs with no initial balance, this SHOULD emit the TransferBatch event from `0x0` to `0x0`, with the token creator as `_operator`, and a `_amount` of 0
   */
  event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _amounts);

  /**
   * @dev MUST emit when an approval is updated
   */
  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);


  /****************************************|
  |                Functions               |
  |_______________________________________*/

  /**
    * @notice Transfers amount of an _id from the _from address to the _to address specified
    * @dev MUST emit TransferSingle event on success
    * Caller must be approved to manage the _from account's tokens (see isApprovedForAll)
    * MUST throw if `_to` is the zero address
    * MUST throw if balance of sender for token `_id` is lower than the `_amount` sent
    * MUST throw on any other error
    * When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). If so, it MUST call `onERC1155Received` on `_to` and revert if the return amount is not `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
    * @param _from    Source address
    * @param _to      Target address
    * @param _id      ID of the token type
    * @param _amount  Transfered amount
    * @param _data    Additional data with no specified format, sent in call to `_to`
    */
  function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes calldata _data) external;

  /**
    * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
    * @dev MUST emit TransferBatch event on success
    * Caller must be approved to manage the _from account's tokens (see isApprovedForAll)
    * MUST throw if `_to` is the zero address
    * MUST throw if length of `_ids` is not the same as length of `_amounts`
    * MUST throw if any of the balance of sender for token `_ids` is lower than the respective `_amounts` sent
    * MUST throw on any other error
    * When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). If so, it MUST call `onERC1155BatchReceived` on `_to` and revert if the return amount is not `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
    * Transfers and events MUST occur in the array order they were submitted (_ids[0] before _ids[1], etc)
    * @param _from     Source addresses
    * @param _to       Target addresses
    * @param _ids      IDs of each token type
    * @param _amounts  Transfer amounts per token type
    * @param _data     Additional data with no specified format, sent in call to `_to`
  */
  function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external;

  /**
   * @notice Get the balance of an account's Tokens
   * @param _owner  The address of the token holder
   * @param _id     ID of the Token
   * @return        The _owner's balance of the Token type requested
   */
  function balanceOf(address _owner, uint256 _id) external view returns (uint256);

  /**
   * @notice Get the balance of multiple account/token pairs
   * @param _owners The addresses of the token holders
   * @param _ids    ID of the Tokens
   * @return        The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)
   */
  function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory);

  /**
   * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens
   * @dev MUST emit the ApprovalForAll event on success
   * @param _operator  Address to add to the set of authorized operators
   * @param _approved  True if the operator is approved, false to revoke approval
   */
  function setApprovalForAll(address _operator, bool _approved) external;

  /**
   * @notice Queries the approval status of an operator for a given owner
   * @param _owner     The owner of the Tokens
   * @param _operator  Address of authorized operator
   * @return isOperator True if the operator is approved, false if not
   */
  function isApprovedForAll(address _owner, address _operator) external view returns (bool isOperator);
}

File 9 of 13: IERC1155Metadata.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.4;


interface IERC1155Metadata {

  event URI(string _uri, uint256 indexed _id);

  /****************************************|
  |                Functions               |
  |_______________________________________*/

  /**
   * @notice A distinct Uniform Resource Identifier (URI) for a given token.
   * @dev URIs are defined in RFC 3986.
   *      URIs are assumed to be deterministically generated based on token ID
   *      Token IDs are assumed to be represented in their hex format in URIs
   * @return URI string
   */
  function uri(uint256 _id) external view returns (string memory);
}

File 10 of 13: IERC1155TokenReceiver.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.4;

/**
 * @dev ERC-1155 interface for accepting safe transfers.
 */
interface IERC1155TokenReceiver {

  /**
   * @notice Handle the receipt of a single ERC1155 token type
   * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated
   * This function MAY throw to revert and reject the transfer
   * Return of other amount than the magic value MUST result in the transaction being reverted
   * Note: The token contract address is always the message sender
   * @param _operator  The address which called the `safeTransferFrom` function
   * @param _from      The address which previously owned the token
   * @param _id        The id of the token being transferred
   * @param _amount    The amount of tokens being transferred
   * @param _data      Additional data with no specified format
   * @return           `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
   */
  function onERC1155Received(address _operator, address _from, uint256 _id, uint256 _amount, bytes calldata _data) external returns(bytes4);

  /**
   * @notice Handle the receipt of multiple ERC1155 token types
   * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated
   * This function MAY throw to revert and reject the transfer
   * Return of other amount than the magic value WILL result in the transaction being reverted
   * Note: The token contract address is always the message sender
   * @param _operator  The address which called the `safeBatchTransferFrom` function
   * @param _from      The address which previously owned the token
   * @param _ids       An array containing ids of each token being transferred
   * @param _amounts   An array containing amounts of each token being transferred
   * @param _data      Additional data with no specified format
   * @return           `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
   */
  function onERC1155BatchReceived(address _operator, address _from, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external returns(bytes4);
}

File 11 of 13: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

File 12 of 13: SafeMath.sol
pragma solidity 0.7.4;


/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {

  /**
   * @dev Multiplies two unsigned integers, reverts on overflow.
   */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    uint256 c = a * b;
    require(c / a == b, "SafeMath#mul: OVERFLOW");

    return c;
  }

  /**
   * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
   */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, "SafeMath#div: DIVISION_BY_ZERO");
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
   * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
   */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b <= a, "SafeMath#sub: UNDERFLOW");
    uint256 c = a - b;

    return c;
  }

  /**
   * @dev Adds two unsigned integers, reverts on overflow.
   */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a, "SafeMath#add: OVERFLOW");

    return c; 
  }

  /**
   * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
   * reverts when dividing by zero.
   */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0, "SafeMath#mod: DIVISION_BY_ZERO");
    return a % b;
  }
}

File 13 of 13: StringsUtil.sol
pragma solidity ^0.7.4;

library StringsUtil {
  // via https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol
  function strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e) internal pure returns (string memory) {
    bytes memory _ba = bytes(_a);
    bytes memory _bb = bytes(_b);
    bytes memory _bc = bytes(_c);
    bytes memory _bd = bytes(_d);
    bytes memory _be = bytes(_e);
    string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
    bytes memory babcde = bytes(abcde);
    uint k = 0;
    for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
    for (uint i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
    for (uint i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
    for (uint i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
    for (uint i = 0; i < _be.length; i++) babcde[k++] = _be[i];
    return string(babcde);
  }

  function strConcat(string memory _a, string memory _b, string memory _c, string memory _d) internal pure returns (string memory) {
    return strConcat(_a, _b, _c, _d, "");
  }

  function strConcat(string memory _a, string memory _b, string memory _c) internal pure returns (string memory) {
    return strConcat(_a, _b, _c, "", "");
  }

  function strConcat(string memory _a, string memory _b) internal pure returns (string memory) {
    return strConcat(_a, _b, "", "", "");
  }

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

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":"_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":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_uri","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_title","type":"bytes32"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"createArt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creators","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":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","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":"string","name":"_newBaseMetadataURI","type":"string"}],"name":"setBaseMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

608060405260006003553480156200001657600080fd5b50600062000023620000df565b600280546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350604080518082019091526011808252702837b93a34b7b71020b93a102a37b5b2b760791b6020909201918252620000ab91600791620000e3565b506040805180820190915260038082526214105560ea1b6020909201918252620000d891600891620000e3565b506200018f565b3390565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200011b576000855562000166565b82601f106200013657805160ff191683800117855562000166565b8280016001018555821562000166579182015b828111156200016657825182559160200191906001019062000149565b506200017492915062000178565b5090565b5b8082111562000174576000815560010162000179565b6122fa806200019f6000396000f3fe608060405234801561001057600080fd5b50600436106101145760003560e01c80637e518ec8116100a2578063bd85b03911610071578063bd85b0391461074f578063cd53d08e1461076c578063e985e9c514610789578063f242432a146107b7578063f2fde38b1461088057610114565b80637e518ec8146106515780638da5cb5b146106f557806395d89b4114610719578063a22cb4651461072157610114565b80630e89341c116100e95780630e89341c146102d95780632693ebf2146102f65780632eb2c2d6146103135780634e1273f4146104d6578063715018a61461064957610114565b8062bfd8c814610119578062fdd58e146101f557806301ffc9a71461022157806306fdde031461025c575b600080fd5b6101e36004803603608081101561012f57600080fd5b813591602081013591810190606081016040820135600160201b81111561015557600080fd5b82018360208201111561016757600080fd5b803590602001918460018302840111600160201b8311171561018857600080fd5b919390929091602081019035600160201b8111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111600160201b831117156101d857600080fd5b5090925090506108a6565b60408051918252519081900360200190f35b6101e36004803603604081101561020b57600080fd5b506001600160a01b038135169060200135610a9c565b6102486004803603602081101561023757600080fd5b50356001600160e01b031916610ac2565b604080519115158252519081900360200190f35b610264610af6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029e578181015183820152602001610286565b50505050905090810190601f1680156102cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610264600480360360208110156102ef57600080fd5b5035610b84565b6101e36004803603602081101561030c57600080fd5b5035610d4d565b6104d4600480360360a081101561032957600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561035c57600080fd5b82018360208201111561036e57600080fd5b803590602001918460208302840111600160201b8311171561038f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103de57600080fd5b8201836020820111156103f057600080fd5b803590602001918460208302840111600160201b8311171561041157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561046057600080fd5b82018360208201111561047257600080fd5b803590602001918460018302840111600160201b8311171561049357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610d5f945050505050565b005b6105f9600480360360408110156104ec57600080fd5b810190602081018135600160201b81111561050657600080fd5b82018360208201111561051857600080fd5b803590602001918460208302840111600160201b8311171561053957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561058857600080fd5b82018360208201111561059a57600080fd5b803590602001918460208302840111600160201b831117156105bb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610e1c945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561063557818101518382015260200161061d565b505050509050019250505060405180910390f35b6104d4610f34565b6104d46004803603602081101561066757600080fd5b810190602081018135600160201b81111561068157600080fd5b82018360208201111561069357600080fd5b803590602001918460018302840111600160201b831117156106b457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fe8945050505050565b6106fd61105e565b604080516001600160a01b039092168252519081900360200190f35b61026461106d565b6104d46004803603604081101561073757600080fd5b506001600160a01b03813516906020013515156110c8565b6101e36004803603602081101561076557600080fd5b5035611136565b6106fd6004803603602081101561078257600080fd5b5035611148565b6102486004803603604081101561079f57600080fd5b506001600160a01b0381358116916020013516611163565b6104d4600480360360a08110156107cd57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561080c57600080fd5b82018360208201111561081e57600080fd5b803590602001918460018302840111600160201b8311171561083f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611191945050505050565b6104d46004803603602081101561089657600080fd5b50356001600160a01b0316611247565b60408051602080820189905282518083038201815291830183528151918101919091206000818152600a9092529181205490919060ff16156109195760405162461bcd60e51b815260040180806020018281038252602b815260200180612113602b913960400191505060405180910390fd5b6000818152600a60209081526040808320805460ff191660019081179091556003805490910190819055808452600990925290912080546001600160a01b0319163317905585156109e457600081815260066020526040902061097d908888611f7a565b50807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b888860405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2610a35565b60055460026000196101006001841615020190911604610a355760405162461bcd60e51b81526004018080602001828103825260298152602001806121736029913960400191505060405180910390fd5b610a7e610a40611352565b828a88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061135692505050565b60008181526004602052604090208890559150509695505050505050565b6001600160a01b0391909116600090815260208181526040808320938352929052205490565b60006001600160e01b031982166303a24d0760e21b1415610ae557506001610af1565b610aee826113f7565b90505b919050565b6007805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b7c5780601f10610b5157610100808354040283529160200191610b7c565b820191906000526020600020905b815481529060010190602001808311610b5f57829003601f168201915b505050505081565b6060610b8f82611423565b610bca5760405162461bcd60e51b81526004018080602001828103825260258152602001806121cc6025913960400191505060405180910390fd5b60008281526006602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610c5f5780601f10610c3457610100808354040283529160200191610c5f565b820191906000526020600020905b815481529060010190602001808311610c4257829003601f168201915b505060055493945050505060026000196101006001841615020190911604610c88579050610af1565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152610d469390929091830182828015610d155780601f10610cea57610100808354040283529160200191610d15565b820191906000526020600020905b815481529060010190602001808311610cf857829003601f168201915b5050505050610d2385611440565b60405180604001604052806005815260200164173539b7b760d91b815250611518565b9392505050565b60046020526000908152604090205481565b336001600160a01b0386161480610d7b5750610d7b8533611163565b610db65760405162461bcd60e51b815260040180806020018281038252602f81526020018061221d602f913960400191505060405180910390fd5b6001600160a01b038416610dfb5760405162461bcd60e51b815260040180806020018281038252603081526020018061219c6030913960400191505060405180910390fd5b610e078585858561154d565b610e15858585855a866117f8565b5050505050565b60608151835114610e5e5760405162461bcd60e51b815260040180806020018281038252602c8152602001806121f1602c913960400191505060405180910390fd5b6060835167ffffffffffffffff81118015610e7857600080fd5b50604051908082528060200260200182016040528015610ea2578160200160208202803683370190505b50905060005b8451811015610f2c57600080868381518110610ec057fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858381518110610ef657fe5b6020026020010151815260200190815260200160002054828281518110610f1957fe5b6020908102919091010152600101610ea8565b509392505050565b610f3c611352565b6002546001600160a01b03908116911614610f9e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6002546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600280546001600160a01b0319169055565b610ff0611352565b6002546001600160a01b03908116911614611052576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61105b816119f0565b50565b6002546001600160a01b031690565b6008805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b7c5780601f10610b5157610100808354040283529160200191610b7c565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60009081526004602052604090205490565b6009602052600090815260409020546001600160a01b031681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b336001600160a01b03861614806111ad57506111ad8533611163565b6111e85760405162461bcd60e51b815260040180806020018281038252602a8152602001806120e9602a913960400191505060405180910390fd5b6001600160a01b03841661122d5760405162461bcd60e51b815260040180806020018281038252602b815260200180612098602b913960400191505060405180910390fd5b61123985858585611a07565b610e15858585855a86611ae3565b61124f611352565b6002546001600160a01b039081169116146112b1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166112f65760405162461bcd60e51b81526004018080602001828103825260268152602001806120c36026913960400191505060405180910390fd5b6002546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b0384166000908152602081815260408083208684529091529020546113829083611c55565b6001600160a01b038516600081815260208181526040808320888452825280832094909455835187815290810186905283519293919233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62928290030190a46113f160008585855a86611ae3565b50505050565b60006001600160e01b03198216636cdb3d1360e11b141561141a57506001610af1565b610aee82611ca8565b6000908152600960205260409020546001600160a01b0316151590565b60608161146557506040805180820190915260018152600360fc1b6020820152610af1565b8160005b811561147d57600101600a82049150611469565b60608167ffffffffffffffff8111801561149657600080fd5b506040519080825280601f01601f1916602001820160405280156114c1576020820181803683370190505b50905060001982015b851561150f57600a860660300160f81b828280600190039350815181106114ed57fe5b60200101906001600160f81b031916908160001a905350600a860495506114ca565b50949350505050565b60606115458484846040518060200160405280600081525060405180602001604052806000815250611cc1565b949350505050565b805182511461158d5760405162461bcd60e51b815260040180806020018281038252603581526020018061213e6035913960400191505060405180910390fd5b815160005b81811015611717576116088382815181106115a957fe5b6020026020010151600080896001600160a01b03166001600160a01b0316815260200190815260200160002060008785815181106115e357fe5b6020026020010151815260200190815260200160002054611ee690919063ffffffff16565b600080886001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061163a57fe5b60200260200101518152602001908152602001600020819055506116c283828151811061166357fe5b6020026020010151600080886001600160a01b03166001600160a01b03168152602001908152602001600020600087858151811061169d57fe5b6020026020010151815260200190815260200160002054611c5590919063ffffffff16565b600080876001600160a01b03166001600160a01b0316815260200190815260200160002060008684815181106116f457fe5b602090810291909101810151825281019190915260400160002055600101611592565b50836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561179d578181015183820152602001611785565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117dc5781810151838201526020016117c4565b5050505090500194505050505060405180910390a45050505050565b61180a856001600160a01b0316611f43565b156119e8576000856001600160a01b031663bc197c8184338a8989886040518763ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561189b578181015183820152602001611883565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156118da5781810151838201526020016118c2565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156119165781810151838201526020016118fe565b50505050905090810190601f1680156119435780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561196857600080fd5b5087f115801561197c573d6000803e3d6000fd5b50505050506040513d602081101561199357600080fd5b505190506001600160e01b0319811663bc197c8160e01b146119e65760405162461bcd60e51b815260040180806020018281038252603f81526020018061224c603f913960400191505060405180910390fd5b505b505050505050565b8051611a03906005906020840190612006565b5050565b6001600160a01b038416600090815260208181526040808320858452909152902054611a339082611ee6565b6001600160a01b0380861660009081526020818152604080832087845282528083209490945591861681528082528281208582529091522054611a769082611c55565b6001600160a01b03808516600081815260208181526040808320888452825291829020949094558051868152938401859052805191939288169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a450505050565b611af5856001600160a01b0316611f43565b156119e8576000856001600160a01b031663f23a6e6184338a8989886040518763ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611b87578181015183820152602001611b6f565b50505050905090810190601f168015611bb45780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b158015611bd757600080fd5b5087f1158015611beb573d6000803e3d6000fd5b50505050506040513d6020811015611c0257600080fd5b505190506001600160e01b0319811663f23a6e6160e01b146119e65760405162461bcd60e51b815260040180806020018281038252603a81526020018061228b603a913960400191505060405180910390fd5b600082820183811015610d46576040805162461bcd60e51b8152602060048201526016602482015275536166654d617468236164643a204f564552464c4f5760501b604482015290519081900360640190fd5b6001600160e01b031981166301ffc9a760e01b14919050565b805182518451865188516060948a948a948a948a948a948a94919092019092019091010167ffffffffffffffff81118015611cfb57600080fd5b506040519080825280601f01601f191660200182016040528015611d26576020820181803683370190505b509050806000805b8851811015611d7f57888181518110611d4357fe5b602001015160f81c60f81b838380600101945081518110611d6057fe5b60200101906001600160f81b031916908160001a905350600101611d2e565b5060005b8751811015611dd457878181518110611d9857fe5b602001015160f81c60f81b838380600101945081518110611db557fe5b60200101906001600160f81b031916908160001a905350600101611d83565b5060005b8651811015611e2957868181518110611ded57fe5b602001015160f81c60f81b838380600101945081518110611e0a57fe5b60200101906001600160f81b031916908160001a905350600101611dd8565b5060005b8551811015611e7e57858181518110611e4257fe5b602001015160f81c60f81b838380600101945081518110611e5f57fe5b60200101906001600160f81b031916908160001a905350600101611e2d565b5060005b8451811015611ed357848181518110611e9757fe5b602001015160f81c60f81b838380600101945081518110611eb457fe5b60200101906001600160f81b031916908160001a905350600101611e82565b50909d9c50505050505050505050505050565b600082821115611f3d576040805162461bcd60e51b815260206004820152601760248201527f536166654d617468237375623a20554e444552464c4f57000000000000000000604482015290519081900360640190fd5b50900390565b6000813f8015801590610d4657507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282611fb05760008555611ff6565b82601f10611fc95782800160ff19823516178555611ff6565b82800160010185558215611ff6579182015b82811115611ff6578235825591602001919060010190611fdb565b50612002929150612082565b5090565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261203c5760008555611ff6565b82601f1061205557805160ff1916838001178555611ff6565b82800160010185558215611ff6579182015b82811115611ff6578251825591602001919060010190612067565b5b80821115612002576000815560010161208356fe4552433131353523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433131353523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52417274546f6b656e45524331313535236372656174654172743a205449544c455f4e4f545f554e4951554545524331313535235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448417274546f6b656e45524331313535236372656174654172743a204e4f5f44454641554c545f55524945524331313535237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544552433732315472616461626c65237572693a204e4f4e4558495354454e545f544f4b454e455243313135352362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e47544845524331313535237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f5245524331313535235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d45535341474545524331313535235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745a2646970667358221220f993c926a758b9314fe9f1a1d0ffd6ae2f59f73d7d7c89730f70f1ae215a67f464736f6c63430007040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101145760003560e01c80637e518ec8116100a2578063bd85b03911610071578063bd85b0391461074f578063cd53d08e1461076c578063e985e9c514610789578063f242432a146107b7578063f2fde38b1461088057610114565b80637e518ec8146106515780638da5cb5b146106f557806395d89b4114610719578063a22cb4651461072157610114565b80630e89341c116100e95780630e89341c146102d95780632693ebf2146102f65780632eb2c2d6146103135780634e1273f4146104d6578063715018a61461064957610114565b8062bfd8c814610119578062fdd58e146101f557806301ffc9a71461022157806306fdde031461025c575b600080fd5b6101e36004803603608081101561012f57600080fd5b813591602081013591810190606081016040820135600160201b81111561015557600080fd5b82018360208201111561016757600080fd5b803590602001918460018302840111600160201b8311171561018857600080fd5b919390929091602081019035600160201b8111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111600160201b831117156101d857600080fd5b5090925090506108a6565b60408051918252519081900360200190f35b6101e36004803603604081101561020b57600080fd5b506001600160a01b038135169060200135610a9c565b6102486004803603602081101561023757600080fd5b50356001600160e01b031916610ac2565b604080519115158252519081900360200190f35b610264610af6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029e578181015183820152602001610286565b50505050905090810190601f1680156102cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610264600480360360208110156102ef57600080fd5b5035610b84565b6101e36004803603602081101561030c57600080fd5b5035610d4d565b6104d4600480360360a081101561032957600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561035c57600080fd5b82018360208201111561036e57600080fd5b803590602001918460208302840111600160201b8311171561038f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103de57600080fd5b8201836020820111156103f057600080fd5b803590602001918460208302840111600160201b8311171561041157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561046057600080fd5b82018360208201111561047257600080fd5b803590602001918460018302840111600160201b8311171561049357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610d5f945050505050565b005b6105f9600480360360408110156104ec57600080fd5b810190602081018135600160201b81111561050657600080fd5b82018360208201111561051857600080fd5b803590602001918460208302840111600160201b8311171561053957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561058857600080fd5b82018360208201111561059a57600080fd5b803590602001918460208302840111600160201b831117156105bb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610e1c945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561063557818101518382015260200161061d565b505050509050019250505060405180910390f35b6104d4610f34565b6104d46004803603602081101561066757600080fd5b810190602081018135600160201b81111561068157600080fd5b82018360208201111561069357600080fd5b803590602001918460018302840111600160201b831117156106b457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fe8945050505050565b6106fd61105e565b604080516001600160a01b039092168252519081900360200190f35b61026461106d565b6104d46004803603604081101561073757600080fd5b506001600160a01b03813516906020013515156110c8565b6101e36004803603602081101561076557600080fd5b5035611136565b6106fd6004803603602081101561078257600080fd5b5035611148565b6102486004803603604081101561079f57600080fd5b506001600160a01b0381358116916020013516611163565b6104d4600480360360a08110156107cd57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561080c57600080fd5b82018360208201111561081e57600080fd5b803590602001918460018302840111600160201b8311171561083f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611191945050505050565b6104d46004803603602081101561089657600080fd5b50356001600160a01b0316611247565b60408051602080820189905282518083038201815291830183528151918101919091206000818152600a9092529181205490919060ff16156109195760405162461bcd60e51b815260040180806020018281038252602b815260200180612113602b913960400191505060405180910390fd5b6000818152600a60209081526040808320805460ff191660019081179091556003805490910190819055808452600990925290912080546001600160a01b0319163317905585156109e457600081815260066020526040902061097d908888611f7a565b50807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b888860405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2610a35565b60055460026000196101006001841615020190911604610a355760405162461bcd60e51b81526004018080602001828103825260298152602001806121736029913960400191505060405180910390fd5b610a7e610a40611352565b828a88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061135692505050565b60008181526004602052604090208890559150509695505050505050565b6001600160a01b0391909116600090815260208181526040808320938352929052205490565b60006001600160e01b031982166303a24d0760e21b1415610ae557506001610af1565b610aee826113f7565b90505b919050565b6007805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b7c5780601f10610b5157610100808354040283529160200191610b7c565b820191906000526020600020905b815481529060010190602001808311610b5f57829003601f168201915b505050505081565b6060610b8f82611423565b610bca5760405162461bcd60e51b81526004018080602001828103825260258152602001806121cc6025913960400191505060405180910390fd5b60008281526006602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610c5f5780601f10610c3457610100808354040283529160200191610c5f565b820191906000526020600020905b815481529060010190602001808311610c4257829003601f168201915b505060055493945050505060026000196101006001841615020190911604610c88579050610af1565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152610d469390929091830182828015610d155780601f10610cea57610100808354040283529160200191610d15565b820191906000526020600020905b815481529060010190602001808311610cf857829003601f168201915b5050505050610d2385611440565b60405180604001604052806005815260200164173539b7b760d91b815250611518565b9392505050565b60046020526000908152604090205481565b336001600160a01b0386161480610d7b5750610d7b8533611163565b610db65760405162461bcd60e51b815260040180806020018281038252602f81526020018061221d602f913960400191505060405180910390fd5b6001600160a01b038416610dfb5760405162461bcd60e51b815260040180806020018281038252603081526020018061219c6030913960400191505060405180910390fd5b610e078585858561154d565b610e15858585855a866117f8565b5050505050565b60608151835114610e5e5760405162461bcd60e51b815260040180806020018281038252602c8152602001806121f1602c913960400191505060405180910390fd5b6060835167ffffffffffffffff81118015610e7857600080fd5b50604051908082528060200260200182016040528015610ea2578160200160208202803683370190505b50905060005b8451811015610f2c57600080868381518110610ec057fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858381518110610ef657fe5b6020026020010151815260200190815260200160002054828281518110610f1957fe5b6020908102919091010152600101610ea8565b509392505050565b610f3c611352565b6002546001600160a01b03908116911614610f9e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6002546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600280546001600160a01b0319169055565b610ff0611352565b6002546001600160a01b03908116911614611052576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61105b816119f0565b50565b6002546001600160a01b031690565b6008805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b7c5780601f10610b5157610100808354040283529160200191610b7c565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60009081526004602052604090205490565b6009602052600090815260409020546001600160a01b031681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b336001600160a01b03861614806111ad57506111ad8533611163565b6111e85760405162461bcd60e51b815260040180806020018281038252602a8152602001806120e9602a913960400191505060405180910390fd5b6001600160a01b03841661122d5760405162461bcd60e51b815260040180806020018281038252602b815260200180612098602b913960400191505060405180910390fd5b61123985858585611a07565b610e15858585855a86611ae3565b61124f611352565b6002546001600160a01b039081169116146112b1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166112f65760405162461bcd60e51b81526004018080602001828103825260268152602001806120c36026913960400191505060405180910390fd5b6002546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b0384166000908152602081815260408083208684529091529020546113829083611c55565b6001600160a01b038516600081815260208181526040808320888452825280832094909455835187815290810186905283519293919233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62928290030190a46113f160008585855a86611ae3565b50505050565b60006001600160e01b03198216636cdb3d1360e11b141561141a57506001610af1565b610aee82611ca8565b6000908152600960205260409020546001600160a01b0316151590565b60608161146557506040805180820190915260018152600360fc1b6020820152610af1565b8160005b811561147d57600101600a82049150611469565b60608167ffffffffffffffff8111801561149657600080fd5b506040519080825280601f01601f1916602001820160405280156114c1576020820181803683370190505b50905060001982015b851561150f57600a860660300160f81b828280600190039350815181106114ed57fe5b60200101906001600160f81b031916908160001a905350600a860495506114ca565b50949350505050565b60606115458484846040518060200160405280600081525060405180602001604052806000815250611cc1565b949350505050565b805182511461158d5760405162461bcd60e51b815260040180806020018281038252603581526020018061213e6035913960400191505060405180910390fd5b815160005b81811015611717576116088382815181106115a957fe5b6020026020010151600080896001600160a01b03166001600160a01b0316815260200190815260200160002060008785815181106115e357fe5b6020026020010151815260200190815260200160002054611ee690919063ffffffff16565b600080886001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061163a57fe5b60200260200101518152602001908152602001600020819055506116c283828151811061166357fe5b6020026020010151600080886001600160a01b03166001600160a01b03168152602001908152602001600020600087858151811061169d57fe5b6020026020010151815260200190815260200160002054611c5590919063ffffffff16565b600080876001600160a01b03166001600160a01b0316815260200190815260200160002060008684815181106116f457fe5b602090810291909101810151825281019190915260400160002055600101611592565b50836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561179d578181015183820152602001611785565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117dc5781810151838201526020016117c4565b5050505090500194505050505060405180910390a45050505050565b61180a856001600160a01b0316611f43565b156119e8576000856001600160a01b031663bc197c8184338a8989886040518763ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561189b578181015183820152602001611883565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156118da5781810151838201526020016118c2565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156119165781810151838201526020016118fe565b50505050905090810190601f1680156119435780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561196857600080fd5b5087f115801561197c573d6000803e3d6000fd5b50505050506040513d602081101561199357600080fd5b505190506001600160e01b0319811663bc197c8160e01b146119e65760405162461bcd60e51b815260040180806020018281038252603f81526020018061224c603f913960400191505060405180910390fd5b505b505050505050565b8051611a03906005906020840190612006565b5050565b6001600160a01b038416600090815260208181526040808320858452909152902054611a339082611ee6565b6001600160a01b0380861660009081526020818152604080832087845282528083209490945591861681528082528281208582529091522054611a769082611c55565b6001600160a01b03808516600081815260208181526040808320888452825291829020949094558051868152938401859052805191939288169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a450505050565b611af5856001600160a01b0316611f43565b156119e8576000856001600160a01b031663f23a6e6184338a8989886040518763ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611b87578181015183820152602001611b6f565b50505050905090810190601f168015611bb45780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b158015611bd757600080fd5b5087f1158015611beb573d6000803e3d6000fd5b50505050506040513d6020811015611c0257600080fd5b505190506001600160e01b0319811663f23a6e6160e01b146119e65760405162461bcd60e51b815260040180806020018281038252603a81526020018061228b603a913960400191505060405180910390fd5b600082820183811015610d46576040805162461bcd60e51b8152602060048201526016602482015275536166654d617468236164643a204f564552464c4f5760501b604482015290519081900360640190fd5b6001600160e01b031981166301ffc9a760e01b14919050565b805182518451865188516060948a948a948a948a948a948a94919092019092019091010167ffffffffffffffff81118015611cfb57600080fd5b506040519080825280601f01601f191660200182016040528015611d26576020820181803683370190505b509050806000805b8851811015611d7f57888181518110611d4357fe5b602001015160f81c60f81b838380600101945081518110611d6057fe5b60200101906001600160f81b031916908160001a905350600101611d2e565b5060005b8751811015611dd457878181518110611d9857fe5b602001015160f81c60f81b838380600101945081518110611db557fe5b60200101906001600160f81b031916908160001a905350600101611d83565b5060005b8651811015611e2957868181518110611ded57fe5b602001015160f81c60f81b838380600101945081518110611e0a57fe5b60200101906001600160f81b031916908160001a905350600101611dd8565b5060005b8551811015611e7e57858181518110611e4257fe5b602001015160f81c60f81b838380600101945081518110611e5f57fe5b60200101906001600160f81b031916908160001a905350600101611e2d565b5060005b8451811015611ed357848181518110611e9757fe5b602001015160f81c60f81b838380600101945081518110611eb457fe5b60200101906001600160f81b031916908160001a905350600101611e82565b50909d9c50505050505050505050505050565b600082821115611f3d576040805162461bcd60e51b815260206004820152601760248201527f536166654d617468237375623a20554e444552464c4f57000000000000000000604482015290519081900360640190fd5b50900390565b6000813f8015801590610d4657507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282611fb05760008555611ff6565b82601f10611fc95782800160ff19823516178555611ff6565b82800160010185558215611ff6579182015b82811115611ff6578235825591602001919060010190611fdb565b50612002929150612082565b5090565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261203c5760008555611ff6565b82601f1061205557805160ff1916838001178555611ff6565b82800160010185558215611ff6579182015b82811115611ff6578251825591602001919060010190612067565b5b80821115612002576000815560010161208356fe4552433131353523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433131353523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52417274546f6b656e45524331313535236372656174654172743a205449544c455f4e4f545f554e4951554545524331313535235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448417274546f6b656e45524331313535236372656174654172743a204e4f5f44454641554c545f55524945524331313535237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544552433732315472616461626c65237572693a204e4f4e4558495354454e545f544f4b454e455243313135352362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e47544845524331313535237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f5245524331313535235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d45535341474545524331313535235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745a2646970667358221220f993c926a758b9314fe9f1a1d0ffd6ae2f59f73d7d7c89730f70f1ae215a67f464736f6c63430007040033

Deployed Bytecode Sourcemap

200:4048:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1857:717;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1857:717:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1857:717:1;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1857:717:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1857:717:1;;;;;;;;;;-1:-1:-1;1857:717:1;;-1:-1:-1;1857:717:1;-1:-1:-1;1857:717:1;:::i;:::-;;;;;;;;;;;;;;;;7067:132:3;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7067:132:3;;;;;;;;:::i;3679:234:1:-;;;;;;;;;;;;;;;;-1:-1:-1;3679:234:1;-1:-1:-1;;;;;;3679:234:1;;:::i;:::-;;;;;;;;;;;;;;;;;;1022:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2849:365;;;;;;;;;;;;;;;;-1:-1:-1;2849:365:1;;:::i;356:47::-;;;;;;;;;;;;;;;;-1:-1:-1;356:47:1;;:::i;2252:522:3:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2252:522:3;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2252:522:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2252:522:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2252:522:3;;;;;;;;-1:-1:-1;2252:522:3;;-1:-1:-1;;;;;2252:522:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2252:522:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2252:522:3;;;;;;;;-1:-1:-1;2252:522:3;;-1:-1:-1;;;;;2252:522:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2252:522:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2252:522:3;;-1:-1:-1;2252:522:3;;-1:-1:-1;;;;;2252:522:3:i;:::-;;7479:495;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7479:495:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7479:495:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7479:495:3;;;;;;;;-1:-1:-1;7479:495:3;;-1:-1:-1;;;;;7479:495:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7479:495:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7479:495:3;;-1:-1:-1;7479:495:3;;-1:-1:-1;;;;;7479:495:3:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1701:145:10;;;:::i;1387:139:1:-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1387:139:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1387:139:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1387:139:1;;-1:-1:-1;1387:139:1;;-1:-1:-1;;;;;1387:139:1:i;1078:77:10:-;;;:::i;:::-;;;;-1:-1:-1;;;;;1078:77:10;;;;;;;;;;;;;;1065:20:1;;;:::i;6075:230:3:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6075:230:3;;;;;;;;;;:::i;2738:106:1:-;;;;;;;;;;;;;;;;-1:-1:-1;2738:106:1;;:::i;1090:44::-;;;;;;;;;;;;;;;;-1:-1:-1;1090:44:1;;:::i;6567:160:3:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6567:160:3;;;;;;;;;;:::i;1313:556::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1313:556:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1313:556:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1313:556:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1313:556:3;;-1:-1:-1;1313:556:3;;-1:-1:-1;;;;;1313:556:3:i;1995:240:10:-;;;;;;;;;;;;;;;;-1:-1:-1;1995:240:10;-1:-1:-1;;;;;1995:240:10;;:::i;1857:717:1:-;2030:24;;;;;;;;;;;;;;;;;;;;;;;;2020:35;;;;;;;;;1993:4;2070:19;;;:13;:19;;;;;;;1993:4;;2020:35;2070:19;;2069:20;2061:76;;;;-1:-1:-1;;;2061:76:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2143:19;;;;:13;:19;;;;;;;;:26;;-1:-1:-1;;2143:26:1;2165:4;2143:26;;;;;;2176:15;:20;;;;;;;;;2238:13;;;:8;:13;;;;;;:26;;-1:-1:-1;;;;;;2238:26:1;2254:10;2238:26;;;2275:22;;2271:200;;2307:15;;;;:10;:15;;;;;:22;;2325:4;;2307:22;:::i;:::-;;2352:3;2342:14;2346:4;;2342:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2342:14:1;;;;;;;;-1:-1:-1;2342:14:1;;-1:-1:-1;;;;2342:14:1;2271:200;;;2391:15;2385:29;;-1:-1:-1;;2385:29:1;;;;;;;;;;;2377:87;;;;-1:-1:-1;;;2377:87:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2477:42;2483:12;:10;:12::i;:::-;2497:3;2502:9;2513:5;;2477:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2477:5:1;;-1:-1:-1;;;2477:42:1:i;:::-;2525:16;;;;:11;:16;;;;;:28;;;2537:3;-1:-1:-1;;1857:717:1;;;;;;;;:::o;7067:132:3:-;-1:-1:-1;;;;;7173:16:3;;;;7149:7;7173:16;;;;;;;;;;;:21;;;;;;;;;7067:132::o;3679:234:1:-;3765:4;-1:-1:-1;;;;;;3781:50:1;;-1:-1:-1;;;3781:50:1;3777:82;;;-1:-1:-1;3848:4:1;3841:11;;3777:82;3871:37;3895:12;3871:23;:37::i;:::-;3864:44;;3679:234;;;;:::o;1022:18::-;;;;;;;;;;;;;;;-1:-1:-1;;1022:18:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2849:365::-;2913:13;2942:12;2950:3;2942:7;:12::i;:::-;2934:62;;;;-1:-1:-1;;;2934:62:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3029:15;;;;:10;:15;;;;;;;;;3003:41;;;;;;-1:-1:-1;;3003:41:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;:41;;;3029:15;3003:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3061:15:1;3055:29;3003:41;;-1:-1:-1;;;;3055:29:1;-1:-1:-1;;3055:29:1;;;;;;;;;;;3051:71;;3106:9;-1:-1:-1;3099:16:1;;3051:71;3157:15;3135:74;;;;;;;;-1:-1:-1;;3135:74:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3157:15;;3135:74;;3157:15;3135:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3174:25;3195:3;3174:20;:25::i;:::-;3135:74;;;;;;;;;;;;;-1:-1:-1;;;3135:74:1;;;:21;:74::i;:::-;3128:81;2849:365;-1:-1:-1;;;2849:365:1:o;356:47::-;;;;;;;;;;;;;:::o;2252:522:3:-;2438:10;-1:-1:-1;;;;;2438:19:3;;;;2437:60;;;2462:35;2479:5;2486:10;2462:16;:35::i;:::-;2429:120;;;;-1:-1:-1;;;2429:120:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2563:17:3;;2555:78;;;;-1:-1:-1;;;2555:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2640:50;2663:5;2670:3;2675:4;2681:8;2640:22;:50::i;:::-;2696:73;2724:5;2731:3;2736:4;2742:8;2752:9;2763:5;2696:27;:73::i;:::-;2252:522;;;;;:::o;7479:495::-;7586:16;7638:4;:11;7620:7;:14;:29;7612:86;;;;-1:-1:-1;;;7612:86:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7722:30;7769:7;:14;7755:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7755:29:3;;7722:62;;7840:9;7835:108;7859:7;:14;7855:1;:18;7835:108;;;7907:8;:20;7916:7;7924:1;7916:10;;;;;;;;;;;;;;-1:-1:-1;;;;;7907:20:3;-1:-1:-1;;;;;7907:20:3;;;;;;;;;;;;:29;7928:4;7933:1;7928:7;;;;;;;;;;;;;;7907:29;;;;;;;;;;;;7888:13;7902:1;7888:16;;;;;;;;;;;;;;;;;:48;7875:3;;7835:108;;;-1:-1:-1;7956:13:3;7479:495;-1:-1:-1;;;7479:495:3:o;1701:145:10:-;1292:12;:10;:12::i;:::-;1282:6;;-1:-1:-1;;;;;1282:6:10;;;:22;;;1274:67;;;;;-1:-1:-1;;;1274:67:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1791:6:::1;::::0;1770:40:::1;::::0;1807:1:::1;::::0;-1:-1:-1;;;;;1791:6:10::1;::::0;1770:40:::1;::::0;1807:1;;1770:40:::1;1820:6;:19:::0;;-1:-1:-1;;;;;;1820:19:10::1;::::0;;1701:145::o;1387:139:1:-;1292:12:10;:10;:12::i;:::-;1282:6;;-1:-1:-1;;;;;1282:6:10;;;:22;;;1274:67;;;;;-1:-1:-1;;;1274:67:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1481:40:1::1;1501:19;1481;:40::i;:::-;1387:139:::0;:::o;1078:77:10:-;1142:6;;-1:-1:-1;;;;;1142:6:10;1078:77;:::o;1065:20:1:-;;;;;;;;;;;;;;;-1:-1:-1;;1065:20:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6075:230:3;6207:10;6197:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;6197:32:3;;;;;;;;;;;;:44;;-1:-1:-1;;6197:44:3;;;;;;;;;;6252:48;;;;;;;6197:32;;6207:10;6252:48;;;;;;;;;;;6075:230;;:::o;2738:106:1:-;2801:7;2823:16;;;:11;:16;;;;;;;2738:106::o;1090:44::-;;;;;;;;;;;;-1:-1:-1;;;;;1090:44:1;;:::o;6567:160:3:-;-1:-1:-1;;;;;6694:17:3;;;6662:15;6694:17;;;:9;:17;;;;;;;;:28;;;;;;;;;;;;;;;6567:160::o;1313:556::-;1454:10;-1:-1:-1;;;;;1454:19:3;;;;1453:60;;;1478:35;1495:5;1502:10;1478:16;:35::i;:::-;1445:115;;;;-1:-1:-1;;;1445:115:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1574:17:3;;1566:72;;;;-1:-1:-1;;;1566:72:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1749:43;1767:5;1774:3;1779;1784:7;1749:17;:43::i;:::-;1798:66;1821:5;1828:3;1833;1838:7;1847:9;1858:5;1798:22;:66::i;1995:240:10:-;1292:12;:10;:12::i;:::-;1282:6;;-1:-1:-1;;;;;1282:6:10;;;:22;;;1274:67;;;;;-1:-1:-1;;;1274:67:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2083:22:10;::::1;2075:73;;;;-1:-1:-1::0;;;2075:73:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2184:6;::::0;2163:38:::1;::::0;-1:-1:-1;;;;;2163:38:10;;::::1;::::0;2184:6:::1;::::0;2163:38:::1;::::0;2184:6:::1;::::0;2163:38:::1;2211:6;:17:::0;;-1:-1:-1;;;;;;2211:17:10::1;-1:-1:-1::0;;;;;2211:17:10;;;::::1;::::0;;;::::1;::::0;;1995:240::o;598:104:2:-;685:10;598:104;:::o;716:401:5:-;-1:-1:-1;;;;;855:13:5;;:8;:13;;;;;;;;;;;:18;;;;;;;;;:31;;878:7;855:22;:31::i;:::-;-1:-1:-1;;;;;834:13:5;;:8;:13;;;;;;;;;;;:18;;;;;;;;:52;;;;916:59;;;;;;;;;;;;;834:13;;:8;;931:10;;916:59;;;;;;;;1039:73;1070:3;1076;1081;1086:7;1095:9;1106:5;1039:22;:73::i;:::-;716:401;;;;:::o;8311:226:3:-;8397:4;-1:-1:-1;;;;;;8413:42:3;;-1:-1:-1;;;8413:42:3;8409:74;;;-1:-1:-1;8472:4:3;8465:11;;8409:74;8495:37;8519:12;8495:23;:37::i;4134:112:1:-;4195:4;4214:13;;;:8;:13;;;;;;-1:-1:-1;;;;;4214:13:1;:27;;;4134:112::o;1448:389:12:-;1498:27;1537:7;1533:38;;-1:-1:-1;1554:10:12;;;;;;;;;;;;-1:-1:-1;;;1554:10:12;;;;;;1533:38;1585:2;1576:6;1607:50;1614:6;;1607:50;;1630:5;;1648:2;1643:7;;;;1607:50;;;1662:17;1692:3;1682:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1682:14:12;-1:-1:-1;1662:34:12;-1:-1:-1;;;1711:7:12;;1724:84;1731:7;;1724:84;;1781:2;1776;:7;1771:2;:12;1760:25;;1748:4;1753:3;;;;;;;1748:9;;;;;;;;;;;:37;-1:-1:-1;;;;;1748:37:12;;;;;;;;-1:-1:-1;1799:2:12;1793:8;;;;1724:84;;;-1:-1:-1;1827:4:12;1448:389;-1:-1:-1;;;;1448:389:12:o;1142:158::-;1238:13;1266:29;1276:2;1280;1284;1266:29;;;;;;;;;;;;;;;;;;;;;;;;:9;:29::i;:::-;1259:36;1142:158;-1:-1:-1;;;;1142:158:12:o;4392:670:3:-;4546:8;:15;4531:4;:11;:30;4523:96;;;;-1:-1:-1;;;4523:96:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4683:11;;4663:17;4732:243;4756:9;4752:1;:13;4732:243;;;4855:41;4884:8;4893:1;4884:11;;;;;;;;;;;;;;4855:8;:15;4864:5;-1:-1:-1;;;;;4855:15:3;-1:-1:-1;;;;;4855:15:3;;;;;;;;;;;;:24;4871:4;4876:1;4871:7;;;;;;;;;;;;;;4855:24;;;;;;;;;;;;:28;;:41;;;;:::i;:::-;4828:8;:15;4837:5;-1:-1:-1;;;;;4828:15:3;-1:-1:-1;;;;;4828:15:3;;;;;;;;;;;;:24;4844:4;4849:1;4844:7;;;;;;;;;;;;;;4828:24;;;;;;;;;;;:68;;;;4929:39;4956:8;4965:1;4956:11;;;;;;;;;;;;;;4929:8;:13;4938:3;-1:-1:-1;;;;;4929:13:3;-1:-1:-1;;;;;4929:13:3;;;;;;;;;;;;:22;4943:4;4948:1;4943:7;;;;;;;;;;;;;;4929:22;;;;;;;;;;;;:26;;:39;;;;:::i;:::-;4904:8;:13;4913:3;-1:-1:-1;;;;;4904:13:3;-1:-1:-1;;;;;4904:13:3;;;;;;;;;;;;:22;4918:4;4923:1;4918:7;;;;;;;;;;;;;;;;;;;4904:22;;;;;;;;;;-1:-1:-1;4904:22:3;:64;4767:3;;4732:243;;;;5037:3;-1:-1:-1;;;;;5004:53:3;5030:5;-1:-1:-1;;;;;5004:53:3;5018:10;-1:-1:-1;;;;;5004:53:3;;5042:4;5048:8;5004:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4392:670;;;;;:::o;5175:503::-;5396:16;:3;-1:-1:-1;;;;;5396:14:3;;:16::i;:::-;5392:282;;;5422:13;5460:3;-1:-1:-1;;;;;5438:49:3;;5493:9;5504:10;5516:5;5523:4;5529:8;5539:5;5438:107;;;;;;;;;;;;;-1:-1:-1;;;;;5438:107:3;;;;;;-1:-1:-1;;;;;5438:107:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5438:107:3;;-1:-1:-1;;;;;;;5561:38:3;;-1:-1:-1;;;5561:38:3;5553:114;;;;-1:-1:-1;;;5553:114:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5392:282;;5175:503;;;;;;:::o;3343:121:1:-;3422:37;;;;:15;;:37;;;;;:::i;:::-;;3343:121;:::o;3164:367:3:-;-1:-1:-1;;;;;3316:15:3;;:8;:15;;;;;;;;;;;:20;;;;;;;;;:33;;3341:7;3316:24;:33::i;:::-;-1:-1:-1;;;;;3293:15:3;;;:8;:15;;;;;;;;;;;:20;;;;;;;;:56;;;;3395:13;;;;;;;;;;;:18;;;;;;;;:31;;3418:7;3395:22;:31::i;:::-;-1:-1:-1;;;;;3374:13:3;;;:8;:13;;;;;;;;;;;:18;;;;;;;;;:52;;;;3474;;;;;;;;;;;;;3374:13;;3474:52;;;;3489:10;;3474:52;;;;;;;;;;;3164:367;;;;:::o;3639:456::-;3831:16;:3;-1:-1:-1;;;;;3831:14:3;;:16::i;:::-;3827:264;;;3857:13;3895:3;-1:-1:-1;;;;;3873:44:3;;3923:9;3934:10;3946:5;3953:3;3958:7;3967:5;3873:100;;;;;;;;;;;;;-1:-1:-1;;;;;3873:100:3;;;;;;-1:-1:-1;;;;;3873:100:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3873:100:3;;-1:-1:-1;;;;;;;3989:32:3;;-1:-1:-1;;;3989:32:3;3981:103;;;;-1:-1:-1;;;3981:103:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1419:158:11;1477:7;1504:5;;;1523:6;;;;1515:41;;;;;-1:-1:-1;;;1515:41:11;;;;;;;;;;;;-1:-1:-1;;;1515:41:11;;;;;;;;;;;;;;259:148:6;-1:-1:-1;;;;;;355:47:6;;-1:-1:-1;;;355:47:6;259:148;;;:::o;131:827:12:-;539:10;;526;;513;;500;;487;;263:13;;309:2;;343;;377;;411;;445;;263:13;;487:23;;;;:36;;;:49;;;:62;476:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;476:74:12;-1:-1:-1;454:96:12;-1:-1:-1;454:96:12;596:6;;612:58;633:3;:10;629:1;:14;612:58;;;664:3;668:1;664:6;;;;;;;;;;;;;;;;650;657:3;;;;;;650:11;;;;;;;;;;;:20;-1:-1:-1;;;;;650:20:12;;;;;;;;-1:-1:-1;645:3:12;;612:58;;;;681:6;676:58;697:3;:10;693:1;:14;676:58;;;728:3;732:1;728:6;;;;;;;;;;;;;;;;714;721:3;;;;;;714:11;;;;;;;;;;;:20;-1:-1:-1;;;;;714:20:12;;;;;;;;-1:-1:-1;709:3:12;;676:58;;;;745:6;740:58;761:3;:10;757:1;:14;740:58;;;792:3;796:1;792:6;;;;;;;;;;;;;;;;778;785:3;;;;;;778:11;;;;;;;;;;;:20;-1:-1:-1;;;;;778:20:12;;;;;;;;-1:-1:-1;773:3:12;;740:58;;;;809:6;804:58;825:3;:10;821:1;:14;804:58;;;856:3;860:1;856:6;;;;;;;;;;;;;;;;842;849:3;;;;;;842:11;;;;;;;;;;;:20;-1:-1:-1;;;;;842:20:12;;;;;;;;-1:-1:-1;837:3:12;;804:58;;;;873:6;868:58;889:3;:10;885:1;:14;868:58;;;920:3;924:1;920:6;;;;;;;;;;;;;;;;906;913:3;;;;;;906:11;;;;;;;;;;;:20;-1:-1:-1;;;;;906:20:12;;;;;;;;-1:-1:-1;901:3:12;;868:58;;;-1:-1:-1;946:6:12;;131:827;-1:-1:-1;;;;;;;;;;;;;131:827:12:o;1186:158:11:-;1244:7;1272:1;1267;:6;;1259:42;;;;;-1:-1:-1;;;1259:42:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1319:5:11;;;1186:158::o;541:398:0:-;602:4;854:21;;890:15;;;;;:43;;-1:-1:-1;206:66:0;909:24;;;541:398;-1:-1:-1;;541:398:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://f993c926a758b9314fe9f1a1d0ffd6ae2f59f73d7d7c89730f70f1ae215a67f4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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