Contract 0xcdecd5c66ec838fc6cfa53136d312b76051e042f 2

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x09d9c2fa48261cf3a3fba30cd68a3e86022c1511bad5fcb960eba3a625e7d1e6Submit92889302021-10-20 20:12:301 day 11 hrs ago0xf6c63dfbf6757f77000442ac19dd3c928f6fb137 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00027976252.5
0x303103b75a3196b69f04faec1af25b65ce48f50e063b786a57b8415766504663Submit92889252021-10-20 20:12:151 day 11 hrs ago0x12c7d527977014de76bf6295679e01c30f0166f6 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00028105252.5
0x44971f944889436461050a556419be42b2b569038e00b3b3d7d043b6e6974a51Submit92889232021-10-20 20:12:091 day 11 hrs ago0xc7040beec1a3794c3e7cc9ba5c68070dad0b4c29 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.000234186752.25
0x6aec3a7bed8a1af0ac9bb25dc112867c0b50fbf720181fffa12c3d6eb442386eSubmit92889232021-10-20 20:12:091 day 11 hrs ago0x642c256845ef4d8ca47b9fab180e80faa48bd136 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00025625752.5
0x4acc3ebf291451afcd66f295207c355c846023153de445d87d4562f1f76d52e1Submit92889232021-10-20 20:12:091 day 11 hrs ago0x0384141fd0274c7af5a30716173c6eb8897481d6 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.0000674652.5
0xa3e524eb1e39b15e3f6cdb6916845d297ab314e9749a37e4f48d5c9c13c8784dSubmit92889232021-10-20 20:12:091 day 11 hrs ago0x20a5f651395531b283c8923aee0b248f719ce04d IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00030584252.5
0x8bcab1e93efae0a446e8fefe47422119412070cf2499013c251542e8060d6deaSubmit92889232021-10-20 20:12:091 day 11 hrs ago0x2432c7a649e502557ae8d8ff053cb4c8999117ae IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00019350752.5
0x2d877ded4a0c797966f67d8415f56b70a303b1791bff5faa4d97b8c5300f3f0aSubmit92889232021-10-20 20:12:091 day 11 hrs ago0xa11684938783a7f969629aefe5b055b95f67706a IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00019350752.5
0x9029df6b8781e61d200c4bee2e8bb471acc0850792ed2e156614b37c224794c9Submit92889222021-10-20 20:12:061 day 11 hrs ago0x0384141fd0274c7af5a30716173c6eb8897481d6 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00019350752.5
0x955afac3c7902d9cc9550584941ca0b19dc095445151149b8fc457c5f7f6cde7Submit92889212021-10-20 20:12:031 day 11 hrs ago0x54cdd0770eafefa35f564d59b5d0b415254955b2 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.000348634252.35
0x293c47d0cf8760b93fc22f27817431b50c9a812d4c99a89d1e5c9c29fb46a41cSubmit90873252021-10-13 20:11:588 days 11 hrs ago0xf6c63dfbf6757f77000442ac19dd3c928f6fb137 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.0003281177252.925
0x696db3805a4dbde8675f7897052bda31d85b37cb97577606b089fb84604f1fbbSubmit90873242021-10-13 20:11:558 days 11 hrs ago0x642c256845ef4d8ca47b9fab180e80faa48bd136 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00028105252.5
0x8e90bddcca2c355c6bd458f0db15fced6121c27d2c36a0244607247148e20becSubmit90873232021-10-13 20:11:528 days 11 hrs ago0xc7040beec1a3794c3e7cc9ba5c68070dad0b4c29 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.0002342072.25
0x374e155b39d4f34879253757a197074b88134a7f6abef9733c400a626b5d2ed8Submit90873232021-10-13 20:11:528 days 11 hrs ago0x12c7d527977014de76bf6295679e01c30f0166f6 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00025625752.5
0xd28afb3367e7e4bcfb34f3b1ad59229b9169a6d809fa4dc456d54c2b086283f8Submit90873232021-10-13 20:11:528 days 11 hrs ago0x0384141fd0274c7af5a30716173c6eb8897481d6 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00030584252.5
0x415577ad4d1d6a30b719005156ab49e492e9dab0249843a70b4938649c9c9095Submit90873232021-10-13 20:11:528 days 11 hrs ago0x2432c7a649e502557ae8d8ff053cb4c8999117ae IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00019350752.5
0x0f59603d3f39d34cb8122ead9d30e57d76b97b8683ced80ea19fd7c8352eefc4Submit90873232021-10-13 20:11:528 days 11 hrs ago0x54cdd0770eafefa35f564d59b5d0b415254955b2 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00019350752.5
0xc8e8fce21a98e36ec2be90fae6c2512d9b526533e8a8f3ade0d97fb317e6fff0Submit90873232021-10-13 20:11:528 days 11 hrs ago0x20a5f651395531b283c8923aee0b248f719ce04d IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.0002187216032.825750991
0x9b82320a7da8a83775f179d11ad23aee84c9e01273247e5db09d72c65479245eSubmit90873212021-10-13 20:11:468 days 11 hrs ago0xa11684938783a7f969629aefe5b055b95f67706a IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00038575422.6
0xf2e0032bf7d8e843d2526a6b351553d355e884dee76d7ae501712c55f15e810bSubmit90872702021-10-13 20:09:138 days 11 hrs ago0x642c256845ef4d8ca47b9fab180e80faa48bd136 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.000275292.5
0x36465c4b507dc4d0359a319ad90042842510e0cad6c74f81284ee31c3c96d022Submit90872692021-10-13 20:09:108 days 11 hrs ago0xc7040beec1a3794c3e7cc9ba5c68070dad0b4c29 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00023824352.25
0xdfec5319574e367f83b9dda4fe1097781159bfc459b9a8fc4e1b86abf7f69841Submit90872692021-10-13 20:09:108 days 11 hrs ago0xa11684938783a7f969629aefe5b055b95f67706a IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.0002447292.35
0xf221fdf7b50856edff7e3a50237ba676e26e1e3b0a2c36ec03e2fe95d5e4f69bSubmit90872692021-10-13 20:09:108 days 11 hrs ago0x20a5f651395531b283c8923aee0b248f719ce04d IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.000241051252.35
0xc3e36405dae158400cb95ca3b6cd18e9703d5ee1a7b4faad9ea96a540a5facbbSubmit90872692021-10-13 20:09:108 days 11 hrs ago0x54cdd0770eafefa35f564d59b5d0b415254955b2 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.0003059552.5
0x6b51ab7f85c9bc4bd1a6fd50ee3f75b4ab5bf29b36323af519a62fd326bcdeb0Submit90872692021-10-13 20:09:108 days 11 hrs ago0x0384141fd0274c7af5a30716173c6eb8897481d6 IN  0xcdecd5c66ec838fc6cfa53136d312b76051e042f0 HT0.00019350752.5
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AccessControlledAggregator

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-03-04
*/

pragma solidity 0.6.6;


/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMathChainlink {
  /**
    * @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) {
    require(b <= a, "SafeMath: subtraction overflow");
    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-solidity/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) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, "SafeMath: division by zero");
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
    * @dev 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) {
    require(b != 0, "SafeMath: modulo by zero");
    return a % b;
  }
}

library SignedSafeMath {
  int256 constant private _INT256_MIN = -2**255;

  /**
   * @dev Multiplies two signed integers, reverts on overflow.
   */
  function mul(int256 a, int256 b) internal pure returns (int256) {
    // 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;
    }

    require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");

    int256 c = a * b;
    require(c / a == b, "SignedSafeMath: multiplication overflow");

    return c;
  }

  /**
   * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero.
   */
  function div(int256 a, int256 b) internal pure returns (int256) {
    require(b != 0, "SignedSafeMath: division by zero");
    require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");

    int256 c = a / b;

    return c;
  }

  /**
   * @dev Subtracts two signed integers, reverts on overflow.
   */
  function sub(int256 a, int256 b) internal pure returns (int256) {
    int256 c = a - b;
    require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");

    return c;
  }

  /**
   * @dev Adds two signed integers, reverts on overflow.
   */
  function add(int256 a, int256 b) internal pure returns (int256) {
    int256 c = a + b;
    require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");

    return c;
  }

  /**
   * @notice Computes average of two signed integers, ensuring that the computation
   * doesn't overflow.
   * @dev If the result is not an integer, it is rounded towards zero. For example,
   * avg(-3, -4) = -3
   */
  function avg(int256 _a, int256 _b)
    internal
    pure
    returns (int256)
  {
    if ((_a < 0 && _b > 0) || (_a > 0 && _b < 0)) {
      return add(_a, _b) / 2;
    }
    int256 remainder = (_a % 2 + _b % 2) / 2;
    return add(add(_a / 2, _b / 2), remainder);
  }
}

library Median {
  using SignedSafeMath for int256;

  int256 constant INT_MAX = 2**255-1;

  /**
   * @notice Returns the sorted middle, or the average of the two middle indexed items if the
   * array has an even number of elements.
   * @dev The list passed as an argument isn't modified.
   * @dev This algorithm has expected runtime O(n), but for adversarially chosen inputs
   * the runtime is O(n^2).
   * @param list The list of elements to compare
   */
  function calculate(int256[] memory list)
    internal
    pure
    returns (int256)
  {
    return calculateInplace(copy(list));
  }

  /**
   * @notice See documentation for function calculate.
   * @dev The list passed as an argument may be permuted.
   */
  function calculateInplace(int256[] memory list)
    internal
    pure
    returns (int256)
  {
    require(0 < list.length, "list must not be empty");
    uint256 len = list.length;
    uint256 middleIndex = len / 2;
    if (len % 2 == 0) {
      int256 median1;
      int256 median2;
      (median1, median2) = quickselectTwo(list, 0, len - 1, middleIndex - 1, middleIndex);
      return SignedSafeMath.avg(median1, median2);
    } else {
      return quickselect(list, 0, len - 1, middleIndex);
    }
  }

  /**
   * @notice Maximum length of list that shortSelectTwo can handle
   */
  uint256 constant SHORTSELECTTWO_MAX_LENGTH = 7;

  /**
   * @notice Select the k1-th and k2-th element from list of length at most 7
   * @dev Uses an optimal sorting network
   */
  function shortSelectTwo(
    int256[] memory list,
    uint256 lo,
    uint256 hi,
    uint256 k1,
    uint256 k2
  )
    private
    pure
    returns (int256 k1th, int256 k2th)
  {
    // Uses an optimal sorting network (https://en.wikipedia.org/wiki/Sorting_network)
    // for lists of length 7. Network layout is taken from
    // http://jgamble.ripco.net/cgi-bin/nw.cgi?inputs=7&algorithm=hibbard&output=svg

    uint256 len = hi + 1 - lo;
    int256 x0 = list[lo + 0];
    int256 x1 = 1 < len ? list[lo + 1] : INT_MAX;
    int256 x2 = 2 < len ? list[lo + 2] : INT_MAX;
    int256 x3 = 3 < len ? list[lo + 3] : INT_MAX;
    int256 x4 = 4 < len ? list[lo + 4] : INT_MAX;
    int256 x5 = 5 < len ? list[lo + 5] : INT_MAX;
    int256 x6 = 6 < len ? list[lo + 6] : INT_MAX;

    if (x0 > x1) {(x0, x1) = (x1, x0);}
    if (x2 > x3) {(x2, x3) = (x3, x2);}
    if (x4 > x5) {(x4, x5) = (x5, x4);}
    if (x0 > x2) {(x0, x2) = (x2, x0);}
    if (x1 > x3) {(x1, x3) = (x3, x1);}
    if (x4 > x6) {(x4, x6) = (x6, x4);}
    if (x1 > x2) {(x1, x2) = (x2, x1);}
    if (x5 > x6) {(x5, x6) = (x6, x5);}
    if (x0 > x4) {(x0, x4) = (x4, x0);}
    if (x1 > x5) {(x1, x5) = (x5, x1);}
    if (x2 > x6) {(x2, x6) = (x6, x2);}
    if (x1 > x4) {(x1, x4) = (x4, x1);}
    if (x3 > x6) {(x3, x6) = (x6, x3);}
    if (x2 > x4) {(x2, x4) = (x4, x2);}
    if (x3 > x5) {(x3, x5) = (x5, x3);}
    if (x3 > x4) {(x3, x4) = (x4, x3);}

    uint256 index1 = k1 - lo;
    if (index1 == 0) {k1th = x0;}
    else if (index1 == 1) {k1th = x1;}
    else if (index1 == 2) {k1th = x2;}
    else if (index1 == 3) {k1th = x3;}
    else if (index1 == 4) {k1th = x4;}
    else if (index1 == 5) {k1th = x5;}
    else if (index1 == 6) {k1th = x6;}
    else {revert("k1 out of bounds");}

    uint256 index2 = k2 - lo;
    if (k1 == k2) {return (k1th, k1th);}
    else if (index2 == 0) {return (k1th, x0);}
    else if (index2 == 1) {return (k1th, x1);}
    else if (index2 == 2) {return (k1th, x2);}
    else if (index2 == 3) {return (k1th, x3);}
    else if (index2 == 4) {return (k1th, x4);}
    else if (index2 == 5) {return (k1th, x5);}
    else if (index2 == 6) {return (k1th, x6);}
    else {revert("k2 out of bounds");}
  }

  /**
   * @notice Selects the k-th ranked element from list, looking only at indices between lo and hi
   * (inclusive). Modifies list in-place.
   */
  function quickselect(int256[] memory list, uint256 lo, uint256 hi, uint256 k)
    private
    pure
    returns (int256 kth)
  {
    require(lo <= k);
    require(k <= hi);
    while (lo < hi) {
      if (hi - lo < SHORTSELECTTWO_MAX_LENGTH) {
        int256 ignore;
        (kth, ignore) = shortSelectTwo(list, lo, hi, k, k);
        return kth;
      }
      uint256 pivotIndex = partition(list, lo, hi);
      if (k <= pivotIndex) {
        // since pivotIndex < (original hi passed to partition),
        // termination is guaranteed in this case
        hi = pivotIndex;
      } else {
        // since (original lo passed to partition) <= pivotIndex,
        // termination is guaranteed in this case
        lo = pivotIndex + 1;
      }
    }
    return list[lo];
  }

  /**
   * @notice Selects the k1-th and k2-th ranked elements from list, looking only at indices between
   * lo and hi (inclusive). Modifies list in-place.
   */
  function quickselectTwo(
    int256[] memory list,
    uint256 lo,
    uint256 hi,
    uint256 k1,
    uint256 k2
  )
    internal // for testing
    pure
    returns (int256 k1th, int256 k2th)
  {
    require(k1 < k2);
    require(lo <= k1 && k1 <= hi);
    require(lo <= k2 && k2 <= hi);

    while (true) {
      if (hi - lo < SHORTSELECTTWO_MAX_LENGTH) {
        return shortSelectTwo(list, lo, hi, k1, k2);
      }
      uint256 pivotIdx = partition(list, lo, hi);
      if (k2 <= pivotIdx) {
        hi = pivotIdx;
      } else if (pivotIdx < k1) {
        lo = pivotIdx + 1;
      } else {
        assert(k1 <= pivotIdx && pivotIdx < k2);
        k1th = quickselect(list, lo, pivotIdx, k1);
        k2th = quickselect(list, pivotIdx + 1, hi, k2);
        return (k1th, k2th);
      }
    }
  }

  /**
   * @notice Partitions list in-place using Hoare's partitioning scheme.
   * Only elements of list between indices lo and hi (inclusive) will be modified.
   * Returns an index i, such that:
   * - lo <= i < hi
   * - forall j in [lo, i]. list[j] <= list[i]
   * - forall j in [i, hi]. list[i] <= list[j]
   */
  function partition(int256[] memory list, uint256 lo, uint256 hi)
    private
    pure
    returns (uint256)
  {
    // We don't care about overflow of the addition, because it would require a list
    // larger than any feasible computer's memory.
    int256 pivot = list[(lo + hi) / 2];
    lo -= 1; // this can underflow. that's intentional.
    hi += 1;
    while (true) {
      do {
        lo += 1;
      } while (list[lo] < pivot);
      do {
        hi -= 1;
      } while (list[hi] > pivot);
      if (lo < hi) {
        (list[lo], list[hi]) = (list[hi], list[lo]);
      } else {
        // Let orig_lo and orig_hi be the original values of lo and hi passed to partition.
        // Then, hi < orig_hi, because hi decreases *strictly* monotonically
        // in each loop iteration and
        // - either list[orig_hi] > pivot, in which case the first loop iteration
        //   will achieve hi < orig_hi;
        // - or list[orig_hi] <= pivot, in which case at least two loop iterations are
        //   needed:
        //   - lo will have to stop at least once in the interval
        //     [orig_lo, (orig_lo + orig_hi)/2]
        //   - (orig_lo + orig_hi)/2 < orig_hi
        return hi;
      }
    }
  }

  /**
   * @notice Makes an in-memory copy of the array passed in
   * @param list Reference to the array to be copied
   */
  function copy(int256[] memory list)
    private
    pure
    returns(int256[] memory)
  {
    int256[] memory list2 = new int256[](list.length);
    for (uint256 i = 0; i < list.length; i++) {
      list2[i] = list[i];
    }
    return list2;
  }
}

/**
 * @title The Owned contract
 * @notice A contract with helpers for basic contract ownership.
 */
