ETH Price: $2,688.36 (-1.79%)

Token

Resistance Club (RESISTANCE)
 

Overview

Max Total Supply

150 RESISTANCE

Holders

110

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
moonbirdselders.eth
0x87c36EA040E8F4e5a4c0bE426514484567d190DB
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:
ResistanceClub

Compiler Version
v0.7.4+commit.3f05b770

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-11
*/

// File: contracts/interfaces/IERC1155Metadata.sol


pragma solidity 0.7.4;


interface IERC1155Metadata {

  event URI(string _uri, uint256 indexed _id);

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

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

// File: contracts/utils/Ownable.sol

pragma solidity 0.7.4;


/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address private _owner_;

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

  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor () {
    _owner_ = msg.sender;
    emit OwnershipTransferred(address(0), _owner_);
  }

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

  /**
   * @notice Transfers the ownership of the contract to new address
   * @param _newOwner Address of the new owner
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    require(_newOwner != address(0), "Ownable#transferOwnership: INVALID_ADDRESS");
    emit OwnershipTransferred(_owner_, _newOwner);
    _owner_ = _newOwner;
  }

  /**
   * @notice Returns the address of the owner.
   */
  function owner() public view returns (address) {
    return _owner_;
  }
}
// File: contracts/utils/Address.sol

pragma solidity 0.7.4;


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

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

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

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


pragma solidity 0.7.4;


/**
 * @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: contracts/utils/ERC165.sol

pragma solidity 0.7.4;


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


pragma solidity 0.7.4;



interface IERC1155 is IERC165 {

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

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

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

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


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

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

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

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

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

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

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

// File: contracts/interfaces/IERC1155TokenReceiver.sol


pragma solidity 0.7.4;

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

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

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

// File: contracts/utils/SafeMath.sol

pragma solidity 0.7.4;


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

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

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

    return c;
  }

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

    return c;
  }

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

    return c;
  }

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

    return c; 
  }

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


pragma solidity 0.7.4;







/**
 * @dev Implementation of Multi-Token Standard contract. This implementation of the ERC-1155 standard
 *      utilizes the fact that balances of different token ids can be concatenated within individual
 *      uint256 storage slots. This allows the contract to batch transfer tokens more efficiently at
 *      the cost of limiting the maximum token balance each address can hold. This limit is
 *      2^IDS_BITS_SIZE, which can be adjusted below. In practice, using IDS_BITS_SIZE smaller than 16
 *      did not lead to major efficiency gains.
 */
