Address Details
contract

0x7c68B5647fB5624cB1f83209a5D828111f264969

Contract Name
SortedLinkedList
Creator
0xe23a4c–2b2dee at 0xc267ab–6e1f9f
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
3629000
Contract name:
SortedLinkedList




Optimization enabled
false
Compiler version
v0.5.8+commit.23d335f2




Verified at
2020-04-22T22:51:21.816478Z

Contract source code

pragma solidity ^0.5.3;


library SafeMath {
    
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        
        
        
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        
        require(b > 0, errorMessage);
        uint256 c = a / b;
        

        return c;
    }

    
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library LinkedList {
  using SafeMath for uint256;

  struct Element {
    bytes32 previousKey;
    bytes32 nextKey;
    bool exists;
  }

  struct List {
    bytes32 head;
    bytes32 tail;
    uint256 numElements;
    mapping(bytes32 => Element) elements;
  }

  
  function insert(List storage list, bytes32 key, bytes32 previousKey, bytes32 nextKey) public {
    require(key != bytes32(0), "Key must be defined");
    require(!contains(list, key), "Can't insert an existing element");
    require(
      previousKey != key && nextKey != key,
      "Key cannot be the same as previousKey or nextKey"
    );

    Element storage element = list.elements[key];
    element.exists = true;

    if (list.numElements == 0) {
      list.tail = key;
      list.head = key;
    } else {
      require(
        previousKey != bytes32(0) || nextKey != bytes32(0),
        "Either previousKey or nextKey must be defined"
      );

      element.previousKey = previousKey;
      element.nextKey = nextKey;

      if (previousKey != bytes32(0)) {
        require(
          contains(list, previousKey),
          "If previousKey is defined, it must exist in the list"
        );
        Element storage previousElement = list.elements[previousKey];
        require(previousElement.nextKey == nextKey, "previousKey must be adjacent to nextKey");
        previousElement.nextKey = key;
      } else {
        list.tail = key;
      }

      if (nextKey != bytes32(0)) {
        require(contains(list, nextKey), "If nextKey is defined, it must exist in the list");
        Element storage nextElement = list.elements[nextKey];
        require(nextElement.previousKey == previousKey, "previousKey must be adjacent to nextKey");
        nextElement.previousKey = key;
      } else {
        list.head = key;
      }
    }

    list.numElements = list.numElements.add(1);
  }

  
  function push(List storage list, bytes32 key) public {
    insert(list, key, bytes32(0), list.tail);
  }

  
  function remove(List storage list, bytes32 key) public {
    Element storage element = list.elements[key];
    require(key != bytes32(0) && contains(list, key), "key not in list");
    if (element.previousKey != bytes32(0)) {
      Element storage previousElement = list.elements[element.previousKey];
      previousElement.nextKey = element.nextKey;
    } else {
      list.tail = element.nextKey;
    }

    if (element.nextKey != bytes32(0)) {
      Element storage nextElement = list.elements[element.nextKey];
      nextElement.previousKey = element.previousKey;
    } else {
      list.head = element.previousKey;
    }

    delete list.elements[key];
    list.numElements = list.numElements.sub(1);
  }

  
  function update(List storage list, bytes32 key, bytes32 previousKey, bytes32 nextKey) public {
    require(
      key != bytes32(0) && key != previousKey && key != nextKey && contains(list, key),
      "key on in list"
    );
    remove(list, key);
    insert(list, key, previousKey, nextKey);
  }

  
  function contains(List storage list, bytes32 key) public view returns (bool) {
    return list.elements[key].exists;
  }

  
  function headN(List storage list, uint256 n) public view returns (bytes32[] memory) {
    require(n <= list.numElements, "not enough elements");
    bytes32[] memory keys = new bytes32[](n);
    bytes32 key = list.head;
    for (uint256 i = 0; i < n; i = i.add(1)) {
      keys[i] = key;
      key = list.elements[key].previousKey;
    }
    return keys;
  }

  
  function getKeys(List storage list) public view returns (bytes32[] memory) {
    return headN(list, list.numElements);
  }
}