contract Owned {

  address public owner;
  address private pendingOwner;

  event OwnershipTransferRequested(
    address indexed from,
    address indexed to
  );
  event OwnershipTransferred(
    address indexed from,
    address indexed to
  );

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

  /**
   * @dev Allows an owner to begin transferring ownership to a new address,
   * pending.
   */
  function transferOwnership(address _to)
    external
    onlyOwner()
  {
    pendingOwner = _to;

    emit OwnershipTransferRequested(owner, _to);
  }

  /**
   * @dev Allows an ownership transfer to be completed by the recipient.
   */
  function acceptOwnership()
    external
  {
    require(msg.sender == pendingOwner, "Must be proposed owner");

    address oldOwner = owner;
    owner = msg.sender;
    pendingOwner = address(0);

    emit OwnershipTransferred(oldOwner, msg.sender);
  }

  /**
   * @dev Reverts if called by anyone other than the contract owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner, "Only callable by owner");
    _;
  }

}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * This library is a version of Open Zeppelin's SafeMath, modified to support
 * unsigned 128 bit integers.
 */
library SafeMath128 {
  /**
    * @dev Returns the addition of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `+` operator.
    *
    * Requirements:
    * - Addition cannot overflow.
    */
  function add(uint128 a, uint128 b) internal pure returns (uint128) {
    uint128 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(uint128 a, uint128 b) internal pure returns (uint128) {
    require(b <= a, "SafeMath: subtraction overflow");
    uint128 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(uint128 a, uint128 b) internal pure returns (uint128) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    uint128 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(uint128 a, uint128 b) internal pure returns (uint128) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, "SafeMath: division by zero");
    uint128 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(uint128 a, uint128 b) internal pure returns (uint128) {
    require(b != 0, "SafeMath: modulo by zero");
    return a % b;
  }
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * This library is a version of Open Zeppelin's SafeMath, modified to support
 * unsigned 32 bit integers.
 */
library SafeMath32 {
  /**
    * @dev Returns the addition of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `+` operator.
    *
    * Requirements:
    * - Addition cannot overflow.
    */
  function add(uint32 a, uint32 b) internal pure returns (uint32) {
    uint32 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(uint32 a, uint32 b) internal pure returns (uint32) {
    require(b <= a, "SafeMath: subtraction overflow");
    uint32 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(uint32 a, uint32 b) internal pure returns (uint32) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    uint32 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(uint32 a, uint32 b) internal pure returns (uint32) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, "SafeMath: division by zero");
    uint32 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(uint32 a, uint32 b) internal pure returns (uint32) {
    require(b != 0, "SafeMath: modulo by zero");
    return a % b;
  }
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * This library is a version of Open Zeppelin's SafeMath, modified to support
 * unsigned 64 bit integers.
 */
library SafeMath64 {
  /**
    * @dev Returns the addition of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `+` operator.
    *
    * Requirements:
    * - Addition cannot overflow.
    */
  function add(uint64 a, uint64 b) internal pure returns (uint64) {
    uint64 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(uint64 a, uint64 b) internal pure returns (uint64) {
    require(b <= a, "SafeMath: subtraction overflow");
    uint64 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(uint64 a, uint64 b) internal pure returns (uint64) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    uint64 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(uint64 a, uint64 b) internal pure returns (uint64) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, "SafeMath: division by zero");
    uint64 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(uint64 a, uint64 b) internal pure returns (uint64) {
    require(b != 0, "SafeMath: modulo by zero");
    return a % b;
  }
}

interface AggregatorInterface {
  function latestAnswer() external view returns (int256);
  function latestTimestamp() external view returns (uint256);
  function latestRound() external view returns (uint256);
  function getAnswer(uint256 roundId) external view returns (int256);
  function getTimestamp(uint256 roundId) external view returns (uint256);

  event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);
  event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);
}

interface AggregatorV3Interface {

  function decimals() external view returns (uint8);
  function description() external view returns (string memory);
  function version() external view returns (uint256);

  // getRoundData and latestRoundData should both raise "No data present"
  // if they do not have data to report, instead of returning unset values
  // which could be misinterpreted as actual reported values.
  function getRoundData(uint80 _roundId)
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

}

interface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface
{
}

interface AggregatorValidatorInterface {
  function validate(
    uint256 previousRoundId,
    int256 previousAnswer,
    uint256 currentRoundId,
    int256 currentAnswer
  ) external returns (bool);
}

interface LinkTokenInterface {
  function allowance(address owner, address spender) external view returns (uint256 remaining);
  function approve(address spender, uint256 value) external returns (bool success);
  function balanceOf(address owner) external view returns (uint256 balance);
  function decimals() external view returns (uint8 decimalPlaces);
  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);
  function increaseApproval(address spender, uint256 subtractedValue) external;
  function name() external view returns (string memory tokenName);
  function symbol() external view returns (string memory tokenSymbol);
  function totalSupply() external view returns (uint256 totalTokensIssued);
  function transfer(address to, uint256 value) external returns (bool success);
  function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);
  function transferFrom(address from, address to, uint256 value) external returns (bool success);
}

/**
 * @title The Prepaid Aggregator contract
 * @notice Handles aggregating data pushed in from off-chain, and unlocks
 * payment for oracles as they report. Oracles' submissions are gathered in
 * rounds, with each round aggregating the submissions for each oracle into a
 * single answer. The latest aggregated answer is exposed as well as historical
 * answers and their updated at timestamp.
 */
contract FluxAggregator is AggregatorV2V3Interface, Owned {
  using SafeMathChainlink for uint256;
  using SafeMath128 for uint128;
  using SafeMath64 for uint64;
  using SafeMath32 for uint32;

  struct Round {
    int256 answer;
    uint64 startedAt;
    uint64 updatedAt;
    uint32 answeredInRound;
  }

  struct RoundDetails {
    int256[] submissions;
    uint32 maxSubmissions;
    uint32 minSubmissions;
    uint32 timeout;
    uint128 paymentAmount;
  }

  struct OracleStatus {
    uint128 withdrawable;
    uint32 startingRound;
    uint32 endingRound;
    uint32 lastReportedRound;
    uint32 lastStartedRound;
    int256 latestSubmission;
    uint16 index;
    address admin;
    address pendingAdmin;
  }

  struct Requester {
    bool authorized;
    uint32 delay;
    uint32 lastStartedRound;
  }

  struct Funds {
    uint128 available;
    uint128 allocated;
  }

  LinkTokenInterface public linkToken;
  AggregatorValidatorInterface public validator;

  // Round related params
  uint128 public paymentAmount;
  uint32 public maxSubmissionCount;
  uint32 public minSubmissionCount;
  uint32 public restartDelay;
  uint32 public timeout;
  uint8 public override decimals;
  string public override description;

  int256 immutable public minSubmissionValue;
  int256 immutable public maxSubmissionValue;

  uint256 constant public override version = 3;

  /**
   * @notice To ensure owner isn't withdrawing required funds as oracles are
   * submitting updates, we enforce that the contract maintains a minimum
   * reserve of RESERVE_ROUNDS * oracleCount() LINK earmarked for payment to
   * oracles. (Of course, this doesn't prevent the contract from running out of
   * funds without the owner's intervention.)
   */
  uint256 constant private RESERVE_ROUNDS = 2;
  uint256 constant private MAX_ORACLE_COUNT = 77;
  uint32 constant private ROUND_MAX = 2**32-1;
  uint256 private constant VALIDATOR_GAS_LIMIT = 100000;
  // An error specific to the Aggregator V3 Interface, to prevent possible
  // confusion around accidentally reading unset values as reported values.
  string constant private V3_NO_DATA_ERROR = "No data present";

  uint32 private reportingRoundId;
  uint32 internal latestRoundId;
  mapping(address => OracleStatus) private oracles;
  mapping(uint32 => Round) internal rounds;
  mapping(uint32 => RoundDetails) internal details;
  mapping(address => Requester) internal requesters;
  address[] private oracleAddresses;
  Funds private recordedFunds;

  event AvailableFundsUpdated(
    uint256 indexed amount
  );
  event RoundDetailsUpdated(
    uint128 indexed paymentAmount,
    uint32 indexed minSubmissionCount,
    uint32 indexed maxSubmissionCount,
    uint32 restartDelay,
    uint32 timeout // measured in seconds
  );
  event OraclePermissionsUpdated(
    address indexed oracle,
    bool indexed whitelisted
  );
  event OracleAdminUpdated(
    address indexed oracle,
    address indexed newAdmin
  );
  event OracleAdminUpdateRequested(
    address indexed oracle,
    address admin,
    address newAdmin
  );
  event SubmissionReceived(
    int256 indexed submission,
    uint32 indexed round,
    address indexed oracle
  );
  event RequesterPermissionsSet(
    address indexed requester,
    bool authorized,
    uint32 delay
  );
  event ValidatorUpdated(
    address indexed previous,
    address indexed current
  );

  /**
   * @notice set up the aggregator with initial configuration
   * @param _link The address of the LINK token
   * @param _paymentAmount The amount paid of LINK paid to each oracle per submission, in wei (units of 10⁻¹⁸ LINK)
   * @param _timeout is the number of seconds after the previous round that are
   * allowed to lapse before allowing an oracle to skip an unfinished round
   * @param _validator is an optional contract address for validating
   * external validation of answers
   * @param _minSubmissionValue is an immutable check for a lower bound of what
   * submission values are accepted from an oracle
   * @param _maxSubmissionValue is an immutable check for an upper bound of what
   * submission values are accepted from an oracle
   * @param _decimals represents the number of decimals to offset the answer by
   * @param _description a short description of what is being reported
   */
  constructor(
    address _link,
    uint128 _paymentAmount,
    uint32 _timeout,
    address _validator,
    int256 _minSubmissionValue,
    int256 _maxSubmissionValue,
    uint8 _decimals,
    string memory _description
  ) public {
    linkToken = LinkTokenInterface(_link);
    updateFutureRounds(_paymentAmount, 0, 0, 0, _timeout);
    setValidator(_validator);
    minSubmissionValue = _minSubmissionValue;
    maxSubmissionValue = _maxSubmissionValue;
    decimals = _decimals;
    description = _description;
    rounds[0].updatedAt = uint64(block.timestamp.sub(uint256(_timeout)));
  }

  /**
   * @notice called by oracles when they have witnessed a need to update
   * @param _roundId is the ID of the round this submission pertains to
   * @param _submission is the updated data that the oracle is submitting
   */
  function submit(uint256 _roundId, int256 _submission)
    external
  {
    bytes memory error = validateOracleRound(msg.sender, uint32(_roundId));
    require(_submission >= minSubmissionValue, "value below minSubmissionValue");
    require(_submission <= maxSubmissionValue, "value above maxSubmissionValue");
    require(error.length == 0, string(error));

    oracleInitializeNewRound(uint32(_roundId));
    recordSubmission(_submission, uint32(_roundId));
    (bool updated, int256 newAnswer) = updateRoundAnswer(uint32(_roundId));
    payOracle(uint32(_roundId));
    deleteRoundDetails(uint32(_roundId));
    if (updated) {
      validateAnswer(uint32(_roundId), newAnswer);
    }
  }

  /**
   * @notice called by the owner to remove and add new oracles as well as
   * update the round related parameters that pertain to total oracle count
   * @param _removed is the list of addresses for the new Oracles being removed
   * @param _added is the list of addresses for the new Oracles being added
   * @param _addedAdmins is the admin addresses for the new respective _added
   * list. Only this address is allowed to access the respective oracle's funds
   * @param _minSubmissions is the new minimum submission count for each round
   * @param _maxSubmissions is the new maximum submission count for each round
   * @param _restartDelay is the number of rounds an Oracle has to wait before
   * they can initiate a round
   */
  function changeOracles(
    address[] calldata _removed,
    address[] calldata _added,
    address[] calldata _addedAdmins,
    uint32 _minSubmissions,
    uint32 _maxSubmissions,
    uint32 _restartDelay
  )
    external
    onlyOwner()
  {
    for (uint256 i = 0; i < _removed.length; i++) {
      removeOracle(_removed[i]);
    }

    require(_added.length == _addedAdmins.length, "need same oracle and admin count");
    require(uint256(oracleCount()).add(_added.length) <= MAX_ORACLE_COUNT, "max oracles allowed");

    for (uint256 i = 0; i < _added.length; i++) {
      addOracle(_added[i], _addedAdmins[i]);
    }

    updateFutureRounds(paymentAmount, _minSubmissions, _maxSubmissions, _restartDelay, timeout);
  }

  /**
   * @notice update the round and payment related parameters for subsequent
   * rounds
   * @param _paymentAmount is the payment amount for subsequent rounds
   * @param _minSubmissions is the new minimum submission count for each round
   * @param _maxSubmissions is the new maximum submission count for each round
   * @param _restartDelay is the number of rounds an Oracle has to wait before
   * they can initiate a round
   */
  function updateFutureRounds(
    uint128 _paymentAmount,
    uint32 _minSubmissions,
    uint32 _maxSubmissions,
    uint32 _restartDelay,
    uint32 _timeout
  )
    public
    onlyOwner()
  {
    uint32 oracleNum = oracleCount(); // Save on storage reads
    require(_maxSubmissions >= _minSubmissions, "max must equal/exceed min");
    require(oracleNum >= _maxSubmissions, "max cannot exceed total");
    require(oracleNum == 0 || oracleNum > _restartDelay, "delay cannot exceed total");
    require(recordedFunds.available >= requiredReserve(_paymentAmount), "insufficient funds for payment");
    if (oracleCount() > 0) {
      require(_minSubmissions > 0, "min must be greater than 0");
    }

    paymentAmount = _paymentAmount;
    minSubmissionCount = _minSubmissions;
    maxSubmissionCount = _maxSubmissions;
    restartDelay = _restartDelay;
    timeout = _timeout;

    emit RoundDetailsUpdated(
      paymentAmount,
      _minSubmissions,
      _maxSubmissions,
      _restartDelay,
      _timeout
    );
  }

  /**
   * @notice the amount of payment yet to be withdrawn by oracles
   */
  function allocatedFunds()
    external
    view
    returns (uint128)
  {
    return recordedFunds.allocated;
  }

  /**
   * @notice the amount of future funding available to oracles
   */
  function availableFunds()
    external
    view
    returns (uint128)
  {
    return recordedFunds.available;
  }

  /**
   * @notice recalculate the amount of LINK available for payouts
   */
  function updateAvailableFunds()
    public
  {
    Funds memory funds = recordedFunds;

    uint256 nowAvailable = linkToken.balanceOf(address(this)).sub(funds.allocated);

    if (funds.available != nowAvailable) {
      recordedFunds.available = uint128(nowAvailable);
      emit AvailableFundsUpdated(nowAvailable);
    }
  }

  /**
   * @notice returns the number of oracles
   */
  function oracleCount() public view returns (uint8) {
    return uint8(oracleAddresses.length);
  }

  /**
   * @notice returns an array of addresses containing the oracles on contract
   */
  function getOracles() external view returns (address[] memory) {
    return oracleAddresses;
  }

  /**
   * @notice get the most recently reported answer
   *
   * @dev #[deprecated] Use latestRoundData instead. This does not error if no
   * answer has been reached, it will simply return 0. Either wait to point to
   * an already answered Aggregator or use the recommended latestRoundData
   * instead which includes better verification information.
   */
  function latestAnswer()
    public
    view
    virtual
    override
    returns (int256)
  {
    return rounds[latestRoundId].answer;
  }

  /**
   * @notice get the most recent updated at timestamp
   *
   * @dev #[deprecated] Use latestRoundData instead. This does not error if no
   * answer has been reached, it will simply return 0. Either wait to point to
   * an already answered Aggregator or use the recommended latestRoundData
   * instead which includes better verification information.
   */
  function latestTimestamp()
    public
    view
    virtual
    override
    returns (uint256)
  {
    return rounds[latestRoundId].updatedAt;
  }

  /**
   * @notice get the ID of the last updated round
   *
   * @dev #[deprecated] Use latestRoundData instead. This does not error if no
   * answer has been reached, it will simply return 0. Either wait to point to
   * an already answered Aggregator or use the recommended latestRoundData
   * instead which includes better verification information.
   */
  function latestRound()
    public
    view
    virtual
    override
    returns (uint256)
  {
    return latestRoundId;
  }

  /**
   * @notice get past rounds answers
   * @param _roundId the round number to retrieve the answer for
   *
   * @dev #[deprecated] Use getRoundData instead. This does not error if no
   * answer has been reached, it will simply return 0. Either wait to point to
   * an already answered Aggregator or use the recommended getRoundData
   * instead which includes better verification information.
   */
  function getAnswer(uint256 _roundId)
    public
    view
    virtual
    override
    returns (int256)
  {
    if (validRoundId(_roundId)) {
      return rounds[uint32(_roundId)].answer;
    }
    return 0;
  }

  /**
   * @notice get timestamp when an answer was last updated
   * @param _roundId the round number to retrieve the updated timestamp for
   *
   * @dev #[deprecated] Use getRoundData instead. This does not error if no
   * answer has been reached, it will simply return 0. Either wait to point to
   * an already answered Aggregator or use the recommended getRoundData
   * instead which includes better verification information.
   */
  function getTimestamp(uint256 _roundId)
    public
    view
    virtual
    override
    returns (uint256)
  {
    if (validRoundId(_roundId)) {
      return rounds[uint32(_roundId)].updatedAt;
    }
    return 0;
  }

  /**
   * @notice get data about a round. Consumers are encouraged to check
   * that they're receiving fresh data by inspecting the updatedAt and
   * answeredInRound return values.
   * @param _roundId the round ID to retrieve the round data for
   * @return roundId is the round ID for which data was retrieved
   * @return answer is the answer for the given round
   * @return startedAt is the timestamp when the round was started. This is 0
   * if the round hasn't been started yet.
   * @return updatedAt is the timestamp when the round last was updated (i.e.
   * answer was last computed)
   * @return answeredInRound is the round ID of the round in which the answer
   * was computed. answeredInRound may be smaller than roundId when the round
   * timed out. answeredInRound is equal to roundId when the round didn't time out
   * and was completed regularly.
   * @dev Note that for in-progress rounds (i.e. rounds that haven't yet received
   * maxSubmissions) answer and updatedAt may change between queries.
   */
  function getRoundData(uint80 _roundId)
    public
    view
    virtual
    override
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    )
  {
    Round memory r = rounds[uint32(_roundId)];

    require(r.answeredInRound > 0 && validRoundId(_roundId), V3_NO_DATA_ERROR);

    return (
      _roundId,
      r.answer,
      r.startedAt,
      r.updatedAt,
      r.answeredInRound
    );
  }

  /**
   * @notice get data about the latest round. Consumers are encouraged to check
   * that they're receiving fresh data by inspecting the updatedAt and
   * answeredInRound return values. Consumers are encouraged to
   * use this more fully featured method over the "legacy" latestRound/
   * latestAnswer/latestTimestamp functions. Consumers are encouraged to check
   * that they're receiving fresh data by inspecting the updatedAt and
   * answeredInRound return values.
   * @return roundId is the round ID for which data was retrieved
   * @return answer is the answer for the given round
   * @return startedAt is the timestamp when the round was started. This is 0
   * if the round hasn't been started yet.
   * @return updatedAt is the timestamp when the round last was updated (i.e.
   * answer was last computed)
   * @return answeredInRound is the round ID of the round in which the answer
   * was computed. answeredInRound may be smaller than roundId when the round
   * timed out. answeredInRound is equal to roundId when the round didn't time
   * out and was completed regularly.
   * @dev Note that for in-progress rounds (i.e. rounds that haven't yet
   * received maxSubmissions) answer and updatedAt may change between queries.
   */
   function latestRoundData()
    public
    view
    virtual
    override
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    )
  {
    return getRoundData(latestRoundId);
  }


  /**
   * @notice query the available amount of LINK for an oracle to withdraw
   */
  function withdrawablePayment(address _oracle)
    external
    view
    returns (uint256)
  {
    return oracles[_oracle].withdrawable;
  }

  /**
   * @notice transfers the oracle's LINK to another address. Can only be called
   * by the oracle's admin.
   * @param _oracle is the oracle whose LINK is transferred
   * @param _recipient is the address to send the LINK to
   * @param _amount is the amount of LINK to send
   */
  function withdrawPayment(address _oracle, address _recipient, uint256 _amount)
    external
  {
    require(oracles[_oracle].admin == msg.sender, "only callable by admin");

    // Safe to downcast _amount because the total amount of LINK is less than 2^128.
    uint128 amount = uint128(_amount);
    uint128 available = oracles[_oracle].withdrawable;
    require(available >= amount, "insufficient withdrawable funds");

    oracles[_oracle].withdrawable = available.sub(amount);
    recordedFunds.allocated = recordedFunds.allocated.sub(amount);

    assert(linkToken.transfer(_recipient, uint256(amount)));
  }

  /**
   * @notice transfers the owner's LINK to another address
   * @param _recipient is the address to send the LINK to
   * @param _amount is the amount of LINK to send
   */
  function withdrawFunds(address _recipient, uint256 _amount)
    external
    onlyOwner()
  {
    uint256 available = uint256(recordedFunds.available);
    require(available.sub(requiredReserve(paymentAmount)) >= _amount, "insufficient reserve funds");
    require(linkToken.transfer(_recipient, _amount), "token transfer failed");
    updateAvailableFunds();
  }

  /**
   * @notice get the admin address of an oracle
   * @param _oracle is the address of the oracle whose admin is being queried
   */
  function getAdmin(address _oracle)
    external
    view
    returns (address)
  {
    return oracles[_oracle].admin;
  }

  /**
   * @notice transfer the admin address for an oracle
   * @param _oracle is the address of the oracle whose admin is being transferred
   * @param _newAdmin is the new admin address
   */
  function transferAdmin(address _oracle, address _newAdmin)
    external
  {
    require(oracles[_oracle].admin == msg.sender, "only callable by admin");
    oracles[_oracle].pendingAdmin = _newAdmin;

    emit OracleAdminUpdateRequested(_oracle, msg.sender, _newAdmin);
  }

  /**
   * @notice accept the admin address transfer for an oracle
   * @param _oracle is the address of the oracle whose admin is being transferred
   */
  function acceptAdmin(address _oracle)
    external
  {
    require(oracles[_oracle].pendingAdmin == msg.sender, "only callable by pending admin");
    oracles[_oracle].pendingAdmin = address(0);
    oracles[_oracle].admin = msg.sender;

    emit OracleAdminUpdated(_oracle, msg.sender);
  }

  /**
   * @notice allows non-oracles to request a new round
   */
  function requestNewRound()
    external
    returns (uint80)
  {
    require(requesters[msg.sender].authorized, "not authorized requester");

    uint32 current = reportingRoundId;
    require(rounds[current].updatedAt > 0 || timedOut(current), "prev round must be supersedable");

    uint32 newRoundId = current.add(1);
    requesterInitializeNewRound(newRoundId);
    return newRoundId;
  }

  /**
   * @notice allows the owner to specify new non-oracles to start new rounds
   * @param _requester is the address to set permissions for
   * @param _authorized is a boolean specifying whether they can start new rounds or not
   * @param _delay is the number of rounds the requester must wait before starting another round
   */
  function setRequesterPermissions(address _requester, bool _authorized, uint32 _delay)
    external
    onlyOwner()
  {
    if (requesters[_requester].authorized == _authorized) return;

    if (_authorized) {
      requesters[_requester].authorized = _authorized;
      requesters[_requester].delay = _delay;
    } else {
      delete requesters[_requester];
    }

    emit RequesterPermissionsSet(_requester, _authorized, _delay);
  }

  /**
   * @notice called through LINK's transferAndCall to update available funds
   * in the same transaction as the funds were transferred to the aggregator
   * @param _data is mostly ignored. It is checked for length, to be sure
   * nothing strange is passed in.
   */
  function onTokenTransfer(address, uint256, bytes calldata _data)
    external
  {
    require(_data.length == 0, "transfer doesn't accept calldata");
    updateAvailableFunds();
  }

  /**
   * @notice a method to provide all current info oracles need. Intended only
   * only to be callable by oracles. Not for use by contracts to read state.
   * @param _oracle the address to look up information for.
   */
  function oracleRoundState(address _oracle, uint32 _queriedRoundId)
    external
    view
    returns (
      bool _eligibleToSubmit,
      uint32 _roundId,
      int256 _latestSubmission,
      uint64 _startedAt,
      uint64 _timeout,
      uint128 _availableFunds,
      uint8 _oracleCount,
      uint128 _paymentAmount
    )
  {
    require(msg.sender == tx.origin, "off-chain reading only");

    if (_queriedRoundId > 0) {
      Round storage round = rounds[_queriedRoundId];
      RoundDetails storage details = details[_queriedRoundId];
      return (
        eligibleForSpecificRound(_oracle, _queriedRoundId),
        _queriedRoundId,
        oracles[_oracle].latestSubmission,
        round.startedAt,
        details.timeout,
        recordedFunds.available,
        oracleCount(),
        (round.startedAt > 0 ? details.paymentAmount : paymentAmount)
      );
    } else {
      return oracleRoundStateSuggestRound(_oracle);
    }
  }

  /**
   * @notice method to update the address which does external data validation.
   * @param _newValidator designates the address of the new validation contract.
   */
  function setValidator(address _newValidator)
    public
    onlyOwner()
  {
    address previous = address(validator);

    if (previous != _newValidator) {
      validator = AggregatorValidatorInterface(_newValidator);

      emit ValidatorUpdated(previous, _newValidator);
    }
  }


  /**
   * Private
   */

  function initializeNewRound(uint32 _roundId)
    private
  {
    updateTimedOutRoundInfo(_roundId.sub(1));

    reportingRoundId = _roundId;
    RoundDetails memory nextDetails = RoundDetails(
      new int256[](0),
      maxSubmissionCount,
      minSubmissionCount,
      timeout,
      paymentAmount
    );
    details[_roundId] = nextDetails;
    rounds[_roundId].startedAt = uint64(block.timestamp);

    emit NewRound(_roundId, msg.sender, rounds[_roundId].startedAt);
  }

  function oracleInitializeNewRound(uint32 _roundId)
    private
  {
    if (!newRound(_roundId)) return;
    uint256 lastStarted = oracles[msg.sender].lastStartedRound; // cache storage reads
    if (_roundId <= lastStarted + restartDelay && lastStarted != 0) return;

    initializeNewRound(_roundId);

    oracles[msg.sender].lastStartedRound = _roundId;
  }

  function requesterInitializeNewRound(uint32 _roundId)
    private
  {
    if (!newRound(_roundId)) return;
    uint256 lastStarted = requesters[msg.sender].lastStartedRound; // cache storage reads
    require(_roundId > lastStarted + requesters[msg.sender].delay || lastStarted == 0, "must delay requests");

    initializeNewRound(_roundId);

    requesters[msg.sender].lastStartedRound = _roundId;
  }

  function updateTimedOutRoundInfo(uint32 _roundId)
    private
  {
    if (!timedOut(_roundId)) return;

    uint32 prevId = _roundId.sub(1);
    rounds[_roundId].answer = rounds[prevId].answer;
    rounds[_roundId].answeredInRound = rounds[prevId].answeredInRound;
    rounds[_roundId].updatedAt = uint64(block.timestamp);

    delete details[_roundId];
  }

  function eligibleForSpecificRound(address _oracle, uint32 _queriedRoundId)
    private
    view
    returns (bool _eligible)
  {
    if (rounds[_queriedRoundId].startedAt > 0) {
      return acceptingSubmissions(_queriedRoundId) && validateOracleRound(_oracle, _queriedRoundId).length == 0;
    } else {
      return delayed(_oracle, _queriedRoundId) && validateOracleRound(_oracle, _queriedRoundId).length == 0;
    }
  }

  function oracleRoundStateSuggestRound(address _oracle)
    private
    view
    returns (
      bool _eligibleToSubmit,
      uint32 _roundId,
      int256 _latestSubmission,
      uint64 _startedAt,
      uint64 _timeout,
      uint128 _availableFunds,
      uint8 _oracleCount,
      uint128 _paymentAmount
    )
  {
    Round storage round = rounds[0];
    OracleStatus storage oracle = oracles[_oracle];

    bool shouldSupersede = oracle.lastReportedRound == reportingRoundId || !acceptingSubmissions(reportingRoundId);
    // Instead of nudging oracles to submit to the next round, the inclusion of
    // the shouldSupersede bool in the if condition pushes them towards
    // submitting in a currently open round.
    if (supersedable(reportingRoundId) && shouldSupersede) {
      _roundId = reportingRoundId.add(1);
      round = rounds[_roundId];

      _paymentAmount = paymentAmount;
      _eligibleToSubmit = delayed(_oracle, _roundId);
    } else {
      _roundId = reportingRoundId;
      round = rounds[_roundId];

      _paymentAmount = details[_roundId].paymentAmount;
      _eligibleToSubmit = acceptingSubmissions(_roundId);
    }

    if (validateOracleRound(_oracle, _roundId).length != 0) {
      _eligibleToSubmit = false;
    }

    return (
      _eligibleToSubmit,
      _roundId,
      oracle.latestSubmission,
      round.startedAt,
      details[_roundId].timeout,
      recordedFunds.available,
      oracleCount(),
      _paymentAmount
    );
  }

  function updateRoundAnswer(uint32 _roundId)
    internal
    returns (bool, int256)
  {
    if (details[_roundId].submissions.length < details[_roundId].minSubmissions) {
      return (false, 0);
    }

    int256 newAnswer = Median.calculateInplace(details[_roundId].submissions);
    rounds[_roundId].answer = newAnswer;
    rounds[_roundId].updatedAt = uint64(block.timestamp);
    rounds[_roundId].answeredInRound = _roundId;
    latestRoundId = _roundId;

    emit AnswerUpdated(newAnswer, _roundId, now);

    return (true, newAnswer);
  }

  function validateAnswer(
    uint32 _roundId,
    int256 _newAnswer
  )
    private
  {
    AggregatorValidatorInterface av = validator; // cache storage reads
    if (address(av) == address(0)) return;

    uint32 prevRound = _roundId.sub(1);
    uint32 prevAnswerRoundId = rounds[prevRound].answeredInRound;
    int256 prevRoundAnswer = rounds[prevRound].answer;
    // We do not want the validator to ever prevent reporting, so we limit its
    // gas usage and catch any errors that may arise.
    try av.validate{gas: VALIDATOR_GAS_LIMIT}(
      prevAnswerRoundId,
      prevRoundAnswer,
      _roundId,
      _newAnswer
    ) {} catch {}
  }

  function payOracle(uint32 _roundId)
    private
  {
    uint128 payment = details[_roundId].paymentAmount;
    Funds memory funds = recordedFunds;
    funds.available = funds.available.sub(payment);
    funds.allocated = funds.allocated.add(payment);
    recordedFunds = funds;
    oracles[msg.sender].withdrawable = oracles[msg.sender].withdrawable.add(payment);

    emit AvailableFundsUpdated(funds.available);
  }

  function recordSubmission(int256 _submission, uint32 _roundId)
    private
  {
    require(acceptingSubmissions(_roundId), "round not accepting submissions");

    details[_roundId].submissions.push(_submission);
    oracles[msg.sender].lastReportedRound = _roundId;
    oracles[msg.sender].latestSubmission = _submission;

    emit SubmissionReceived(_submission, _roundId, msg.sender);
  }

  function deleteRoundDetails(uint32 _roundId)
    private
  {
    if (details[_roundId].submissions.length < details[_roundId].maxSubmissions) return;

    delete details[_roundId];
  }

  function timedOut(uint32 _roundId)
    private
    view
    returns (bool)
  {
    uint64 startedAt = rounds[_roundId].startedAt;
    uint32 roundTimeout = details[_roundId].timeout;
    return startedAt > 0 && roundTimeout > 0 && startedAt.add(roundTimeout) < block.timestamp;
  }

  function getStartingRound(address _oracle)
    private
    view
    returns (uint32)
  {
    uint32 currentRound = reportingRoundId;
    if (currentRound != 0 && currentRound == oracles[_oracle].endingRound) {
      return currentRound;
    }
    return currentRound.add(1);
  }

  function previousAndCurrentUnanswered(uint32 _roundId, uint32 _rrId)
    private
    view
    returns (bool)
  {
    return _roundId.add(1) == _rrId && rounds[_rrId].updatedAt == 0;
  }

  function requiredReserve(uint256 payment)
    private
    view
    returns (uint256)
  {
    return payment.mul(oracleCount()).mul(RESERVE_ROUNDS);
  }

  function addOracle(
    address _oracle,
    address _admin
  )
    private
  {
    require(!oracleEnabled(_oracle), "oracle already enabled");

    require(_admin != address(0), "cannot set admin to 0");
    require(oracles[_oracle].admin == address(0) || oracles[_oracle].admin == _admin, "owner cannot overwrite admin");

    oracles[_oracle].startingRound = getStartingRound(_oracle);
    oracles[_oracle].endingRound = ROUND_MAX;
    oracles[_oracle].index = uint16(oracleAddresses.length);
    oracleAddresses.push(_oracle);
    oracles[_oracle].admin = _admin;

    emit OraclePermissionsUpdated(_oracle, true);
    emit OracleAdminUpdated(_oracle, _admin);
  }

  function removeOracle(
    address _oracle
  )
    private
  {
    require(oracleEnabled(_oracle), "oracle not enabled");

    oracles[_oracle].endingRound = reportingRoundId.add(1);
    address tail = oracleAddresses[uint256(oracleCount()).sub(1)];
    uint16 index = oracles[_oracle].index;
    oracles[tail].index = index;
    delete oracles[_oracle].index;
    oracleAddresses[index] = tail;
    oracleAddresses.pop();

    emit OraclePermissionsUpdated(_oracle, false);
  }

  function validateOracleRound(address _oracle, uint32 _roundId)
    private
    view
    returns (bytes memory)
  {
    // cache storage reads
    uint32 startingRound = oracles[_oracle].startingRound;
    uint32 rrId = reportingRoundId;

    if (startingRound == 0) return "not enabled oracle";
    if (startingRound > _roundId) return "not yet enabled oracle";
    if (oracles[_oracle].endingRound < _roundId) return "no longer allowed oracle";
    if (oracles[_oracle].lastReportedRound >= _roundId) return "cannot report on previous rounds";
    if (_roundId != rrId && _roundId != rrId.add(1) && !previousAndCurrentUnanswered(_roundId, rrId)) return "invalid round to report";
    if (_roundId != 1 && !supersedable(_roundId.sub(1))) return "previous round not supersedable";
  }

  function supersedable(uint32 _roundId)
    private
    view
    returns (bool)
  {
    return rounds[_roundId].updatedAt > 0 || timedOut(_roundId);
  }

  function oracleEnabled(address _oracle)
    private
    view
    returns (bool)
  {
    return oracles[_oracle].endingRound == ROUND_MAX;
  }

  function acceptingSubmissions(uint32 _roundId)
    private
    view
    returns (bool)
  {
    return details[_roundId].maxSubmissions != 0;
  }

  function delayed(address _oracle, uint32 _roundId)
    private
    view
    returns (bool)
  {
    uint256 lastStarted = oracles[_oracle].lastStartedRound;
    return _roundId > lastStarted + restartDelay || lastStarted == 0;
  }

  function newRound(uint32 _roundId)
    private
    view
    returns (bool)
  {
    return _roundId == reportingRoundId.add(1);
  }

  function validRoundId(uint256 _roundId)
    private
    view
    returns (bool)
  {
    return _roundId <= ROUND_MAX;
  }

}

