ETH Price: $3,406.86 (+2.86%)

Token

Spottheball game minter (HARDCORE)
 

Overview

Max Total Supply

164 HARDCORE

Holders

36

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
cryptlesh.eth
0x4cF93693586FE5E2F2c7097140F2EfA23e3e3FBa
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GameMinter

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 7 of 19: GameMinter.sol
pragma solidity 0.5.12;
pragma experimental ABIEncoderV2;

import "./ERC1155Minter.sol";

contract GameMinter is ERC1155Minter {

  function uri() public view returns (string memory) {
    return baseMetadataURI;
  }

  function uri(uint256) public view returns (string memory) {
    return baseMetadataURI;
  }
}

File 1 of 19: Address.sol
pragma solidity 0.5.12;

/**
 * Copyright 2018 ZeroEx Intl.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *   http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * Utility library of inline functions on addresses
 */
library Address {

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   * as the code is not actually created until after the constructor finishes.
   * @param account address of the account to check
   * @return whether the target address is a contract
   */
  function isContract(address account) internal view returns (bool) {
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;

    // XXX 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.
    // See https://ethereum.stackexchange.com/a/14016/36603
    // for more details about how this works.
    // TODO Check this again before the Serenity release, because all addresses will be
    // contracts then.
    assembly { codehash := extcodehash(account) }
    return (codehash != 0x0 && codehash != accountHash);
  }

}

File 2 of 19: Context.sol
pragma solidity 0.5.12;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

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

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

File 3 of 19: ERC1155.sol
pragma solidity 0.5.12;

import "./IERC165.sol";
import "./SafeMath.sol";
import "./Address.sol";
import "./IERC1155TokenReceiver.sol";

/**
 * @dev Implementation of Multi-Token Standard contract
 */
contract ERC1155 is IERC165 {
  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;

  // Events
  event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _amount);
  event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _amounts);
  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
  event URI(string _uri, uint256 indexed _id);


  /***********************************|
  |     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
  {
    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, _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
  {
    // 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, _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, bytes memory _data)
    internal
  {
    // Check if recipient is contract
    if (_to.isContract()) {
      bytes4 retval = IERC1155TokenReceiver(_to).onERC1155Received(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, bytes memory _data)
    internal
  {
    // Pass data if recipient is contract
    if (_to.isContract()) {
      bytes4 retval = IERC1155TokenReceiver(_to).onERC1155BatchReceived(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
  {
    // 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 True if the operator is approved, false if not
   */
  function isApprovedForAll(address _owner, address _operator)
    public 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 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 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         |
  |__________________________________*/

  /**
   * INTERFACE_SIGNATURE_ERC165 = bytes4(keccak256("supportsInterface(bytes4)"));
   */
  bytes4 constant private INTERFACE_SIGNATURE_ERC165 = 0x01ffc9a7;

  /**
   * INTERFACE_SIGNATURE_ERC1155 =
   * bytes4(keccak256("safeTransferFrom(address,address,uint256,uint256,bytes)")) ^
   * bytes4(keccak256("safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)")) ^
   * bytes4(keccak256("balanceOf(address,uint256)")) ^
   * bytes4(keccak256("balanceOfBatch(address[],uint256[])")) ^
   * bytes4(keccak256("setApprovalForAll(address,bool)")) ^
   * bytes4(keccak256("isApprovedForAll(address,address)"));
   */
  bytes4 constant private INTERFACE_SIGNATURE_ERC1155 = 0xd9b67a26;

  /**
   * @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) external view returns (bool) {
    if (_interfaceID == INTERFACE_SIGNATURE_ERC165 ||
        _interfaceID == INTERFACE_SIGNATURE_ERC1155) {
      return true;
    }
    return false;
  }

}

File 4 of 19: ERC1155Metadata.sol
pragma solidity 0.5.12;

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

  // URI's default URI prefix
  string internal baseMetadataURI;
  event URI(string _uri, uint256 indexed _id);


  /***********************************|
  |     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
   *      Token IDs are assumed to be represented in their hex format in URIs
   * @return URI string
   */
  function uri(uint256 _id) public 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 emit a specific URI log event for corresponding token
   * @param _tokenIDs IDs of the token corresponding to the _uris logged
   * @param _URIs    The URIs of the specified _tokenIDs
   */
  function _logURIs(uint256[] memory _tokenIDs, string[] memory _URIs) internal {
    require(_tokenIDs.length == _URIs.length, "ERC1155Metadata#_logURIs: INVALID_ARRAYS_LENGTH");
    for (uint256 i = 0; i < _tokenIDs.length; i++) {
      emit URI(_URIs[i], _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;
  }


  /***********************************|
  |    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 5 of 19: ERC1155MintBurn.sol
pragma solidity 0.5.12;


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 {


  /****************************************|
  |            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, _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, _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
  {
    require(_ids.length == _amounts.length, "ERC1155MintBurn#batchBurn: INVALID_ARRAYS_LENGTH");

    // Number of mints to execute
    uint256 nBurn = _ids.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 6 of 19: ERC1155Minter.sol
pragma solidity 0.5.12;
pragma experimental ABIEncoderV2;

import "../Ownable.sol";
import "../MinterRole.sol";
import "../ERC1155.sol";
import "../WhitelistAdminRole.sol";
import "../ERC1155Metadata.sol";
import "../ERC1155MintBurn.sol";
import "../Strings.sol";
import "../ProxyRegistry.sol";

/**
 * @title ERC1155Tradable
 * ERC1155Tradable - ERC1155 contract that whitelists an operator address, 
 * has create and mint functionality, and supports useful standards from OpenZeppelin,
  like _exists(), name(), symbol(), and totalSupply()
 */
contract ERC1155Minter is ERC1155, ERC1155MintBurn, ERC1155Metadata, Ownable, MinterRole, WhitelistAdminRole {
    using Strings for string;

    struct Participant {
        uint128 nftId;
        uint64 x;
        uint64 y;
        address participant;
    }

    Participant [] internal _participants;
    mapping(uint256 => address) public creators;
    mapping(uint256 => uint256) public tokenSupply;
    mapping(uint256 => uint256) public tokenMaxSupply;
    // Contract name
    string public name;
    // Contract symbol
    string public symbol;

    function init(string memory _name, string memory _symbol) public onlyOwner {
        require((bytes(name)).length == 0, 'Already initiated');

        name = _name;
        symbol = _symbol;
        _addMinter(_msgSender());
        _addWhitelistAdmin(_msgSender());
        _setBaseMetadataURI("https://lambo.hcore.finance/spot-the-ball-win/#home");
    }

    function removeWhitelistAdmin(address account) public onlyOwner {
        _removeWhitelistAdmin(account);
    }

    function removeMinter(address account) public onlyOwner {
        _removeMinter(account);
    }

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

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

    /**
     * @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 onlyWhitelistAdmin {
        _setBaseMetadataURI(_newBaseMetadataURI);
    }

    /**
     * @dev Creates a new token type and assigns _initialSupply to an address
     * @param _maxSupply max supply allowed
     * @param _initialSupply Optional amount to supply the first owner
     * @param _id attemptId
     * @param _data Optional data to pass if receiver is contract
     * @return The newly created token ID
     */
    function create(
        address _creator,
        uint256 _maxSupply,
        uint256 _initialSupply,
        uint256 _id,
        uint64 _x,
        uint64 _y,
        bytes calldata _data
    ) external onlyMinter returns (uint256) {
        require(!_exists(_id), "Id already used");
        require(_initialSupply <= _maxSupply, "Initial supply cannot be more than max supply");
        creators[_id] = _creator;

        if (_initialSupply != 0) _mint(_creator, _id, _initialSupply, _data);
        tokenSupply[_id] = _initialSupply;
        tokenMaxSupply[_id] = _maxSupply;
        _participants.push(Participant(uint128(_id), _x, _y, _creator));
        return _id;
    }

    function getParticipantsCount() public view returns (uint) {
        return _participants.length;
    }

    function getParticipantById(uint _id) public view returns (uint128, uint64, uint64, address) {
        Participant storage participant = _participants[_id];
        return (participant.nftId, participant.x, participant.y, participant.participant);
    }

    /**
     * @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 8 of 19: IERC1155.sol
pragma solidity 0.5.12;

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);

  /**
   * @dev MUST emit when the URI is updated for a token ID
   *   URIs are defined in RFC 3986
   *   The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata JSON Schema"
   */
  event URI(string _amount, uint256 indexed _id);

  /**
   * @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           True if the operator is approved, false if not
   */
  function isApprovedForAll(address _owner, address _operator) external view returns (bool isOperator);

}

File 9 of 19: IERC1155TokenReceiver.sol
pragma solidity 0.5.12;

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

  /**
   * @notice Indicates whether a contract implements the `ERC1155TokenReceiver` functions and so can accept ERC1155 token types.
   * @param  interfaceID The ERC-165 interface ID that is queried for support.s
   * @dev This function MUST return true if it implements the ERC1155TokenReceiver interface and ERC-165 interface.
   *      This function MUST NOT consume more than 5,000 gas.
   * @return Wheter ERC-165 or ERC1155TokenReceiver interfaces are supported.
   */
  function supportsInterface(bytes4 interfaceID) external view returns (bool);

}

File 10 of 19: IERC165.sol
pragma solidity 0.5.12;

/**
 * @title ERC165
 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
 */
interface IERC165 {

    /**
     * @notice Query if a contract implements an interface
     * @dev Interface identification is specified in ERC-165. This function
     * uses less than 30,000 gas
     * @param _interfaceId The interface identifier, as specified in ERC-165
     */
    function supportsInterface(bytes4 _interfaceId)
    external
    view
    returns (bool);
}

File 11 of 19: IERC20.sol
pragma solidity 0.5.12;


/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 12 of 19: LPTokenWrapper.sol
pragma solidity 0.5.12;

import "./IERC20.sol";
import "./SafeMath.sol";


contract LPTokenWrapper {
    using SafeMath for uint256;
    IERC20 public token;

    constructor(IERC20 _erc20Address) public {
        token = IERC20(_erc20Address);
    }

    uint256 private _totalSupply;
    mapping(address => uint256) private _balances;

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    function stake(uint256 amount) public {
        _totalSupply = _totalSupply.add(amount);
        _balances[msg.sender] = _balances[msg.sender].add(amount);
        token.transferFrom(msg.sender, address(this), amount);
    }

    function withdraw(uint256 amount) public {
        _totalSupply = _totalSupply.sub(amount);
        _balances[msg.sender] = _balances[msg.sender].sub(amount);
        token.transfer(msg.sender, amount);
    }
}

File 13 of 19: MinterRole.sol
pragma solidity 0.5.12;

import "./Context.sol";
import "./Roles.sol";

contract MinterRole is Context {
    using Roles for Roles.Role;

    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);

    Roles.Role private _minters;

    modifier onlyMinter() {
        require(isMinter(_msgSender()), "MinterRole: caller does not have the Minter role");
        _;
    }

    function isMinter(address account) public view returns (bool) {
        return _minters.has(account);
    }

    function addMinter(address account) public onlyMinter {
        _addMinter(account);
    }

    function renounceMinter() public {
        _removeMinter(_msgSender());
    }

    function _addMinter(address account) internal {
        _minters.add(account);
        emit MinterAdded(account);
    }

    function _removeMinter(address account) internal {
        _minters.remove(account);
        emit MinterRemoved(account);
    }
}

File 14 of 19: Ownable.sol
pragma solidity 0.5.12;
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.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

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

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

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

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

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

File 15 of 19: ProxyRegistry.sol
pragma solidity 0.5.12;

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