library SortedLinkedList {
  using SafeMath for uint256;
  using LinkedList for LinkedList.List;

  struct List {
    LinkedList.List list;
    mapping(bytes32 => uint256) values;
  }

  
  function insert(
    List storage list,
    bytes32 key,
    uint256 value,
    bytes32 lesserKey,
    bytes32 greaterKey
  ) public {
    require(
      key != bytes32(0) && key != lesserKey && key != greaterKey && !contains(list, key),
      "invalid key"
    );
    require(
      (lesserKey != bytes32(0) || greaterKey != bytes32(0)) || list.list.numElements == 0,
      "greater and lesser key zero"
    );
    require(contains(list, lesserKey) || lesserKey == bytes32(0), "invalid lesser key");
    require(contains(list, greaterKey) || greaterKey == bytes32(0), "invalid greater key");
    (lesserKey, greaterKey) = getLesserAndGreater(list, value, lesserKey, greaterKey);
    list.list.insert(key, lesserKey, greaterKey);
    list.values[key] = value;
  }

  
  function remove(List storage list, bytes32 key) public {
    list.list.remove(key);
    list.values[key] = 0;
  }

  
  function update(
    List storage list,
    bytes32 key,
    uint256 value,
    bytes32 lesserKey,
    bytes32 greaterKey
  ) public {
    
    
    
    remove(list, key);
    insert(list, key, value, lesserKey, greaterKey);
  }

  
  function push(List storage list, bytes32 key) public {
    insert(list, key, 0, bytes32(0), list.list.tail);
  }

  
  function popN(List storage list, uint256 n) public returns (bytes32[] memory) {
    require(n <= list.list.numElements, "not enough elements");
    bytes32[] memory keys = new bytes32[](n);
    for (uint256 i = 0; i < n; i = i.add(1)) {
      bytes32 key = list.list.head;
      keys[i] = key;
      remove(list, key);
    }
    return keys;
  }

  
  function contains(List storage list, bytes32 key) public view returns (bool) {
    return list.list.contains(key);
  }

  
  function getValue(List storage list, bytes32 key) public view returns (uint256) {
    return list.values[key];
  }

  
  function getElements(List storage list) public view returns (bytes32[] memory, uint256[] memory) {
    bytes32[] memory keys = getKeys(list);
    uint256[] memory values = new uint256[](keys.length);
    for (uint256 i = 0; i < keys.length; i = i.add(1)) {
      values[i] = list.values[keys[i]];
    }
    return (keys, values);
  }

  
  function getKeys(List storage list) public view returns (bytes32[] memory) {
    return list.list.getKeys();
  }

  
  function headN(List storage list, uint256 n) public view returns (bytes32[] memory) {
    return list.list.headN(n);
  }

  
  
  function getLesserAndGreater(
    List storage list,
    uint256 value,
    bytes32 lesserKey,
    bytes32 greaterKey
  ) private view returns (bytes32, bytes32) {
    
    
    
    
    
    if (lesserKey == bytes32(0) && isValueBetween(list, value, lesserKey, list.list.tail)) {
      return (lesserKey, list.list.tail);
    } else if (
      greaterKey == bytes32(0) && isValueBetween(list, value, list.list.head, greaterKey)
    ) {
      return (list.list.head, greaterKey);
    } else if (
      lesserKey != bytes32(0) &&
      isValueBetween(list, value, lesserKey, list.list.elements[lesserKey].nextKey)
    ) {
      return (lesserKey, list.list.elements[lesserKey].nextKey);
    } else if (
      greaterKey != bytes32(0) &&
      isValueBetween(list, value, list.list.elements[greaterKey].previousKey, greaterKey)
    ) {
      return (list.list.elements[greaterKey].previousKey, greaterKey);
    } else {
      require(false, "get lesser and greater failure");
    }
  }

  
  function isValueBetween(List storage list, uint256 value, bytes32 lesserKey, bytes32 greaterKey)
    private
    view
    returns (bool)
  {
    bool isLesser = lesserKey == bytes32(0) || list.values[lesserKey] <= value;
    bool isGreater = greaterKey == bytes32(0) || list.values[greaterKey] >= value;
    return isLesser && isGreater;
  }
}
        

Contract ABI

[]
              

Contract Creation Code

