Contract 0x0fEE96B8d44C0fD9E6D6472531E2aD159CCba73d

 
Ad
Ad
Txn Hash
Block
From
To
Value [Txn Fee]
0xfb49549f33239a392dd5708b9768ac13c58cdfcf22d99e3da36b8d504476621963698152021-04-07 21:56:194 days 21 hrs ago0xb17d6b2653881d228d6cf2c076d2f2e044b799c4 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.0069611
0x92d13a49aa64dba6eae3b4b7520636b0fd93db0e965e5f901965b647b8b2785b63697972021-04-07 21:55:254 days 21 hrs ago0xb17d6b2653881d228d6cf2c076d2f2e044b799c4 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.0069611
0x155e6ab27917c2eadb81d7c2cc979b55f16caff304d3f5eee99567fed44cc82c63679732021-04-07 20:23:114 days 22 hrs ago0xb17d6b2653881d228d6cf2c076d2f2e044b799c4 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.0992376
0xc94126d7f3adb21b6f46df26a245b173515949a9214544805f7dc4b46288389863679512021-04-07 20:22:054 days 22 hrs ago0xb17d6b2653881d228d6cf2c076d2f2e044b799c4 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.15381828
0xe1d6a253745a87c25050a0ad1c285b9dd54e9d1f43d7de5fb182fa15aefe32f063050392021-04-05 14:30:257 days 4 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0x059b2127c5c26dbdfc14b1371777d67f5da33d452c911a05f6c862ba24af2e7963050312021-04-05 14:30:017 days 4 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0x422ecf91a0062964e41c3373c2374dd9891a0dd628678e6aec5fd126830a86f363050242021-04-05 14:29:407 days 4 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0x42fb54a97688e944ed65ee2db494d9c47cdd4aeb869106c99dac2aa0e30d491263050142021-04-05 14:29:107 days 4 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0x722d351c0f04999360869ee8eeb85c40686357cadb8038c77ed97f6fa2d89e3f63050012021-04-05 14:28:317 days 4 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0x074b9f03dc09584f07a19f9d02dc182bec79b1e406e076f0c0a4d376312eb22b63049952021-04-05 14:28:137 days 4 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0x2cda2d6e9f604ae9487b67aa59de9063c14d2eb80a5fb07658f44d53ad69abf463049852021-04-05 14:27:437 days 4 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0x126d3dd5a8ab7d1dc89443fa5afeab72c68e9696eaf059847e7d1b214e1a14d463049732021-04-05 14:27:057 days 4 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0x60f5d0a5686250c7be30ff67bce527c3983a7b2f862859b6e82bbb5e6ce5ead163049612021-04-05 14:26:217 days 4 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0x65c6c94bd50c907171068fe2aeeeed1203971c598fca1f7b1e504a2e1f28e33763049532021-04-05 14:25:557 days 4 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0x9cf46c813d136ddbe5f9a4be3e43092ecb120d696b174ec813519a50b0d64a0563049422021-04-05 14:25:227 days 4 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0x704fa771bad2d3802df840c3ded0e8023942712baa6ad91df428dbba4013caba63049342021-04-05 14:24:587 days 4 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0x4eb85f67f64132c0e264f09d11385656b3c5f86862812da2e99452896176546463049072021-04-05 14:23:377 days 4 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0xa43b4bc2373cade1a23f1804fd3f7c00e79bc309ae52e7796f65d8770986c85963048912021-04-05 14:22:497 days 4 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0xcb82a53ac10b06c866a764416421697e9d635f4718c935ec0f6a2ee67335f47f63043532021-04-05 13:54:137 days 5 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0x2f68423b8c63f8fc3e2abfafe52d653dcd6767f751f2d59e45a8fc8c350c5e3f63043432021-04-05 13:53:437 days 5 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0xebf9bbd18222918e0aa845462d08607b5dbd8ea334b9f46e392278a3bf0dfefd63043352021-04-05 13:53:197 days 5 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0xae3cd9faf5c4a57ef751c9a5141296ee260d18a19633c876ea8bb4bc3c98c17563037862021-04-05 13:25:087 days 5 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0xabfb8523fe94e04f4b36b78e3cc1d4647351c02149f87d12517b8cb7831a66c663037692021-04-05 13:24:177 days 5 hrs ago0x724cf13e6f27d4ec2282cf24454015f8d2a6fca3 IN  0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d0 BNB0.00992376
0x34a32723cc200a470c0393256d76686973af0a80b4d7424ae86122068aa6cc3859408882021-03-23 20:12:4719 days 22 hrs ago0x7f18bb4dd92cf2404c54cba1a9be4a1153bdb078 IN  Contract Creation0 BNB0.03125029
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
0xd650957c37328181175b06462f3eeed0c1a0b07e426334c820628ce63a12d16963976612021-04-08 22:13:043 days 20 hrs ago 0x0fee96b8d44c0fd9e6d6472531e2ad159ccba73d  Contract Creation0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Indexer

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-04-01
*/

pragma solidity 0.5.16;
pragma experimental ABIEncoderV2;
// File: openzeppelin-solidity/contracts/GSN/Context.sol
/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks
    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }
    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
// File: openzeppelin-solidity/contracts/ownership/Ownable.sol
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        _owner = _msgSender();
        emit OwnershipTransferred(address(0), _owner);
    }
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }
    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }
    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }
    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}
// File: contracts/Index.sol
/*
  Copyright 2020 Swap Holdings Ltd.
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/
/**
 * @title Index: A List of Locators
 * @notice The Locators are sorted in reverse order based on the score
 * meaning that the first element in the list has the largest score
 * and final element has the smallest
 * @dev A mapping is used to mimic a circular linked list structure
 * where every mapping Entry contains a pointer to the next
 * and the previous
 */