File 16 of 19: Roles.sol
pragma solidity 0.5.12;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

File 17 of 19: SafeMath.sol
pragma solidity 0.5.12;

/**
 * @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 18 of 19: Strings.sol
pragma solidity 0.5.12;


library Strings {
    // 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);
        uint256 k = 0;
        for (uint256 i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
        for (uint256 i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
        for (uint256 i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
        for (uint256 i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
        for (uint256 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(uint256 _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len - 1;
        while (_i != 0) {
            bstr[k--] = bytes1(uint8(48 + (_i % 10)));
            _i /= 10;
        }
        return string(bstr);
    }
}

File 19 of 19: WhitelistAdminRole.sol
pragma solidity 0.5.12;

import "./Context.sol";
import "./Roles.sol";

/**
 * @title WhitelistAdminRole
 * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts.
 */
contract WhitelistAdminRole is Context {
    using Roles for Roles.Role;

    event WhitelistAdminAdded(address indexed account);
    event WhitelistAdminRemoved(address indexed account);

    Roles.Role private _whitelistAdmins;

    modifier onlyWhitelistAdmin() {
        require(isWhitelistAdmin(_msgSender()), "WhitelistAdminRole: caller does not have the WhitelistAdmin role");
        _;
    }

    function isWhitelistAdmin(address account) public view returns (bool) {
        return _whitelistAdmins.has(account);
    }

    function addWhitelistAdmin(address account) public onlyWhitelistAdmin {
        _addWhitelistAdmin(account);
    }

    function renounceWhitelistAdmin() public {
        _removeWhitelistAdmin(_msgSender());
    }

    function _addWhitelistAdmin(address account) internal {
        _whitelistAdmins.add(account);
        emit WhitelistAdminAdded(account);
    }

    function _removeWhitelistAdmin(address account) internal {
        _whitelistAdmins.remove(account);
        emit WhitelistAdminRemoved(account);
    }
}

Contract Security Audit

Contract ABI

[{"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":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminRemoved","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_creator","type":"address"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_initialSupply","type":"uint256"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint64","name":"_x","type":"uint64"},{"internalType":"uint64","name":"_y","type":"uint64"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"create","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creators","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getParticipantById","outputs":[{"internalType":"uint128","name":"","type":"uint128"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getParticipantsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_newBaseMetadataURI","type":"string"}],"name":"setBaseMetadataURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]