interface AccessControllerInterface {
  function hasAccess(address user, bytes calldata data) external view returns (bool);
}

/**
 * @title SimpleWriteAccessController
 * @notice Gives access to accounts explicitly added to an access list by the
 * controller's owner.
 * @dev does not make any special permissions for externally, see
 * SimpleReadAccessController for that.
 */
contract SimpleWriteAccessController is AccessControllerInterface, Owned {

  bool public checkEnabled;
  mapping(address => bool) internal accessList;

  event AddedAccess(address user);
  event RemovedAccess(address user);
  event CheckAccessEnabled();
  event CheckAccessDisabled();

  constructor()
    public
  {
    checkEnabled = true;
  }

  /**
   * @notice Returns the access of an address
   * @param _user The address to query
   */
  function hasAccess(
    address _user,
    bytes memory
  )
    public
    view
    virtual
    override
    returns (bool)
  {
    return accessList[_user] || !checkEnabled;
  }

  /**
   * @notice Adds an address to the access list
   * @param _user The address to add
   */
  function addAccess(address _user)
    external
    onlyOwner()
  {
    if (!accessList[_user]) {
      accessList[_user] = true;

      emit AddedAccess(_user);
    }
  }

  /**
   * @notice Removes an address from the access list
   * @param _user The address to remove
   */
  function removeAccess(address _user)
    external
    onlyOwner()
  {
    if (accessList[_user]) {
      accessList[_user] = false;

      emit RemovedAccess(_user);
    }
  }

  /**
   * @notice makes the access check enforced
   */
  function enableAccessCheck()
    external
    onlyOwner()
  {
    if (!checkEnabled) {
      checkEnabled = true;

      emit CheckAccessEnabled();
    }
  }

  /**
   * @notice makes the access check unenforced
   */
  function disableAccessCheck()
    external
    onlyOwner()
  {
    if (checkEnabled) {
      checkEnabled = false;

      emit CheckAccessDisabled();
    }
  }

  /**
   * @dev reverts if the caller does not have access
   */
  modifier checkAccess() {
    require(hasAccess(msg.sender, msg.data), "No access");
    _;
  }
}