contract Index is Ownable {
  /**
   * @notice Index Entry
   * @param score uint256
   * @param locator bytes32
   * @param prev address Previous address in the linked list
   * @param next address Next address in the linked list
   */
  struct Entry {
    bytes32 locator;
    uint256 score;
    address prev;
    address next;
  }
  // The number of entries in the index
  uint256 public length;
  // Identifier to use for the head of the list
  address internal constant HEAD = address(uint160(2**160 - 1));
  // Mapping of an identifier to its entry
  mapping(address => Entry) public entries;
  /**
   * @notice Contract Events
   */
  event SetLocator(
    address indexed identifier,
    uint256 score,
    bytes32 indexed locator
  );
  event UnsetLocator(address indexed identifier);
  /**
   * @notice Contract Constructor
   */
  constructor() public {
    // Create initial entry.
    entries[HEAD] = Entry(bytes32(0), 0, HEAD, HEAD);
  }
  /**
   * @notice Set a Locator
   * @param identifier address On-chain address identifying the owner of a locator
   * @param score uint256 Score for the locator being set
   * @param locator bytes32 Locator
   */
  function setLocator(
    address identifier,
    uint256 score,
    bytes32 locator
  ) external onlyOwner {
    // Ensure the entry does not already exist.
    require(!_hasEntry(identifier), "ENTRY_ALREADY_EXISTS");
    _setLocator(identifier, score, locator);
    // Increment the index length.
    length = length + 1;
    emit SetLocator(identifier, score, locator);
  }
  /**
   * @notice Unset a Locator
   * @param identifier address On-chain address identifying the owner of a locator
   */
  function unsetLocator(address identifier) external onlyOwner {
    _unsetLocator(identifier);
    // Decrement the index length.
    length = length - 1;
    emit UnsetLocator(identifier);
  }
  /**
   * @notice Update a Locator
   * @dev score and/or locator do not need to be different from old values
   * @param identifier address On-chain address identifying the owner of a locator
   * @param score uint256 Score for the locator being set
   * @param locator bytes32 Locator
   */
  function updateLocator(
    address identifier,
    uint256 score,
    bytes32 locator
  ) external onlyOwner {
    // Don't need to update length as it is not used in set/unset logic
    _unsetLocator(identifier);
    _setLocator(identifier, score, locator);
    emit SetLocator(identifier, score, locator);
  }
  /**
   * @notice Get a Score
   * @param identifier address On-chain address identifying the owner of a locator
   * @return uint256 Score corresponding to the identifier
   */
  function getScore(address identifier) external view returns (uint256) {
    return entries[identifier].score;
  }
  /**
   * @notice Get a Locator
   * @param identifier address On-chain address identifying the owner of a locator
   * @return bytes32 Locator information
   */
  function getLocator(address identifier) external view returns (bytes32) {
    return entries[identifier].locator;
  }
  /**
   * @notice Get a Range of Locators
   * @dev start value of 0x0 starts at the head
   * @param cursor address Cursor to start with
   * @param limit uint256 Maximum number of locators to return
   * @return bytes32[] List of locators
   * @return uint256[] List of scores corresponding to locators
   * @return address The next cursor to provide for pagination
   */
  function getLocators(address cursor, uint256 limit)
    external
    view
    returns (
      bytes32[] memory locators,
      uint256[] memory scores,
      address nextCursor
    )
  {
    address identifier;
    // If a valid cursor is provided, start there.
    if (cursor != address(0) && cursor != HEAD) {
      // Check that the provided cursor exists.
      if (!_hasEntry(cursor)) {
        return (new bytes32[](0), new uint256[](0), address(0));
      }
      // Set the starting identifier to the provided cursor.
      identifier = cursor;
    } else {
      identifier = entries[HEAD].next;
    }
    // Although it's not known how many entries are between `cursor` and the end
    // We know that it is no more than `length`
    uint256 size = (length < limit) ? length : limit;
    locators = new bytes32[](size);
    scores = new uint256[](size);
    // Iterate over the list until the end or size.
    uint256 i;
    while (i < size && identifier != HEAD) {
      locators[i] = entries[identifier].locator;
      scores[i] = entries[identifier].score;
      i = i + 1;
      identifier = entries[identifier].next;
    }
    return (locators, scores, identifier);
  }
  /**
   * @notice Internal function to set a Locator
   * @param identifier address On-chain address identifying the owner of a locator
   * @param score uint256 Score for the locator being set
   * @param locator bytes32 Locator
   */
  function _setLocator(
    address identifier,
    uint256 score,
    bytes32 locator
  ) internal {
    // Disallow locator set to 0x0 to ensure list integrity.
    require(locator != bytes32(0), "LOCATOR_MUST_BE_SENT");
    // Find the first entry with a lower score.
    address nextEntry = _getEntryLowerThan(score);
    // Link the new entry between previous and next.
    address prevEntry = entries[nextEntry].prev;
    entries[prevEntry].next = identifier;
    entries[nextEntry].prev = identifier;
    entries[identifier] = Entry(locator, score, prevEntry, nextEntry);
  }
  /**
   * @notice Internal function to unset a Locator
   * @param identifier address On-chain address identifying the owner of a locator
   */
  function _unsetLocator(address identifier) internal {
    // Ensure the entry exists.
    require(_hasEntry(identifier), "ENTRY_DOES_NOT_EXIST");
    // Link the previous and next entries together.
    address prevUser = entries[identifier].prev;
    address nextUser = entries[identifier].next;
    entries[prevUser].next = nextUser;
    entries[nextUser].prev = prevUser;
    // Delete entry from the index.
    delete entries[identifier];
  }
  /**
   * @notice Check if the Index has an Entry
   * @param identifier address On-chain address identifying the owner of a locator
   * @return bool True if the identifier corresponds to an Entry in the list
   */
  function _hasEntry(address identifier) internal view returns (bool) {
    return entries[identifier].locator != bytes32(0);
  }
  /**
   * @notice Returns the largest scoring Entry Lower than a Score
   * @param score uint256 Score in question
   * @return address Identifier of the largest score lower than score
   */
  function _getEntryLowerThan(uint256 score) internal view returns (address) {
    address identifier = entries[HEAD].next;
    // Head indicates last because the list is circular.
    if (score == 0) {
      return HEAD;
    }
    // Iterate until a lower score is found.
    while (score <= entries[identifier].score) {
      identifier = entries[identifier].next;
    }
    return identifier;
  }
}
// File: @airswap/indexer/contracts/interfaces/IIndexer.sol
/*
  Copyright 2020 Swap Holdings Ltd.
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/
interface IIndexer {
  event CreateIndex(
    address indexed signerToken,
    address indexed senderToken,
    bytes2 protocol,
    address indexAddress
  );
  event Stake(
    address indexed staker,
    address indexed signerToken,
    address indexed senderToken,
    bytes2 protocol,
    uint256 stakeAmount
  );
  event Unstake(
    address indexed staker,
    address indexed signerToken,
    address indexed senderToken,
    bytes2 protocol,
    uint256 stakeAmount
  );
  event AddTokenToBlacklist(address token);
  event RemoveTokenFromBlacklist(address token);
  function setLocatorWhitelist(bytes2 protocol, address newLocatorWhitelist)
    external;
  function createIndex(
    address signerToken,
    address senderToken,
    bytes2 protocol
  ) external returns (address);
  function addTokenToBlacklist(address token) external;
  function removeTokenFromBlacklist(address token) external;
  function setIntent(
    address signerToken,
    address senderToken,
    bytes2 protocol,
    uint256 stakingAmount,
    bytes32 locator
  ) external;
  function unsetIntent(
    address signerToken,
    address senderToken,
    bytes2 protocol
  ) external;
  function stakingToken() external view returns (address);
  function indexes(
    address,
    address,
    bytes2
  ) external view returns (address);
  function tokenBlacklist(address) external view returns (bool);
  function getStakedAmount(
    address user,
    address signerToken,
    address senderToken,
    bytes2 protocol
  ) external view returns (uint256);
  function getLocators(
    address signerToken,
    address senderToken,
    bytes2 protocol,
    address cursor,
    uint256 limit
  )
    external
    view
    returns (
      bytes32[] memory,
      uint256[] memory,
      address
    );
}
// File: @airswap/indexer/contracts/interfaces/ILocatorWhitelist.sol
/*
  Copyright 2020 Swap Holdings Ltd.
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/
interface ILocatorWhitelist {
  function has(bytes32 locator) external view returns (bool);
}
// File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol
/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);
    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);
    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);
    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);
    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);
    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);
    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: contracts/Indexer.sol
/*
  Copyright 2020 Swap Holdings Ltd.
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/
/**
 * @title Indexer: A Collection of Index contracts by Token Pair
 */