0x611030610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100a85760003560e01c806377b024791161007057806377b02479146102ef578063809a6bfd14610389578063b5334180146103d9578063caf2014d1461041e578063dcb2a4dd14610481576100a8565b80630d48ec0c146100ad5780631fd6b4f8146100f95780633a72e8021461015c578063530c2c84146101df57806369b317e314610224575b600080fd5b6100e3600480360360408110156100c357600080fd5b81019080803590602001909291908035906020019092919050505061050e565b6040518082815260200191505060405180910390f35b81801561010557600080fd5b5061015a600480360360a081101561011c57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061052e565b005b6101886004803603602081101561017257600080fd5b810190808035906020019092919050505061054c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156101cb5780820151818401526020810190506101b0565b505050509050019250505060405180910390f35b8180156101eb57600080fd5b506102226004803603604081101561020257600080fd5b81019080803590602001909291908035906020019092919050505061063a565b005b6102506004803603602081101561023a57600080fd5b81019080803590602001909291905050506106cd565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561029757808201518184015260208101905061027c565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156102d95780820151818401526020810190506102be565b5050505090500194505050505060405180910390f35b8180156102fb57600080fd5b506103326004803603604081101561031257600080fd5b81019080803590602001909291908035906020019092919050505061078b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561037557808201518184015260208101905061035a565b505050509050019250505060405180910390f35b6103bf6004803603604081101561039f57600080fd5b8101908080359060200190929190803590602001909291905050506108a2565b604051808215151515815260200191505060405180910390f35b8180156103e557600080fd5b5061041c600480360360408110156103fc57600080fd5b810190808035906020019092919080359060200190929190505050610943565b005b81801561042a57600080fd5b5061047f600480360360a081101561044157600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061095f565b005b6104b76004803603604081101561049757600080fd5b810190808035906020019092919080359060200190929190505050610c67565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104fa5780820151818401526020810190506104df565b505050509050019250505060405180910390f35b600082600401600083815260200190815260200160002054905092915050565b610538858561063a565b610545858585858561095f565b5050505050565b606081600001734cf604c6251c87d0c83e17f88397dec67ead825f63fe3c7a8e90916040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b1580156105a257600080fd5b505af41580156105b6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156105e057600080fd5b8101908080516401000000008111156105f857600080fd5b8281019050602081018481111561060e57600080fd5b815185602082028301116401000000008211171561062b57600080fd5b50509291905050509050919050565b81600001734cf604c6251c87d0c83e17f88397dec67ead825f6342c22dbc9091836040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b15801561069657600080fd5b505af41580156106aa573d6000803e3d6000fd5b505050506000826004016000838152602001908152602001600020819055505050565b60608060606106db8461054c565b90506060815160405190808252806020026020018201604052801561070f5781602001602082028038833980820191505090505b50905060008090505b825181101561077d5785600401600084838151811061073357fe5b602002602001015181526020019081526020016000205482828151811061075657fe5b602002602001018181525050610776600182610d5e90919063ffffffff16565b9050610718565b508181935093505050915091565b6060826000016002015482111561080a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6e6f7420656e6f75676820656c656d656e74730000000000000000000000000081525060200191505060405180910390fd5b60608260405190808252806020026020018201604052801561083b5781602001602082028038833980820191505090505b50905060008090505b83811015610897576000856000016000015490508083838151811061086557fe5b60200260200101818152505061087b868261063a565b50610890600182610d5e90919063ffffffff16565b9050610844565b508091505092915050565b600082600001734cf604c6251c87d0c83e17f88397dec67ead825f637ae0d32b9091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561090057600080fd5b505af4158015610914573d6000803e3d6000fd5b505050506040513d602081101561092a57600080fd5b8101908080519060200190929190505050905092915050565b61095b828260008060001b866000016001015461095f565b5050565b6000801b84141580156109725750818414155b801561097e5750808414155b8015610991575061098f85856108a2565b155b610a03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f696e76616c6964206b657900000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000801b82141580610a1857506000801b8114155b80610a2a575060008560000160020154145b610a9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6772656174657220616e64206c6573736572206b6579207a65726f000000000081525060200191505060405180910390fd5b610aa685836108a2565b80610ab357506000801b82145b610b25576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e76616c6964206c6573736572206b6579000000000000000000000000000081525060200191505060405180910390fd5b610b2f85826108a2565b80610b3c57506000801b81145b610bae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c69642067726561746572206b65790000000000000000000000000081525060200191505060405180910390fd5b610bba85848484610de6565b809250819350505084600001734cf604c6251c87d0c83e17f88397dec67ead825f63e931818590918685856040518563ffffffff1660e01b81526004018085815260200184815260200183815260200182815260200194505050505060006040518083038186803b158015610c2e57600080fd5b505af4158015610c42573d6000803e3d6000fd5b5050505082856004016000868152602001908152602001600020819055505050505050565b606082600001734cf604c6251c87d0c83e17f88397dec67ead825f63b1cfea439091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b158015610cc557600080fd5b505af4158015610cd9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015610d0357600080fd5b810190808051640100000000811115610d1b57600080fd5b82810190506020810184811115610d3157600080fd5b8151856020820283011164010000000082111715610d4e57600080fd5b5050929190505050905092915050565b600080828401905083811015610ddc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000806000801b84148015610e0a5750610e098686868960000160010154610f99565b5b15610e215783866000016001015491509150610f90565b6000801b83148015610e425750610e418686886000016000015486610f99565b5b15610e595785600001600001548391509150610f90565b6000801b8414158015610e8f5750610e8e86868689600001600301600089815260200190815260200160002060010154610f99565b5b15610eba57838660000160030160008681526020019081526020016000206001015491509150610f90565b6000801b8314158015610ef05750610eef86868860000160030160008781526020019081526020016000206000015486610f99565b5b15610f1b57856000016003016000848152602001908152602001600020600001548391509150610f90565b6000610f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f676574206c657373657220616e642067726561746572206661696c757265000081525060200191505060405180910390fd5b5b94509492505050565b6000806000801b841480610fc25750848660040160008681526020019081526020016000205411155b905060008060001b841480610fec5750858760040160008681526020019081526020016000205410155b9050818015610ff85750805b9250505094935050505056fea165627a7a72305820525cb792e6e15272dfe57c4cd153a4f603813b417fbf2cc070a66c6b3d8dba000029