contract ERC1155PackedBalance is IERC1155, ERC165 {
  using SafeMath for uint256;
  using Address for address;

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

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

  // Constants regarding bin sizes for balance packing
  // IDS_BITS_SIZE **MUST** be a power of 2 (e.g. 2, 4, 8, 16, 32, 64, 128)
  uint256 internal constant IDS_BITS_SIZE   = 32;                  // Max balance amount in bits per token ID
  uint256 internal constant IDS_PER_UINT256 = 256 / IDS_BITS_SIZE; // Number of ids per uint256

  // Operations for _updateIDBalance
  enum Operations { Add, Sub }

  // Token IDs balances ; balances[address][id] => balance (using array instead of mapping for efficiency)
  mapping (address => mapping(uint256 => uint256)) internal balances;

  // Operators
  mapping (address => mapping(address => bool)) internal operators;


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

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

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

  /**
   * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
   * @dev Arrays should be sorted so that all ids in a same storage slot are adjacent (more efficient)
   * @param _from     Source addresses
   * @param _to       Target addresses
   * @param _ids      IDs of each token type
   * @param _amounts  Transfer amounts per token type
   * @param _data     Additional data with no specified format, sent in call to `_to`
   */
  function safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data)
    public override
  {
    // Requirements
    require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155PackedBalance#safeBatchTransferFrom: INVALID_OPERATOR");
    require(_to != address(0),"ERC1155PackedBalance#safeBatchTransferFrom: INVALID_RECIPIENT");

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


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

  /**
   * @notice Transfers amount amount of an _id from the _from address to the _to address specified
   * @param _from    Source address
   * @param _to      Target address
   * @param _id      ID of the token type
   * @param _amount  Transfered amount
   */
  function _safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount)
    internal
  {
    //Update balances
    _updateIDBalance(_from, _id, _amount, Operations.Sub); // Subtract amount from sender
    _updateIDBalance(_to,   _id, _amount, Operations.Add); // Add amount to recipient

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

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

  /**
   * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
   * @dev Arrays should be sorted so that all ids in a same storage slot are adjacent (more efficient)
   * @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
  {
    uint256 nTransfer = _ids.length; // Number of transfer to execute
    require(nTransfer == _amounts.length, "ERC1155PackedBalance#_safeBatchTransferFrom: INVALID_ARRAYS_LENGTH");

    if (_from != _to && nTransfer > 0) {
      // Load first bin and index where the token ID balance exists
      (uint256 bin, uint256 index) = getIDBinIndex(_ids[0]);

      // Balance for current bin in memory (initialized with first transfer)
      uint256 balFrom = _viewUpdateBinValue(balances[_from][bin], index, _amounts[0], Operations.Sub);
      uint256 balTo = _viewUpdateBinValue(balances[_to][bin], index, _amounts[0], Operations.Add);

      // Last bin updated
      uint256 lastBin = bin;

      for (uint256 i = 1; i < nTransfer; i++) {
        (bin, index) = getIDBinIndex(_ids[i]);

        // If new bin
        if (bin != lastBin) {
          // Update storage balance of previous bin
          balances[_from][lastBin] = balFrom;
          balances[_to][lastBin] = balTo;

          balFrom = balances[_from][bin];
          balTo = balances[_to][bin];

          // Bin will be the most recent bin
          lastBin = bin;
        }

        // Update memory balance
        balFrom = _viewUpdateBinValue(balFrom, index, _amounts[i], Operations.Sub);
        balTo = _viewUpdateBinValue(balTo, index, _amounts[i], Operations.Add);
      }

      // Update storage of the last bin visited
      balances[_from][bin] = balFrom;
      balances[_to][bin] = balTo;

    // If transfer to self, just make sure all amounts are valid
    } else {
      for (uint256 i = 0; i < nTransfer; i++) {
        require(balanceOf(_from, _ids[i]) >= _amounts[i], "ERC1155PackedBalance#_safeBatchTransferFrom: UNDERFLOW");
      }
    }

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

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


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

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

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


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

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

    //Get bin and index of _id
    (bin, index) = getIDBinIndex(_id);
    return getValueInBin(balances[_owner][bin], index);
  }

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

    // First values
    (uint256 bin, uint256 index) = getIDBinIndex(_ids[0]);
    uint256 balance_bin = balances[_owners[0]][bin];
    uint256 last_bin = bin;

    // Initialization
    uint256[] memory batchBalances = new uint256[](n_owners);
    batchBalances[0] = getValueInBin(balance_bin, index);

    // Iterate over each owner and token ID
    for (uint256 i = 1; i < n_owners; i++) {
      (bin, index) = getIDBinIndex(_ids[i]);

      // SLOAD if bin changed for the same owner or if owner changed
      if (bin != last_bin || _owners[i-1] != _owners[i]) {
        balance_bin = balances[_owners[i]][bin];
        last_bin = bin;
      }

      batchBalances[i] = getValueInBin(balance_bin, index);
    }

    return batchBalances;
  }


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

  /**
   * @notice Update the balance of a id for a given address
   * @param _address    Address to update id balance
   * @param _id         Id to update balance of
   * @param _amount     Amount to update the id balance
   * @param _operation  Which operation to conduct :
   *   Operations.Add: Add _amount to id balance
   *   Operations.Sub: Substract _amount from id balance
   */
  function _updateIDBalance(address _address, uint256 _id, uint256 _amount, Operations _operation)
    internal
  {
    uint256 bin;
    uint256 index;

    // Get bin and index of _id
    (bin, index) = getIDBinIndex(_id);

    // Update balance
    balances[_address][bin] = _viewUpdateBinValue(balances[_address][bin], index, _amount, _operation);
  }

  /**
   * @notice Update a value in _binValues
   * @param _binValues  Uint256 containing values of size IDS_BITS_SIZE (the token balances)
   * @param _index      Index of the value in the provided bin
   * @param _amount     Amount to update the id balance
   * @param _operation  Which operation to conduct :
   *   Operations.Add: Add _amount to value in _binValues at _index
   *   Operations.Sub: Substract _amount from value in _binValues at _index
   */
  function _viewUpdateBinValue(uint256 _binValues, uint256 _index, uint256 _amount, Operations _operation)
    internal pure returns (uint256 newBinValues)
  {
    uint256 shift = IDS_BITS_SIZE * _index;
    uint256 mask = (uint256(1) << IDS_BITS_SIZE) - 1;

    if (_operation == Operations.Add) {
      newBinValues = _binValues + (_amount << shift);
      require(newBinValues >= _binValues, "ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW");
      require(
        ((_binValues >> shift) & mask) + _amount < 2**IDS_BITS_SIZE, // Checks that no other id changed
        "ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW"
      );

    } else if (_operation == Operations.Sub) {
      newBinValues = _binValues - (_amount << shift);
      require(newBinValues <= _binValues, "ERC1155PackedBalance#_viewUpdateBinValue: UNDERFLOW");
      require(
        ((_binValues >> shift) & mask) >= _amount, // Checks that no other id changed
        "ERC1155PackedBalance#_viewUpdateBinValue: UNDERFLOW"
      );

    } else {
      revert("ERC1155PackedBalance#_viewUpdateBinValue: INVALID_BIN_WRITE_OPERATION"); // Bad operation
    }

    return newBinValues;
  }

  /**
  * @notice Return the bin number and index within that bin where ID is
  * @param _id  Token id
  * @return bin index (Bin number, ID"s index within that bin)
  */
  function getIDBinIndex(uint256 _id)
    public pure returns (uint256 bin, uint256 index)
  {
    bin = _id / IDS_PER_UINT256;
    index = _id % IDS_PER_UINT256;
    return (bin, index);
  }

  /**
   * @notice Return amount in _binValues at position _index
   * @param _binValues  uint256 containing the balances of IDS_PER_UINT256 ids
   * @param _index      Index at which to retrieve amount
   * @return amount at given _index in _bin
   */
  function getValueInBin(uint256 _binValues, uint256 _index)
    public pure returns (uint256)
  {
    // require(_index < IDS_PER_UINT256) is not required since getIDBinIndex ensures `_index < IDS_PER_UINT256`

    // Mask to retrieve data for a given binData
    uint256 mask = (uint256(1) << IDS_BITS_SIZE) - 1;

    // Shift amount
    uint256 rightShift = IDS_BITS_SIZE * _index;
    return (_binValues >> rightShift) & mask;
  }


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

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

// File: contracts/ERC1155MintBurnPackedBalance.sol


pragma solidity 0.7.4;



/**
 * @dev Multi-Fungible Tokens with minting and burning methods. These methods assume
 *      a parent contract to be executed as they are `internal` functions.
 */
contract ERC1155MintBurnPackedBalance is ERC1155PackedBalance {

  /****************************************|
  |            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
    _updateIDBalance(_to,   _id, _amount, Operations.Add); // Add amount to recipient

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

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

  /**
   * @notice Mint tokens for each (_ids[i], _amounts[i]) pair
   * @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, "ERC1155MintBurnPackedBalance#_batchMint: INVALID_ARRAYS_LENGTH");

    if (_ids.length > 0) {
      // Load first bin and index where the token ID balance exists
      (uint256 bin, uint256 index) = getIDBinIndex(_ids[0]);

      // Balance for current bin in memory (initialized with first transfer)
      uint256 balTo = _viewUpdateBinValue(balances[_to][bin], index, _amounts[0], Operations.Add);

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

      // Last bin updated
      uint256 lastBin = bin;

      for (uint256 i = 1; i < nTransfer; i++) {
        (bin, index) = getIDBinIndex(_ids[i]);

        // If new bin
        if (bin != lastBin) {
          // Update storage balance of previous bin
          balances[_to][lastBin] = balTo;
          balTo = balances[_to][bin];

          // Bin will be the most recent bin
          lastBin = bin;
        }

        // Update memory balance
        balTo = _viewUpdateBinValue(balTo, index, _amounts[i], Operations.Add);
      }

      // Update storage of the last bin visited
      balances[_to][bin] = balTo;
    }

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

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


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

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

    // 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
   * @dev This batchBurn method does not implement the most efficient way of updating
   *      balances to reduce the potential bug surface as this function is expected to
   *      be less common than transfers. EIP-2200 makes this method significantly
   *      more efficient already for packed balances.
   * @param _from     The address to burn tokens from
   * @param _ids      Array of token ids to burn
   * @param _amounts  Array of the amount to be burned
   */
  function _batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts)
    internal
  {
    // Number of burning to execute
    uint256 nBurn = _ids.length;
    require(nBurn == _amounts.length, "ERC1155MintBurnPackedBalance#batchBurn: INVALID_ARRAYS_LENGTH");

    // Executing all burning
    for (uint256 i = 0; i < nBurn; i++) {
      // Update storage balance
      _updateIDBalance(_from,   _ids[i], _amounts[i], Operations.Sub); // Add amount to recipient
    }

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

// File: contracts/ResistanceClub.sol


pragma solidity 0.7.4;






contract ResistanceClub is ERC1155MintBurnPackedBalance, Ownable, IERC1155Metadata  {
    uint256 public constant RED = 0;
    uint256 public constant BEIGE = 1;

    mapping (uint => string) private _metadata;
    string private _contractMetadataURI;

    uint96 royaltyFeesInBips;
    address royaltyAddress;


    function setMetadata(uint _tokenId, string calldata newMetadata) public onlyOwner {
        _metadata[_tokenId] = newMetadata;
    }

    function setContractMetadataURI(string memory contractMetadataURI) public onlyOwner {
        _contractMetadataURI = contractMetadataURI;
    }

    function contractURI() public view returns (string memory) {
        return _contractMetadataURI;
    }
    
    function uri (uint _tokenId) override public view returns (string memory) {
        return _metadata[_tokenId];
    }

    function name() public pure returns (string memory) {
        return "Resistance Club";
    }

    function symbol() public pure returns (string memory) {
        return "RESISTANCE";
    }

    function setRoyaltyInfo(address _receiver, uint96 _royaltyFeesInBips) public onlyOwner {
        royaltyAddress = _receiver;
        royaltyFeesInBips = _royaltyFeesInBips;
    }

    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        virtual
        returns (address, uint256)
    {
        return (royaltyAddress, calculateRoyalty(_salePrice));
    }

    function calculateRoyalty(uint256 _salePrice) view public returns (uint256) {
        return (_salePrice / 10000) * royaltyFeesInBips;
    }

    function supportsInterface(bytes4 interfaceId) public view override returns (bool){
        return interfaceId == 0x2a55205a || super.supportsInterface(interfaceId);
    }



    constructor() ERC1155MintBurnPackedBalance() {
        _mint(address(0x2DADCD5248FB059a47192b8b182c8811E0ECDc9e), RED, 50, "");
        _mint(address(0x2DADCD5248FB059a47192b8b182c8811E0ECDc9e), BEIGE, 100, "");

        _metadata[0] = "ipfs://QmQXaU23fXTbM3BCkj4811pyAgcZAf8ukT14wskJYkPr2r";
        _metadata[1] = "ipfs://QmehLQ8vmizor9uEXE2HDwh3rCBfJ8BPTmUECg81udon8n";
        _contractMetadataURI = "ipfs://QmVa6y1jqCAbXH9HG6GjHATnjch5Cqmj799SM34yfZbsZy";

        royaltyFeesInBips = 1000;
        royaltyAddress = 0x2DADCD5248FB059a47192b8b182c8811E0ECDc9e;

    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_uri","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"BEIGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"calculateRoyalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getIDBinIndex","outputs":[{"internalType":"uint256","name":"bin","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_binValues","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getValueInBin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractMetadataURI","type":"string"}],"name":"setContractMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"newMetadata","type":"string"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50600280546001600160a01b0319163317908190556040516001600160a01b0391909116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a362000097732dadcd5248fb059a47192b8b182c8811e0ecdc9e6000603260405180602001604052806000815250620001f760201b60201c565b620000d0732dadcd5248fb059a47192b8b182c8811e0ecdc9e6001606460405180602001604052806000815250620001f760201b60201c565b6040518060600160405280603581526020016200277d603591396000805260036020908152815162000126927f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff92019062000652565b50604051806060016040528060358152602001620027486035913960016000526003602090815281516200017e927fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c92019062000652565b50604051806060016040528060358152602001620028a3603591398051620001af9160049160209091019062000652565b50600580547f2dadcd5248fb059a47192b8b182c8811e0ecdc9e0000000000000000000000006001600160601b03199091166103e8176001600160601b0316179055620006fe565b62000206848484600062000268565b604080518481526020810184905281516001600160a01b0387169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a46200026260008585855a86620002d9565b50505050565b60008062000276856200046b565b6001600160a01b0388166000908152602081815260408083208584529091529020549193509150620002ab9082868662000478565b6001600160a01b03909616600090815260208181526040808320948352939052919091209490945550505050565b620002f8856001600160a01b03166200061760201b620011fa1760201c565b1562000463576000856001600160a01b031663f23a6e6184338a8989886040518763ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156200038d57818101518382015260200162000373565b50505050905090810190601f168015620003bb5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b158015620003df57600080fd5b5087f1158015620003f4573d6000803e3d6000fd5b50505050506040513d60208110156200040c57600080fd5b505190506001600160e01b0319811663f23a6e6160e01b14620004615760405162461bcd60e51b8152600401808060200182810382526047815260200180620027e56047913960600191505060405180910390fd5b505b505050505050565b6008810491600790911690565b60006020840263ffffffff828460018111156200049157fe5b1415620005315784821b8701925086831015620004e05760405162461bcd60e51b8152600401808060200182810382526032815260200180620028716032913960400191505060405180910390fd5b64010000000087831c82168601106200052b5760405162461bcd60e51b8152600401808060200182810382526032815260200180620028716032913960400191505060405180910390fd5b6200060d565b60018460018111156200054057fe5b1415620005d55784821b87039250868311156200058f5760405162461bcd60e51b8152600401808060200182810382526033815260200180620027b26033913960400191505060405180910390fd5b84818389901c1610156200052b5760405162461bcd60e51b8152600401808060200182810382526033815260200180620027b26033913960400191505060405180910390fd5b60405162461bcd60e51b81526004018080602001828103825260458152602001806200282c6045913960600191505060405180910390fd5b5050949350505050565b6000813f80158015906200064b57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200068a5760008555620006d5565b82601f10620006a557805160ff1916838001178555620006d5565b82800160010185558215620006d5579182015b82811115620006d5578251825591602001919060010190620006b8565b50620006e3929150620006e7565b5090565b5b80821115620006e35760008155600101620006e8565b61203a806200070e6000396000f3fe608060405234801561001057600080fd5b50600436106101415760003560e01c80638da5cb5b116100b8578063db90e83c1161007c578063db90e83c146107aa578063e8a3d485146107e0578063e985e9c5146107e8578063eaec5f8114610816578063f242432a14610839578063f2fde38b1461090257610141565b80638da5cb5b1461068f57806395d89b41146106b3578063a201fc50146106bb578063a22cb4651461075f578063a2e696131461078d57610141565b80630e89341c1161010a5780630e89341c1461027b5780632a55205a146102985780632eb2c2d6146102de57806336d18b671461049f5780634e1273f4146104a7578063593aa2831461061a57610141565b8062fdd58e1461014657806301ffc9a71461018457806302fa7c47146101bf57806306fdde03146101f65780630b9fd4e514610273575b600080fd5b6101726004803603604081101561015c57600080fd5b506001600160a01b038135169060200135610928565b60408051918252519081900360200190f35b6101ab6004803603602081101561019a57600080fd5b50356001600160e01b031916610970565b604080519115158252519081900360200190f35b6101f4600480360360408110156101d557600080fd5b5080356001600160a01b031690602001356001600160601b031661099d565b005b6101fe610a23565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610238578181015183820152602001610220565b50505050905090810190601f1680156102655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610172610a4c565b6101fe6004803603602081101561029157600080fd5b5035610a51565b6102bb600480360360408110156102ae57600080fd5b5080359060200135610af2565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6101f4600480360360a08110156102f457600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561032757600080fd5b82018360208201111561033957600080fd5b803590602001918460208302840111600160201b8311171561035a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103a957600080fd5b8201836020820111156103bb57600080fd5b803590602001918460208302840111600160201b831117156103dc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561042b57600080fd5b82018360208201111561043d57600080fd5b803590602001918460018302840111600160201b8311171561045e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610b1e945050505050565b610172610bdb565b6105ca600480360360408110156104bd57600080fd5b810190602081018135600160201b8111156104d757600080fd5b8201836020820111156104e957600080fd5b803590602001918460208302840111600160201b8311171561050a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561055957600080fd5b82018360208201111561056b57600080fd5b803590602001918460208302840111600160201b8311171561058c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610be0945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106065781810151838201526020016105ee565b505050509050019250505060405180910390f35b6101f46004803603604081101561063057600080fd5b81359190810190604081016020820135600160201b81111561065157600080fd5b82018360208201111561066357600080fd5b803590602001918460018302840111600160201b8311171561068457600080fd5b509092509050610df7565b610697610e5f565b604080516001600160a01b039092168252519081900360200190f35b6101fe610e6e565b6101f4600480360360208110156106d157600080fd5b810190602081018135600160201b8111156106eb57600080fd5b8201836020820111156106fd57600080fd5b803590602001918460018302840111600160201b8311171561071e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e92945050505050565b6101f46004803603604081101561077557600080fd5b506001600160a01b0381351690602001351515610ef2565b610172600480360360208110156107a357600080fd5b5035610f60565b6107c7600480360360208110156107c057600080fd5b5035610f76565b6040805192835260208301919091528051918290030190f35b6101fe610f83565b6101ab600480360360408110156107fe57600080fd5b506001600160a01b0381358116916020013516611019565b6101726004803603604081101561082c57600080fd5b5080359060200135611047565b6101f4600480360360a081101561084f57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561088e57600080fd5b8201836020820111156108a057600080fd5b803590602001918460018302840111600160201b831117156108c157600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061105a945050505050565b6101f46004803603602081101561091857600080fd5b50356001600160a01b0316611110565b600080600061093684610f76565b6001600160a01b03871660009081526020818152604080832085845290915290205491935091506109679082611047565b95945050505050565b600063152a902d60e11b6001600160e01b031983161480610995575061099582611234565b90505b919050565b6002546001600160a01b031633146109e65760405162461bcd60e51b8152600401808060200182810382526026815260200180611f686026913960400191505060405180910390fd5b600580546001600160601b039283166001600160a01b03909416600160601b029216919091176bffffffffffffffffffffffff1916919091179055565b60408051808201909152600f81526e2932b9b4b9ba30b731b29021b63ab160891b602082015290565b600181565b60008181526003602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610ae65780601f10610abb57610100808354040283529160200191610ae6565b820191906000526020600020905b815481529060010190602001808311610ac957829003601f168201915b50505050509050919050565b6005546000908190600160601b90046001600160a01b0316610b1384610f60565b915091509250929050565b336001600160a01b0386161480610b3a5750610b3a8533611019565b610b755760405162461bcd60e51b815260040180806020018281038252603c815260200180611e77603c913960400191505060405180910390fd5b6001600160a01b038416610bba5760405162461bcd60e51b815260040180806020018281038252603d815260200180611d18603d913960400191505060405180910390fd5b610bc685858585611260565b610bd4858585855a866115c4565b5050505050565b600081565b81518151606091908114610c255760405162461bcd60e51b8152600401808060200182810382526039815260200180611cdf6039913960400191505060405180910390fd5b600080610c4585600081518110610c3857fe5b6020026020010151610f76565b91509150600080600088600081518110610c5b57fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff81118015610cb557600080fd5b50604051908082528060200260200182016040528015610cdf578160200160208202803683370190505b509050610cec8385611047565b81600081518110610cf957fe5b602090810291909101015260015b86811015610dea57610d1e898281518110610c3857fe5b90965094508286141580610d6d5750898181518110610d3957fe5b60200260200101516001600160a01b03168a6001830381518110610d5957fe5b60200260200101516001600160a01b031614155b15610dc1576000808b8381518110610d8157fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008781526020019081526020016000205493508592505b610dcb8486611047565b828281518110610dd757fe5b6020908102919091010152600101610d07565b5098975050505050505050565b6002546001600160a01b03163314610e405760405162461bcd60e51b8152600401808060200182810382526026815260200180611f686026913960400191505060405180910390fd5b6000838152600360205260409020610e59908383611bc1565b50505050565b6002546001600160a01b031690565b60408051808201909152600a815269524553495354414e434560b01b602082015290565b6002546001600160a01b03163314610edb5760405162461bcd60e51b8152600401808060200182810382526026815260200180611f686026913960400191505060405180910390fd5b8051610eee906004906020840190611c4d565b5050565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6005546001600160601b03166127109091040290565b6008810491600790911690565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561100f5780601f10610fe45761010080835404028352916020019161100f565b820191906000526020600020905b815481529060010190602001808311610ff257829003601f168201915b5050505050905090565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b336001600160a01b038616148061107657506110768533611019565b6110b15760405162461bcd60e51b8152600401808060200182810382526037815260200180611db26037913960400191505060405180910390fd5b6001600160a01b0384166110f65760405162461bcd60e51b8152600401808060200182810382526038815260200180611f306038913960400191505060405180910390fd5b611102858585856117bc565b610bd4858585855a86611839565b6002546001600160a01b031633146111595760405162461bcd60e51b8152600401808060200182810382526026815260200180611f686026913960400191505060405180910390fd5b6001600160a01b03811661119e5760405162461bcd60e51b815260040180806020018281038252602a815260200180611d88602a913960400191505060405180910390fd5b6002546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000813f801580159061122d57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60006001600160e01b03198216636cdb3d1360e11b141561125757506001610998565b610995826119ab565b8151815181146112a15760405162461bcd60e51b8152600401808060200182810382526042815260200180611de96042913960600191505060405180910390fd5b836001600160a01b0316856001600160a01b0316141580156112c35750600081115b15611461576000806112db85600081518110610c3857fe5b6001600160a01b038916600090815260208181526040808320858452909152812054875193955091935091611326919084908890859061131757fe5b602002602001015160016119c4565b6001600160a01b0388166000908152602081815260408083208784529091528120548751929350909161136f919085908990859061136057fe5b602002602001015160006119c4565b90508360015b8681101561141c5761138c898281518110610c3857fe5b90965094508186146113ee576001600160a01b038b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b6113ff84868a848151811061131757fe5b935061141283868a848151811061136057fe5b9250600101611375565b50506001600160a01b03808a16600090815260208181526040808320888452825280832095909555918a168152808252838120958152949052922091909155506114e4565b60005b818110156114e25782818151811061147857fe5b602002602001015161149d8786848151811061149057fe5b6020026020010151610928565b10156114da5760405162461bcd60e51b8152600401808060200182810382526036815260200180611eb36036913960400191505060405180910390fd5b600101611464565b505b836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611569578181015183820152602001611551565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156115a8578181015183820152602001611590565b5050505090500194505050505060405180910390a45050505050565b6115d6856001600160a01b03166111fa565b156117b4576000856001600160a01b031663bc197c8184338a8989886040518763ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561166757818101518382015260200161164f565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156116a657818101518382015260200161168e565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156116e25781810151838201526020016116ca565b50505050905090810190601f16801561170f5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561173457600080fd5b5087f1158015611748573d6000803e3d6000fd5b50505050506040513d602081101561175f57600080fd5b505190506001600160e01b0319811663bc197c8160e01b146117b25760405162461bcd60e51b815260040180806020018281038252604c815260200180611e2b604c913960600191505060405180910390fd5b505b505050505050565b6117c98483836001611b54565b6117d68383836000611b54565b826001600160a01b0316846001600160a01b0316336001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b61184b856001600160a01b03166111fa565b156117b4576000856001600160a01b031663f23a6e6184338a8989886040518763ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156118dd5781810151838201526020016118c5565b50505050905090810190601f16801561190a5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561192d57600080fd5b5087f1158015611941573d6000803e3d6000fd5b50505050506040513d602081101561195857600080fd5b505190506001600160e01b0319811663f23a6e6160e01b146117b25760405162461bcd60e51b8152600401808060200182810382526047815260200180611ee96047913960600191505060405180910390fd5b6001600160e01b031981166301ffc9a760e01b14919050565b60006020840263ffffffff828460018111156119dc57fe5b1415611a755784821b8701925086831015611a285760405162461bcd60e51b8152600401808060200182810382526032815260200180611fd36032913960400191505060405180910390fd5b600160201b87831c8216860110611a705760405162461bcd60e51b8152600401808060200182810382526032815260200180611fd36032913960400191505060405180910390fd5b611b4a565b6001846001811115611a8357fe5b1415611b135784821b8703925086831115611acf5760405162461bcd60e51b8152600401808060200182810382526033815260200180611d556033913960400191505060405180910390fd5b84818389901c161015611a705760405162461bcd60e51b8152600401808060200182810382526033815260200180611d556033913960400191505060405180910390fd5b60405162461bcd60e51b8152600401808060200182810382526045815260200180611f8e6045913960600191505060405180910390fd5b5050949350505050565b600080611b6085610f76565b6001600160a01b0388166000908152602081815260408083208584529091529020549193509150611b93908286866119c4565b6001600160a01b03909616600090815260208181526040808320948352939052919091209490945550505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282611bf75760008555611c3d565b82601f10611c105782800160ff19823516178555611c3d565b82800160010185558215611c3d579182015b82811115611c3d578235825591602001919060010190611c22565b50611c49929150611cc9565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282611c835760008555611c3d565b82601f10611c9c57805160ff1916838001178555611c3d565b82800160010185558215611c3d579182015b82811115611c3d578251825591602001919060010190611cae565b5b80821115611c495760008155600101611cca56fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f574f776e61626c65237472616e736665724f776e6572736869703a20494e56414c49445f41444452455353455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544f776e61626c65236f6e6c794f776e65723a2053454e4445525f49535f4e4f545f4f574e4552455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a26469706673582212200fb733503f7d9c44f254b45e6f4a519a9496b110ada0c417512038c0dd20da1f64736f6c63430007040033697066733a2f2f516d65684c5138766d697a6f723975455845324844776833724342664a384250546d55454367383175646f6e386e697066733a2f2f516d515861553233665854624d3342436b6a3438313170794167635a416638756b54313477736b4a596b50723272455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57697066733a2f2f516d56613679316a71434162584839484736476a4841546e6a63683543716d6a373939534d333479665a62735a79

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101415760003560e01c80638da5cb5b116100b8578063db90e83c1161007c578063db90e83c146107aa578063e8a3d485146107e0578063e985e9c5146107e8578063eaec5f8114610816578063f242432a14610839578063f2fde38b1461090257610141565b80638da5cb5b1461068f57806395d89b41146106b3578063a201fc50146106bb578063a22cb4651461075f578063a2e696131461078d57610141565b80630e89341c1161010a5780630e89341c1461027b5780632a55205a146102985780632eb2c2d6146102de57806336d18b671461049f5780634e1273f4146104a7578063593aa2831461061a57610141565b8062fdd58e1461014657806301ffc9a71461018457806302fa7c47146101bf57806306fdde03146101f65780630b9fd4e514610273575b600080fd5b6101726004803603604081101561015c57600080fd5b506001600160a01b038135169060200135610928565b60408051918252519081900360200190f35b6101ab6004803603602081101561019a57600080fd5b50356001600160e01b031916610970565b604080519115158252519081900360200190f35b6101f4600480360360408110156101d557600080fd5b5080356001600160a01b031690602001356001600160601b031661099d565b005b6101fe610a23565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610238578181015183820152602001610220565b50505050905090810190601f1680156102655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610172610a4c565b6101fe6004803603602081101561029157600080fd5b5035610a51565b6102bb600480360360408110156102ae57600080fd5b5080359060200135610af2565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6101f4600480360360a08110156102f457600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561032757600080fd5b82018360208201111561033957600080fd5b803590602001918460208302840111600160201b8311171561035a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103a957600080fd5b8201836020820111156103bb57600080fd5b803590602001918460208302840111600160201b831117156103dc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561042b57600080fd5b82018360208201111561043d57600080fd5b803590602001918460018302840111600160201b8311171561045e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610b1e945050505050565b610172610bdb565b6105ca600480360360408110156104bd57600080fd5b810190602081018135600160201b8111156104d757600080fd5b8201836020820111156104e957600080fd5b803590602001918460208302840111600160201b8311171561050a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561055957600080fd5b82018360208201111561056b57600080fd5b803590602001918460208302840111600160201b8311171561058c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610be0945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106065781810151838201526020016105ee565b505050509050019250505060405180910390f35b6101f46004803603604081101561063057600080fd5b81359190810190604081016020820135600160201b81111561065157600080fd5b82018360208201111561066357600080fd5b803590602001918460018302840111600160201b8311171561068457600080fd5b509092509050610df7565b610697610e5f565b604080516001600160a01b039092168252519081900360200190f35b6101fe610e6e565b6101f4600480360360208110156106d157600080fd5b810190602081018135600160201b8111156106eb57600080fd5b8201836020820111156106fd57600080fd5b803590602001918460018302840111600160201b8311171561071e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e92945050505050565b6101f46004803603604081101561077557600080fd5b506001600160a01b0381351690602001351515610ef2565b610172600480360360208110156107a357600080fd5b5035610f60565b6107c7600480360360208110156107c057600080fd5b5035610f76565b6040805192835260208301919091528051918290030190f35b6101fe610f83565b6101ab600480360360408110156107fe57600080fd5b506001600160a01b0381358116916020013516611019565b6101726004803603604081101561082c57600080fd5b5080359060200135611047565b6101f4600480360360a081101561084f57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561088e57600080fd5b8201836020820111156108a057600080fd5b803590602001918460018302840111600160201b831117156108c157600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061105a945050505050565b6101f46004803603602081101561091857600080fd5b50356001600160a01b0316611110565b600080600061093684610f76565b6001600160a01b03871660009081526020818152604080832085845290915290205491935091506109679082611047565b95945050505050565b600063152a902d60e11b6001600160e01b031983161480610995575061099582611234565b90505b919050565b6002546001600160a01b031633146109e65760405162461bcd60e51b8152600401808060200182810382526026815260200180611f686026913960400191505060405180910390fd5b600580546001600160601b039283166001600160a01b03909416600160601b029216919091176bffffffffffffffffffffffff1916919091179055565b60408051808201909152600f81526e2932b9b4b9ba30b731b29021b63ab160891b602082015290565b600181565b60008181526003602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610ae65780601f10610abb57610100808354040283529160200191610ae6565b820191906000526020600020905b815481529060010190602001808311610ac957829003601f168201915b50505050509050919050565b6005546000908190600160601b90046001600160a01b0316610b1384610f60565b915091509250929050565b336001600160a01b0386161480610b3a5750610b3a8533611019565b610b755760405162461bcd60e51b815260040180806020018281038252603c815260200180611e77603c913960400191505060405180910390fd5b6001600160a01b038416610bba5760405162461bcd60e51b815260040180806020018281038252603d815260200180611d18603d913960400191505060405180910390fd5b610bc685858585611260565b610bd4858585855a866115c4565b5050505050565b600081565b81518151606091908114610c255760405162461bcd60e51b8152600401808060200182810382526039815260200180611cdf6039913960400191505060405180910390fd5b600080610c4585600081518110610c3857fe5b6020026020010151610f76565b91509150600080600088600081518110610c5b57fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff81118015610cb557600080fd5b50604051908082528060200260200182016040528015610cdf578160200160208202803683370190505b509050610cec8385611047565b81600081518110610cf957fe5b602090810291909101015260015b86811015610dea57610d1e898281518110610c3857fe5b90965094508286141580610d6d5750898181518110610d3957fe5b60200260200101516001600160a01b03168a6001830381518110610d5957fe5b60200260200101516001600160a01b031614155b15610dc1576000808b8381518110610d8157fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008781526020019081526020016000205493508592505b610dcb8486611047565b828281518110610dd757fe5b6020908102919091010152600101610d07565b5098975050505050505050565b6002546001600160a01b03163314610e405760405162461bcd60e51b8152600401808060200182810382526026815260200180611f686026913960400191505060405180910390fd5b6000838152600360205260409020610e59908383611bc1565b50505050565b6002546001600160a01b031690565b60408051808201909152600a815269524553495354414e434560b01b602082015290565b6002546001600160a01b03163314610edb5760405162461bcd60e51b8152600401808060200182810382526026815260200180611f686026913960400191505060405180910390fd5b8051610eee906004906020840190611c4d565b5050565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6005546001600160601b03166127109091040290565b6008810491600790911690565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561100f5780601f10610fe45761010080835404028352916020019161100f565b820191906000526020600020905b815481529060010190602001808311610ff257829003601f168201915b5050505050905090565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b336001600160a01b038616148061107657506110768533611019565b6110b15760405162461bcd60e51b8152600401808060200182810382526037815260200180611db26037913960400191505060405180910390fd5b6001600160a01b0384166110f65760405162461bcd60e51b8152600401808060200182810382526038815260200180611f306038913960400191505060405180910390fd5b611102858585856117bc565b610bd4858585855a86611839565b6002546001600160a01b031633146111595760405162461bcd60e51b8152600401808060200182810382526026815260200180611f686026913960400191505060405180910390fd5b6001600160a01b03811661119e5760405162461bcd60e51b815260040180806020018281038252602a815260200180611d88602a913960400191505060405180910390fd5b6002546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000813f801580159061122d57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60006001600160e01b03198216636cdb3d1360e11b141561125757506001610998565b610995826119ab565b8151815181146112a15760405162461bcd60e51b8152600401808060200182810382526042815260200180611de96042913960600191505060405180910390fd5b836001600160a01b0316856001600160a01b0316141580156112c35750600081115b15611461576000806112db85600081518110610c3857fe5b6001600160a01b038916600090815260208181526040808320858452909152812054875193955091935091611326919084908890859061131757fe5b602002602001015160016119c4565b6001600160a01b0388166000908152602081815260408083208784529091528120548751929350909161136f919085908990859061136057fe5b602002602001015160006119c4565b90508360015b8681101561141c5761138c898281518110610c3857fe5b90965094508186146113ee576001600160a01b038b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b6113ff84868a848151811061131757fe5b935061141283868a848151811061136057fe5b9250600101611375565b50506001600160a01b03808a16600090815260208181526040808320888452825280832095909555918a168152808252838120958152949052922091909155506114e4565b60005b818110156114e25782818151811061147857fe5b602002602001015161149d8786848151811061149057fe5b6020026020010151610928565b10156114da5760405162461bcd60e51b8152600401808060200182810382526036815260200180611eb36036913960400191505060405180910390fd5b600101611464565b505b836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611569578181015183820152602001611551565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156115a8578181015183820152602001611590565b5050505090500194505050505060405180910390a45050505050565b6115d6856001600160a01b03166111fa565b156117b4576000856001600160a01b031663bc197c8184338a8989886040518763ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561166757818101518382015260200161164f565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156116a657818101518382015260200161168e565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156116e25781810151838201526020016116ca565b50505050905090810190601f16801561170f5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561173457600080fd5b5087f1158015611748573d6000803e3d6000fd5b50505050506040513d602081101561175f57600080fd5b505190506001600160e01b0319811663bc197c8160e01b146117b25760405162461bcd60e51b815260040180806020018281038252604c815260200180611e2b604c913960600191505060405180910390fd5b505b505050505050565b6117c98483836001611b54565b6117d68383836000611b54565b826001600160a01b0316846001600160a01b0316336001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b61184b856001600160a01b03166111fa565b156117b4576000856001600160a01b031663f23a6e6184338a8989886040518763ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156118dd5781810151838201526020016118c5565b50505050905090810190601f16801561190a5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561192d57600080fd5b5087f1158015611941573d6000803e3d6000fd5b50505050506040513d602081101561195857600080fd5b505190506001600160e01b0319811663f23a6e6160e01b146117b25760405162461bcd60e51b8152600401808060200182810382526047815260200180611ee96047913960600191505060405180910390fd5b6001600160e01b031981166301ffc9a760e01b14919050565b60006020840263ffffffff828460018111156119dc57fe5b1415611a755784821b8701925086831015611a285760405162461bcd60e51b8152600401808060200182810382526032815260200180611fd36032913960400191505060405180910390fd5b600160201b87831c8216860110611a705760405162461bcd60e51b8152600401808060200182810382526032815260200180611fd36032913960400191505060405180910390fd5b611b4a565b6001846001811115611a8357fe5b1415611b135784821b8703925086831115611acf5760405162461bcd60e51b8152600401808060200182810382526033815260200180611d556033913960400191505060405180910390fd5b84818389901c161015611a705760405162461bcd60e51b8152600401808060200182810382526033815260200180611d556033913960400191505060405180910390fd5b60405162461bcd60e51b8152600401808060200182810382526045815260200180611f8e6045913960600191505060405180910390fd5b5050949350505050565b600080611b6085610f76565b6001600160a01b0388166000908152602081815260408083208584529091529020549193509150611b93908286866119c4565b6001600160a01b03909616600090815260208181526040808320948352939052919091209490945550505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282611bf75760008555611c3d565b82601f10611c105782800160ff19823516178555611c3d565b82800160010185558215611c3d579182015b82811115611c3d578235825591602001919060010190611c22565b50611c49929150611cc9565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282611c835760008555611c3d565b82601f10611c9c57805160ff1916838001178555611c3d565b82800160010185558215611c3d579182015b82811115611c3d578251825591602001919060010190611cae565b5b80821115611c495760008155600101611cca56fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f574f776e61626c65237472616e736665724f776e6572736869703a20494e56414c49445f41444452455353455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544f776e61626c65236f6e6c794f776e65723a2053454e4445525f49535f4e4f545f4f574e4552455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a26469706673582212200fb733503f7d9c44f254b45e6f4a519a9496b110ada0c417512038c0dd20da1f64736f6c63430007040033

Deployed Bytecode Sourcemap

35335:2410:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24495:270;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24495:270:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;36973:173;;;;;;;;;;;;;;;;-1:-1:-1;36973:173:0;-1:-1:-1;;;;;;36973:173:0;;:::i;:::-;;;;;;;;;;;;;;;;;;36405:181;;;;;;;;;;;;;;;;-1:-1:-1;36405:181:0;;-1:-1:-1;;;;;36405:181:0;;;;;-1:-1:-1;;;;;36405:181:0;;:::i;:::-;;36202:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35464:33;;;:::i;36075:119::-;;;;;;;;;;;;;;;;-1:-1:-1;36075:119:0;;:::i;36594:221::-;;;;;;;;;;;;;;;;-1:-1:-1;36594:221:0;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;36594:221:0;;;;;;;;;;;;;;;;;;;;;18078:556;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18078:556:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18078:556:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18078:556:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18078:556:0;;;;;;;;-1:-1:-1;18078:556:0;;-1:-1:-1;;;;;18078:556:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18078:556:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18078:556:0;;;;;;;;-1:-1:-1;18078:556:0;;-1:-1:-1;;;;;18078:556:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18078:556:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18078:556:0;;-1:-1:-1;18078:556:0;;-1:-1:-1;;;;;18078:556:0:i;35426:31::-;;;:::i;25131:1042::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25131:1042:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25131:1042:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25131:1042:0;;;;;;;;-1:-1:-1;25131:1042:0;;-1:-1:-1;;;;;25131:1042:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25131:1042:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25131:1042:0;;-1:-1:-1;25131:1042:0;;-1:-1:-1;;;;;25131:1042:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35663:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35663:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35663:134:0;;;;;;;;;;-1:-1:-1;35663:134:0;;-1:-1:-1;35663:134:0;-1:-1:-1;35663:134:0;:::i;1958:74::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1958:74:0;;;;;;;;;;;;;;36305:92;;;:::i;35805:145::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35805:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35805:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35805:145:0;;-1:-1:-1;35805:145:0;;-1:-1:-1;;;;;35805:145:0:i;23472:236::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23472:236:0;;;;;;;;;;:::i;36823:142::-;;;;;;;;;;;;;;;;-1:-1:-1;36823:142:0;;:::i;28915:195::-;;;;;;;;;;;;;;;;-1:-1:-1;28915:195:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35958:105;;;:::i;23978:164::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23978:164:0;;;;;;;;;;:::i;29375:443::-;;;;;;;;;;;;;;;;-1:-1:-1;29375:443:0;;;;;;;:::i;16973:608::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16973:608:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16973:608:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16973:608:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16973:608:0;;-1:-1:-1;16973:608:0;;-1:-1:-1;;;;;16973:608:0:i;1658:232::-;;;;;;;;;;;;;;;;-1:-1:-1;1658:232:0;-1:-1:-1;;;;;1658:232:0;;:::i;24495:270::-;24578:7;24597:11;24615:13;24684:18;24698:3;24684:13;:18::i;:::-;-1:-1:-1;;;;;24730:16:0;;:8;:16;;;;;;;;;;;:21;;;;;;;;;24669:33;;-1:-1:-1;24669:33:0;-1:-1:-1;24716:43:0;;24669:33;24716:13;:43::i;:::-;24709:50;24495:270;-1:-1:-1;;;;;24495:270:0:o;36973:173::-;37050:4;-1:-1:-1;;;;;;;;;37073:25:0;;;;:65;;;37102:36;37126:11;37102:23;:36::i;:::-;37066:72;;36973:173;;;;:::o;36405:181::-;1457:7;;-1:-1:-1;;;;;1457:7:0;1443:10;:21;1435:72;;;;-1:-1:-1;;;1435:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36503:14:::1;:26:::0;;-1:-1:-1;;;;;36540:38:0;;::::1;-1:-1:-1::0;;;;;36503:26:0;;::::1;-1:-1:-1::0;;;36503:26:0::1;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;;36540:38:0::1;::::0;;;::::1;::::0;;36405:181::o;36202:95::-;36265:24;;;;;;;;;;;;-1:-1:-1;;;36265:24:0;;;;36202:95;:::o;35464:33::-;35496:1;35464:33;:::o;36075:119::-;36167:19;;;;:9;:19;;;;;;;;;36160:26;;;;;;-1:-1:-1;;36160:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36134:13;;36160:26;;;36167:19;36160:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36075:119;;;:::o;36594:221::-;36762:14;;36720:7;;;;-1:-1:-1;;;36762:14:0;;-1:-1:-1;;;;;36762:14:0;36778:28;36795:10;36778:16;:28::i;:::-;36754:53;;;;36594:221;;;;;:::o;18078:556::-;18268:10;-1:-1:-1;;;;;18268:19:0;;;;18267:60;;;18292:35;18309:5;18316:10;18292:16;:35::i;:::-;18259:133;;;;-1:-1:-1;;;18259:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18407:17:0;;18399:90;;;;-1:-1:-1;;;18399:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18498:50;18521:5;18528:3;18533:4;18539:8;18498:22;:50::i;:::-;18555:73;18583:5;18590:3;18595:4;18601:8;18611:9;18622:5;18555:27;:73::i;:::-;18078:556;;;;;:::o;35426:31::-;35456:1;35426:31;:::o;25131:1042::-;25286:14;;25327:11;;25239:16;;25286:14;25315:23;;25307:93;;;;-1:-1:-1;;;25307:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25431:11;25444:13;25461:22;25475:4;25480:1;25475:7;;;;;;;;;;;;;;25461:13;:22::i;:::-;25430:53;;;;25490:19;25512:8;:20;25521:7;25529:1;25521:10;;;;;;;;;;;;;;-1:-1:-1;;;;;25512:20:0;-1:-1:-1;;;;;25512:20:0;;;;;;;;;;;;:25;25533:3;25512:25;;;;;;;;;;;;25490:47;;25544:16;25563:3;25544:22;;25598:30;25645:8;25631:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25631:23:0;;25598:56;;25680:33;25694:11;25707:5;25680:13;:33::i;:::-;25661:13;25675:1;25661:16;;;;;;;;;;;;;;;;;:52;25784:1;25767:372;25791:8;25787:1;:12;25767:372;;;25830:22;25844:4;25849:1;25844:7;;;;;;;25830:22;25815:37;;-1:-1:-1;25815:37:0;-1:-1:-1;25937:15:0;;;;;:45;;;25972:7;25980:1;25972:10;;;;;;;;;;;;;;-1:-1:-1;;;;;25956:26:0;:7;25966:1;25964;:3;25956:12;;;;;;;;;;;;;;-1:-1:-1;;;;;25956:26:0;;;25937:45;25933:136;;;26009:8;:20;26018:7;26026:1;26018:10;;;;;;;;;;;;;;-1:-1:-1;;;;;26009:20:0;-1:-1:-1;;;;;26009:20:0;;;;;;;;;;;;:25;26030:3;26009:25;;;;;;;;;;;;25995:39;;26056:3;26045:14;;25933:136;26098:33;26112:11;26125:5;26098:13;:33::i;:::-;26079:13;26093:1;26079:16;;;;;;;;;;;;;;;;;:52;25801:3;;25767:372;;;-1:-1:-1;26154:13:0;25131:1042;-1:-1:-1;;;;;;;;25131:1042:0:o;35663:134::-;1457:7;;-1:-1:-1;;;;;1457:7:0;1443:10;:21;1435:72;;;;-1:-1:-1;;;1435:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35756:19:::1;::::0;;;:9:::1;:19;::::0;;;;:33:::1;::::0;35778:11;;35756:33:::1;:::i;:::-;;35663:134:::0;;;:::o;1958:74::-;2019:7;;-1:-1:-1;;;;;2019:7:0;1958:74;:::o;36305:92::-;36370:19;;;;;;;;;;;;-1:-1:-1;;;36370:19:0;;;;36305:92;:::o;35805:145::-;1457:7;;-1:-1:-1;;;;;1457:7:0;1443:10;:21;1435:72;;;;-1:-1:-1;;;1435:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35900:42;;::::1;::::0;:20:::1;::::0;:42:::1;::::0;::::1;::::0;::::1;:::i;:::-;;35805:145:::0;:::o;23472:236::-;23608:10;23598:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;23598:32:0;;;;;;;;;;;;:44;;-1:-1:-1;;23598:44:0;;;;;;;;;;23654:48;;;;;;;23598:32;;23608:10;23654:48;;;;;;;;;;;23472:236;;:::o;36823:142::-;36940:17;;-1:-1:-1;;;;;36940:17:0;36931:5;36918:18;;;36917:40;;36823:142::o;28915:195::-;16094:19;29021:21;;;29057;;;;;28915:195::o;35958:105::-;36035:20;36028:27;;;;;;;;-1:-1:-1;;36028:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36002:13;;36028:27;;36035:20;;36028:27;;36035:20;36028:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35958:105;:::o;23978:164::-;-1:-1:-1;;;;;24108:17:0;;;24074:15;24108:17;;;:9;:17;;;;;;;;:28;;;;;;;;;;;;;;;23978:164::o;29375:443::-;15983:2;29743:22;;29780:24;;;29659:33;29779;29375:443;;;;:::o;16973:608::-;17138:10;-1:-1:-1;;;;;17138:19:0;;;;17137:60;;;17162:35;17179:5;17186:10;17162:16;:35::i;:::-;17129:128;;;;-1:-1:-1;;;17129:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17272:17:0;;17264:85;;;;-1:-1:-1;;;17264:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17459:43;17477:5;17484:3;17489;17494:7;17459:17;:43::i;:::-;17509:66;17532:5;17539:3;17544;17549:7;17558:9;17569:5;17509:22;:66::i;1658:232::-;1457:7;;-1:-1:-1;;;;;1457:7:0;1443:10;:21;1435:72;;;;-1:-1:-1;;;1435:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1736:23:0;::::1;1728:78;;;;-1:-1:-1::0;;;1728:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1839:7;::::0;1818:40:::1;::::0;-1:-1:-1;;;;;1818:40:0;;::::1;::::0;1839:7:::1;::::0;1818:40:::1;::::0;1839:7:::1;::::0;1818:40:::1;1865:7;:19:::0;;-1:-1:-1;;;;;;1865:19:0::1;-1:-1:-1::0;;;;;1865:19:0;;;::::1;::::0;;;::::1;::::0;;1658:232::o;2635:405::-;2696:4;2953:21;;2990:15;;;;;:43;;-1:-1:-1;2292:66:0;3009:24;;;2990:43;2982:52;2635:405;-1:-1:-1;;;2635:405:0:o;30167:248::-;30270:4;-1:-1:-1;;;;;;30287:42:0;;-1:-1:-1;;;30287:42:0;30283:76;;;-1:-1:-1;30347:4:0;30340:11;;30283:76;30372:37;30396:12;30372:23;:37::i;20431:1990::-;20585:11;;20657:15;;20644:28;;20636:107;;;;-1:-1:-1;;;20636:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20765:3;-1:-1:-1;;;;;20756:12:0;:5;-1:-1:-1;;;;;20756:12:0;;;:29;;;;;20784:1;20772:9;:13;20756:29;20752:1578;;;20866:11;20879:13;20896:22;20910:4;20915:1;20910:7;;;;;;;20896:22;-1:-1:-1;;;;;21045:15:0;;21007;21045;;;;;;;;;;;:20;;;;;;;;;21074:11;;20865:53;;-1:-1:-1;20865:53:0;;-1:-1:-1;21007:15:0;21025:77;;21045:20;20865:53;;21074:8;;21007:15;;21074:11;;;;;;;;;;21087:14;21025:19;:77::i;:::-;-1:-1:-1;;;;;21147:13:0;;21111;21147;;;;;;;;;;;:18;;;;;;;;;21174:11;;21007:95;;-1:-1:-1;21111:13:0;;21127:75;;21147:18;21167:5;;21174:8;;21111:13;;21174:11;;;;;;;;;;21187:14;21127:19;:75::i;:::-;21111:91;-1:-1:-1;21258:3:0;21289:1;21272:668;21296:9;21292:1;:13;21272:668;;;21338:22;21352:4;21357:1;21352:7;;;;;;;21338:22;21323:37;;-1:-1:-1;21323:37:0;-1:-1:-1;21400:14:0;;;21396:333;;-1:-1:-1;;;;;21482:15:0;;;:8;:15;;;;;;;;;;;:24;;;;;;;;;:34;;;;21529:13;;;;;;;;;;;:22;;;;;;;;;:30;;;;21584:20;;;;;;;;;;21625:18;;;;;;;;;;21584:20;;21396:333;21785:64;21805:7;21814:5;21821:8;21830:1;21821:11;;;;;;;21785:64;21775:74;;21868:62;21888:5;21895;21902:8;21911:1;21902:11;;;;;;;21868:62;21860:70;-1:-1:-1;21307:3:0;;21272:668;;;-1:-1:-1;;;;;;;21999:15:0;;;:8;:15;;;;;;;;;;;:20;;;;;;;;:30;;;;22038:13;;;;;;;;;;;:18;;;;;;;;:26;;;;-1:-1:-1;20752:1578:0;;;22160:9;22155:168;22179:9;22175:1;:13;22155:168;;;22243:8;22252:1;22243:11;;;;;;;;;;;;;;22214:25;22224:5;22231:4;22236:1;22231:7;;;;;;;;;;;;;;22214:9;:25::i;:::-;:40;;22206:107;;;;-1:-1:-1;;;22206:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22190:3;;22155:168;;;;20752:1578;22395:3;-1:-1:-1;;;;;22362:53:0;22388:5;-1:-1:-1;;;;;22362:53:0;22376:10;-1:-1:-1;;;;;22362:53:0;;22400:4;22406:8;22362:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20431:1990;;;;;:::o;22539:524::-;22764:16;:3;-1:-1:-1;;;;;22764:14:0;;:16::i;:::-;22760:298;;;22791:13;22829:3;-1:-1:-1;;;;;22807:49:0;;22862:9;22873:10;22885:5;22892:4;22898:8;22908:5;22807:107;;;;;;;;;;;;;-1:-1:-1;;;;;22807:107:0;;;;;;-1:-1:-1;;;;;22807:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22807:107:0;;-1:-1:-1;;;;;;;22931:38:0;;-1:-1:-1;;;22931:38:0;22923:127;;;;-1:-1:-1;;;22923:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22760:298;;22539:524;;;;;;:::o;19038:394::-;19170:53;19187:5;19194:3;19199:7;19208:14;19170:16;:53::i;:::-;19261;19278:3;19285;19290:7;19299:14;19261:16;:53::i;:::-;19408:3;-1:-1:-1;;;;;19374:52:0;19401:5;-1:-1:-1;;;;;19374:52:0;19389:10;-1:-1:-1;;;;;19374:52:0;;19413:3;19418:7;19374:52;;;;;;;;;;;;;;;;;;;;;;;;19038:394;;;;:::o;19545:476::-;19741:16;:3;-1:-1:-1;;;;;19741:14:0;;:16::i;:::-;19737:279;;;19768:13;19806:3;-1:-1:-1;;;;;19784:44:0;;19833:9;19844:10;19856:5;19863:3;19868:7;19877:5;19784:99;;;;;;;;;;;;;-1:-1:-1;;;;;19784:99:0;;;;;;-1:-1:-1;;;;;19784:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19784:99:0;;-1:-1:-1;;;;;;;19900:32:0;;-1:-1:-1;;;19900:32:0;19892:116;;;;-1:-1:-1;;;19892:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3930:159;-1:-1:-1;;;;;;4036:47:0;;-1:-1:-1;;;4036:47:0;3930:159;;;:::o;27544:1189::-;27677:20;15983:2;27725:22;;27769:33;27677:20;27815:10;:28;;;;;;;;;27811:889;;;27883:16;;;27869:31;;;-1:-1:-1;27917:26:0;;;;27909:89;;;;-1:-1:-1;;;27909:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28027:19:0;;;28026:28;;28025:40;;:59;28007:184;;;;-1:-1:-1;;;28007:184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27811:889;;;28225:14;28211:10;:28;;;;;;;;;28207:493;;;28279:16;;;28265:31;;;-1:-1:-1;28313:26:0;;;;28305:90;;;;-1:-1:-1;;;28305:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28456:7;28447:4;28438:5;28424:10;:19;;28423:28;28422:41;;28404:167;;;;-1:-1:-1;;;28404:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28207:493;28596:79;;-1:-1:-1;;;28596:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28207:493;28708:19;;27544:1189;;;;;;:::o;26703:363::-;26824:11;26842:13;26912:18;26926:3;26912:13;:18::i;:::-;-1:-1:-1;;;;;27008:18:0;;:8;:18;;;;;;;;;;;:23;;;;;;;;;26897:33;;-1:-1:-1;26897:33:0;-1:-1:-1;26988:72:0;;26897:33;27040:7;27049:10;26988:19;:72::i;:::-;-1:-1:-1;;;;;26962:18:0;;;:8;:18;;;;;;;;;;;:23;;;;;;;;;;:98;;;;-1:-1:-1;;;;26703:363:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://0fb733503f7d9c44f254b45e6f4a519a9496b110ada0c417512038c0dd20da1f
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.