contract Indexer is IIndexer, Ownable {
  // Token to be used for staking (ERC-20)
  IERC20 public stakingToken;
  // Mapping of signer token to sender token to protocol type to index
  mapping(address => mapping(address => mapping(bytes2 => Index)))
    public indexes;
  // The whitelist contract for checking whether a peer is whitelisted per peer type
  mapping(bytes2 => address) public locatorWhitelists;
  // Mapping of token address to boolean
  mapping(address => bool) public tokenBlacklist;
  /**
   * @notice Contract Constructor
   * @param indexerStakingToken address
   */
  constructor(address indexerStakingToken) public {
    stakingToken = IERC20(indexerStakingToken);
  }
  /**
   * @notice Modifier to check an index exists
   */
  modifier indexExists(
    address signerToken,
    address senderToken,
    bytes2 protocol
  ) {
    require(
      indexes[signerToken][senderToken][protocol] != Index(0),
      "INDEX_DOES_NOT_EXIST"
    );
    _;
  }
  /**
   * @notice Set the address of an ILocatorWhitelist to use
   * @dev Allows removal of locatorWhitelist by passing 0x0
   * @param protocol bytes2 Protocol type for locators
   * @param newLocatorWhitelist address Locator whitelist
   */
  function setLocatorWhitelist(bytes2 protocol, address newLocatorWhitelist)
    external
    onlyOwner
  {
    locatorWhitelists[protocol] = newLocatorWhitelist;
  }
  /**
   * @notice Create an Index (List of Locators for a Token Pair)
   * @dev Deploys a new Index contract and stores the address. If the Index already
   * @dev exists, returns its address, and does not emit a CreateIndex event
   * @param signerToken address Signer token for the Index
   * @param senderToken address Sender token for the Index
   * @param protocol bytes2 Protocol type for locators in Index
   */
  function createIndex(
    address signerToken,
    address senderToken,
    bytes2 protocol
  ) external returns (address) {
    // If the Index does not exist, create it.
    if (indexes[signerToken][senderToken][protocol] == Index(0)) {
      // Create a new Index contract for the token pair.
      indexes[signerToken][senderToken][protocol] = new Index();
      emit CreateIndex(
        signerToken,
        senderToken,
        protocol,
        address(indexes[signerToken][senderToken][protocol])
      );
    }
    // Return the address of the Index contract.
    return address(indexes[signerToken][senderToken][protocol]);
  }
  /**
   * @notice Add a Token to the Blacklist
   * @param token address Token to blacklist
   */
  function addTokenToBlacklist(address token) external onlyOwner {
    if (!tokenBlacklist[token]) {
      tokenBlacklist[token] = true;
      emit AddTokenToBlacklist(token);
    }
  }
  /**
   * @notice Remove a Token from the Blacklist
   * @param token address Token to remove from the blacklist
   */
  function removeTokenFromBlacklist(address token) external onlyOwner {
    if (tokenBlacklist[token]) {
      tokenBlacklist[token] = false;
      emit RemoveTokenFromBlacklist(token);
    }
  }
  /**
   * @notice Set an Intent to Trade
   * @dev Requires approval to transfer staking token for sender
   *
   * @param signerToken address Signer token of the Index being staked
   * @param senderToken address Sender token of the Index being staked
   * @param protocol bytes2 Protocol type for locator in Intent
   * @param stakingAmount uint256 Amount being staked
   * @param locator bytes32 Locator of the staker
   */
  function setIntent(
    address signerToken,
    address senderToken,
    bytes2 protocol,
    uint256 stakingAmount,
    bytes32 locator
  ) external indexExists(signerToken, senderToken, protocol) {
    // If whitelist set, ensure the locator is valid.
    if (locatorWhitelists[protocol] != address(0)) {
      require(
        ILocatorWhitelist(locatorWhitelists[protocol]).has(locator),
        "LOCATOR_NOT_WHITELISTED"
      );
    }
    // Ensure neither of the tokens are blacklisted.
    require(
      !tokenBlacklist[signerToken] && !tokenBlacklist[senderToken],
      "PAIR_IS_BLACKLISTED"
    );
    bool notPreviouslySet =
      (indexes[signerToken][senderToken][protocol].getLocator(msg.sender) ==
        bytes32(0));
    if (notPreviouslySet) {
      // Only transfer for staking if stakingAmount is set.
      if (stakingAmount > 0) {
        // Transfer the stakingAmount for staking.
        require(
          stakingToken.transferFrom(msg.sender, address(this), stakingAmount),
          "STAKING_FAILED"
        );
      }
      // Set the locator on the index.
      indexes[signerToken][senderToken][protocol].setLocator(
        msg.sender,
        stakingAmount,
        locator
      );
      emit Stake(msg.sender, signerToken, senderToken, protocol, stakingAmount);
    } else {
      uint256 oldStake =
        indexes[signerToken][senderToken][protocol].getScore(msg.sender);
      _updateIntent(
        msg.sender,
        signerToken,
        senderToken,
        protocol,
        stakingAmount,
        locator,
        oldStake
      );
    }
  }
  /**
   * @notice Unset an Intent to Trade
   * @dev Users are allowed to unstake from blacklisted indexes
   *
   * @param signerToken address Signer token of the Index being unstaked
   * @param senderToken address Sender token of the Index being staked
   * @param protocol bytes2 Protocol type for locators in Intent
   */
  function unsetIntent(
    address signerToken,
    address senderToken,
    bytes2 protocol
  ) external {
    _unsetIntent(msg.sender, signerToken, senderToken, protocol);
  }
  /**
   * @notice Get the locators of those trading a token pair
   * @dev Users are allowed to unstake from blacklisted indexes
   *
   * @param signerToken address Signer token of the trading pair
   * @param senderToken address Sender token of the trading pair
   * @param protocol bytes2 Protocol type for locators in Intent
   * @param cursor address Address to start from
   * @param limit uint256 Total number of locators to return
   * @return bytes32[] List of locators
   * @return uint256[] List of scores corresponding to locators
   * @return address The next cursor to provide for pagination
   */
  function getLocators(
    address signerToken,
    address senderToken,
    bytes2 protocol,
    address cursor,
    uint256 limit
  )
    external
    view
    returns (
      bytes32[] memory locators,
      uint256[] memory scores,
      address nextCursor
    )
  {
    // Ensure neither token is blacklisted.
    if (tokenBlacklist[signerToken] || tokenBlacklist[senderToken]) {
      return (new bytes32[](0), new uint256[](0), address(0));
    }
    // Ensure the index exists.
    if (indexes[signerToken][senderToken][protocol] == Index(0)) {
      return (new bytes32[](0), new uint256[](0), address(0));
    }
    return
      indexes[signerToken][senderToken][protocol].getLocators(cursor, limit);
  }
  /**
   * @notice Gets the Stake Amount for a User
   * @param user address User who staked
   * @param signerToken address Signer token the user staked on
   * @param senderToken address Sender token the user staked on
   * @param protocol bytes2 Protocol type for locators in Intent
   * @return uint256 Amount the user staked
   */
  function getStakedAmount(
    address user,
    address signerToken,
    address senderToken,
    bytes2 protocol
  ) public view returns (uint256 stakedAmount) {
    if (indexes[signerToken][senderToken][protocol] == Index(0)) {
      return 0;
    }
    // Return the score, equivalent to the stake amount.
    return indexes[signerToken][senderToken][protocol].getScore(user);
  }
  function _updateIntent(
    address user,
    address signerToken,
    address senderToken,
    bytes2 protocol,
    uint256 newAmount,
    bytes32 newLocator,
    uint256 oldAmount
  ) internal {
    // If the new stake is bigger, collect the difference.
    if (oldAmount < newAmount) {
      // Note: SafeMath not required due to the inequality check above
      require(
        stakingToken.transferFrom(user, address(this), newAmount - oldAmount),
        "STAKING_FAILED"
      );
    }
    // If the old stake is bigger, return the excess.
    if (newAmount < oldAmount) {
      // Note: SafeMath not required due to the inequality check above
      require(stakingToken.transfer(user, oldAmount - newAmount));
    }
    // Update their intent.
    indexes[signerToken][senderToken][protocol].updateLocator(
      user,
      newAmount,
      newLocator
    );
    emit Stake(user, signerToken, senderToken, protocol, newAmount);
  }
  /**
   * @notice Unset intents and return staked tokens
   * @param user address Address of the user who staked
   * @param signerToken address Signer token of the trading pair
   * @param senderToken address Sender token of the trading pair
   * @param protocol bytes2 Protocol type for locators in Intent
   */
  function _unsetIntent(
    address user,
    address signerToken,
    address senderToken,
    bytes2 protocol
  ) internal indexExists(signerToken, senderToken, protocol) {
    // Get the score for the user.
    uint256 score = indexes[signerToken][senderToken][protocol].getScore(user);
    // Unset the locator on the index.
    indexes[signerToken][senderToken][protocol].unsetLocator(user);
    if (score > 0) {
      // Return the staked tokens. Reverts on failure.
      require(stakingToken.transfer(user, score));
    }
    emit Unstake(user, signerToken, senderToken, protocol, score);
  }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"indexerStakingToken","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"AddTokenToBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signerToken","type":"address"},{"indexed":true,"internalType":"address","name":"senderToken","type":"address"},{"indexed":false,"internalType":"bytes2","name":"protocol","type":"bytes2"},{"indexed":false,"internalType":"address","name":"indexAddress","type":"address"}],"name":"CreateIndex","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"RemoveTokenFromBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"address","name":"signerToken","type":"address"},{"indexed":true,"internalType":"address","name":"senderToken","type":"address"},{"indexed":false,"internalType":"bytes2","name":"protocol","type":"bytes2"},{"indexed":false,"internalType":"uint256","name":"stakeAmount","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"address","name":"signerToken","type":"address"},{"indexed":true,"internalType":"address","name":"senderToken","type":"address"},{"indexed":false,"internalType":"bytes2","name":"protocol","type":"bytes2"},{"indexed":false,"internalType":"uint256","name":"stakeAmount","type":"uint256"}],"name":"Unstake","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"addTokenToBlacklist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"signerToken","type":"address"},{"internalType":"address","name":"senderToken","type":"address"},{"internalType":"bytes2","name":"protocol","type":"bytes2"}],"name":"createIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"signerToken","type":"address"},{"internalType":"address","name":"senderToken","type":"address"},{"internalType":"bytes2","name":"protocol","type":"bytes2"},{"internalType":"address","name":"cursor","type":"address"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"getLocators","outputs":[{"internalType":"bytes32[]","name":"locators","type":"bytes32[]"},{"internalType":"uint256[]","name":"scores","type":"uint256[]"},{"internalType":"address","name":"nextCursor","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"signerToken","type":"address"},{"internalType":"address","name":"senderToken","type":"address"},{"internalType":"bytes2","name":"protocol","type":"bytes2"}],"name":"getStakedAmount","outputs":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"bytes2","name":"","type":"bytes2"}],"name":"indexes","outputs":[{"internalType":"contract Index","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes2","name":"","type":"bytes2"}],"name":"locatorWhitelists","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"removeTokenFromBlacklist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"signerToken","type":"address"},{"internalType":"address","name":"senderToken","type":"address"},{"internalType":"bytes2","name":"protocol","type":"bytes2"},{"internalType":"uint256","name":"stakingAmount","type":"uint256"},{"internalType":"bytes32","name":"locator","type":"bytes32"}],"name":"setIntent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes2","name":"protocol","type":"bytes2"},{"internalType":"address","name":"newLocatorWhitelist","type":"address"}],"name":"setLocatorWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"signerToken","type":"address"},{"internalType":"address","name":"senderToken","type":"address"},{"internalType":"bytes2","name":"protocol","type":"bytes2"}],"name":"unsetIntent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200385e3803806200385e8339810160408190526200003491620000cc565b620000476001600160e01b03620000b516565b600080546001600160a01b0319166001600160a01b03928316178082556040519216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600180546001600160a01b0319166001600160a01b039290921691909117905562000121565b3390565b8051620000c68162000107565b92915050565b600060208284031215620000df57600080fd5b6000620000ed8484620000b9565b949350505050565b60006001600160a01b038216620000c6565b6200011281620000f5565b81146200011e57600080fd5b50565b61372d80620001316000396000f3fe60806040523480156200001157600080fd5b5060043610620001185760003560e01c80639dc9762a11620000a5578063cffaf5f5116200006f578063cffaf5f51462000244578063d57cfaad146200026c578063df9d6d671462000283578063f2fde38b146200029a5762000118565b80639dc9762a14620001e85780639f80679f14620001ff5780639fa451021462000216578063cd135549146200022d5762000118565b80638da5cb5b11620000e75780638da5cb5b14620001885780638f32d59b14620001a15780639173deca14620001ba578063948ee3f614620001d15762000118565b806303f868f7146200011d578063715018a6146200014c57806372f702f31462000158578063854437dc1462000171575b600080fd5b620001346200012e36600462001cfb565b620002b1565b60405162000143919062002380565b60405180910390f35b620001566200041d565b005b62000162620004d8565b60405162000143919062002390565b620001566200018236600462001cda565b620004f4565b62000192620005f1565b6040516200014391906200225b565b620001ab6200060d565b60405162000143919062002341565b62000192620001cb36600462001f35565b6200064d565b62000156620001e236600462001e39565b62000675565b62000162620001f936600462001d65565b62000d6b565b620001926200021036600462001d65565b62000da4565b620001ab6200022736600462001cda565b62000f71565b620001566200023e36600462001f56565b62000f86565b6200025b6200025536600462001db9565b62001040565b604051620001439392919062002307565b620001566200027d36600462001cda565b62001279565b620001566200029436600462001d65565b62001368565b62000156620002ab36600462001cda565b6200137b565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600260209081526040808320868516845282528083207fffff00000000000000000000000000000000000000000000000000000000000086168452909152812054909116620003205750600062000415565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600260209081526040808320878516845282528083207fffff00000000000000000000000000000000000000000000000000000000000087168452909152908190205490517fd47875d000000000000000000000000000000000000000000000000000000000815291169063d47875d090620003be9088906004016200225b565b60206040518083038186803b158015620003d757600080fd5b505afa158015620003ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000412919081019062001f95565b90505b949350505050565b620004276200060d565b62000469576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046090620023e8565b60405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b620004fe6200060d565b62000537576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046090620023e8565b73ffffffffffffffffffffffffffffffffffffffff811660009081526004602052604090205460ff16620005ee5773ffffffffffffffffffffffffffffffffffffffff81166000908152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fe53b519de693da0496205f0705fa49c937a9045cb26b6f67711cd2205195540190620005e59083906200225b565b60405180910390a15b50565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6000805473ffffffffffffffffffffffffffffffffffffffff1662000631620013c9565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600260209081526040808320848916845282528083207fffff000000000000000000000000000000000000000000000000000000000000881684529091529020548691869186911662000713576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046090620023c4565b7fffff000000000000000000000000000000000000000000000000000000000000861660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff161562000876577fffff0000000000000000000000000000000000000000000000000000000000008616600090815260036020526040908190205490517fb7dc560f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063b7dc560f90620007e990879060040162002380565b60206040518083038186803b1580156200080257600080fd5b505afa15801562000817573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200083d919081019062001f14565b62000876576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046090620023b2565b73ffffffffffffffffffffffffffffffffffffffff881660009081526004602052604090205460ff16158015620008d3575073ffffffffffffffffffffffffffffffffffffffff871660009081526004602052604090205460ff16155b6200090c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046090620023fa565b73ffffffffffffffffffffffffffffffffffffffff80891660009081526002602090815260408083208b8516845282528083207fffff0000000000000000000000000000000000000000000000000000000000008b1684529091528082205490517f4ec63ffe00000000000000000000000000000000000000000000000000000000815291928392911690634ec63ffe90620009ad9033906004016200226b565b60206040518083038186803b158015620009c657600080fd5b505afa158015620009db573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000a01919081019062001f95565b149050801562000c5957851562000afd576001546040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd9062000a6e90339030908b906004016200227b565b602060405180830381600087803b15801562000a8957600080fd5b505af115801562000a9e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000ac4919081019062001f14565b62000afd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046090620023d6565b73ffffffffffffffffffffffffffffffffffffffff808a1660009081526002602090815260408083208c8516845282528083207fffff0000000000000000000000000000000000000000000000000000000000008c168452909152908190205490517f0589912a000000000000000000000000000000000000000000000000000000008152911690630589912a9062000b9f9033908a908a90600401620022a9565b600060405180830381600087803b15801562000bba57600080fd5b505af115801562000bcf573d6000803e3d6000fd5b505050508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5065254984dfd953a97f48da9330ed3a61d8bc8cd2df88176b58f99d3ce81c3e8a8a60405162000c4b92919062002370565b60405180910390a462000d60565b73ffffffffffffffffffffffffffffffffffffffff808a1660009081526002602090815260408083208c8516845282528083207fffff0000000000000000000000000000000000000000000000000000000000008c1684529091528082205490517fd47875d00000000000000000000000000000000000000000000000000000000081529192169063d47875d09062000cf79033906004016200226b565b60206040518083038186803b15801562000d1057600080fd5b505afa15801562000d25573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000d4b919081019062001f95565b905062000d5e338b8b8b8b8b87620013cd565b505b505050505050505050565b600260209081526000938452604080852082529284528284209052825290205473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600260209081526040808320868516845282528083207fffff0000000000000000000000000000000000000000000000000000000000008616845290915281205490911662000f095760405162000e189062001b76565b604051809103906000f08015801562000e35573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff85811660008181526002602090815260408083208986168085529083528184207fffff0000000000000000000000000000000000000000000000000000000000008a1685529092529182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001695851695909517948590559051909391927f7a28ddb7cee538734c8afbb914e80f6fa30503635c435868db561163b5a7e84b9262000f00928892919091169062002351565b60405180910390a35b5073ffffffffffffffffffffffffffffffffffffffff8084166000908152600260209081526040808320868516845282528083207fffff00000000000000000000000000000000000000000000000000000000000086168452909152902054165b9392505050565b60046020526000908152604090205460ff1681565b62000f906200060d565b62000fc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046090620023e8565b7fffff00000000000000000000000000000000000000000000000000000000000091909116600090815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260046020526040812054606091829160ff16806200109f575073ffffffffffffffffffffffffffffffffffffffff871660009081526004602052604090205460ff165b15620010d65760408051600080825260208201909252905b506040805160008082526020820190925291945090925090506200126e565b73ffffffffffffffffffffffffffffffffffffffff88811660009081526002602090815260408083208b8516845282528083207fffff0000000000000000000000000000000000000000000000000000000000008b1684529091529020541662001151576040805160008082526020820190925290620010b7565b73ffffffffffffffffffffffffffffffffffffffff80891660009081526002602090815260408083208b8516845282528083207fffff0000000000000000000000000000000000000000000000000000000000008b168452909152908190205490517f0b30a8d7000000000000000000000000000000000000000000000000000000008152911690630b30a8d790620011f19088908890600401620022d8565b60006040518083038186803b1580156200120a57600080fd5b505afa1580156200121f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405262001267919081019062001e99565b9250925092505b955095509592505050565b620012836200060d565b620012bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046090620023e8565b73ffffffffffffffffffffffffffffffffffffffff811660009081526004602052604090205460ff1615620005ee5773ffffffffffffffffffffffffffffffffffffffff81166000908152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fa1f26e166f408721b7578234199103d95e0aea4308d683b2f6c0ec86ac9e9e7390620005e59083906200225b565b6200137633848484620016e7565b505050565b620013856200060d565b620013be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046090620023e8565b620005ee8162001a99565b3390565b82811015620014c3576001546040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd9062001434908a90309086890390600401620022c8565b602060405180830381600087803b1580156200144f57600080fd5b505af115801562001464573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200148a919081019062001f14565b620014c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046090620023d6565b8083101562001588576001546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a9059cbb9062001528908a9087860390600401620022d8565b602060405180830381600087803b1580156200154357600080fd5b505af115801562001558573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200157e919081019062001f14565b6200158857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600260209081526040808320898516845282528083207fffff00000000000000000000000000000000000000000000000000000000000089168452909152908190205490517fb4decab600000000000000000000000000000000000000000000000000000000815291169063b4decab6906200162a908a9087908790600401620022f7565b600060405180830381600087803b1580156200164557600080fd5b505af11580156200165a573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f5065254984dfd953a97f48da9330ed3a61d8bc8cd2df88176b58f99d3ce81c3e8787604051620016d692919062002370565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600260209081526040808320848716845282528083207fffff000000000000000000000000000000000000000000000000000000000000861684529091529020548491849184911662001785576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046090620023c4565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600260209081526040808320898516845282528083207fffff000000000000000000000000000000000000000000000000000000000000891684529091528082205490517fd47875d00000000000000000000000000000000000000000000000000000000081529192169063d47875d09062001823908b906004016200225b565b60206040518083038186803b1580156200183c57600080fd5b505afa15801562001851573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062001877919081019062001f95565b73ffffffffffffffffffffffffffffffffffffffff80891660009081526002602090815260408083208b8516845282528083207fffff0000000000000000000000000000000000000000000000000000000000008b168452909152908190205490517f0ddcecf00000000000000000000000000000000000000000000000000000000081529293501690630ddcecf09062001917908b906004016200225b565b600060405180830381600087803b1580156200193257600080fd5b505af115801562001947573d6000803e3d6000fd5b50505050600081111562001a0f576001546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a9059cbb90620019af908b908590600401620022d8565b602060405180830381600087803b158015620019ca57600080fd5b505af1158015620019df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062001a05919081019062001f14565b62001a0f57600080fd5b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f71735c1604645e893048a8e669bd75b5c1829b76fe6bd5a6cc0f2ac86eca6ff6888560405162001a8792919062002370565b60405180910390a45050505050505050565b73ffffffffffffffffffffffffffffffffffffffff811662001ae9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046090620023a0565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6111e1806200250a83390190565b803562001b9181620024d1565b92915050565b805162001b9181620024d1565b600082601f83011262001bb657600080fd5b815162001bcd62001bc78262002434565b6200240c565b9150818183526020840193506020810190508385602084028201111562001bf357600080fd5b60005b8381101562001c23578162001c0c888262001ccd565b845250602092830192919091019060010162001bf6565b5050505092915050565b600082601f83011262001c3f57600080fd5b815162001c5062001bc78262002434565b9150818183526020840193506020810190508385602084028201111562001c7657600080fd5b60005b8381101562001c23578162001c8f888262001ccd565b845250602092830192919091019060010162001c79565b805162001b9181620024e8565b803562001b9181620024f3565b803562001b9181620024fe565b805162001b9181620024fe565b60006020828403121562001ced57600080fd5b600062000415848462001b84565b6000806000806080858703121562001d1257600080fd5b600062001d20878762001b84565b945050602062001d338782880162001b84565b935050604062001d468782880162001b84565b925050606062001d598782880162001cb3565b91505092959194509250565b60008060006060848603121562001d7b57600080fd5b600062001d89868662001b84565b935050602062001d9c8682870162001b84565b925050604062001daf8682870162001cb3565b9150509250925092565b600080600080600060a0868803121562001dd257600080fd5b600062001de0888862001b84565b955050602062001df38882890162001b84565b945050604062001e068882890162001cb3565b935050606062001e198882890162001b84565b925050608062001e2c8882890162001cc0565b9150509295509295909350565b600080600080600060a0868803121562001e5257600080fd5b600062001e60888862001b84565b955050602062001e738882890162001b84565b945050604062001e868882890162001cb3565b935050606062001e198882890162001cc0565b60008060006060848603121562001eaf57600080fd5b835167ffffffffffffffff81111562001ec757600080fd5b62001ed58682870162001ba4565b935050602084015167ffffffffffffffff81111562001ef357600080fd5b62001f018682870162001c2d565b925050604062001daf8682870162001b97565b60006020828403121562001f2757600080fd5b600062000415848462001ca6565b60006020828403121562001f4857600080fd5b600062000415848462001cb3565b6000806040838503121562001f6a57600080fd5b600062001f78858562001cb3565b925050602062001f8b8582860162001b84565b9150509250929050565b60006020828403121562001fa857600080fd5b600062000415848462001ccd565b600062001fc48383620020bd565b505060200190565b62001fd781620024bc565b82525050565b62001fd78162002469565b600062001ff5826200245c565b62002001818562002460565b93506200200e8362002456565b8060005b838110156200204257815162002029888262001fb6565b9750620020368362002456565b92505060010162002012565b509495945050505050565b60006200205a826200245c565b62002066818562002460565b9350620020738362002456565b8060005b83811015620020425781516200208e888262001fb6565b97506200209b8362002456565b92505060010162002077565b62001fd78162002476565b62001fd7816200247b565b62001fd781620024a0565b62001fd781620024c4565b6000620020e260268362002460565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181527f6464726573730000000000000000000000000000000000000000000000000000602082015260400192915050565b60006200214360178362002460565b7f4c4f4341544f525f4e4f545f57484954454c4953544544000000000000000000815260200192915050565b60006200217e60148362002460565b7f494e4445585f444f45535f4e4f545f4558495354000000000000000000000000815260200192915050565b6000620021b9600e8362002460565b7f5354414b494e475f4641494c4544000000000000000000000000000000000000815260200192915050565b6000620021f460208362002460565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b60006200222f60138362002460565b7f504149525f49535f424c41434b4c495354454400000000000000000000000000815260200192915050565b6020810162001b91828462001fdd565b6020810162001b91828462001fcc565b606081016200228b828662001fcc565b6200229a602083018562001fdd565b620004156040830184620020bd565b60608101620022b9828662001fcc565b6200229a6020830185620020bd565b606081016200228b828662001fdd565b60408101620022e8828562001fdd565b62000f6a6020830184620020bd565b60608101620022b9828662001fdd565b606080825281016200231a818662001fe8565b905081810360208301526200233081856200204d565b905062000415604083018462001fdd565b6020810162001b918284620020a7565b60408101620023618285620020b2565b62000f6a602083018462001fdd565b60408101620022e88285620020b2565b6020810162001b918284620020bd565b6020810162001b918284620020c8565b6020808252810162001b9181620020d3565b6020808252810162001b918162002134565b6020808252810162001b91816200216f565b6020808252810162001b9181620021aa565b6020808252810162001b9181620021e5565b6020808252810162001b918162002220565b60405181810167ffffffffffffffff811182821017156200242c57600080fd5b604052919050565b600067ffffffffffffffff8211156200244c57600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b600062001b9182620024a3565b151590565b7fffff0000000000000000000000000000000000000000000000000000000000001690565b90565b73ffffffffffffffffffffffffffffffffffffffff1690565b600062001b91825b600062001b918262002469565b620024dc8162002469565b8114620005ee57600080fd5b620024dc8162002476565b620024dc816200247b565b620024dc81620024a056fe608060405234801561001057600080fd5b506100226001600160e01b0361015116565b600080546001600160a01b0319166001600160a01b03928316178082556040519216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360408051608081018252600080825260208083018281526001600160a01b039484018581526060850186815293869052600290925292517f86cf984b44bed1f7f8b143f6052803e8b74964b2ee297832a77790be6d6308f15591517f86cf984b44bed1f7f8b143f6052803e8b74964b2ee297832a77790be6d6308f25590517f86cf984b44bed1f7f8b143f6052803e8b74964b2ee297832a77790be6d6308f380549184166001600160a01b031992831617905590517f86cf984b44bed1f7f8b143f6052803e8b74964b2ee297832a77790be6d6308f48054919093169116179055610155565b3390565b61107d806101646000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638da5cb5b11610081578063d47875d01161005b578063d47875d014610199578063f29ee125146101ac578063f2fde38b146101cf576100d4565b80638da5cb5b1461015c5780638f32d59b14610171578063b4decab614610186576100d4565b80631f7b6d32116100b25780631f7b6d321461012c5780634ec63ffe14610141578063715018a614610154576100d4565b80630589912a146100d95780630b30a8d7146100ee5780630ddcecf014610119575b600080fd5b6100ec6100e7366004610c86565b6101e2565b005b6101016100fc366004610c4c565b6102d4565b60405161011093929190610f00565b60405180910390f35b6100ec610127366004610c26565b610514565b6101346105c7565b6040516101109190610f42565b61013461014f366004610c26565b6105cd565b6100ec6105f9565b6101646106a6565b6040516101109190610ef2565b6101796106c2565b6040516101109190610f34565b6100ec610194366004610c86565b610700565b6101346101a7366004610c26565b610799565b6101bf6101ba366004610c26565b6107c4565b6040516101109493929190610f50565b6100ec6101dd366004610c26565b610806565b6101ea6106c2565b610229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161022090610fbe565b60405180910390fd5b61023283610850565b15610269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161022090610fce565b61027483838361087a565b600154600101600181905550808373ffffffffffffffffffffffffffffffffffffffff167f62d8270f77cd1e7351e3e92e7001b363e90eed2ef3394dbd51201ceee3672630846040516102c79190610f42565b60405180910390a3505050565b60608060008073ffffffffffffffffffffffffffffffffffffffff861615801590610315575073ffffffffffffffffffffffffffffffffffffffff86811614155b156103515761032386610850565b61034a5750506040805160008082526020820181815282840190935290935090915061050d565b5084610395565b5073ffffffffffffffffffffffffffffffffffffffff600081905260026020527f86cf984b44bed1f7f8b143f6052803e8b74964b2ee297832a77790be6d6308f454165b600085600154106103a657856103aa565b6001545b9050806040519080825280602002602001820160405280156103d6578160200160208202803883390190505b50945080604051908082528060200260200182016040528015610403578160200160208202803883390190505b50935060005b818110801561042e575073ffffffffffffffffffffffffffffffffffffffff83811614155b156105075773ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054865187908390811061046757fe5b602002602001018181525050600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101548582815181106104c257fe5b60209081029190910181019190915273ffffffffffffffffffffffffffffffffffffffff93841660009081526002909152604090206003015490921691600101610409565b50909150505b9250925092565b61051c6106c2565b610552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161022090610fbe565b61055b81610987565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01905560405173ffffffffffffffffffffffffffffffffffffffff8216907fded788c834b3ea8a384c1495466a3a4a827c378cd9eafe5c159d90291ce0184490600090a250565b60015481565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600260205260409020545b919050565b6106016106c2565b610637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161022090610fbe565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6000805473ffffffffffffffffffffffffffffffffffffffff166106e4610a66565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6107086106c2565b61073e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161022090610fbe565b61074783610987565b61075283838361087a565b808373ffffffffffffffffffffffffffffffffffffffff167f62d8270f77cd1e7351e3e92e7001b363e90eed2ef3394dbd51201ceee3672630846040516102c79190610f42565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090206001015490565b6002602081905260009182526040909120805460018201549282015460039092015490929173ffffffffffffffffffffffffffffffffffffffff908116911684565b61080e6106c2565b610844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161022090610fbe565b61084d81610a6a565b50565b73ffffffffffffffffffffffffffffffffffffffff16600090815260026020526040902054151590565b806108b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161022090610f9e565b60006108bc83610b44565b73ffffffffffffffffffffffffffffffffffffffff9081166000818152600260208181526040808420830180548716808652828620600390810180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169e8b169e8f17909155835481168e1790935583516080810185529a8b528a85019b8c528a840191825260608b019788529b8652928490529320965187559651600187015595519585018054821696841696909617909555519290940180549093169190931617905550565b61099081610850565b6109c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161022090610fae565b73ffffffffffffffffffffffffffffffffffffffff9081166000818152600260208190526040808320808301805460038084018054928a16808952868920909201805493909a167fffffffffffffffffffffffff00000000000000000000000000000000000000009384168117909a5598875293862090940180548516909317909255938352828455600190930191909155815481169091558154169055565b3390565b73ffffffffffffffffffffffffffffffffffffffff8116610ab7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161022090610f8e565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff600081815260026020527f86cf984b44bed1f7f8b143f6052803e8b74964b2ee297832a77790be6d6308f45490911682610baa5773ffffffffffffffffffffffffffffffffffffffff9150506105f4565b5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600260205260409020600101548311610c0a5773ffffffffffffffffffffffffffffffffffffffff90811660009081526002602052604090206003015416610bab565b92915050565b8035610c0a8161101d565b8035610c0a81611031565b600060208284031215610c3857600080fd5b6000610c448484610c10565b949350505050565b60008060408385031215610c5f57600080fd5b6000610c6b8585610c10565b9250506020610c7c85828601610c1b565b9150509250929050565b600080600060608486031215610c9b57600080fd5b6000610ca78686610c10565b9350506020610cb886828701610c1b565b9250506040610cc986828701610c1b565b9150509250925092565b6000610cdf8383610da6565b505060200190565b610cf081610ff1565b82525050565b6000610d0182610fe4565b610d0b8185610fe8565b9350610d1683610fde565b8060005b83811015610d44578151610d2e8882610cd3565b9750610d3983610fde565b925050600101610d1a565b509495945050505050565b6000610d5a82610fe4565b610d648185610fe8565b9350610d6f83610fde565b8060005b83811015610d44578151610d878882610cd3565b9750610d9283610fde565b925050600101610d73565b610cf081610ffc565b610cf081611001565b6000610dbc602683610fe8565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181527f6464726573730000000000000000000000000000000000000000000000000000602082015260400192915050565b6000610e1b601483610fe8565b7f4c4f4341544f525f4d5553545f42455f53454e54000000000000000000000000815260200192915050565b6000610e54601483610fe8565b7f454e5452595f444f45535f4e4f545f4558495354000000000000000000000000815260200192915050565b6000610e8d602083610fe8565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000610ec6601483610fe8565b7f454e5452595f414c52454144595f455849535453000000000000000000000000815260200192915050565b60208101610c0a8284610ce7565b60608082528101610f118186610cf6565b90508181036020830152610f258185610d4f565b9050610c446040830184610ce7565b60208101610c0a8284610d9d565b60208101610c0a8284610da6565b60808101610f5e8287610da6565b610f6b6020830186610da6565b610f786040830185610ce7565b610f856060830184610ce7565b95945050505050565b60208082528101610c0a81610daf565b60208082528101610c0a81610e0e565b60208082528101610c0a81610e47565b60208082528101610c0a81610e80565b60208082528101610c0a81610eb9565b60200190565b5190565b90815260200190565b6000610c0a82611004565b151590565b90565b73ffffffffffffffffffffffffffffffffffffffff1690565b61102681610ff1565b811461084d57600080fd5b6110268161100156fea365627a7a72315820056a7975cdfb66c7db121977a8681e9da5bbbf82bfd11879ec66a3495fd4a4fb6c6578706572696d656e74616cf564736f6c63430005100040a365627a7a72315820b88c4d893f077dda6c0538fe84d16d91752446c85ac7db28ab9db94e30067b5e6c6578706572696d656e74616cf564736f6c634300051000400000000000000000000000001ac0d76f11875317f8a7d791db94cdd82bd02bd1

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