608060405260006100176001600160e01b0361006a16565b600380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b6128c08061007d6000396000f3fe608060405234801561001057600080fd5b50600436106101f95760003560e01c8063869f75941161011a578063bb5f747b116100ad578063e933708b1161007c578063e933708b14610416578063e985e9c514610429578063eac989f81461043c578063f242432a14610444578063f2fde38b14610457576101f9565b8063bb5f747b146103d5578063bd85b039146103e8578063cabfaa18146103fb578063cd53d08e14610403576101f9565b8063983b2d56116100e9578063983b2d561461039457806398650275146103a7578063a22cb465146103af578063aa271e1a146103c2576101f9565b8063869f75941461035c5780638da5cb5b1461036f5780638f32d59b1461038457806395d89b411461038c576101f9565b80634c5a628c116101925780637029144c116101615780637029144c1461031b578063715018a61461032e5780637362d9c8146103365780637e518ec814610349576101f9565b80634c5a628c146102bd5780634e1273f4146102c557806353850db3146102e55780636897e97414610308576101f9565b80630e89341c116101ce5780630e89341c1461026f5780632693ebf2146102825780632eb2c2d6146102955780633092afd5146102aa576101f9565b80624221f0146101fe578062fdd58e1461022757806301ffc9a71461023a57806306fdde031461025a575b600080fd5b61021161020c366004611dab565b61046a565b60405161021e91906126d5565b60405180910390f35b610211610235366004611b9a565b61047c565b61024d610248366004611cde565b6104a5565b60405161021e9190612538565b6102626104ec565b60405161021e9190612546565b61026261027d366004611dab565b61057a565b610211610290366004611dab565b61060f565b6102a86102a3366004611a59565b610621565b005b6102a86102b8366004611a01565b6106a8565b6102a86106d8565b6102d86102d3366004611c81565b6106ea565b60405161021e9190612502565b6102f86102f3366004611dab565b6107cc565b60405161021e9493929190612697565b6102a8610316366004611a01565b610835565b6102a8610329366004611d4e565b610862565b6102a8610926565b6102a8610344366004611a01565b610994565b6102a8610357366004611d1a565b6109c4565b61021161036a366004611dab565b6109f4565b610377610a06565b60405161021e919061244d565b61024d610a16565b610262610a3c565b6102a86103a2366004611a01565b610a97565b6102a8610ac7565b6102a86103bd366004611b6a565b610ad7565b61024d6103d0366004611a01565b610b46565b61024d6103e3366004611a01565b610b59565b6102116103f6366004611dab565b610b6c565b610211610b7e565b610377610411366004611dab565b610b84565b610211610424366004611bca565b610b9f565b61024d610437366004611a1f565b610db2565b610262610de0565b6102a8610452366004611b13565b610e73565b6102a8610465366004611a01565b610eea565b60096020526000908152604090205481565b6001600160a01b0382166000908152602081815260408083208484529091529020545b92915050565b60006001600160e01b031982166301ffc9a760e01b14806104d657506001600160e01b03198216636cdb3d1360e11b145b156104e3575060016104e7565b5060005b919050565b600a805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105725780601f1061054757610100808354040283529160200191610572565b820191906000526020600020905b81548152906001019060200180831161055557829003601f168201915b505050505081565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156106035780601f106105d857610100808354040283529160200191610603565b820191906000526020600020905b8154815290600101906020018083116105e657829003601f168201915b50505050509050919050565b60086020526000908152604090205481565b336001600160a01b038616148061063d575061063d8533610db2565b6106625760405162461bcd60e51b815260040161065990612647565b60405180910390fd5b6001600160a01b0384166106885760405162461bcd60e51b8152600401610659906125d7565b61069485858585610f17565b6106a18585858585611121565b5050505050565b6106b0610a16565b6106cc5760405162461bcd60e51b8152600401610659906125f7565b6106d5816111fb565b50565b6106e86106e3611243565b611247565b565b6060815183511461070d5760405162461bcd60e51b815260040161065990612637565b6060835160405190808252806020026020018201604052801561073a578160200160208202803883390190505b50905060005b84518110156107c45760008086838151811061075857fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600085838151811061078e57fe5b60200260200101518152602001908152602001600020548282815181106107b157fe5b6020908102919091010152600101610740565b509392505050565b6000806000806000600686815481106107e157fe5b6000918252602090912060029091020180546001909101546001600160801b038216986001600160401b03600160801b840481169950600160c01b90930490921696506001600160a01b0316945092505050565b61083d610a16565b6108595760405162461bcd60e51b8152600401610659906125f7565b6106d581611247565b61086a610a16565b6108865760405162461bcd60e51b8152600401610659906125f7565b600a5460026000196101006001841615020190911604156108b95760405162461bcd60e51b8152600401610659906125e7565b81516108cc90600a9060208501906117a1565b5080516108e090600b9060208401906117a1565b506108f16108ec611243565b61128f565b6109016108fc611243565b6112d7565b61092260405180606001604052806033815260200161284b6033913961131f565b5050565b61092e610a16565b61094a5760405162461bcd60e51b8152600401610659906125f7565b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380546001600160a01b0319169055565b61099f6103e3611243565b6109bb5760405162461bcd60e51b815260040161065990612627565b6106d5816112d7565b6109cf6103e3611243565b6109eb5760405162461bcd60e51b815260040161065990612627565b6106d58161131f565b60009081526009602052604090205490565b6003546001600160a01b03165b90565b6003546000906001600160a01b0316610a2d611243565b6001600160a01b031614905090565b600b805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105725780601f1061054757610100808354040283529160200191610572565b610aa26103d0611243565b610abe5760405162461bcd60e51b8152600401610659906125b7565b6106d58161128f565b6106e8610ad2611243565b6111fb565b3360008181526001602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610b3a908590612538565b60405180910390a35050565b600061049f60048363ffffffff61133216565b600061049f60058363ffffffff61133216565b60009081526008602052604090205490565b60065490565b6007602052600090815260409020546001600160a01b031681565b6000610bac6103d0611243565b610bc85760405162461bcd60e51b8152600401610659906125b7565b610bd18661137a565b15610bee5760405162461bcd60e51b815260040161065990612687565b87871115610c0e5760405162461bcd60e51b815260040161065990612607565b600086815260076020526040902080546001600160a01b0319166001600160a01b038b161790558615610c7d57610c7d89878986868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061139792505050565b505050600083815260086020908152604080832096909655600981528582209690965584516080810186526001600160801b0380861682526001600160401b039485169782019788529284169581019586526001600160a01b039788166060820190815260068054600181018255935290517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f60029093029283018054985197516fffffffffffffffffffffffffffffffff19909916919094161767ffffffffffffffff60801b1916600160801b96851696909602959095176001600160c01b0316600160c01b969093169590950291909117905590517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090920180546001600160a01b031916929093169190911790915590565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b60028054604080516020601f6000196101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015610e695780601f10610e3e57610100808354040283529160200191610e69565b820191906000526020600020905b815481529060010190602001808311610e4c57829003601f168201915b5050505050905090565b336001600160a01b0386161480610e8f5750610e8f8533610db2565b610eab5760405162461bcd60e51b815260040161065990612587565b6001600160a01b038416610ed15760405162461bcd60e51b815260040161065990612557565b610edd85858585611441565b6106a18585858585611529565b610ef2610a16565b610f0e5760405162461bcd60e51b8152600401610659906125f7565b6106d5816115fb565b8051825114610f385760405162461bcd60e51b8152600401610659906125a7565b815160005b818110156110c257610fb3838281518110610f5457fe5b6020026020010151600080896001600160a01b03166001600160a01b031681526020019081526020016000206000878581518110610f8e57fe5b602002602001015181526020019081526020016000205461167d90919063ffffffff16565b600080886001600160a01b03166001600160a01b031681526020019081526020016000206000868481518110610fe557fe5b602002602001015181526020019081526020016000208190555061106d83828151811061100e57fe5b6020026020010151600080886001600160a01b03166001600160a01b03168152602001908152602001600020600087858151811061104857fe5b60200260200101518152602001908152602001600020546116a590919063ffffffff16565b600080876001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061109f57fe5b602090810291909101810151825281019190915260400160002055600101610f3d565b50836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611112929190612513565b60405180910390a45050505050565b611133846001600160a01b03166116d1565b156106a15760405163bc197c8160e01b81526000906001600160a01b0386169063bc197c819061116f9033908a9089908990899060040161245b565b602060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111c19190810190611cfc565b90506001600160e01b0319811663bc197c8160e01b146111f35760405162461bcd60e51b815260040161065990612657565b505050505050565b61120c60048263ffffffff61170d16565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b3390565b61125860058263ffffffff61170d16565b6040516001600160a01b038216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b6112a060048263ffffffff61175516565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6112e860058263ffffffff61175516565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b80516109229060029060208401906117a1565b60006001600160a01b03821661135a5760405162461bcd60e51b815260040161065990612617565b506001600160a01b03166000908152602091909152604090205460ff1690565b6000908152600760205260409020546001600160a01b0316151590565b6001600160a01b0384166000908152602081815260408083208684529091529020546113c9908363ffffffff6116a516565b6001600160a01b03851660008181526020818152604080832088845290915280822093909355915190919033907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629061142590889088906126e3565b60405180910390a461143b600085858585611529565b50505050565b6001600160a01b038416600090815260208181526040808320858452909152902054611473908263ffffffff61167d16565b6001600160a01b03808616600090815260208181526040808320878452825280832094909455918616815280825282812085825290915220546114bc908263ffffffff6116a516565b6001600160a01b03808516600081815260208181526040808320888452909152908190209390935591519086169033907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629061151b90879087906126e3565b60405180910390a450505050565b61153b846001600160a01b03166116d1565b156106a15760405163f23a6e6160e01b81526000906001600160a01b0386169063f23a6e61906115779033908a908990899089906004016124bb565b602060405180830381600087803b15801561159157600080fd5b505af11580156115a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115c99190810190611cfc565b90506001600160e01b0319811663f23a6e6160e01b146111f35760405162461bcd60e51b815260040161065990612667565b6001600160a01b0381166116215760405162461bcd60e51b815260040161065990612577565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b60008282111561169f5760405162461bcd60e51b815260040161065990612597565b50900390565b6000828201838110156116ca5760405162461bcd60e51b815260040161065990612677565b9392505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906117055750808214155b949350505050565b6117178282611332565b6117335760405162461bcd60e51b8152600401610659906125c7565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b61175f8282611332565b1561177c5760405162461bcd60e51b815260040161065990612567565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106117e257805160ff191683800117855561180f565b8280016001018555821561180f579182015b8281111561180f5782518255916020019190600101906117f4565b5061181b92915061181f565b5090565b610a1391905b8082111561181b5760008155600101611825565b803561049f81612812565b600082601f83011261185557600080fd5b813561186861186382612724565b6126fe565b9150818183526020840193506020810190508385602084028201111561188d57600080fd5b60005b838110156118b957816118a38882611839565b8452506020928301929190910190600101611890565b5050505092915050565b600082601f8301126118d457600080fd5b81356118e261186382612724565b9150818183526020840193506020810190508385602084028201111561190757600080fd5b60005b838110156118b9578161191d88826119eb565b845250602092830192919091019060010161190a565b803561049f81612826565b803561049f8161282f565b805161049f8161282f565b60008083601f84011261196657600080fd5b5081356001600160401b0381111561197d57600080fd5b60208301915083600182028301111561199557600080fd5b9250929050565b600082601f8301126119ad57600080fd5b81356119bb61186382612744565b915080825260208301602083018583830111156119d757600080fd5b6119e28382846127d0565b50505092915050565b803561049f81612838565b803561049f81612841565b600060208284031215611a1357600080fd5b60006117058484611839565b60008060408385031215611a3257600080fd5b6000611a3e8585611839565b9250506020611a4f85828601611839565b9150509250929050565b600080600080600060a08688031215611a7157600080fd5b6000611a7d8888611839565b9550506020611a8e88828901611839565b94505060408601356001600160401b03811115611aaa57600080fd5b611ab6888289016118c3565b93505060608601356001600160401b03811115611ad257600080fd5b611ade888289016118c3565b92505060808601356001600160401b03811115611afa57600080fd5b611b068882890161199c565b9150509295509295909350565b600080600080600060a08688031215611b2b57600080fd5b6000611b378888611839565b9550506020611b4888828901611839565b9450506040611b59888289016119eb565b9350506060611ade888289016119eb565b60008060408385031215611b7d57600080fd5b6000611b898585611839565b9250506020611a4f85828601611933565b60008060408385031215611bad57600080fd5b6000611bb98585611839565b9250506020611a4f858286016119eb565b60008060008060008060008060e0898b031215611be657600080fd5b6000611bf28b8b611839565b9850506020611c038b828c016119eb565b9750506040611c148b828c016119eb565b9650506060611c258b828c016119eb565b9550506080611c368b828c016119f6565b94505060a0611c478b828c016119f6565b93505060c08901356001600160401b03811115611c6357600080fd5b611c6f8b828c01611954565b92509250509295985092959890939650565b60008060408385031215611c9457600080fd5b82356001600160401b03811115611caa57600080fd5b611cb685828601611844565b92505060208301356001600160401b03811115611cd257600080fd5b611a4f858286016118c3565b600060208284031215611cf057600080fd5b6000611705848461193e565b600060208284031215611d0e57600080fd5b60006117058484611949565b600060208284031215611d2c57600080fd5b81356001600160401b03811115611d4257600080fd5b6117058482850161199c565b60008060408385031215611d6157600080fd5b82356001600160401b03811115611d7757600080fd5b611d838582860161199c565b92505060208301356001600160401b03811115611d9f57600080fd5b611a4f8582860161199c565b600060208284031215611dbd57600080fd5b600061170584846119eb565b6000611dd5838361243b565b505060200190565b611de6816127bf565b82525050565b611de68161277e565b6000611e0082612771565b611e0a8185612775565b9350611e158361276b565b8060005b83811015611e43578151611e2d8882611dc9565b9750611e388361276b565b925050600101611e19565b509495945050505050565b611de681612789565b6000611e6282612771565b611e6c8185612775565b9350611e7c8185602086016127dc565b611e8581612808565b9093019392505050565b6000611e9c602b83612775565b7f4552433131353523736166655472616e7366657246726f6d3a20494e56414c4981526a1117d49150d2541251539560aa1b602082015260400192915050565b6000611ee9601f83612775565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500815260200192915050565b6000611f22602683612775565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000611f6a602a83612775565b7f4552433131353523736166655472616e7366657246726f6d3a20494e56414c49815269222fa7a822a920aa27a960b11b602082015260400192915050565b6000611fb6601783612775565b7f536166654d617468237375623a20554e444552464c4f57000000000000000000815260200192915050565b6000611fef603583612775565b7f45524331313535235f7361666542617463685472616e7366657246726f6d3a208152740929cac82989288be82a4a482b2a6be988a9c8ea89605b1b602082015260400192915050565b6000612046603083612775565b7f4d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766581526f20746865204d696e74657220726f6c6560801b602082015260400192915050565b6000612098602183612775565b7f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c8152606560f81b602082015260400192915050565b60006120db603083612775565b7f45524331313535237361666542617463685472616e7366657246726f6d3a204981526f13959053125117d49150d2541251539560821b602082015260400192915050565b600061212d601183612775565b70105b1c9958591e481a5b9a5d1a585d1959607a1b815260200192915050565b600061215a602083612775565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000612193602d83612775565b7f496e697469616c20737570706c792063616e6e6f74206265206d6f726520746881526c616e206d617820737570706c7960981b602082015260400192915050565b60006121e2602283612775565b7f526f6c65733a206163636f756e7420697320746865207a65726f206164647265815261737360f01b602082015260400192915050565b6000612226604083612775565b7f57686974656c69737441646d696e526f6c653a2063616c6c657220646f65732081527f6e6f742068617665207468652057686974656c69737441646d696e20726f6c65602082015260400192915050565b6000612285602c83612775565b7f455243313135352362616c616e63654f6642617463683a20494e56414c49445f81526b082a4a482b2be988a9c8ea8960a31b602082015260400192915050565b60006122d3602f83612775565b7f45524331313535237361666542617463685472616e7366657246726f6d3a204981526e272b20a624a22fa7a822a920aa27a960891b602082015260400192915050565b6000612324603f83612775565b7f45524331313535235f63616c6c6f6e455243313135354261746368526563656981527f7665643a20494e56414c49445f4f4e5f524543454956455f4d45535341474500602082015260400192915050565b6000612383603a83612775565b7f45524331313535235f63616c6c6f6e4552433131353552656365697665643a2081527f494e56414c49445f4f4e5f524543454956455f4d455353414745000000000000602082015260400192915050565b60006123e2601683612775565b75536166654d617468236164643a204f564552464c4f5760501b815260200192915050565b6000612414600f83612775565b6e125908185b1c9958591e481d5cd959608a1b815260200192915050565b611de68161279b565b611de681610a13565b611de6816127b3565b6020810161049f8284611dec565b60a081016124698288611ddd565b6124766020830187611dec565b81810360408301526124888186611df5565b9050818103606083015261249c8185611df5565b905081810360808301526124b08184611e57565b979650505050505050565b60a081016124c98288611ddd565b6124d66020830187611dec565b6124e3604083018661243b565b6124f0606083018561243b565b81810360808301526124b08184611e57565b602080825281016116ca8184611df5565b604080825281016125248185611df5565b905081810360208301526117058184611df5565b6020810161049f8284611e4e565b602080825281016116ca8184611e57565b6020808252810161049f81611e8f565b6020808252810161049f81611edc565b6020808252810161049f81611f15565b6020808252810161049f81611f5d565b6020808252810161049f81611fa9565b6020808252810161049f81611fe2565b6020808252810161049f81612039565b6020808252810161049f8161208b565b6020808252810161049f816120ce565b6020808252810161049f81612120565b6020808252810161049f8161214d565b6020808252810161049f81612186565b6020808252810161049f816121d5565b6020808252810161049f81612219565b6020808252810161049f81612278565b6020808252810161049f816122c6565b6020808252810161049f81612317565b6020808252810161049f81612376565b6020808252810161049f816123d5565b6020808252810161049f81612407565b608081016126a58287612432565b6126b26020830186612444565b6126bf6040830185612444565b6126cc6060830184611dec565b95945050505050565b6020810161049f828461243b565b604081016126f1828561243b565b6116ca602083018461243b565b6040518181016001600160401b038111828210171561271c57600080fd5b604052919050565b60006001600160401b0382111561273a57600080fd5b5060209081020190565b60006001600160401b0382111561275a57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b600061049f826127a7565b151590565b6001600160e01b03191690565b6001600160801b031690565b6001600160a01b031690565b6001600160401b031690565b600061049f82600061049f8261277e565b82818337506000910152565b60005b838110156127f75781810151838201526020016127df565b8381111561143b5750506000910152565b601f01601f191690565b61281b8161277e565b81146106d557600080fd5b61281b81612789565b61281b8161278e565b61281b81610a13565b61281b816127b356fe68747470733a2f2f6c616d626f2e68636f72652e66696e616e63652f73706f742d7468652d62616c6c2d77696e2f23686f6d65a365627a7a723158207488c021d92e735c6e57577f6c4c8ea4399834ce3253a0addaa1b39d284d44fd6c6578706572696d656e74616cf564736f6c634300050c0040

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f95760003560e01c8063869f75941161011a578063bb5f747b116100ad578063e933708b1161007c578063e933708b14610416578063e985e9c514610429578063eac989f81461043c578063f242432a14610444578063f2fde38b14610457576101f9565b8063bb5f747b146103d5578063bd85b039146103e8578063cabfaa18146103fb578063cd53d08e14610403576101f9565b8063983b2d56116100e9578063983b2d561461039457806398650275146103a7578063a22cb465146103af578063aa271e1a146103c2576101f9565b8063869f75941461035c5780638da5cb5b1461036f5780638f32d59b1461038457806395d89b411461038c576101f9565b80634c5a628c116101925780637029144c116101615780637029144c1461031b578063715018a61461032e5780637362d9c8146103365780637e518ec814610349576101f9565b80634c5a628c146102bd5780634e1273f4146102c557806353850db3146102e55780636897e97414610308576101f9565b80630e89341c116101ce5780630e89341c1461026f5780632693ebf2146102825780632eb2c2d6146102955780633092afd5146102aa576101f9565b80624221f0146101fe578062fdd58e1461022757806301ffc9a71461023a57806306fdde031461025a575b600080fd5b61021161020c366004611dab565b61046a565b60405161021e91906126d5565b60405180910390f35b610211610235366004611b9a565b61047c565b61024d610248366004611cde565b6104a5565b60405161021e9190612538565b6102626104ec565b60405161021e9190612546565b61026261027d366004611dab565b61057a565b610211610290366004611dab565b61060f565b6102a86102a3366004611a59565b610621565b005b6102a86102b8366004611a01565b6106a8565b6102a86106d8565b6102d86102d3366004611c81565b6106ea565b60405161021e9190612502565b6102f86102f3366004611dab565b6107cc565b60405161021e9493929190612697565b6102a8610316366004611a01565b610835565b6102a8610329366004611d4e565b610862565b6102a8610926565b6102a8610344366004611a01565b610994565b6102a8610357366004611d1a565b6109c4565b61021161036a366004611dab565b6109f4565b610377610a06565b60405161021e919061244d565b61024d610a16565b610262610a3c565b6102a86103a2366004611a01565b610a97565b6102a8610ac7565b6102a86103bd366004611b6a565b610ad7565b61024d6103d0366004611a01565b610b46565b61024d6103e3366004611a01565b610b59565b6102116103f6366004611dab565b610b6c565b610211610b7e565b610377610411366004611dab565b610b84565b610211610424366004611bca565b610b9f565b61024d610437366004611a1f565b610db2565b610262610de0565b6102a8610452366004611b13565b610e73565b6102a8610465366004611a01565b610eea565b60096020526000908152604090205481565b6001600160a01b0382166000908152602081815260408083208484529091529020545b92915050565b60006001600160e01b031982166301ffc9a760e01b14806104d657506001600160e01b03198216636cdb3d1360e11b145b156104e3575060016104e7565b5060005b919050565b600a805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105725780601f1061054757610100808354040283529160200191610572565b820191906000526020600020905b81548152906001019060200180831161055557829003601f168201915b505050505081565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156106035780601f106105d857610100808354040283529160200191610603565b820191906000526020600020905b8154815290600101906020018083116105e657829003601f168201915b50505050509050919050565b60086020526000908152604090205481565b336001600160a01b038616148061063d575061063d8533610db2565b6106625760405162461bcd60e51b815260040161065990612647565b60405180910390fd5b6001600160a01b0384166106885760405162461bcd60e51b8152600401610659906125d7565b61069485858585610f17565b6106a18585858585611121565b5050505050565b6106b0610a16565b6106cc5760405162461bcd60e51b8152600401610659906125f7565b6106d5816111fb565b50565b6106e86106e3611243565b611247565b565b6060815183511461070d5760405162461bcd60e51b815260040161065990612637565b6060835160405190808252806020026020018201604052801561073a578160200160208202803883390190505b50905060005b84518110156107c45760008086838151811061075857fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600085838151811061078e57fe5b60200260200101518152602001908152602001600020548282815181106107b157fe5b6020908102919091010152600101610740565b509392505050565b6000806000806000600686815481106107e157fe5b6000918252602090912060029091020180546001909101546001600160801b038216986001600160401b03600160801b840481169950600160c01b90930490921696506001600160a01b0316945092505050565b61083d610a16565b6108595760405162461bcd60e51b8152600401610659906125f7565b6106d581611247565b61086a610a16565b6108865760405162461bcd60e51b8152600401610659906125f7565b600a5460026000196101006001841615020190911604156108b95760405162461bcd60e51b8152600401610659906125e7565b81516108cc90600a9060208501906117a1565b5080516108e090600b9060208401906117a1565b506108f16108ec611243565b61128f565b6109016108fc611243565b6112d7565b61092260405180606001604052806033815260200161284b6033913961131f565b5050565b61092e610a16565b61094a5760405162461bcd60e51b8152600401610659906125f7565b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380546001600160a01b0319169055565b61099f6103e3611243565b6109bb5760405162461bcd60e51b815260040161065990612627565b6106d5816112d7565b6109cf6103e3611243565b6109eb5760405162461bcd60e51b815260040161065990612627565b6106d58161131f565b60009081526009602052604090205490565b6003546001600160a01b03165b90565b6003546000906001600160a01b0316610a2d611243565b6001600160a01b031614905090565b600b805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105725780601f1061054757610100808354040283529160200191610572565b610aa26103d0611243565b610abe5760405162461bcd60e51b8152600401610659906125b7565b6106d58161128f565b6106e8610ad2611243565b6111fb565b3360008181526001602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610b3a908590612538565b60405180910390a35050565b600061049f60048363ffffffff61133216565b600061049f60058363ffffffff61133216565b60009081526008602052604090205490565b60065490565b6007602052600090815260409020546001600160a01b031681565b6000610bac6103d0611243565b610bc85760405162461bcd60e51b8152600401610659906125b7565b610bd18661137a565b15610bee5760405162461bcd60e51b815260040161065990612687565b87871115610c0e5760405162461bcd60e51b815260040161065990612607565b600086815260076020526040902080546001600160a01b0319166001600160a01b038b161790558615610c7d57610c7d89878986868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061139792505050565b505050600083815260086020908152604080832096909655600981528582209690965584516080810186526001600160801b0380861682526001600160401b039485169782019788529284169581019586526001600160a01b039788166060820190815260068054600181018255935290517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f60029093029283018054985197516fffffffffffffffffffffffffffffffff19909916919094161767ffffffffffffffff60801b1916600160801b96851696909602959095176001600160c01b0316600160c01b969093169590950291909117905590517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090920180546001600160a01b031916929093169190911790915590565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b60028054604080516020601f6000196101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015610e695780601f10610e3e57610100808354040283529160200191610e69565b820191906000526020600020905b815481529060010190602001808311610e4c57829003601f168201915b5050505050905090565b336001600160a01b0386161480610e8f5750610e8f8533610db2565b610eab5760405162461bcd60e51b815260040161065990612587565b6001600160a01b038416610ed15760405162461bcd60e51b815260040161065990612557565b610edd85858585611441565b6106a18585858585611529565b610ef2610a16565b610f0e5760405162461bcd60e51b8152600401610659906125f7565b6106d5816115fb565b8051825114610f385760405162461bcd60e51b8152600401610659906125a7565b815160005b818110156110c257610fb3838281518110610f5457fe5b6020026020010151600080896001600160a01b03166001600160a01b031681526020019081526020016000206000878581518110610f8e57fe5b602002602001015181526020019081526020016000205461167d90919063ffffffff16565b600080886001600160a01b03166001600160a01b031681526020019081526020016000206000868481518110610fe557fe5b602002602001015181526020019081526020016000208190555061106d83828151811061100e57fe5b6020026020010151600080886001600160a01b03166001600160a01b03168152602001908152602001600020600087858151811061104857fe5b60200260200101518152602001908152602001600020546116a590919063ffffffff16565b600080876001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061109f57fe5b602090810291909101810151825281019190915260400160002055600101610f3d565b50836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611112929190612513565b60405180910390a45050505050565b611133846001600160a01b03166116d1565b156106a15760405163bc197c8160e01b81526000906001600160a01b0386169063bc197c819061116f9033908a9089908990899060040161245b565b602060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111c19190810190611cfc565b90506001600160e01b0319811663bc197c8160e01b146111f35760405162461bcd60e51b815260040161065990612657565b505050505050565b61120c60048263ffffffff61170d16565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b3390565b61125860058263ffffffff61170d16565b6040516001600160a01b038216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b6112a060048263ffffffff61175516565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6112e860058263ffffffff61175516565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b80516109229060029060208401906117a1565b60006001600160a01b03821661135a5760405162461bcd60e51b815260040161065990612617565b506001600160a01b03166000908152602091909152604090205460ff1690565b6000908152600760205260409020546001600160a01b0316151590565b6001600160a01b0384166000908152602081815260408083208684529091529020546113c9908363ffffffff6116a516565b6001600160a01b03851660008181526020818152604080832088845290915280822093909355915190919033907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629061142590889088906126e3565b60405180910390a461143b600085858585611529565b50505050565b6001600160a01b038416600090815260208181526040808320858452909152902054611473908263ffffffff61167d16565b6001600160a01b03808616600090815260208181526040808320878452825280832094909455918616815280825282812085825290915220546114bc908263ffffffff6116a516565b6001600160a01b03808516600081815260208181526040808320888452909152908190209390935591519086169033907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629061151b90879087906126e3565b60405180910390a450505050565b61153b846001600160a01b03166116d1565b156106a15760405163f23a6e6160e01b81526000906001600160a01b0386169063f23a6e61906115779033908a908990899089906004016124bb565b602060405180830381600087803b15801561159157600080fd5b505af11580156115a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115c99190810190611cfc565b90506001600160e01b0319811663f23a6e6160e01b146111f35760405162461bcd60e51b815260040161065990612667565b6001600160a01b0381166116215760405162461bcd60e51b815260040161065990612577565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b60008282111561169f5760405162461bcd60e51b815260040161065990612597565b50900390565b6000828201838110156116ca5760405162461bcd60e51b815260040161065990612677565b9392505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906117055750808214155b949350505050565b6117178282611332565b6117335760405162461bcd60e51b8152600401610659906125c7565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b61175f8282611332565b1561177c5760405162461bcd60e51b815260040161065990612567565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106117e257805160ff191683800117855561180f565b8280016001018555821561180f579182015b8281111561180f5782518255916020019190600101906117f4565b5061181b92915061181f565b5090565b610a1391905b8082111561181b5760008155600101611825565b803561049f81612812565b600082601f83011261185557600080fd5b813561186861186382612724565b6126fe565b9150818183526020840193506020810190508385602084028201111561188d57600080fd5b60005b838110156118b957816118a38882611839565b8452506020928301929190910190600101611890565b5050505092915050565b600082601f8301126118d457600080fd5b81356118e261186382612724565b9150818183526020840193506020810190508385602084028201111561190757600080fd5b60005b838110156118b9578161191d88826119eb565b845250602092830192919091019060010161190a565b803561049f81612826565b803561049f8161282f565b805161049f8161282f565b60008083601f84011261196657600080fd5b5081356001600160401b0381111561197d57600080fd5b60208301915083600182028301111561199557600080fd5b9250929050565b600082601f8301126119ad57600080fd5b81356119bb61186382612744565b915080825260208301602083018583830111156119d757600080fd5b6119e28382846127d0565b50505092915050565b803561049f81612838565b803561049f81612841565b600060208284031215611a1357600080fd5b60006117058484611839565b60008060408385031215611a3257600080fd5b6000611a3e8585611839565b9250506020611a4f85828601611839565b9150509250929050565b600080600080600060a08688031215611a7157600080fd5b6000611a7d8888611839565b9550506020611a8e88828901611839565b94505060408601356001600160401b03811115611aaa57600080fd5b611ab6888289016118c3565b93505060608601356001600160401b03811115611ad257600080fd5b611ade888289016118c3565b92505060808601356001600160401b03811115611afa57600080fd5b611b068882890161199c565b9150509295509295909350565b600080600080600060a08688031215611b2b57600080fd5b6000611b378888611839565b9550506020611b4888828901611839565b9450506040611b59888289016119eb565b9350506060611ade888289016119eb565b60008060408385031215611b7d57600080fd5b6000611b898585611839565b9250506020611a4f85828601611933565b60008060408385031215611bad57600080fd5b6000611bb98585611839565b9250506020611a4f858286016119eb565b60008060008060008060008060e0898b031215611be657600080fd5b6000611bf28b8b611839565b9850506020611c038b828c016119eb565b9750506040611c148b828c016119eb565b9650506060611c258b828c016119eb565b9550506080611c368b828c016119f6565b94505060a0611c478b828c016119f6565b93505060c08901356001600160401b03811115611c6357600080fd5b611c6f8b828c01611954565b92509250509295985092959890939650565b60008060408385031215611c9457600080fd5b82356001600160401b03811115611caa57600080fd5b611cb685828601611844565b92505060208301356001600160401b03811115611cd257600080fd5b611a4f858286016118c3565b600060208284031215611cf057600080fd5b6000611705848461193e565b600060208284031215611d0e57600080fd5b60006117058484611949565b600060208284031215611d2c57600080fd5b81356001600160401b03811115611d4257600080fd5b6117058482850161199c565b60008060408385031215611d6157600080fd5b82356001600160401b03811115611d7757600080fd5b611d838582860161199c565b92505060208301356001600160401b03811115611d9f57600080fd5b611a4f8582860161199c565b600060208284031215611dbd57600080fd5b600061170584846119eb565b6000611dd5838361243b565b505060200190565b611de6816127bf565b82525050565b611de68161277e565b6000611e0082612771565b611e0a8185612775565b9350611e158361276b565b8060005b83811015611e43578151611e2d8882611dc9565b9750611e388361276b565b925050600101611e19565b509495945050505050565b611de681612789565b6000611e6282612771565b611e6c8185612775565b9350611e7c8185602086016127dc565b611e8581612808565b9093019392505050565b6000611e9c602b83612775565b7f4552433131353523736166655472616e7366657246726f6d3a20494e56414c4981526a1117d49150d2541251539560aa1b602082015260400192915050565b6000611ee9601f83612775565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500815260200192915050565b6000611f22602683612775565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000611f6a602a83612775565b7f4552433131353523736166655472616e7366657246726f6d3a20494e56414c49815269222fa7a822a920aa27a960b11b602082015260400192915050565b6000611fb6601783612775565b7f536166654d617468237375623a20554e444552464c4f57000000000000000000815260200192915050565b6000611fef603583612775565b7f45524331313535235f7361666542617463685472616e7366657246726f6d3a208152740929cac82989288be82a4a482b2a6be988a9c8ea89605b1b602082015260400192915050565b6000612046603083612775565b7f4d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766581526f20746865204d696e74657220726f6c6560801b602082015260400192915050565b6000612098602183612775565b7f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c8152606560f81b602082015260400192915050565b60006120db603083612775565b7f45524331313535237361666542617463685472616e7366657246726f6d3a204981526f13959053125117d49150d2541251539560821b602082015260400192915050565b600061212d601183612775565b70105b1c9958591e481a5b9a5d1a585d1959607a1b815260200192915050565b600061215a602083612775565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000612193602d83612775565b7f496e697469616c20737570706c792063616e6e6f74206265206d6f726520746881526c616e206d617820737570706c7960981b602082015260400192915050565b60006121e2602283612775565b7f526f6c65733a206163636f756e7420697320746865207a65726f206164647265815261737360f01b602082015260400192915050565b6000612226604083612775565b7f57686974656c69737441646d696e526f6c653a2063616c6c657220646f65732081527f6e6f742068617665207468652057686974656c69737441646d696e20726f6c65602082015260400192915050565b6000612285602c83612775565b7f455243313135352362616c616e63654f6642617463683a20494e56414c49445f81526b082a4a482b2be988a9c8ea8960a31b602082015260400192915050565b60006122d3602f83612775565b7f45524331313535237361666542617463685472616e7366657246726f6d3a204981526e272b20a624a22fa7a822a920aa27a960891b602082015260400192915050565b6000612324603f83612775565b7f45524331313535235f63616c6c6f6e455243313135354261746368526563656981527f7665643a20494e56414c49445f4f4e5f524543454956455f4d45535341474500602082015260400192915050565b6000612383603a83612775565b7f45524331313535235f63616c6c6f6e4552433131353552656365697665643a2081527f494e56414c49445f4f4e5f524543454956455f4d455353414745000000000000602082015260400192915050565b60006123e2601683612775565b75536166654d617468236164643a204f564552464c4f5760501b815260200192915050565b6000612414600f83612775565b6e125908185b1c9958591e481d5cd959608a1b815260200192915050565b611de68161279b565b611de681610a13565b611de6816127b3565b6020810161049f8284611dec565b60a081016124698288611ddd565b6124766020830187611dec565b81810360408301526124888186611df5565b9050818103606083015261249c8185611df5565b905081810360808301526124b08184611e57565b979650505050505050565b60a081016124c98288611ddd565b6124d66020830187611dec565b6124e3604083018661243b565b6124f0606083018561243b565b81810360808301526124b08184611e57565b602080825281016116ca8184611df5565b604080825281016125248185611df5565b905081810360208301526117058184611df5565b6020810161049f8284611e4e565b602080825281016116ca8184611e57565b6020808252810161049f81611e8f565b6020808252810161049f81611edc565b6020808252810161049f81611f15565b6020808252810161049f81611f5d565b6020808252810161049f81611fa9565b6020808252810161049f81611fe2565b6020808252810161049f81612039565b6020808252810161049f8161208b565b6020808252810161049f816120ce565b6020808252810161049f81612120565b6020808252810161049f8161214d565b6020808252810161049f81612186565b6020808252810161049f816121d5565b6020808252810161049f81612219565b6020808252810161049f81612278565b6020808252810161049f816122c6565b6020808252810161049f81612317565b6020808252810161049f81612376565b6020808252810161049f816123d5565b6020808252810161049f81612407565b608081016126a58287612432565b6126b26020830186612444565b6126bf6040830185612444565b6126cc6060830184611dec565b95945050505050565b6020810161049f828461243b565b604081016126f1828561243b565b6116ca602083018461243b565b6040518181016001600160401b038111828210171561271c57600080fd5b604052919050565b60006001600160401b0382111561273a57600080fd5b5060209081020190565b60006001600160401b0382111561275a57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b600061049f826127a7565b151590565b6001600160e01b03191690565b6001600160801b031690565b6001600160a01b031690565b6001600160401b031690565b600061049f82600061049f8261277e565b82818337506000910152565b60005b838110156127f75781810151838201526020016127df565b8381111561143b5750506000910152565b601f01601f191690565b61281b8161277e565b81146106d557600080fd5b61281b81612789565b61281b8161278e565b61281b81610a13565b61281b816127b356fe68747470733a2f2f6c616d626f2e68636f72652e66696e616e63652f73706f742d7468652d62616c6c2d77696e2f23686f6d65a365627a7a723158207488c021d92e735c6e57577f6c4c8ea4399834ce3253a0addaa1b39d284d44fd6c6578706572696d656e74616cf564736f6c634300050c0040

