More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,275 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Emergency Withdr... | 14254750 | 920 days ago | IN | 0 ETH | 0.00393912 | ||||
Withdraw | 13957788 | 966 days ago | IN | 0 ETH | 0.00655254 | ||||
Withdraw | 13897812 | 976 days ago | IN | 0 ETH | 0.00713388 | ||||
Withdraw | 13204899 | 1084 days ago | IN | 0 ETH | 0.00418028 | ||||
Withdraw | 13204867 | 1084 days ago | IN | 0 ETH | 0.00461423 | ||||
Withdraw | 13196091 | 1086 days ago | IN | 0 ETH | 0.00591504 | ||||
Withdraw | 12974963 | 1120 days ago | IN | 0 ETH | 0.00418368 | ||||
Withdraw | 12701833 | 1162 days ago | IN | 0 ETH | 0.00073422 | ||||
Withdraw | 12605824 | 1177 days ago | IN | 0 ETH | 0.00086788 | ||||
Withdraw | 12533022 | 1189 days ago | IN | 0 ETH | 0.00180219 | ||||
Withdraw | 12491302 | 1195 days ago | IN | 0 ETH | 0.005456 | ||||
Withdraw | 12438781 | 1203 days ago | IN | 0 ETH | 0.00520728 | ||||
Withdraw | 12399598 | 1209 days ago | IN | 0 ETH | 0.00774264 | ||||
Withdraw | 12395963 | 1210 days ago | IN | 0 ETH | 0.01103463 | ||||
Withdraw | 12395765 | 1210 days ago | IN | 0 ETH | 0.01148272 | ||||
Withdraw | 12394980 | 1210 days ago | IN | 0 ETH | 0.01709056 | ||||
Withdraw | 12386484 | 1211 days ago | IN | 0 ETH | 0.00247012 | ||||
Withdraw | 12377200 | 1213 days ago | IN | 0 ETH | 0.00307096 | ||||
Withdraw | 12359717 | 1215 days ago | IN | 0 ETH | 0.0015352 | ||||
Activate | 12351566 | 1217 days ago | IN | 0 ETH | 0.00333862 | ||||
Activate | 12346394 | 1218 days ago | IN | 0 ETH | 0.00294702 | ||||
Withdraw | 12339451 | 1219 days ago | IN | 0 ETH | 0.00240336 | ||||
Withdraw | 12339284 | 1219 days ago | IN | 0 ETH | 0.0023366 | ||||
Activate | 12339033 | 1219 days ago | IN | 0 ETH | 0.005605 | ||||
Activate | 12333035 | 1220 days ago | IN | 0 ETH | 0.00410483 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TestaFarmV1Plus
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-25 */ /** *Submitted for verification at Etherscan.io on 2020-11-07 */ pragma solidity 0.6.12; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @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 SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } 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 IMigratorChef { // Perform LP token migration from legacy UniswapV2 to Testa. // Take the current LP token address and return the new LP token address. // Migrator should have full access to the caller's LP token. // Return the new LP token address. // // XXX Migrator must have allowance access to UniswapV2 LP tokens. // Testa must mint EXACTLY the same amount of Testa LP tokens or // else something bad will happen. Traditional UniswapV2 does not // do that so be careful! function migrate(IERC20 token) external returns (IERC20); } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier * available, which can be aplied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. */ contract ReentrancyGuard { /// @dev counter to allow mutex lock with only one SSTORE operation uint256 private _guardCounter; constructor () internal { // The counter starts at one to prevent changing it from zero to a non-zero // value, which is a more expensive operation. _guardCounter = 1; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call"); } } // Note that it's ownable and the owner wields tremendous power. The ownership // will be transferred to a governance smart contract once Testa is sufficiently // distributed and the community can show to govern itself. // // Have fun reading it. Hopefully it's bug-free. God bless. contract TestaFarmV1Plus is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. mapping (uint256 => uint256) pendingTesta; mapping (uint256 => uint256) rewardDebt; // Reward debt. See explanation below. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. IUniswapV2Pair uniswap; uint112 startLiquidity; uint256 allocPoint; // How many allocation points assigned to this pool. Testa to distribute per block. uint256 lastRewardBlock; // Last block number that Testa distribution occurs. uint256 accTestaPerShare; // Accumulated Testa per share, times 1e18. See below. uint256 debtIndexKey; uint256 startBlock; uint256 initStartBlock; } // The Testa TOKEN! address public testa; // Testa tokens created per block. uint256 public testaPerBlock; // Bonus muliplier for early testa makers. uint256 public constant BONUS_MULTIPLIER = 10; // The migrator contract. It has a lot of power. Can only be set through governance (owner). IMigratorChef public migrator; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping (uint256 => mapping (address => UserInfo)) public userInfo; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; uint256 public activeReward = 10; uint256 public fiveHundred = 40; uint256 public thousand = 50; int public progressive = 0; int public maxProgressive; int public minProgressive; uint256 public numberOfBlock; uint112 public startLiquidity; uint112 public currentLiquidity; AggregatorV3Interface public priceFeed; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); constructor( address _testa, uint256 _testaPerBlock, int _maxProgressive, int _minProgressive, uint256 activateAtBlock, address _priceFeed ) public { testa = _testa; testaPerBlock = _testaPerBlock; maxProgressive = _maxProgressive; minProgressive = _minProgressive; numberOfBlock = activateAtBlock; priceFeed = AggregatorV3Interface(_priceFeed); } /// @dev Require that the caller must be an EOA account to avoid flash loans. modifier onlyEOA() { require(msg.sender == tx.origin, "Not EOA"); _; } function setTestaPerBlock(uint256 _testaPerBlock) public onlyOwner{ testaPerBlock = _testaPerBlock; } function setProgressive(int _maxProgressive, int _minProgressive) public onlyOwner{ maxProgressive = _maxProgressive; minProgressive = _minProgressive; } function setNumberOfBlock(uint256 _numberOfBlock) public onlyOwner{ numberOfBlock = _numberOfBlock; } function setActiveReward(uint256 _activeReward) public onlyOwner{ activeReward = _activeReward; } function harvestAndWithdraw(uint256 _pid, uint256 _amount) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); require(getCountDown(_pid) <= numberOfBlock); require((progressive == maxProgressive) && (lpSupply != 0), "Must have lpSupply and reach maxProgressive to harvest"); require(user.amount >= _amount, "No lpToken cannot withdraw"); updatePool(_pid); uint256 testaAmount = pendingTesta( _pid, msg.sender); if(_amount > 0) { user.amount = user.amount.sub(_amount); user.rewardDebt[pool.debtIndexKey] = user.amount.mul(pool.accTestaPerShare).div(1e18); user.pendingTesta[pool.debtIndexKey] = 0; pool.lpToken.safeTransfer(address(msg.sender), _amount); safeTestaTransfer(msg.sender, testaAmount); } emit Withdraw(msg.sender, _pid, _amount); } function harvest(uint256 _pid) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); require(getCountDown(_pid) <= numberOfBlock); require((progressive == maxProgressive) && (lpSupply != 0), "Must have lpSupply and reach maxProgressive to harvest"); require(user.amount > 0, "No lpToken cannot withdraw"); updatePool(_pid); uint256 testaAmount = pendingTesta( _pid, msg.sender); user.rewardDebt[pool.debtIndexKey] = user.amount.mul(pool.accTestaPerShare).div(1e18); user.pendingTesta[pool.debtIndexKey] = 0; safeTestaTransfer(msg.sender, testaAmount); } function firstActivate(uint256 _pid) public onlyEOA nonReentrant { currentLiquidity = getLiquidity(_pid); PoolInfo storage pool = poolInfo[_pid]; require(pool.initStartBlock == pool.startBlock); require(block.number >= pool.initStartBlock, "Cannot activate until the specific block time arrive"); pool.startBlock = getLatestBlock(); pool.startLiquidity = currentLiquidity; // send Testa to user who press activate button safeTestaTransfer(msg.sender, getTestaReward(_pid)); } function activate(uint256 _pid) public onlyEOA nonReentrant { currentLiquidity = getLiquidity(_pid); PoolInfo storage pool = poolInfo[_pid]; require(pool.initStartBlock != pool.startBlock); require(getCountDown(_pid) >= numberOfBlock, "Cannot activate until specific amount of blocks pass"); if(currentLiquidity > pool.startLiquidity){ progressive++; }else{ progressive--; } if(progressive <= minProgressive){ progressive = minProgressive; clearPool(_pid); }else if(progressive >= maxProgressive){ progressive = maxProgressive; } pool.startBlock = getLatestBlock(); pool.startLiquidity = currentLiquidity; // send Testa to user who press activate button safeTestaTransfer(msg.sender, getTestaReward(_pid)); } function getTestaPoolBalance() public view returns (uint256){ return IERC20(testa).balanceOf(address(this)); } function getProgressive() public view returns (int){ return progressive; } function getLatestBlock() public view returns (uint256) { return block.number; } function getCountDown(uint256 _pid) public view returns (uint256){ require(getLatestBlock() > getStartedBlock(_pid)); return getLatestBlock().sub(getStartedBlock(_pid)); } function getStartedBlock(uint256 _pid) public view returns (uint256){ PoolInfo storage pool = poolInfo[_pid]; return pool.startBlock; } function getLiquidity(uint256 _pid) public view returns (uint112){ PoolInfo storage pool = poolInfo[_pid]; ( , uint112 _reserve1, ) = pool.uniswap.getReserves(); return _reserve1; } function getLatestPrice() public view returns (int) { ( uint80 roundID, int price, uint startedAt, uint timeStamp, uint80 answeredInRound ) = priceFeed.latestRoundData(); // If the round is not complete yet, timestamp is 0 require(timeStamp > 0, "Round not complete"); return price; } function getTestaReward(uint256 _pid) public view returns (uint256){ PoolInfo storage pool = poolInfo[_pid]; (uint112 _reserve0, uint112 _reserve1, ) = pool.uniswap.getReserves(); uint256 reserve = uint256(_reserve0).mul(1e18).div(uint256(_reserve1)); uint256 ethPerDollar = uint256(getLatestPrice()).mul(1e10); // 1e8 uint256 testaPerDollar = ethPerDollar.mul(1e18).div(reserve); uint256 _activeReward = activeReward.mul(1e18); uint256 testaAmount = _activeReward.mul(1e18).div(testaPerDollar); return testaAmount; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the owner. // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do. function add(uint256 startBlock, uint256 _allocPoint, address _lpToken, bool _withUpdate) public onlyOwner { if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); IUniswapV2Pair uniswap = IUniswapV2Pair(_lpToken); ( , uint112 _reserve1, ) = uniswap.getReserves(); poolInfo.push(PoolInfo({ lpToken: IERC20(_lpToken), allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accTestaPerShare: 0, debtIndexKey: 0, uniswap: uniswap, startLiquidity: _reserve1, startBlock: startBlock, initStartBlock: startBlock })); } // Update the given pool's Testa allocation point. Can only be called by the owner. function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; } // Set the migrator contract. Can only be called by the owner. function setMigrator(IMigratorChef _migrator) public onlyOwner { migrator = _migrator; } // Migrate lp token to another lp contract. Can be called by anyone. We trust that migrator contract is good. function migrate(uint256 _pid) public { require(address(migrator) != address(0), "migrate: no migrator"); PoolInfo storage pool = poolInfo[_pid]; IERC20 lpToken = pool.lpToken; uint256 bal = lpToken.balanceOf(address(this)); lpToken.safeApprove(address(migrator), bal); IERC20 newLpToken = migrator.migrate(lpToken); require(bal == newLpToken.balanceOf(address(this)), "migrate: bad"); pool.lpToken = newLpToken; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { return _to.sub(_from); } function clearPool(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; pool.accTestaPerShare = 0; pool.lastRewardBlock = block.number; pool.debtIndexKey++; } // View function to see pending Testa on frontend. function pendingTesta(uint256 _pid, address _user) public view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accTestaPerShare = pool.accTestaPerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 testaReward = multiplier.mul(testaPerBlock).mul(pool.allocPoint).div(totalAllocPoint); accTestaPerShare = accTestaPerShare.add(testaReward.mul(1e18).div(lpSupply)); } uint256 rewardDebt = user.rewardDebt[pool.debtIndexKey]; return user.amount.mul(accTestaPerShare).div(1e18).sub(rewardDebt).add(user.pendingTesta[pool.debtIndexKey]); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (lpSupply == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 testaReward = multiplier.mul(testaPerBlock).mul(pool.allocPoint).div(totalAllocPoint); pool.accTestaPerShare = pool.accTestaPerShare.add(testaReward.mul(1e18).div(lpSupply)); pool.lastRewardBlock = block.number; } // Deposit LP tokens to TestaFarm for Testa allocation. function deposit(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { user.pendingTesta[pool.debtIndexKey] = pendingTesta(_pid, msg.sender); } if(_amount > 0) { pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = user.amount.add(_amount); } user.rewardDebt[pool.debtIndexKey] = user.amount.mul(pool.accTestaPerShare).div(1e18); emit Deposit(msg.sender, _pid, _amount); } // Withdraw LP tokens from TestaFarm. function withdraw(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "No lpToken cannot withdraw"); updatePool(_pid); if(_amount > 0) { user.amount = user.amount.sub(_amount); pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt[pool.debtIndexKey] = user.amount.mul(pool.accTestaPerShare).div(1e18); user.pendingTesta[pool.debtIndexKey] = 0; emit Withdraw(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; pool.lpToken.safeTransfer(address(msg.sender), user.amount); emit EmergencyWithdraw(msg.sender, _pid, user.amount); user.amount = 0; user.rewardDebt[pool.debtIndexKey] = 0; } // Safe testa transfer function, just in case if rounding error causes pool to not have enough Testa. function safeTestaTransfer(address _to, uint256 _amount) internal { uint256 testaBal = IERC20(testa).balanceOf(address(this)); if (_amount > testaBal) { testa.call(abi.encodeWithSignature("transfer(address,uint256)", _to, testaBal)); } else { testa.call(abi.encodeWithSignature("transfer(address,uint256)", _to, _amount)); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_testa","type":"address"},{"internalType":"uint256","name":"_testaPerBlock","type":"uint256"},{"internalType":"int256","name":"_maxProgressive","type":"int256"},{"internalType":"int256","name":"_minProgressive","type":"int256"},{"internalType":"uint256","name":"activateAtBlock","type":"uint256"},{"internalType":"address","name":"_priceFeed","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activeReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentLiquidity","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"firstActivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fiveHundred","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getCountDown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getLiquidity","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProgressive","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getStartedBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTestaPoolBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getTestaReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"harvestAndWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxProgressive","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigratorChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minProgressive","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTesta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"contract IUniswapV2Pair","name":"uniswap","type":"address"},{"internalType":"uint112","name":"startLiquidity","type":"uint112"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accTestaPerShare","type":"uint256"},{"internalType":"uint256","name":"debtIndexKey","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"initStartBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceFeed","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"progressive","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_activeReward","type":"uint256"}],"name":"setActiveReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMigratorChef","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfBlock","type":"uint256"}],"name":"setNumberOfBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"_maxProgressive","type":"int256"},{"internalType":"int256","name":"_minProgressive","type":"int256"}],"name":"setProgressive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_testaPerBlock","type":"uint256"}],"name":"setTestaPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startLiquidity","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"testa","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"testaPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thousand","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600755600a60085560286009556032600a556000600b553480156200002a57600080fd5b5060405162004d5e38038062004d5e833981810160405260c08110156200005057600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050506000620000a5620001f460201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506001808190555085600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460038190555083600c8190555082600d8190555081600e8190555080601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050620001fc565b600033905090565b614b52806200020c6000396000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c806386fadfa211610167578063b7f51898116100ce578063ddc6326211610087578063ddc6326214610ac9578063defc107414610af7578063e2bbb15814610b5b578063f2fde38b14610b93578063f8f0975a14610bd7578063fb8fc8d414610c05576102a0565b8063b7f51898146109d5578063b827f556146109f3578063c17a101314610a2b578063caf2f5fe14610a5f578063d48330d814610a7d578063d48c14d514610a9b576102a0565b806393f1a40b1161012057806393f1a40b14610889578063947c3457146108eb578063951583c314610909578063965a89531461095b57806396e3369b14610979578063b260c42a146109a7576102a0565b806386fadfa2146107495780638aa285501461078b5780638b27bace146107a95780638da5cb5b146107eb5780638dbb1e3a1461081f5780638e15f4731461086b576102a0565b80635db134761161020b578063715018a6116101c4578063715018a614610649578063731af93714610653578063741bef1a146106715780637cd07e47146106a557806384d4127f146106d957806385ecc89b1461071b576102a0565b80635db13476146105695780635e446ab71461058757806361d6f78a146105bf57806362c36545146105dd578063630b5ba1146105fb57806364482f7914610605576102a0565b8063370b1cdd1161025d578063370b1cdd14610417578063441a3e7014610479578063454b0608146104b157806346caf2ae146104df57806351eb05a61461050d5780635312ea8e1461053b576102a0565b8063081e3eda146102a55780631526fe27146102c357806317caf6f1146103795780631ce6fbb71461039757806323cf3118146103b557806325901421146103f9575b600080fd5b6102ad610c33565b6040518082815260200191505060405180910390f35b6102ef600480360360208110156102d957600080fd5b8101908080359060200190929190505050610c40565b604051808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001886dffffffffffffffffffffffffffff168152602001878152602001868152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390f35b610381610cf5565b6040518082815260200191505060405180910390f35b61039f610cfb565b6040518082815260200191505060405180910390f35b6103f7600480360360208110156103cb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d01565b005b610401610e0d565b6040518082815260200191505060405180910390f35b6104636004803603604081101561042d57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e13565b6040518082815260200191505060405180910390f35b6104af6004803603604081101561048f57600080fd5b8101908080359060200190929190803590602001909291905050506110a5565b005b6104dd600480360360208110156104c757600080fd5b81019080803590602001909291905050506112d9565b005b6104e7611703565b60405180826dffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105396004803603602081101561052357600080fd5b8101908080359060200190929190505050611723565b005b6105676004803603602081101561055157600080fd5b81019080803590602001909291905050506118e7565b005b610571611a2e565b6040518082815260200191505060405180910390f35b6105bd6004803603604081101561059d57600080fd5b810190808035906020019092919080359060200190929190505050611a34565b005b6105c7611b0e565b6040518082815260200191505060405180910390f35b6105e5611b16565b6040518082815260200191505060405180910390f35b610603611b20565b005b6106476004803603606081101561061b57600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050611b4d565b005b610651611c97565b005b61065b611e1d565b6040518082815260200191505060405180910390f35b610679611e23565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106ad611e49565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610705600480360360208110156106ef57600080fd5b8101908080359060200190929190505050611e6f565b6040518082815260200191505060405180910390f35b6107476004803603602081101561073157600080fd5b8101908080359060200190929190505050611e9c565b005b6107756004803603602081101561075f57600080fd5b8101908080359060200190929190505050611f6e565b6040518082815260200191505060405180910390f35b610793611fb4565b6040518082815260200191505060405180910390f35b6107d5600480360360208110156107bf57600080fd5b8101908080359060200190929190505050611fb9565b6040518082815260200191505060405180910390f35b6107f36121a1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108556004803603604081101561083557600080fd5b8101908080359060200190929190803590602001909291905050506121ca565b6040518082815260200191505060405180910390f35b6108736121e7565b6040518082815260200191505060405180910390f35b6108d56004803603604081101561089f57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612346565b6040518082815260200191505060405180910390f35b6108f3612371565b6040518082815260200191505060405180910390f35b6109356004803603602081101561091f57600080fd5b8101908080359060200190929190505050612377565b60405180826dffffffffffffffffffffffffffff16815260200191505060405180910390f35b610963612460565b6040518082815260200191505060405180910390f35b610981612466565b60405180826dffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109d3600480360360208110156109bd57600080fd5b8101908080359060200190929190505050612486565b005b6109dd6127c8565b6040518082815260200191505060405180910390f35b610a2960048036036040811015610a0957600080fd5b810190808035906020019092919080359060200190929190505050612893565b005b610a33612cba565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a67612ce0565b6040518082815260200191505060405180910390f35b610a85612ce6565b6040518082815260200191505060405180910390f35b610ac760048036036020811015610ab157600080fd5b8101908080359060200190929190505050612cec565b005b610af560048036036020811015610adf57600080fd5b8101908080359060200190929190505050612dbe565b005b610b5960048036036080811015610b0d57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061311d565b005b610b9160048036036040811015610b7157600080fd5b81019080803590602001909291908035906020019092919050505061347c565b005b610bd560048036036020811015610ba957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061364e565b005b610c0360048036036020811015610bed57600080fd5b8101908080359060200190929190505050613859565b005b610c3160048036036020811015610c1b57600080fd5b810190808035906020019092919050505061392b565b005b6000600580549050905090565b60058181548110610c4d57fe5b90600052602060002090600902016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a90046dffffffffffffffffffffffffffff16908060030154908060040154908060050154908060060154908060070154908060080154905089565b60075481565b600e5481565b610d09613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b60008060058481548110610e2357fe5b9060005260206000209060090201905060006006600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260050154905060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f1d57600080fd5b505afa158015610f31573d6000803e3d6000fd5b505050506040513d6020811015610f4757600080fd5b81019080805190602001909291905050509050836004015443118015610f6e575060008114155b1561100c576000610f838560040154436121ca565b90506000610fc6600754610fb88860030154610faa60035487613ba990919063ffffffff16565b613ba990919063ffffffff16565b613c2f90919063ffffffff16565b9050611007610ff884610fea670de0b6b3a764000085613ba990919063ffffffff16565b613c2f90919063ffffffff16565b85613c7990919063ffffffff16565b935050505b600083600201600086600601548152602001908152602001600020549050611098846001016000876006015481526020019081526020016000205461108a8361107c670de0b6b3a764000061106e898b60000154613ba990919063ffffffff16565b613c2f90919063ffffffff16565b613d0190919063ffffffff16565b613c7990919063ffffffff16565b9550505050505092915050565b6000600583815481106110b457fe5b9060005260206000209060090201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e6f206c70546f6b656e2063616e6e6f7420776974686472617700000000000081525060200191505060405180910390fd5b61119b84611723565b6000831115611213576111bb838260000154613d0190919063ffffffff16565b816000018190555061121233848460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d4b9092919063ffffffff16565b5b611248670de0b6b3a764000061123a84600501548460000154613ba990919063ffffffff16565b613c2f90919063ffffffff16565b816002016000846006015481526020019081526020016000208190555060008160010160008460060154815260200190815260200160002081905550833373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568856040518082815260200191505060405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561139e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6d6967726174653a206e6f206d69677261746f7200000000000000000000000081525060200191505060405180910390fd5b6000600582815481106113ad57fe5b9060005260206000209060090201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561144f57600080fd5b505afa158015611463573d6000803e3d6000fd5b505050506040513d602081101561147957600080fd5b810190808051906020019092919050505090506114d9600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613ded9092919063ffffffff16565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ce5494bb846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561156657600080fd5b505af115801561157a573d6000803e3d6000fd5b505050506040513d602081101561159057600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561160a57600080fd5b505afa15801561161e573d6000803e3d6000fd5b505050506040513d602081101561163457600080fd5b810190808051906020019092919050505082146116b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6d6967726174653a20626164000000000000000000000000000000000000000081525060200191505060405180910390fd5b808460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b600f600e9054906101000a90046dffffffffffffffffffffffffffff1681565b60006005828154811061173257fe5b906000526020600020906009020190508060040154431161175357506118e4565b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117e057600080fd5b505afa1580156117f4573d6000803e3d6000fd5b505050506040513d602081101561180a57600080fd5b8101908080519060200190929190505050905060008114156118365743826004018190555050506118e4565b60006118468360040154436121ca565b9050600061188960075461187b866003015461186d60035487613ba990919063ffffffff16565b613ba990919063ffffffff16565b613c2f90919063ffffffff16565b90506118ce6118bb846118ad670de0b6b3a764000085613ba990919063ffffffff16565b613c2f90919063ffffffff16565b8560050154613c7990919063ffffffff16565b8460050181905550438460040181905550505050505b50565b6000600582815481106118f657fe5b9060005260206000209060090201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506119ad3382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d4b9092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040518082815260200191505060405180910390a36000816000018190555060008160020160008460060154815260200190815260200160002081905550505050565b600a5481565b611a3c613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611afc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600c8190555080600d819055505050565b600043905090565b6000600b54905090565b6000600580549050905060005b81811015611b4957611b3e81611723565b806001019050611b2d565b5050565b611b55613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c15576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8015611c2457611c23611b20565b5b611c6982611c5b60058681548110611c3857fe5b906000526020600020906009020160030154600754613d0190919063ffffffff16565b613c7990919063ffffffff16565b6007819055508160058481548110611c7d57fe5b906000526020600020906009020160030181905550505050565b611c9f613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d5f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060058381548110611e7f57fe5b906000526020600020906009020190508060070154915050919050565b611ea4613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060088190555050565b6000611f7982611e6f565b611f81611b0e565b11611f8b57600080fd5b611fad611f9783611e6f565b611f9f611b0e565b613d0190919063ffffffff16565b9050919050565b600a81565b60008060058381548110611fc957fe5b906000526020600020906009020190506000808260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561204657600080fd5b505afa15801561205a573d6000803e3d6000fd5b505050506040513d606081101561207057600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050509150915060006120e9826dffffffffffffffffffffffffffff166120db670de0b6b3a7640000866dffffffffffffffffffffffffffff16613ba990919063ffffffff16565b613c2f90919063ffffffff16565b9050600061210c6402540be4006120fe6121e7565b613ba990919063ffffffff16565b9050600061213d8361212f670de0b6b3a764000085613ba990919063ffffffff16565b613c2f90919063ffffffff16565b9050600061215e670de0b6b3a7640000600854613ba990919063ffffffff16565b9050600061218f83612181670de0b6b3a764000085613ba990919063ffffffff16565b613c2f90919063ffffffff16565b90508098505050505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006121df8383613d0190919063ffffffff16565b905092915050565b600080600080600080601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561225857600080fd5b505afa15801561226c573d6000803e3d6000fd5b505050506040513d60a081101561228257600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050945094509450945094506000821161233b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f526f756e64206e6f7420636f6d706c657465000000000000000000000000000081525060200191505060405180910390fd5b839550505050505090565b6006602052816000526040600020602052806000526040600020600091509150508060000154905081565b60085481565b6000806005838154811061238757fe5b9060005260206000209060090201905060008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561240357600080fd5b505afa158015612417573d6000803e3d6000fd5b505050506040513d606081101561242d57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050509150508092505050919050565b60035481565b600f60009054906101000a90046dffffffffffffffffffffffffffff1681565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260078152602001807f4e6f7420454f410000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600180600082825401925050819055506000600154905061254782612377565b600f600e6101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff16021790555060006005838154811061258a57fe5b906000526020600020906009020190508060070154816008015414156125af57600080fd5b600e546125bb84611f6e565b1015612612576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180614ae96034913960400191505060405180910390fd5b8060020160009054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16600f600e9054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16111561268b57600b6000815480929190600101919050555061269f565b600b60008154809291906001900391905055505b600d54600b54136126c157600d54600b819055506126bc83613fb2565b6126d7565b600c54600b54126126d657600c54600b819055505b5b6126df611b0e565b8160070181905550600f600e9054906101000a90046dffffffffffffffffffffffffffff168160020160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff16021790555061274c3361274785611fb9565b613ffc565b5060015481146127c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561285357600080fd5b505afa158015612867573d6000803e3d6000fd5b505050506040513d602081101561287d57600080fd5b8101908080519060200190929190505050905090565b60018060008282540192505081905550600060015490506000600584815481106128b957fe5b9060005260206000209060090201905060006006600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156129aa57600080fd5b505afa1580156129be573d6000803e3d6000fd5b505050506040513d60208110156129d457600080fd5b81019080805190602001909291905050509050600e546129f387611f6e565b11156129fe57600080fd5b600c54600b54148015612a12575060008114155b612a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180614a536036913960400191505060405180910390fd5b8482600001541015612ae1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e6f206c70546f6b656e2063616e6e6f7420776974686472617700000000000081525060200191505060405180910390fd5b612aea86611723565b6000612af68733610e13565b90506000861115612beb57612b18868460000154613d0190919063ffffffff16565b8360000181905550612b55670de0b6b3a7640000612b4786600501548660000154613ba990919063ffffffff16565b613c2f90919063ffffffff16565b836002016000866006015481526020019081526020016000208190555060008360010160008660060154815260200190815260200160002081905550612be033878660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d4b9092919063ffffffff16565b612bea3382613ffc565b5b863373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568886040518082815260200191505060405180910390a3505050506001548114612cb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b600d5481565b612cf4613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612db4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060038190555050565b6001806000828254019250508190555060006001549050600060058381548110612de457fe5b9060005260206000209060090201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ed557600080fd5b505afa158015612ee9573d6000803e3d6000fd5b505050506040513d6020811015612eff57600080fd5b81019080805190602001909291905050509050600e54612f1e86611f6e565b1115612f2957600080fd5b600c54600b54148015612f3d575060008114155b612f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180614a536036913960400191505060405180910390fd5b600082600001541161300c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e6f206c70546f6b656e2063616e6e6f7420776974686472617700000000000081525060200191505060405180910390fd5b61301585611723565b60006130218633610e13565b9050613058670de0b6b3a764000061304a86600501548660000154613ba990919063ffffffff16565b613c2f90919063ffffffff16565b83600201600086600601548152602001908152602001600020819055506000836001016000866006015481526020019081526020016000208190555061309e3382613ffc565b505050506001548114613119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b613125613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146131e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80156131f4576131f3611b20565b5b60008443116132035784613205565b435b905061321c84600754613c7990919063ffffffff16565b600781905550600083905060008173ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561326f57600080fd5b505afa158015613283573d6000803e3d6000fd5b505050506040513d606081101561329957600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050505091505060056040518061012001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001836dffffffffffffffffffffffffffff168152602001888152602001858152602001600081526020016000815260200189815260200189815250908060018154018082558091505060019003906000526020600020906009020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155505050505050505050565b60006005838154811061348b57fe5b9060005260206000209060090201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506134f884611723565b60008160000154111561352d5761350f8433610e13565b81600101600084600601548152602001908152602001600020819055505b60008311156135a7576135873330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166143db909392919063ffffffff16565b61359e838260000154613c7990919063ffffffff16565b81600001819055505b6135dc670de0b6b3a76400006135ce84600501548460000154613ba990919063ffffffff16565b613c2f90919063ffffffff16565b8160020160008460060154815260200190815260200160002081905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b613656613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613716576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561379c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149b26026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b613861613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613921576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600e8190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146139cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260078152602001807f4e6f7420454f410000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018060008282540192505081905550600060015490506139ec82612377565b600f600e6101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550600060058381548110613a2f57fe5b906000526020600020906009020190508060070154816008015414613a5357600080fd5b8060080154431015613ab0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806149d86034913960400191505060405180910390fd5b613ab8611b0e565b8160070181905550600f600e9054906101000a90046dffffffffffffffffffffffffffff168160020160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550613b2533613b2085611fb9565b613ffc565b506001548114613b9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b600033905090565b600080831415613bbc5760009050613c29565b6000828402905082848281613bcd57fe5b0414613c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614a326021913960400191505060405180910390fd5b809150505b92915050565b6000613c7183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061449c565b905092915050565b600080828401905083811015613cf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000613d4383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614562565b905092915050565b613de88363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614622565b505050565b6000811480613ebb575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015613e7e57600080fd5b505afa158015613e92573d6000803e3d6000fd5b505050506040513d6020811015613ea857600080fd5b8101908080519060200190929190505050145b613f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180614ab36036913960400191505060405180910390fd5b613fad8363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614622565b505050565b600060058281548110613fc157fe5b906000526020600020906009020190506000816005018190555043816004018190555080600601600081548092919060010191905055505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561408757600080fd5b505afa15801561409b573d6000803e3d6000fd5b505050506040513d60208110156140b157600080fd5b810190808051906020019092919050505090508082111561425357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168382604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106141e457805182526020820191506020810190506020830392506141c1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614246576040519150601f19603f3d011682016040523d82523d6000602084013e61424b565b606091505b5050506143d6565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168383604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b6020831061436b5780518252602082019150602081019050602083039250614348565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146143cd576040519150601f19603f3d011682016040523d82523d6000602084013e6143d2565b606091505b5050505b505050565b614496846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614622565b50505050565b60008083118290614548576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561450d5780820151818401526020810190506144f2565b50505050905090810190601f16801561453a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161455457fe5b049050809150509392505050565b600083831115829061460f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145d45780820151818401526020810190506145b9565b50505050905090810190601f1680156146015780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060614684826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166147119092919063ffffffff16565b905060008151111561470c578080602001905160208110156146a557600080fd5b810190808051906020019092919050505061470b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614a89602a913960400191505060405180910390fd5b5b505050565b60606147208484600085614729565b90509392505050565b606082471015614784576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614a0c6026913960400191505060405180910390fd5b61478d856148d2565b6147ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061484f578051825260208201915060208101905060208303925061482c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146148b1576040519150601f19603f3d011682016040523d82523d6000602084013e6148b6565b606091505b50915091506148c68282866148e5565b92505050949350505050565b600080823b905060008111915050919050565b606083156148f5578290506149aa565b6000835111156149085782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561496f578082015181840152602081019050614954565b50505050905090810190601f16801561499c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737343616e6e6f7420616374697661746520756e74696c2074686520737065636966696320626c6f636b2074696d6520617272697665416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d7573742068617665206c70537570706c7920616e64207265616368206d617850726f677265737369766520746f20686172766573745361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636543616e6e6f7420616374697661746520756e74696c20737065636966696320616d6f756e74206f6620626c6f636b732070617373a2646970667358221220bd82ce4191b2f74e53f3ff3af6ca77e60c1c9cd53091cb3e198d06cf73e39f0964736f6c634300060c00330000000000000000000000001da65b1868e2d36d06d7a44dbd2be98e49e1f7f9000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000003fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd00000000000000000000000000000000000000000000000000000000000013880000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a05760003560e01c806386fadfa211610167578063b7f51898116100ce578063ddc6326211610087578063ddc6326214610ac9578063defc107414610af7578063e2bbb15814610b5b578063f2fde38b14610b93578063f8f0975a14610bd7578063fb8fc8d414610c05576102a0565b8063b7f51898146109d5578063b827f556146109f3578063c17a101314610a2b578063caf2f5fe14610a5f578063d48330d814610a7d578063d48c14d514610a9b576102a0565b806393f1a40b1161012057806393f1a40b14610889578063947c3457146108eb578063951583c314610909578063965a89531461095b57806396e3369b14610979578063b260c42a146109a7576102a0565b806386fadfa2146107495780638aa285501461078b5780638b27bace146107a95780638da5cb5b146107eb5780638dbb1e3a1461081f5780638e15f4731461086b576102a0565b80635db134761161020b578063715018a6116101c4578063715018a614610649578063731af93714610653578063741bef1a146106715780637cd07e47146106a557806384d4127f146106d957806385ecc89b1461071b576102a0565b80635db13476146105695780635e446ab71461058757806361d6f78a146105bf57806362c36545146105dd578063630b5ba1146105fb57806364482f7914610605576102a0565b8063370b1cdd1161025d578063370b1cdd14610417578063441a3e7014610479578063454b0608146104b157806346caf2ae146104df57806351eb05a61461050d5780635312ea8e1461053b576102a0565b8063081e3eda146102a55780631526fe27146102c357806317caf6f1146103795780631ce6fbb71461039757806323cf3118146103b557806325901421146103f9575b600080fd5b6102ad610c33565b6040518082815260200191505060405180910390f35b6102ef600480360360208110156102d957600080fd5b8101908080359060200190929190505050610c40565b604051808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001886dffffffffffffffffffffffffffff168152602001878152602001868152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390f35b610381610cf5565b6040518082815260200191505060405180910390f35b61039f610cfb565b6040518082815260200191505060405180910390f35b6103f7600480360360208110156103cb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d01565b005b610401610e0d565b6040518082815260200191505060405180910390f35b6104636004803603604081101561042d57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e13565b6040518082815260200191505060405180910390f35b6104af6004803603604081101561048f57600080fd5b8101908080359060200190929190803590602001909291905050506110a5565b005b6104dd600480360360208110156104c757600080fd5b81019080803590602001909291905050506112d9565b005b6104e7611703565b60405180826dffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105396004803603602081101561052357600080fd5b8101908080359060200190929190505050611723565b005b6105676004803603602081101561055157600080fd5b81019080803590602001909291905050506118e7565b005b610571611a2e565b6040518082815260200191505060405180910390f35b6105bd6004803603604081101561059d57600080fd5b810190808035906020019092919080359060200190929190505050611a34565b005b6105c7611b0e565b6040518082815260200191505060405180910390f35b6105e5611b16565b6040518082815260200191505060405180910390f35b610603611b20565b005b6106476004803603606081101561061b57600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050611b4d565b005b610651611c97565b005b61065b611e1d565b6040518082815260200191505060405180910390f35b610679611e23565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106ad611e49565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610705600480360360208110156106ef57600080fd5b8101908080359060200190929190505050611e6f565b6040518082815260200191505060405180910390f35b6107476004803603602081101561073157600080fd5b8101908080359060200190929190505050611e9c565b005b6107756004803603602081101561075f57600080fd5b8101908080359060200190929190505050611f6e565b6040518082815260200191505060405180910390f35b610793611fb4565b6040518082815260200191505060405180910390f35b6107d5600480360360208110156107bf57600080fd5b8101908080359060200190929190505050611fb9565b6040518082815260200191505060405180910390f35b6107f36121a1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108556004803603604081101561083557600080fd5b8101908080359060200190929190803590602001909291905050506121ca565b6040518082815260200191505060405180910390f35b6108736121e7565b6040518082815260200191505060405180910390f35b6108d56004803603604081101561089f57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612346565b6040518082815260200191505060405180910390f35b6108f3612371565b6040518082815260200191505060405180910390f35b6109356004803603602081101561091f57600080fd5b8101908080359060200190929190505050612377565b60405180826dffffffffffffffffffffffffffff16815260200191505060405180910390f35b610963612460565b6040518082815260200191505060405180910390f35b610981612466565b60405180826dffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109d3600480360360208110156109bd57600080fd5b8101908080359060200190929190505050612486565b005b6109dd6127c8565b6040518082815260200191505060405180910390f35b610a2960048036036040811015610a0957600080fd5b810190808035906020019092919080359060200190929190505050612893565b005b610a33612cba565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a67612ce0565b6040518082815260200191505060405180910390f35b610a85612ce6565b6040518082815260200191505060405180910390f35b610ac760048036036020811015610ab157600080fd5b8101908080359060200190929190505050612cec565b005b610af560048036036020811015610adf57600080fd5b8101908080359060200190929190505050612dbe565b005b610b5960048036036080811015610b0d57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061311d565b005b610b9160048036036040811015610b7157600080fd5b81019080803590602001909291908035906020019092919050505061347c565b005b610bd560048036036020811015610ba957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061364e565b005b610c0360048036036020811015610bed57600080fd5b8101908080359060200190929190505050613859565b005b610c3160048036036020811015610c1b57600080fd5b810190808035906020019092919050505061392b565b005b6000600580549050905090565b60058181548110610c4d57fe5b90600052602060002090600902016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a90046dffffffffffffffffffffffffffff16908060030154908060040154908060050154908060060154908060070154908060080154905089565b60075481565b600e5481565b610d09613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b60008060058481548110610e2357fe5b9060005260206000209060090201905060006006600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260050154905060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f1d57600080fd5b505afa158015610f31573d6000803e3d6000fd5b505050506040513d6020811015610f4757600080fd5b81019080805190602001909291905050509050836004015443118015610f6e575060008114155b1561100c576000610f838560040154436121ca565b90506000610fc6600754610fb88860030154610faa60035487613ba990919063ffffffff16565b613ba990919063ffffffff16565b613c2f90919063ffffffff16565b9050611007610ff884610fea670de0b6b3a764000085613ba990919063ffffffff16565b613c2f90919063ffffffff16565b85613c7990919063ffffffff16565b935050505b600083600201600086600601548152602001908152602001600020549050611098846001016000876006015481526020019081526020016000205461108a8361107c670de0b6b3a764000061106e898b60000154613ba990919063ffffffff16565b613c2f90919063ffffffff16565b613d0190919063ffffffff16565b613c7990919063ffffffff16565b9550505050505092915050565b6000600583815481106110b457fe5b9060005260206000209060090201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e6f206c70546f6b656e2063616e6e6f7420776974686472617700000000000081525060200191505060405180910390fd5b61119b84611723565b6000831115611213576111bb838260000154613d0190919063ffffffff16565b816000018190555061121233848460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d4b9092919063ffffffff16565b5b611248670de0b6b3a764000061123a84600501548460000154613ba990919063ffffffff16565b613c2f90919063ffffffff16565b816002016000846006015481526020019081526020016000208190555060008160010160008460060154815260200190815260200160002081905550833373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568856040518082815260200191505060405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561139e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6d6967726174653a206e6f206d69677261746f7200000000000000000000000081525060200191505060405180910390fd5b6000600582815481106113ad57fe5b9060005260206000209060090201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561144f57600080fd5b505afa158015611463573d6000803e3d6000fd5b505050506040513d602081101561147957600080fd5b810190808051906020019092919050505090506114d9600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613ded9092919063ffffffff16565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ce5494bb846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561156657600080fd5b505af115801561157a573d6000803e3d6000fd5b505050506040513d602081101561159057600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561160a57600080fd5b505afa15801561161e573d6000803e3d6000fd5b505050506040513d602081101561163457600080fd5b810190808051906020019092919050505082146116b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6d6967726174653a20626164000000000000000000000000000000000000000081525060200191505060405180910390fd5b808460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b600f600e9054906101000a90046dffffffffffffffffffffffffffff1681565b60006005828154811061173257fe5b906000526020600020906009020190508060040154431161175357506118e4565b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117e057600080fd5b505afa1580156117f4573d6000803e3d6000fd5b505050506040513d602081101561180a57600080fd5b8101908080519060200190929190505050905060008114156118365743826004018190555050506118e4565b60006118468360040154436121ca565b9050600061188960075461187b866003015461186d60035487613ba990919063ffffffff16565b613ba990919063ffffffff16565b613c2f90919063ffffffff16565b90506118ce6118bb846118ad670de0b6b3a764000085613ba990919063ffffffff16565b613c2f90919063ffffffff16565b8560050154613c7990919063ffffffff16565b8460050181905550438460040181905550505050505b50565b6000600582815481106118f657fe5b9060005260206000209060090201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506119ad3382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d4b9092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040518082815260200191505060405180910390a36000816000018190555060008160020160008460060154815260200190815260200160002081905550505050565b600a5481565b611a3c613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611afc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600c8190555080600d819055505050565b600043905090565b6000600b54905090565b6000600580549050905060005b81811015611b4957611b3e81611723565b806001019050611b2d565b5050565b611b55613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c15576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8015611c2457611c23611b20565b5b611c6982611c5b60058681548110611c3857fe5b906000526020600020906009020160030154600754613d0190919063ffffffff16565b613c7990919063ffffffff16565b6007819055508160058481548110611c7d57fe5b906000526020600020906009020160030181905550505050565b611c9f613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d5f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060058381548110611e7f57fe5b906000526020600020906009020190508060070154915050919050565b611ea4613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060088190555050565b6000611f7982611e6f565b611f81611b0e565b11611f8b57600080fd5b611fad611f9783611e6f565b611f9f611b0e565b613d0190919063ffffffff16565b9050919050565b600a81565b60008060058381548110611fc957fe5b906000526020600020906009020190506000808260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561204657600080fd5b505afa15801561205a573d6000803e3d6000fd5b505050506040513d606081101561207057600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050509150915060006120e9826dffffffffffffffffffffffffffff166120db670de0b6b3a7640000866dffffffffffffffffffffffffffff16613ba990919063ffffffff16565b613c2f90919063ffffffff16565b9050600061210c6402540be4006120fe6121e7565b613ba990919063ffffffff16565b9050600061213d8361212f670de0b6b3a764000085613ba990919063ffffffff16565b613c2f90919063ffffffff16565b9050600061215e670de0b6b3a7640000600854613ba990919063ffffffff16565b9050600061218f83612181670de0b6b3a764000085613ba990919063ffffffff16565b613c2f90919063ffffffff16565b90508098505050505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006121df8383613d0190919063ffffffff16565b905092915050565b600080600080600080601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561225857600080fd5b505afa15801561226c573d6000803e3d6000fd5b505050506040513d60a081101561228257600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050945094509450945094506000821161233b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f526f756e64206e6f7420636f6d706c657465000000000000000000000000000081525060200191505060405180910390fd5b839550505050505090565b6006602052816000526040600020602052806000526040600020600091509150508060000154905081565b60085481565b6000806005838154811061238757fe5b9060005260206000209060090201905060008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561240357600080fd5b505afa158015612417573d6000803e3d6000fd5b505050506040513d606081101561242d57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050509150508092505050919050565b60035481565b600f60009054906101000a90046dffffffffffffffffffffffffffff1681565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260078152602001807f4e6f7420454f410000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600180600082825401925050819055506000600154905061254782612377565b600f600e6101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff16021790555060006005838154811061258a57fe5b906000526020600020906009020190508060070154816008015414156125af57600080fd5b600e546125bb84611f6e565b1015612612576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180614ae96034913960400191505060405180910390fd5b8060020160009054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16600f600e9054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16111561268b57600b6000815480929190600101919050555061269f565b600b60008154809291906001900391905055505b600d54600b54136126c157600d54600b819055506126bc83613fb2565b6126d7565b600c54600b54126126d657600c54600b819055505b5b6126df611b0e565b8160070181905550600f600e9054906101000a90046dffffffffffffffffffffffffffff168160020160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff16021790555061274c3361274785611fb9565b613ffc565b5060015481146127c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561285357600080fd5b505afa158015612867573d6000803e3d6000fd5b505050506040513d602081101561287d57600080fd5b8101908080519060200190929190505050905090565b60018060008282540192505081905550600060015490506000600584815481106128b957fe5b9060005260206000209060090201905060006006600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156129aa57600080fd5b505afa1580156129be573d6000803e3d6000fd5b505050506040513d60208110156129d457600080fd5b81019080805190602001909291905050509050600e546129f387611f6e565b11156129fe57600080fd5b600c54600b54148015612a12575060008114155b612a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180614a536036913960400191505060405180910390fd5b8482600001541015612ae1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e6f206c70546f6b656e2063616e6e6f7420776974686472617700000000000081525060200191505060405180910390fd5b612aea86611723565b6000612af68733610e13565b90506000861115612beb57612b18868460000154613d0190919063ffffffff16565b8360000181905550612b55670de0b6b3a7640000612b4786600501548660000154613ba990919063ffffffff16565b613c2f90919063ffffffff16565b836002016000866006015481526020019081526020016000208190555060008360010160008660060154815260200190815260200160002081905550612be033878660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d4b9092919063ffffffff16565b612bea3382613ffc565b5b863373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568886040518082815260200191505060405180910390a3505050506001548114612cb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b600d5481565b612cf4613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612db4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060038190555050565b6001806000828254019250508190555060006001549050600060058381548110612de457fe5b9060005260206000209060090201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ed557600080fd5b505afa158015612ee9573d6000803e3d6000fd5b505050506040513d6020811015612eff57600080fd5b81019080805190602001909291905050509050600e54612f1e86611f6e565b1115612f2957600080fd5b600c54600b54148015612f3d575060008114155b612f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180614a536036913960400191505060405180910390fd5b600082600001541161300c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e6f206c70546f6b656e2063616e6e6f7420776974686472617700000000000081525060200191505060405180910390fd5b61301585611723565b60006130218633610e13565b9050613058670de0b6b3a764000061304a86600501548660000154613ba990919063ffffffff16565b613c2f90919063ffffffff16565b83600201600086600601548152602001908152602001600020819055506000836001016000866006015481526020019081526020016000208190555061309e3382613ffc565b505050506001548114613119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b613125613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146131e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80156131f4576131f3611b20565b5b60008443116132035784613205565b435b905061321c84600754613c7990919063ffffffff16565b600781905550600083905060008173ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561326f57600080fd5b505afa158015613283573d6000803e3d6000fd5b505050506040513d606081101561329957600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050505091505060056040518061012001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001836dffffffffffffffffffffffffffff168152602001888152602001858152602001600081526020016000815260200189815260200189815250908060018154018082558091505060019003906000526020600020906009020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155505050505050505050565b60006005838154811061348b57fe5b9060005260206000209060090201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506134f884611723565b60008160000154111561352d5761350f8433610e13565b81600101600084600601548152602001908152602001600020819055505b60008311156135a7576135873330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166143db909392919063ffffffff16565b61359e838260000154613c7990919063ffffffff16565b81600001819055505b6135dc670de0b6b3a76400006135ce84600501548460000154613ba990919063ffffffff16565b613c2f90919063ffffffff16565b8160020160008460060154815260200190815260200160002081905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b613656613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613716576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561379c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149b26026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b613861613ba1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613921576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600e8190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146139cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260078152602001807f4e6f7420454f410000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018060008282540192505081905550600060015490506139ec82612377565b600f600e6101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550600060058381548110613a2f57fe5b906000526020600020906009020190508060070154816008015414613a5357600080fd5b8060080154431015613ab0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806149d86034913960400191505060405180910390fd5b613ab8611b0e565b8160070181905550600f600e9054906101000a90046dffffffffffffffffffffffffffff168160020160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550613b2533613b2085611fb9565b613ffc565b506001548114613b9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b600033905090565b600080831415613bbc5760009050613c29565b6000828402905082848281613bcd57fe5b0414613c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614a326021913960400191505060405180910390fd5b809150505b92915050565b6000613c7183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061449c565b905092915050565b600080828401905083811015613cf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000613d4383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614562565b905092915050565b613de88363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614622565b505050565b6000811480613ebb575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015613e7e57600080fd5b505afa158015613e92573d6000803e3d6000fd5b505050506040513d6020811015613ea857600080fd5b8101908080519060200190929190505050145b613f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180614ab36036913960400191505060405180910390fd5b613fad8363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614622565b505050565b600060058281548110613fc157fe5b906000526020600020906009020190506000816005018190555043816004018190555080600601600081548092919060010191905055505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561408757600080fd5b505afa15801561409b573d6000803e3d6000fd5b505050506040513d60208110156140b157600080fd5b810190808051906020019092919050505090508082111561425357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168382604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106141e457805182526020820191506020810190506020830392506141c1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614246576040519150601f19603f3d011682016040523d82523d6000602084013e61424b565b606091505b5050506143d6565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168383604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b6020831061436b5780518252602082019150602081019050602083039250614348565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146143cd576040519150601f19603f3d011682016040523d82523d6000602084013e6143d2565b606091505b5050505b505050565b614496846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614622565b50505050565b60008083118290614548576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561450d5780820151818401526020810190506144f2565b50505050905090810190601f16801561453a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161455457fe5b049050809150509392505050565b600083831115829061460f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145d45780820151818401526020810190506145b9565b50505050905090810190601f1680156146015780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060614684826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166147119092919063ffffffff16565b905060008151111561470c578080602001905160208110156146a557600080fd5b810190808051906020019092919050505061470b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614a89602a913960400191505060405180910390fd5b5b505050565b60606147208484600085614729565b90509392505050565b606082471015614784576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614a0c6026913960400191505060405180910390fd5b61478d856148d2565b6147ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061484f578051825260208201915060208101905060208303925061482c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146148b1576040519150601f19603f3d011682016040523d82523d6000602084013e6148b6565b606091505b50915091506148c68282866148e5565b92505050949350505050565b600080823b905060008111915050919050565b606083156148f5578290506149aa565b6000835111156149085782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561496f578082015181840152602081019050614954565b50505050905090810190601f16801561499c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737343616e6e6f7420616374697661746520756e74696c2074686520737065636966696320626c6f636b2074696d6520617272697665416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d7573742068617665206c70537570706c7920616e64207265616368206d617850726f677265737369766520746f20686172766573745361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636543616e6e6f7420616374697661746520756e74696c20737065636966696320616d6f756e74206f6620626c6f636b732070617373a2646970667358221220bd82ce4191b2f74e53f3ff3af6ca77e60c1c9cd53091cb3e198d06cf73e39f0964736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001da65b1868e2d36d06d7a44dbd2be98e49e1f7f9000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000003fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd00000000000000000000000000000000000000000000000000000000000013880000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
-----Decoded View---------------
Arg [0] : _testa (address): 0x1da65B1868e2d36d06d7A44DBD2Be98e49E1f7f9
Arg [1] : _testaPerBlock (uint256): 100000000000000000
Arg [2] : _maxProgressive (int256): 3
Arg [3] : _minProgressive (int256): -3
Arg [4] : activateAtBlock (uint256): 5000
Arg [5] : _priceFeed (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000001da65b1868e2d36d06d7a44dbd2be98e49e1f7f9
Arg [1] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [3] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd
Arg [4] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [5] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Deployed Bytecode Sourcemap
36433:15900:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45238:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37808:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38051:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38301:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46843:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38237:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48043:869;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50734:642;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47068:491;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38372:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49251:690;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51447:375;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38169:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39491:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43524:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43424:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48995:180;;;:::i;:::-;;46463:304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30202:148;;;:::i;:::-;;38204:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38410:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37743:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;43832:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39798:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43630:194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37593:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44631:595;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29560:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47635:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44223:400;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37890:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38092:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44002:213;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37510:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38336:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42340:940;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43288:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39917:1056;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37443:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38131:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38269:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39368:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40981:787;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45502:864;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50010:673;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30505:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39675:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41780:552;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45238:95;45283:7;45310:8;:15;;;;45303:22;;45238:95;:::o;37808:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38051:34::-;;;;:::o;38301:28::-;;;;:::o;46843:102::-;29782:12;:10;:12::i;:::-;29772:22;;:6;;;;;;;;;;:22;;;29764:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46928:9:::1;46917:8;;:20;;;;;;;;;;;;;;;;;;46843:102:::0;:::o;38237:25::-;;;;:::o;48043:869::-;48115:7;48135:21;48159:8;48168:4;48159:14;;;;;;;;;;;;;;;;;;48135:38;;48184:21;48208:8;:14;48217:4;48208:14;;;;;;;;;;;:21;48223:5;48208:21;;;;;;;;;;;;;;;48184:45;;48240:24;48267:4;:21;;;48240:48;;48299:16;48318:4;:12;;;;;;;;;;;;:22;;;48349:4;48318:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48299:56;;48385:4;:20;;;48370:12;:35;:52;;;;;48421:1;48409:8;:13;;48370:52;48366:354;;;48439:18;48460:49;48474:4;:20;;;48496:12;48460:13;:49::i;:::-;48439:70;;48524:19;48546:71;48601:15;;48546:50;48580:4;:15;;;48546:29;48561:13;;48546:10;:14;;:29;;;;:::i;:::-;:33;;:50;;;;:::i;:::-;:54;;:71;;;;:::i;:::-;48524:93;;48651:57;48672:35;48698:8;48672:21;48688:4;48672:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;48651:16;:20;;:57;;;;:::i;:::-;48632:76;;48366:354;;;48730:18;48751:4;:15;;:34;48767:4;:17;;;48751:34;;;;;;;;;;;;48730:55;;48803:101;48867:4;:17;;:36;48885:4;:17;;;48867:36;;;;;;;;;;;;48803:59;48851:10;48803:43;48841:4;48803:33;48819:16;48803:4;:11;;;:15;;:33;;;;:::i;:::-;:37;;:43;;;;:::i;:::-;:47;;:59;;;;:::i;:::-;:63;;:101;;;;:::i;:::-;48796:108;;;;;;;48043:869;;;;:::o;50734:642::-;50801:21;50825:8;50834:4;50825:14;;;;;;;;;;;;;;;;;;50801:38;;50850:21;50874:8;:14;50883:4;50874:14;;;;;;;;;;;:26;50889:10;50874:26;;;;;;;;;;;;;;;50850:50;;50934:7;50919:4;:11;;;:22;;50911:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50983:16;50994:4;50983:10;:16::i;:::-;51033:1;51023:7;:11;51020:151;;;51065:24;51081:7;51065:4;:11;;;:15;;:24;;;;:::i;:::-;51051:4;:11;;:38;;;;51104:55;51138:10;51151:7;51104:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;51020:151;51218:48;51261:4;51218:38;51234:4;:21;;;51218:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;51181:4;:15;;:34;51197:4;:17;;;51181:34;;;;;;;;;;;:85;;;;51316:1;51277:4;:17;;:36;51295:4;:17;;;51277:36;;;;;;;;;;;:40;;;;51354:4;51342:10;51333:35;;;51360:7;51333:35;;;;;;;;;;;;;;;;;;50734:642;;;;:::o;47068:491::-;47154:1;47125:31;;47133:8;;;;;;;;;;;47125:31;;;;47117:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47192:21;47216:8;47225:4;47216:14;;;;;;;;;;;;;;;;;;47192:38;;47241:14;47258:4;:12;;;;;;;;;;;;47241:29;;47281:11;47295:7;:17;;;47321:4;47295:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47281:46;;47338:43;47366:8;;;;;;;;;;;47377:3;47338:7;:19;;;;:43;;;;;:::i;:::-;47392:17;47412:8;;;;;;;;;;;:16;;;47429:7;47412:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47392:45;;47463:10;:20;;;47492:4;47463:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47456:3;:42;47448:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47541:10;47526:4;:12;;;:25;;;;;;;;;;;;;;;;;;47068:491;;;;;:::o;38372:31::-;;;;;;;;;;;;;:::o;49251:690::-;49303:21;49327:8;49336:4;49327:14;;;;;;;;;;;;;;;;;;49303:38;;49372:4;:20;;;49356:12;:36;49352:75;;49409:7;;;49352:75;49437:16;49456:4;:12;;;;;;;;;;;;:22;;;49487:4;49456:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49437:56;;49520:1;49508:8;:13;49504:102;;;49561:12;49538:4;:20;;:35;;;;49588:7;;;;49504:102;49616:18;49637:49;49651:4;:20;;;49673:12;49637:13;:49::i;:::-;49616:70;;49697:19;49719:71;49774:15;;49719:50;49753:4;:15;;;49719:29;49734:13;;49719:10;:14;;:29;;;;:::i;:::-;:33;;:50;;;;:::i;:::-;:54;;:71;;;;:::i;:::-;49697:93;;49825:62;49851:35;49877:8;49851:21;49867:4;49851:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;49825:4;:21;;;:25;;:62;;;;:::i;:::-;49801:4;:21;;:86;;;;49921:12;49898:4;:20;;:35;;;;49251:690;;;;;;:::o;51447:375::-;51506:21;51530:8;51539:4;51530:14;;;;;;;;;;;;;;;;;;51506:38;;51555:21;51579:8;:14;51588:4;51579:14;;;;;;;;;;;:26;51594:10;51579:26;;;;;;;;;;;;;;;51555:50;;51616:59;51650:10;51663:4;:11;;;51616:4;:12;;;;;;;;;;;;:25;;;;:59;;;;;:::i;:::-;51721:4;51709:10;51691:48;;;51727:4;:11;;;51691:48;;;;;;;;;;;;;;;;;;51764:1;51750:4;:11;;:15;;;;51813:1;51776:4;:15;;:34;51792:4;:17;;;51776:34;;;;;;;;;;;:38;;;;51447:375;;;:::o;38169:28::-;;;;:::o;39491:176::-;29782:12;:10;:12::i;:::-;29772:22;;:6;;;;;;;;;;:22;;;29764:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39601:15:::1;39584:14;:32;;;;39644:15;39627:14;:32;;;;39491:176:::0;;:::o;43524:94::-;43571:7;43598:12;43591:19;;43524:94;:::o;43424:88::-;43471:3;43493:11;;43486:18;;43424:88;:::o;48995:180::-;49040:14;49057:8;:15;;;;49040:32;;49088:11;49083:85;49111:6;49105:3;:12;49083:85;;;49141:15;49152:3;49141:10;:15::i;:::-;49119:5;;;;;49083:85;;;;48995:180;:::o;46463:304::-;29782:12;:10;:12::i;:::-;29772:22;;:6;;;;;;;;;;:22;;;29764:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46561:11:::1;46557:61;;;46589:17;:15;:17::i;:::-;46557:61;46646:63;46697:11;46646:46;46666:8;46675:4;46666:14;;;;;;;;;;;;;;;;;;:25;;;46646:15;;:19;;:46;;;;:::i;:::-;:50;;:63;;;;:::i;:::-;46628:15;:81;;;;46748:11;46720:8;46729:4;46720:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;46463:304:::0;;;:::o;30202:148::-;29782:12;:10;:12::i;:::-;29772:22;;:6;;;;;;;;;;:22;;;29764:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30309:1:::1;30272:40;;30293:6;::::0;::::1;;;;;;;;30272:40;;;;;;;;;;;;30340:1;30323:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;30202:148::o:0;38204:26::-;;;;:::o;38410:38::-;;;;;;;;;;;;;:::o;37743:29::-;;;;;;;;;;;;;:::o;43832:158::-;43892:7;43911:21;43935:8;43944:4;43935:14;;;;;;;;;;;;;;;;;;43911:38;;43967:4;:15;;;43960:22;;;43832:158;;;:::o;39798:111::-;29782:12;:10;:12::i;:::-;29772:22;;:6;;;;;;;;;;:22;;;29764:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39888:13:::1;39873:12;:28;;;;39798:111:::0;:::o;43630:194::-;43687:7;43733:21;43749:4;43733:15;:21::i;:::-;43714:16;:14;:16::i;:::-;:40;43706:49;;;;;;43773:43;43794:21;43810:4;43794:15;:21::i;:::-;43773:16;:14;:16::i;:::-;:20;;:43;;;;:::i;:::-;43766:50;;43630:194;;;:::o;37593:45::-;37636:2;37593:45;:::o;44631:595::-;44690:7;44710:21;44734:8;44743:4;44734:14;;;;;;;;;;;;;;;;;;44710:38;;44760:17;44779;44802:4;:12;;;;;;;;;;;;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44759:69;;;;;44839:15;44857:52;44898:9;44890:18;;44857:28;44880:4;44865:9;44857:18;;:22;;:28;;;;:::i;:::-;:32;;:52;;;;:::i;:::-;44839:70;;44920:20;44943:35;44973:4;44951:16;:14;:16::i;:::-;44943:29;;:35;;;;:::i;:::-;44920:58;;44996:22;45021:35;45048:7;45021:22;45038:4;45021:12;:16;;:22;;;;:::i;:::-;:26;;:35;;;;:::i;:::-;44996:60;;45067:21;45091:22;45108:4;45091:12;;:16;;:22;;;;:::i;:::-;45067:46;;45124:19;45146:43;45174:14;45146:23;45164:4;45146:13;:17;;:23;;;;:::i;:::-;:27;;:43;;;;:::i;:::-;45124:65;;45207:11;45200:18;;;;;;;;;;44631:595;;;:::o;29560:79::-;29598:7;29625:6;;;;;;;;;;;29618:13;;29560:79;:::o;47635:121::-;47707:7;47734:14;47742:5;47734:3;:7;;:14;;;;:::i;:::-;47727:21;;47635:121;;;;:::o;44223:400::-;44270:3;44301:14;44331:9;44355:14;44384;44413:22;44449:9;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44286:190;;;;;;;;;;44568:1;44556:9;:13;44548:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44610:5;44603:12;;;;;;;44223:400;:::o;37890:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38092:32::-;;;;:::o;44002:213::-;44059:7;44078:21;44102:8;44111:4;44102:14;;;;;;;;;;;;;;;;;;44078:38;;44131:17;44154:4;:12;;;;;;;;;;;;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44127:53;;;;44198:9;44191:16;;;;44002:213;;;:::o;37510:28::-;;;;:::o;38336:29::-;;;;;;;;;;;;;:::o;42340:940::-;39319:9;39305:23;;:10;:23;;;39297:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35986:1:::1;35969:13:::0;::::1;:18;;;;;;;;;;;35998:20;36021:13;;35998:36;;42430:18:::2;42443:4;42430:12;:18::i;:::-;42411:16;;:37;;;;;;;;;;;;;;;;;;42459:21;42483:8;42492:4;42483:14;;;;;;;;;;;;;;;;;;42459:38;;42549:4;:15;;;42526:4;:19;;;:38;;42518:47;;;::::0;::::2;;42606:13;;42584:18;42597:4;42584:12;:18::i;:::-;:35;;42576:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42719:4;:19;;;;;;;;;;;;42700:38;;:16;;;;;;;;;;;:38;;;42697:126;;;42754:11;;:13;;;;;;;;;;;;;42697:126;;;42798:11;;:13;;;;;;;;;;;;;;42697:126;42865:14;;42850:11;;:29;42847:211;;42909:14;;42895:11;:28;;;;42938:15;42948:4;42938:9;:15::i;:::-;42847:211;;;42988:14;;42973:11;;:29;42970:88;;43032:14;;43018:11;:28;;;;42970:88;42847:211;43086:16;:14;:16::i;:::-;43068:4;:15;;:34;;;;43137:16;;;;;;;;;;;43115:4;:19;;;:38;;;;;;;;;;;;;;;;;;43221:51;43239:10;43251:20;43266:4;43251:14;:20::i;:::-;43221:17;:51::i;:::-;36045:1;36081:13:::1;;36065:12;:29;36057:73;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;39351:1;42340:940:::0;:::o;43288:124::-;43340:7;43373:5;;;;;;;;;;;43366:23;;;43398:4;43366:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43359:45;;43288:124;:::o;39917:1056::-;35986:1;35969:13;;:18;;;;;;;;;;;35998:20;36021:13;;35998:36;;40007:21:::1;40031:8;40040:4;40031:14;;;;;;;;;;;;;;;;;;40007:38;;40056:21;40080:8;:14;40089:4;40080:14;;;;;;;;;;;:26;40095:10;40080:26;;;;;;;;;;;;;;;40056:50;;40117:16;40136:4;:12;;;;;;;;;;;;:22;;;40167:4;40136:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;40117:56;;40216:13;;40194:18;40207:4;40194:12;:18::i;:::-;:35;;40186:44;;;::::0;::::1;;40265:14;;40250:11;;:29;40249:50;;;;;40297:1;40285:8;:13;;40249:50;40241:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40392:7;40377:4;:11;;;:22;;40369:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;40441:16;40452:4;40441:10;:16::i;:::-;40478:19;40500:31;40514:4;40520:10;40500:12;:31::i;:::-;40478:53;;40565:1;40555:7;:11;40552:363;;;40597:24;40613:7;40597:4;:11;;;:15;;:24;;;;:::i;:::-;40583:4;:11;;:38;;;;40673:48;40716:4;40673:38;40689:4;:21;;;40673:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;40636:4;:15;;:34;40652:4;:17;;;40636:34;;;;;;;;;;;:85;;;;40775:1;40736:4;:17;;:36;40754:4;:17;;;40736:36;;;;;;;;;;;:40;;;;40791:55;40825:10;40838:7;40791:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;40861:42;40879:10;40891:11;40861:17;:42::i;:::-;40552:363;40951:4;40939:10;40930:35;;;40957:7;40930:35;;;;;;;;;;;;;;;;;;36045:1;;;;36081:13:::0;;36065:12;:29;36057:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39917:1056;;;:::o;37443:20::-;;;;;;;;;;;;;:::o;38131:31::-;;;;:::o;38269:25::-;;;;:::o;39368:115::-;29782:12;:10;:12::i;:::-;29772:22;;:6;;;;;;;;;;:22;;;29764:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39461:14:::1;39445:13;:30;;;;39368:115:::0;:::o;40981:787::-;35986:1;35969:13;;:18;;;;;;;;;;;35998:20;36021:13;;35998:36;;41043:21:::1;41067:8;41076:4;41067:14;;;;;;;;;;;;;;;;;;41043:38;;41092:21;41116:8;:14;41125:4;41116:14;;;;;;;;;;;:26;41131:10;41116:26;;;;;;;;;;;;;;;41092:50;;41153:16;41172:4;:12;;;;;;;;;;;;:22;;;41203:4;41172:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;41153:56;;41252:13;;41230:18;41243:4;41230:12;:18::i;:::-;:35;;41222:44;;;::::0;::::1;;41301:14;;41286:11;;:29;41285:50;;;;;41333:1;41321:8;:13;;41285:50;41277:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41427:1;41413:4;:11;;;:15;41405:54;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;41470:16;41481:4;41470:10;:16::i;:::-;41507:19;41529:31;41543:4;41549:10;41529:12;:31::i;:::-;41507:53;;41608:48;41651:4;41608:38;41624:4;:21;;;41608:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;41571:4;:15;;:34;41587:4;:17;;;41571:34;;;;;;;;;;;:85;;;;41706:1;41667:4;:17;;:36;41685:4;:17;;;41667:36;;;;;;;;;;;:40;;;;41718:42;41736:10;41748:11;41718:17;:42::i;:::-;36045:1;;;;36081:13:::0;;36065:12;:29;36057:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40981:787;;:::o;45502:864::-;29782:12;:10;:12::i;:::-;29772:22;;:6;;;;;;;;;;:22;;;29764:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45624:11:::1;45620:61;;;45652:17;:15;:17::i;:::-;45620:61;45691:23;45732:10;45717:12;:25;:53;;45760:10;45717:53;;;45745:12;45717:53;45691:79;;45799:32;45819:11;45799:15;;:19;;:32;;;;:::i;:::-;45781:15;:50;;;;45842:22;45882:8;45842:49;;45906:17;45929:7;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45902:48;;;;45972:8;45986:359;;;;;;;;46026:8;45986:359;;;;;;46208:7;45986:359;;;;;;46246:9;45986:359;;;;;;46062:11;45986:359;;;;46105:15;45986:359;;;;46153:1;45986:359;;;;46183:1;45986:359;;;;46282:10;45986:359;;;;46323:10;45986:359;;::::0;45972:374:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29842:1;;;45502:864:::0;;;;:::o;50010:673::-;50076:21;50100:8;50109:4;50100:14;;;;;;;;;;;;;;;;;;50076:38;;50125:21;50149:8;:14;50158:4;50149:14;;;;;;;;;;;:26;50164:10;50149:26;;;;;;;;;;;;;;;50125:50;;50186:16;50197:4;50186:10;:16::i;:::-;50233:1;50219:4;:11;;;:15;50215:115;;;50288:30;50301:4;50307:10;50288:12;:30::i;:::-;50249:4;:17;;:36;50267:4;:17;;;50249:36;;;;;;;;;;;:69;;;;50215:115;50363:1;50353:7;:11;50350:170;;;50381:74;50419:10;50440:4;50447:7;50381:4;:12;;;;;;;;;;;;:29;;;;:74;;;;;;:::i;:::-;50484:24;50500:7;50484:4;:11;;;:15;;:24;;;;:::i;:::-;50470:4;:11;;:38;;;;50350:170;50577:48;50620:4;50577:38;50593:4;:21;;;50577:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;50540:4;:15;;:34;50556:4;:17;;;50540:34;;;;;;;;;;;:85;;;;50661:4;50649:10;50641:34;;;50667:7;50641:34;;;;;;;;;;;;;;;;;;50010:673;;;;:::o;30505:244::-;29782:12;:10;:12::i;:::-;29772:22;;:6;;;;;;;;;;:22;;;29764:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30614:1:::1;30594:22;;:8;:22;;;;30586:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30704:8;30675:38;;30696:6;::::0;::::1;;;;;;;;30675:38;;;;;;;;;;;;30733:8;30724:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;30505:244:::0;:::o;39675:115::-;29782:12;:10;:12::i;:::-;29772:22;;:6;;;;;;;;;;:22;;;29764:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39768:14:::1;39752:13;:30;;;;39675:115:::0;:::o;41780:552::-;39319:9;39305:23;;:10;:23;;;39297:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35986:1:::1;35969:13:::0;::::1;:18;;;;;;;;;;;35998:20;36021:13;;35998:36;;41875:18:::2;41888:4;41875:12;:18::i;:::-;41856:16;;:37;;;;;;;;;;;;;;;;;;41904:21;41928:8;41937:4;41928:14;;;;;;;;;;;;;;;;;;41904:38;;41984:4;:15;;;41961:4;:19;;;:38;41953:47;;;::::0;::::2;;42035:4;:19;;;42019:12;:35;;42011:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42140:16;:14;:16::i;:::-;42122:4;:15;;:34;;;;42189:16;;;;;;;;;;;42167:4;:19;;;:38;;;;;;;;;;;;;;;;;;42273:51;42291:10;42303:20;42318:4;42303:14;:20::i;:::-;42273:17;:51::i;:::-;36045:1;36081:13:::1;;36065:12;:29;36057:73;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;39351:1;41780:552:::0;:::o;28198:106::-;28251:15;28286:10;28279:17;;28198:106;:::o;5007:471::-;5065:7;5315:1;5310;:6;5306:47;;;5340:1;5333:8;;;;5306:47;5365:9;5381:1;5377;:5;5365:17;;5410:1;5405;5401;:5;;;;;;:10;5393:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5469:1;5462:8;;;5007:471;;;;;:::o;5954:132::-;6012:7;6039:39;6043:1;6046;6039:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6032:46;;5954:132;;;;:::o;3653:181::-;3711:7;3731:9;3747:1;3743;:5;3731:17;;3772:1;3767;:6;;3759:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3825:1;3818:8;;;3653:181;;;;:::o;4117:136::-;4175:7;4202:43;4206:1;4209;4202:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4195:50;;4117:136;;;;:::o;16612:177::-;16695:86;16715:5;16745:23;;;16770:2;16774:5;16722:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16695:19;:86::i;:::-;16612:177;;;:::o;17271:622::-;17650:1;17641:5;:10;17640:62;;;;17700:1;17657:5;:15;;;17681:4;17688:7;17657:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;17640:62;17632:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17795:90;17815:5;17845:22;;;17869:7;17878:5;17822:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17795:19;:90::i;:::-;17271:622;;;:::o;47768:211::-;47821:21;47845:8;47854:4;47845:14;;;;;;;;;;;;;;;;;;47821:38;;47894:1;47870:4;:21;;:25;;;;47929:12;47906:4;:20;;:35;;;;47952:4;:17;;;:19;;;;;;;;;;;;;47768:211;;:::o;51937:393::-;52014:16;52040:5;;;;;;;;;;;52033:23;;;52065:4;52033:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52014:57;;52096:8;52086:7;:18;52082:241;;;52121:5;;;;;;;;;;;:10;;52185:3;52190:8;52132:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52121:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52082:241;;;52233:5;;;;;;;;;;;:10;;52297:3;52302:7;52244:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52233:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52082:241;51937:393;;;:::o;16797:205::-;16898:96;16918:5;16948:27;;;16977:4;16983:2;16987:5;16925:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16898:19;:96::i;:::-;16797:205;;;;:::o;6582:278::-;6668:7;6700:1;6696;:5;6703:12;6688:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6727:9;6743:1;6739;:5;;;;;;6727:17;;6851:1;6844:8;;;6582:278;;;;;:::o;4556:192::-;4642:7;4675:1;4670;:6;;4678:12;4662:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4702:9;4718:1;4714;:5;4702:17;;4739:1;4732:8;;;4556:192;;;;;:::o;18917:761::-;19341:23;19367:69;19395:4;19367:69;;;;;;;;;;;;;;;;;19375:5;19367:27;;;;:69;;;;;:::i;:::-;19341:95;;19471:1;19451:10;:17;:21;19447:224;;;19593:10;19582:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19574:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19447:224;18917:761;;;:::o;11712:195::-;11815:12;11847:52;11869:6;11877:4;11883:1;11886:12;11847:21;:52::i;:::-;11840:59;;11712:195;;;;;:::o;12764:530::-;12891:12;12949:5;12924:21;:30;;12916:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13016:18;13027:6;13016:10;:18::i;:::-;13008:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13142:12;13156:23;13183:6;:11;;13203:5;13211:4;13183:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13141:75;;;;13234:52;13252:7;13261:10;13273:12;13234:17;:52::i;:::-;13227:59;;;;12764:530;;;;;;:::o;8794:422::-;8854:4;9062:12;9173:7;9161:20;9153:28;;9207:1;9200:4;:8;9193:15;;;8794:422;;;:::o;15304:742::-;15419:12;15448:7;15444:595;;;15479:10;15472:17;;;;15444:595;15613:1;15593:10;:17;:21;15589:439;;;15856:10;15850:17;15917:15;15904:10;15900:2;15896:19;15889:44;15804:148;15999:12;15992:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15304:742;;;;;;:::o
Swarm Source
ipfs://bd82ce4191b2f74e53f3ff3af6ca77e60c1c9cd53091cb3e198d06cf73e39f09
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.057151 | 6,101.241 | $348.69 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.