0000000000000000000000001ac0d76f11875317f8a7d791db94cdd82bd02bd1

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001ac0d76f11875317f8a7d791db94cdd82bd02bd1


Deployed ByteCode Sourcemap

18642:9764:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18642:9764:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26095:394;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2920:140;;;:::i;:::-;;18729:26;;;:::i;:::-;;;;;;;;21264:188;;;;;;;;;:::i;2115:79::-;;;:::i;:::-;;;;;;;;2477:94;;;:::i;:::-;;;;;;;;19007:51;;;;;;;;;:::i;22220:1637::-;;;;;;;;;:::i;18832:84::-;;;;;;;;;:::i;20501:656::-;;;;;;;;;:::i;19105:46::-;;;;;;;;;:::i;19900:169::-;;;;;;;;;:::i;25009:738::-;;;;;;;;;:::i;:::-;;;;;;;;;;21580:198;;;;;;;;;:::i;24197:182::-;;;;;;;;;:::i;3213:109::-;;;;;;;;;:::i;26095:394::-;26272:55;:20;;;26239;26272;;;:7;:20;;;;;;;;:33;;;;;;;;;;:43;;;;;;;;;;;26239:20;;26272:43;26268:86;;-1:-1:-1;26345:1:0;26338:8;;26268:86;26425:20;;;;;;;;:7;:20;;;;;;;;:33;;;;;;;;;;:43;;;;;;;;;;;;;:58;;;;;:43;;;:52;;:58;;26478:4;;26425:58;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26425:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26425:58:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;26425:58:0;;;;;;;;;26418:65;;26095:394;;;;;;;:::o;2920:140::-;2325:9;:7;:9::i;:::-;2317:54;;;;;;;;;;;;;;;;;;;;;;3019:1;3003:6;;2982:40;;;3003:6;;;;2982:40;;3019:1;;2982:40;3050:1;3033:19;;;;;;2920:140::o;18729:26::-;;;;;;:::o;21264:188::-;2325:9;:7;:9::i;:::-;2317:54;;;;;;;;;;;;;;21339:21;;;;;;;:14;:21;;;;;;;;21334:113;;21371:21;;;;;;;:14;:21;;;;;;;:28;;;;21395:4;21371:28;;;21413:26;;;;;21386:5;;21413:26;;;;;;;;;;21334:113;21264:188;:::o;2115:79::-;2153:7;2180:6;;;2115:79;:::o;2477:94::-;2517:4;2557:6;;;;2541:12;:10;:12::i;:::-;:22;;;2534:29;;2477:94;:::o;19007:51::-;;;;;;;;;;;;;;;:::o;22220:1637::-;19538:55;:20;;;19591:1;19538:20;;;:7;:20;;;;;;;;:33;;;;;;;;;;:43;;;;;;;;;;;22389:11;;22402;;22415:8;;19538:43;19522:109;;;;;;;;;;;;;;22491:27;;;22530:1;22491:27;;;:17;:27;;;;;;:41;:27;:41;22487:186;;22579:27;;;;;;;:17;:27;;;;;;;;22561:59;;;;;22579:27;;;;;22561:50;;:59;;22612:7;;22561:59;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22561:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22561:59:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;22561:59:0;;;;;;;;;22543:122;;;;;;;;;;;;;;22750:27;;;;;;;:14;:27;;;;;;;;22749:28;:60;;;;-1:-1:-1;22782:27:0;;;;;;;:14;:27;;;;;;;;22781:28;22749:60;22733:113;;;;;;;;;;;;;;22885:20;;;;22853:21;22885:20;;;:7;:20;;;;;;;;:33;;;;;;;;;;:43;;;;;;;;;;;;:66;;;;;22853:21;;;;22885:43;;;:54;;:66;;22940:10;;22885:66;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22885:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22885:66:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;22885:66:0;;;;;;;;;:89;22853:122;;22986:16;22982:870;;;23078:17;;23074:223;;23180:12;;:67;;;;;:12;;;;;:25;;:67;;23206:10;;23226:4;;23233:13;;23180:67;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23180:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23180:67:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23180:67:0;;;;;;;;;23160:127;;;;;;;;;;;;;;23345:20;;;;;;;;:7;:20;;;;;;;;:33;;;;;;;;;;:43;;;;;;;;;;;;;:126;;;;;:43;;;:54;;:126;;23410:10;;23431:13;;23455:7;;23345:126;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23345:126:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23345:126:0;;;;23516:11;23485:68;;23503:11;23485:68;;23491:10;23485:68;;;23529:8;23539:13;23485:68;;;;;;;;;;;;;;;;22982:870;;;23604:20;;;;23576:16;23604:20;;;:7;:20;;;;;;;;:33;;;;;;;;;;:43;;;;;;;;;;;;:64;;;;;23576:16;;23604:43;;:52;;:64;;23657:10;;23604:64;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23604:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23604:64:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23604:64:0;;;;;;;;;23576:92;;23677:167;23701:10;23722:11;23744;23766:8;23785:13;23809:7;23827:8;23677:13;:167::i;:::-;22982:870;;19638:1;22220:1637;;;;;;;;:::o;18832:84::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20501:656::-;20687:55;:20;;;20619:7;20687:20;;;:7;:20;;;;;;;;:33;;;;;;;;;;:43;;;;;;;;;;;20619:7;;20687:43;20683:353;;20857:11;;;;;:::i;:::-;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;20811:20:0;;;;;;;;:7;:20;;;;;;;;:33;;;;;;;;;;;;:43;;;;;;;;;;;;:57;;;;;;;;;;;;;;;20882:146;;20811:33;;:20;;20882:146;;;;20811:43;;20975;;;;;20882:146;;;;;;;;;;20683:353;-1:-1:-1;21107:20:0;;;;;;;;:7;:20;;;;;;;;:33;;;;;;;;;;:43;;;;;;;;;;;;20501:656;;;;;;:::o;19105:46::-;;;;;;;;;;;;;;;:::o;19900:169::-;2325:9;:7;:9::i;:::-;2317:54;;;;;;;;;;;;;;20014:27;;;;;;;;;:17;:27;;;;;:49;;;;;;;;;;;;;;19900:169::o;25009:738::-;25347:27;;;25262:18;25347:27;;;:14;:27;;;;;;25196:25;;;;25347:27;;;:58;;-1:-1:-1;25378:27:0;;;;;;;:14;:27;;;;;;;;25347:58;25343:136;;;25424:16;;;25438:1;25424:16;;;;;;;;;;;-1:-1:-1;25442:16:0;;;25456:1;25442:16;;;;;;;;;25416:55;;-1:-1:-1;25442:16:0;;-1:-1:-1;25456:1:0;-1:-1:-1;25416:55:0;;25343:136;25522:55;:20;;;25575:1;25522:20;;;:7;:20;;;;;;;;:33;;;;;;;;;;:43;;;;;;;;;;;;25518:133;;25596:16;;;25610:1;25596:16;;;;;;;;;;;;25518:133;25671:20;;;;;;;;:7;:20;;;;;;;;:33;;;;;;;;;;:43;;;;;;;;;;;;;:70;;;;;:43;;;:55;;:70;;25727:6;;25735:5;;25671:70;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25671:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25671:70:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;25671:70:0;80:15:-1;;;97:9;76:31;65:43;;120:4;113:20;25671:70:0;;;;;;;;;25657:84;;;;;;25009:738;;;;;;;;;;:::o;21580:198::-;2325:9;:7;:9::i;:::-;2317:54;;;;;;;;;;;;;;21659:21;;;;;;;:14;:21;;;;;;;;21655:118;;;21691:21;;;21715:5;21691:21;;;:14;:21;;;;;;;:29;;;;;;21734:31;;;;;21706:5;;21734:31;;24197:182;24313:60;24326:10;24338:11;24351;24364:8;24313:12;:60::i;:::-;24197:182;;;:::o;3213:109::-;2325:9;:7;:9::i;:::-;2317:54;;;;;;;;;;;;;;3286:28;3305:8;3286:18;:28::i;895:98::-;975:10;895:98;:::o;26493:970::-;26779:9;26767;:21;26763:239;;;26889:12;;:69;;;;;:12;;;;;:25;;:69;;26915:4;;26929;;26936:21;;;;26889:69;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26889:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26889:69:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;26889:69:0;;;;;;;;;26871:123;;;;;;;;;;;;;;27079:9;27067;:21;27063:175;;;27179:12;;:50;;;;;:12;;;;;:21;;:50;;27201:4;;27207:21;;;;27179:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27179:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27179:50:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;27179:50:0;;;;;;;;;27171:59;;;;;;27273:20;;;;;;;;:7;:20;;;;;;;;:33;;;;;;;;;;:43;;;;;;;;;;;;;:114;;;;;:43;;;:57;;:114;;27339:4;;27352:9;;27370:10;;27273:114;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27273:114:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27273:114:0;;;;27424:11;27399:58;;27411:11;27399:58;;27405:4;27399:58;;;27437:8;27447:9;27399:58;;;;;;;;;;;;;;;;26493:970;;;;;;;:::o;27789:614::-;19538:55;:20;;;19591:1;19538:20;;;:7;:20;;;;;;;;:33;;;;;;;;;;:43;;;;;;;;;;;27930:11;;27943;;27956:8;;19538:43;19522:109;;;;;;;;;;;;;;28025:20;;;;28009:13;28025:20;;;:7;:20;;;;;;;;:33;;;;;;;;;;:43;;;;;;;;;;;;:58;;;;;28009:13;;28025:43;;:52;;:58;;28078:4;;28025:58;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28025:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28025:58:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;28025:58:0;;;;;;;;;28130:20;;;;;;;;:7;:20;;;;;;;;:33;;;;;;;;;;:43;;;;;;;;;;;;;:62;;;;;28009:74;;-1:-1:-1;28130:43:0;;:56;;:62;;28187:4;;28130:62;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28130:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28130:62:0;;;;28211:1;28203:5;:9;28199:131;;;28287:12;;:34;;;;;:12;;;;;:21;;:34;;28309:4;;28315:5;;28287:34;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28287:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28287:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;28287:34:0;;;;;;;;;28279:43;;;;;;28368:11;28341:56;;28355:11;28341:56;;28349:4;28341:56;;;28381:8;28391:5;28341:56;;;;;;;;;;;;;;;;19638:1;27789:614;;;;;;;:::o;3426:229::-;3500:22;;;3492:73;;;;;;;;;;;;;;3602:6;;;3581:38;;;;;;;3602:6;;;3581:38;;;3630:6;:17;;;;;;;;;;;;;;;3426:229::o;18642:9764::-;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;;57:78;;;;;142:134;220:13;;238:33;220:13;238:33;;301:722;;429:3;422:4;414:6;410:17;406:27;396:2;;447:1;444;437:12;396:2;477:6;471:13;499:80;514:64;571:6;514:64;;;499:80;;;490:89;;596:5;621:6;614:5;607:21;651:4;643:6;639:17;629:27;;673:4;668:3;664:14;657:21;;726:6;773:3;765:4;757:6;753:17;748:3;744:27;741:36;738:2;;;790:1;787;780:12;738:2;815:1;800:217;825:6;822:1;819:13;800:217;;;883:3;905:48;949:3;937:10;905:48;;;893:61;;-1:-1;977:4;968:14;;;;996;;;;;847:1;840:9;800:217;;;804:14;389:634;;;;;;;;1049:722;;1177:3;1170:4;1162:6;1158:17;1154:27;1144:2;;1195:1;1192;1185:12;1144:2;1225:6;1219:13;1247:80;1262:64;1319:6;1262:64;;1247:80;1238:89;;1344:5;1369:6;1362:5;1355:21;1399:4;1391:6;1387:17;1377:27;;1421:4;1416:3;1412:14;1405:21;;1474:6;1521:3;1513:4;1505:6;1501:17;1496:3;1492:27;1489:36;1486:2;;;1538:1;1535;1528:12;1486:2;1563:1;1548:217;1573:6;1570:1;1567:13;1548:217;;;1631:3;1653:48;1697:3;1685:10;1653:48;;;1641:61;;-1:-1;1725:4;1716:14;;;;1744;;;;;1595:1;1588:9;1548:217;;1779:128;1854:13;;1872:30;1854:13;1872:30;;1914:128;1980:20;;2005:32;1980:20;2005:32;;2049:130;2116:20;;2141:33;2116:20;2141:33;;2186:134;2264:13;;2282:33;2264:13;2282:33;;2605:241;;2709:2;2697:9;2688:7;2684:23;2680:32;2677:2;;;2725:1;2722;2715:12;2677:2;2760:1;2777:53;2822:7;2802:9;2777:53;;2853:615;;;;;3007:3;2995:9;2986:7;2982:23;2978:33;2975:2;;;3024:1;3021;3014:12;2975:2;3059:1;3076:53;3121:7;3101:9;3076:53;;;3066:63;;3038:97;3166:2;3184:53;3229:7;3220:6;3209:9;3205:22;3184:53;;;3174:63;;3145:98;3274:2;3292:53;3337:7;3328:6;3317:9;3313:22;3292:53;;;3282:63;;3253:98;3382:2;3400:52;3444:7;3435:6;3424:9;3420:22;3400:52;;;3390:62;;3361:97;2969:499;;;;;;;;3475:489;;;;3612:2;3600:9;3591:7;3587:23;3583:32;3580:2;;;3628:1;3625;3618:12;3580:2;3663:1;3680:53;3725:7;3705:9;3680:53;;;3670:63;;3642:97;3770:2;3788:53;3833:7;3824:6;3813:9;3809:22;3788:53;;;3778:63;;3749:98;3878:2;3896:52;3940:7;3931:6;3920:9;3916:22;3896:52;;;3886:62;;3857:97;3574:390;;;;;;3971:741;;;;;;4142:3;4130:9;4121:7;4117:23;4113:33;4110:2;;;4159:1;4156;4149:12;4110:2;4194:1;4211:53;4256:7;4236:9;4211:53;;;4201:63;;4173:97;4301:2;4319:53;4364:7;4355:6;4344:9;4340:22;4319:53;;;4309:63;;4280:98;4409:2;4427:52;4471:7;4462:6;4451:9;4447:22;4427:52;;;4417:62;;4388:97;4516:2;4534:53;4579:7;4570:6;4559:9;4555:22;4534:53;;;4524:63;;4495:98;4624:3;4643:53;4688:7;4679:6;4668:9;4664:22;4643:53;;;4633:63;;4603:99;4104:608;;;;;;;;;4719:741;;;;;;4890:3;4878:9;4869:7;4865:23;4861:33;4858:2;;;4907:1;4904;4897:12;4858:2;4942:1;4959:53;5004:7;4984:9;4959:53;;;4949:63;;4921:97;5049:2;5067:53;5112:7;5103:6;5092:9;5088:22;5067:53;;;5057:63;;5028:98;5157:2;5175:52;5219:7;5210:6;5199:9;5195:22;5175:52;;;5165:62;;5136:97;5264:2;5282:53;5327:7;5318:6;5307:9;5303:22;5282:53;;5467:793;;;;5666:2;5654:9;5645:7;5641:23;5637:32;5634:2;;;5682:1;5679;5672:12;5634:2;5717:24;;5761:18;5750:30;;5747:2;;;5793:1;5790;5783:12;5747:2;5813:89;5894:7;5885:6;5874:9;5870:22;5813:89;;;5803:99;;5696:212;5960:2;5949:9;5945:18;5939:25;5984:18;5976:6;5973:30;5970:2;;;6016:1;6013;6006:12;5970:2;6036:89;6117:7;6108:6;6097:9;6093:22;6036:89;;;6026:99;;5918:213;6162:2;6180:64;6236:7;6227:6;6216:9;6212:22;6180:64;;6267:257;;6379:2;6367:9;6358:7;6354:23;6350:32;6347:2;;;6395:1;6392;6385:12;6347:2;6430:1;6447:61;6500:7;6480:9;6447:61;;6531:239;;6634:2;6622:9;6613:7;6609:23;6605:32;6602:2;;;6650:1;6647;6640:12;6602:2;6685:1;6702:52;6746:7;6726:9;6702:52;;6777:364;;;6897:2;6885:9;6876:7;6872:23;6868:32;6865:2;;;6913:1;6910;6903:12;6865:2;6948:1;6965:52;7009:7;6989:9;6965:52;;;6955:62;;6927:96;7054:2;7072:53;7117:7;7108:6;7097:9;7093:22;7072:53;;;7062:63;;7033:98;6859:282;;;;;;7148:263;;7263:2;7251:9;7242:7;7238:23;7234:32;7231:2;;;7279:1;7276;7269:12;7231:2;7314:1;7331:64;7387:7;7367:9;7331:64;;7689:173;;7776:46;7818:3;7810:6;7776:46;;;-1:-1;;7851:4;7842:14;;7769:93;8052:142;8143:45;8182:5;8143:45;;;8138:3;8131:58;8125:69;;;8201:113;8284:24;8302:5;8284:24;;8352:690;;8497:54;8545:5;8497:54;;;8564:86;8643:6;8638:3;8564:86;;;8557:93;;8671:56;8721:5;8671:56;;;8747:7;8775:1;8760:260;8785:6;8782:1;8779:13;8760:260;;;8852:6;8846:13;8873:63;8932:3;8917:13;8873:63;;;8866:70;;8953:60;9006:6;8953:60;;;8943:70;-1:-1;;8807:1;8800:9;8760:260;;;-1:-1;9033:3;;8476:566;-1:-1;;;;;8476:566;9081:690;;9226:54;9274:5;9226:54;;;9293:86;9372:6;9367:3;9293:86;;;9286:93;;9400:56;9450:5;9400:56;;;9476:7;9504:1;9489:260;9514:6;9511:1;9508:13;9489:260;;;9581:6;9575:13;9602:63;9661:3;9646:13;9602:63;;;9595:70;;9682:60;9735:6;9682:60;;;9672:70;-1:-1;;9536:1;9529:9;9489:260;;9779:104;9856:21;9871:5;9856:21;;9890:110;9971:23;9988:5;9971:23;;10007:103;10080:24;10098:5;10080:24;;10237:154;10334:51;10379:5;10334:51;;10558:375;;10718:67;10782:2;10777:3;10718:67;;;10818:34;10798:55;;10887:8;10882:2;10873:12;;10866:30;10924:2;10915:12;;10704:229;-1:-1;;10704:229;10942:323;;11102:67;11166:2;11161:3;11102:67;;;11202:25;11182:46;;11256:2;11247:12;;11088:177;-1:-1;;11088:177;11274:320;;11434:67;11498:2;11493:3;11434:67;;;11534:22;11514:43;;11585:2;11576:12;;11420:174;-1:-1;;11420:174;11603:314;;11763:67;11827:2;11822:3;11763:67;;;11863:16;11843:37;;11908:2;11899:12;;11749:168;-1:-1;;11749:168;11926:332;;12086:67;12150:2;12145:3;12086:67;;;12186:34;12166:55;;12249:2;12240:12;;12072:186;-1:-1;;12072:186;12267:319;;12427:67;12491:2;12486:3;12427:67;;;12527:21;12507:42;;12577:2;12568:12;;12413:173;-1:-1;;12413:173;12824:213;12942:2;12927:18;;12956:71;12931:9;13000:6;12956:71;;13044:229;13170:2;13155:18;;13184:79;13159:9;13236:6;13184:79;;13280:451;13462:2;13447:18;;13476:79;13451:9;13528:6;13476:79;;;13566:72;13634:2;13623:9;13619:18;13610:6;13566:72;;;13649;13717:2;13706:9;13702:18;13693:6;13649:72;;13738:451;13920:2;13905:18;;13934:79;13909:9;13986:6;13934:79;;;14024:72;14092:2;14081:9;14077:18;14068:6;14024:72;;14196:435;14370:2;14355:18;;14384:71;14359:9;14428:6;14384:71;;14638:324;14784:2;14769:18;;14798:71;14773:9;14842:6;14798:71;;;14880:72;14948:2;14937:9;14933:18;14924:6;14880:72;;14969:435;15143:2;15128:18;;15157:71;15132:9;15201:6;15157:71;;15411:731;15685:2;15699:47;;;15670:18;;15760:108;15670:18;15854:6;15760:108;;;15752:116;;15916:9;15910:4;15906:20;15901:2;15890:9;15886:18;15879:48;15941:108;16044:4;16035:6;15941:108;;;15933:116;;16060:72;16128:2;16117:9;16113:18;16104:6;16060:72;;16149:201;16261:2;16246:18;;16275:65;16250:9;16313:6;16275:65;;16357:320;16501:2;16486:18;;16515:69;16490:9;16557:6;16515:69;;;16595:72;16663:2;16652:9;16648:18;16639:6;16595:72;;16684:320;16828:2;16813:18;;16842:69;16817:9;16884:6;16842:69;;17011:213;17129:2;17114:18;;17143:71;17118:9;17187:6;17143:71;;17231:241;17363:2;17348:18;;17377:85;17352:9;17435:6;17377:85;;17725:407;17916:2;17930:47;;;17901:18;;17991:131;17901:18;17991:131;;18139:407;18330:2;18344:47;;;18315:18;;18405:131;18315:18;18405:131;;18553:407;18744:2;18758:47;;;18729:18;;18819:131;18729:18;18819:131;;18967:407;19158:2;19172:47;;;19143:18;;19233:131;19143:18;19233:131;;19381:407;19572:2;19586:47;;;19557:18;;19647:131;19557:18;19647:131;;19795:407;19986:2;20000:47;;;19971:18;;20061:131;19971:18;20061:131;;20429:256;20491:2;20485:9;20517:17;;;20592:18;20577:34;;20613:22;;;20574:62;20571:2;;;20649:1;20646;20639:12;20571:2;20665;20658:22;20469:216;;-1:-1;20469:216;20692:304;;20851:18;20843:6;20840:30;20837:2;;;20883:1;20880;20873:12;20837:2;-1:-1;20918:4;20906:17;;;20971:15;;20774:222;21314:151;21438:4;21429:14;;21386:79;21630:137;21733:12;;21704:63;22149:178;22267:19;;;22316:4;22307:14;;22260:67;22694:91;;22756:24;22774:5;22756:24;;22792:85;22858:13;22851:21;;22834:43;22884:144;22956:66;22945:78;;22928:100;23035:72;23097:5;23080:27;23114:121;23187:42;23176:54;;23159:76;23321:129;;23408:37;23439:5;23457:149;;23550:51;23595:5;23550:51;;24267:117;24336:24;24354:5;24336:24;;;24329:5;24326:35;24316:2;;24375:1;24372;24365:12;24391:111;24457:21;24472:5;24457:21;;24509:115;24577:23;24594:5;24577:23;;24631:117;24700:24;24718:5;24700:24;

Swarm Source

bzzr://b88c4d893f077dda6c0538fe84d16d91752446c85ac7db28ab9db94e30067b5e
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.