Deployed Bytecode Sourcemap

90:223:6:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;90:223:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;957:49:5;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;7263:123:2;;;;;;;;;:::i;9184:234::-;;;;;;;;;:::i;:::-;;;;;;;;1033:18:5;;;:::i;:::-;;;;;;;;220:91:6;;;;;;;;;:::i;905:46:5:-;;;;;;;;;:::i;2567:502:2:-;;;;;;;;;:::i;:::-;;1586:95:5;;;;;;;;;:::i;853:93:18:-;;;:::i;7666:486:2:-;;;;;;;;;:::i;:::-;;;;;;;;3658:253:5;;;;;;;;;:::i;:::-;;;;;;;;;;;1469:111;;;;;;;;;:::i;1107:356::-;;;;;;;;;:::i;1679:137:13:-;;;:::i;733:114:18:-;;;;;;;;;:::i;2366:146:5:-;;;;;;;;;:::i;2125:105::-;;;;;;;;;:::i;894:77:13:-;;;:::i;:::-;;;;;;;;1245:92;;;:::i;1080:20:5:-;;;:::i;527:90:12:-;;;;;;;;;:::i;623:77::-;;;:::i;6300:221:2:-;;;;;;;;;:::i;414:107:12:-;;;;;;;;;:::i;604:123:18:-;;;;;;;;;:::i;1852:104:5:-;;;;;;;;;:::i;3549:103::-;;;:::i;856:43::-;;;;;;;;;:::i;2863:680::-;;;;;;;;;:::i;6772:151:2:-;;;;;;;;;:::i;132:84:6:-;;;:::i;1648:536:2:-;;;;;;;;;:::i;1965:107:13:-;;;;;;;;;:::i;957:49:5:-;;;;;;;;;;;;;:::o;7263:123:2:-;-1:-1:-1;;;;;7360:16:2;;7336:7;7360:16;;;;;;;;;;;:21;;;;;;;;;7263:123;;;;;:::o;9184:234::-;9255:4;-1:-1:-1;;;;;;9271:42:2;;-1:-1:-1;;;9271:42:2;;:97;;-1:-1:-1;;;;;;;9325:43:2;;-1:-1:-1;;;9325:43:2;9271:97;9267:129;;;-1:-1:-1;9385:4:2;9378:11;;9267:129;-1:-1:-1;9408:5:2;9184:234;;;;:::o;1033:18:5:-;;;;;;;;;;;;;;;-1:-1:-1;;1033:18:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;220:91:6:-;291:15;284:22;;;;;;;-1:-1:-1;;284:22:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;263:13;;284:22;;291:15;;284:22;;291:15;284:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;220:91;;;:::o;905:46:5:-;;;;;;;;;;;;;:::o;2567:502:2:-;2744:10;-1:-1:-1;;;;;2744:19:2;;;;2743:60;;;2768:35;2785:5;2792:10;2768:16;:35::i;:::-;2735:120;;;;-1:-1:-1;;;2735:120:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2869:17:2;;2861:78;;;;-1:-1:-1;;;2861:78:2;;;;;;;;;2946:50;2969:5;2976:3;2981:4;2987:8;2946:22;:50::i;:::-;3002:62;3030:5;3037:3;3042:4;3048:8;3058:5;3002:27;:62::i;:::-;2567:502;;;;;:::o;1586:95:5:-;1098:9:13;:7;:9::i;:::-;1090:54;;;;-1:-1:-1;;;1090:54:13;;;;;;;;;1652:22:5;1666:7;1652:13;:22::i;:::-;1586:95;:::o;853:93:18:-;904:35;926:12;:10;:12::i;:::-;904:21;:35::i;:::-;853:93::o;7666:486:2:-;7764:16;7816:4;:11;7798:7;:14;:29;7790:86;;;;-1:-1:-1;;;7790:86:2;;;;;;;;;7900:30;7947:7;:14;7933:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;7933:29:2;-1:-1:-1;7900:62:2;-1:-1:-1;8018:9:2;8013:108;8037:7;:14;8033:1;:18;8013:108;;;8085:8;:20;8094:7;8102:1;8094:10;;;;;;;;;;;;;;-1:-1:-1;;;;;8085:20:2;-1:-1:-1;;;;;8085:20:2;;;;;;;;;;;;:29;8106:4;8111:1;8106:7;;;;;;;;;;;;;;8085:29;;;;;;;;;;;;8066:13;8080:1;8066:16;;;;;;;;;;;;;;;;;:48;8053:3;;8013:108;;;-1:-1:-1;8134:13:2;7666:486;-1:-1:-1;;;7666:486:2:o;3658:253:5:-;3717:7;3726:6;3734;3742:7;3761:31;3795:13;3809:3;3795:18;;;;;;;;;;;;;;;;;;;;;3831:17;;;3880:23;;;;-1:-1:-1;;;;;3831:17:5;;;-1:-1:-1;;;;;;;;3850:13:5;;;;;-1:-1:-1;;;;3865:13:5;;;;;;;-1:-1:-1;;;;;;3880:23:5;;-1:-1:-1;3831:17:5;-1:-1:-1;;;3658:253:5:o;1469:111::-;1098:9:13;:7;:9::i;:::-;1090:54;;;;-1:-1:-1;;;1090:54:13;;;;;;;;;1543:30:5;1565:7;1543:21;:30::i;1107:356::-;1098:9:13;:7;:9::i;:::-;1090:54;;;;-1:-1:-1;;;1090:54:13;;;;;;;;;1207:4:5;1200:20;;-1:-1:-1;;1200:20:5;;;;;;;;;;;:25;1192:55;;;;-1:-1:-1;;;1192:55:5;;;;;;;;;1258:12;;;;:4;;:12;;;;;:::i;:::-;-1:-1:-1;1280:16:5;;;;:6;;:16;;;;;:::i;:::-;;1306:24;1317:12;:10;:12::i;:::-;1306:10;:24::i;:::-;1340:32;1359:12;:10;:12::i;:::-;1340:18;:32::i;:::-;1382:74;;;;;;;;;;;;;;;;;;:19;:74::i;:::-;1107:356;;:::o;1679:137:13:-;1098:9;:7;:9::i;:::-;1090:54;;;;-1:-1:-1;;;1090:54:13;;;;;;;;;1761:6;;1740:40;;1777:1;;-1:-1:-1;;;;;1761:6:13;;1740:40;;1777:1;;1740:40;1790:6;:19;;-1:-1:-1;;;;;;1790:19:13;;;1679:137::o;733:114:18:-;481:30;498:12;:10;:12::i;481:30::-;473:107;;;;-1:-1:-1;;;473:107:18;;;;;;;;;813:27;832:7;813:18;:27::i;2366:146:5:-;481:30:18;498:12;:10;:12::i;481:30::-;473:107;;;;-1:-1:-1;;;473:107:18;;;;;;;;;2465:40:5;2485:19;2465;:40::i;2125:105::-;2178:7;2204:19;;;:14;:19;;;;;;;2125:105::o;894:77:13:-;958:6;;-1:-1:-1;;;;;958:6:13;894:77;;:::o;1245:92::-;1324:6;;1285:4;;-1:-1:-1;;;;;1324:6:13;1308:12;:10;:12::i;:::-;-1:-1:-1;;;;;1308:22:13;;1301:29;;1245:92;:::o;1080:20:5:-;;;;;;;;;;;;;;;-1:-1:-1;;1080:20:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;527:90:12;315:22;324:12;:10;:12::i;315:22::-;307:83;;;;-1:-1:-1;;;307:83:12;;;;;;;;;591:19;602:7;591:10;:19::i;623:77::-;666:27;680:12;:10;:12::i;:::-;666:13;:27::i;6300:221:2:-;6423:10;6413:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;6413:32:2;;;;;;;;;;;:44;;-1:-1:-1;;6413:44:2;;;;;;;6468:48;;6413:32;;6423:10;6468:48;;;;6413:44;;6468:48;;;;;;;;;;6300:221;;:::o;414:107:12:-;470:4;493:21;:8;506:7;493:21;:12;:21;:::i;604:123:18:-;668:4;691:29;:16;712:7;691:29;:20;:29;:::i;1852:104:5:-;1907:7;1933:16;;;:11;:16;;;;;;;1852:104::o;3549:103::-;3625:13;:20;3549:103;:::o;856:43::-;;;;;;;;;;;;-1:-1:-1;;;;;856:43:5;;:::o;2863:680::-;3089:7;315:22:12;324:12;:10;:12::i;315:22::-;307:83;;;;-1:-1:-1;;;307:83:12;;;;;;;;;3117:12:5;3125:3;3117:7;:12::i;:::-;3116:13;3108:41;;;;-1:-1:-1;;;3108:41:5;;;;;;;;;3185:10;3167:14;:28;;3159:86;;;;-1:-1:-1;;;3159:86:5;;;;;;;;;3255:13;;;;:8;:13;;;;;:24;;-1:-1:-1;;;;;;3255:24:5;-1:-1:-1;;;;;3255:24:5;;;;;3294:19;;3290:68;;3315:43;3321:8;3331:3;3336:14;3352:5;;3315:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;3315:5:5;;-1:-1:-1;;;3315:43:5:i;:::-;-1:-1:-1;;;3368:16:5;;;;:11;:16;;;;;;;;:33;;;;3411:14;:19;;;;;:32;;;;3472:43;;;;;;;-1:-1:-1;;;;;3472:43:5;;;;;-1:-1:-1;;;;;3472:43:5;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3472:43:5;;;;;;;;;3453:13;27:10:-1;;39:1;23:18;;45:23;;3453:63:5;;;;;;;;;;;;;;;;;;-1:-1:-1;;3453:63:5;;;;;;;;-1:-1:-1;;;;3453:63:5;-1:-1:-1;;;3453:63:5;;;;;;;;;;;-1:-1:-1;;;;;3453:63:5;-1:-1:-1;;;3453:63:5;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3453:63:5;;;;;;;;;;;;3368:16;2863:680::o;6772:151:2:-;-1:-1:-1;;;;;6890:17:2;;;6858:15;6890:17;;;:9;:17;;;;;;;;:28;;;;;;;;;;;;;;;6772:151::o;132:84:6:-;196:15;189:22;;;;;;;-1:-1:-1;;189:22:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;168:13;;189:22;;196:15;;189:22;;196:15;189:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;132:84;:::o;1648:536:2:-;1780:10;-1:-1:-1;;;;;1780:19:2;;;;1779:60;;;1804:35;1821:5;1828:10;1804:16;:35::i;:::-;1771:115;;;;-1:-1:-1;;;1771:115:2;;;;;;;;;-1:-1:-1;;;;;1900:17:2;;1892:72;;;;-1:-1:-1;;;1892:72:2;;;;;;;;;2075:43;2093:5;2100:3;2105;2110:7;2075:17;:43::i;:::-;2124:55;2147:5;2154:3;2159;2164:7;2173:5;2124:22;:55::i;1965:107:13:-;1098:9;:7;:9::i;:::-;1090:54;;;;-1:-1:-1;;;1090:54:13;;;;;;;;;2037:28;2056:8;2037:18;:28::i;4652:670:2:-;4806:8;:15;4791:4;:11;:30;4783:96;;;;-1:-1:-1;;;4783:96:2;;;;;;;;;4943:11;;4923:17;4992:243;5016:9;5012:1;:13;4992:243;;;5115:41;5144:8;5153:1;5144:11;;;;;;;;;;;;;;5115:8;:15;5124:5;-1:-1:-1;;;;;5115:15:2;-1:-1:-1;;;;;5115:15:2;;;;;;;;;;;;:24;5131:4;5136:1;5131:7;;;;;;;;;;;;;;5115:24;;;;;;;;;;;;:28;;:41;;;;:::i;:::-;5088:8;:15;5097:5;-1:-1:-1;;;;;5088:15:2;-1:-1:-1;;;;;5088:15:2;;;;;;;;;;;;:24;5104:4;5109:1;5104:7;;;;;;;;;;;;;;5088:24;;;;;;;;;;;:68;;;;5189:39;5216:8;5225:1;5216:11;;;;;;;;;;;;;;5189:8;:13;5198:3;-1:-1:-1;;;;;5189:13:2;-1:-1:-1;;;;;5189:13:2;;;;;;;;;;;;:22;5203:4;5208:1;5203:7;;;;;;;;;;;;;;5189:22;;;;;;;;;;;;:26;;:39;;;;:::i;:::-;5164:8;:13;5173:3;-1:-1:-1;;;;;5164:13:2;-1:-1:-1;;;;;5164:13:2;;;;;;;;;;;;:22;5178:4;5183:1;5178:7;;;;;;;;;;;;;;;;;;;5164:22;;;;;;;;;;-1:-1:-1;5164:22:2;:64;5027:3;;4992:243;;;;5297:3;-1:-1:-1;;;;;5264:53:2;5290:5;-1:-1:-1;;;;;5264:53:2;5278:10;-1:-1:-1;;;;;5264:53:2;;5302:4;5308:8;5264:53;;;;;;;;;;;;;;;;4652:670;;;;;:::o;5435:468::-;5637:16;:3;-1:-1:-1;;;;;5637:14:2;;:16::i;:::-;5633:266;;;5679:91;;-1:-1:-1;;;5679:91:2;;5663:13;;-1:-1:-1;;;;;5679:49:2;;;;;:91;;5729:10;;5741:5;;5748:4;;5754:8;;5764:5;;5679:91;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5679:91:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5679:91:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5679:91:2;;;;;;;;;5663:107;-1:-1:-1;;;;;;;5786:38:2;;-1:-1:-1;;;5786:38:2;5778:114;;;;-1:-1:-1;;;5778:114:2;;;;;;;;;5633:266;5435:468;;;;;:::o;831:127:12:-;890:24;:8;906:7;890:24;:15;:24;:::i;:::-;929:22;;-1:-1:-1;;;;;929:22:12;;;;;;;;831:127;:::o;788:96:1:-;867:10;788:96;:::o;1101:151:18:-;1168:32;:16;1192:7;1168:32;:23;:32;:::i;:::-;1215:30;;-1:-1:-1;;;;;1215:30:18;;;;;;;;1101:151;:::o;706:119:12:-;762:21;:8;775:7;762:21;:12;:21;:::i;:::-;798:20;;-1:-1:-1;;;;;798:20:12;;;;;;;;706:119;:::o;952:143:18:-;1016:29;:16;1037:7;1016:29;:20;:29;:::i;:::-;1060:28;;-1:-1:-1;;;;;1060:28:18;;;;;;;;952:143;:::o;2186:121:3:-;2265:37;;;;:15;;:37;;;;;:::i;779:200:15:-;851:4;-1:-1:-1;;;;;875:21:15;;867:68;;;;-1:-1:-1;;;867:68:15;;;;;;;;;-1:-1:-1;;;;;;952:20:15;:11;:20;;;;;;;;;;;;;;;779:200::o;4140:110:5:-;4193:4;4216:13;;;:8;:13;;;;;;-1:-1:-1;;;;;4216:13:5;:27;;;4140:110::o;651:390:4:-;-1:-1:-1;;;;;790:13:4;;:8;:13;;;;;;;;;;;:18;;;;;;;;;:31;;813:7;790:31;:22;:31;:::i;:::-;-1:-1:-1;;;;;769:13:4;;:8;:13;;;;;;;;;;;:18;;;;;;;;;:52;;;;851:59;;769:13;;:8;866:10;;851:59;;;;783:3;;902:7;;851:59;;;;;;;;;;974:62;1005:3;1011;1016;1021:7;1030:5;974:22;:62::i;:::-;651:390;;;;:::o;3459:367:2:-;-1:-1:-1;;;;;3611:15:2;;:8;:15;;;;;;;;;;;:20;;;;;;;;;:33;;3636:7;3611:33;:24;:33;:::i;:::-;-1:-1:-1;;;;;3588:15:2;;;:8;:15;;;;;;;;;;;:20;;;;;;;;:56;;;;3690:13;;;;;;;;;;;:18;;;;;;;;:31;;3713:7;3690:31;:22;:31;:::i;:::-;-1:-1:-1;;;;;3669:13:2;;;:8;:13;;;;;;;;;;;:18;;;;;;;;;;:52;;;;3769;;;;;;3784:10;;3769:52;;;;3683:3;;3813:7;;3769:52;;;;;;;;;;3459:367;;;;:::o;3934:421::-;4107:16;:3;-1:-1:-1;;;;;4107:14:2;;:16::i;:::-;4103:248;;;4149:84;;-1:-1:-1;;;4149:84:2;;4133:13;;-1:-1:-1;;;;;4149:44:2;;;;;:84;;4194:10;;4206:5;;4213:3;;4218:7;;4227:5;;4149:84;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4149:84:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4149:84:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4149:84:2;;;;;;;;;4133:100;-1:-1:-1;;;;;;;4249:32:2;;-1:-1:-1;;;4249:32:2;4241:103;;;;-1:-1:-1;;;4241:103:2;;;;;;;;2173:225:13;-1:-1:-1;;;;;2246:22:13;;2238:73;;;;-1:-1:-1;;;2238:73:13;;;;;;;;;2347:6;;2326:38;;-1:-1:-1;;;;;2326:38:13;;;;2347:6;;2326:38;;2347:6;;2326:38;2374:6;:17;;-1:-1:-1;;;;;;2374:17:13;-1:-1:-1;;;;;2374:17:13;;;;;;;;;;2173:225::o;1186:158:16:-;1244:7;1272:1;1267;:6;;1259:42;;;;-1:-1:-1;;;1259:42:16;;;;;;;;;-1:-1:-1;1319:5:16;;;1186:158::o;1419:::-;1477:7;1504:5;;;1523:6;;;;1515:41;;;;-1:-1:-1;;;1515:41:16;;;;;;;;;1570:1;1419:158;-1:-1:-1;;;1419:158:16:o;1034:661:0:-;1094:4;1612:20;;1150:66;1647:15;;;;;:42;;;1678:11;1666:8;:23;;1647:42;1639:51;1034:661;-1:-1:-1;;;;1034:661:0:o;510:180:15:-;589:18;593:4;599:7;589:3;:18::i;:::-;581:64;;;;-1:-1:-1;;;581:64:15;;;;;;;;;-1:-1:-1;;;;;655:20:15;678:5;655:20;;;;;;;;;;;:28;;-1:-1:-1;;655:28:15;;;510:180::o;260:175::-;337:18;341:4;347:7;337:3;:18::i;:::-;336:19;328:63;;;;-1:-1:-1;;;328:63:15;;;;;;;;;-1:-1:-1;;;;;401:20:15;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;401:27:15;424:4;401:27;;;260:175::o;90:223:6:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;90:223:6;;;-1:-1:-1;90:223:6;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;5:130:-1;72:20;;97:33;72:20;97:33;;160:707;;277:3;270:4;262:6;258:17;254:27;244:2;;295:1;292;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;;;354:80;;;345:89;;451:5;476:6;469:5;462:21;506:4;498:6;494:17;484:27;;528:4;523:3;519:14;512:21;;581:6;628:3;620:4;612:6;608:17;603:3;599:27;596:36;593:2;;;645:1;642;635:12;593:2;670:1;655:206;680:6;677:1;674:13;655:206;;;738:3;760:37;793:3;781:10;760:37;;;748:50;;-1:-1;821:4;812:14;;;;840;;;;;702:1;695:9;655:206;;;659:14;237:630;;;;;;;;893:707;;1010:3;1003:4;995:6;991:17;987:27;977:2;;1028:1;1025;1018:12;977:2;1065:6;1052:20;1087:80;1102:64;1159:6;1102:64;;1087:80;1078:89;;1184:5;1209:6;1202:5;1195:21;1239:4;1231:6;1227:17;1217:27;;1261:4;1256:3;1252:14;1245:21;;1314:6;1361:3;1353:4;1345:6;1341:17;1336:3;1332:27;1329:36;1326:2;;;1378:1;1375;1368:12;1326:2;1403:1;1388:206;1413:6;1410:1;1407:13;1388:206;;;1471:3;1493:37;1526:3;1514:10;1493:37;;;1481:50;;-1:-1;1554:4;1545:14;;;;1573;;;;;1435:1;1428:9;1388:206;;1608:124;1672:20;;1697:30;1672:20;1697:30;;1739:128;1805:20;;1830:32;1805:20;1830:32;;1874:132;1951:13;;1969:32;1951:13;1969:32;;2027:335;;;2141:3;2134:4;2126:6;2122:17;2118:27;2108:2;;2159:1;2156;2149:12;2108:2;-1:-1;2179:20;;-1:-1;;;;;2208:30;;2205:2;;;2251:1;2248;2241:12;2205:2;2285:4;2277:6;2273:17;2261:29;;2335:3;2328;2320:6;2316:16;2306:8;2302:31;2299:40;2296:2;;;2352:1;2349;2342:12;2296:2;2101:261;;;;;;2371:440;;2472:3;2465:4;2457:6;2453:17;2449:27;2439:2;;2490:1;2487;2480:12;2439:2;2527:6;2514:20;2549:64;2564:48;2605:6;2564:48;;2549:64;2540:73;;2633:6;2626:5;2619:21;2669:4;2661:6;2657:17;2702:4;2695:5;2691:16;2737:3;2728:6;2723:3;2719:16;2716:25;2713:2;;;2754:1;2751;2744:12;2713:2;2764:41;2798:6;2793:3;2788;2764:41;;;2432:379;;;;;;;;3270:130;3337:20;;3362:33;3337:20;3362:33;;3407:128;3473:20;;3498:32;3473:20;3498:32;;3542:241;;3646:2;3634:9;3625:7;3621:23;3617:32;3614:2;;;3662:1;3659;3652:12;3614:2;3697:1;3714:53;3759:7;3739:9;3714:53;;3790:366;;;3911:2;3899:9;3890:7;3886:23;3882:32;3879:2;;;3927:1;3924;3917:12;3879:2;3962:1;3979:53;4024:7;4004:9;3979:53;;;3969:63;;3941:97;4069:2;4087:53;4132:7;4123:6;4112:9;4108:22;4087:53;;;4077:63;;4048:98;3873:283;;;;;;4163:1119;;;;;;4394:3;4382:9;4373:7;4369:23;4365:33;4362:2;;;4411:1;4408;4401:12;4362:2;4446:1;4463:53;4508:7;4488:9;4463:53;;;4453:63;;4425:97;4553:2;4571:53;4616:7;4607:6;4596:9;4592:22;4571:53;;;4561:63;;4532:98;4689:2;4678:9;4674:18;4661:32;-1:-1;;;;;4705:6;4702:30;4699:2;;;4745:1;4742;4735:12;4699:2;4765:78;4835:7;4826:6;4815:9;4811:22;4765:78;;;4755:88;;4640:209;4908:2;4897:9;4893:18;4880:32;-1:-1;;;;;4924:6;4921:30;4918:2;;;4964:1;4961;4954:12;4918:2;4984:78;5054:7;5045:6;5034:9;5030:22;4984:78;;;4974:88;;4859:209;5127:3;5116:9;5112:19;5099:33;-1:-1;;;;;5144:6;5141:30;5138:2;;;5184:1;5181;5174:12;5138:2;5204:62;5258:7;5249:6;5238:9;5234:22;5204:62;;;5194:72;;5078:194;4356:926;;;;;;;;;5289:847;;;;;;5470:3;5458:9;5449:7;5445:23;5441:33;5438:2;;;5487:1;5484;5477:12;5438:2;5522:1;5539:53;5584:7;5564:9;5539:53;;;5529:63;;5501:97;5629:2;5647:53;5692:7;5683:6;5672:9;5668:22;5647:53;;;5637:63;;5608:98;5737:2;5755:53;5800:7;5791:6;5780:9;5776:22;5755:53;;;5745:63;;5716:98;5845:2;5863:53;5908:7;5899:6;5888:9;5884:22;5863:53;;6143:360;;;6261:2;6249:9;6240:7;6236:23;6232:32;6229:2;;;6277:1;6274;6267:12;6229:2;6312:1;6329:53;6374:7;6354:9;6329:53;;;6319:63;;6291:97;6419:2;6437:50;6479:7;6470:6;6459:9;6455:22;6437:50;;6510:366;;;6631:2;6619:9;6610:7;6606:23;6602:32;6599:2;;;6647:1;6644;6637:12;6599:2;6682:1;6699:53;6744:7;6724:9;6699:53;;;6689:63;;6661:97;6789:2;6807:53;6852:7;6843:6;6832:9;6828:22;6807:53;;6883:1115;;;;;;;;;7106:3;7094:9;7085:7;7081:23;7077:33;7074:2;;;7123:1;7120;7113:12;7074:2;7158:1;7175:53;7220:7;7200:9;7175:53;;;7165:63;;7137:97;7265:2;7283:53;7328:7;7319:6;7308:9;7304:22;7283:53;;;7273:63;;7244:98;7373:2;7391:53;7436:7;7427:6;7416:9;7412:22;7391:53;;;7381:63;;7352:98;7481:2;7499:53;7544:7;7535:6;7524:9;7520:22;7499:53;;;7489:63;;7460:98;7589:3;7608:52;7652:7;7643:6;7632:9;7628:22;7608:52;;;7598:62;;7568:98;7697:3;7716:52;7760:7;7751:6;7740:9;7736:22;7716:52;;;7706:62;;7676:98;7833:3;7822:9;7818:19;7805:33;-1:-1;;;;;7850:6;7847:30;7844:2;;;7890:1;7887;7880:12;7844:2;7918:64;7974:7;7965:6;7954:9;7950:22;7918:64;;;7908:74;;;;7784:204;7068:930;;;;;;;;;;;;8005:638;;;8176:2;8164:9;8155:7;8151:23;8147:32;8144:2;;;8192:1;8189;8182:12;8144:2;8227:31;;-1:-1;;;;;8267:30;;8264:2;;;8310:1;8307;8300:12;8264:2;8330:78;8400:7;8391:6;8380:9;8376:22;8330:78;;;8320:88;;8206:208;8473:2;8462:9;8458:18;8445:32;-1:-1;;;;;8489:6;8486:30;8483:2;;;8529:1;8526;8519:12;8483:2;8549:78;8619:7;8610:6;8599:9;8595:22;8549:78;;8650:239;;8753:2;8741:9;8732:7;8728:23;8724:32;8721:2;;;8769:1;8766;8759:12;8721:2;8804:1;8821:52;8865:7;8845:9;8821:52;;8896:261;;9010:2;8998:9;8989:7;8985:23;8981:32;8978:2;;;9026:1;9023;9016:12;8978:2;9061:1;9078:63;9133:7;9113:9;9078:63;;9164:347;;9278:2;9266:9;9257:7;9253:23;9249:32;9246:2;;;9294:1;9291;9284:12;9246:2;9329:31;;-1:-1;;;;;9369:30;;9366:2;;;9412:1;9409;9402:12;9366:2;9432:63;9487:7;9478:6;9467:9;9463:22;9432:63;;9518:578;;;9659:2;9647:9;9638:7;9634:23;9630:32;9627:2;;;9675:1;9672;9665:12;9627:2;9710:31;;-1:-1;;;;;9750:30;;9747:2;;;9793:1;9790;9783:12;9747:2;9813:63;9868:7;9859:6;9848:9;9844:22;9813:63;;;9803:73;;9689:193;9941:2;9930:9;9926:18;9913:32;-1:-1;;;;;9957:6;9954:30;9951:2;;;9997:1;9994;9987:12;9951:2;10017:63;10072:7;10063:6;10052:9;10048:22;10017:63;;10103:241;;10207:2;10195:9;10186:7;10182:23;10178:32;10175:2;;;10223:1;10220;10213:12;10175:2;10258:1;10275:53;10320:7;10300:9;10275:53;;10352:173;;10439:46;10481:3;10473:6;10439:46;;;-1:-1;;10514:4;10505:14;;10432:93;10533:142;10624:45;10663:5;10624:45;;;10619:3;10612:58;10606:69;;;10682:113;10765:24;10783:5;10765:24;;10833:690;;10978:54;11026:5;10978:54;;;11045:86;11124:6;11119:3;11045:86;;;11038:93;;11152:56;11202:5;11152:56;;;11228:7;11256:1;11241:260;11266:6;11263:1;11260:13;11241:260;;;11333:6;11327:13;11354:63;11413:3;11398:13;11354:63;;;11347:70;;11434:60;11487:6;11434:60;;;11424:70;-1:-1;;11288:1;11281:9;11241:260;;;-1:-1;11514:3;;10957:566;-1:-1;;;;;10957:566;11531:104;11608:21;11623:5;11608:21;;11642:343;;11752:38;11784:5;11752:38;;;11802:70;11865:6;11860:3;11802:70;;;11795:77;;11877:52;11922:6;11917:3;11910:4;11903:5;11899:16;11877:52;;;11950:29;11972:6;11950:29;;;11941:39;;;;11732:253;-1:-1;;;11732:253;12693:465;;12853:67;12917:2;12912:3;12853:67;;;12953:66;12933:87;;-1:-1;;;13049:2;13040:12;;13033:88;13149:2;13140:12;;12839:319;-1:-1;;12839:319;13167:364;;13327:67;13391:2;13386:3;13327:67;;;13427:66;13407:87;;13522:2;13513:12;;13313:218;-1:-1;;13313:218;13540:465;;13700:67;13764:2;13759:3;13700:67;;;13800:66;13780:87;;-1:-1;;;13896:2;13887:12;;13880:88;13996:2;13987:12;;13686:319;-1:-1;;13686:319;14014:465;;14174:67;14238:2;14233:3;14174:67;;;14274:66;14254:87;;-1:-1;;;14370:2;14361:12;;14354:88;14470:2;14461:12;;14160:319;-1:-1;;14160:319;14488:364;;14648:67;14712:2;14707:3;14648:67;;;14748:66;14728:87;;14843:2;14834:12;;14634:218;-1:-1;;14634:218;14861:465;;15021:67;15085:2;15080:3;15021:67;;;15121:66;15101:87;;-1:-1;;;15217:2;15208:12;;15201:88;15317:2;15308:12;;15007:319;-1:-1;;15007:319;15335:465;;15495:67;15559:2;15554:3;15495:67;;;15595:66;15575:87;;-1:-1;;;15691:2;15682:12;;15675:88;15791:2;15782:12;;15481:319;-1:-1;;15481:319;15809:465;;15969:67;16033:2;16028:3;15969:67;;;16069:66;16049:87;;-1:-1;;;16165:2;16156:12;;16149:88;16265:2;16256:12;;15955:319;-1:-1;;15955:319;16283:465;;16443:67;16507:2;16502:3;16443:67;;;16543:66;16523:87;;-1:-1;;;16639:2;16630:12;;16623:88;16739:2;16730:12;;16429:319;-1:-1;;16429:319;16757:364;;16917:67;16981:2;16976:3;16917:67;;;-1:-1;;;16997:87;;17112:2;17103:12;;16903:218;-1:-1;;16903:218;17130:364;;17290:67;17354:2;17349:3;17290:67;;;17390:66;17370:87;;17485:2;17476:12;;17276:218;-1:-1;;17276:218;17503:465;;17663:67;17727:2;17722:3;17663:67;;;17763:66;17743:87;;-1:-1;;;17859:2;17850:12;;17843:88;17959:2;17950:12;;17649:319;-1:-1;;17649:319;17977:465;;18137:67;18201:2;18196:3;18137:67;;;18237:66;18217:87;;-1:-1;;;18333:2;18324:12;;18317:88;18433:2;18424:12;;18123:319;-1:-1;;18123:319;18451:465;;18611:67;18675:2;18670:3;18611:67;;;18711:66;18691:87;;18812:66;18807:2;18798:12;;18791:88;18907:2;18898:12;;18597:319;-1:-1;;18597:319;18925:465;;19085:67;19149:2;19144:3;19085:67;;;19185:66;19165:87;;-1:-1;;;19281:2;19272:12;;19265:88;19381:2;19372:12;;19071:319;-1:-1;;19071:319;19399:465;;19559:67;19623:2;19618:3;19559:67;;;19659:66;19639:87;;-1:-1;;;19755:2;19746:12;;19739:88;19855:2;19846:12;;19545:319;-1:-1;;19545:319;19873:465;;20033:67;20097:2;20092:3;20033:67;;;20133:66;20113:87;;20234:66;20229:2;20220:12;;20213:88;20329:2;20320:12;;20019:319;-1:-1;;20019:319;20347:465;;20507:67;20571:2;20566:3;20507:67;;;20607:66;20587:87;;20708:66;20703:2;20694:12;;20687:88;20803:2;20794:12;;20493:319;-1:-1;;20493:319;20821:364;;20981:67;21045:2;21040:3;20981:67;;;-1:-1;;;21061:87;;21176:2;21167:12;;20967:218;-1:-1;;20967:218;21194:364;;21354:67;21418:2;21413:3;21354:67;;;-1:-1;;;21434:87;;21549:2;21540:12;;21340:218;-1:-1;;21340:218;21566:113;21649:24;21667:5;21649:24;;21686:103;21759:24;21777:5;21759:24;;21916:110;21997:23;22014:5;21997:23;;22033:213;22151:2;22136:18;;22165:71;22140:9;22209:6;22165:71;;22253:1055;22609:3;22594:19;;22624:79;22598:9;22676:6;22624:79;;;22714:72;22782:2;22771:9;22767:18;22758:6;22714:72;;;22834:9;22828:4;22824:20;22819:2;22808:9;22804:18;22797:48;22859:108;22962:4;22953:6;22859:108;;;22851:116;;23015:9;23009:4;23005:20;23000:2;22989:9;22985:18;22978:48;23040:108;23143:4;23134:6;23040:108;;;23032:116;;23197:9;23191:4;23187:20;23181:3;23170:9;23166:19;23159:49;23222:76;23293:4;23284:6;23222:76;;;23214:84;22580:728;-1:-1;;;;;;;22580:728;23315:759;23571:3;23556:19;;23586:79;23560:9;23638:6;23586:79;;;23676:72;23744:2;23733:9;23729:18;23720:6;23676:72;;;23759;23827:2;23816:9;23812:18;23803:6;23759:72;;;23842;23910:2;23899:9;23895:18;23886:6;23842:72;;;23963:9;23957:4;23953:20;23947:3;23936:9;23932:19;23925:49;23988:76;24059:4;24050:6;23988:76;;24081:361;24249:2;24263:47;;;24234:18;;24324:108;24234:18;24418:6;24324:108;;24449:620;24695:2;24709:47;;;24680:18;;24770:108;24680:18;24864:6;24770:108;;;24762:116;;24926:9;24920:4;24916:20;24911:2;24900:9;24896:18;24889:48;24951:108;25054:4;25045:6;24951:108;;25076:201;25188:2;25173:18;;25202:65;25177:9;25240:6;25202:65;;25284:293;25418:2;25432:47;;;25403:18;;25493:74;25403:18;25553:6;25493:74;;25892:407;26083:2;26097:47;;;26068:18;;26158:131;26068:18;26158:131;;26306:407;26497:2;26511:47;;;26482:18;;26572:131;26482:18;26572:131;;26720:407;26911:2;26925:47;;;26896:18;;26986:131;26896:18;26986:131;;27134:407;27325:2;27339:47;;;27310:18;;27400:131;27310:18;27400:131;;27548:407;27739:2;27753:47;;;27724:18;;27814:131;27724:18;27814:131;;27962:407;28153:2;28167:47;;;28138:18;;28228:131;28138:18;28228:131;;28376:407;28567:2;28581:47;;;28552:18;;28642:131;28552:18;28642:131;;28790:407;28981:2;28995:47;;;28966:18;;29056:131;28966:18;29056:131;;29204:407;29395:2;29409:47;;;29380:18;;29470:131;29380:18;29470:131;;29618:407;29809:2;29823:47;;;29794:18;;29884:131;29794:18;29884:131;;30032:407;30223:2;30237:47;;;30208:18;;30298:131;30208:18;30298:131;;30446:407;30637:2;30651:47;;;30622:18;;30712:131;30622:18;30712:131;;30860:407;31051:2;31065:47;;;31036:18;;31126:131;31036:18;31126:131;;31274:407;31465:2;31479:47;;;31450:18;;31540:131;31450:18;31540:131;;31688:407;31879:2;31893:47;;;31864:18;;31954:131;31864:18;31954:131;;32102:407;32293:2;32307:47;;;32278:18;;32368:131;32278:18;32368:131;;32516:407;32707:2;32721:47;;;32692:18;;32782:131;32692:18;32782:131;;32930:407;33121:2;33135:47;;;33106:18;;33196:131;33106:18;33196:131;;33344:407;33535:2;33549:47;;;33520:18;;33610:131;33520:18;33610:131;;33758:407;33949:2;33963:47;;;33934:18;;34024:131;33934:18;34024:131;;34172:539;34370:3;34355:19;;34385:71;34359:9;34429:6;34385:71;;;34467:70;34533:2;34522:9;34518:18;34509:6;34467:70;;;34548;34614:2;34603:9;34599:18;34590:6;34548:70;;;34629:72;34697:2;34686:9;34682:18;34673:6;34629:72;;;34341:370;;;;;;;;34718:213;34836:2;34821:18;;34850:71;34825:9;34894:6;34850:71;;34938:324;35084:2;35069:18;;35098:71;35073:9;35142:6;35098:71;;;35180:72;35248:2;35237:9;35233:18;35224:6;35180:72;;35269:256;35331:2;35325:9;35357:17;;;-1:-1;;;;;35417:34;;35453:22;;;35414:62;35411:2;;;35489:1;35486;35479:12;35411:2;35505;35498:22;35309:216;;-1:-1;35309:216;35532:304;;-1:-1;;;;;35683:6;35680:30;35677:2;;;35723:1;35720;35713:12;35677:2;-1:-1;35758:4;35746:17;;;35811:15;;35614:222;36154:321;;-1:-1;;;;;36289:6;36286:30;36283:2;;;36329:1;36326;36319:12;36283:2;-1:-1;36460:4;36396;36373:17;;;;-1:-1;;36369:33;36450:15;;36220:255;36811:151;36935:4;36926:14;;36883:79;36969:137;37072:12;;37043:63;37611:178;37729:19;;;37778:4;37769:14;;37722:67;38140:91;;38202:24;38220:5;38202:24;;38238:85;38304:13;38297:21;;38280:43;38330:144;-1:-1;;;;;;38391:78;;38374:100;38481:113;-1:-1;;;;;38543:46;;38526:68;38601:121;-1:-1;;;;;38663:54;;38646:76;38808:96;-1:-1;;;;;38869:30;;38852:52;38911:129;;38998:37;39029:5;39047:121;39126:37;39157:5;39126:37;;39291:145;39372:6;39367:3;39362;39349:30;-1:-1;39428:1;39410:16;;39403:27;39342:94;39445:268;39510:1;39517:101;39531:6;39528:1;39525:13;39517:101;;;39598:11;;;39592:18;39579:11;;;39572:39;39553:2;39546:10;39517:101;;;39633:6;39630:1;39627:13;39624:2;;;-1:-1;;39698:1;39680:16;;39673:27;39494:219;39721:97;39809:2;39789:14;-1:-1;;39785:28;;39769:49;39826:117;39895:24;39913:5;39895:24;;;39888:5;39885:35;39875:2;;39934:1;39931;39924:12;39950:111;40016:21;40031:5;40016:21;;40068:115;40136:23;40153:5;40136:23;;40190:117;40259:24;40277:5;40259:24;;40314:115;40382:23;40399:5;40382:23;

Swarm Source

bzzr://7488c021d92e735c6e57577f6c4c8ea4399834ce3253a0addaa1b39d284d44fd
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.