/**
 * @title SimpleReadAccessController
 * @notice Gives access to:
 * - any externally owned account (note that offchain actors can always read
 * any contract storage regardless of onchain access control measures, so this
 * does not weaken the access control while improving usability)
 * - accounts explicitly added to an access list
 * @dev SimpleReadAccessController is not suitable for access controlling writes
 * since it grants any externally owned account access! See
 * SimpleWriteAccessController for that.
 */
contract SimpleReadAccessController is SimpleWriteAccessController {

  /**
   * @notice Returns the access of an address
   * @param _user The address to query
   */
  function hasAccess(
    address _user,
    bytes memory _calldata
  )
    public
    view
    virtual
    override
    returns (bool)
  {
    return super.hasAccess(_user, _calldata) || _user == tx.origin;
  }

}

/**
 * @title AccessControlled FluxAggregator contract
 * @notice This contract requires addresses to be added to a controller
 * in order to read the answers stored in the FluxAggregator contract
 */
contract AccessControlledAggregator is FluxAggregator, SimpleReadAccessController {

  /**
   * @notice set up the aggregator with initial configuration
   * @param _link The address of the LINK token
   * @param _paymentAmount The amount paid of LINK paid to each oracle per submission, in wei (units of 10⁻¹⁸ LINK)
   * @param _timeout is the number of seconds after the previous round that are
   * allowed to lapse before allowing an oracle to skip an unfinished round
   * @param _validator is an optional contract address for validating
   * external validation of answers
   * @param _minSubmissionValue is an immutable check for a lower bound of what
   * submission values are accepted from an oracle
   * @param _maxSubmissionValue is an immutable check for an upper bound of what
   * submission values are accepted from an oracle
   * @param _decimals represents the number of decimals to offset the answer by
   * @param _description a short description of what is being reported
   */
  constructor(
    address _link,
    uint128 _paymentAmount,
    uint32 _timeout,
    address _validator,
    int256 _minSubmissionValue,
    int256 _maxSubmissionValue,
    uint8 _decimals,
    string memory _description
  ) public FluxAggregator(
    _link,
    _paymentAmount,
    _timeout,
    _validator,
    _minSubmissionValue,
    _maxSubmissionValue,
    _decimals,
    _description
  ){}

  /**
   * @notice get data about a round. Consumers are encouraged to check
   * that they're receiving fresh data by inspecting the updatedAt and
   * answeredInRound return values.
   * @param _roundId the round ID to retrieve the round data for
   * @return roundId is the round ID for which data was retrieved
   * @return answer is the answer for the given round
   * @return startedAt is the timestamp when the round was started. This is 0
   * if the round hasn't been started yet.
   * @return updatedAt is the timestamp when the round last was updated (i.e.
   * answer was last computed)
   * @return answeredInRound is the round ID of the round in which the answer
   * was computed. answeredInRound may be smaller than roundId when the round
   * timed out. answerInRound is equal to roundId when the round didn't time out
   * and was completed regularly.
   * @dev overridden funcion to add the checkAccess() modifier
   * @dev Note that for in-progress rounds (i.e. rounds that haven't yet
   * received maxSubmissions) answer and updatedAt may change between queries.
   */
  function getRoundData(uint80 _roundId)
    public
    view
    override
    checkAccess()
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    )
  {
    return super.getRoundData(_roundId);
  }

  /**
   * @notice get data about the latest round. Consumers are encouraged to check
   * that they're receiving fresh data by inspecting the updatedAt and
   * answeredInRound return values. Consumers are encouraged to
   * use this more fully featured method over the "legacy" latestAnswer
   * functions. Consumers are encouraged to check that they're receiving fresh
   * data by inspecting the updatedAt and answeredInRound return values.
   * @return roundId is the round ID for which data was retrieved
   * @return answer is the answer for the given round
   * @return startedAt is the timestamp when the round was started. This is 0
   * if the round hasn't been started yet.
   * @return updatedAt is the timestamp when the round last was updated (i.e.
   * answer was last computed)
   * @return answeredInRound is the round ID of the round in which the answer
   * was computed. answeredInRound may be smaller than roundId when the round
   * timed out. answerInRound is equal to roundId when the round didn't time out
   * and was completed regularly.
   * @dev overridden funcion to add the checkAccess() modifier
   * @dev Note that for in-progress rounds (i.e. rounds that haven't yet
   * received maxSubmissions) answer and updatedAt may change between queries.
   */
  function latestRoundData()
    public
    view
    override
    checkAccess()
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    )
  {
    return super.latestRoundData();
  }

  /**
   * @notice get the most recently reported answer
   * @dev overridden funcion to add the checkAccess() modifier
   *
   * @dev #[deprecated] Use latestRoundData instead. This does not error if no
   * answer has been reached, it will simply return 0. Either wait to point to
   * an already answered Aggregator or use the recommended latestRoundData
   * instead which includes better verification information.
   */
  function latestAnswer()
    public
    view
    override
    checkAccess()
    returns (int256)
  {
    return super.latestAnswer();
  }

  /**
   * @notice get the most recently reported round ID
   * @dev overridden funcion to add the checkAccess() modifier
   *
   * @dev #[deprecated] Use latestRoundData instead. This does not error if no
   * answer has been reached, it will simply return 0. Either wait to point to
   * an already answered Aggregator or use the recommended latestRoundData
   * instead which includes better verification information.
   */
  function latestRound()
    public
    view
    override
    checkAccess()
    returns (uint256)
  {
    return super.latestRound();
  }

  /**
   * @notice get the most recent updated at timestamp
   * @dev overridden funcion to add the checkAccess() modifier
   *
   * @dev #[deprecated] Use latestRoundData instead. This does not error if no
   * answer has been reached, it will simply return 0. Either wait to point to
   * an already answered Aggregator or use the recommended latestRoundData
   * instead which includes better verification information.
   */
  function latestTimestamp()
    public
    view
    override
    checkAccess()
    returns (uint256)
  {
    return super.latestTimestamp();
  }

  /**
   * @notice get past rounds answers
   * @dev overridden funcion to add the checkAccess() modifier
   * @param _roundId the round number to retrieve the answer for
   *
   * @dev #[deprecated] Use getRoundData instead. This does not error if no
   * answer has been reached, it will simply return 0. Either wait to point to
   * an already answered Aggregator or use the recommended getRoundData
   * instead which includes better verification information.
   */
  function getAnswer(uint256 _roundId)
    public
    view
    override
    checkAccess()
    returns (int256)
  {
    return super.getAnswer(_roundId);
  }

  /**
   * @notice get timestamp when an answer was last updated
   * @dev overridden funcion to add the checkAccess() modifier
   * @param _roundId the round number to retrieve the updated timestamp for
   *
   * @dev #[deprecated] Use getRoundData instead. This does not error if no
   * answer has been reached, it will simply return 0. Either wait to point to
   * an already answered Aggregator or use the recommended getRoundData
   * instead which includes better verification information.
   */
  function getTimestamp(uint256 _roundId)
    public
    view
    override
    checkAccess()
    returns (uint256)
  {
    return super.getTimestamp(_roundId);
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_link","type":"address"},{"internalType":"uint128","name":"_paymentAmount","type":"uint128"},{"internalType":"uint32","name":"_timeout","type":"uint32"},{"internalType":"address","name":"_validator","type":"address"},{"internalType":"int256","name":"_minSubmissionValue","type":"int256"},{"internalType":"int256","name":"_maxSubmissionValue","type":"int256"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"string","name":"_description","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"AddedAccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int256","name":"current","type":"int256"},{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"updatedAt","type":"uint256"}],"name":"AnswerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AvailableFundsUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"CheckAccessDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"CheckAccessEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":true,"internalType":"address","name":"startedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"startedAt","type":"uint256"}],"name":"NewRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oracle","type":"address"},{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"OracleAdminUpdateRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oracle","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"OracleAdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oracle","type":"address"},{"indexed":true,"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"OraclePermissionsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"RemovedAccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requester","type":"address"},{"indexed":false,"internalType":"bool","name":"authorized","type":"bool"},{"indexed":false,"internalType":"uint32","name":"delay","type":"uint32"}],"name":"RequesterPermissionsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint128","name":"paymentAmount","type":"uint128"},{"indexed":true,"internalType":"uint32","name":"minSubmissionCount","type":"uint32"},{"indexed":true,"internalType":"uint32","name":"maxSubmissionCount","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"restartDelay","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"timeout","type":"uint32"}],"name":"RoundDetailsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int256","name":"submission","type":"int256"},{"indexed":true,"internalType":"uint32","name":"round","type":"uint32"},{"indexed":true,"internalType":"address","name":"oracle","type":"address"}],"name":"SubmissionReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previous","type":"address"},{"indexed":true,"internalType":"address","name":"current","type":"address"}],"name":"ValidatorUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"acceptAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"addAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allocatedFunds","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableFunds","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_removed","type":"address[]"},{"internalType":"address[]","name":"_added","type":"address[]"},{"internalType":"address[]","name":"_addedAdmins","type":"address[]"},{"internalType":"uint32","name":"_minSubmissions","type":"uint32"},{"internalType":"uint32","name":"_maxSubmissions","type":"uint32"},{"internalType":"uint32","name":"_restartDelay","type":"uint32"}],"name":"changeOracles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableAccessCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAccessCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOracles","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"hasAccess","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"linkToken","outputs":[{"internalType":"contract LinkTokenInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSubmissionCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSubmissionValue","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSubmissionCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSubmissionValue","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onTokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"oracleCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"uint32","name":"_queriedRoundId","type":"uint32"}],"name":"oracleRoundState","outputs":[{"internalType":"bool","name":"_eligibleToSubmit","type":"bool"},{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"int256","name":"_latestSubmission","type":"int256"},{"internalType":"uint64","name":"_startedAt","type":"uint64"},{"internalType":"uint64","name":"_timeout","type":"uint64"},{"internalType":"uint128","name":"_availableFunds","type":"uint128"},{"internalType":"uint8","name":"_oracleCount","type":"uint8"},{"internalType":"uint128","name":"_paymentAmount","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestNewRound","outputs":[{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restartDelay","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_requester","type":"address"},{"internalType":"bool","name":"_authorized","type":"bool"},{"internalType":"uint32","name":"_delay","type":"uint32"}],"name":"setRequesterPermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newValidator","type":"address"}],"name":"setValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"},{"internalType":"int256","name":"_submission","type":"int256"}],"name":"submit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeout","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateAvailableFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_paymentAmount","type":"uint128"},{"internalType":"uint32","name":"_minSubmissions","type":"uint32"},{"internalType":"uint32","name":"_maxSubmissions","type":"uint32"},{"internalType":"uint32","name":"_restartDelay","type":"uint32"},{"internalType":"uint32","name":"_timeout","type":"uint32"}],"name":"updateFutureRounds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"validator","outputs":[{"internalType":"contract AggregatorValidatorInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawPayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"withdrawablePayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b50604051620068b8380380620068b883398181016040526101008110156200003857600080fd5b815160208301516040808501516060860151608087015160a088015160c089015160e08a0180519651989a9799959894979396929591949391820192846401000000008211156200008857600080fd5b9083019060208201858111156200009e57600080fd5b8251640100000000811182820188101715620000b957600080fd5b82525081516020918201929091019080838360005b83811015620000e8578181015183820152602001620000ce565b50505050905090810190601f168015620001165780820380516001836020036101000a031916815260200191505b50604052505060008054336001600160a01b0319918216178255600280549091166001600160a01b038c1617905589915088908890889088908890889088906200016590889080808a62000244565b62000179856001600160e01b036200062216565b608084905260a08390526005805460ff191660ff84161790558051620001a790600690602084019062000806565b50620001c88663ffffffff1642620006ec60201b620045e91790919060201c565b6000805260096020527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c80546001600160401b03929092166801000000000000000002600160401b600160801b03199092169190911790555050600e805460ff1916600117905550620008a89c50505050505050505050505050565b6000546001600160a01b03163314620002a4576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b6000620002b96001600160e01b036200074f16565b60ff1690508463ffffffff168463ffffffff16101562000320576040805162461bcd60e51b815260206004820152601960248201527f6d6178206d75737420657175616c2f657863656564206d696e00000000000000604482015290519081900360640190fd5b8363ffffffff168163ffffffff16101562000382576040805162461bcd60e51b815260206004820152601760248201527f6d61782063616e6e6f742065786365656420746f74616c000000000000000000604482015290519081900360640190fd5b63ffffffff81161580620003a157508263ffffffff168163ffffffff16115b620003f3576040805162461bcd60e51b815260206004820152601960248201527f64656c61792063616e6e6f742065786365656420746f74616c00000000000000604482015290519081900360640190fd5b620004106001600160801b0387166001600160e01b036200075616565b600d546001600160801b0316101562000470576040805162461bcd60e51b815260206004820152601e60248201527f696e73756666696369656e742066756e647320666f72207061796d656e740000604482015290519081900360640190fd5b6000620004856001600160e01b036200074f16565b60ff161115620004eb5760008563ffffffff1611620004eb576040805162461bcd60e51b815260206004820152601a60248201527f6d696e206d7573742062652067726561746572207468616e2030000000000000604482015290519081900360640190fd5b85600460006101000a8154816001600160801b0302191690836001600160801b0316021790555084600460146101000a81548163ffffffff021916908363ffffffff16021790555083600460106101000a81548163ffffffff021916908363ffffffff16021790555082600460186101000a81548163ffffffff021916908363ffffffff160217905550816004601c6101000a81548163ffffffff021916908363ffffffff1602179055508363ffffffff168563ffffffff16600460009054906101000a90046001600160801b03166001600160801b03167f56800c9d1ed723511246614d15e58cfcde15b6a33c245b5c961b689c1890fd8f8686604051808363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff1681526020019250505060405180910390a4505050505050565b6000546001600160a01b0316331462000682576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b6003546001600160a01b039081169082168114620006e857600380546001600160a01b0319166001600160a01b0384811691821790925560405190918316907fcfac5dc75b8d9a7e074162f59d9adcd33da59f0fe8dfb21580db298fc0fdad0d90600090a35b5050565b60008282111562000744576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b600c545b90565b60006200074960026200078d620007756001600160e01b036200074f16565b60ff1685620007a160201b620052fd1790919060201c565b620007a160201b620052fd1790919060201c565b600082620007b25750600062000749565b82820282848281620007c057fe5b0414620007ff5760405162461bcd60e51b8152600401808060200182810382526021815260200180620068976021913960400191505060405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200084957805160ff191683800117855562000879565b8280016001018555821562000879579182015b82811115620008795782518255916020019190600101906200085c565b50620008879291506200088b565b5090565b6200075391905b8082111562000887576000815560010162000892565b60805160a051615fc1620008d660003980610ec55280611238525080610e3652806123e15250615fc16000f3fe608060405234801561001057600080fd5b50600436106103155760003560e01c806370dea79a116101a7578063a4c0ed36116100ee578063d4cc54e411610097578063e9ee6eeb11610071578063e9ee6eeb14610baa578063f2fde38b14610be5578063feaf968c14610c1857610315565b8063d4cc54e414610b67578063dc7f012414610b6f578063e2e4031714610b7757610315565b8063c1075329116100c8578063c107532914610b1e578063c35905c614610b57578063c937450014610b5f57610315565b8063a4c0ed3614610a52578063b5ab58dc14610ae4578063b633620c14610b0157610315565b80638823da6c1161015057806398e5b12a1161012a57806398e5b12a146109905780639a6fc8f5146109b7578063a118f24914610a1f57610315565b80638823da6c146108ac57806388aa80e7146108df5780638da5cb5b1461098857610315565b80637c2b0b21116101815780637c2b0b21146108945780638038e4a11461089c5780638205bf6a146108a457610315565b806370dea79a146108075780637284e4161461080f57806379ba50971461088c57610315565b806340884c521161026b57806358609e441161021457806364efb22b116101ee57806364efb22b146106f5578063668a0f02146107285780636b14daf81461073057610315565b806358609e44146106b2578063613d8fcc146106ba578063628806ef146106c257610315565b806350d25bcd1161024557806350d25bcd1461069a57806354fd4d50146106a257806357970e93146106aa57610315565b806340884c521461060d57806346fcff4c146106655780634f8fc3b51461069257610315565b8063313ce567116102cd5780633969c20f116102a75780633969c20f1461046d5780633a5381b5146105995780633d3d7714146105ca57610315565b8063313ce567146103db578063357ebb02146103f957806338aa4c721461041a57610315565b8063202ee0ed116102fe578063202ee0ed1461035757806320ed02751461037a57806323ca2903146103c157610315565b80630a7569831461031a5780631327d3d814610324575b600080fd5b610322610c20565b005b6103226004803603602081101561033a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610d05565b6103226004803603604081101561036d57600080fd5b5080359060200135610e26565b6103226004803603606081101561039057600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff169060208101351515906040013563ffffffff16611046565b6103c9611236565b60408051918252519081900360200190f35b6103e361125a565b6040805160ff9092168252519081900360200190f35b610401611263565b6040805163ffffffff9092168252519081900360200190f35b610322600480360360a081101561043057600080fd5b506fffffffffffffffffffffffffffffffff8135169063ffffffff602082013581169160408101358216916060820135811691608001351661128b565b610322600480360360c081101561048357600080fd5b81019060208101813564010000000081111561049e57600080fd5b8201836020820111156104b057600080fd5b803590602001918460208302840111640100000000831117156104d257600080fd5b9193909290916020810190356401000000008111156104f057600080fd5b82018360208201111561050257600080fd5b8035906020019184602083028401116401000000008311171561052457600080fd5b91939092909160208101903564010000000081111561054257600080fd5b82018360208201111561055457600080fd5b8035906020019184602083028401116401000000008311171561057657600080fd5b919350915063ffffffff813581169160208101358216916040909101351661171f565b6105a16119a7565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610322600480360360608110156105e057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356119c3565b610615611c94565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610651578181015183820152602001610639565b505050509050019250505060405180910390f35b61066d611d04565b604080516fffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610322611d1c565b6103c9611e99565b6103c9611f54565b6105a1611f59565b610401611f75565b6103e3611f95565b610322600480360360208110156106d857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611f9b565b6105a16004803603602081101561070b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166120e3565b6103c961211a565b6107f36004803603604081101561074657600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561077e57600080fd5b82018360208201111561079057600080fd5b803590602001918460018302840111640100000000831117156107b257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506121d0945050505050565b604080519115158252519081900360200190f35b610401612205565b610817612231565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610851578181015183820152602001610839565b50505050905090810190601f16801561087e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103226122dd565b6103c96123df565b610322612403565b6103c96124e9565b610322600480360360208110156108c257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661259f565b61091e600480360360408110156108f557600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013563ffffffff166126d7565b60408051981515895263ffffffff90971660208901528787019590955267ffffffffffffffff93841660608801529190921660808601526fffffffffffffffffffffffffffffffff91821660a086015260ff1660c08501521660e083015251908190036101000190f35b6105a1612890565b6109986128ac565b6040805169ffffffffffffffffffff9092168252519081900360200190f35b6109e0600480360360208110156109cd57600080fd5b503569ffffffffffffffffffff16612a05565b6040805169ffffffffffffffffffff96871681526020810195909552848101939093526060840191909152909216608082015290519081900360a00190f35b61032260048036036020811015610a3557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612ad4565b61032260048036036060811015610a6857600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691602081013591810190606081016040820135640100000000811115610aa557600080fd5b820183602082011115610ab757600080fd5b80359060200191846001830284011164010000000083111715610ad957600080fd5b509092509050612c0d565b6103c960048036036020811015610afa57600080fd5b5035612c88565b6103c960048036036020811015610b1757600080fd5b5035612d3f565b61032260048036036040811015610b3457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612df6565b61066d61303c565b610401613054565b61066d613078565b6107f36130a4565b6103c960048036036020811015610b8d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166130ad565b61032260048036036040811015610bc057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166130e7565b61032260048036036020811015610bfb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661321d565b6109e0613319565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ca657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600e5460ff1615610d0357600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963890600090a15b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d8b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff9081169082168114610e2257600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84811691821790925560405190918316907fcfac5dc75b8d9a7e074162f59d9adcd33da59f0fe8dfb21580db298fc0fdad0d90600090a35b5050565b6060610e3233846133e6565b90507f0000000000000000000000000000000000000000000000000000000000000000821215610ec357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f76616c75652062656c6f77206d696e5375626d697373696f6e56616c75650000604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000000000821315610f5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f76616c75652061626f7665206d61785375626d697373696f6e56616c75650000604482015290519081900360640190fd5b8051819015610ff9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610fbe578181015183820152602001610fa6565b50505050905090810190601f168015610feb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50611003836136f4565b61100d82846137e5565b60008061101985613905565b9150915061102685613ab5565b61102f85613c78565b811561103f5761103f8582613cef565b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110cc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600b602052604090205460ff161515821515141561110557611231565b811561118d5773ffffffffffffffffffffffffffffffffffffffff83166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016831515177fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff1661010063ffffffff8416021790556111d9565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001690555b60408051831515815263ffffffff83166020820152815173ffffffffffffffffffffffffffffffffffffffff8616927fc3df5a754e002718f2e10804b99e6605e7c701d95cec9552c7680ca2b6f2820a928290030190a25b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60055460ff1681565b6004547801000000000000000000000000000000000000000000000000900463ffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16331461131157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600061131b611f95565b60ff1690508463ffffffff168463ffffffff16101561139b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6d6178206d75737420657175616c2f657863656564206d696e00000000000000604482015290519081900360640190fd5b8363ffffffff168163ffffffff16101561141657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6d61782063616e6e6f742065786365656420746f74616c000000000000000000604482015290519081900360640190fd5b63ffffffff8116158061143457508263ffffffff168163ffffffff16115b61149f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f64656c61792063616e6e6f742065786365656420746f74616c00000000000000604482015290519081900360640190fd5b6114ba866fffffffffffffffffffffffffffffffff16613e28565b600d546fffffffffffffffffffffffffffffffff16101561153c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e73756666696369656e742066756e647320666f72207061796d656e740000604482015290519081900360640190fd5b6000611546611f95565b60ff1611156115c45760008563ffffffff16116115c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d696e206d7573742062652067726561746572207468616e2030000000000000604482015290519081900360640190fd5b85600460006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555084600460146101000a81548163ffffffff021916908363ffffffff16021790555083600460106101000a81548163ffffffff021916908363ffffffff16021790555082600460186101000a81548163ffffffff021916908363ffffffff160217905550816004601c6101000a81548163ffffffff021916908363ffffffff1602179055508363ffffffff168563ffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff167f56800c9d1ed723511246614d15e58cfcde15b6a33c245b5c961b689c1890fd8f8686604051808363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff1681526020019250505060405180910390a4505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117a557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60005b888110156117e9576117e18a8a838181106117bf57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613e56565b6001016117a8565b5085841461185857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6e6565642073616d65206f7261636c6520616e642061646d696e20636f756e74604482015290519081900360640190fd5b604d61187587611866611f95565b60ff169063ffffffff61410616565b11156118e257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6d6178206f7261636c657320616c6c6f77656400000000000000000000000000604482015290519081900360640190fd5b60005b8681101561194f576119478888838181106118fc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1687878481811061192557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1661417a565b6001016118e5565b5060045461199c906fffffffffffffffffffffffffffffffff8116908590859085907c0100000000000000000000000000000000000000000000000000000000900463ffffffff1661128b565b505050505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260086020526040902060020154620100009004163314611a6157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f6e6c792063616c6c61626c652062792061646d696e00000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604090205481906fffffffffffffffffffffffffffffffff908116908216811015611b0e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e73756666696369656e7420776974686472617761626c652066756e647300604482015290519081900360640190fd5b611b306fffffffffffffffffffffffffffffffff82168363ffffffff61454e16565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260086020526040902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff928316179055600d54611bb391700100000000000000000000000000000000909104168361454e565b600d80546fffffffffffffffffffffffffffffffff92831670010000000000000000000000000000000002908316179055600254604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015293861660248201529051929091169163a9059cbb916044808201926020929091908290030181600087803b158015611c6257600080fd5b505af1158015611c76573d6000803e3d6000fd5b505050506040513d6020811015611c8c57600080fd5b505161103f57fe5b6060600c805480602002602001604051908101604052809291908181526020018280548015611cf957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611cce575b505050505090505b90565b600d546fffffffffffffffffffffffffffffffff1690565b611d24615e5a565b50604080518082018252600d546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416602080830182905260025484517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015294519394600094611e11949373ffffffffffffffffffffffffffffffffffffffff909316926370a082319260248082019391829003018186803b158015611dd957600080fd5b505afa158015611ded573d6000803e3d6000fd5b505050506040513d6020811015611e0357600080fd5b50519063ffffffff6145e916565b82519091506fffffffffffffffffffffffffffffffff168114610e2257600d80547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff831617905560405181907ffe25c73e3b9089fac37d55c4c7efcba6f04af04cebd2fc4d6d7dbb07e1e5234f90600090a25050565b6000611edc336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121d092505050565b611f4757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611f4f61465a565b905090565b600381565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b600454700100000000000000000000000000000000900463ffffffff1681565b600c5490565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526008602052604090206003015416331461203357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f6f6e6c792063616c6c61626c652062792070656e64696e672061646d696e0000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166000818152600860205260408082206003810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905560020180547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16336201000081029190911790915590519092917f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90491a350565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260086020526040902060020154620100009004165b919050565b600061215d336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121d092505050565b6121c857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611f4f61467d565b60006121dc8383614691565b806121fc575073ffffffffffffffffffffffffffffffffffffffff831632145b90505b92915050565b6004547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1681565b6006805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156122d55780601f106122aa576101008083540402835291602001916122d5565b820191906000526020600020905b8154815290600101906020018083116122b857829003601f168201915b505050505081565b60015473ffffffffffffffffffffffffffffffffffffffff16331461236357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005473ffffffffffffffffffffffffffffffffffffffff16331461248957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600e5460ff16610d0357600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348090600090a1565b600061252c336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121d092505050565b61259757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611f4f6146ce565b60005473ffffffffffffffffffffffffffffffffffffffff16331461262557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600f602052604090205460ff16156126d45773ffffffffffffffffffffffffffffffffffffffff81166000818152600f602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055815192835290517f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d19281900390910190a15b50565b60008080808080808033321461274e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f66662d636861696e2072656164696e67206f6e6c7900000000000000000000604482015290519081900360640190fd5b63ffffffff8916156128695763ffffffff89166000908152600960209081526040808320600a9092529091206127848c8c61470a565b73ffffffffffffffffffffffffffffffffffffffff8d1660009081526008602052604090206001908101548482015491840154600d548f9367ffffffffffffffff169168010000000000000000900463ffffffff16906fffffffffffffffffffffffffffffffff166127f4611f95565b600189015467ffffffffffffffff16612821576004546fffffffffffffffffffffffffffffffff16612849565b60018801546c0100000000000000000000000090046fffffffffffffffffffffffffffffffff165b8363ffffffff169350995099509950995099509950995099505050612883565b6128728a614760565b975097509750975097509750975097505b9295985092959890939650565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b336000908152600b602052604081205460ff1661292a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6e6f7420617574686f72697a6564207265717565737465720000000000000000604482015290519081900360640190fd5b60075463ffffffff1660008181526009602052604090206001015468010000000000000000900467ffffffffffffffff1615158061296c575061296c81614977565b6129d757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f7072657620726f756e64206d75737420626520737570657273656461626c6500604482015290519081900360640190fd5b60006129ee63ffffffff80841690600190614a0a16565b90506129f981614a87565b63ffffffff1691505090565b6000806000806000612a4e336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121d092505050565b612ab957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b612ac286614b8f565b939a9299509097509550909350915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612b5a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600f602052604090205460ff166126d45773ffffffffffffffffffffffffffffffffffffffff81166000818152600f602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815192835290517f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49281900390910190a150565b8015612c7a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f7472616e7366657220646f65736e2774206163636570742063616c6c64617461604482015290519081900360640190fd5b612c82611d1c565b50505050565b6000612ccb336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121d092505050565b612d3657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6121ff82614d05565b6000612d82336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121d092505050565b612ded57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6121ff82614d39565b60005473ffffffffffffffffffffffffffffffffffffffff163314612e7c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600d546004546fffffffffffffffffffffffffffffffff918216918391612eb491612ea79116613e28565b839063ffffffff6145e916565b1015612f2157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f696e73756666696369656e7420726573657276652066756e6473000000000000604482015290519081900360640190fd5b600254604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015612f9d57600080fd5b505af1158015612fb1573d6000803e3d6000fd5b505050506040513d6020811015612fc757600080fd5b505161303457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6b656e207472616e73666572206661696c65640000000000000000000000604482015290519081900360640190fd5b611231611d1c565b6004546fffffffffffffffffffffffffffffffff1681565b60045474010000000000000000000000000000000000000000900463ffffffff1681565b600d5470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690565b600e5460ff1681565b73ffffffffffffffffffffffffffffffffffffffff166000908152600860205260409020546fffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526008602052604090206002015462010000900416331461318557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f6e6c792063616c6c61626c652062792061646d696e00000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82811660008181526008602090815260409182902060030180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055815133815290810193909352805191927fb79bf2e89c2d70dde91d2991fb1ea69b7e478061ad7c04ed5b02b96bc52b8104929081900390910190a25050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146132a357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000806000806000613362336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121d092505050565b6133cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6133d5614d7e565b945094509450945094509091929394565b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205460075460609163ffffffff7001000000000000000000000000000000009091048116911681613474576040518060400160405280601281526020017f6e6f7420656e61626c6564206f7261636c650000000000000000000000000000815250925050506121ff565b8363ffffffff168263ffffffff1611156134c7576040518060400160405280601681526020017f6e6f742079657420656e61626c6564206f7261636c6500000000000000000000815250925050506121ff565b73ffffffffffffffffffffffffffffffffffffffff851660009081526008602052604090205463ffffffff80861674010000000000000000000000000000000000000000909204161015613554576040518060400160405280601881526020017f6e6f206c6f6e67657220616c6c6f776564206f7261636c650000000000000000815250925050506121ff565b73ffffffffffffffffffffffffffffffffffffffff851660009081526008602052604090205463ffffffff808616780100000000000000000000000000000000000000000000000090920416106135e4576040518060400160405280602081526020017f63616e6e6f74207265706f7274206f6e2070726576696f757320726f756e6473815250925050506121ff565b8063ffffffff168463ffffffff1614158015613620575061361063ffffffff80831690600190614a0a16565b63ffffffff168463ffffffff1614155b801561363357506136318482614da7565b155b15613677576040518060400160405280601781526020017f696e76616c696420726f756e6420746f207265706f7274000000000000000000815250925050506121ff565b8363ffffffff166001141580156136a857506136a66136a163ffffffff80871690600190614e0d16565b614e8a565b155b156136ec576040518060400160405280601f81526020017f70726576696f757320726f756e64206e6f7420737570657273656461626c6500815250925050506121ff565b505092915050565b6136fd81614eca565b613706576126d4565b3360009081526008602052604090205460045463ffffffff7c01000000000000000000000000000000000000000000000000000000009092048216917801000000000000000000000000000000000000000000000000909104811682019083161180159061377357508015155b1561377e57506126d4565b61378782614efb565b50336000908152600860205260409020805463ffffffff83167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911617905550565b6137ee8161518a565b61385957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f726f756e64206e6f7420616363657074696e67207375626d697373696f6e7300604482015290519081900360640190fd5b63ffffffff81166000818152600a602090815260408083208054600180820183559185528385200187905533808552600890935281842080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff1678010000000000000000000000000000000000000000000000008702178155018690555190929185917f92e98423f8adac6e64d0608e519fd1cefb861498385c6dee70d58fc926ddc68c9190a45050565b63ffffffff8082166000908152600a60205260408120600181015490549192839264010000000090920416111561394157506000905080613ab0565b63ffffffff83166000908152600a6020908152604080832080548251818502810185019093528083526139a79383018282801561399d57602002820191906000526020600020905b815481526020019060010190808311613989575b50505050506151aa565b63ffffffff851660008181526009602090815260409182902084815560010180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff811691909102919091177fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000860217909155600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff16640100000000860217905582519081529151939450919284927f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f928290030190a36001925090505b915091565b63ffffffff81166000908152600a60205260409020600101546c0100000000000000000000000090046fffffffffffffffffffffffffffffffff16613af8615e5a565b5060408051808201909152600d546fffffffffffffffffffffffffffffffff808216808452700100000000000000000000000000000000909204166020830152613b48908363ffffffff61454e16565b6fffffffffffffffffffffffffffffffff90811682526020820151613b7491168363ffffffff61527416565b6fffffffffffffffffffffffffffffffff90811660208084018290528351600d80547001000000000000000000000000000000009094029185167fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169390931784161790915533600090815260089091526040902054613bfd91168363ffffffff61527416565b3360009081526008602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff948516179055835190519216917ffe25c73e3b9089fac37d55c4c7efcba6f04af04cebd2fc4d6d7dbb07e1e5234f9190a2505050565b63ffffffff8082166000908152600a602052604090206001810154905491161115613ca2576126d4565b63ffffffff81166000908152600a6020526040812090613cc28282615e71565b5060010180547fffffffff0000000000000000000000000000000000000000000000000000000016905550565b60035473ffffffffffffffffffffffffffffffffffffffff1680613d135750610e22565b6000613d2a63ffffffff80861690600190614e0d16565b63ffffffff80821660009081526009602090815260408083206001810154905482517fbeed9b5100000000000000000000000000000000000000000000000000000000815270010000000000000000000000000000000090920486166004830181905260248301829052958b166044830152606482018a905291519596509394909373ffffffffffffffffffffffffffffffffffffffff88169363beed9b5193620186a093608480850194929391928390030190829088803b158015613def57600080fd5b5087f193505050508015613e1557506040513d6020811015613e1057600080fd5b505160015b613e1e57613e20565b505b505050505050565b60006121ff6002613e4a613e3a611f95565b859060ff1663ffffffff6152fd16565b9063ffffffff6152fd16565b613e5f81615370565b613eca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6f7261636c65206e6f7420656e61626c65640000000000000000000000000000604482015290519081900360640190fd5b600754613ee39063ffffffff90811690600190614a0a16565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600860205260408120805463ffffffff9390931674010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff90931692909217909155600c613f736001613f64611f95565b60ff169063ffffffff6145e916565b81548110613f7d57fe5b60009182526020808320919091015473ffffffffffffffffffffffffffffffffffffffff85811680855260089093526040808520600290810180549390941680875291862001805461ffff9093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009384168117909155939094528154169055600c805492935090918391908390811061401357fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c80548061406657fe5b60008281526020812082017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590910190915560405173ffffffffffffffffffffffffffffffffffffffff8516907f18dd09695e4fbdae8d1a5edb11221eb04564269c29a089b9753a6535c54ba92e908390a3505050565b6000828201838110156121fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61418382615370565b156141ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f7261636c6520616c726561647920656e61626c656400000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661427157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f63616e6e6f74207365742061646d696e20746f20300000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600860205260409020600201546201000090041615806142e0575073ffffffffffffffffffffffffffffffffffffffff8281166000908152600860205260409020600201546201000090048116908216145b61434b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6f776e65722063616e6e6f74206f76657277726974652061646d696e00000000604482015290519081900360640190fd5b614354826153b9565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526008602052604080822080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff63ffffffff97909716700100000000000000000000000000000000027fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff909116179590951677ffffffff0000000000000000000000000000000000000000178555600c80546002909601805461ffff9097167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909716969096178655805460018181019092557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180547fffffffffffffffffffffffff00000000000000000000000000000000000000001685179055838352855494871662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909516949094179094559251919290917f18dd09695e4fbdae8d1a5edb11221eb04564269c29a089b9753a6535c54ba92e9190a38073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90460405160405180910390a35050565b6000826fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1611156145e357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000828211156145e357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b600754640100000000900463ffffffff1660009081526009602052604090205490565b600754640100000000900463ffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600f602052604081205460ff16806121fc575050600e5460ff161592915050565b600754640100000000900463ffffffff1660009081526009602052604090206001015468010000000000000000900467ffffffffffffffff1690565b63ffffffff811660009081526009602052604081206001015467ffffffffffffffff16156147565761473b8261518a565b801561474f575061474c83836133e6565b51155b90506121ff565b61473b8383615441565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600860205260408120600754815483928392839283928392839283927fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b929091849163ffffffff90811678010000000000000000000000000000000000000000000000009092041614806147ff57506007546147fd9063ffffffff1661518a565b155b6007549091506148149063ffffffff16614e8a565b801561481d5750805b1561487f5760075461483b9063ffffffff90811690600190614a0a16565b63ffffffff81166000908152600960205260409020600454919b506fffffffffffffffffffffffffffffffff909116945092506148788c8b615441565b9a506148db565b60075463ffffffff166000818152600960209081526040808320600a90925290912060010154919b506c010000000000000000000000009091046fffffffffffffffffffffffffffffffff16945092506148d88a61518a565b9a505b6148e58c8b6133e6565b51156148f05760009a505b6001808301548482015463ffffffff808e166000908152600a6020526040902090930154600d548f948f949367ffffffffffffffff169268010000000000000000900416906fffffffffffffffffffffffffffffffff1661494f611f95565b8a8363ffffffff1693509a509a509a509a509a509a509a509a50505050919395975091939597565b63ffffffff8082166000908152600960209081526040808320600190810154600a9093529083200154919267ffffffffffffffff909116916801000000000000000090041681158015906149d1575060008163ffffffff16115b8015614a025750426149f667ffffffffffffffff841663ffffffff808516906154c616565b67ffffffffffffffff16105b949350505050565b600082820163ffffffff80851690821610156121fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b614a9081614eca565b614a99576126d4565b336000908152600b602052604090205463ffffffff6501000000000082048116916101009004811682019083161180614ad0575080155b614b3b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6d7573742064656c617920726571756573747300000000000000000000000000604482015290519081900360640190fd5b614b4482614efb565b50336000908152600b60205260409020805463ffffffff831665010000000000027fffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff90911617905550565b6000806000806000614b9f615e8f565b5063ffffffff80871660009081526009602090815260409182902082516080810184528154815260019091015467ffffffffffffffff808216938301939093526801000000000000000081049092169281019290925270010000000000000000000000000000000090049091166060820181905215801590614c315750614c318769ffffffffffffffffffff16615547565b6040518060400160405280600f81526020017f4e6f20646174612070726573656e74000000000000000000000000000000000081525090614ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315610fbe578181015183820152602001610fa6565b508051602082015160408301516060909301519899919867ffffffffffffffff91821698509216955063ffffffff9091169350915050565b6000614d1082615547565b15614d31575063ffffffff8116600090815260096020526040902054612115565b506000919050565b6000614d4482615547565b15614d31575063ffffffff811660009081526009602052604090206001015468010000000000000000900467ffffffffffffffff16612115565b60008060008060006133d5600760049054906101000a900463ffffffff1663ffffffff16612a05565b60008163ffffffff16614dca60018563ffffffff16614a0a90919063ffffffff16565b63ffffffff161480156121fc57505063ffffffff1660009081526009602052604090206001015468010000000000000000900467ffffffffffffffff1615919050565b60008263ffffffff168263ffffffff1611156145e357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b63ffffffff811660009081526009602052604081206001015468010000000000000000900467ffffffffffffffff161515806121ff57506121ff82614977565b600754600090614ee69063ffffffff90811690600190614a0a16565b63ffffffff168263ffffffff16149050919050565b614f18614f1363ffffffff80841690600190614e0d16565b615551565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff8316179055614f50615eb6565b5060408051600060a0820181815260c083018452825260045463ffffffff700100000000000000000000000000000000820481166020808601919091527401000000000000000000000000000000000000000083048216858701527c01000000000000000000000000000000000000000000000000000000008304821660608601526fffffffffffffffffffffffffffffffff909216608085015285168252600a8152929020815180519293849361500b9284920190615ee4565b506020828101516001928301805460408087015160608801516080909801517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090931663ffffffff958616177fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff1664010000000091861691909102177fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff166801000000000000000097851697909702969096177fffffffff00000000000000000000000000000000ffffffffffffffffffffffff166c010000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055851660008181526009835284902090920180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff9081169190911791829055845191168152925133937f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac6027192908290030190a35050565b63ffffffff9081166000908152600a602052604090206001015416151590565b6000815160001061521c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6c697374206d757374206e6f7420626520656d70747900000000000000000000604482015290519081900360640190fd5b8151600281046001821661525b5760008061524186600060018703600187038761566a565b90925090506152508282615748565b945050505050612115565b61526b84600060018503846157b6565b92505050612115565b60008282016fffffffffffffffffffffffffffffffff80851690821610156121fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261530c575060006121ff565b8282028284828161531957fe5b04146121fc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615f6b6021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205463ffffffff7401000000000000000000000000000000000000000090910481161490565b60075460009063ffffffff168015801590615419575073ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604090205463ffffffff8281167401000000000000000000000000000000000000000090920416145b15615425579050612115565b61543a63ffffffff80831690600190614a0a16565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604081205460045463ffffffff7c01000000000000000000000000000000000000000000000000000000009092048216917801000000000000000000000000000000000000000000000000909104811682019084161180614a025750159392505050565b600082820167ffffffffffffffff80851690821610156121fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b63ffffffff101590565b61555a81614977565b615563576126d4565b600061557a63ffffffff80841690600190614e0d16565b63ffffffff818116600090815260096020908152604080832080548886168552828520908155600191820154910180547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000092839004909616909102949094177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff160217909355600a905290812091925061563c8282615e71565b5060010180547fffffffff000000000000000000000000000000000000000000000000000000001690555050565b60008082841061567957600080fd5b8386111580156156895750848411155b61569257600080fd5b8286111580156156a25750848311155b6156ab57600080fd5b600786860310156156cc576156c38787878787615847565b9150915061573e565b60006156d9888888615cfe565b90508084116156ea57809550615738565b848110156156fd57806001019650615738565b80851115801561570c57508381105b61571257fe5b61571e888883886157b6565b925061572f888260010188876157b6565b915061573e9050565b506156ab565b9550959350505050565b600080831280156157595750600082135b8061576f575060008313801561576f5750600082125b1561578f5760026157808484615ddb565b8161578757fe5b0590506121ff565b6000600280850781850701059050614a026157b06002860560028605615ddb565b82615ddb565b6000818411156157c557600080fd5b828211156157d257600080fd5b8284101561582957600784840310156157fe5760006157f48686868687615847565b509150614a029050565b600061580b868686615cfe565b905080831161581c57809350615823565b8060010194505b506157d2565b84848151811061583557fe5b60200260200101519050949350505050565b60008060008686600101039050600088886000018151811061586557fe5b6020026020010151905060008260011061589f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6158b7565b8989600101815181106158ae57fe5b60200260200101515b90506000836002106158e9577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff615901565b8a8a600201815181106158f857fe5b60200260200101515b9050600084600310615933577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61594b565b8b8b6003018151811061594257fe5b60200260200101515b905060008560041061597d577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff615995565b8c8c6004018151811061598c57fe5b60200260200101515b90506000866005106159c7577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6159df565b8d8d600501815181106159d657fe5b60200260200101515b9050600087600610615a11577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff615a29565b8e8e60060181518110615a2057fe5b60200260200101515b905085871315615a37579495945b83851315615a43579293925b81831315615a4f579091905b84871315615a5b579395935b83861315615a67579294925b80831315615a7157915b84861315615a7d579394935b80821315615a8757905b82871315615a93579195915b81861315615a9f579094905b80851315615aa957935b82861315615ab5579194915b80841315615abf57925b82851315615acb579193915b81841315615ad7579092905b82841315615ae3579192915b8d8c0380615af357879a50615bc0565b8060011415615b0457869a50615bc0565b8060021415615b1557859a50615bc0565b8060031415615b2657849a50615bc0565b8060041415615b3757839a50615bc0565b8060051415615b4857829a50615bc0565b8060061415615b5957819a50615bc0565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6b31206f7574206f6620626f756e647300000000000000000000000000000000604482015290519081900360640190fd5b8e8c038d8d1415615bde57508a995061573e98505050505050505050565b80615bf5575096985061573e975050505050505050565b8060011415615c10575095985061573e975050505050505050565b8060021415615c2b575094985061573e975050505050505050565b8060031415615c46575093985061573e975050505050505050565b8060041415615c61575092985061573e975050505050505050565b8060051415615c7c575091985061573e975050505050505050565b8060061415615c97575090985061573e975050505050505050565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6b32206f7574206f6620626f756e647300000000000000000000000000000000604482015290519081900360640190fd5b6000808460028585010481518110615d1257fe5b602002602001015190506001840393506001830192505b60018401935080858581518110615d3c57fe5b602002602001015112615d29575b60018303925080858481518110615d5d57fe5b602002602001015113615d4a5782841015615dcd57848381518110615d7e57fe5b6020026020010151858581518110615d9257fe5b6020026020010151868681518110615da657fe5b60200260200101878681518110615db957fe5b602090810291909101019190915252615dd6565b8291505061543a565b615d29565b6000828201818312801590615df05750838112155b80615e055750600083128015615e0557508381125b6121fc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615f4a6021913960400191505060405180910390fd5b604080518082019091526000808252602082015290565b50805460008255906000526020600020908101906126d49190615f2f565b60408051608081018252600080825260208201819052918101829052606081019190915290565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915290565b828054828255906000526020600020908101928215615f1f579160200282015b82811115615f1f578251825591602001919060010190615f04565b50615f2b929150615f2f565b5090565b611d0191905b80821115615f2b5760008155600101615f3556fe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f77536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212203dfd5ae52fef7bbe05a195d698b0b1b8be56378daa346eaccbc52d24f39c30af64736f6c63430006060033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f770000000000000000000000009e004545c59d359f6b7bfb06a26390b087717b42000000000000000000000000000000000000000000000000001550f7dca70000000000000000000000000000000000000000000000000000000000000002a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000009455448202f205553440000000000000000000000000000000000000000000000

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

0000000000000000000000009e004545c59d359f6b7bfb06a26390b087717b42000000000000000000000000000000000000000000000000001550f7dca70000000000000000000000000000000000000000000000000000000000000002a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000009455448202f205553440000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _link (address): 0x9e004545c59d359f6b7bfb06a26390b087717b42
Arg [1] : _paymentAmount (uint128): 6000000000000000
Arg [2] : _timeout (uint32): 172800
Arg [3] : _validator (address): 0x0000000000000000000000000000000000000000
Arg [4] : _minSubmissionValue (int256): 1000000000
Arg [5] : _maxSubmissionValue (int256): 100000000000000
Arg [6] : _decimals (uint8): 8
Arg [7] : _description (string): ETH / USD

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000009e004545c59d359f6b7bfb06a26390b087717b42
Arg [1] : 000000000000000000000000000000000000000000000000001550f7dca70000
Arg [2] : 000000000000000000000000000000000000000000000000000000000002a300
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 000000000000000000000000000000000000000000000000000000003b9aca00
Arg [5] : 00000000000000000000000000000000000000000000000000005af3107a4000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [9] : 455448202f205553440000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

64377:7542:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;64377:7542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;62885:168:0;;;:::i;:::-;;50764:295;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50764:295:0;;;;:::i;33736:706::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33736:706:0;;;;;;;:::i;48443:450::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48443:450:0;;;;;;;;;;;;;;;;;;:::i;29780:42::-;;;:::i;:::-;;;;;;;;;;;;;;;;29657:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29600:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36405:1055;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;36405:1055:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35204:747::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35204:747:0;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;35204:747:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35204:747:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35204:747:0;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;35204:747:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35204:747:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35204:747:0;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;35204:747:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35204:747:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35204:747:0;;-1:-1:-1;35204:747:0;-1:-1:-1;35204:747:0;;;;;;;;;;;;;;;;;;;;:::i;29414:45::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45202:628;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45202:628:0;;;;;;;;;;;;;;;;;;:::i;38558:98::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38558:98:0;;;;;;;;;;;;;;;;;37750:119;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37956:339;;;:::i;69255:144::-;;;:::i;29829:44::-;;;:::i;29374:35::-;;;:::i;29526:32::-;;;:::i;38359:100::-;;;:::i;47316:298::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47316:298:0;;;;:::i;46538:127::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;46538:127:0;;;;:::i;69841:143::-;;;:::i;63942:220::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;63942:220:0;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;63942:220:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;63942:220: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;63942:220:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;63942:220:0;;-1:-1:-1;63942:220:0;;-1:-1:-1;;;;;63942:220:0:i;:::-;;;;;;;;;;;;;;;;;;29631:21;;;:::i;29692:34::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29692:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14176:264;;;:::i;29733:42::-;;;:::i;62651:166::-;;;:::i;70427:151::-;;;:::i;62401:184::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;62401:184:0;;;;:::i;49604:978::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49604:978:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13517:20;;;:::i;47690:405::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66930:294;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;66930:294:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62107:179;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;62107:179:0;;;;:::i;49180:186::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;49180:186:0;;;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;49180:186:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;49180:186: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;-1:-1;49180:186:0;;-1:-1:-1;49180:186:0;-1:-1:-1;49180:186:0;:::i;71064:162::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;71064:162:0;;:::i;71745:169::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;71745:169:0;;:::i;46020:370::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;46020:370:0;;;;;;;;;:::i;29493:28::-;;;:::i;29563:32::-;;;:::i;37547:119::-;;;:::i;61424:24::-;;;:::i;44756:145::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44756:145:0;;;;:::i;46871:280::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;46871:280:0;;;;;;;;;;;:::i;13925:157::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13925:157:0;;;;:::i;68538:277::-;;;:::i;62885:168::-;14580:5;;;;14566:10;:19;14558:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62960:12:::1;::::0;::::1;;62956:92;;;62983:12;:20:::0;;;::::1;::::0;;63019:21:::1;::::0;::::1;::::0;62998:5:::1;::::0;63019:21:::1;62956:92;62885:168::o:0;50764:295::-;14580:5;;;;14566:10;:19;14558:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50875:9:::1;::::0;::::1;::::0;;::::1;::::0;50898:25;::::1;::::0;::::1;50894:160;;50934:9;:55:::0;;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;51005:41:::1;::::0;50934:55;;51005:41;::::1;::::0;::::1;::::0;-1:-1:-1;;51005:41:0::1;50894:160;14619:1;50764:295:::0;:::o;33736:706::-;33814:18;33835:49;33855:10;33874:8;33835:19;:49::i;:::-;33814:70;;33914:18;33899:11;:33;;33891:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33997:18;33982:11;:33;;33974:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34065:12;;:5;;:17;34057:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;34057:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34107:42;34139:8;34107:24;:42::i;:::-;34156:47;34173:11;34193:8;34156:16;:47::i;:::-;34211:12;34225:16;34245:35;34270:8;34245:17;:35::i;:::-;34210:70;;;;34287:27;34304:8;34287:9;:27::i;:::-;34321:36;34347:8;34321:18;:36::i;:::-;34368:7;34364:73;;;34386:43;34408:8;34419:9;34386:14;:43::i;:::-;33736:706;;;;;:::o;48443:450::-;14580:5;;;;14566:10;:19;14558:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48574:22:::1;::::0;::::1;;::::0;;;:10:::1;:22;::::0;;;;:33;::::1;;:48;;::::0;::::1;;;48570:61;;;48624:7;;48570:61;48643:11;48639:179;;;48665:22;::::0;::::1;;::::0;;;:10:::1;:22;::::0;;;;:47;;;::::1;::::0;::::1;;;48721:37:::0;::::1;48665:47;48721:37;::::0;::::1;;;::::0;;48639:179:::1;;;48788:22;::::0;::::1;;::::0;;;:10:::1;:22;::::0;;;;48781:29;;;;;;48639:179:::1;48831:56;::::0;;;::::1;;::::0;;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;14619:1;48443:450:::0;;;:::o;29780:42::-;;;:::o;29657:30::-;;;;;;:::o;29600:26::-;;;;;;;;;:::o;36405:1055::-;14580:5;;;;14566:10;:19;14558:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36613:16:::1;36632:13;:11;:13::i;:::-;36613:32;;;;36704:15;36685:34;;:15;:34;;;;36677:72;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36777:15;36764:28;;:9;:28;;;;36756:64;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36835:14;::::0;::::1;::::0;;:43:::1;;;36865:13;36853:25;;:9;:25;;;36835:43;36827:81;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36950:31;36966:14;36950:31;;:15;:31::i;:::-;36923:13;:23:::0;::::1;;:58;;36915:101;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37043:1;37027:13;:11;:13::i;:::-;:17;;;37023:98;;;37081:1;37063:15;:19;;;37055:58;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37145:14;37129:13;;:30;;;;;;;;;;;;;;;;;;37187:15;37166:18;;:36;;;;;;;;;;;;;;;;;;37230:15;37209:18;;:36;;;;;;;;;;;;;;;;;;37267:13;37252:12;;:28;;;;;;;;;;;;;;;;;;37297:8;37287:7;;:18;;;;;;;;;;;;;;;;;;37393:15;37319:135;;37369:15;37319:135;;37347:13;;;;;;;;;;;37319:135;;;37417:13;37439:8;37319:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14619:1;36405:1055:::0;;;;;:::o;35204:747::-;14580:5;;;;14566:10;:19;14558:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35467:9:::1;35462:88;35482:19:::0;;::::1;35462:88;;;35517:25;35530:8;;35539:1;35530:11;;;;;;;;;;;;;;;35517:12;:25::i;:::-;35503:3;;35462:88;;;-1:-1:-1::0;35566:36:0;;::::1;35558:81;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;30345:2;35654:41;35681:6:::0;35662:13:::1;:11;:13::i;:::-;35654:22;;::::0;:41:::1;:26;:41;:::i;:::-;:61;;35646:93;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;35753:9;35748:98;35768:17:::0;;::::1;35748:98;;;35801:37;35811:6;;35818:1;35811:9;;;;;;;;;;;;;;;35822:12;;35835:1;35822:15;;;;;;;;;;;;;;;35801:9;:37::i;:::-;35787:3;;35748:98;;;-1:-1:-1::0;35873:13:0::1;::::0;35854:91:::1;::::0;35873:13:::1;::::0;::::1;::::0;35888:15;;35905;;35922:13;;35937:7;;::::1;;;35854:18;:91::i;:::-;35204:747:::0;;;;;;;;;:::o;29414:45::-;;;;;;:::o;45202:628::-;45313:36;:16;;;;;;;:7;:16;;;;;:22;;;;;;;45339:10;45313:36;45305:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45531:16;;;45471:14;45531:16;;;:7;:16;;;;;:29;45496:7;;45531:29;;;;;45575:19;;;;;45567:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45671:21;:13;;;45685:6;45671:21;:13;:21;:::i;:::-;45639:16;;;;;;;:7;:16;;;;;:53;;;;;;;;;;;45725:13;:23;:35;;:23;;;;;45753:6;45725:27;:35::i;:::-;45699:13;:61;;;;;;;;;;;;;;45776:9;;:47;;;;;;:9;:47;;;;;;;45807:15;;;45776:47;;;;;;:9;;;;;:18;;:47;;;;;;;;;;;;;;;45699:23;45776:9;:47;;;2:2:-1;;;;27:1;24;17:12;2:2;45776:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45776:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45776:47:0;45769:55;;;38558:98;38603:16;38635:15;38628:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38558:98;;:::o;37750:119::-;37840:13;:23;;;37750:119;:::o;37956:339::-;38010:18;;:::i;:::-;-1:-1:-1;38010:34:0;;;;;;;;38031:13;38010:34;;;;;;;;;;;;;;;;;;;38076:9;;:34;;;;;38104:4;38076:34;;;;;;38010;;-1:-1:-1;;38076:55:0;;38010:34;38076:9;;;;;:19;;:34;;;;;;;;;;;:9;:34;;;2:2:-1;;;;27:1;24;17:12;2:2;38076:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38076:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38076:34:0;;:55;:38;:55;:::i;:::-;38144:15;;38053:78;;-1:-1:-1;38144:31:0;;;;38140:150;;38186:13;:47;;;;;;;;;;38247:35;;38186:47;;38247:35;;-1:-1:-1;;38247:35:0;37956:339;;:::o;69255:144::-;69348:6;63165:31;63175:10;63187:8;;63165:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;63165:9:0;;-1:-1:-1;;;63165:31:0:i;:::-;63157:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69373:20:::1;:18;:20::i;:::-;69366:27;;69255:144:::0;:::o;29829:44::-;29872:1;29829:44;:::o;29374:35::-;;;;;;:::o;29526:32::-;;;;;;;;;:::o;38359:100::-;38430:15;:22;38359:100;:::o;47316:298::-;47386:43;:16;;;;;;;:7;:16;;;;;:29;;;;47419:10;47386:43;47378:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47471:16;;;47511:1;47471:16;;;:7;:16;;;;;;:29;;;:42;;;;;;47520:22;;:35;;;;47545:10;47520:35;;;;;;;;;;47569:39;;47545:10;;47471:16;47569:39;;;47316:298;:::o;46538:127::-;46637:16;;;;46611:7;46637:16;;;:7;:16;;;;;:22;;;;;;;46538:127;;;;:::o;69841:143::-;69933:7;63165:31;63175:10;63187:8;;63165:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;63165:9:0;;-1:-1:-1;;;63165:31:0:i;:::-;63157:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69959:19:::1;:17;:19::i;63942:220::-:0;64078:4;64101:33;64117:5;64124:9;64101:15;:33::i;:::-;:55;;;-1:-1:-1;64138:18:0;;;64147:9;64138:18;64101:55;64094:62;;63942:220;;;;;:::o;29631:21::-;;;;;;;;;:::o;29692:34::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14176:264::-;14249:12;;;;14235:10;:26;14227:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14297:16;14316:5;;14336:10;14328:18;;;;;;;;-1:-1:-1;14353:25:0;;;;;;;14392:42;;14316:5;;;;;14336:10;;14316:5;;14392:42;;;14176:264;:::o;29733:42::-;;;:::o;62651:166::-;14580:5;;;;14566:10;:19;14558:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62726:12:::1;::::0;::::1;;62721:91;;62749:12;:19:::0;;;::::1;62764:4;62749:19;::::0;;62784:20:::1;::::0;::::1;::::0;62749:12:::1;::::0;62784:20:::1;62651:166::o:0;70427:151::-;70523:7;63165:31;63175:10;63187:8;;63165:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;63165:9:0;;-1:-1:-1;;;63165:31:0:i;:::-;63157:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70549:23:::1;:21;:23::i;62401:184::-:0;14580:5;;;;14566:10;:19;14558:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62483:17:::1;::::0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;::::1;;62479:101;;;62511:17;::::0;::::1;62531:5;62511:17:::0;;;:10:::1;:17;::::0;;;;;;;;:25;;;::::1;::::0;;62552:20;;;;;;;::::1;::::0;;;;;;;;::::1;62479:101;62401:184:::0;:::o;49604:978::-;49717:22;;;;;;;;49962:10;49976:9;49962:23;49954:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50025:19;;;;50021:556;;50077:23;;;50055:19;50077:23;;;:6;:23;;;;;;;;50140:7;:24;;;;;;50191:50;50216:7;50084:15;50191:24;:50::i;:::-;50278:16;;;;;;;:7;:16;;;;;:33;;;;;50322:15;;;;50348;;;;50374:13;:23;50252:15;;50322;;;50348;;;;;;50374:23;;50408:13;:11;:13::i;:::-;50433:15;;;;;;:59;;50479:13;;;;50433:59;;;50455:21;;;;;;;;;50433:59;50173:329;;;;;;;;;;;;;;;;;;;;;;;;;50021:556;50532:37;50561:7;50532:28;:37::i;:::-;50525:44;;;;;;;;;;;;;;;;50021:556;49604:978;;;;;;;;;;;:::o;13517:20::-;;;;;;:::o;47690:405::-;47782:10;47745:6;47771:22;;;:10;:22;;;;;:33;;;47763:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47859:16;;;;47842:14;47890:15;;;:6;:15;;;;;47859:16;47890:25;;;;;;;:29;;;:50;;;47923:17;47932:7;47923:8;:17::i;:::-;47882:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47985:17;48005:14;:11;;;;;48017:1;;48005:11;:14;:::i;:::-;47985:34;;48026:39;48054:10;48026:27;:39::i;:::-;48072:17;;;-1:-1:-1;;47690:405:0;:::o;66930:294::-;67046:14;67069:13;67091:17;67117;67143:22;63165:31;63175:10;63187:8;;63165:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;63165:9:0;;-1:-1:-1;;;63165:31:0:i;:::-;63157:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67190:28:::1;67209:8;67190:18;:28::i;:::-;67183:35:::0;;;;-1:-1:-1;67183:35:0;;-1:-1:-1;67183:35:0;-1:-1:-1;67183:35:0;;-1:-1:-1;66930:294:0;-1:-1:-1;;66930:294:0:o;62107:179::-;14580:5;;;;14566:10;:19;14558:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62187:17:::1;::::0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;::::1;;62182:99;;62215:17;::::0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;:24;;;::::1;62235:4;62215:24;::::0;;62255:18;;;;;;;::::1;::::0;;;;;;;;::::1;62107:179:::0;:::o;49180:186::-;49277:17;;49269:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49338:22;:20;:22::i;:::-;49180:186;;;;:::o;71064:162::-;71170:6;63165:31;63175:10;63187:8;;63165:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;63165:9:0;;-1:-1:-1;;;63165:31:0:i;:::-;63157:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71195:25:::1;71211:8;71195:15;:25::i;71745:169::-:0;71854:7;63165:31;63175:10;63187:8;;63165:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;63165:9:0;;-1:-1:-1;;;63165:31:0:i;:::-;63157:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71880:28:::1;71899:8;71880:18;:28::i;46020:370::-:0;14580:5;;;;14566:10;:19;14558:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46149:13:::1;:23:::0;46218:13:::1;::::0;46149:23:::1;::::0;;::::1;::::0;46237:7;;46188:45:::1;::::0;46202:30:::1;::::0;46218:13:::1;46202:15;:30::i;:::-;46188:9:::0;;:45:::1;:13;:45;:::i;:::-;:56;;46180:95;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;46290:9;::::0;:39:::1;::::0;;;;;:9:::1;:39:::0;;::::1;;::::0;::::1;::::0;;;;;;;;;:9;;;::::1;::::0;:18:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;:9:::1;::::0;:39;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;46290:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;46290:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;46290:39:0;46282:73:::1;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;46362:22;:20;:22::i;29493:28::-:0;;;;;;:::o;29563:32::-;;;;;;;;;:::o;37547:119::-;37637:13;:23;;;;;;;37547:119::o;61424:24::-;;;;;;:::o;44756:145::-;44866:16;;44840:7;44866:16;;;:7;:16;;;;;:29;;;;44756:145::o;46871:280::-;46962:36;:16;;;;;;;:7;:16;;;;;:22;;;;;;;46988:10;46962:36;46954:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47032:16;;;;;;;;:7;:16;;;;;;;;;:29;;:41;;;;;;;;;;;;47087:58;;47123:10;47087:58;;;;;;;;;;;47032:16;;47087:58;;;;;;;;;;;46871:280;;:::o;13925:157::-;14580:5;;;;14566:10;:19;14558:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14006:12:::1;:18:::0;;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;14065:5:0;;14038:38:::1;::::0;14006:18;;14065:5:::1;::::0;14038:38:::1;::::0;-1:-1:-1;14038:38:0::1;13925:157:::0;:::o;68538:277::-;68642:14;68665:13;68687:17;68713;68739:22;63165:31;63175:10;63187:8;;63165:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;63165:9:0;;-1:-1:-1;;;63165:31:0:i;:::-;63157:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68786:23:::1;:21;:23::i;:::-;68779:30;;;;;;;;;;68538:277:::0;;;;;:::o;59157:798::-;59332:16;;;59309:20;59332:16;;;:7;:16;;;;;:30;59383:16;;59257:12;;59332:30;;;;;;;;59383:16;59412:18;59408:51;;59432:27;;;;;;;;;;;;;;;;;;;;;;;59408:51;59486:8;59470:24;;:13;:24;;;59466:61;;;59496:31;;;;;;;;;;;;;;;;;;;;;;;59466:61;59538:16;;;;;;;:7;:16;;;;;:28;:39;;;;:28;;;;;:39;59534:78;;;59579:33;;;;;;;;;;;;;;;;;;;;;;;59534:78;59623:16;;;;;;;:7;:16;;;;;:34;:46;;;;:34;;;;;:46;59619:93;;59671:41;;;;;;;;;;;;;;;;;;;;;;;59619:93;59735:4;59723:16;;:8;:16;;;;:43;;;;-1:-1:-1;59755:11:0;:8;;;;;59764:1;;59755:8;:11;:::i;:::-;59743:23;;:8;:23;;;;59723:43;:92;;;;;59771:44;59800:8;59810:4;59771:28;:44::i;:::-;59770:45;59723:92;59719:130;;;59817:32;;;;;;;;;;;;;;;;;;;;;;;59719:130;59860:8;:13;;59872:1;59860:13;;:47;;;;-1:-1:-1;59878:29:0;59891:15;:12;;;;;59904:1;;59891:12;:15;:::i;:::-;59878:12;:29::i;:::-;59877:30;59860:47;59856:93;;;59909:40;;;;;;;;;;;;;;;;;;;;;;;59856:93;59157:798;;;;;;:::o;51598:369::-;51677:18;51686:8;51677;:18::i;:::-;51672:32;;51697:7;;51672:32;51740:10;51710:19;51732;;;:7;:19;;;;;:36;51828:12;;51732:36;;;;;;;;51828:12;;;;;;51814:26;;51802:38;;;;;;;:58;;-1:-1:-1;51844:16:0;;;51802:58;51798:71;;;51862:7;;;51798:71;51877:28;51896:8;51877:18;:28::i;:::-;-1:-1:-1;51922:10:0;51914:19;;;;:7;:19;;;;;:47;;;;;;;;;;;;;;51598:369;:::o;56412:401::-;56506:30;56527:8;56506:20;:30::i;:::-;56498:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56581:17;;;;;;;:7;:17;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;56581:47:0;;;;;;;;;;56643:10;56635:19;;;:7;:19;;;;;;:48;;;;;;;;;;56690:36;:50;;;56754:53;56643:10;;56581:17;:47;;56754:53;;56581:17;56754:53;56412:401;;:::o;54737:562::-;54876:17;;;;54809:4;54876:17;;;:7;:17;;;;;:32;;;;54837:36;;54809:4;;;;54876:32;;;;;-1:-1:-1;54833:111:0;;;-1:-1:-1;54927:5:0;;-1:-1:-1;54927:5:0;54919:17;;54833:111;54995:17;;;54952:16;54995:17;;;:7;:17;;;;;;;;54971:54;;;;;;;;;;;;;;;;;;;;;54995:17;54971:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:54::i;:::-;55032:16;;;;;;;:6;:16;;;;;;;;;:35;;;55074:26;;:52;;;;;55110:15;55074:52;;;;;;;;;;;55133:43;;;;;;;;;55183:13;:24;;;;;;;;;;55221:39;;;;;;;55032:35;;-1:-1:-1;55032:16:0;;:35;;55221:39;;;;;;;;55277:4;;-1:-1:-1;55283:9:0;-1:-1:-1;54737:562:0;;;;:::o;55978:428::-;56055:17;;;56037:15;56055:17;;;:7;:17;;;;;:31;;;;;;;;56093:18;;:::i;:::-;-1:-1:-1;56093:34:0;;;;;;;;;56114:13;56093:34;;;;;;;;;;;;;;;;;56152:28;;56172:7;56152:28;:19;:28;:::i;:::-;56134:46;;;;;;56205:15;;;;:28;;:19;56225:7;56205:28;:19;:28;:::i;:::-;56187:46;;;;:15;;;;:46;;;56240:21;;:13;:21;;;;;;;;;;;;;;;;;;;;;;;56311:10;56240:21;56303:19;;;:7;:19;;;;;;:32;:45;;:32;56340:7;56303:45;:36;:45;:::i;:::-;56276:10;56268:19;;;;:7;:19;;;;;;:80;;;;;;;;;;;56384:15;;56362:38;;;;;;;56268:19;56362:38;55978:428;;;:::o;56819:190::-;56930:17;;;;;;;;:7;:17;;;;;:32;;;;56891:36;;56930:32;;-1:-1:-1;56887:84:0;;;56964:7;;56887:84;56986:17;;;;;;;:7;:17;;;;;;56979:24;56986:17;;56979:24;:::i;:::-;-1:-1:-1;56979:24:0;;;;;;;;56819:190;:::o;55305:667::-;55437:9;;;;55480:25;55476:38;;55507:7;;;55476:38;55522:16;55541:15;:12;;;;;55554:1;;55541:12;:15;:::i;:::-;55590:17;;;;55563:24;55590:17;;;:6;:17;;;;;;;;:33;;;;55655:24;;55825:130;;;;;55590:33;;;;;;55825:130;;;;;;;;;;;;;;;;;;;;;;;;;;;55522:34;;-1:-1:-1;55590:33:0;;55655:24;;55825:11;;;;;;30447:6;;55825:130;;;;;55590:17;;55825:130;;;;;;;;;:11;:130;;;2:2:-1;;;;27:1;24;17:12;2:2;55825:130:0;;;;;;;;;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55825:130:0;;;55821:146;;;;;;;55305:667;;;;;;:::o;57801:157::-;57880:7;57906:46;30295:1;57906:26;57918:13;:11;:13::i;:::-;57906:7;;:26;;;:11;:26;:::i;:::-;:30;:46;:30;:46;:::i;58657:494::-;58737:22;58751:7;58737:13;:22::i;:::-;58729:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58822:16;;:23;;:16;;;;;58843:1;;58822:20;:23;:::i;:::-;58791:16;;;;;;;:7;:16;;;;;:54;;;;;;;;;;;;;;;;;;;;58867:15;58883:29;-1:-1:-1;58891:13:0;:11;:13::i;:::-;58883:22;;;:29;:26;:29;:::i;:::-;58867:46;;;;;;;;;;;;;;;;;;;;;;58935:16;;;;;;:7;:16;;;;;;;:22;;;;;;58867:46;;;;58964:13;;;;;;:19;:27;;58935:22;;;;58964:27;;;;;;;;;59005:16;;;;58998:29;;;;;59034:15;:22;;58867:46;;-1:-1:-1;58935:22:0;;58867:46;;59034:15;58935:22;;59034;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;59070:15;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59105:40;;59070:21;59105:40;;;;;59070:21;;59105:40;58657:494;;;:::o;857:167::-;915:7;943:5;;;963:6;;;;955:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57964:687;58063:22;58077:7;58063:13;:22::i;:::-;58062:23;58054:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58129:20;;;58121:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58190:36;:16;;;58224:1;58190:16;;;:7;:16;;;;;:22;;;;;;;:36;;:72;;-1:-1:-1;58230:32:0;:16;;;;;;;:7;:16;;;;;:22;;;;;;;;:32;;;;58190:72;58182:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58337:25;58354:7;58337:16;:25::i;:::-;58304:16;;;;;;;;:7;:16;;;;;;:58;;58369:40;58304:58;;;;;;;;;;;;58369:40;;;;;;;;58448:15;:22;;58416;;;;:55;;;;;;;;;;;;;;;;27:10:-1;;-1:-1;23:18;;;45:23;;;58478:29:0;;;;;;;;;;58514:16;;;:31;;;;;;;;;;;;;;;;;;58559:39;;-1:-1:-1;;58304:16:0;;58559:39;;58304:16;58559:39;58638:6;58610:35;;58629:7;58610:35;;;;;;;;;;;;57964:687;;:::o;16002:170::-;16060:7;16089:1;16084:6;;:1;:6;;;;16076:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16144:5:0;;;16002:170::o;1287:::-;1345:7;1374:1;1369;:6;;1361:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39032:146;39151:13;;;;;;;39119:6;39144:21;;;:6;:21;;;;;:28;;39032:146::o;40085:131::-;40197:13;;;;;;;;40085:131::o;61811:189::-;61960:17;;;61937:4;61960:17;;;:10;:17;;;;;;;;;:34;;-1:-1:-1;;61982:12:0;;;;61981:13;;61811:189;-1:-1:-1;;61811:189:0:o;39557:153::-;39680:13;;;;;;;39647:7;39673:21;;;:6;:21;;;;;:31;;;;;;;;;39557:153::o;52766:432::-;52908:23;;;52878:14;52908:23;;;:6;:23;;;;;:33;;;;;:37;52904:289;;52963:37;52984:15;52963:20;:37::i;:::-;:98;;;;;53004:45;53024:7;53033:15;53004:19;:45::i;:::-;:52;:57;52963:98;52956:105;;;;52904:289;53091:33;53099:7;53108:15;53091:7;:33::i;53204:1527::-;53609:16;;;53304:22;53609:16;;;:7;53563:9;53609:16;53563:9;53609:16;;53685;;53657:24;;53304:22;;;;;;;;;;;;;;53563:9;;53609:16;;53304:22;;53563:9;53685:16;;;53657:24;;;;;:44;;:87;;-1:-1:-1;53727:16:0;;53706:38;;53727:16;;53706:20;:38::i;:::-;53705:39;53657:87;53968:16;;53634:110;;-1:-1:-1;53955:30:0;;53968:16;;53955:12;:30::i;:::-;:49;;;;;53989:15;53955:49;53951:436;;;54026:16;;:23;;:16;;;;;54047:1;;54026:20;:23;:::i;:::-;54066:16;;;;;;;:6;:16;;;;;54110:13;;54015:34;;-1:-1:-1;54110:13:0;;;;;-1:-1:-1;54066:16:0;-1:-1:-1;54152:26:0;54160:7;54015:34;54152:7;:26::i;:::-;54132:46;;53951:436;;;54212:16;;;;;54245;;;:6;:16;;;;;;;;54289:7;:17;;;;;;54212:16;54289:31;;54212:16;;-1:-1:-1;54289:31:0;;;;;;;-1:-1:-1;54245:16:0;-1:-1:-1;54349:30:0;54212:16;54349:20;:30::i;:::-;54329:50;;53951:436;54399:38;54419:7;54428:8;54399:19;:38::i;:::-;:45;:50;54395:98;;54480:5;54460:25;;54395:98;54560:23;;;;;54592:15;;;;54616:17;;;;54592:15;54616:17;;;:7;:17;;;;;:25;;;;54650:13;:23;54517:17;;54543:8;;54560:23;54592:15;;;54616:25;;;;;54650:23;;54682:13;:11;:13::i;:::-;54704:14;54501:224;;;;;;;;;;;;;;;;;;;;;;;;53204:1527;;;;;;;;;:::o;57015:289::-;57122:16;;;;57087:4;57122:16;;;:6;:16;;;;;;;;:26;;;;;57177:7;:17;;;;;;:25;;57087:4;;57122:26;;;;;57177:25;;;;57216:13;;;;;:33;;;57248:1;57233:12;:16;;;57216:33;:82;;;;-1:-1:-1;57283:15:0;57253:27;:13;;;:27;;;;;:13;:27;:::i;:::-;:45;;;57216:82;57209:89;57015:289;-1:-1:-1;;;;57015:289:0:o;19133:163::-;19189:6;19215:5;;;19235:6;;;;;;;;;19227:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51973:413;52055:18;52064:8;52055;:18::i;:::-;52050:32;;52075:7;;52050:32;52121:10;52088:19;52110:22;;;:10;:22;;;;;:39;;;;;;;;;52212:28;;;;52198:42;;52187:53;;;;;:73;;-1:-1:-1;52244:16:0;;52187:73;52179:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52293:28;52312:8;52293:18;:28::i;:::-;-1:-1:-1;52341:10:0;52330:22;;;;:10;:22;;;;;:50;;;;;;;;;;;;;;51973:413;:::o;42596:500::-;42706:14;42729:13;42751:17;42777;42803:22;42843:14;;:::i;:::-;-1:-1:-1;42860:24:0;;;;;;;;:6;:24;;;;;;;;;42843:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42901:21;;;;:47;;;42926:22;42939:8;42926:22;;:12;:22::i;:::-;42950:16;;;;;;;;;;;;;;;;;42893:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;42893:74:0;-1:-1:-1;43009:8:0;;43026:11;;;;43046;;;;43066:17;;;;;42992:8;;43009;;42976:114;;;;;-1:-1:-1;42976:114:0;;;-1:-1:-1;42976:114:0;;;;;-1:-1:-1;42596:500:0;-1:-1:-1;;42596:500:0:o;40638:221::-;40738:6;40760:22;40773:8;40760:12;:22::i;:::-;40756:83;;;-1:-1:-1;40800:24:0;;;;;;;:6;:24;;;;;:31;40793:38;;40756:83;-1:-1:-1;40852:1:0;40638:221;;;:::o;41314:228::-;41417:7;41440:22;41453:8;41440:12;:22::i;:::-;41436:86;;;-1:-1:-1;41480:24:0;;;;;;;:6;:24;;;;;:34;;;;;;;;41473:41;;44384:275;44482:14;44505:13;44527:17;44553;44579:22;44626:27;44639:13;;;;;;;;;;;44626:27;;:12;:27::i;57604:191::-;57710:4;57752:5;57733:24;;:15;57746:1;57733:8;:12;;;;:15;;;;:::i;:::-;:24;;;:56;;;;-1:-1:-1;;57761:13:0;;;;;;:6;:13;;;;;:23;;;;;;;;:28;;57604:191;-1:-1:-1;57604:191:0:o;19559:166::-;19615:6;19643:1;19638:6;;:1;:6;;;;19630:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59961:157;60060:16;;;60037:4;60060:16;;;:6;:16;;;;;:26;;;;;;;;:30;;;:52;;;60094:18;60103:8;60094;:18::i;60675:136::-;60782:16;;60747:4;;60782:23;;:16;;;;;60803:1;;60782:20;:23;:::i;:::-;60770:35;;:8;:35;;;60763:42;;60675:136;;;:::o;51097:495::-;51165:40;51189:15;:12;;;;;51202:1;;51189:12;:15;:::i;:::-;51165:23;:40::i;:::-;51214:16;:27;;;;;;;;;;51248:31;;:::i;:::-;-1:-1:-1;51282:135:0;;;-1:-1:-1;51282:135:0;;;51303:15;;;;;;;;51282:135;;51327:18;;;;;;;;51282:135;;;;;;;;51354:18;;;;;51282:135;;;;51381:7;;;;;-1:-1:-1;;;51282:135:0;51397:13;;;;51282:135;;;;51424:17;;;;:7;:17;;;;;:31;;;;51282:135;;;;51424:31;;:17;;:31;;;:::i;:::-;-1:-1:-1;51424:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51462:16;;-1:-1:-1;51462:16:0;;;:6;:16;;;;;:26;;;:52;;;;51498:15;51462:52;;;;;;;;;;;;51528:58;;51559:26;;51528:58;;;;51547:10;;51528:58;;;;;;;;;51097:495;;:::o;60277:150::-;60384:17;;;;60361:4;60384:17;;;:7;:17;;;;;:32;;;;:37;;;60277:150::o;6381:522::-;6467:6;6497:4;:11;6493:1;:15;6485:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6556:11;;6602:1;6596:7;;6614;;;6610:288;;6637:14;6660;6704:62;6719:4;6725:1;6734;6728:3;:7;6751:1;6737:11;:15;6754:11;6704:14;:62::i;:::-;6683:83;;-1:-1:-1;6683:83:0;-1:-1:-1;6782:36:0;6683:83;;6782:18;:36::i;:::-;6775:43;;;;;;;;6610:288;6848:42;6860:4;6866:1;6875;6869:3;:7;6878:11;6848;:42::i;:::-;6841:49;;;;;;15572:167;15630:7;15658:5;;;15678:6;;;;;;;;;15670:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1696:430;1754:7;1982:6;1978:37;;-1:-1:-1;2006:1:0;1999:8;;1978:37;2035:5;;;2039:1;2035;:5;:1;2055:5;;;;;:10;2047:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60124:147;60224:16;;60201:4;60224:16;;;:7;:16;;;;;:28;30388:7;60224:28;;;;;;:41;;60124:147::o;57310:288::-;57430:16;;57390:6;;57430:16;;57457:17;;;;;:65;;-1:-1:-1;57494:16:0;;;;;;;:7;:16;;;;;:28;;57478:44;;;57494:28;;;;;57478:44;57457:65;57453:107;;;57540:12;-1:-1:-1;57533:19:0;;57453:107;57573:19;:16;;;;;57590:1;;57573:16;:19;:::i;:::-;57566:26;57310:288;-1:-1:-1;;;57310:288:0:o;60433:236::-;60559:16;;;60521:4;60559:16;;;:7;:16;;;;;:33;60631:12;;60559:33;;;;;;;;60631:12;;;;;;60617:26;;60606:37;;;;;:57;;-1:-1:-1;60647:16:0;;60599:64;-1:-1:-1;;;60433:236:0:o;22675:163::-;22731:6;22757:5;;;22777:6;;;;;;;;;22769:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60817:127;30388:7;-1:-1:-1;60917:21:0;;60817:127::o;52392:368::-;52470:18;52479:8;52470;:18::i;:::-;52465:32;;52490:7;;52465:32;52505:13;52521:15;:12;;;;;52534:1;;52521:12;:15;:::i;:::-;52569:14;;;;;;;;:6;:14;;;;;;;;:21;;52543:16;;;;;;;;:47;;;52632:30;;;;;52597:32;;:65;;;;52632:30;;;;;;;;52597:65;;;;;;;52669:52;;;52705:15;52669:52;;;;;;;52737:7;:17;;;;;52569:14;;-1:-1:-1;52730:24:0;52737:17;52569:14;52730:24;:::i;:::-;-1:-1:-1;52730:24:0;;;;;;;;-1:-1:-1;52392:368:0;:::o;10572:831::-;10749:11;10762;10798:2;10793;:7;10785:16;;12:1:-1;9;2:12;10785:16:0;10822:2;10816;:8;;:20;;;;;10834:2;10828;:8;;10816:20;10808:29;;12:1:-1;9;2:12;10808:29:0;10858:2;10852;:8;;:20;;;;;10870:2;10864;:8;;10852:20;10844:29;;12:1:-1;9;2:12;10844:29:0;7036:1;10913:2;10908;:7;:35;10904:105;;;10963:36;10978:4;10984:2;10988;10992;10996;10963:14;:36::i;:::-;10956:43;;;;;;10904:105;11017:16;11036:23;11046:4;11052:2;11056;11036:9;:23::i;:::-;11017:42;;11078:8;11072:2;:14;11068:323;;11104:8;11099:13;;11068:323;;;11143:2;11132:8;:13;11128:263;;;11163:8;11174:1;11163:12;11158:17;;11128:263;;;11215:8;11209:2;:14;;:31;;;;;11238:2;11227:8;:13;11209:31;11202:39;;;;11259:35;11271:4;11277:2;11281:8;11291:2;11259:11;:35::i;:::-;11252:42;;11312:39;11324:4;11330:8;11341:1;11330:12;11344:2;11348;11312:11;:39::i;:::-;11305:46;-1:-1:-1;11362:19:0;;-1:-1:-1;11362:19:0;11128:263;10882:516;;;;10572:831;;;;;;;;:::o;5346:277::-;5419:6;5447:1;5442:2;:6;:16;;;;;5457:1;5452:2;:6;5442:16;5441:40;;;;5469:1;5464:2;:6;:16;;;;;5479:1;5474:2;:6;5464:16;5437:85;;;5513:1;5499:11;5503:2;5507;5499:3;:11::i;:::-;:15;;;;;;5492:22;;;;5437:85;5528:16;5567:1;5548:6;;;5557;;;5548:15;5547:21;;-1:-1:-1;5582:35:0;5586:19;5595:1;5590:2;:6;5603:1;5598:2;:6;5586:3;:19::i;:::-;5607:9;5582:3;:35::i;9600:798::-;9715:10;9751:1;9745:2;:7;;9737:16;;12:1:-1;9;2:12;9737:16:0;9773:2;9768:1;:7;;9760:16;;12:1:-1;9;2:12;9760:16:0;9795:2;9790;:7;9783:588;;;7036:1;9817:2;9812;:7;:35;9808:157;;;9860:13;9900:34;9915:4;9921:2;9925;9929:1;9932;9900:14;:34::i;:::-;-1:-1:-1;9884:50:0;-1:-1:-1;9945:10:0;;-1:-1:-1;9945:10:0;9808:157;9973:18;9994:23;10004:4;10010:2;10014;9994:9;:23::i;:::-;9973:44;;10035:10;10030:1;:15;10026:338;;10180:10;10175:15;;10026:338;;;10340:10;10353:1;10340:14;10335:19;;10026:338;9783:588;;;;10384:4;10389:2;10384:8;;;;;;;;;;;;;;10377:15;;9600:798;;;;;;:::o;7180:2258::-;7341:11;7354;7613;7636:2;7627;7632:1;7627:6;:11;7613:25;;7645:9;7657:4;7662:2;7667:1;7662:6;7657:12;;;;;;;;;;;;;;7645:24;;7676:9;7692:3;7688:1;:7;:32;;5714:8;7688:32;;;7698:4;7703:2;7708:1;7703:6;7698:12;;;;;;;;;;;;;;7688:32;7676:44;;7727:9;7743:3;7739:1;:7;:32;;5714:8;7739:32;;;7749:4;7754:2;7759:1;7754:6;7749:12;;;;;;;;;;;;;;7739:32;7727:44;;7778:9;7794:3;7790:1;:7;:32;;5714:8;7790:32;;;7800:4;7805:2;7810:1;7805:6;7800:12;;;;;;;;;;;;;;7790:32;7778:44;;7829:9;7845:3;7841:1;:7;:32;;5714:8;7841:32;;;7851:4;7856:2;7861:1;7856:6;7851:12;;;;;;;;;;;;;;7841:32;7829:44;;7880:9;7896:3;7892:1;:7;:32;;5714:8;7892:32;;;7902:4;7907:2;7912:1;7907:6;7902:12;;;;;;;;;;;;;;7892:32;7880:44;;7931:9;7947:3;7943:1;:7;:32;;5714:8;7943:32;;;7953:4;7958:2;7963:1;7958:6;7953:12;;;;;;;;;;;;;;7943:32;7931:44;;7993:2;7988;:7;7984:35;;;8010:2;;8014;7984:35;8034:2;8029;:7;8025:35;;;8051:2;;8055;8025:35;8075:2;8070;:7;8066:35;;;8092:2;;8096;8066:35;8116:2;8111;:7;8107:35;;;8133:2;;8137;8107:35;8157:2;8152;:7;8148:35;;;8174:2;;8178;8148:35;8198:2;8193;:7;8189:35;;;8215:2;8189:35;8239:2;8234;:7;8230:35;;;8256:2;;8260;8230:35;8280:2;8275;:7;8271:35;;;8297:2;8271:35;8321:2;8316;:7;8312:35;;;8338:2;;8342;8312:35;8362:2;8357;:7;8353:35;;;8379:2;;8383;8353:35;8403:2;8398;:7;8394:35;;;8420:2;8394:35;8444:2;8439;:7;8435:35;;;8461:2;;8465;8435:35;8485:2;8480;:7;8476:35;;;8502:2;8476:35;8526:2;8521;:7;8517:35;;;8543:2;;8547;8517:35;8567:2;8562;:7;8558:35;;;8584:2;;8588;8558:35;8608:2;8603;:7;8599:35;;;8625:2;;8629;8599:35;8659:7;;;8677:11;8673:309;;8698:2;8691:9;;8673:309;;;8717:6;8727:1;8717:11;8713:269;;;8738:2;8731:9;;8713:269;;;8757:6;8767:1;8757:11;8753:229;;;8778:2;8771:9;;8753:229;;;8797:6;8807:1;8797:11;8793:189;;;8818:2;8811:9;;8793:189;;;8837:6;8847:1;8837:11;8833:149;;;8858:2;8851:9;;8833:149;;;8877:6;8887:1;8877:11;8873:109;;;8898:2;8891:9;;8873:109;;;8917:6;8927:1;8917:11;8913:69;;;8938:2;8931:9;;8913:69;;;8954:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8913:69;9007:7;;;9025:8;;;9021:412;;;-1:-1:-1;9044:4:0;;-1:-1:-1;9036:19:0;;-1:-1:-1;;;;;;;;;9036:19:0;9021:412;9072:11;9068:365;;-1:-1:-1;9100:2:0;;-1:-1:-1;9086:17:0;;-1:-1:-1;;;;;;;;9086:17:0;9068:365;9120:6;9130:1;9120:11;9116:317;;;-1:-1:-1;9148:2:0;;-1:-1:-1;9134:17:0;;-1:-1:-1;;;;;;;;9134:17:0;9116:317;9168:6;9178:1;9168:11;9164:269;;;-1:-1:-1;9196:2:0;;-1:-1:-1;9182:17:0;;-1:-1:-1;;;;;;;;9182:17:0;9164:269;9216:6;9226:1;9216:11;9212:221;;;-1:-1:-1;9244:2:0;;-1:-1:-1;9230:17:0;;-1:-1:-1;;;;;;;;9230:17:0;9212:221;9264:6;9274:1;9264:11;9260:173;;;-1:-1:-1;9292:2:0;;-1:-1:-1;9278:17:0;;-1:-1:-1;;;;;;;;9278:17:0;9260:173;9312:6;9322:1;9312:11;9308:125;;;-1:-1:-1;9340:2:0;;-1:-1:-1;9326:17:0;;-1:-1:-1;;;;;;;;9326:17:0;9308:125;9360:6;9370:1;9360:11;9356:77;;;-1:-1:-1;9388:2:0;;-1:-1:-1;9374:17:0;;-1:-1:-1;;;;;;;;9374:17:0;9356:77;9405:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11735:1256;11837:7;;12009:4;12026:1;12015:7;;;12014:13;12009:19;;;;;;;;;;;;;;11994:34;;12041:1;12035:7;;;;12098:1;12092:7;;;;12106:880;12148:1;12142:7;;;;12178:5;12167:4;12172:2;12167:8;;;;;;;;;;;;;;:16;12128:57;;12193;12213:1;12207:7;;;;12243:5;12232:4;12237:2;12232:8;;;;;;;;;;;;;;:16;12193:57;;12267:2;12262;:7;12258:721;;;12306:4;12311:2;12306:8;;;;;;;;;;;;;;12316:4;12321:2;12316:8;;;;;;;;;;;;;;12283:4;12288:2;12283:8;;;;;;;;;;;;;12293:4;12298:2;12293:8;;;;;;;;;;;;;;;;;12282:43;;;;;12258:721;;;12967:2;12960:9;;;;;12258:721;12106:880;;4908:201;4964:6;4990:5;;;5011:6;;;;;;:16;;;5026:1;5021;:6;;5011:16;5010:38;;;;5037:1;5033;:5;:14;;;;;5046:1;5042;:5;5033:14;5002:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64377:7542;;;;;;;;;;-1:-1:-1;64377:7542:0;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;64377:7542:0;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;64377:7542:0;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64377:7542:0;;;-1:-1:-1;64377:7542:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://3dfd5ae52fef7bbe05a195d698b0b1b8be56378daa346eaccbc52d24f39c30af
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading