Contract 0xe3c2B0D598e699a0201AD2E83048352D3362ae6C 1

 
 
Txn Hash
Method
Block
From
To
Value
0xe1d0c67d1aecaf455f3a401832cd902af687c08345453cb6ff81ca2aa49e132dWithdraw Bank102006252020-06-04 17:19:16912 days 20 hrs ago0x55baf506ef0486078ae31c5d0960cc46cf7e2e42 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.0005946919.8
0xee53d059269e0ff4b59f784ba6ace256867bf4a415da817f85dba555ed494cfeWithdraw Bank102006072020-06-04 17:15:27912 days 20 hrs ago0x55baf506ef0486078ae31c5d0960cc46cf7e2e42 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.0005404118
0x007d6bde43a0930641335fa68513172951cdfac5c701a79bc14b888d1bae4446Transfer101208272020-05-23 7:43:17925 days 5 hrs ago0xe77069814712a0e9a1d0fc360a806b7399d41d27 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.0006397211.11000023
0xc9443cff2a7baca81c60acfd24e13971c95c08a38ac177088c53f6e19be1d0dcTransfer100959532020-05-19 10:52:01929 days 2 hrs ago0x1e9ebaa7949c2c185c2c2ea7d55b7c74e6273066 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.0014395225
0x23c2e504017f9cb6bd1c62fef9fe32835ffbf00626fae49c00277dd1e36cfc07Transfer100577672020-05-13 12:21:36935 days 57 mins ago0x327b6d337ec099ef8fcd148fcf8da0725758a579 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.0009793623
0xd797fd60ba9f07328afa9bbd975e27d95eb77e3f6c98e909a3e27b5ad3e021bdTransfer100288332020-05-09 0:28:15939 days 12 hrs ago0x32a5cc9172eb9ff750bb23c9b741698e24f84797 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.0001477
0xd029881f3190881d7767619819895121a0508b073364fc9b0b8ecb048aa88b6cTransfer100200182020-05-07 15:51:53940 days 21 hrs ago0xb48f90698e3e7c1764a331f9f304baa92f61339d IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.0009788717
0x1f095e6134e8e740bf78b492b3e7d9a086f01e24c0880c6c5b8366d362fba951Transfer100160882020-05-07 1:07:05941 days 12 hrs ago0xa6749e13fae96dbc18fd9416bf2b41fb611d99f3 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0.01 Ether0.0006340411
0xdebffc150361cc2505c1719f5ec2be7d2a06b593519e4fe0fe3a47f7c1b62dcbTransfer100141812020-05-06 18:01:57941 days 19 hrs ago0x9a47afa4a237744eb658d4ea5d7109c63d3778d7 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.0007485513
0x275270113f957160728f7e0fce1827bdc02a2a5776799f2c358f358352711e6aTransfer100129502020-05-06 13:24:11941 days 23 hrs ago0x327b6d337ec099ef8fcd148fcf8da0725758a579 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.0011654320.24
0xdbfc9e04125dcc999f44e604317c094b4dadcc01938761fb36b16d7fed37c0edTransfer100128012020-05-06 12:53:54942 days 25 mins ago0x5adc9fe9053671779e52a97f794171e3a8cbbc50 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.0010364518
0x0ff5ab05d456843f806c860200ddbf4caa611c91db5818116528a3e3e642212f__callback100085382020-05-05 21:03:33942 days 16 hrs ago0x000042424df234698d1664fe001edba709cbe346 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.000411456.001
0x58ab734bb12e5df5fed8cdac19b909f0108df41cb428977303478829d5e8ae93Transfer100085362020-05-05 21:03:21942 days 16 hrs ago0xc6b32f65627f638f24ed55f31d98eaab135aa57a IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0.02 Ether0.000999985.4
0x01ea7327b31657ec7cffff5b79c91f6bf7322a49cf184645ea5c5c1089298564__callback100085302020-05-05 21:00:32942 days 16 hrs ago0x00004242752701da2eb51ec49bc8252134395e10 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.000378936.001
0x015c6818f7a9c67aaee3fe0c241eeefcbd88102d76637ee9d0ef62f602228d4bTransfer100085272020-05-05 20:59:56942 days 16 hrs ago0xc6b32f65627f638f24ed55f31d98eaab135aa57a IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0.02 Ether0.000740734
0xde7c88a6e5b36b3c33b92b12338c1bce972eea1a5b8b9aace6510d7a437253e4__callback100059082020-05-05 11:12:01943 days 2 hrs ago0x000042424df234698d1664fe001edba709cbe346 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.000379086.001
0xec72400ab4d9e86776406c20d2bdb31997e156801aedf6f70a4238c493881b28Transfer100059072020-05-05 11:11:56943 days 2 hrs ago0xc6b32f65627f638f24ed55f31d98eaab135aa57a IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.000255486
0x091e1a346c55ae7609c7390c11ff39096bf4a090dceb28361d5bcce4d27f2a7cTransfer100059072020-05-05 11:11:56943 days 2 hrs ago0xc6b32f65627f638f24ed55f31d98eaab135aa57a IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0.02 Ether0.001111096
0x0aca594ccb4f1efba21adb311bc27f5eec179fa649646bde9aa85228f9709e86Transfer100051042020-05-05 8:19:03943 days 5 hrs ago0xfe97bc27bb469f58b718540decdd5ec95ec884fd IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.0006909712
0xb8a3799624fd97f9840e5d113f6507c3a9f21b9985ebea25d3298e627a781ea5__callback99921132020-05-03 8:28:42945 days 4 hrs ago0x000042424df234698d1664fe001edba709cbe346 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.000354426.001
0xf44306d11b36b5cb73f2075752cbd32cf759445a9cccd0b68bf61e2bb7bb49a4Transfer99921112020-05-03 8:28:28945 days 4 hrs ago0xc6b32f65627f638f24ed55f31d98eaab135aa57a IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0.02 Ether0.001201096
0x40785668fff07d332f82beebe08930ee0b095701a3813a4242150a769e3aa537Transfer99914192020-05-03 5:56:50945 days 7 hrs ago0xdf87601fc5a532ca5199871c2360ea300c3c6e57 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.00028795
0xecd4243b75ad73e1ae7c0526c6b210a95e5a69c2cbcc97ced99028ee5fca3768Transfer99886062020-05-02 19:15:12945 days 18 hrs ago0x150b280d8b51c354dc20590ffc4f6b4881f40c3f IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.000172743
0xbc27dffd5cdb749df7afe0679decb13324f4692e2fae0b5217c4285a18ffb822Transfer99819662020-05-01 18:34:52946 days 18 hrs ago0x93ae7f738095da12c9a2e610dc9f3cac82e700d6 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.00021295
0x10e8dea06eae2a3fd72c55e2af2d04998a990326c256a073d0ce33f19fc66ab3Transfer99819242020-05-01 18:25:50946 days 18 hrs ago0x93ae7f738095da12c9a2e610dc9f3cac82e700d6 IN  0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0 Ether0.00021295
[ Download CSV Export 
Latest 15 internal transactions
Parent Txn Hash Block From To Value
0xe1d0c67d1aecaf455f3a401832cd902af687c08345453cb6ff81ca2aa49e132d102006252020-06-04 17:19:16912 days 20 hrs ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0x55baf506ef0486078ae31c5d0960cc46cf7e2e421.10047277 Ether
0xee53d059269e0ff4b59f784ba6ace256867bf4a415da817f85dba555ed494cfe102006072020-06-04 17:15:27912 days 20 hrs ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0x55baf506ef0486078ae31c5d0960cc46cf7e2e420.00110157 Ether
0x0ff5ab05d456843f806c860200ddbf4caa611c91db5818116528a3e3e642212f100085382020-05-05 21:03:33942 days 16 hrs ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0xc6b32f65627f638f24ed55f31d98eaab135aa57a0.04 Ether
0x58ab734bb12e5df5fed8cdac19b909f0108df41cb428977303478829d5e8ae93100085362020-05-05 21:03:21942 days 16 hrs ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.00092017 Ether
0x015c6818f7a9c67aaee3fe0c241eeefcbd88102d76637ee9d0ef62f602228d4b100085272020-05-05 20:59:56942 days 16 hrs ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.00092017 Ether
0x091e1a346c55ae7609c7390c11ff39096bf4a090dceb28361d5bcce4d27f2a7c100059072020-05-05 11:11:56943 days 2 hrs ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.00092017 Ether
0xf44306d11b36b5cb73f2075752cbd32cf759445a9cccd0b68bf61e2bb7bb49a499921112020-05-03 8:28:28945 days 4 hrs ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.00092017 Ether
0xab3142bc6f60872a76f0cb9d5940a4b03dd84e1d9b7b69737367d598f40402ba99811352020-05-01 15:26:51946 days 21 hrs ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.00069817 Ether
0xb1a608bd0dea8367ad232a6b1c131f448552579e8d3958a7712557de2611b2e999764732020-04-30 22:13:21947 days 15 hrs ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0x201587594e3d8d1fcf6cb52853c0695139b4e89a0.02 Ether
0xffee6669c1c75e0cc2b933ed5c3b589dad363fffd2fa399d168ecbef13f2301599756192020-04-30 18:47:39947 days 18 hrs ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.00069817 Ether
0xb6168d8d2070b74da768564f76a9199c7add4ec69f6612ab8d9f8c927c8cd4d099615092020-04-28 14:20:46949 days 22 hrs ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.00069817 Ether
0x28f18da3044aec54dd02e93be52435ae1fbcf49047bbebffdd64525fcc62584899611272020-04-28 12:54:59950 days 24 mins ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.00069817 Ether
0xa2617f667e1f0c4f74c8b16dcd5384971125c2c96ef0189e70e0b256fb92099699608382020-04-28 11:50:22950 days 1 hr ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.00069817 Ether
0x64e905cfd816659a49525d8656921ec298b5d21c81139fe5736a0536836e116399607552020-04-28 11:30:50950 days 1 hr ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c0x55baf506ef0486078ae31c5d0960cc46cf7e2e420.02 Ether
0xc19aa47eafc8b40ac9363b447cf094ebfb83345ac908b513563599e05eb4483a99607512020-04-28 11:30:12950 days 1 hr ago 0xe3c2b0d598e699a0201ad2e83048352d3362ae6c 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.00125406 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
xETHFlip

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 2: flip.sol
pragma solidity > 0.6.1 < 0.7.0;

import "./provableAPI_0.6.sol";

interface IERC20 {
  function totalSupply() external view returns (uint256);
  function balanceOf(address account) external view returns (uint256);
  function transfer(address recipient, uint256 amount) external returns (bool);
  function allowance(address owner, address spender) external view returns (uint256);
  function approve(address spender, uint256 amount) external returns (bool);
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
  function mint(address account, uint256 amount) external;
  function burn(address account, uint256 amount) external;
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract Owned {
  address public owner;
  address public newOwner;

  event OwnershipTransferred(address indexed _from, address indexed _to);

  constructor() public {
    owner = msg.sender;
  }

  modifier onlyOwner {
    require(msg.sender == owner);
    _;
  }

  function transferOwnership(address _newOwner) public onlyOwner {
    newOwner = _newOwner;
  }
  function acceptOwnership() public {
    require(msg.sender == newOwner);
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
    newOwner = address(0);
  }
}

contract xETHFlip is Owned, usingProvable {
  using SafeMath for uint;

  event BetEvent(bytes32 queryId, address account, uint256 amount);
  event BetOutcome(bytes32 queryId, address account, uint256 amount, bool win);
  event LogNewProvableQuery(string description);

  constructor() public {
    provable_setProof(proofType_Ledger);
    provable_setCustomGasPrice(5000000000);
    maximumBetRatio = 10;
    minimumBet = 10**16;
    tokenBase = 100 * 10**18;
    tokenRatio = 10000 * 10**6;
    odds = 47;
  }

  uint256 GAS_FOR_CALLBACK = 200000;
  uint256 public minimumBet;
  uint256 public maximumBetRatio;
  uint256 public odds;

  IERC20 token;
  uint256 public tokenBase;
  uint256 public tokenRatio;

  struct betstruct {
    address payable account;
    uint256 amount;
    bool resolved;
  }

  mapping(bytes32 => betstruct) public bets;

  receive() external payable {
    uint256 _eth = msg.value;
    uint256 _maximumBet = getMaximumBet();
    uint256 _toMint = _eth.mul(tokenRatio).div(10**6).add(tokenBase);

    token.mint(msg.sender, _toMint);

    if (_eth > _maximumBet) {
      revert();
    }

    else if(_eth >= minimumBet) {
      uint256 QUERY_EXECUTION_DELAY = 0;

      bytes32 _queryId =  provable_newRandomDSQuery(
        QUERY_EXECUTION_DELAY,
        NUM_RANDOM_BYTES_REQUESTED,
        GAS_FOR_CALLBACK
      );

      bets[_queryId].account = msg.sender;
      bets[_queryId].amount = _eth;

      emit BetEvent(_queryId, msg.sender, _eth);
    }
  }

  function getMaximumBet() public view returns(uint256) {
    uint256 _amount = address(this).balance.div(maximumBetRatio);
    return(_amount);
  }

  function setToken(IERC20 _token) public onlyOwner() {
    token = _token;
  }
  function setTokenBase(uint256 _amount) public onlyOwner() {
    tokenBase = _amount;
  }
  function setTokenRatio(uint256 _amount) public onlyOwner() {
    tokenRatio = _amount;
  }
  function setMinimumBet(uint256 _amount) public onlyOwner() {
    minimumBet = _amount;
  }
  function setMaximumBet(uint256 _amount) public onlyOwner() {
    maximumBetRatio = _amount;
  }
  function setOdds(uint256 _odds) public onlyOwner() {
    odds = _odds;
  }
  function receiveBank() public payable {
  }
  function withdrawBank(uint256 amount) public onlyOwner() {
    address payable account = msg.sender;
    account.transfer(amount);
  }
  function setprovablegasprice(uint256 _price) public onlyOwner() {
    provable_setCustomGasPrice(_price);
  }
  function setgasforcallback(uint256 _gas) public onlyOwner() {
    GAS_FOR_CALLBACK = _gas;
  }
  function withdrawTokens(IERC20 _token, uint256 _amount) public onlyOwner() {
    _token.transfer(msg.sender, _amount);
  }

  uint256 constant MAX_INT_FROM_BYTE = 256;
  uint256 constant NUM_RANDOM_BYTES_REQUESTED = 7;

  function __callback(
    bytes32 _queryId,
    string memory _result,
    bytes memory _proof
  )
  override
  public
  {
    require(msg.sender == provable_cbAddress());

    if (
      provable_randomDS_proofVerify__returnCode(
        _queryId,
        _result,
        _proof
      ) != 0
    ) {

    } else {

      uint256 _returnValue = uint256(keccak256(abi.encodePacked(_result))) % 100;

      if(_returnValue < odds) {
        address payable _account = bets[_queryId].account;
        uint256 _amount = bets[_queryId].amount.mul(2);
        _account.transfer(_amount);
        emit BetOutcome(_queryId, bets[_queryId].account, bets[_queryId].amount, true);
      }
      else {
        emit BetOutcome(_queryId, bets[_queryId].account, bets[_queryId].amount, false);
      }

    }
  }


}

library SafeMath {
  /**
  * @dev Returns the addition of two unsigned integers, reverting on
  * overflow.
  *
  * Counterpart to Solidity's `+` operator.
  *
  * Requirements:
  * - Addition cannot overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a, "SafeMath: addition overflow");

    return c;
  }

  /**
  * @dev Returns the subtraction of two unsigned integers, reverting on
  * overflow (when the result is negative).
  *
  * Counterpart to Solidity's `-` operator.
  *
  * Requirements:
  * - Subtraction cannot overflow.
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    return sub(a, b, "SafeMath: subtraction overflow");
  }

  /**
  * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
  * overflow (when the result is negative).
  *
  * Counterpart to Solidity's `-` operator.
  *
  * Requirements:
  * - Subtraction cannot overflow.
  *
  * _Available since v2.4.0._
  */
  function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
    require(b <= a, errorMessage);
    uint256 c = a - b;

    return c;
  }

  /**
  * @dev Returns the multiplication of two unsigned integers, reverting on
  * overflow.
  *
  * Counterpart to Solidity's `*` operator.
  *
  * Requirements:
  * - Multiplication cannot overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
    if (a == 0) {
      return 0;
    }

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

    return c;
  }

  /**
  * @dev Returns the integer division of two unsigned integers. Reverts on
  * division by zero. The result is rounded towards zero.
  *
  * Counterpart to Solidity's `/` operator. Note: this function uses a
  * `revert` opcode (which leaves remaining gas untouched) while Solidity
  * uses an invalid opcode to revert (consuming all remaining gas).
  *
  * Requirements:
  * - The divisor cannot be zero.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    return div(a, b, "SafeMath: division by zero");
  }

  /**
  * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
  * division by zero. The result is rounded towards zero.
  *
  * Counterpart to Solidity's `/` operator. Note: this function uses a
  * `revert` opcode (which leaves remaining gas untouched) while Solidity
  * uses an invalid opcode to revert (consuming all remaining gas).
  *
  * Requirements:
  * - The divisor cannot be zero.
  *
  * _Available since v2.4.0._
  */
  function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, errorMessage);
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
  * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
  * Reverts when dividing by zero.
  *
  * Counterpart to Solidity's `%` operator. This function uses a `revert`
  * opcode (which leaves remaining gas untouched) while Solidity uses an
  * invalid opcode to revert (consuming all remaining gas).
  *
  * Requirements:
  * - The divisor cannot be zero.
  */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    return mod(a, b, "SafeMath: modulo by zero");
  }

  /**
  * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
  * Reverts with custom message when dividing by zero.
  *
  * Counterpart to Solidity's `%` operator. This function uses a `revert`
  * opcode (which leaves remaining gas untouched) while Solidity uses an
  * invalid opcode to revert (consuming all remaining gas).
  *
  * Requirements:
  * - The divisor cannot be zero.
  *
  * _Available since v2.4.0._
  */
  function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
    require(b != 0, errorMessage);
    return a % b;
  }
}

File 2 of 2: provableAPI_0.6.sol
// <provableAPI>
/*
Copyright (c) 2015-2016 Oraclize SRL
Copyright (c) 2016-2019 Oraclize LTD
Copyright (c) 2019-2020 Provable Things Limited
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
pragma solidity > 0.6.1 < 0.7.0; // Incompatible compiler version - please select a compiler within the stated pragma range, or use a different version of the provableAPI!

// Dummy contract only used to emit to end-user they are using wrong solc
abstract contract solcChecker {
/* INCOMPATIBLE SOLC: import the following instead: "github.com/oraclize/ethereum-api/oraclizeAPI_0.4.sol" */ function f(bytes calldata x) virtual external;
}

interface ProvableI {

    function cbAddress() external returns (address _cbAddress);
    function setProofType(byte _proofType) external;
    function setCustomGasPrice(uint _gasPrice) external;
    function getPrice(string calldata _datasource) external returns (uint _dsprice);
    function randomDS_getSessionPubKeyHash() external view returns (bytes32 _sessionKeyHash);
    function getPrice(string calldata _datasource, uint _gasLimit)  external returns (uint _dsprice);
    function queryN(uint _timestamp, string calldata _datasource, bytes calldata _argN) external payable returns (bytes32 _id);
    function query(uint _timestamp, string calldata _datasource, string calldata _arg) external payable returns (bytes32 _id);
    function query2(uint _timestamp, string calldata _datasource, string calldata _arg1, string calldata _arg2) external payable returns (bytes32 _id);
    function query_withGasLimit(uint _timestamp, string calldata _datasource, string calldata _arg, uint _gasLimit) external payable returns (bytes32 _id);
    function queryN_withGasLimit(uint _timestamp, string calldata _datasource, bytes calldata _argN, uint _gasLimit) external payable returns (bytes32 _id);
    function query2_withGasLimit(uint _timestamp, string calldata _datasource, string calldata _arg1, string calldata _arg2, uint _gasLimit) external payable returns (bytes32 _id);
}

interface OracleAddrResolverI {
    function getAddress() external returns (address _address);
}
/*
Begin solidity-cborutils
https://github.com/smartcontractkit/solidity-cborutils
MIT License
Copyright (c) 2018 SmartContract ChainLink, Ltd.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
library Buffer {

    struct buffer {
        bytes buf;
        uint capacity;
    }

    function init(buffer memory _buf, uint _capacity) internal pure {
        uint capacity = _capacity;
        if (capacity % 32 != 0) {
            capacity += 32 - (capacity % 32);
        }
        _buf.capacity = capacity; // Allocate space for the buffer data
        assembly {
            let ptr := mload(0x40)
            mstore(_buf, ptr)
            mstore(ptr, 0)
            mstore(0x40, add(ptr, capacity))
        }
    }

    function resize(buffer memory _buf, uint _capacity) private pure {
        bytes memory oldbuf = _buf.buf;
        init(_buf, _capacity);
        append(_buf, oldbuf);
    }

    function max(uint _a, uint _b) private pure returns (uint _max) {
        if (_a > _b) {
            return _a;
        }
        return _b;
    }
    /**
      * @dev Appends a byte array to the end of the buffer. Resizes if doing so
      *      would exceed the capacity of the buffer.
      * @param _buf The buffer to append to.
      * @param _data The data to append.
      * @return _buffer The original buffer.
      *
      */
    function append(buffer memory _buf, bytes memory _data) internal pure returns (buffer memory _buffer) {
        if (_data.length + _buf.buf.length > _buf.capacity) {
            resize(_buf, max(_buf.capacity, _data.length) * 2);
        }
        uint dest;
        uint src;
        uint len = _data.length;
        assembly {
            let bufptr := mload(_buf) // Memory address of the buffer data
            let buflen := mload(bufptr) // Length of existing buffer data
            dest := add(add(bufptr, buflen), 32) // Start address = buffer address + buffer length + sizeof(buffer length)
            mstore(bufptr, add(buflen, mload(_data))) // Update buffer length
            src := add(_data, 32)
        }
        for(; len >= 32; len -= 32) { // Copy word-length chunks while possible
            assembly {
                mstore(dest, mload(src))
            }
            dest += 32;
            src += 32;
        }
        uint mask = 256 ** (32 - len) - 1; // Copy remaining bytes
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }
        return _buf;
    }
    /**
      *
      * @dev Appends a byte to the end of the buffer. Resizes if doing so would
      * exceed the capacity of the buffer.
      * @param _buf The buffer to append to.
      * @param _data The data to append.
      *
      */
    function append(buffer memory _buf, uint8 _data) internal pure {
        if (_buf.buf.length + 1 > _buf.capacity) {
            resize(_buf, _buf.capacity * 2);
        }
        assembly {
            let bufptr := mload(_buf) // Memory address of the buffer data
            let buflen := mload(bufptr) // Length of existing buffer data
            let dest := add(add(bufptr, buflen), 32) // Address = buffer address + buffer length + sizeof(buffer length)
            mstore8(dest, _data)
            mstore(bufptr, add(buflen, 1)) // Update buffer length
        }
    }
    /**
      *
      * @dev Appends a byte to the end of the buffer. Resizes if doing so would
      * exceed the capacity of the buffer.
      * @param _buf The buffer to append to.
      * @param _data The data to append.
      * @return _buffer The original buffer.
      *
      */
    function appendInt(buffer memory _buf, uint _data, uint _len) internal pure returns (buffer memory _buffer) {
        if (_len + _buf.buf.length > _buf.capacity) {
            resize(_buf, max(_buf.capacity, _len) * 2);
        }
        uint mask = 256 ** _len - 1;
        assembly {
            let bufptr := mload(_buf) // Memory address of the buffer data
            let buflen := mload(bufptr) // Length of existing buffer data
            let dest := add(add(bufptr, buflen), _len) // Address = buffer address + buffer length + sizeof(buffer length) + len
            mstore(dest, or(and(mload(dest), not(mask)), _data))
            mstore(bufptr, add(buflen, _len)) // Update buffer length
        }
        return _buf;
    }
}

library CBOR {

    using Buffer for Buffer.buffer;

    uint8 private constant MAJOR_TYPE_INT = 0;
    uint8 private constant MAJOR_TYPE_MAP = 5;
    uint8 private constant MAJOR_TYPE_BYTES = 2;
    uint8 private constant MAJOR_TYPE_ARRAY = 4;
    uint8 private constant MAJOR_TYPE_STRING = 3;
    uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;
    uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;

    function encodeType(Buffer.buffer memory _buf, uint8 _major, uint _value) private pure {
        if (_value <= 23) {
            _buf.append(uint8((_major << 5) | _value));
        } else if (_value <= 0xFF) {
            _buf.append(uint8((_major << 5) | 24));
            _buf.appendInt(_value, 1);
        } else if (_value <= 0xFFFF) {
            _buf.append(uint8((_major << 5) | 25));
            _buf.appendInt(_value, 2);
        } else if (_value <= 0xFFFFFFFF) {
            _buf.append(uint8((_major << 5) | 26));
            _buf.appendInt(_value, 4);
        } else if (_value <= 0xFFFFFFFFFFFFFFFF) {
            _buf.append(uint8((_major << 5) | 27));
            _buf.appendInt(_value, 8);
        }
    }

    function encodeIndefiniteLengthType(Buffer.buffer memory _buf, uint8 _major) private pure {
        _buf.append(uint8((_major << 5) | 31));
    }

    function encodeUInt(Buffer.buffer memory _buf, uint _value) internal pure {
        encodeType(_buf, MAJOR_TYPE_INT, _value);
    }

    function encodeInt(Buffer.buffer memory _buf, int _value) internal pure {
        if (_value >= 0) {
            encodeType(_buf, MAJOR_TYPE_INT, uint(_value));
        } else {
            encodeType(_buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - _value));
        }
    }

    function encodeBytes(Buffer.buffer memory _buf, bytes memory _value) internal pure {
        encodeType(_buf, MAJOR_TYPE_BYTES, _value.length);
        _buf.append(_value);
    }

    function encodeString(Buffer.buffer memory _buf, string memory _value) internal pure {
        encodeType(_buf, MAJOR_TYPE_STRING, bytes(_value).length);
        _buf.append(bytes(_value));
    }

    function startArray(Buffer.buffer memory _buf) internal pure {
        encodeIndefiniteLengthType(_buf, MAJOR_TYPE_ARRAY);
    }

    function startMap(Buffer.buffer memory _buf) internal pure {
        encodeIndefiniteLengthType(_buf, MAJOR_TYPE_MAP);
    }

    function endSequence(Buffer.buffer memory _buf) internal pure {
        encodeIndefiniteLengthType(_buf, MAJOR_TYPE_CONTENT_FREE);
    }
}
/*
End solidity-cborutils
*/
contract usingProvable {

    using CBOR for Buffer.buffer;

    ProvableI provable;
    OracleAddrResolverI OAR;

    uint constant day = 60 * 60 * 24;
    uint constant week = 60 * 60 * 24 * 7;
    uint constant month = 60 * 60 * 24 * 30;

    byte constant proofType_NONE = 0x00;
    byte constant proofType_Ledger = 0x30;
    byte constant proofType_Native = 0xF0;
    byte constant proofStorage_IPFS = 0x01;
    byte constant proofType_Android = 0x40;
    byte constant proofType_TLSNotary = 0x10;

    string provable_network_name;
    uint8 constant networkID_auto = 0;
    uint8 constant networkID_morden = 2;
    uint8 constant networkID_mainnet = 1;
    uint8 constant networkID_testnet = 2;
    uint8 constant networkID_consensys = 161;

    mapping(bytes32 => bytes32) provable_randomDS_args;
    mapping(bytes32 => bool) provable_randomDS_sessionKeysHashVerified;

    modifier provableAPI {
        if ((address(OAR) == address(0)) || (getCodeSize(address(OAR)) == 0)) {
            provable_setNetwork(networkID_auto);
        }
        if (address(provable) != OAR.getAddress()) {
            provable = ProvableI(OAR.getAddress());
        }
        _;
    }

    modifier provable_randomDS_proofVerify(bytes32 _queryId, string memory _result, bytes memory _proof) {
        // RandomDS Proof Step 1: The prefix has to match 'LP\x01' (Ledger Proof version 1)
        require((_proof[0] == "L") && (_proof[1] == "P") && (uint8(_proof[2]) == uint8(1)));
        bool proofVerified = provable_randomDS_proofVerify__main(_proof, _queryId, bytes(_result), provable_getNetworkName());
        require(proofVerified);
        _;
    }

    function provable_setNetwork(uint8 _networkID) internal returns (bool _networkSet) {
      _networkID; // NOTE: Silence the warning and remain backwards compatible
      return provable_setNetwork();
    }

    function provable_setNetworkName(string memory _network_name) internal {
        provable_network_name = _network_name;
    }

    function provable_getNetworkName() internal view returns (string memory _networkName) {
        return provable_network_name;
    }

    function provable_setNetwork() internal returns (bool _networkSet) {
        if (getCodeSize(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed) > 0) { //mainnet
            OAR = OracleAddrResolverI(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed);
            provable_setNetworkName("eth_mainnet");
            return true;
        }
        if (getCodeSize(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1) > 0) { //ropsten testnet
            OAR = OracleAddrResolverI(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1);
            provable_setNetworkName("eth_ropsten3");
            return true;
        }
        if (getCodeSize(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e) > 0) { //kovan testnet
            OAR = OracleAddrResolverI(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e);
            provable_setNetworkName("eth_kovan");
            return true;
        }
        if (getCodeSize(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48) > 0) { //rinkeby testnet
            OAR = OracleAddrResolverI(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48);
            provable_setNetworkName("eth_rinkeby");
            return true;
        }
        if (getCodeSize(0xa2998EFD205FB9D4B4963aFb70778D6354ad3A41) > 0) { //goerli testnet
            OAR = OracleAddrResolverI(0xa2998EFD205FB9D4B4963aFb70778D6354ad3A41);
            provable_setNetworkName("eth_goerli");
            return true;
        }
        if (getCodeSize(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475) > 0) { //ethereum-bridge
            OAR = OracleAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475);
            return true;
        }
        if (getCodeSize(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF) > 0) { //ether.camp ide
            OAR = OracleAddrResolverI(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF);
            return true;
        }
        if (getCodeSize(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA) > 0) { //browser-solidity
            OAR = OracleAddrResolverI(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA);
            return true;
        }
        return false;
    }
    /**
     * @dev The following `__callback` functions are just placeholders ideally
     *      meant to be defined in child contract when proofs are used.
     *      The function bodies simply silence compiler warnings.
     */
    function __callback(bytes32 _myid, string memory _result) virtual public {
        __callback(_myid, _result, new bytes(0));
    }

    function __callback(bytes32 _myid, string memory _result, bytes memory _proof) virtual public {
      _myid; _result; _proof;
      provable_randomDS_args[bytes32(0)] = bytes32(0);
    }

    function provable_getPrice(string memory _datasource) provableAPI internal returns (uint _queryPrice) {
        return provable.getPrice(_datasource);
    }

    function provable_getPrice(string memory _datasource, uint _gasLimit) provableAPI internal returns (uint _queryPrice) {
        return provable.getPrice(_datasource, _gasLimit);
    }

    function provable_query(string memory _datasource, string memory _arg) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        return provable.query{value: price}(0, _datasource, _arg);
    }

    function provable_query(uint _timestamp, string memory _datasource, string memory _arg) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        return provable.query{value: price}(_timestamp, _datasource, _arg);
    }

    function provable_query(uint _timestamp, string memory _datasource, string memory _arg, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource,_gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
            return 0; // Unexpectedly high price
        }
        return provable.query_withGasLimit{value: price}(_timestamp, _datasource, _arg, _gasLimit);
    }

    function provable_query(string memory _datasource, string memory _arg, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource, _gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
           return 0; // Unexpectedly high price
        }
        return provable.query_withGasLimit{value: price}(0, _datasource, _arg, _gasLimit);
    }

    function provable_query(string memory _datasource, string memory _arg1, string memory _arg2) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        return provable.query2{value: price}(0, _datasource, _arg1, _arg2);
    }

    function provable_query(uint _timestamp, string memory _datasource, string memory _arg1, string memory _arg2) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        return provable.query2{value: price}(_timestamp, _datasource, _arg1, _arg2);
    }

    function provable_query(uint _timestamp, string memory _datasource, string memory _arg1, string memory _arg2, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource, _gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
            return 0; // Unexpectedly high price
        }
        return provable.query2_withGasLimit{value: price}(_timestamp, _datasource, _arg1, _arg2, _gasLimit);
    }

    function provable_query(string memory _datasource, string memory _arg1, string memory _arg2, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource, _gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
            return 0; // Unexpectedly high price
        }
        return provable.query2_withGasLimit{value: price}(0, _datasource, _arg1, _arg2, _gasLimit);
    }

    function provable_query(string memory _datasource, string[] memory _argN) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = stra2cbor(_argN);
        return provable.queryN{value: price}(0, _datasource, args);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[] memory _argN) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = stra2cbor(_argN);
        return provable.queryN{value: price}(_timestamp, _datasource, args);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[] memory _argN, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource, _gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = stra2cbor(_argN);
        return provable.queryN_withGasLimit{value: price}(_timestamp, _datasource, args, _gasLimit);
    }

    function provable_query(string memory _datasource, string[] memory _argN, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource, _gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = stra2cbor(_argN);
        return provable.queryN_withGasLimit{value: price}(0, _datasource, args, _gasLimit);
    }

    function provable_query(string memory _datasource, string[1] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = _args[0];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[1] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = _args[0];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[1] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = _args[0];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[1] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = _args[0];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[2] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[2] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[2] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[2] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[3] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[3] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[3] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[3] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[4] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[4] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[4] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[4] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[5] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[5] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[5] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[5] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[] memory _argN) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = ba2cbor(_argN);
        return provable.queryN{value: price}(0, _datasource, args);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[] memory _argN) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = ba2cbor(_argN);
        return provable.queryN{value: price}(_timestamp, _datasource, args);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[] memory _argN, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource, _gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = ba2cbor(_argN);
        return provable.queryN_withGasLimit{value: price}(_timestamp, _datasource, args, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[] memory _argN, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource, _gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = ba2cbor(_argN);
        return provable.queryN_withGasLimit{value: price}(0, _datasource, args, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[1] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = _args[0];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[1] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = _args[0];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[1] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = _args[0];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[1] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = _args[0];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[2] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[2] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[2] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[2] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[3] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[3] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[3] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[3] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[4] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[4] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[4] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[4] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[5] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[5] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[5] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[5] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_setProof(byte _proofP) provableAPI internal {
        return provable.setProofType(_proofP);
    }


    function provable_cbAddress() provableAPI internal returns (address _callbackAddress) {
        return provable.cbAddress();
    }

    function getCodeSize(address _addr) view internal returns (uint _size) {
        assembly {
            _size := extcodesize(_addr)
        }
    }

    function provable_setCustomGasPrice(uint _gasPrice) provableAPI internal {
        return provable.setCustomGasPrice(_gasPrice);
    }

    function provable_randomDS_getSessionPubKeyHash() provableAPI internal returns (bytes32 _sessionKeyHash) {
        return provable.randomDS_getSessionPubKeyHash();
    }

    function parseAddr(string memory _a) internal pure returns (address _parsedAddress) {
        bytes memory tmp = bytes(_a);
        uint160 iaddr = 0;
        uint160 b1;
        uint160 b2;
        for (uint i = 2; i < 2 + 2 * 20; i += 2) {
            iaddr *= 256;
            b1 = uint160(uint8(tmp[i]));
            b2 = uint160(uint8(tmp[i + 1]));
            if ((b1 >= 97) && (b1 <= 102)) {
                b1 -= 87;
            } else if ((b1 >= 65) && (b1 <= 70)) {
                b1 -= 55;
            } else if ((b1 >= 48) && (b1 <= 57)) {
                b1 -= 48;
            }
            if ((b2 >= 97) && (b2 <= 102)) {
                b2 -= 87;
            } else if ((b2 >= 65) && (b2 <= 70)) {
                b2 -= 55;
            } else if ((b2 >= 48) && (b2 <= 57)) {
                b2 -= 48;
            }
            iaddr += (b1 * 16 + b2);
        }
        return address(iaddr);
    }

    function strCompare(string memory _a, string memory _b) internal pure returns (int _returnCode) {
        bytes memory a = bytes(_a);
        bytes memory b = bytes(_b);
        uint minLength = a.length;
        if (b.length < minLength) {
            minLength = b.length;
        }
        for (uint i = 0; i < minLength; i ++) {
            if (a[i] < b[i]) {
                return -1;
            } else if (a[i] > b[i]) {
                return 1;
            }
        }
        if (a.length < b.length) {
            return -1;
        } else if (a.length > b.length) {
            return 1;
        } else {
            return 0;
        }
    }

    function indexOf(string memory _haystack, string memory _needle) internal pure returns (int _returnCode) {
        bytes memory h = bytes(_haystack);
        bytes memory n = bytes(_needle);
        if (h.length < 1 || n.length < 1 || (n.length > h.length)) {
            return -1;
        } else if (h.length > (2 ** 128 - 1)) {
            return -1;
        } else {
            uint subindex = 0;
            for (uint i = 0; i < h.length; i++) {
                if (h[i] == n[0]) {
                    subindex = 1;
                    while(subindex < n.length && (i + subindex) < h.length && h[i + subindex] == n[subindex]) {
                        subindex++;
                    }
                    if (subindex == n.length) {
                        return int(i);
                    }
                }
            }
            return -1;
        }
    }

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

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

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

    function strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e) internal pure returns (string memory _concatenatedString) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory _bd = bytes(_d);
        bytes memory _be = bytes(_e);
        string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
        bytes memory babcde = bytes(abcde);
        uint k = 0;
        uint i = 0;
        for (i = 0; i < _ba.length; i++) {
            babcde[k++] = _ba[i];
        }
        for (i = 0; i < _bb.length; i++) {
            babcde[k++] = _bb[i];
        }
        for (i = 0; i < _bc.length; i++) {
            babcde[k++] = _bc[i];
        }
        for (i = 0; i < _bd.length; i++) {
            babcde[k++] = _bd[i];
        }
        for (i = 0; i < _be.length; i++) {
            babcde[k++] = _be[i];
        }
        return string(babcde);
    }

    function safeParseInt(string memory _a) internal pure returns (uint _parsedInt) {
        return safeParseInt(_a, 0);
    }

    function safeParseInt(string memory _a, uint _b) internal pure returns (uint _parsedInt) {
        bytes memory bresult = bytes(_a);
        uint mint = 0;
        bool decimals = false;
        for (uint i = 0; i < bresult.length; i++) {
            if ((uint(uint8(bresult[i])) >= 48) && (uint(uint8(bresult[i])) <= 57)) {
                if (decimals) {
                   if (_b == 0) break;
                    else _b--;
                }
                mint *= 10;
                mint += uint(uint8(bresult[i])) - 48;
            } else if (uint(uint8(bresult[i])) == 46) {
                require(!decimals, 'More than one decimal encountered in string!');
                decimals = true;
            } else {
                revert("Non-numeral character encountered in string!");
            }
        }
        if (_b > 0) {
            mint *= 10 ** _b;
        }
        return mint;
    }

    function parseInt(string memory _a) internal pure returns (uint _parsedInt) {
        return parseInt(_a, 0);
    }

    function parseInt(string memory _a, uint _b) internal pure returns (uint _parsedInt) {
        bytes memory bresult = bytes(_a);
        uint mint = 0;
        bool decimals = false;
        for (uint i = 0; i < bresult.length; i++) {
            if ((uint(uint8(bresult[i])) >= 48) && (uint(uint8(bresult[i])) <= 57)) {
                if (decimals) {
                   if (_b == 0) {
                       break;
                   } else {
                       _b--;
                   }
                }
                mint *= 10;
                mint += uint(uint8(bresult[i])) - 48;
            } else if (uint(uint8(bresult[i])) == 46) {
                decimals = true;
            }
        }
        if (_b > 0) {
            mint *= 10 ** _b;
        }
        return mint;
    }

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

    function stra2cbor(string[] memory _arr) internal pure returns (bytes memory _cborEncoding) {
        safeMemoryCleaner();
        Buffer.buffer memory buf;
        Buffer.init(buf, 1024);
        buf.startArray();
        for (uint i = 0; i < _arr.length; i++) {
            buf.encodeString(_arr[i]);
        }
        buf.endSequence();
        return buf.buf;
    }

    function ba2cbor(bytes[] memory _arr) internal pure returns (bytes memory _cborEncoding) {
        safeMemoryCleaner();
        Buffer.buffer memory buf;
        Buffer.init(buf, 1024);
        buf.startArray();
        for (uint i = 0; i < _arr.length; i++) {
            buf.encodeBytes(_arr[i]);
        }
        buf.endSequence();
        return buf.buf;
    }

    function provable_newRandomDSQuery(uint _delay, uint _nbytes, uint _customGasLimit) internal returns (bytes32 _queryId) {
        require((_nbytes > 0) && (_nbytes <= 32));
        _delay *= 10; // Convert from seconds to ledger timer ticks
        bytes memory nbytes = new bytes(1);
        nbytes[0] = byte(uint8(_nbytes));
        bytes memory unonce = new bytes(32);
        bytes memory sessionKeyHash = new bytes(32);
        bytes32 sessionKeyHash_bytes32 = provable_randomDS_getSessionPubKeyHash();
        assembly {
            mstore(unonce, 0x20)
            /*
             The following variables can be relaxed.
             Check the relaxed random contract at https://github.com/oraclize/ethereum-examples
             for an idea on how to override and replace commit hash variables.
            */
            mstore(add(unonce, 0x20), xor(blockhash(sub(number(), 1)), xor(coinbase(), timestamp())))
            mstore(sessionKeyHash, 0x20)
            mstore(add(sessionKeyHash, 0x20), sessionKeyHash_bytes32)
        }
        bytes memory delay = new bytes(32);
        assembly {
            mstore(add(delay, 0x20), _delay)
        }
        bytes memory delay_bytes8 = new bytes(8);
        copyBytes(delay, 24, 8, delay_bytes8, 0);
        bytes[4] memory args = [unonce, nbytes, sessionKeyHash, delay];
        bytes32 queryId = provable_query("random", args, _customGasLimit);
        bytes memory delay_bytes8_left = new bytes(8);
        assembly {
            let x := mload(add(delay_bytes8, 0x20))
            mstore8(add(delay_bytes8_left, 0x27), div(x, 0x100000000000000000000000000000000000000000000000000000000000000))
            mstore8(add(delay_bytes8_left, 0x26), div(x, 0x1000000000000000000000000000000000000000000000000000000000000))
            mstore8(add(delay_bytes8_left, 0x25), div(x, 0x10000000000000000000000000000000000000000000000000000000000))
            mstore8(add(delay_bytes8_left, 0x24), div(x, 0x100000000000000000000000000000000000000000000000000000000))
            mstore8(add(delay_bytes8_left, 0x23), div(x, 0x1000000000000000000000000000000000000000000000000000000))
            mstore8(add(delay_bytes8_left, 0x22), div(x, 0x10000000000000000000000000000000000000000000000000000))
            mstore8(add(delay_bytes8_left, 0x21), div(x, 0x100000000000000000000000000000000000000000000000000))
            mstore8(add(delay_bytes8_left, 0x20), div(x, 0x1000000000000000000000000000000000000000000000000))
        }
        provable_randomDS_setCommitment(queryId, keccak256(abi.encodePacked(delay_bytes8_left, args[1], sha256(args[0]), args[2])));
        return queryId;
    }

    function provable_randomDS_setCommitment(bytes32 _queryId, bytes32 _commitment) internal {
        provable_randomDS_args[_queryId] = _commitment;
    }

    function verifySig(bytes32 _tosignh, bytes memory _dersig, bytes memory _pubkey) internal returns (bool _sigVerified) {
        bool sigok;
        address signer;
        bytes32 sigr;
        bytes32 sigs;
        bytes memory sigr_ = new bytes(32);
        uint offset = 4 + (uint(uint8(_dersig[3])) - 0x20);
        sigr_ = copyBytes(_dersig, offset, 32, sigr_, 0);
        bytes memory sigs_ = new bytes(32);
        offset += 32 + 2;
        sigs_ = copyBytes(_dersig, offset + (uint(uint8(_dersig[offset - 1])) - 0x20), 32, sigs_, 0);
        assembly {
            sigr := mload(add(sigr_, 32))
            sigs := mload(add(sigs_, 32))
        }
        (sigok, signer) = safer_ecrecover(_tosignh, 27, sigr, sigs);
        if (address(uint160(uint256(keccak256(_pubkey)))) == signer) {
            return true;
        } else {
            (sigok, signer) = safer_ecrecover(_tosignh, 28, sigr, sigs);
            return (address(uint160(uint256(keccak256(_pubkey)))) == signer);
        }
    }

    function provable_randomDS_proofVerify__sessionKeyValidity(bytes memory _proof, uint _sig2offset) internal returns (bool _proofVerified) {
        bool sigok;
        // Random DS Proof Step 6: Verify the attestation signature, APPKEY1 must sign the sessionKey from the correct ledger app (CODEHASH)
        bytes memory sig2 = new bytes(uint(uint8(_proof[_sig2offset + 1])) + 2);
        copyBytes(_proof, _sig2offset, sig2.length, sig2, 0);
        bytes memory appkey1_pubkey = new bytes(64);
        copyBytes(_proof, 3 + 1, 64, appkey1_pubkey, 0);
        bytes memory tosign2 = new bytes(1 + 65 + 32);
        tosign2[0] = byte(uint8(1)); //role
        copyBytes(_proof, _sig2offset - 65, 65, tosign2, 1);
        bytes memory CODEHASH = hex"fd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505c";
        copyBytes(CODEHASH, 0, 32, tosign2, 1 + 65);
        sigok = verifySig(sha256(tosign2), sig2, appkey1_pubkey);
        if (!sigok) {
            return false;
        }
        // Random DS Proof Step 7: Verify the APPKEY1 provenance (must be signed by Ledger)
        bytes memory LEDGERKEY = hex"7fb956469c5c9b89840d55b43537e66a98dd4811ea0a27224272c2e5622911e8537a2f8e86a46baec82864e98dd01e9ccc2f8bc5dfc9cbe5a91a290498dd96e4";
        bytes memory tosign3 = new bytes(1 + 65);
        tosign3[0] = 0xFE;
        copyBytes(_proof, 3, 65, tosign3, 1);
        bytes memory sig3 = new bytes(uint(uint8(_proof[3 + 65 + 1])) + 2);
        copyBytes(_proof, 3 + 65, sig3.length, sig3, 0);
        sigok = verifySig(sha256(tosign3), sig3, LEDGERKEY);
        return sigok;
    }

    function provable_randomDS_proofVerify__returnCode(bytes32 _queryId, string memory _result, bytes memory _proof) internal returns (uint8 _returnCode) {
        // Random DS Proof Step 1: The prefix has to match 'LP\x01' (Ledger Proof version 1)
        if ((_proof[0] != "L") || (_proof[1] != "P") || (uint8(_proof[2]) != uint8(1))) {
            return 1;
        }
        bool proofVerified = provable_randomDS_proofVerify__main(_proof, _queryId, bytes(_result), provable_getNetworkName());
        if (!proofVerified) {
            return 2;
        }
        return 0;
    }

    function matchBytes32Prefix(bytes32 _content, bytes memory _prefix, uint _nRandomBytes) internal pure returns (bool _matchesPrefix) {
        bool match_ = true;
        require(_prefix.length == _nRandomBytes);
        for (uint256 i = 0; i< _nRandomBytes; i++) {
            if (_content[i] != _prefix[i]) {
                match_ = false;
            }
        }
        return match_;
    }

    function provable_randomDS_proofVerify__main(bytes memory _proof, bytes32 _queryId, bytes memory _result, string memory _contextName) internal returns (bool _proofVerified) {
        // Random DS Proof Step 2: The unique keyhash has to match with the sha256 of (context name + _queryId)
        uint ledgerProofLength = 3 + 65 + (uint(uint8(_proof[3 + 65 + 1])) + 2) + 32;
        bytes memory keyhash = new bytes(32);
        copyBytes(_proof, ledgerProofLength, 32, keyhash, 0);
        if (!(keccak256(keyhash) == keccak256(abi.encodePacked(sha256(abi.encodePacked(_contextName, _queryId)))))) {
            return false;
        }
        bytes memory sig1 = new bytes(uint(uint8(_proof[ledgerProofLength + (32 + 8 + 1 + 32) + 1])) + 2);
        copyBytes(_proof, ledgerProofLength + (32 + 8 + 1 + 32), sig1.length, sig1, 0);
        // Random DS Proof Step 3: We assume sig1 is valid (it will be verified during step 5) and we verify if '_result' is the _prefix of sha256(sig1)
        if (!matchBytes32Prefix(sha256(sig1), _result, uint(uint8(_proof[ledgerProofLength + 32 + 8])))) {
            return false;
        }
        // Random DS Proof Step 4: Commitment match verification, keccak256(delay, nbytes, unonce, sessionKeyHash) == commitment in storage.
        // This is to verify that the computed args match with the ones specified in the query.
        bytes memory commitmentSlice1 = new bytes(8 + 1 + 32);
        copyBytes(_proof, ledgerProofLength + 32, 8 + 1 + 32, commitmentSlice1, 0);
        bytes memory sessionPubkey = new bytes(64);
        uint sig2offset = ledgerProofLength + 32 + (8 + 1 + 32) + sig1.length + 65;
        copyBytes(_proof, sig2offset - 64, 64, sessionPubkey, 0);
        bytes32 sessionPubkeyHash = sha256(sessionPubkey);
        if (provable_randomDS_args[_queryId] == keccak256(abi.encodePacked(commitmentSlice1, sessionPubkeyHash))) { //unonce, nbytes and sessionKeyHash match
            delete provable_randomDS_args[_queryId];
        } else return false;
        // Random DS Proof Step 5: Validity verification for sig1 (keyhash and args signed with the sessionKey)
        bytes memory tosign1 = new bytes(32 + 8 + 1 + 32);
        copyBytes(_proof, ledgerProofLength, 32 + 8 + 1 + 32, tosign1, 0);
        if (!verifySig(sha256(tosign1), sig1, sessionPubkey)) {
            return false;
        }
        // Verify if sessionPubkeyHash was verified already, if not.. let's do it!
        if (!provable_randomDS_sessionKeysHashVerified[sessionPubkeyHash]) {
            provable_randomDS_sessionKeysHashVerified[sessionPubkeyHash] = provable_randomDS_proofVerify__sessionKeyValidity(_proof, sig2offset);
        }
        return provable_randomDS_sessionKeysHashVerified[sessionPubkeyHash];
    }
    /*
     The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    */
    function copyBytes(bytes memory _from, uint _fromOffset, uint _length, bytes memory _to, uint _toOffset) internal pure returns (bytes memory _copiedBytes) {
        uint minLength = _length + _toOffset;
        require(_to.length >= minLength); // Buffer too small. Should be a better way?
        uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables
        uint j = 32 + _toOffset;
        while (i < (32 + _fromOffset + _length)) {
            assembly {
                let tmp := mload(add(_from, i))
                mstore(add(_to, j), tmp)
            }
            i += 32;
            j += 32;
        }
        return _to;
    }
    /*
     The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
     Duplicate Solidity's ecrecover, but catching the CALL return value
    */
    function safer_ecrecover(bytes32 _hash, uint8 _v, bytes32 _r, bytes32 _s) internal returns (bool _success, address _recoveredAddress) {
        /*
         We do our own memory management here. Solidity uses memory offset
         0x40 to store the current end of memory. We write past it (as
         writes are memory extensions), but don't update the offset so
         Solidity will reuse it. The memory used here is only needed for
         this context.
         FIXME: inline assembly can't access return values
        */
        bool ret;
        address addr;
        assembly {
            let size := mload(0x40)
            mstore(size, _hash)
            mstore(add(size, 32), _v)
            mstore(add(size, 64), _r)
            mstore(add(size, 96), _s)
            ret := call(3000, 1, 0, size, 128, size, 32) // NOTE: we can reuse the request memory because we deal with the return code.
            addr := mload(size)
        }
        return (ret, addr);
    }
    /*
     The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    */
    function ecrecovery(bytes32 _hash, bytes memory _sig) internal returns (bool _success, address _recoveredAddress) {
        bytes32 r;
        bytes32 s;
        uint8 v;
        if (_sig.length != 65) {
            return (false, address(0));
        }
        /*
         The signature format is a compact form of:
           {bytes32 r}{bytes32 s}{uint8 v}
         Compact means, uint8 is not padded to 32 bytes.
        */
        assembly {
            r := mload(add(_sig, 32))
            s := mload(add(_sig, 64))
            /*
             Here we are loading the last 32 bytes. We exploit the fact that
             'mload' will pad with zeroes if we overread.
             There is no 'mload8' to do this, but that would be nicer.
            */
            v := byte(0, mload(add(_sig, 96)))
            /*
              Alternative solution:
              'byte' is not working due to the Solidity parser, so lets
              use the second best option, 'and'
              v := and(mload(add(_sig, 65)), 255)
            */
        }
        /*
         albeit non-transactional signatures are not specified by the YP, one would expect it
         to match the YP range of [27, 28]
         geth uses [0, 1] and some clients have followed. This might change, see:
         https://github.com/ethereum/go-ethereum/issues/2053
        */
        if (v < 27) {
            v += 27;
        }
        if (v != 27 && v != 28) {
            return (false, address(0));
        }
        return safer_ecrecover(_hash, v, r, s);
    }

    function safeMemoryCleaner() internal pure {
        assembly {
            let fmem := mload(0x40)
            codecopy(fmem, codesize(), sub(msize(), fmem))
        }
    }
}
// </provableAPI>

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"queryId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BetEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"queryId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"win","type":"bool"}],"name":"BetOutcome","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"description","type":"string"}],"name":"LogNewProvableQuery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"bytes32","name":"_myid","type":"bytes32"},{"internalType":"string","name":"_result","type":"string"}],"name":"__callback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"string","name":"_result","type":"string"},{"internalType":"bytes","name":"_proof","type":"bytes"}],"name":"__callback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bets","outputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"resolved","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaximumBet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumBetRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumBet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"odds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiveBank","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaximumBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMinimumBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_odds","type":"uint256"}],"name":"setOdds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setTokenBase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setTokenRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gas","type":"uint256"}],"name":"setgasforcallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setprovablegasprice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawBank","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405262030d406007553480156200001857600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200006e603060f81b620000c460201b60201c565b6200008464012a05f2006200042a60201b60201c565b600a600981905550662386f26fc1000060088190555068056bc75e2d63100000600c819055506402540be400600d81905550602f600a8190555062000e0a565b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480620001545750600062000152600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200074c60201b60201c565b145b156200016e576200016c60006200075760201b60201c565b505b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015620001d957600080fd5b505af1158015620001ee573d6000803e3d6000fd5b505050506040513d60208110156200020557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200035457600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015620002d657600080fd5b505af1158015620002eb573d6000803e3d6000fd5b505050506040513d60208110156200030257600080fd5b8101908080519060200190929190505050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663688dcfd7826040518263ffffffff1660e01b815260040180827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050600060405180830381600087803b1580156200040e57600080fd5b505af115801562000423573d6000803e3d6000fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480620004ba57506000620004b8600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200074c60201b60201c565b145b15620004d457620004d260006200075760201b60201c565b505b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200053f57600080fd5b505af115801562000554573d6000803e3d6000fd5b505050506040513d60208110156200056b57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620006ba57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200063c57600080fd5b505af115801562000651573d6000803e3d6000fd5b505050506040513d60208110156200066857600080fd5b8101908080519060200190929190505050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ca6ad1e4826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156200073057600080fd5b505af115801562000745573d6000803e3d6000fd5b5050505050565b6000813b9050919050565b6000620007696200077060201b60201c565b9050919050565b60008062000798731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed6200074c60201b60201c565b11156200084457731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200083a6040518060400160405280600b81526020017f6574685f6d61696e6e657400000000000000000000000000000000000000000081525062000d3f60201b60201c565b6001905062000d3c565b60006200086b73c03a2615d5efaf5f49f60b7bb6583eaec212fdf16200074c60201b60201c565b1115620009175773c03a2615d5efaf5f49f60b7bb6583eaec212fdf1600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200090d6040518060400160405280600c81526020017f6574685f726f707374656e33000000000000000000000000000000000000000081525062000d3f60201b60201c565b6001905062000d3c565b60006200093e73b7a07bcf2ba2f2703b24c0691b5278999c59ac7e6200074c60201b60201c565b1115620009ea5773b7a07bcf2ba2f2703b24c0691b5278999c59ac7e600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620009e06040518060400160405280600981526020017f6574685f6b6f76616e000000000000000000000000000000000000000000000081525062000d3f60201b60201c565b6001905062000d3c565b600062000a1173146500cfd35b22e4a392fe0adc06de1a1368ed486200074c60201b60201c565b111562000abd5773146500cfd35b22e4a392fe0adc06de1a1368ed48600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000ab36040518060400160405280600b81526020017f6574685f72696e6b65627900000000000000000000000000000000000000000081525062000d3f60201b60201c565b6001905062000d3c565b600062000ae473a2998efd205fb9d4b4963afb70778d6354ad3a416200074c60201b60201c565b111562000b905773a2998efd205fb9d4b4963afb70778d6354ad3a41600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000b866040518060400160405280600a81526020017f6574685f676f65726c690000000000000000000000000000000000000000000081525062000d3f60201b60201c565b6001905062000d3c565b600062000bb7736f485c8bf6fc43ea212e93bbf8ce046c7f1cb4756200074c60201b60201c565b111562000c1d57736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905062000d3c565b600062000c447320e12a1f859b3feae5fb2a0a32c18f5a65555bbf6200074c60201b60201c565b111562000caa577320e12a1f859b3feae5fb2a0a32c18f5a65555bbf600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905062000d3c565b600062000cd17351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa6200074c60201b60201c565b111562000d37577351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905062000d3c565b600090505b90565b806004908051906020019062000d5792919062000d5b565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000d9e57805160ff191683800117855562000dcf565b8280016001018555821562000dcf579182015b8281111562000dce57825182559160200191906001019062000db1565b5b50905062000dde919062000de2565b5090565b62000e0791905b8082111562000e0357600081600090555060010162000de9565b5090565b90565b614d268062000e1a6000396000f3fe60806040526004361061014f5760003560e01c806379ba5097116100b6578063c38a8afd1161006f578063c38a8afd1461091c578063c902c3ae14610947578063d4ee1d90146109d4578063e38e91f914610a2b578063f2fde38b14610a66578063f58bd55b14610ab75761037f565b806379ba5097146107d25780638772ae3c146107e95780638da5cb5b14610824578063a6809af01461087b578063b61daaee146108b6578063be2ff4a9146108e15761037f565b8063217630991161010857806321763099146104cb578063233de1261461050657806327dc297e1461053157806338bbfa50146106035780633b3dbb931461076c5780634b07207b146107a75761037f565b806306b091f91461038457806306f837d3146103df5780630bc4443e1461040a578063144fa6d7146104355780631b00db221461048657806320ae2059146104905761037f565b3661037f5760003490506000610163610af2565b905060006101a5600c54610197620f4240610189600d5488610b1390919063ffffffff16565b610b9990919063ffffffff16565b610be390919063ffffffff16565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561025057600080fd5b505af1158015610264573d6000803e3d6000fd5b505050508183111561027557600080fd5b600854831061037a57600080905060006102928260078054610c6b565b905033600e600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600e6000838152602001908152602001600020600101819055507f22d17d216f6fc9999054c0cf2ad607643f2488f0508cbbd1223f78b0a3896525813387604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a150505b505050005b600080fd5b34801561039057600080fd5b506103dd600480360360408110156103a757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611290565b005b3480156103eb57600080fd5b506103f46113b0565b6040518082815260200191505060405180910390f35b34801561041657600080fd5b5061041f610af2565b6040518082815260200191505060405180910390f35b34801561044157600080fd5b506104846004803603602081101561045857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113b6565b005b61048e611453565b005b34801561049c57600080fd5b506104c9600480360360208110156104b357600080fd5b8101908080359060200190929190505050611455565b005b3480156104d757600080fd5b50610504600480360360208110156104ee57600080fd5b81019080803590602001909291905050506114b8565b005b34801561051257600080fd5b5061051b61151b565b6040518082815260200191505060405180910390f35b34801561053d57600080fd5b506106016004803603604081101561055457600080fd5b81019080803590602001909291908035906020019064010000000081111561057b57600080fd5b82018360208201111561058d57600080fd5b803590602001918460018302840111640100000000831117156105af57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611521565b005b34801561060f57600080fd5b5061076a6004803603606081101561062657600080fd5b81019080803590602001909291908035906020019064010000000081111561064d57600080fd5b82018360208201111561065f57600080fd5b8035906020019184600183028401116401000000008311171561068157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061157b565b005b34801561077857600080fd5b506107a56004803603602081101561078f57600080fd5b81019080803590602001909291905050506118b8565b005b3480156107b357600080fd5b506107bc61191b565b6040518082815260200191505060405180910390f35b3480156107de57600080fd5b506107e7611921565b005b3480156107f557600080fd5b506108226004803603602081101561080c57600080fd5b8101908080359060200190929190505050611abe565b005b34801561083057600080fd5b50610839611b21565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561088757600080fd5b506108b46004803603602081101561089e57600080fd5b8101908080359060200190929190505050611b46565b005b3480156108c257600080fd5b506108cb611ba9565b6040518082815260200191505060405180910390f35b3480156108ed57600080fd5b5061091a6004803603602081101561090457600080fd5b8101908080359060200190929190505050611baf565b005b34801561092857600080fd5b50610931611c58565b6040518082815260200191505060405180910390f35b34801561095357600080fd5b506109806004803603602081101561096a57600080fd5b8101908080359060200190929190505050611c5e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182151515158152602001935050505060405180910390f35b3480156109e057600080fd5b506109e9611cb5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a3757600080fd5b50610a6460048036036020811015610a4e57600080fd5b8101908080359060200190929190505050611cdb565b005b348015610a7257600080fd5b50610ab560048036036020811015610a8957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d3e565b005b348015610ac357600080fd5b50610af060048036036020811015610ada57600080fd5b8101908080359060200190929190505050611ddb565b005b600080610b0a60095447610b9990919063ffffffff16565b90508091505090565b600080831415610b265760009050610b93565b6000828402905082848281610b3757fe5b0414610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614c906021913960400191505060405180910390fd5b809150505b92915050565b6000610bdb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e40565b905092915050565b600080828401905083811015610c61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008083118015610c7d575060208311155b610c8657600080fd5b600a840293506060600167ffffffffffffffff81118015610ca657600080fd5b506040519080825280601f01601f191660200182016040528015610cd95781602001600182028036833780820191505090505b5090508360f81b81600081518110610ced57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506060602067ffffffffffffffff81118015610d3657600080fd5b506040519080825280601f01601f191660200182016040528015610d695781602001600182028036833780820191505090505b5090506060602067ffffffffffffffff81118015610d8657600080fd5b506040519080825280601f01601f191660200182016040528015610db95781602001600182028036833780820191505090505b5090506000610dc6611f06565b9050602083524241186001430340186020840152602082528060208301526060602067ffffffffffffffff81118015610dfe57600080fd5b506040519080825280601f01601f191660200182016040528015610e315781602001600182028036833780820191505090505b5090508860208201526060600867ffffffffffffffff81118015610e5457600080fd5b506040519080825280601f01601f191660200182016040528015610e875781602001600182028036833780820191505090505b509050610e9a8260186008846000612226565b50610ea3614ba9565b60405180608001604052808781526020018881526020018681526020018481525090506000610f086040518060400160405280600681526020017f72616e646f6d0000000000000000000000000000000000000000000000000000815250838c612285565b90506060600867ffffffffffffffff81118015610f2457600080fd5b506040519080825280601f01601f191660200182016040528015610f575781602001600182028036833780820191505090505b50905060208401517f0100000000000000000000000000000000000000000000000000000000000000810460278301537e01000000000000000000000000000000000000000000000000000000000000810460268301537d010000000000000000000000000000000000000000000000000000000000810460258301537c0100000000000000000000000000000000000000000000000000000000810460248301537b01000000000000000000000000000000000000000000000000000000810460238301537a01000000000000000000000000000000000000000000000000000081046022830153790100000000000000000000000000000000000000000000000000810460218301537801000000000000000000000000000000000000000000000000810460208301535061127d82828560016004811061109657fe5b60200201516002876000600481106110aa57fe5b60200201516040518082805190602001908083835b602083106110e257805182526020820191506020810190506020830392506110bf565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015611124573d6000803e3d6000fd5b5050506040513d602081101561113957600080fd5b81019080805190602001909291905050508760026004811061115757fe5b60200201516040516020018085805190602001908083835b60208310611192578051825260208201915060208101905060208303925061116f565b6001836020036101000a03801982511681845116808217855250505050505090500184805190602001908083835b602083106111e357805182526020820191506020810190506020830392506111c0565b6001836020036101000a03801982511681845116808217855250505050505090500183815260200182805190602001908083835b6020831061123a5780518252602082019150602081019050602083039250611217565b6001836020036101000a0380198251168184511680821785525050505050509050019450505050506040516020818303038152906040528051906020012061260b565b8199505050505050505050509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112e957600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561137057600080fd5b505af1158015611384573d6000803e3d6000fd5b505050506040513d602081101561139a57600080fd5b8101908080519060200190929190505050505050565b600d5481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461140f57600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ae57600080fd5b8060098190555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461151157600080fd5b8060078190555050565b600a5481565b6115778282600067ffffffffffffffff8111801561153e57600080fd5b506040519080825280601f01601f1916602001820160405280156115715781602001600182028036833780820191505090505b5061157b565b5050565b611583612627565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115ba57600080fd5b60006115c7848484612949565b60ff16146115d4576118b3565b60006064836040516020018082805190602001908083835b6020831061160f57805182526020820191506020810190506020830392506115ec565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012060001c8161165457fe5b069050600a548110156117e4576000600e600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006116c86002600e600089815260200190815260200160002060010154610b1390919063ffffffff16565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611710573d6000803e3d6000fd5b507f5352148fc16eb77ab02f212a5c4d545f1ff463982bd9758f32e8124cc8a9e8fd86600e600089815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e60008a8152602001908152602001600020600101546001604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018215151515815260200194505050505060405180910390a150506118b1565b7f5352148fc16eb77ab02f212a5c4d545f1ff463982bd9758f32e8124cc8a9e8fd84600e600087815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e6000888152602001908152602001600020600101546000604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018215151515815260200194505050505060405180910390a15b505b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461191157600080fd5b80600c8190555050565b60095481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461197b57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b1757600080fd5b8060088190555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b9f57600080fd5b80600a8190555050565b600c5481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c0857600080fd5b60003390508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611c53573d6000803e3d6000fd5b505050565b60085481565b600e6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16905083565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d3457600080fd5b80600d8190555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d9757600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e3457600080fd5b611e3d81612a79565b50565b60008083118290611eec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611eb1578082015181840152602081019050611e96565b50505050905090810190601f168015611ede5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611ef857fe5b049050809150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611f8e57506000611f8c600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612d80565b145b15611f9f57611f9d6000612d8b565b505b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561200957600080fd5b505af115801561201d573d6000803e3d6000fd5b505050506040513d602081101561203357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461217e57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561210257600080fd5b505af1158015612116573d6000803e3d6000fd5b505050506040513d602081101561212c57600080fd5b8101908080519060200190929190505050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abaa5f3e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156121e657600080fd5b505afa1580156121fa573d6000803e3d6000fd5b505050506040513d602081101561221057600080fd5b8101908080519060200190929190505050905090565b606060008285019050808451101561223d57600080fd5b600086602001905060008460200190505b868860200101821015612276578189015180828801525060208201915060208101905061224e565b85935050505095945050505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061230d5750600061230b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612d80565b145b1561231e5761231c6000612d8b565b505b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561238857600080fd5b505af115801561239c573d6000803e3d6000fd5b505050506040513d60208110156123b257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124fd57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561248157600080fd5b505af1158015612495573d6000803e3d6000fd5b505050506040513d60208110156124ab57600080fd5b8101908080519060200190929190505050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6060600467ffffffffffffffff8111801561251757600080fd5b5060405190808252806020026020018201604052801561254b57816020015b60608152602001906001900390816125365790505b5090508360006004811061255b57fe5b60200201518160008151811061256d57fe5b60200260200101819052508360016004811061258557fe5b60200201518160018151811061259757fe5b6020026020010181905250836002600481106125af57fe5b6020020151816002815181106125c157fe5b6020026020010181905250836003600481106125d957fe5b6020020151816003815181106125eb57fe5b6020026020010181905250612601858285612d9c565b9150509392505050565b8060056000848152602001908152602001600020819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806126af575060006126ad600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612d80565b145b156126c0576126be6000612d8b565b505b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561272a57600080fd5b505af115801561273e573d6000803e3d6000fd5b505050506040513d602081101561275457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461289f57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561282357600080fd5b505af1158015612837573d6000803e3d6000fd5b505050506040513d602081101561284d57600080fd5b8101908080519060200190929190505050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c281d19e6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561290957600080fd5b505af115801561291d573d6000803e3d6000fd5b505050506040513d602081101561293357600080fd5b8101908080519060200190929190505050905090565b60007f4c000000000000000000000000000000000000000000000000000000000000008260008151811061297957fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141580612a0c57507f5000000000000000000000000000000000000000000000000000000000000000826001815181106129dc57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b80612a385750600160ff1682600281518110612a2457fe5b602001015160f81c60f81b60f81c60ff1614155b15612a465760019050612a72565b6000612a5b838686612a56613302565b6133a4565b905080612a6c576002915050612a72565b60009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612b0057506000612afe600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612d80565b145b15612b1157612b0f6000612d8b565b505b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612b7b57600080fd5b505af1158015612b8f573d6000803e3d6000fd5b505050506040513d6020811015612ba557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612cf057600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612c7457600080fd5b505af1158015612c88573d6000803e3d6000fd5b505050506040513d6020811015612c9e57600080fd5b8101908080519060200190929190505050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ca6ad1e4826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612d6557600080fd5b505af1158015612d79573d6000803e3d6000fd5b5050505050565b6000813b9050919050565b6000612d95613ac3565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612e2457506000612e22600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612d80565b145b15612e3557612e336000612d8b565b505b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612e9f57600080fd5b505af1158015612eb3573d6000803e3d6000fd5b505050506040513d6020811015612ec957600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461301457600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612f9857600080fd5b505af1158015612fac573d6000803e3d6000fd5b505050506040513d6020811015612fc257600080fd5b8101908080519060200190929190505050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ef3accc86856040518363ffffffff1660e01b81526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b838110156130ab578082015181840152602081019050613090565b50505050905090810190601f1680156130d85780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b1580156130f857600080fd5b505af115801561310c573d6000803e3d6000fd5b505050506040513d602081101561312257600080fd5b81019080805190602001909291905050509050823a02670de0b6b3a764000001811115613155576000801b9150506132fb565b60606131608561401a565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55c1cb68360008985896040518663ffffffff1660e01b8152600401808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156132055780820151818401526020810190506131ea565b50505050905090810190601f1680156132325780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b8381101561326b578082015181840152602081019050613250565b50505050905090810190601f1680156132985780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303818588803b1580156132ba57600080fd5b505af11580156132ce573d6000803e3d6000fd5b50505050506040513d60208110156132e557600080fd5b8101908080519060200190929190505050925050505b9392505050565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561339a5780601f1061336f5761010080835404028352916020019161339a565b820191906000526020600020905b81548152906001019060200180831161337d57829003601f168201915b5050505050905090565b60008060206002876045815181106133b857fe5b602001015160f81c60f81b60f81c60ff16016044010190506060602067ffffffffffffffff811180156133ea57600080fd5b506040519080825280601f01601f19166020018201604052801561341d5781602001600182028036833780820191505090505b50905061342f87836020846000612226565b50600284876040516020018083805190602001908083835b6020831061346a5780518252602082019150602081019050602083039250613447565b6001836020036101000a038019825116818451168082178552505050505050905001828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106134d857805182526020820191506020810190506020830392506134b5565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa15801561351a573d6000803e3d6000fd5b5050506040513d602081101561352f57600080fd5b8101908080519060200190929190505050604051602001808281526020019150506040516020818303038152906040528051906020012081805190602001201461357e57600092505050613abb565b6060600288600160498601018151811061359457fe5b602001015160f81c60f81b60f81c60ff160167ffffffffffffffff811180156135bc57600080fd5b506040519080825280601f01601f1916602001820160405280156135ef5781602001600182028036833780820191505090505b50905061360488604985018351846000612226565b506136cf6002826040518082805190602001908083835b6020831061363e578051825260208201915060208101905060208303925061361b565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015613680573d6000803e3d6000fd5b5050506040513d602081101561369557600080fd5b8101908080519060200190929190505050878a60086020880101815181106136b957fe5b602001015160f81c60f81b60f81c60ff1661409a565b6136df5760009350505050613abb565b6060602967ffffffffffffffff811180156136f957600080fd5b506040519080825280601f01601f19166020018201604052801561372c5781602001600182028036833780820191505090505b50905061374189602086016029846000612226565b506060604067ffffffffffffffff8111801561375c57600080fd5b506040519080825280601f01601f19166020018201604052801561378f5781602001600182028036833780820191505090505b50905060006041845160296020890101010190506137b58b604083036040856000612226565b5060006002836040518082805190602001908083835b602083106137ee57805182526020820191506020810190506020830392506137cb565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015613830573d6000803e3d6000fd5b5050506040513d602081101561384557600080fd5b8101908080519060200190929190505050905083816040516020018083805190602001908083835b60208310613890578051825260208201915060208101905060208303925061386d565b6001836020036101000a0380198251168184511680821785525050505050509050018281526020019250505060405160208183030381529060405280519060200120600560008d815260200190815260200160002054141561390857600560008c815260200190815260200160002060009055613918565b6000975050505050505050613abb565b6060604967ffffffffffffffff8111801561393257600080fd5b506040519080825280601f01601f1916602001820160405280156139655781602001600182028036833780820191505090505b5090506139778d896049846000612226565b50613a206002826040518082805190602001908083835b602083106139b1578051825260208201915060208101905060208303925061398e565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa1580156139f3573d6000803e3d6000fd5b5050506040513d6020811015613a0857600080fd5b8101908080519060200190929190505050878661414a565b613a3557600098505050505050505050613abb565b6006600083815260200190815260200160002060009054906101000a900460ff16613a8f57613a648d84614336565b6006600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6006600083815260200190815260200160002060009054906101000a900460ff16985050505050505050505b949350505050565b600080613ae3731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed612d80565b1115613b8557731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613b7c6040518060400160405280600b81526020017f6574685f6d61696e6e65740000000000000000000000000000000000000000008152506147c2565b60019050614017565b6000613ba473c03a2615d5efaf5f49f60b7bb6583eaec212fdf1612d80565b1115613c465773c03a2615d5efaf5f49f60b7bb6583eaec212fdf1600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613c3d6040518060400160405280600c81526020017f6574685f726f707374656e3300000000000000000000000000000000000000008152506147c2565b60019050614017565b6000613c6573b7a07bcf2ba2f2703b24c0691b5278999c59ac7e612d80565b1115613d075773b7a07bcf2ba2f2703b24c0691b5278999c59ac7e600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613cfe6040518060400160405280600981526020017f6574685f6b6f76616e00000000000000000000000000000000000000000000008152506147c2565b60019050614017565b6000613d2673146500cfd35b22e4a392fe0adc06de1a1368ed48612d80565b1115613dc85773146500cfd35b22e4a392fe0adc06de1a1368ed48600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613dbf6040518060400160405280600b81526020017f6574685f72696e6b6562790000000000000000000000000000000000000000008152506147c2565b60019050614017565b6000613de773a2998efd205fb9d4b4963afb70778d6354ad3a41612d80565b1115613e895773a2998efd205fb9d4b4963afb70778d6354ad3a41600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613e806040518060400160405280600a81526020017f6574685f676f65726c69000000000000000000000000000000000000000000008152506147c2565b60019050614017565b6000613ea8736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475612d80565b1115613f0c57736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050614017565b6000613f2b7320e12a1f859b3feae5fb2a0a32c18f5a65555bbf612d80565b1115613f8f577320e12a1f859b3feae5fb2a0a32c18f5a65555bbf600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050614017565b6000613fae7351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa612d80565b1115614012577351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050614017565b600090505b90565b60606140246147dc565b61402c614bd0565b614038816104006147e8565b61404181614832565b60008090505b83518110156140835761407684828151811061405f57fe5b60200260200101518361484090919063ffffffff16565b8080600101915050614047565b5061408d81614865565b8060000151915050919050565b60008060019050828451146140ae57600080fd5b60008090505b8381101561413e578481815181106140c857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191686826020811061410157fe5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461413157600091505b80806001019150506140b4565b50809150509392505050565b60008060008060006060602067ffffffffffffffff8111801561416c57600080fd5b506040519080825280601f01601f19166020018201604052801561419f5781602001600182028036833780820191505090505b50905060006020896003815181106141b357fe5b602001015160f81c60f81b60f81c60ff160360040190506141d989826020856000612226565b91506060602067ffffffffffffffff811180156141f557600080fd5b506040519080825280601f01601f1916602001820160405280156142285781602001600182028036833780820191505090505b5090506022820191506142648a60208c600186038151811061424657fe5b602001015160f81c60f81b60f81c60ff160384016020846000612226565b905060208301519450602081015193506142818b601b8787614873565b80975081985050508573ffffffffffffffffffffffffffffffffffffffff16898051906020012060001c73ffffffffffffffffffffffffffffffffffffffff1614156142d757600197505050505050505061432f565b6142e48b601c8787614873565b80975081985050508573ffffffffffffffffffffffffffffffffffffffff16898051906020012060001c73ffffffffffffffffffffffffffffffffffffffff16149750505050505050505b9392505050565b6000806060600285600186018151811061434c57fe5b602001015160f81c60f81b60f81c60ff160167ffffffffffffffff8111801561437457600080fd5b506040519080825280601f01601f1916602001820160405280156143a75781602001600182028036833780820191505090505b5090506143b985858351846000612226565b506060604067ffffffffffffffff811180156143d457600080fd5b506040519080825280601f01601f1916602001820160405280156144075781602001600182028036833780820191505090505b50905061441a8660046040846000612226565b506060606267ffffffffffffffff8111801561443557600080fd5b506040519080825280601f01601f1916602001820160405280156144685781602001600182028036833780820191505090505b509050600160f81b8160008151811061447d57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506144be87604188036041846001612226565b5060606040518060400160405280602081526020017ffd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505c81525090506145098160006020856042612226565b506145b26002836040518082805190602001908083835b602083106145435780518252602082019150602081019050602083039250614520565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015614585573d6000803e3d6000fd5b5050506040513d602081101561459a57600080fd5b8101908080519060200190929190505050858561414a565b9450846145c7576000955050505050506147bc565b6060604051806060016040528060408152602001614cb16040913990506060604267ffffffffffffffff811180156145fe57600080fd5b506040519080825280601f01601f1916602001820160405280156146315781602001600182028036833780820191505090505b50905060fe60f81b8160008151811061464657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506146858a60036041846001612226565b50606060028b60458151811061469757fe5b602001015160f81c60f81b60f81c60ff160167ffffffffffffffff811180156146bf57600080fd5b506040519080825280601f01601f1916602001820160405280156146f25781602001600182028036833780820191505090505b5090506147058b60448351846000612226565b506147ae6002836040518082805190602001908083835b6020831061473f578051825260208201915060208101905060208303925061471c565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015614781573d6000803e3d6000fd5b5050506040513d602081101561479657600080fd5b8101908080519060200190929190505050828561414a565b975087985050505050505050505b92915050565b80600490805190602001906147d8929190614bea565b5050565b60405180590338823950565b60008190506000602082816147f957fe5b0614614812576020818161480957fe5b06602003810190505b808360200181815250506040518084526000815281810160405250505050565b61483d8160046148b7565b50565b61484d82600283516148d8565b6148608183614a1890919063ffffffff16565b505050565b6148708160076148b7565b50565b60008060008060405188815287602082015286604082015285606082015260208160808360006001610bb8f192508051915050818193509350505094509492505050565b6148d4601f60058360ff16901b1783614ac390919063ffffffff16565b5050565b60178111614904576148ff8160058460ff16901b60ff161784614ac390919063ffffffff16565b614a13565b60ff811161494557614929601860058460ff16901b1784614ac390919063ffffffff16565b61493f81600185614b039092919063ffffffff16565b50614a12565b61ffff81116149875761496b601960058460ff16901b1784614ac390919063ffffffff16565b61498181600285614b039092919063ffffffff16565b50614a11565b63ffffffff81116149cb576149af601a60058460ff16901b1784614ac390919063ffffffff16565b6149c581600485614b039092919063ffffffff16565b50614a10565b67ffffffffffffffff8111614a0f576149f7601b60058460ff16901b1784614ac390919063ffffffff16565b614a0d81600885614b039092919063ffffffff16565b505b5b5b5b5b505050565b614a20614bd0565b82602001518360000151518351011115614a5057614a4f836002614a4986602001518651614b6a565b02614b86565b5b60008060008451905085518051602081830101945086518101825260208701935050505b60208110614a975781518352602083019250602082019150602081039050614a74565b60006001826020036101000a039050801983511681855116818117865250508694505050505092915050565b81602001516001836000015151011115614ae957614ae8826002846020015102614b86565b5b815180516020818301018381536001820183525050505050565b614b0b614bd0565b836020015184600001515183011115614b3957614b38846002614b32876020015186614b6a565b02614b86565b5b60006001836101000a0390508451805184818301018684198251161781528582018352505050849150509392505050565b600081831115614b7c57829050614b80565b8190505b92915050565b606082600001519050614b9983836147e8565b614ba38382614a18565b50505050565b60405180608001604052806004905b6060815260200190600190039081614bb85790505090565b604051806040016040528060608152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614c2b57805160ff1916838001178555614c59565b82800160010185558215614c59579182015b82811115614c58578251825591602001919060010190614c3d565b5b509050614c669190614c6a565b5090565b614c8c91905b80821115614c88576000816000905550600101614c70565b5090565b9056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777fb956469c5c9b89840d55b43537e66a98dd4811ea0a27224272c2e5622911e8537a2f8e86a46baec82864e98dd01e9ccc2f8bc5dfc9cbe5a91a290498dd96e4a264697066735822122031adbbe897a7f56c6041eca994fba699490f3986dadbed200fb3d17219155a9f64736f6c63430006060033

Deployed ByteCode Sourcemap

1378:3588:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2264:12;2279:9;2264:24;;2294:19;2316:15;:13;:15::i;:::-;2294:37;;2337:15;2355:46;2391:9;;2355:31;2380:5;2355:20;2364:10;;2355:4;:8;;:20;;;;:::i;:::-;:24;;:31;;;;:::i;:::-;:35;;:46;;;;:::i;:::-;2337:64;;2408:5;;;;;;;;;;;:10;;;2419;2431:7;2408:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2408:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2408:31:0;;;;2457:11;2450:4;:18;2446:414;;;12:1:-1;9;2:12;2446:414:0;2515:10;;2507:4;:18;2504:356;;2535:29;2567:1;2535:33;;2577:16;2597:126;2632:21;4158:1;2699:16;;2597:25;:126::i;:::-;2577:146;;2757:10;2732:4;:14;2737:8;2732:14;;;;;;;;;;;:22;;;:35;;;;;;;;;;;;;;;;;;2799:4;2775;:14;2780:8;2775:14;;;;;;;;;;;:21;;:28;;;;2817:36;2826:8;2836:10;2848:4;2817:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2504:356;;;2231:633;;;1378:3588;;12:1:-1;9;2:12;3942:122:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3942:122:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;3942:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2061:25;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2061:25:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2868:146;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2868:146:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3018:77;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3018:77:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;3018:77:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;3550:43;;;:::i;:::-;;3375:95;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3375:95:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;3375:95:0;;;;;;;;;;;;;;;;;:::i;:::-;;3845:94;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3845:94:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;3845:94:0;;;;;;;;;;;;;;;;;:::i;:::-;;1993:19;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1993:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15386:130:1;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15386:130:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;15386:130:1;;;;;;;;;;;;;;;;;;;27:11:-1;14;11:28;8:2;;;52:1;49;42:12;8:2;15386:130:1;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;15386:130:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;15386:130:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;15386:130:1;;;;;;;;;;;;;;;:::i;:::-;;4164:798:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4164:798:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;4164:798:0;;;;;;;;;;;;;;;;;;;27:11:-1;14;11:28;8:2;;;52:1;49;42:12;8:2;4164:798:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;4164:798:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;4164:798:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;4164:798:0;;;;;;;;;;;;;;;;;27:11:-1;14;11:28;8:2;;;52:1;49;42:12;8:2;4164:798:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;4164:798:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;4164:798:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;4164:798:0;;;;;;;;;;;;;;;:::i;:::-;;3098:88;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3098:88:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;3098:88:0;;;;;;;;;;;;;;;;;:::i;:::-;;1959:30;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1959:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1201:173;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1201:173:0;;;:::i;:::-;;3282:90;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3282:90:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;3282:90:0;;;;;;;;;;;;;;;;;:::i;:::-;;854:20;;5:9:-1;2:2;;;27:1;24;17:12;2:2;854:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3473:74;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3473:74:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;3473:74:0;;;;;;;;;;;;;;;;;:::i;:::-;;2033:24;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2033:24:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3596:134;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3596:134:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;3596:134:0;;;;;;;;;;;;;;;;;:::i;:::-;;1930:25;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1930:25:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2185:41;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2185:41:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;2185:41:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;878:23;;5:9:-1;2:2;;;27:1;24;17:12;2:2;878:23:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3189:90;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3189:90:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;3189:90:0;;;;;;;;;;;;;;;;;:::i;:::-;;1104:94;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1104:94:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;1104:94:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;3733:109;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3733:109:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;3733:109:0;;;;;;;;;;;;;;;;;:::i;:::-;;2868:146;2913:7;2928:15;2946:42;2972:15;;2946:21;:25;;:42;;;;:::i;:::-;2928:60;;3001:7;2994:15;;;2868:146;:::o;6386:419::-;6444:7;6674:1;6669;:6;6665:35;;;6692:1;6685:8;;;;6665:35;6706:9;6722:1;6718;:5;6706:17;;6746:1;6741;6737;:5;;;;;;:10;6729:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6799:1;6792:8;;;6386:419;;;;;:::o;7226:124::-;7284:7;7306:39;7310:1;7313;7306:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7299:46;;7226:124;;;;:::o;5185:162::-;5243:7;5258:9;5274:1;5270;:5;5258:17;;5294:1;5289;:6;;5281:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5341:1;5334:8;;;5185:162;;;;:::o;45117:2648:1:-;45219:16;45266:1;45256:7;:11;45255:32;;;;;45284:2;45273:7;:13;;45255:32;45247:41;;12:1:-1;9;2:12;45247:41:1;45308:2;45298:12;;;;45366:19;45398:1;45388:12;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45388:12:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;45388:12:1;;;;45366:34;;45433:7;45422:20;;45410:6;45417:1;45410:9;;;;;;;;;;;:32;;;;;;;;;;;45452:19;45484:2;45474:13;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45474:13:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;45474:13:1;;;;45452:35;;45497:27;45537:2;45527:13;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45527:13:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;45527:13:1;;;;45497:43;;45550:30;45583:40;:38;:40::i;:::-;45550:73;;45671:4;45663:6;45656:20;46022:11;46010:10;46006:28;46001:1;45991:8;45987:16;45977:27;45973:62;45966:4;45958:6;45954:17;45947:89;46072:4;46056:14;46049:28;46124:22;46117:4;46101:14;46097:25;46090:57;46166:18;46197:2;46187:13;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;46187:13:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;46187:13:1;;;;46166:34;;46258:6;46251:4;46244:5;46240:16;46233:32;46284:25;46322:1;46312:12;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;46312:12:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;46312:12:1;;;;46284:40;;46334;46344:5;46351:2;46355:1;46358:12;46372:1;46334:9;:40::i;:::-;;46384:20;;:::i;:::-;:62;;;;;;;;46408:6;46384:62;;;;46416:6;46384:62;;;;46424:14;46384:62;;;;46440:5;46384:62;;;;;46456:15;46474:47;;;;;;;;;;;;;;;;;;46499:4;46505:15;46474:14;:47::i;:::-;46456:65;;46531:30;46574:1;46564:12;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;46564:12:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;46564:12:1;;;;46531:45;;46642:4;46628:12;46624:23;46618:30;46706:65;46703:1;46699:73;46692:4;46673:17;46669:28;46661:112;46831:63;46828:1;46824:71;46817:4;46798:17;46794:28;46786:110;46954:61;46951:1;46947:69;46940:4;46921:17;46917:28;46909:108;47075:59;47072:1;47068:67;47061:4;47042:17;47038:28;47030:106;47194:57;47191:1;47187:65;47180:4;47161:17;47157:28;47149:104;47311:55;47308:1;47304:63;47297:4;47278:17;47274:28;47266:102;47426:53;47423:1;47419:61;47412:4;47393:17;47389:28;47381:100;47539:51;47536:1;47532:59;47525:4;47506:17;47502:28;47494:98;46595:1007;47611:123;47643:7;47679:17;47698:4;47703:1;47698:7;;;;;;;;;;;47707:15;47714:4;47719:1;47714:7;;;;;;;;;;;47707:15;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;47707:15:1;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47707:15:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;47707:15:1;;;;;;;;;;;;;;;;47724:4;47729:1;47724:7;;;;;;;;;;;47662:70;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;47662:70:1;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;47662:70:1;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;47662:70:1;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;47662:70:1;;;47652:81;;;;;;47611:31;:123::i;:::-;47751:7;47744:14;;;;;;;;;;;45117:2648;;;;;:::o;3942:122:0:-;1082:5;;;;;;;;;;;1068:19;;:10;:19;;;1060:28;;12:1:-1;9;2:12;1060:28:0;4023:6:::1;:15;;;4039:10;4051:7;4023:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;4023:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;4023:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;4023:36:0;;;;;;;;;;;;;;;;;3942:122:::0;;:::o;2061:25::-;;;;:::o;3018:77::-;1082:5;;;;;;;;;;;1068:19;;:10;:19;;;1060:28;;12:1:-1;9;2:12;1060:28:0;3084:6:::1;3076:5;;:14;;;;;;;;;;;;;;;;;;3018:77:::0;:::o;3550:43::-;:::o;3375:95::-;1082:5;;;;;;;;;;;1068:19;;:10;:19;;;1060:28;;12:1:-1;9;2:12;1060:28:0;3458:7:::1;3440:15;:25;;;;3375:95:::0;:::o;3845:94::-;1082:5;;;;;;;;;;;1068:19;;:10;:19;;;1060:28;;12:1:-1;9;2:12;1060:28:0;3930:4:::1;3911:16;:23;;;;3845:94:::0;:::o;1993:19::-;;;;:::o;15386:130:1:-;15469:40;15480:5;15487:7;15506:1;15496:12;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15496:12:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;15496:12:1;;;;15469:10;:40::i;:::-;15386:130;;:::o;4164:798:0:-;4312:20;:18;:20::i;:::-;4298:34;;:10;:34;;;4290:43;;12:1:-1;9;2:12;4290:43:0;4455:1;4351:100;4402:8;4420:7;4437:6;4351:41;:100::i;:::-;:105;;;4340:618;;;;;4486:20;4557:3;4544:7;4527:25;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;4527:25:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4527:25:0;;;4517:36;;;;;;4509:45;;:51;;;;;;4486:74;;4587:4;;4572:12;:19;4569:382;;;4603:24;4630:4;:14;4635:8;4630:14;;;;;;;;;;;:22;;;;;;;;;;;;4603:49;;4662:15;4680:28;4706:1;4680:4;:14;4685:8;4680:14;;;;;;;;;;;:21;;;:25;;:28;;;;:::i;:::-;4662:46;;4718:8;:17;;:26;4736:7;4718:26;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4718:26:0;4759:73;4770:8;4780:4;:14;4785:8;4780:14;;;;;;;;;;;:22;;;;;;;;;;;;4804:4;:14;4809:8;4804:14;;;;;;;;;;;:21;;;4827:4;4759:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4569:382;;;;;4868:74;4879:8;4889:4;:14;4894:8;4889:14;;;;;;;;;;;:22;;;;;;;;;;;;4913:4;:14;4918:8;4913:14;;;;;;;;;;;:21;;;4936:5;4868:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4569:382;4340:618;;4164:798;;;:::o;3098:88::-;1082:5;;;;;;;;;;;1068:19;;:10;:19;;;1060:28;;12:1:-1;9;2:12;1060:28:0;3174:7:::1;3162:9;:19;;;;3098:88:::0;:::o;1959:30::-;;;;:::o;1201:173::-;1263:8;;;;;;;;;;;1249:22;;:10;:22;;;1241:31;;12:1:-1;9;2:12;1241:31:0;1311:8;;;;;;;;;;;1283:37;;1304:5;;;;;;;;;;;1283:37;;;;;;;;;;;;1334:8;;;;;;;;;;;1326:5;;:16;;;;;;;;;;;;;;;;;;1367:1;1348:8;;:21;;;;;;;;;;;;;;;;;;1201:173::o;3282:90::-;1082:5;;;;;;;;;;;1068:19;;:10;:19;;;1060:28;;12:1:-1;9;2:12;1060:28:0;3360:7:::1;3347:10;:20;;;;3282:90:::0;:::o;854:20::-;;;;;;;;;;;;;:::o;3473:74::-;1082:5;;;;;;;;;;;1068:19;;:10;:19;;;1060:28;;12:1:-1;9;2:12;1060:28:0;3537:5:::1;3530:4;:12;;;;3473:74:::0;:::o;2033:24::-;;;;:::o;3596:134::-;1082:5;;;;;;;;;;;1068:19;;:10;:19;;;1060:28;;12:1:-1;9;2:12;1060:28:0;3659:23:::1;3685:10;3659:36;;3701:7;:16;;:24;3718:6;3701:24;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;3701:24:0;1094:1;3596:134:::0;:::o;1930:25::-;;;;:::o;2185:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;878:23::-;;;;;;;;;;;;;:::o;3189:90::-;1082:5;;;;;;;;;;;1068:19;;:10;:19;;;1060:28;;12:1:-1;9;2:12;1060:28:0;3267:7:::1;3254:10;:20;;;;3189:90:::0;:::o;1104:94::-;1082:5;;;;;;;;;;;1068:19;;:10;:19;;;1060:28;;12:1:-1;9;2:12;1060:28:0;1184:9:::1;1173:8;;:20;;;;;;;;;;;;;;;;;;1104:94:::0;:::o;3733:109::-;1082:5;;;;;;;;;;;1068:19;;:10;:19;;;1060:28;;12:1:-1;9;2:12;1060:28:0;3803:34:::1;3830:6;3803:26;:34::i;:::-;3733:109:::0;:::o;7825:316::-;7911:7;8000:1;7996;:5;8003:12;7988:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;7988:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8022:9;8038:1;8034;:5;;;;;;8022:17;;8135:1;8128:8;;;7825:316;;;;;:::o;37707:169:1:-;37787:23;11930:1;11906:26;;11914:3;;;;;;;;;;;11906:26;;;11905:64;;;;11967:1;11938:25;11958:3;;;;;;;;;;;11938:11;:25::i;:::-;:30;11905:64;11901:130;;;11985:35;11562:1;11985:19;:35::i;:::-;;11901:130;12065:3;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12065:16:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12065:16:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;12065:16:1;;;;;;;;;;;;;;;;12044:37;;12052:8;;;;;;;;;;;12044:37;;;12040:106;;12118:3;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12118:16:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12118:16:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;12118:16:1;;;;;;;;;;;;;;;;12097:8;;:38;;;;;;;;;;;;;;;;;;12040:106;37829:8:::1;;;;;;;;;;;:38;;;:40;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37829:40:1;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37829:40:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;37829:40:1;;;;;;;;;;;;;;;;37822:47;;37707:169:::0;:::o;54416:693::-;54544:25;54581:14;54608:9;54598:7;:19;54581:36;;54649:9;54635:3;:10;:23;;54627:32;;12:1:-1;9;2:12;54627:32:1;54714:6;54728:11;54723:2;:16;54714:25;;54830:6;54844:9;54839:2;:14;54830:23;;54863:220;54894:7;54880:11;54875:2;:16;:26;54870:1;:32;54863:220;;;54973:1;54966:5;54962:13;54956:20;55013:3;55009:1;55004:3;55000:11;54993:24;54927:104;55049:2;55044:7;;;;55070:2;55065:7;;;;54863:220;;;55099:3;55092:10;;;;;54416:693;;;;;;;:::o;35112:377::-;35232:11;11930:1;11906:26;;11914:3;;;;;;;;;;;11906:26;;;11905:64;;;;11967:1;11938:25;11958:3;;;;;;;;;;;11938:11;:25::i;:::-;:30;11905:64;11901:130;;;11985:35;11562:1;11985:19;:35::i;:::-;;11901:130;12065:3;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12065:16:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12065:16:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;12065:16:1;;;;;;;;;;;;;;;;12044:37;;12052:8;;;;;;;;;;;12044:37;;;12040:106;;12118:3;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12118:16:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12118:16:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;12118:16:1;;;;;;;;;;;;;;;;12097:8;;:38;;;;;;;;;;;;;;;;;;12040:106;35255:22:::1;35292:1;35280:14;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35280:14:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35255:39;;35317:5;35323:1;35317:8;;;;;;;;;;;35304:7;35312:1;35304:10;;;;;;;;;;;;;:21;;;;35348:5;35354:1;35348:8;;;;;;;;;;;35335:7;35343:1;35335:10;;;;;;;;;;;;;:21;;;;35379:5;35385:1;35379:8;;;;;;;;;;;35366:7;35374:1;35366:10;;;;;;;;;;;;;:21;;;;35410:5;35416:1;35410:8;;;;;;;;;;;35397:7;35405:1;35397:10;;;;;;;;;;;;;:21;;;;35435:47;35450:11;35463:7;35472:9;35435:14;:47::i;:::-;35428:54;;;35112:377:::0;;;;;:::o;47771:152::-;47905:11;47870:22;:32;47893:8;47870:32;;;;;;;;;;;:46;;;;47771:152;;:::o;37278:130::-;37338:24;11930:1;11906:26;;11914:3;;;;;;;;;;;11906:26;;;11905:64;;;;11967:1;11938:25;11958:3;;;;;;;;;;;11938:11;:25::i;:::-;:30;11905:64;11901:130;;;11985:35;11562:1;11985:19;:35::i;:::-;;11901:130;12065:3;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12065:16:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12065:16:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;12065:16:1;;;;;;;;;;;;;;;;12044:37;;12052:8;;;;;;;;;;;12044:37;;;12040:106;;12118:3;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12118:16:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12118:16:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;12118:16:1;;;;;;;;;;;;;;;;12097:8;;:38;;;;;;;;;;;;;;;;;;12040:106;37381:8:::1;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37381:20:1;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37381:20:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;37381:20:1;;;;;;;;;;;;;;;;37374:27;;37278:130:::0;:::o;50541:579::-;50672:17;50799:16;:6;50806:1;50799:9;;;;;;;;;;;;;;;;:16;;;;;50798:40;;;;50821:16;:6;50828:1;50821:9;;;;;;;;;;;;;;;;:16;;;;;50798:40;:74;;;;50869:1;50843:28;;50849:6;50856:1;50849:9;;;;;;;;;;;;;;;;50843:16;;:28;;;;50798:74;50794:113;;;50895:1;50888:8;;;;50794:113;50916:18;50937:96;50973:6;50981:8;50997:7;51007:25;:23;:25::i;:::-;50937:35;:96::i;:::-;50916:117;;51048:13;51043:53;;51084:1;51077:8;;;;;51043:53;51112:1;51105:8;;;50541:579;;;;;;:::o;37567:134::-;11930:1;11906:26;;11914:3;;;;;;;;;;;11906:26;;;11905:64;;;;11967:1;11938:25;11958:3;;;;;;;;;;;11938:11;:25::i;:::-;:30;11905:64;11901:130;;;11985:35;11562:1;11985:19;:35::i;:::-;;11901:130;12065:3;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12065:16:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12065:16:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;12065:16:1;;;;;;;;;;;;;;;;12044:37;;12052:8;;;;;;;;;;;12044:37;;;12040:106;;12118:3;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12118:16:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12118:16:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;12118:16:1;;;;;;;;;;;;;;;;12097:8;;:38;;;;;;;;;;;;;;;;;;12040:106;37657:8:::1;;;;;;;;;;;:26;;;37684:9;37657:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37657:37:1;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37657:37:1;;;;37567:134:::0;:::o;37414:147::-;37473:10;37539:5;37527:18;37518:27;;37504:51;;;:::o;12638:205::-;12703:16;12815:21;:19;:21::i;:::-;12808:28;;12638:205;;;:::o;29634:455::-;29753:11;11930:1;11906:26;;11914:3;;;;;;;;;;;11906:26;;;11905:64;;;;11967:1;11938:25;11958:3;;;;;;;;;;;11938:11;:25::i;:::-;:30;11905:64;11901:130;;;11985:35;11562:1;11985:19;:35::i;:::-;;11901:130;12065:3;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12065:16:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12065:16:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;12065:16:1;;;;;;;;;;;;;;;;12044:37;;12052:8;;;;;;;;;;;12044:37;;;12040:106;;12118:3;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12118:16:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12118:16:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;12118:16:1;;;;;;;;;;;;;;;;12097:8;;:38;;;;;;;;;;;;;;;;;;12040:106;29776:10:::1;29789:8;;;;;;;;;;;:17;;;29807:11;29820:9;29789:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;29789:41:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29789:41:1;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29789:41:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;29789:41:1;;;;;;;;;;;;;;;;29776:54;;29876:9;29862:11;:23;29852:7;:33;29844:5;:41;29840:107;;;29908:1;29901:8:::0;::::1;;;;;;29840:107;29956:17;29976:14;29984:5;29976:7;:14::i;:::-;29956:34;;30007:8;;;;;;;;;;;:28;;;30043:5;30050:1;30053:11;30066:4;30072:9;30007:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;30007:75:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;30007:75:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30007:75:1;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30007:75:1;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;30007:75:1;;;;;;;;;;;;;;;;30000:82;;;;12155:1;29634:455:::0;;;;;:::o;12980:131::-;13038:26;13083:21;13076:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12980:131;:::o;51526:2755::-;51678:19;51821:22;51895:2;51890:1;51867:6;51874:10;51867:18;;;;;;;;;;;;;;;;51861:25;;51856:31;;:35;51846:6;:46;:51;51821:76;;51907:20;51940:2;51930:13;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51930:13:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;51930:13:1;;;;51907:36;;51953:52;51963:6;51971:17;51990:2;51994:7;52003:1;51953:9;:52::i;:::-;;52070:48;52094:12;52108:8;52077:40;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;52077:40:1;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;52077:40:1;;;52070:48;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;52070:48:1;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52070:48:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;52070:48:1;;;;;;;;;;;;;;;;52053:66;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;52053:66:1;;;52043:77;;;;;;52031:7;52021:18;;;;;;:99;52015:145;;52144:5;52137:12;;;;;;52015:145;52169:17;52264:1;52210:6;52257:1;52238:15;52217:17;:37;:41;52210:49;;;;;;;;;;;;;;;;52204:56;;52199:62;;:66;52189:77;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;52189:77:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;52189:77:1;;;;52169:97;;52276:78;52286:6;52315:15;52294:17;:37;52333:4;:11;52346:4;52352:1;52276:9;:78::i;:::-;;52522:90;52541:12;52548:4;52541:12;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;52541:12:1;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52541:12:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;52541:12:1;;;;;;;;;;;;;;;;52555:7;52575:6;52607:1;52602:2;52582:17;:22;:26;52575:34;;;;;;;;;;;;;;;;52569:41;;52564:47;;52522:18;:90::i;:::-;52517:134;;52635:5;52628:12;;;;;;;52517:134;52897:29;52939:10;52929:21;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;52929:21:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;52929:21:1;;;;52897:53;;52960:74;52970:6;52998:2;52978:17;:22;53002:10;53014:16;53032:1;52960:9;:74::i;:::-;;53044:26;53083:2;53073:13;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53073:13:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;53073:13:1;;;;53044:42;;53096:15;53168:2;53154:4;:11;53140:10;53134:2;53114:17;:22;:37;:51;:56;53096:74;;53180:56;53190:6;53211:2;53198:10;:15;53215:2;53219:13;53234:1;53180:9;:56::i;:::-;;53246:25;53274:21;53281:13;53274:21;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;53274:21:1;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53274:21:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;53274:21:1;;;;;;;;;;;;;;;;53246:49;;53372:16;53390:17;53355:53;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;53355:53:1;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;53355:53:1;;;53345:64;;;;;;53309:22;:32;53332:8;53309:32;;;;;;;;;;;;:100;53305:230;;;53474:22;:32;53497:8;53474:32;;;;;;;;;;;53467:39;;;53305:230;;;53530:5;53523:12;;;;;;;;;;;53305:230;53657:20;53690:15;53680:26;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53680:26:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;53680:26:1;;;;53657:49;;53716:65;53726:6;53734:17;53753:15;53770:7;53779:1;53716:9;:65::i;:::-;;53796:47;53806:15;53813:7;53806:15;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;53806:15:1;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53806:15:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;53806:15:1;;;;;;;;;;;;;;;;53823:4;53829:13;53796:9;:47::i;:::-;53791:91;;53866:5;53859:12;;;;;;;;;;;;53791:91;53979:41;:60;54021:17;53979:60;;;;;;;;;;;;;;;;;;;;;53974:224;;54118:69;54168:6;54176:10;54118:49;:69::i;:::-;54055:41;:60;54097:17;54055:60;;;;;;;;;;;;:132;;;;;;;;;;;;;;;;;;53974:224;54214:41;:60;54256:17;54214:60;;;;;;;;;;;;;;;;;;;;;54207:67;;;;;;;;;;51526:2755;;;;;;;:::o;13117:2031::-;13166:16;13256:1;13198:55;13210:42;13198:11;:55::i;:::-;:59;13194:246;;;13309:42;13283:3;;:69;;;;;;;;;;;;;;;;;;13366:38;;;;;;;;;;;;;;;;;;:23;:38::i;:::-;13425:4;13418:11;;;;13194:246;13511:1;13453:55;13465:42;13453:11;:55::i;:::-;:59;13449:255;;;13572:42;13546:3;;:69;;;;;;;;;;;;;;;;;;13629:39;;;;;;;;;;;;;;;;;;:23;:39::i;:::-;13689:4;13682:11;;;;13449:255;13775:1;13717:55;13729:42;13717:11;:55::i;:::-;:59;13713:250;;;13834:42;13808:3;;:69;;;;;;;;;;;;;;;;;;13891:36;;;;;;;;;;;;;;;;;;:23;:36::i;:::-;13948:4;13941:11;;;;13713:250;14034:1;13976:55;13988:42;13976:11;:55::i;:::-;:59;13972:254;;;14095:42;14069:3;;:69;;;;;;;;;;;;;;;;;;14152:38;;;;;;;;;;;;;;;;;;:23;:38::i;:::-;14211:4;14204:11;;;;13972:254;14297:1;14239:55;14251:42;14239:11;:55::i;:::-;:59;14235:252;;;14357:42;14331:3;;:69;;;;;;;;;;;;;;;;;;14414:37;;;;;;;;;;;;;;;;;;:23;:37::i;:::-;14472:4;14465:11;;;;14235:252;14558:1;14500:55;14512:42;14500:11;:55::i;:::-;:59;14496:202;;;14619:42;14593:3;;:69;;;;;;;;;;;;;;;;;;14683:4;14676:11;;;;14496:202;14769:1;14711:55;14723:42;14711:11;:55::i;:::-;:59;14707:201;;;14829:42;14803:3;;:69;;;;;;;;;;;;;;;;;;14893:4;14886:11;;;;14707:201;14979:1;14921:55;14933:42;14921:11;:55::i;:::-;:59;14917:203;;;15041:42;15015:3;;:69;;;;;;;;;;;;;;;;;;15105:4;15098:11;;;;14917:203;15136:5;15129:12;;13117:2031;;:::o;44746:365::-;44807:26;44845:19;:17;:19::i;:::-;44874:24;;:::i;:::-;44908:22;44920:3;44925:4;44908:11;:22::i;:::-;44940:16;:3;:14;:16::i;:::-;44971:6;44980:1;44971:10;;44966:88;44987:4;:11;44983:1;:15;44966:88;;;45019:24;45035:4;45040:1;45035:7;;;;;;;;;;;;;;45019:3;:15;;:24;;;;:::i;:::-;45000:3;;;;;;;44966:88;;;;45063:17;:3;:15;:17::i;:::-;45097:3;:7;;;45090:14;;;44746:365;;;:::o;51126:394::-;51237:19;51268:11;51282:4;51268:18;;51322:13;51304:7;:14;:31;51296:40;;12:1:-1;9;2:12;51296:40:1;51351:9;51363:1;51351:13;;51346:145;51369:13;51366:1;:16;51346:145;;;51422:7;51430:1;51422:10;;;;;;;;;;;;;;;;51407:25;;;:8;51416:1;51407:11;;;;;;;;;;:25;;;;51403:78;;51461:5;51452:14;;51403:78;51384:3;;;;;;;51346:145;;;;51507:6;51500:13;;;51126:394;;;;;:::o;47929:1003::-;48028:17;48057:10;48077:14;48101:12;48123;48145:18;48176:2;48166:13;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48166:13:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;48166:13:1;;;;48145:34;;48189:11;48234:4;48219:7;48227:1;48219:10;;;;;;;;;;;;;;;;48213:17;;48208:23;;:30;48203:1;:36;48189:50;;48257:40;48267:7;48276:6;48284:2;48288:5;48295:1;48257:9;:40::i;:::-;48249:48;;48307:18;48338:2;48328:13;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48328:13:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;48328:13:1;;;;48307:34;;48361:6;48351:16;;;;48385:84;48395:7;48449:4;48425:7;48442:1;48433:6;:10;48425:19;;;;;;;;;;;;;;;;48419:26;;48414:32;;:39;48404:6;:50;48456:2;48460:5;48467:1;48385:9;:84::i;:::-;48377:92;;48527:2;48520:5;48516:14;48510:21;48502:29;;48569:2;48562:5;48558:14;48552:21;48544:29;;48610:41;48626:8;48636:2;48640:4;48646;48610:15;:41::i;:::-;48592:59;;;;;;;;48714:6;48665:55;;48699:7;48689:18;;;;;;48681:27;;48665:55;;;48661:265;;;48743:4;48736:11;;;;;;;;;;;48661:265;48796:41;48812:8;48822:2;48826:4;48832;48796:15;:41::i;:::-;48778:59;;;;;;;;48908:6;48859:55;;48893:7;48883:18;;;;;;48875:27;;48859:55;;;48851:64;;;;;;;;;47929:1003;;;;;;:::o;48938:1597::-;49054:19;49085:10;49246:17;49315:1;49287:6;49308:1;49294:11;:15;49287:23;;;;;;;;;;;;;;;;49281:30;;49276:36;;:40;49266:51;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49266:51:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;49266:51:1;;;;49246:71;;49327:52;49337:6;49345:11;49358:4;:11;49371:4;49377:1;49327:9;:52::i;:::-;;49389:27;49429:2;49419:13;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49419:13:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;49419:13:1;;;;49389:43;;49442:47;49452:6;49460:5;49467:2;49471:14;49487:1;49442:9;:47::i;:::-;;49499:20;49532:11;49522:22;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49522:22:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;49522:22:1;;;;49499:45;;49578:1;49567:14;;49554:7;49562:1;49554:10;;;;;;;;;;;:27;;;;;;;;;;;49598:51;49608:6;49630:2;49616:11;:16;49634:2;49638:7;49647:1;49598:9;:51::i;:::-;;49659:21;:93;;;;;;;;;;;;;;;;;;;49762:43;49772:8;49782:1;49785:2;49789:7;49798:6;49762:9;:43::i;:::-;;49823:48;49833:15;49840:7;49833:15;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;49833:15:1;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49833:15:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;49833:15:1;;;;;;;;;;;;;;;;49850:4;49856:14;49823:9;:48::i;:::-;49815:56;;49886:5;49881:49;;49914:5;49907:12;;;;;;;;;49881:49;50031:22;:158;;;;;;;;;;;;;;;;;;;50199:20;50232:6;50222:17;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50222:17:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;50222:17:1;;;;50199:40;;50262:4;50249:17;;:7;50257:1;50249:10;;;;;;;;;;;:17;;;;;;;;;;;50276:36;50286:6;50294:1;50297:2;50301:7;50310:1;50276:9;:36::i;:::-;;50322:17;50386:1;50363:6;50370:10;50363:18;;;;;;;;;;;;;;;;50357:25;;50352:31;;:35;50342:46;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50342:46:1;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;50342:46:1;;;;50322:66;;50398:47;50408:6;50416;50424:4;:11;50437:4;50443:1;50398:9;:47::i;:::-;;50463:43;50473:15;50480:7;50473:15;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;50473:15:1;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50473:15:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;50473:15:1;;;;;;;;;;;;;;;;50490:4;50496:9;50463;:43::i;:::-;50455:51;;50523:5;50516:12;;;;;;;;;;48938:1597;;;;;:::o;12849:125::-;12954:13;12930:21;:37;;;;;;;;;;;;:::i;:::-;;12849:125;:::o;57983:174::-;58077:4;58071:11;58135:4;58126:7;58122:18;58110:10;58104:4;58095:46;58045:106;:::o;4344:434::-;4418:13;4434:9;4418:25;;4474:1;4468:2;4457:8;:13;;;;;;:18;4453:81;;4520:2;4509:8;:13;;;;;;4503:2;:20;4491:32;;;;4453:81;4559:8;4543:4;:13;;:24;;;;;4655:4;4649:11;4686:3;4680:4;4673:17;4715:1;4710:3;4703:14;4752:8;4747:3;4743:18;4737:4;4730:32;4624:148;;;;:::o;10556:128::-;10627:50;10654:4;8712:1;10627:26;:50::i;:::-;10556:128;:::o;10171:178::-;10264:49;10275:4;8663:1;10299:6;:13;10264:10;:49::i;:::-;10323:19;10335:6;10323:4;:11;;:19;;;;:::i;:::-;;10171:178;;:::o;10820:136::-;10892:57;10919:4;8874:1;10892:26;:57::i;:::-;10820:136;:::o;55316:982::-;55408:13;55423:25;55854:8;55872:12;55935:4;55929:11;55966:5;55960:4;55953:19;56007:2;56002;55996:4;55992:13;55985:25;56045:2;56040;56034:4;56030:13;56023:25;56083:2;56078;56072:4;56068:13;56061:25;56140:2;56134:4;56129:3;56123:4;56120:1;56117;56111:4;56106:37;56099:44;;56249:4;56243:11;56235:19;;55903:361;56281:3;56286:4;56273:18;;;;;;55316:982;;;;;;;:::o;9610:145::-;9710:38;9744:2;9739:1;9729:6;:11;;;;9728:18;9710:4;:11;;:38;;;;:::i;:::-;9610:145;;:::o;8882:722::-;8993:2;8983:6;:12;8979:619;;9011:42;9045:6;9040:1;9030:6;:11;;;;9029:22;;;9011:4;:11;;:42;;;;:::i;:::-;8979:619;;;9084:4;9074:6;:14;9070:528;;9104:38;9138:2;9133:1;9123:6;:11;;;;9122:18;9104:4;:11;;:38;;;;:::i;:::-;9156:25;9171:6;9179:1;9156:4;:14;;:25;;;;;:::i;:::-;;9070:528;;;9212:6;9202;:16;9198:400;;9234:38;9268:2;9263:1;9253:6;:11;;;;9252:18;9234:4;:11;;:38;;;;:::i;:::-;9286:25;9301:6;9309:1;9286:4;:14;;:25;;;;;:::i;:::-;;9198:400;;;9342:10;9332:6;:20;9328:270;;9368:38;9402:2;9397:1;9387:6;:11;;;;9386:18;9368:4;:11;;:38;;;;:::i;:::-;9420:25;9435:6;9443:1;9420:4;:14;;:25;;;;;:::i;:::-;;9328:270;;;9476:18;9466:6;:28;9462:136;;9510:38;9544:2;9539:1;9529:6;:11;;;;9528:18;9510:4;:11;;:38;;;;:::i;:::-;9562:25;9577:6;9585:1;9562:4;:14;;:25;;;;;:::i;:::-;;9462:136;9328:270;9198:400;9070:528;8979:619;8882:722;;;:::o;5404:1213::-;5483:21;;:::i;:::-;5553:4;:13;;;5535:4;:8;;;:15;5520:5;:12;:30;:46;5516:127;;;5582:50;5589:4;5630:1;5595:32;5599:4;:13;;;5614:5;:12;5595:3;:32::i;:::-;:36;5582:6;:50::i;:::-;5516:127;5652:9;5671:8;5689;5700:5;:12;5689:23;;5765:4;5759:11;5840:6;5834:13;5927:2;5918:6;5910;5906:19;5902:28;5894:36;;6050:5;6044:12;6036:6;6032:25;6024:6;6017:41;6113:2;6106:5;6102:14;6095:21;;5731:395;;6135:206;6148:2;6141:3;:9;6135:206;;6265:3;6259:10;6253:4;6246:24;6305:2;6297:10;;;;6328:2;6321:9;;;;6159:2;6152:9;;;;6135:206;;;6350:9;6382:1;6375:3;6370:2;:8;6362:3;:17;:21;6350:33;;6475:4;6471:9;6465:3;6459:10;6455:26;6527:4;6520;6514:11;6510:22;6571:7;6561:8;6558:21;6552:4;6545:35;6426:164;;6606:4;6599:11;;;;;;5404:1213;;;;:::o;6864:575::-;6963:4;:13;;;6959:1;6941:4;:8;;;:15;:19;:35;6937:97;;;6992:31;6999:4;7021:1;7005:4;:13;;;:17;6992:6;:31::i;:::-;6937:97;7086:4;7080:11;7161:6;7155:13;7252:2;7243:6;7235;7231:19;7227:28;7350:5;7344:4;7336:20;7396:1;7388:6;7384:14;7376:6;7369:30;7052:381;;;;;:::o;7731:735::-;7816:21;;:::i;:::-;7878:4;:13;;;7860:4;:8;;;:15;7853:4;:22;:38;7849:111;;;7907:42;7914:4;7947:1;7920:24;7924:4;:13;;;7939:4;7920:3;:24::i;:::-;:28;7907:6;:42::i;:::-;7849:111;7969:9;7995:1;7988:4;7981:3;:11;:15;7969:27;;8049:4;8043:11;8124:6;8118:13;8215:4;8206:6;8198;8194:19;8190:30;8352:5;8344:4;8340:9;8333:4;8327:11;8323:27;8320:38;8314:4;8307:52;8399:4;8391:6;8387:17;8379:6;8372:33;8015:424;;;8455:4;8448:11;;;7731:735;;;;;:::o;4963:146::-;5016:9;5046:2;5041;:7;5037:47;;;5071:2;5064:9;;;;5037:47;5100:2;5093:9;;4963:146;;;;;:::o;4784:173::-;4859:19;4881:4;:8;;;4859:30;;4899:21;4904:4;4910:9;4899:4;:21::i;:::-;4930:20;4937:4;4943:6;4930;:20::i;:::-;;4784:173;;;:::o;1378:3588:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://31adbbe897a7f56c6041eca994fba699490f3986dadbed200fb3d17219155a9f
Block Transaction Difficulty Gas Used Reward
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.

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.