Deployed ByteCode

0x737c68b5647fb5624cb1f83209a5d828111f26496930146080604052600436106100a85760003560e01c806377b024791161007057806377b02479146102ef578063809a6bfd14610389578063b5334180146103d9578063caf2014d1461041e578063dcb2a4dd14610481576100a8565b80630d48ec0c146100ad5780631fd6b4f8146100f95780633a72e8021461015c578063530c2c84146101df57806369b317e314610224575b600080fd5b6100e3600480360360408110156100c357600080fd5b81019080803590602001909291908035906020019092919050505061050e565b6040518082815260200191505060405180910390f35b81801561010557600080fd5b5061015a600480360360a081101561011c57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061052e565b005b6101886004803603602081101561017257600080fd5b810190808035906020019092919050505061054c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156101cb5780820151818401526020810190506101b0565b505050509050019250505060405180910390f35b8180156101eb57600080fd5b506102226004803603604081101561020257600080fd5b81019080803590602001909291908035906020019092919050505061063a565b005b6102506004803603602081101561023a57600080fd5b81019080803590602001909291905050506106cd565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561029757808201518184015260208101905061027c565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156102d95780820151818401526020810190506102be565b5050505090500194505050505060405180910390f35b8180156102fb57600080fd5b506103326004803603604081101561031257600080fd5b81019080803590602001909291908035906020019092919050505061078b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561037557808201518184015260208101905061035a565b505050509050019250505060405180910390f35b6103bf6004803603604081101561039f57600080fd5b8101908080359060200190929190803590602001909291905050506108a2565b604051808215151515815260200191505060405180910390f35b8180156103e557600080fd5b5061041c600480360360408110156103fc57600080fd5b810190808035906020019092919080359060200190929190505050610943565b005b81801561042a57600080fd5b5061047f600480360360a081101561044157600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061095f565b005b6104b76004803603604081101561049757600080fd5b810190808035906020019092919080359060200190929190505050610c67565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104fa5780820151818401526020810190506104df565b505050509050019250505060405180910390f35b600082600401600083815260200190815260200160002054905092915050565b610538858561063a565b610545858585858561095f565b5050505050565b606081600001734cf604c6251c87d0c83e17f88397dec67ead825f63fe3c7a8e90916040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b1580156105a257600080fd5b505af41580156105b6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156105e057600080fd5b8101908080516401000000008111156105f857600080fd5b8281019050602081018481111561060e57600080fd5b815185602082028301116401000000008211171561062b57600080fd5b50509291905050509050919050565b81600001734cf604c6251c87d0c83e17f88397dec67ead825f6342c22dbc9091836040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b15801561069657600080fd5b505af41580156106aa573d6000803e3d6000fd5b505050506000826004016000838152602001908152602001600020819055505050565b60608060606106db8461054c565b90506060815160405190808252806020026020018201604052801561070f5781602001602082028038833980820191505090505b50905060008090505b825181101561077d5785600401600084838151811061073357fe5b602002602001015181526020019081526020016000205482828151811061075657fe5b602002602001018181525050610776600182610d5e90919063ffffffff16565b9050610718565b508181935093505050915091565b6060826000016002015482111561080a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6e6f7420656e6f75676820656c656d656e74730000000000000000000000000081525060200191505060405180910390fd5b60608260405190808252806020026020018201604052801561083b5781602001602082028038833980820191505090505b50905060008090505b83811015610897576000856000016000015490508083838151811061086557fe5b60200260200101818152505061087b868261063a565b50610890600182610d5e90919063ffffffff16565b9050610844565b508091505092915050565b600082600001734cf604c6251c87d0c83e17f88397dec67ead825f637ae0d32b9091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561090057600080fd5b505af4158015610914573d6000803e3d6000fd5b505050506040513d602081101561092a57600080fd5b8101908080519060200190929190505050905092915050565b61095b828260008060001b866000016001015461095f565b5050565b6000801b84141580156109725750818414155b801561097e5750808414155b8015610991575061098f85856108a2565b155b610a03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f696e76616c6964206b657900000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000801b82141580610a1857506000801b8114155b80610a2a575060008560000160020154145b610a9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6772656174657220616e64206c6573736572206b6579207a65726f000000000081525060200191505060405180910390fd5b610aa685836108a2565b80610ab357506000801b82145b610b25576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e76616c6964206c6573736572206b6579000000000000000000000000000081525060200191505060405180910390fd5b610b2f85826108a2565b80610b3c57506000801b81145b610bae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c69642067726561746572206b65790000000000000000000000000081525060200191505060405180910390fd5b610bba85848484610de6565b809250819350505084600001734cf604c6251c87d0c83e17f88397dec67ead825f63e931818590918685856040518563ffffffff1660e01b81526004018085815260200184815260200183815260200182815260200194505050505060006040518083038186803b158015610c2e57600080fd5b505af4158015610c42573d6000803e3d6000fd5b5050505082856004016000868152602001908152602001600020819055505050505050565b606082600001734cf604c6251c87d0c83e17f88397dec67ead825f63b1cfea439091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b158015610cc557600080fd5b505af4158015610cd9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015610d0357600080fd5b810190808051640100000000811115610d1b57600080fd5b82810190506020810184811115610d3157600080fd5b8151856020820283011164010000000082111715610d4e57600080fd5b5050929190505050905092915050565b600080828401905083811015610ddc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000806000801b84148015610e0a5750610e098686868960000160010154610f99565b5b15610e215783866000016001015491509150610f90565b6000801b83148015610e425750610e418686886000016000015486610f99565b5b15610e595785600001600001548391509150610f90565b6000801b8414158015610e8f5750610e8e86868689600001600301600089815260200190815260200160002060010154610f99565b5b15610eba57838660000160030160008681526020019081526020016000206001015491509150610f90565b6000801b8314158015610ef05750610eef86868860000160030160008781526020019081526020016000206000015486610f99565b5b15610f1b57856000016003016000848152602001908152602001600020600001548391509150610f90565b6000610f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f676574206c657373657220616e642067726561746572206661696c757265000081525060200191505060405180910390fd5b5b94509492505050565b6000806000801b841480610fc25750848660040160008681526020019081526020016000205411155b905060008060001b841480610fec5750858760040160008681526020019081526020016000205410155b9050818015610ff85750805b9250505094935050505056fea165627a7a72305820525cb792e6e15272dfe57c4cd153a4f603813b417fbf2cc070a66c6b3d8dba000029

External libraries