More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 368 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Any Token | 17762818 | 558 days ago | IN | 0 ETH | 0.00212076 | ||||
Claim Any Token | 17491331 | 596 days ago | IN | 0 ETH | 0.00068452 | ||||
Claim Any Token | 17491330 | 596 days ago | IN | 0 ETH | 0.00092191 | ||||
Withdraw | 16771114 | 698 days ago | IN | 0 ETH | 0.01165105 | ||||
Claim | 16771104 | 698 days ago | IN | 0 ETH | 0.00251157 | ||||
Claim | 16771103 | 698 days ago | IN | 0 ETH | 0.00948318 | ||||
Withdraw | 16454684 | 742 days ago | IN | 0 ETH | 0.0050734 | ||||
Withdraw | 16238488 | 772 days ago | IN | 0 ETH | 0.00289006 | ||||
Claim | 16238472 | 772 days ago | IN | 0 ETH | 0.00210404 | ||||
Withdraw | 16215482 | 775 days ago | IN | 0 ETH | 0.00030254 | ||||
Claim | 16215482 | 775 days ago | IN | 0 ETH | 0.00062703 | ||||
Withdraw | 16215481 | 775 days ago | IN | 0 ETH | 0.00400938 | ||||
Claim | 16175813 | 781 days ago | IN | 0 ETH | 0.00393401 | ||||
Deposit | 16153261 | 784 days ago | IN | 0 ETH | 0.00907933 | ||||
Deposit | 16147496 | 785 days ago | IN | 0 ETH | 0.01636154 | ||||
Withdraw | 16141271 | 786 days ago | IN | 0 ETH | 0.0043025 | ||||
Claim | 16141263 | 786 days ago | IN | 0 ETH | 0.00325926 | ||||
Withdraw | 16055134 | 798 days ago | IN | 0 ETH | 0.00474069 | ||||
Withdraw | 16019391 | 803 days ago | IN | 0 ETH | 0.00734262 | ||||
Withdraw | 16019244 | 803 days ago | IN | 0 ETH | 0.0043363 | ||||
Claim | 15993322 | 806 days ago | IN | 0 ETH | 0.00153099 | ||||
Withdraw | 15986699 | 807 days ago | IN | 0 ETH | 0.00517878 | ||||
Withdraw | 15949375 | 813 days ago | IN | 0 ETH | 0.00515557 | ||||
Claim | 15949355 | 813 days ago | IN | 0 ETH | 0.00114264 | ||||
Claim | 15949321 | 813 days ago | IN | 0 ETH | 0.00529083 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
FarmProRata
Compiler Version
v0.6.11+commit.5ef660b1
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-14 */ pragma solidity 0.6.11; // SPDX-License-Identifier: BSD-3-Clause /** * @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 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 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); } } } } /** * @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); } /** * @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"); } } } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) onlyOwner public { require(newOwner != address(0)); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } } interface IUniswapV2Router { function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Pair { 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 token0() external view returns (address); function token1() external view returns (address); function sync() external; } interface StakingContract { function depositByContract(address account, uint amount, uint _amountOutMin_stakingReferralFee, uint deadline) external; } /** * @dev Staking Smart Contract * * - Users stake Uniswap LP Tokens to receive WETH and DYP Tokens as Rewards * * - Reward Tokens (DYP) are added to contract balance upon deployment by deployer * * - After Adding the DYP rewards, admin is supposed to transfer ownership to Governance contract * * - Users deposit Set (Predecided) Uniswap LP Tokens and get a share of the farm * * - The smart contract disburses `disburseAmount` DYP as rewards over `disburseDuration` * * - A swap is attempted periodically at atleast a set delay from last swap * * - The swap is attempted according to SWAP_PATH for difference deployments of this contract * * - For 4 different deployments of this contract, the SWAP_PATH will be: * - DYP-WETH * - DYP-WBTC-WETH (assumes appropriate liquidity is available in WBTC-WETH pair) * - DYP-USDT-WETH (assumes appropriate liquidity is available in USDT-WETH pair) * - DYP-USDC-WETH (assumes appropriate liquidity is available in USDC-WETH pair) * * - Any swap may not have a price impact on DYP price of more than approx ~2.49% for the related DYP pair * DYP-WETH swap may not have a price impact of more than ~2.49% on DYP price in DYP-WETH pair * DYP-WBTC-WETH swap may not have a price impact of more than ~2.49% on DYP price in DYP-WBTC pair * DYP-USDT-WETH swap may not have a price impact of more than ~2.49% on DYP price in DYP-USDT pair * DYP-USDC-WETH swap may not have a price impact of more than ~2.49% on DYP price in DYP-USDC pair * * - After the swap,converted WETH is distributed to stakers at pro-rata basis, according to their share of the staking pool * on the moment when the WETH distribution is done. And remaining DYP is added to the amount to be distributed or burnt. * The remaining DYP are also attempted to be swapped to WETH in the next swap if the price impact is ~2.49% or less * * - At a set delay from last execution, Governance contract (owner) may execute disburse or burn features * * - Burn feature should send the DYP tokens to set BURN_ADDRESS * * - Disburse feature should disburse the DYP * (which would have a max price impact ~2.49% if it were to be swapped, at disburse time * - remaining DYP are sent to BURN_ADDRESS) * to stakers at pro-rata basis according to their share of * the staking pool at the moment the disburse is done * * - Users may claim their pending WETH and DYP anytime * * - Pending rewards are auto-claimed on any deposit or withdraw * * - Users need to wait `cliffTime` duration since their last deposit before withdrawing any LP Tokens * * - Owner may not transfer out LP Tokens from this contract anytime * * - Owner may transfer out WETH and DYP Tokens from this contract once `adminClaimableTime` is reached * * - CONTRACT VARIABLES must be changed to appropriate values before live deployment */ contract FarmProRata is Ownable { using SafeMath for uint; using EnumerableSet for EnumerableSet.AddressSet; using Address for address; using SafeERC20 for IERC20; event RewardsTransferred(address holder, uint amount); event EthRewardsTransferred(address holder, uint amount); event RewardsDisbursed(uint amount); event EthRewardsDisbursed(uint amount); event EmergencyDeclared(address owner); event UniswapV2RouterChanged(address router); event StakingFeeChanged(uint fee); event UnstakingFeeChanged(uint fee); event MagicNumberChanged(uint newMagicNumber); event LockupTimeChanged(uint lockupTime); event FeeRecipientAddressChanged(address newAddress); // ============ SMART CONTRACT VARIABLES ========================== // Must be changed to appropriate configuration before live deployment // deposit token contract address and reward token contract address // these contracts (and uniswap pair & router) are "trusted" // and checked to not contain re-entrancy pattern // to safely avoid checks-effects-interactions where needed to simplify logic address public constant trustedDepositTokenAddress = 0x7463286A379F6F128058bb92B355e3d6E8BDB219; // uniswap pair address // token used for rewards - this must be one of the tokens in uniswap pair. address public constant trustedRewardTokenAddress = 0xBD100d061E120b2c67A24453CF6368E63f1Be056; address public constant trustedStakingContractAddress = 0x0b92E7f074e7Ade0181A29647ea8474522e6A7C2; // the main token which is normally claimed as reward address public constant trustedPlatformTokenAddress = 0x961C8c0B1aaD0c0b10a51FeF6a867E3091BCef17; // the other token in the uniswap pair used address public constant trustedBaseTokenAddress = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // Make sure to double-check BURN_ADDRESS address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD; // cliffTime - withdraw is not possible within cliffTime of deposit uint public cliffTime = 5 minutes; // Amount of tokens uint public constant disburseAmount = 660000e18; // To be disbursed continuously over this duration uint public constant disburseDuration = 365 days; // If there are any undistributed or unclaimed tokens left in contract after this time // Admin can claim them uint public constant adminCanClaimAfter = 395 days; // delays between attempted swaps uint public constant swapAttemptPeriod = 1 days; // delays between attempted burns or token disbursement uint public constant burnOrDisburseTokensPeriod = 7 days; // do not change this => disburse 100% rewards over `disburseDuration` uint public constant disbursePercentX100 = 100e2; uint public constant EMERGENCY_WAIT_TIME = 3 days; uint public STAKING_FEE_RATE_X_100 = 0; uint public UNSTAKING_FEE_RATE_X_100 = 0; uint public MAGIC_NUMBER = 5025125628140614; // ============ END CONTRACT VARIABLES ========================== event ClaimableTokenAdded(address indexed tokenAddress); event ClaimableTokenRemoved(address indexed tokenAddress); mapping (address => bool) public trustedClaimableTokens; function addTrustedClaimableToken(address trustedClaimableTokenAddress) external onlyOwner { trustedClaimableTokens[trustedClaimableTokenAddress] = true; emit ClaimableTokenAdded(trustedClaimableTokenAddress); } function removeTrustedClaimableToken(address trustedClaimableTokenAddress) external onlyOwner { trustedClaimableTokens[trustedClaimableTokenAddress] = false; emit ClaimableTokenRemoved(trustedClaimableTokenAddress); } uint public contractDeployTime; uint public adminClaimableTime; uint public lastDisburseTime; uint public lastSwapExecutionTime; uint public lastBurnOrTokenDistributeTime; bool public isEmergency = false; IUniswapV2Router public uniswapRouterV2; IUniswapV2Pair public uniswapV2Pair; address[] public SWAP_PATH; address public feeRecipientAddress; constructor(address[] memory swapPath, address _uniswapV2RouterAddress, address _feeRecipientAddress) public { contractDeployTime = now; adminClaimableTime = contractDeployTime.add(adminCanClaimAfter); lastDisburseTime = contractDeployTime; lastSwapExecutionTime = lastDisburseTime; lastBurnOrTokenDistributeTime = lastDisburseTime; setUniswapV2Router(IUniswapV2Router(_uniswapV2RouterAddress)); setFeeRecipientAddress(_feeRecipientAddress); uniswapV2Pair = IUniswapV2Pair(trustedDepositTokenAddress); SWAP_PATH = swapPath; } function setFeeRecipientAddress(address newFeeRecipientAddress) public onlyOwner { require(newFeeRecipientAddress != address(0), "Invalid address!"); feeRecipientAddress = newFeeRecipientAddress; emit FeeRecipientAddressChanged(feeRecipientAddress); } // Contracts are not allowed to deposit, claim or withdraw modifier noContractsAllowed() { require(!(address(msg.sender).isContract()) && tx.origin == msg.sender, "No Contracts Allowed!"); _; } modifier notDuringEmergency() { require(!isEmergency, "Cannot execute during emergency!"); _; } function declareEmergency() external onlyOwner notDuringEmergency { isEmergency = true; adminClaimableTime = now.add(EMERGENCY_WAIT_TIME); cliffTime = 0; emit EmergencyDeclared(owner); } uint public totalClaimedRewards = 0; uint public totalClaimedRewardsEth = 0; EnumerableSet.AddressSet private holders; mapping (address => uint) public depositedTokens; mapping (address => uint) public depositTime; mapping (address => uint) public lastClaimedTime; mapping (address => uint) public totalEarnedTokens; mapping (address => uint) public totalEarnedEth; mapping (address => uint) public lastDivPoints; mapping (address => uint) public lastEthDivPoints; uint public contractBalance = 0; uint public totalDivPoints = 0; uint public totalEthDivPoints = 0; uint public totalTokens = 0; uint public tokensToBeDisbursedOrBurnt = 0; uint public tokensToBeSwapped = 0; uint internal constant pointMultiplier = 1e18; function setUniswapV2Router(IUniswapV2Router router) public onlyOwner { require(address(router) != address(0), "Invalid router address!"); uniswapRouterV2 = router; emit UniswapV2RouterChanged(address(uniswapRouterV2)); } function setStakingFeeRateX100(uint newStakingFeeRateX100) public onlyOwner { require(newStakingFeeRateX100 < 100e2, "Invalid fee!"); STAKING_FEE_RATE_X_100 = newStakingFeeRateX100; emit StakingFeeChanged(STAKING_FEE_RATE_X_100); } function setUnstakingFeeRateX100(uint newUnstakingFeeRateX100) public onlyOwner { require(newUnstakingFeeRateX100 < 100e2, "Invalid fee!"); UNSTAKING_FEE_RATE_X_100 = newUnstakingFeeRateX100; emit UnstakingFeeChanged(UNSTAKING_FEE_RATE_X_100); } function setMagicNumber(uint newMagicNumber) public onlyOwner { MAGIC_NUMBER = newMagicNumber; emit MagicNumberChanged(MAGIC_NUMBER); } function setLockupTime(uint _newLockupTime) public onlyOwner { require(_newLockupTime <= 90 days, "Lockup time too long!"); cliffTime = _newLockupTime; emit LockupTimeChanged(cliffTime); } function setContractVariables( uint newMagicNumber, uint lockupTime, uint stakingFeeRateX100, uint unstakingFeeRateX100, address _uniswapV2RouterAddress, address newFeeRecipientAddress ) external onlyOwner { setMagicNumber(newMagicNumber); setLockupTime(lockupTime); setStakingFeeRateX100(stakingFeeRateX100); setUnstakingFeeRateX100(unstakingFeeRateX100); setUniswapV2Router(IUniswapV2Router(_uniswapV2RouterAddress)); setFeeRecipientAddress(newFeeRecipientAddress); } // To be executed by admin after deployment to add DYP to contract function addContractBalance(uint amount) public onlyOwner { IERC20(trustedRewardTokenAddress).safeTransferFrom(msg.sender, address(this), amount); contractBalance = contractBalance.add(amount); } function doSwap(address fromToken, address toToken, uint fromTokenAmount, uint amountOutMin, uint deadline) private returns (uint _toTokenReceived) { if (fromToken == toToken) { return fromTokenAmount; } IERC20(fromToken).safeApprove(address(uniswapRouterV2), 0); IERC20(fromToken).safeApprove(address(uniswapRouterV2), fromTokenAmount); uint oldToTokenBalance = IERC20(toToken).balanceOf(address(this)); address[] memory path; if (fromToken == uniswapRouterV2.WETH() || toToken == uniswapRouterV2.WETH()) { path = new address[](2); path[0] = fromToken; path[1] = toToken; } else { path = new address[](3); path[0] = fromToken; path[1] = uniswapRouterV2.WETH(); path[2] = toToken; } uniswapRouterV2.swapExactTokensForTokens(fromTokenAmount, amountOutMin, path, address(this), deadline); uint newToTokenBalance = IERC20(toToken).balanceOf(address(this)); uint toTokenReceived = newToTokenBalance.sub(oldToTokenBalance); return toTokenReceived; } // Private function to update account information and auto-claim pending rewards function updateAccount( address account, address claimAsToken, uint _amountOutMin_claimAsToken_weth, uint _amountOutMin_claimAsToken_dyp, uint _amountOutMin_attemptSwap, uint _deadline ) private { disburseTokens(); attemptSwap(_amountOutMin_attemptSwap, _deadline); uint pendingDivs = getPendingDivs(account); if (pendingDivs > 0) { uint amountToTransfer; address tokenToTransfer; if (claimAsToken == address(0) || claimAsToken == trustedPlatformTokenAddress) { tokenToTransfer = trustedPlatformTokenAddress; amountToTransfer = doSwap(trustedRewardTokenAddress, trustedPlatformTokenAddress, pendingDivs, _amountOutMin_claimAsToken_dyp, _deadline); } else { tokenToTransfer = claimAsToken; amountToTransfer = doSwap(trustedRewardTokenAddress, claimAsToken, pendingDivs, _amountOutMin_claimAsToken_dyp, _deadline); } IERC20(tokenToTransfer).safeTransfer(account, amountToTransfer); totalEarnedTokens[account] = totalEarnedTokens[account].add(pendingDivs); totalClaimedRewards = totalClaimedRewards.add(pendingDivs); emit RewardsTransferred(account, pendingDivs); } uint pendingDivsEth = getPendingDivsEth(account); if (pendingDivsEth > 0) { if (claimAsToken == address(0) || claimAsToken == uniswapRouterV2.WETH()) { IERC20(uniswapRouterV2.WETH()).safeTransfer(account, pendingDivsEth); } else { require(trustedClaimableTokens[claimAsToken], "cannot claim as this token!"); IERC20(uniswapRouterV2.WETH()).safeApprove(address(uniswapRouterV2), 0); IERC20(uniswapRouterV2.WETH()).safeApprove(address(uniswapRouterV2), pendingDivsEth); address[] memory path = new address[](2); path[0] = uniswapRouterV2.WETH(); path[1] = claimAsToken; uniswapRouterV2.swapExactTokensForTokens(pendingDivsEth, _amountOutMin_claimAsToken_weth, path, account, _deadline); } totalEarnedEth[account] = totalEarnedEth[account].add(pendingDivsEth); totalClaimedRewardsEth = totalClaimedRewardsEth.add(pendingDivsEth); emit EthRewardsTransferred(account, pendingDivsEth); } lastClaimedTime[account] = now; lastDivPoints[account] = totalDivPoints; lastEthDivPoints[account] = totalEthDivPoints; } function updateAccount(address account, uint _amountOutMin_claimAsToken_dyp, uint _amountOutMin_attemptSwap, uint _deadline) private { updateAccount(account, address(0), 0, _amountOutMin_claimAsToken_dyp, _amountOutMin_attemptSwap, _deadline); } // view function to check last updated DYP pending rewards function getPendingDivs(address _holder) public view returns (uint) { if (!holders.contains(_holder)) return 0; if (depositedTokens[_holder] == 0) return 0; uint newDivPoints = totalDivPoints.sub(lastDivPoints[_holder]); uint depositedAmount = depositedTokens[_holder]; uint pendingDivs = depositedAmount.mul(newDivPoints).div(pointMultiplier); return pendingDivs; } // view function to check last updated WETH pending rewards function getPendingDivsEth(address _holder) public view returns (uint) { if (!holders.contains(_holder)) return 0; if (depositedTokens[_holder] == 0) return 0; uint newDivPoints = totalEthDivPoints.sub(lastEthDivPoints[_holder]); uint depositedAmount = depositedTokens[_holder]; uint pendingDivs = depositedAmount.mul(newDivPoints).div(pointMultiplier); return pendingDivs; } // view functon to get number of stakers function getNumberOfHolders() public view returns (uint) { return holders.length(); } // deposit function to stake LP Tokens function deposit( address depositToken, uint amountToStake, uint[] memory minAmounts, // uint _amountOutMin_25Percent, // 0 // uint _amountOutMin_stakingReferralFee, // 1 // uint amountLiquidityMin_rewardTokenReceived, // 2 // uint amountLiquidityMin_baseTokenReceived, // 3 // uint _amountOutMin_rewardTokenReceived, // 4 // uint _amountOutMin_baseTokenReceived, // 5 // uint _amountOutMin_claimAsToken_dyp, // 6 // uint _amountOutMin_attemptSwap, // 7 uint _deadline ) public noContractsAllowed notDuringEmergency { require(minAmounts.length == 8, "Invalid minAmounts length!"); require(trustedClaimableTokens[depositToken], "Invalid deposit token!"); // can deposit reward token directly // require(depositToken != trustedRewardTokenAddress, "Cannot deposit reward token!"); require(depositToken != trustedDepositTokenAddress, "Cannot deposit LP directly!"); require(depositToken != address(0), "Deposit token cannot be 0!"); require(amountToStake > 0, "Invalid amount to Stake!"); IERC20(depositToken).safeTransferFrom(msg.sender, address(this), amountToStake); uint fee = amountToStake.mul(STAKING_FEE_RATE_X_100).div(100e2); uint amountAfterFee = amountToStake.sub(fee); if (fee > 0) { IERC20(depositToken).safeTransfer(feeRecipientAddress, fee); } uint _75Percent = amountAfterFee.mul(75e2).div(100e2); uint _25Percent = amountAfterFee.sub(_75Percent); uint amountToDepositByContract = doSwap(depositToken, trustedPlatformTokenAddress, _25Percent, /*_amountOutMin_25Percent*/minAmounts[0], _deadline); IERC20(trustedPlatformTokenAddress).safeApprove(address(trustedStakingContractAddress), 0); IERC20(trustedPlatformTokenAddress).safeApprove(address(trustedStakingContractAddress), amountToDepositByContract); StakingContract(trustedStakingContractAddress).depositByContract(msg.sender, amountToDepositByContract, /*_amountOutMin_stakingReferralFee*/minAmounts[1], _deadline); uint half = _75Percent.div(2); uint otherHalf = _75Percent.sub(half); uint _rewardTokenReceived = doSwap(depositToken, trustedRewardTokenAddress, half, /*_amountOutMin_rewardTokenReceived*/minAmounts[4], _deadline); uint _baseTokenReceived = doSwap(depositToken, trustedBaseTokenAddress, otherHalf, /*_amountOutMin_baseTokenReceived*/minAmounts[5], _deadline); uint amountToDeposit = addLiquidityAndGetAmountToDeposit( _rewardTokenReceived, _baseTokenReceived, minAmounts, _deadline ); require(amountToDeposit > 0, "Cannot deposit 0 Tokens"); updateAccount(msg.sender, /*_amountOutMin_claimAsToken_dyp*/minAmounts[6], /*_amountOutMin_attemptSwap*/minAmounts[7], _deadline); depositedTokens[msg.sender] = depositedTokens[msg.sender].add(amountToDeposit); totalTokens = totalTokens.add(amountToDeposit); holders.add(msg.sender); depositTime[msg.sender] = now; } function addLiquidityAndGetAmountToDeposit( uint _rewardTokenReceived, uint _baseTokenReceived, uint[] memory minAmounts, uint _deadline ) private returns (uint) { require(_rewardTokenReceived >= minAmounts[2], "Reward Token Received lower than expected!"); require(_baseTokenReceived >= minAmounts[3], "Base Token Received lower than expected!"); uint oldLpBalance = IERC20(trustedDepositTokenAddress).balanceOf(address(this)); IERC20(trustedRewardTokenAddress).safeApprove(address(uniswapRouterV2), 0); IERC20(trustedRewardTokenAddress).safeApprove(address(uniswapRouterV2), _rewardTokenReceived); IERC20(trustedBaseTokenAddress).safeApprove(address(uniswapRouterV2), 0); IERC20(trustedBaseTokenAddress).safeApprove(address(uniswapRouterV2), _baseTokenReceived); uniswapRouterV2.addLiquidity( trustedRewardTokenAddress, trustedBaseTokenAddress, _rewardTokenReceived, _baseTokenReceived, /*amountLiquidityMin_rewardTokenReceived*/minAmounts[2], /*amountLiquidityMin_baseTokenReceived*/minAmounts[3], address(this), _deadline ); uint newLpBalance = IERC20(trustedDepositTokenAddress).balanceOf(address(this)); uint lpTokensReceived = newLpBalance.sub(oldLpBalance); return lpTokensReceived; } // withdraw function to unstake LP Tokens function withdraw( address withdrawAsToken, uint amountToWithdraw, uint[] memory minAmounts, // uint _amountLiquidityMin_rewardToken, // 0 // uint _amountLiquidityMin_baseToken, // 1 // uint _amountOutMin_withdrawAsToken_rewardTokenReceived, // 2 // uint _amountOutMin_withdrawAsToken_baseTokenReceived, // 3 // uint _amountOutMin_claimAsToken_dyp, // 4 // uint _amountOutMin_attemptSwap, // 5 uint _deadline ) public noContractsAllowed { require(minAmounts.length == 6, "Invalid minAmounts!"); require(withdrawAsToken != address(0), "Invalid withdraw token!"); require(trustedClaimableTokens[withdrawAsToken], "Withdraw token not trusted!"); require(amountToWithdraw > 0, "Cannot withdraw 0 Tokens!"); require(depositedTokens[msg.sender] >= amountToWithdraw, "Invalid amount to withdraw"); require(now.sub(depositTime[msg.sender]) > cliffTime, "You recently deposited, please wait before withdrawing."); updateAccount(msg.sender, /*_amountOutMin_claimAsToken_dyp*/ minAmounts[4] , /*_amountOutMin_attemptSwap*/ minAmounts[5], _deadline); uint fee = amountToWithdraw.mul(UNSTAKING_FEE_RATE_X_100).div(100e2); uint amountAfterFee = amountToWithdraw.sub(fee); if (fee > 0) { IERC20(trustedDepositTokenAddress).safeTransfer(feeRecipientAddress, fee); } uint withdrawTokenReceived = removeLiquidityAndGetWithdrawTokenReceived(withdrawAsToken, amountAfterFee, minAmounts, _deadline); IERC20(withdrawAsToken).safeTransfer(msg.sender, withdrawTokenReceived); depositedTokens[msg.sender] = depositedTokens[msg.sender].sub(amountToWithdraw); totalTokens = totalTokens.sub(amountToWithdraw); if (holders.contains(msg.sender) && depositedTokens[msg.sender] == 0) { holders.remove(msg.sender); } } function removeLiquidityAndGetWithdrawTokenReceived( address withdrawAsToken, uint amountAfterFee, uint[] memory minAmounts, uint _deadline ) private returns (uint) { IERC20(trustedDepositTokenAddress).safeApprove(address(uniswapRouterV2), 0); IERC20(trustedDepositTokenAddress).safeApprove(address(uniswapRouterV2), amountAfterFee); uint _oldRewardTokenBalance = IERC20(trustedRewardTokenAddress).balanceOf(address(this)); uint _oldBaseTokenBalance = IERC20(trustedBaseTokenAddress).balanceOf(address(this)); uniswapRouterV2.removeLiquidity( trustedRewardTokenAddress, trustedBaseTokenAddress, amountAfterFee, /*_amountLiquidityMin_rewardToken*/ minAmounts[0], /*_amountLiquidityMin_baseToken*/minAmounts[1], address(this), _deadline ); uint _newRewardTokenBalance = IERC20(trustedRewardTokenAddress).balanceOf(address(this)); uint _newBaseTokenBalance = IERC20(trustedBaseTokenAddress).balanceOf(address(this)); uint _rewardTokenReceivedAfterRemovingLiquidity = _newRewardTokenBalance.sub(_oldRewardTokenBalance); uint _baseTokenReceivedAfterRemovingLiquidity = _newBaseTokenBalance.sub(_oldBaseTokenBalance); uint withdrawTokenReceived1 = doSwap(trustedRewardTokenAddress, withdrawAsToken, _rewardTokenReceivedAfterRemovingLiquidity, /*_amountOutMin_withdrawAsToken_rewardTokenReceived*/minAmounts[2], _deadline); uint withdrawTokenReceived2 = doSwap(trustedBaseTokenAddress, withdrawAsToken, _baseTokenReceivedAfterRemovingLiquidity, /*_amountOutMin_withdrawAsToken_baseTokenReceived*/minAmounts[3], _deadline); uint tokensReceived = withdrawTokenReceived1.add(withdrawTokenReceived2); return tokensReceived; } // claim function to claim pending rewards function claim(uint _amountOutMin_claimAsToken_dyp, uint _amountOutMin_attemptSwap, uint _deadline) public noContractsAllowed notDuringEmergency { updateAccount(msg.sender, _amountOutMin_claimAsToken_dyp, _amountOutMin_attemptSwap, _deadline); } function claimAs(address claimAsToken, uint _amountOutMin_claimAsToken_weth, uint _amountOutMin_claimAsToken_dyp, uint _amountOutMin_attemptSwap, uint _deadline) public noContractsAllowed notDuringEmergency { require(trustedClaimableTokens[claimAsToken], "cannot claim as this token!"); updateAccount(msg.sender, claimAsToken, _amountOutMin_claimAsToken_weth, _amountOutMin_claimAsToken_dyp, _amountOutMin_attemptSwap, _deadline); } // private function to distribute DYP rewards function distributeDivs(uint amount) private { require(amount > 0 && totalTokens > 0, "distributeDivs failed!"); totalDivPoints = totalDivPoints.add(amount.mul(pointMultiplier).div(totalTokens)); emit RewardsDisbursed(amount); } // private function to distribute WETH rewards function distributeDivsEth(uint amount) private { require(amount > 0 && totalTokens > 0, "distributeDivsEth failed!"); totalEthDivPoints = totalEthDivPoints.add(amount.mul(pointMultiplier).div(totalTokens)); emit EthRewardsDisbursed(amount); } // private function to allocate DYP to be disbursed calculated according to time passed function disburseTokens() private { uint amount = getPendingDisbursement(); if (contractBalance < amount) { amount = contractBalance; } if (amount == 0 || totalTokens == 0) return; tokensToBeSwapped = tokensToBeSwapped.add(amount); contractBalance = contractBalance.sub(amount); lastDisburseTime = now; } function attemptSwap(uint _amountOutMin_attemptSwap, uint _deadline) private { // do not attemptSwap if no one has staked if (totalTokens == 0) { return; } // Cannot execute swap so quickly if (now.sub(lastSwapExecutionTime) < swapAttemptPeriod) { return; } // force reserves to match balances uniswapV2Pair.sync(); uint _tokensToBeSwapped = tokensToBeSwapped.add(tokensToBeDisbursedOrBurnt); uint maxSwappableAmount = getMaxSwappableAmount(); // don't proceed if no liquidity if (maxSwappableAmount == 0) return; if (maxSwappableAmount < tokensToBeSwapped) { uint diff = tokensToBeSwapped.sub(maxSwappableAmount); _tokensToBeSwapped = tokensToBeSwapped.sub(diff); tokensToBeDisbursedOrBurnt = tokensToBeDisbursedOrBurnt.add(diff); tokensToBeSwapped = 0; } else if (maxSwappableAmount < _tokensToBeSwapped) { uint diff = _tokensToBeSwapped.sub(maxSwappableAmount); _tokensToBeSwapped = _tokensToBeSwapped.sub(diff); tokensToBeDisbursedOrBurnt = diff; tokensToBeSwapped = 0; } else { tokensToBeSwapped = 0; tokensToBeDisbursedOrBurnt = 0; } // don't execute 0 swap tokens if (_tokensToBeSwapped == 0) { return; } // cannot execute swap at insufficient balance if (IERC20(trustedRewardTokenAddress).balanceOf(address(this)) < _tokensToBeSwapped) { return; } IERC20(trustedRewardTokenAddress).safeApprove(address(uniswapRouterV2), 0); IERC20(trustedRewardTokenAddress).safeApprove(address(uniswapRouterV2), _tokensToBeSwapped); uint oldWethBalance = IERC20(uniswapRouterV2.WETH()).balanceOf(address(this)); uniswapRouterV2.swapExactTokensForTokens(_tokensToBeSwapped, _amountOutMin_attemptSwap, SWAP_PATH, address(this), _deadline); uint newWethBalance = IERC20(uniswapRouterV2.WETH()).balanceOf(address(this)); uint wethReceived = newWethBalance.sub(oldWethBalance); if (wethReceived > 0) { distributeDivsEth(wethReceived); } lastSwapExecutionTime = now; } // Owner is supposed to be a Governance Contract function disburseRewardTokens() public onlyOwner { require(now.sub(lastBurnOrTokenDistributeTime) > burnOrDisburseTokensPeriod, "Recently executed, Please wait!"); // force reserves to match balances uniswapV2Pair.sync(); uint maxSwappableAmount = getMaxSwappableAmount(); uint _tokensToBeDisbursed = tokensToBeDisbursedOrBurnt; uint _tokensToBeBurnt; if (maxSwappableAmount < _tokensToBeDisbursed) { _tokensToBeBurnt = _tokensToBeDisbursed.sub(maxSwappableAmount); _tokensToBeDisbursed = maxSwappableAmount; } distributeDivs(_tokensToBeDisbursed); if (_tokensToBeBurnt > 0) { IERC20(trustedRewardTokenAddress).safeTransfer(BURN_ADDRESS, _tokensToBeBurnt); } tokensToBeDisbursedOrBurnt = 0; lastBurnOrTokenDistributeTime = now; } // Owner is suposed to be a Governance Contract function burnRewardTokens() public onlyOwner { require(now.sub(lastBurnOrTokenDistributeTime) > burnOrDisburseTokensPeriod, "Recently executed, Please wait!"); IERC20(trustedRewardTokenAddress).safeTransfer(BURN_ADDRESS, tokensToBeDisbursedOrBurnt); tokensToBeDisbursedOrBurnt = 0; lastBurnOrTokenDistributeTime = now; } // get token amount which has a max price impact according to MAGIC_NUMBER for sells // !!IMPORTANT!! => Any functions using return value from this // MUST call `sync` on the pair before calling this function! function getMaxSwappableAmount() public view returns (uint) { uint tokensAvailable = IERC20(trustedRewardTokenAddress).balanceOf(trustedDepositTokenAddress); uint maxSwappableAmount = tokensAvailable.mul(MAGIC_NUMBER).div(1e18); return maxSwappableAmount; } // view function to calculate amount of DYP pending to be allocated since `lastDisburseTime` function getPendingDisbursement() public view returns (uint) { uint timeDiff; uint _now = now; uint _stakingEndTime = contractDeployTime.add(disburseDuration); if (_now > _stakingEndTime) { _now = _stakingEndTime; } if (lastDisburseTime >= _now) { timeDiff = 0; } else { timeDiff = _now.sub(lastDisburseTime); } uint pendingDisburse = disburseAmount .mul(disbursePercentX100) .mul(timeDiff) .div(disburseDuration) .div(10000); return pendingDisburse; } // view function to get depositors list function getDepositorsList(uint startIndex, uint endIndex) public view returns (address[] memory stakers, uint[] memory stakingTimestamps, uint[] memory lastClaimedTimeStamps, uint[] memory stakedTokens) { require (startIndex < endIndex); uint length = endIndex.sub(startIndex); address[] memory _stakers = new address[](length); uint[] memory _stakingTimestamps = new uint[](length); uint[] memory _lastClaimedTimeStamps = new uint[](length); uint[] memory _stakedTokens = new uint[](length); for (uint i = startIndex; i < endIndex; i = i.add(1)) { address staker = holders.at(i); uint listIndex = i.sub(startIndex); _stakers[listIndex] = staker; _stakingTimestamps[listIndex] = depositTime[staker]; _lastClaimedTimeStamps[listIndex] = lastClaimedTime[staker]; _stakedTokens[listIndex] = depositedTokens[staker]; } return (_stakers, _stakingTimestamps, _lastClaimedTimeStamps, _stakedTokens); } // admin can claim any tokens left in the contract after it expires or during emergency function claimAnyToken(address token, address recipient, uint amount) external onlyOwner { require(recipient != address(0), "Invalid Recipient"); require(now > adminClaimableTime, "Contract not expired yet!"); if (token == address(0)) { address payable _recipient = payable(recipient); _recipient.transfer(amount); return; } IERC20(token).safeTransfer(recipient, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[]","name":"swapPath","type":"address[]"},{"internalType":"address","name":"_uniswapV2RouterAddress","type":"address"},{"internalType":"address","name":"_feeRecipientAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"ClaimableTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"ClaimableTokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"EmergencyDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthRewardsDisbursed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthRewardsTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"FeeRecipientAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockupTime","type":"uint256"}],"name":"LockupTimeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMagicNumber","type":"uint256"}],"name":"MagicNumberChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsDisbursed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"StakingFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"router","type":"address"}],"name":"UniswapV2RouterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"UnstakingFeeChanged","type":"event"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_WAIT_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAGIC_NUMBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_FEE_RATE_X_100","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"SWAP_PATH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNSTAKING_FEE_RATE_X_100","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addContractBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"trustedClaimableTokenAddress","type":"address"}],"name":"addTrustedClaimableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminCanClaimAfter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminClaimableTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnOrDisburseTokensPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOutMin_claimAsToken_dyp","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin_attemptSwap","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimAnyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"claimAsToken","type":"address"},{"internalType":"uint256","name":"_amountOutMin_claimAsToken_weth","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin_claimAsToken_dyp","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin_attemptSwap","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"claimAs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cliffTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractDeployTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declareEmergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositToken","type":"address"},{"internalType":"uint256","name":"amountToStake","type":"uint256"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disburseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disburseDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disbursePercentX100","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disburseRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeRecipientAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"endIndex","type":"uint256"}],"name":"getDepositorsList","outputs":[{"internalType":"address[]","name":"stakers","type":"address[]"},{"internalType":"uint256[]","name":"stakingTimestamps","type":"uint256[]"},{"internalType":"uint256[]","name":"lastClaimedTimeStamps","type":"uint256[]"},{"internalType":"uint256[]","name":"stakedTokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSwappableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingDisbursement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getPendingDivs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getPendingDivsEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isEmergency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBurnOrTokenDistributeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDisburseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDivPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastEthDivPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapExecutionTime","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":"address","name":"trustedClaimableTokenAddress","type":"address"}],"name":"removeTrustedClaimableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMagicNumber","type":"uint256"},{"internalType":"uint256","name":"lockupTime","type":"uint256"},{"internalType":"uint256","name":"stakingFeeRateX100","type":"uint256"},{"internalType":"uint256","name":"unstakingFeeRateX100","type":"uint256"},{"internalType":"address","name":"_uniswapV2RouterAddress","type":"address"},{"internalType":"address","name":"newFeeRecipientAddress","type":"address"}],"name":"setContractVariables","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFeeRecipientAddress","type":"address"}],"name":"setFeeRecipientAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLockupTime","type":"uint256"}],"name":"setLockupTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMagicNumber","type":"uint256"}],"name":"setMagicNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newStakingFeeRateX100","type":"uint256"}],"name":"setStakingFeeRateX100","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IUniswapV2Router","name":"router","type":"address"}],"name":"setUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newUnstakingFeeRateX100","type":"uint256"}],"name":"setUnstakingFeeRateX100","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAttemptPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensToBeDisbursedOrBurnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensToBeSwapped","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimedRewardsEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDivPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalEarnedEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalEarnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEthDivPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokens","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":[],"name":"trustedBaseTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedClaimableTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedDepositTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedPlatformTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedRewardTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedStakingContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouterV2","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawAsToken","type":"address"},{"internalType":"uint256","name":"amountToWithdraw","type":"uint256"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405261012c6001556000600281905560038190556611da533c045c46600455600b805460ff19169055600f8190556010819055601a819055601b819055601c819055601d819055601e819055601f553480156200005e57600080fd5b506040516200546438038062005464833981810160405260608110156200008457600080fd5b8101908080516040519392919084640100000000821115620000a557600080fd5b908301906020820185811115620000bb57600080fd5b8251866020820283011164010000000082111715620000d957600080fd5b82525081516020918201928201910280838360005b8381101562000108578181015183820152602001620000ee565b505050509190910160409081526020838101519390910151600080546001600160a01b03191633179055426006819055939550935062000159929150630208c08090620028d2620001d9821b17901c565b60075560065460088190556009819055600a5562000180826001600160e01b036200023b16565b62000194816001600160e01b036200031316565b600c80546001600160a01b031916737463286a379f6f128058bb92b355e3d6e8bdb2191790558251620001cf90600d906020860190620003d4565b5050505062000468565b60008282018381101562000234576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000546001600160a01b031633146200025357600080fd5b6001600160a01b038116620002af576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420726f75746572206164647265737321000000000000000000604482015290519081900360640190fd5b600b80546001600160a01b03808416610100908102610100600160a81b03199093169290921792839055604080519290930416815290517f49381de8f56ca0c45bdd955e613a01e042fdf45d2ae4b0cfd920226fe0ed2ede9181900360200190a150565b6000546001600160a01b031633146200032b57600080fd5b6001600160a01b0381166200037a576040805162461bcd60e51b815260206004820152601060248201526f496e76616c696420616464726573732160801b604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b03838116919091179182905560408051929091168252517fafc54c644914e872610dbc4334999d957d145108fd88d63d83cc3a710dc6ee71916020908290030190a150565b8280548282559060005260206000209081019282156200042c579160200282015b828111156200042c57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620003f5565b506200043a9291506200043e565b5090565b6200046591905b808211156200043a5780546001600160a01b031916815560010162000445565b90565b614fec80620004786000396000f3fe608060405234801561001057600080fd5b50600436106104075760003560e01c80638b21990911610220578063c326bf4f11610130578063e3956a95116100b8578063f2fde38b11610087578063f2fde38b14610b05578063f3f91fa014610b2b578063f7e453b714610b51578063fccc281314610c09578063fe547f7214610c1157610407565b8063e3956a9514610a96578063e9dc18ec14610a9e578063efa9a9be14610ad4578063f1bab2ec14610afd57610407565b8063d140d6eb116100ff578063d140d6eb14610a1a578063d578ceab14610a58578063d7130e1414610a60578063dbcdc2cc14610a68578063e027c61f14610a8e57610407565b8063c326bf4f146109be578063c725e6d2146109e4578063ca7e083514610a0a578063ca9a213214610a1257610407565b8063a3c962c7116101b3578063ac51de8d11610182578063ac51de8d14610963578063b7ad18c41461096b578063b7d3786e14610973578063b9dffd3214610990578063c1665f40146109b657610407565b8063a3c962c714610893578063a6f5388c1461089b578063a891fa8914610953578063aabcad821461095b57610407565b80638f5705be116101ef5780638f5705be1461084057806398896d10146108485780639f54790d1461086e578063a1ccb8131461087657610407565b80638b219909146108025780638b7afe2e146108285780638da5cb5b146108305780638e20a1d91461083857610407565b8063452b4cfc1161031b57806358ee82fe116102ae5780636949b9d61161027d5780636949b9d6146107da578063765ae8bf146107e25780637a6eb0d0146107ea5780637e1c0c09146107f25780637e44b933146107fa57610407565b806358ee82fe1461077e578063596fa9e3146107a45780635f9e8f82146107ac5780636270cd18146107b457610407565b806349bd5a5e116102ea57806349bd5a5e146107495780634b62b70b146107515780634ca5610b1461076e57806358a3d9631461077657610407565b8063452b4cfc146106f6578063468b4d411461071357806346a28f631461071b57806346c648731461072357610407565b80632ba2ed981161039e57806331a5dda11161036d57806331a5dda1146106b057806331e244e5146106b85780633992fba5146106c05780633bed5043146106c857806344aa796a146106ee57610407565b80632ba2ed981461060b5780632e9f87a614610628578063307e52a71461066e578063308feec3146106a857610407565b80631cfa8021116103da5780631cfa80211461059c5780631f04461c146105c0578063271c23fa146105e65780632b4beea6146105ee57610407565b806305447d251461040c5780630c9a0c78146105525780630f1a64441461056c5780631419841d14610574575b600080fd5b61042f6004803603604081101561042257600080fd5b5080359060200135610c19565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b8381101561047b578181015183820152602001610463565b50505050905001858103845288818151815260200191508051906020019060200280838360005b838110156104ba5781810151838201526020016104a2565b50505050905001858103835287818151815260200191508051906020019060200280838360005b838110156104f95781810151838201526020016104e1565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015610538578181015183820152602001610520565b505050509050019850505050505050505060405180910390f35b61055a610e9d565b60408051918252519081900360200190f35b61055a610ea3565b61059a6004803603602081101561058a57600080fd5b50356001600160a01b0316610ea9565b005b6105a4610f7f565b604080516001600160a01b039092168252519081900360200190f35b61055a600480360360208110156105d657600080fd5b50356001600160a01b0316610f97565b61055a610fa9565b6105a46004803603602081101561060457600080fd5b5035610faf565b61059a6004803603602081101561062157600080fd5b5035610fd6565b61059a600480360360c081101561063e57600080fd5b508035906020810135906040810135906060810135906001600160a01b03608082013581169160a0013516611028565b6106946004803603602081101561068457600080fd5b50356001600160a01b031661107d565b604080519115158252519081900360200190f35b61055a611092565b6105a46110a3565b61059a6110b5565b61055a61117b565b61055a600480360360208110156106de57600080fd5b50356001600160a01b0316611181565b61055a61123f565b61059a6004803603602081101561070c57600080fd5b5035611246565b61055a611296565b61055a611355565b61055a6004803603602081101561073957600080fd5b50356001600160a01b031661135b565b6105a461136d565b61059a6004803603602081101561076757600080fd5b503561137c565b6105a461141e565b61055a611436565b61055a6004803603602081101561079457600080fd5b50356001600160a01b031661143c565b6105a461144e565b610694611462565b61055a600480360360208110156107ca57600080fd5b50356001600160a01b031661146b565b61055a61147d565b6105a4611483565b61055a61149b565b61055a6114a1565b61055a6114a7565b61055a6004803603602081101561081857600080fd5b50356001600160a01b03166114ad565b61055a6114bf565b6105a46114c5565b61055a6114d4565b61055a6114da565b61055a6004803603602081101561085e57600080fd5b50356001600160a01b03166114e2565b61055a611551565b61059a6004803603602081101561088c57600080fd5b5035611557565b6105a46115ee565b61059a600480360360808110156108b157600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156108e057600080fd5b8201836020820111156108f257600080fd5b803590602001918460208302840111600160201b8311171561091357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611606915050565b61055a6119eb565b61059a6119f2565b61055a611b4a565b61055a611be2565b61059a6004803603602081101561098957600080fd5b5035611be8565b61059a600480360360208110156109a657600080fd5b50356001600160a01b0316611c7f565b61055a611ce2565b61055a600480360360208110156109d457600080fd5b50356001600160a01b0316611ce8565b61059a600480360360208110156109fa57600080fd5b50356001600160a01b0316611cfa565b61055a611d5a565b61055a611d60565b61059a600480360360a0811015610a3057600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135611d67565b61055a611e8d565b61055a611e93565b61059a60048036036020811015610a7e57600080fd5b50356001600160a01b0316611e9b565b61055a611f5a565b61059a611f60565b61059a60048036036060811015610ab457600080fd5b506001600160a01b03813581169160208101359091169060400135612013565b61059a60048036036060811015610aea57600080fd5b508035906020810135906040013561213b565b6105a46121eb565b61059a60048036036020811015610b1b57600080fd5b50356001600160a01b03166121fa565b61055a60048036036020811015610b4157600080fd5b50356001600160a01b031661227f565b61059a60048036036080811015610b6757600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115610b9657600080fd5b820183602082011115610ba857600080fd5b803590602001918460208302840111600160201b83111715610bc957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250612291915050565b6105a46128be565b61055a6128c4565b606080606080848610610c2b57600080fd5b6000610c3d868863ffffffff61293516565b905060608167ffffffffffffffff81118015610c5857600080fd5b50604051908082528060200260200182016040528015610c82578160200160208202803683370190505b50905060608267ffffffffffffffff81118015610c9e57600080fd5b50604051908082528060200260200182016040528015610cc8578160200160208202803683370190505b50905060608367ffffffffffffffff81118015610ce457600080fd5b50604051908082528060200260200182016040528015610d0e578160200160208202803683370190505b50905060608467ffffffffffffffff81118015610d2a57600080fd5b50604051908082528060200260200182016040528015610d54578160200160208202803683370190505b5090508a5b8a811015610e8b576000610d7460118363ffffffff61297716565b90506000610d88838f63ffffffff61293516565b905081878281518110610d9757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060146000836001600160a01b03166001600160a01b0316815260200190815260200160002054868281518110610de957fe5b60200260200101818152505060156000836001600160a01b03166001600160a01b0316815260200190815260200160002054858281518110610e2757fe5b60200260200101818152505060136000836001600160a01b03166001600160a01b0316815260200190815260200160002054848281518110610e6557fe5b602090810291909101015250610e84905081600163ffffffff6128d216565b9050610d59565b50929a91995097509095509350505050565b61271081565b60015481565b6000546001600160a01b03163314610ec057600080fd5b6001600160a01b038116610f1b576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420726f75746572206164647265737321000000000000000000604482015290519081900360640190fd5b600b80546001600160a01b03808416610100908102610100600160a81b03199093169290921792839055604080519290930416815290517f49381de8f56ca0c45bdd955e613a01e042fdf45d2ae4b0cfd920226fe0ed2ede9181900360200190a150565b737463286a379f6f128058bb92b355e3d6e8bdb21981565b60186020526000908152604090205481565b60095481565b600d8181548110610fbc57fe5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314610fed57600080fd5b60048190556040805182815290517ffb06af695e3e2ab9f65ec2316a3cb72fd442f2288bb3bb1fa8f52cea13e446db9181900360200190a150565b6000546001600160a01b0316331461103f57600080fd5b61104886610fd6565b6110518561137c565b61105a84611be8565b61106383611557565b61106c82610ea9565b61107581611e9b565b505050505050565b60056020526000908152604090205460ff1681565b600061109e6011612983565b905090565b600080516020614f0083398151915281565b6000546001600160a01b031633146110cc57600080fd5b600b5460ff1615611112576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6d833981519152604482015290519081900360640190fd5b600b805460ff19166001179055611132426203f48063ffffffff6128d216565b6007556000600181905554604080516001600160a01b039092168252517fe465b068e033879ed58088ba05882c35e2a52240ea1432b95753d6aebdd0814a9181900360200190a1565b60045481565b600061119460118363ffffffff61298e16565b6111a05750600061123a565b6001600160a01b0382166000908152601360205260409020546111c55750600061123a565b6001600160a01b038216600090815260196020526040812054601c546111f09163ffffffff61293516565b6001600160a01b038416600090815260136020526040812054919250611234670de0b6b3a7640000611228848663ffffffff6129a316565b9063ffffffff6129fc16565b93505050505b919050565b6201518081565b6000546001600160a01b0316331461125d57600080fd5b61127d600080516020614f0083398151915233308463ffffffff612a3e16565b601a54611290908263ffffffff6128d216565b601a5550565b604080516370a0823160e01b8152737463286a379f6f128058bb92b355e3d6e8bdb219600482015290516000918291600080516020614f00833981519152916370a08231916024808301926020929190829003018186803b1580156112fa57600080fd5b505afa15801561130e573d6000803e3d6000fd5b505050506040513d602081101561132457600080fd5b505160045490915060009061134e90670de0b6b3a76400009061122890859063ffffffff6129a316565b9250505090565b60105481565b60146020526000908152604090205481565b600c546001600160a01b031681565b6000546001600160a01b0316331461139357600080fd5b6276a7008111156113e3576040805162461bcd60e51b81526020600482015260156024820152744c6f636b75702074696d6520746f6f206c6f6e672160581b604482015290519081900360640190fd5b60018190556040805182815290517fadbac78f382a6f10bef84ad4b704cac4817788ffec4f83ac665d7a1152dc44729181900360200190a150565b730b92e7f074e7ade0181a29647ea8474522e6a7c281565b601f5481565b60176020526000908152604090205481565b600b5461010090046001600160a01b031681565b600b5460ff1681565b60166020526000908152604090205481565b600a5481565b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1781565b601e5481565b601d5481565b60025481565b60196020526000908152604090205481565b601a5481565b6000546001600160a01b031681565b601b5481565b6301e1338081565b60006114f560118363ffffffff61298e16565b6115015750600061123a565b6001600160a01b0382166000908152601360205260409020546115265750600061123a565b6001600160a01b038216600090815260186020526040812054601b546111f09163ffffffff61293516565b60065481565b6000546001600160a01b0316331461156e57600080fd5b61271081106115b3576040805162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206665652160a01b604482015290519081900360640190fd5b60038190556040805182815290517f0a9e89cff3f9f01bd1c6aeb9b71324bb138123c40d02eb478613fb3427b231009181900360200190a150565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61160f33612a9e565b15801561161b57503233145b611664576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b81516006146116b0576040805162461bcd60e51b8152602060048201526013602482015272496e76616c6964206d696e416d6f756e74732160681b604482015290519081900360640190fd5b6001600160a01b03841661170b576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420776974686472617720746f6b656e21000000000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526005602052604090205460ff16611778576040805162461bcd60e51b815260206004820152601b60248201527f576974686472617720746f6b656e206e6f742074727573746564210000000000604482015290519081900360640190fd5b600083116117cd576040805162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207769746864726177203020546f6b656e732100000000000000604482015290519081900360640190fd5b33600090815260136020526040902054831115611831576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420616d6f756e7420746f207769746864726177000000000000604482015290519081900360640190fd5b6001543360009081526014602052604090205461185590429063ffffffff61293516565b116118915760405162461bcd60e51b8152600401808060200182810382526037815260200180614f206037913960400191505060405180910390fd5b6118c533836004815181106118a257fe5b6020026020010151846005815181106118b757fe5b602002602001015184612aa4565b60006118e2612710611228600354876129a390919063ffffffff16565b905060006118f6858363ffffffff61293516565b9050811561193057600e5461193090737463286a379f6f128058bb92b355e3d6e8bdb219906001600160a01b03168463ffffffff612ab316565b600061193e87838787612b05565b905061195a6001600160a01b038816338363ffffffff612ab316565b3360009081526013602052604090205461197a908763ffffffff61293516565b33600090815260136020526040902055601d5461199d908763ffffffff61293516565b601d556119b160113363ffffffff61298e16565b80156119ca575033600090815260136020526040902054155b156119e2576119e060113363ffffffff612f0c16565b505b50505050505050565b62093a8081565b6000546001600160a01b03163314611a0957600080fd5b62093a80611a22600a544261293590919063ffffffff16565b11611a74576040805162461bcd60e51b815260206004820152601f60248201527f526563656e746c792065786563757465642c20506c6561736520776169742100604482015290519081900360640190fd5b600c60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ac457600080fd5b505af1158015611ad8573d6000803e3d6000fd5b505050506000611ae6611296565b601e54909150600081831015611b0c57611b06828463ffffffff61293516565b90508291505b611b1582612f21565b8015611b3c57611b3c600080516020614f0083398151915261dead8363ffffffff612ab316565b50506000601e555042600a55565b600654600090819042908290611b6a906301e1338063ffffffff6128d216565b905080821115611b78578091505b8160085410611b8a5760009250611ba1565b600854611b9e90839063ffffffff61293516565b92505b6000611bd96127106112286301e133808188611bcd698bc2abf40221f48000008663ffffffff6129a316565b9063ffffffff6129a316565b94505050505090565b601c5481565b6000546001600160a01b03163314611bff57600080fd5b6127108110611c44576040805162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206665652160a01b604482015290519081900360640190fd5b60028190556040805182815290517f327680b8ba8221210809b2aae37f88a529ae9eec9a3a3fe952fe0a3a262b487f9181900360200190a150565b6000546001600160a01b03163314611c9657600080fd5b6001600160a01b038116600081815260056020526040808220805460ff19166001179055517f74bd711825aaf93834b0d2fb7bce500caae1be2723cbe48022e2584d6151e3329190a250565b60035481565b60136020526000908152604090205481565b6000546001600160a01b03163314611d1157600080fd5b6001600160a01b038116600081815260056020526040808220805460ff19169055517f091fc62f7712ef1aa0d7d7957476c0cf7e066e7cd795eae019e0f45f64ea00989190a250565b60075481565b6203f48081565b611d7033612a9e565b158015611d7c57503233145b611dc5576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b600b5460ff1615611e0b576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6d833981519152604482015290519081900360640190fd5b6001600160a01b03851660009081526005602052604090205460ff16611e78576040805162461bcd60e51b815260206004820152601b60248201527f63616e6e6f7420636c61696d206173207468697320746f6b656e210000000000604482015290519081900360640190fd5b611e86338686868686612fe8565b5050505050565b600f5481565b630208c08081565b6000546001600160a01b03163314611eb257600080fd5b6001600160a01b038116611f00576040805162461bcd60e51b815260206004820152601060248201526f496e76616c696420616464726573732160801b604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b03838116919091179182905560408051929091168252517fafc54c644914e872610dbc4334999d957d145108fd88d63d83cc3a710dc6ee71916020908290030190a150565b60085481565b6000546001600160a01b03163314611f7757600080fd5b62093a80611f90600a544261293590919063ffffffff16565b11611fe2576040805162461bcd60e51b815260206004820152601f60248201527f526563656e746c792065786563757465642c20506c6561736520776169742100604482015290519081900360640190fd5b601e5461200890600080516020614f008339815191529061dead9063ffffffff612ab316565b6000601e5542600a55565b6000546001600160a01b0316331461202a57600080fd5b6001600160a01b038216612079576040805162461bcd60e51b8152602060048201526011602482015270125b9d985b1a5908149958da5c1a595b9d607a1b604482015290519081900360640190fd5b60075442116120cf576040805162461bcd60e51b815260206004820152601960248201527f436f6e7472616374206e6f742065787069726564207965742100000000000000604482015290519081900360640190fd5b6001600160a01b03831661211c5760405182906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612115573d6000803e3d6000fd5b5050612136565b6121366001600160a01b038416838363ffffffff612ab316565b505050565b61214433612a9e565b15801561215057503233145b612199576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b600b5460ff16156121df576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6d833981519152604482015290519081900360640190fd5b61213633848484612aa4565b600e546001600160a01b031681565b6000546001600160a01b0316331461221157600080fd5b6001600160a01b03811661222457600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60156020526000908152604090205481565b61229a33612a9e565b1580156122a657503233145b6122ef576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b600b5460ff1615612335576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6d833981519152604482015290519081900360640190fd5b815160081461238b576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206d696e416d6f756e7473206c656e67746821000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526005602052604090205460ff166123f1576040805162461bcd60e51b8152602060048201526016602482015275496e76616c6964206465706f73697420746f6b656e2160501b604482015290519081900360640190fd5b6001600160a01b038416737463286a379f6f128058bb92b355e3d6e8bdb2191415612463576040805162461bcd60e51b815260206004820152601b60248201527f43616e6e6f74206465706f736974204c50206469726563746c79210000000000604482015290519081900360640190fd5b6001600160a01b0384166124be576040805162461bcd60e51b815260206004820152601a60248201527f4465706f73697420746f6b656e2063616e6e6f74206265203021000000000000604482015290519081900360640190fd5b60008311612513576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420616d6f756e7420746f205374616b65210000000000000000604482015290519081900360640190fd5b61252e6001600160a01b03851633308663ffffffff612a3e16565b600061254b612710611228600254876129a390919063ffffffff16565b9050600061255f858363ffffffff61293516565b9050811561258757600e54612587906001600160a01b0388811691168463ffffffff612ab316565b60006125a161271061122884611d4c63ffffffff6129a316565b905060006125b5838363ffffffff61293516565b905060006125ee8973961c8c0b1aad0c0b10a51fef6a867e3091bcef17848a6000815181106125e057fe5b60200260200101518a613758565b905061262a73961c8c0b1aad0c0b10a51fef6a867e3091bcef17730b92e7f074e7ade0181a29647ea8474522e6a7c2600063ffffffff613d1216565b61266373961c8c0b1aad0c0b10a51fef6a867e3091bcef17730b92e7f074e7ade0181a29647ea8474522e6a7c28363ffffffff613d1216565b730b92e7f074e7ade0181a29647ea8474522e6a7c26001600160a01b03166355468afa33838a60018151811061269557fe5b60200260200101518a6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001848152602001838152602001828152602001945050505050600060405180830381600087803b1580156126fb57600080fd5b505af115801561270f573d6000803e3d6000fd5b5050505060006127296002856129fc90919063ffffffff16565b9050600061273d858363ffffffff61293516565b905060006127708c600080516020614f00833981519152858d60048151811061276257fe5b60200260200101518d613758565b905060006127a98d73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2858e60058151811061279b57fe5b60200260200101518e613758565b905060006127b983838e8e613e25565b905060008111612810576040805162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206465706f736974203020546f6b656e73000000000000000000604482015290519081900360640190fd5b612844338d60068151811061282157fe5b60200260200101518e60078151811061283657fe5b60200260200101518e612aa4565b33600090815260136020526040902054612864908263ffffffff6128d216565b33600090815260136020526040902055601d54612887908263ffffffff6128d216565b601d5561289b60113363ffffffff6141c816565b505033600090815260146020526040902042905550505050505050505050505050565b61dead81565b698bc2abf40221f480000081565b60008282018381101561292c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b600061292c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506141dd565b600061292c8383614279565b600061292f826142dd565b600061292c836001600160a01b0384166142e1565b6000826129b25750600061292f565b828202828482816129bf57fe5b041461292c5760405162461bcd60e51b8152600401808060200182810382526021815260200180614eb76021913960400191505060405180910390fd5b600061292c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506142f9565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a9890859061435e565b50505050565b3b151590565b612a9884600080868686612fe8565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261213690849061435e565b600b54600090612b3990737463286a379f6f128058bb92b355e3d6e8bdb2199061010090046001600160a01b031683613d12565b600b54612b6a90737463286a379f6f128058bb92b355e3d6e8bdb2199061010090046001600160a01b031686613d12565b604080516370a0823160e01b81523060048201529051600091600080516020614f00833981519152916370a0823191602480820192602092909190829003018186803b158015612bb957600080fd5b505afa158015612bcd573d6000803e3d6000fd5b505050506040513d6020811015612be357600080fd5b5051604080516370a0823160e01b8152306004820152905191925060009173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2916370a08231916024808301926020929190829003018186803b158015612c3c57600080fd5b505afa158015612c50573d6000803e3d6000fd5b505050506040513d6020811015612c6657600080fd5b5051600b54865191925061010090046001600160a01b03169063baa2abde90600080516020614f008339815191529073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2908a908a90600090612cb857fe5b60200260200101518a600181518110612ccd57fe5b6020908102919091010151604080516001600160e01b031960e089901b1681526001600160a01b0396871660048201529490951660248501526044840192909252606483015260848201523060a482015260c48101889052815160e480830193928290030181600087803b158015612d4457600080fd5b505af1158015612d58573d6000803e3d6000fd5b505050506040513d6040811015612d6e57600080fd5b5050604080516370a0823160e01b81523060048201529051600091600080516020614f00833981519152916370a0823191602480820192602092909190829003018186803b158015612dbf57600080fd5b505afa158015612dd3573d6000803e3d6000fd5b505050506040513d6020811015612de957600080fd5b5051604080516370a0823160e01b8152306004820152905191925060009173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2916370a08231916024808301926020929190829003018186803b158015612e4257600080fd5b505afa158015612e56573d6000803e3d6000fd5b505050506040513d6020811015612e6c57600080fd5b505190506000612e82838663ffffffff61293516565b90506000612e96838663ffffffff61293516565b90506000612ebb600080516020614f008339815191528d858d60028151811061276257fe5b90506000612ee673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28e858e60038151811061279b57fe5b90506000612efa838363ffffffff6128d216565b9e9d5050505050505050505050505050565b600061292c836001600160a01b03841661440f565b600081118015612f3357506000601d54115b612f7d576040805162461bcd60e51b81526020600482015260166024820152756469737472696275746544697673206661696c65642160501b604482015290519081900360640190fd5b601d54612faf90612fa09061122884670de0b6b3a764000063ffffffff6129a316565b601b549063ffffffff6128d216565b601b556040805182815290517f497e6c34cb46390a801e970e8c72fd87aa7fded87c9b77cdac588f235904a8259181900360200190a150565b612ff06144d5565b612ffa828261453c565b6000613005876114e2565b90508015613158576000806001600160a01b038816158061304257506001600160a01b03881673961c8c0b1aad0c0b10a51fef6a867e3091bcef17145b1561307f575073961c8c0b1aad0c0b10a51fef6a867e3091bcef17613078600080516020614f0083398151915282858988613758565b915061309f565b508661309c600080516020614f0083398151915282858988613758565b91505b6130b96001600160a01b0382168a8463ffffffff612ab316565b6001600160a01b0389166000908152601660205260409020546130e2908463ffffffff6128d216565b6001600160a01b038a16600090815260166020526040902055600f5461310e908463ffffffff6128d216565b600f55604080516001600160a01b038b1681526020810185905281517f586b2e63a21a7a4e1402e36f48ce10cb1ec94684fea254c186b76d1f98ecf130929181900390910190a150505b600061316388611181565b90508015613719576001600160a01b03871615806132055750600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156131ca57600080fd5b505afa1580156131de573d6000803e3d6000fd5b505050506040513d60208110156131f457600080fd5b50516001600160a01b038881169116145b156132a45761329f8882600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561325d57600080fd5b505afa158015613271573d6000803e3d6000fd5b505050506040513d602081101561328757600080fd5b50516001600160a01b0316919063ffffffff612ab316565b61367c565b6001600160a01b03871660009081526005602052604090205460ff16613311576040805162461bcd60e51b815260206004820152601b60248201527f63616e6e6f7420636c61696d206173207468697320746f6b656e210000000000604482015290519081900360640190fd5b600b54604080516315ab88c960e31b815290516133a39261010090046001600160a01b031691600091839163ad5c4648916004808301926020929190829003018186803b15801561336157600080fd5b505afa158015613375573d6000803e3d6000fd5b505050506040513d602081101561338b57600080fd5b50516001600160a01b0316919063ffffffff613d1216565b600b54604080516315ab88c960e31b815290516133f29261010090046001600160a01b0316918491839163ad5c4648916004808301926020929190829003018186803b15801561336157600080fd5b6040805160028082526060808301845292602083019080368337019050509050600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561346057600080fd5b505afa158015613474573d6000803e3d6000fd5b505050506040513d602081101561348a57600080fd5b50518151829060009061349957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505087816001815181106134c757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b60019054906101000a90046001600160a01b03166001600160a01b03166338ed17398389848d896040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613589578181015183820152602001613571565b505050509050019650505050505050600060405180830381600087803b1580156135b257600080fd5b505af11580156135c6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156135ef57600080fd5b8101908080516040519392919084600160201b82111561360e57600080fd5b90830190602082018581111561362357600080fd5b82518660208202830111600160201b8211171561363f57600080fd5b82525081516020918201928201910280838360005b8381101561366c578181015183820152602001613654565b5050505090500160405250505050505b6001600160a01b0388166000908152601760205260409020546136a5908263ffffffff6128d216565b6001600160a01b0389166000908152601760205260409020556010546136d1908263ffffffff6128d216565b601055604080516001600160a01b038a1681526020810183905281517ff17669744a2126d947b5b82df9711ffdcc0fcea345193964bf642c98e1563b99929181900390910190a15b5050506001600160a01b039094166000908152601560209081526040808320429055601b546018835281842055601c5460199092529091205550505050565b6000846001600160a01b0316866001600160a01b0316141561377b575082613d09565b600b546137a1906001600160a01b0388811691610100900416600063ffffffff613d1216565b600b546137c6906001600160a01b03888116916101009004168663ffffffff613d1216565b604080516370a0823160e01b815230600482015290516000916001600160a01b038816916370a0823191602480820192602092909190829003018186803b15801561381057600080fd5b505afa158015613824573d6000803e3d6000fd5b505050506040513d602081101561383a57600080fd5b5051600b54604080516315ab88c960e31b815290519293506060926101009092046001600160a01b03169163ad5c464891600480820192602092909190829003018186803b15801561388b57600080fd5b505afa15801561389f573d6000803e3d6000fd5b505050506040513d60208110156138b557600080fd5b50516001600160a01b03898116911614806139545750600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561391957600080fd5b505afa15801561392d573d6000803e3d6000fd5b505050506040513d602081101561394357600080fd5b50516001600160a01b038881169116145b156139da576040805160028082526060820183529091602083019080368337019050509050878160008151811061398757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505086816001815181106139b557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613b01565b6040805160038082526080820190925290602082016060803683370190505090508781600081518110613a0957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613a7757600080fd5b505afa158015613a8b573d6000803e3d6000fd5b505050506040513d6020811015613aa157600080fd5b5051815182906001908110613ab257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508681600281518110613ae057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600b546040516338ed173960e01b8152600481018881526024820188905230606483018190526084830188905260a060448401908152855160a485015285516101009095046001600160a01b0316946338ed1739948c948c94899490938d9360c401906020878101910280838360005b83811015613b89578181015183820152602001613b71565b505050509050019650505050505050600060405180830381600087803b158015613bb257600080fd5b505af1158015613bc6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613bef57600080fd5b8101908080516040519392919084600160201b821115613c0e57600080fd5b908301906020820185811115613c2357600080fd5b82518660208202830111600160201b82111715613c3f57600080fd5b82525081516020918201928201910280838360005b83811015613c6c578181015183820152602001613c54565b505050509190910160408181526370a0823160e01b825230600483015251600096506001600160a01b038e1695506370a08231945060248083019450602093509091829003018186803b158015613cc257600080fd5b505afa158015613cd6573d6000803e3d6000fd5b505050506040513d6020811015613cec57600080fd5b505190506000613d02828563ffffffff61293516565b9450505050505b95945050505050565b801580613d98575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613d6a57600080fd5b505afa158015613d7e573d6000803e3d6000fd5b505050506040513d6020811015613d9457600080fd5b5051155b613dd35760405162461bcd60e51b8152600401808060200182810382526036815260200180614f816036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261213690849061435e565b600082600281518110613e3457fe5b6020026020010151851015613e7a5760405162461bcd60e51b815260040180806020018281038252602a815260200180614e8d602a913960400191505060405180910390fd5b82600381518110613e8757fe5b6020026020010151841015613ecd5760405162461bcd60e51b8152600401808060200182810382526028815260200180614ed86028913960400191505060405180910390fd5b604080516370a0823160e01b81523060048201529051600091737463286a379f6f128058bb92b355e3d6e8bdb219916370a0823191602480820192602092909190829003018186803b158015613f2257600080fd5b505afa158015613f36573d6000803e3d6000fd5b505050506040513d6020811015613f4c57600080fd5b5051600b54909150613f7d90600080516020614f008339815191529061010090046001600160a01b03166000613d12565b600b54613fa890600080516020614f008339815191529061010090046001600160a01b031688613d12565b600b54613fda9073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29061010090046001600160a01b03166000613d12565b600b5461400b9073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29061010090046001600160a01b031687613d12565b600b60019054906101000a90046001600160a01b03166001600160a01b031663e8e33700600080516020614f0083398151915273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc289898960028151811061406257fe5b60200260200101518a60038151811061407757fe5b6020908102919091010151604080516001600160e01b031960e08a901b1681526001600160a01b03978816600482015295909616602486015260448501939093526064840191909152608483015260a48201523060c482015260e4810187905290516101048083019260609291908290030181600087803b1580156140fb57600080fd5b505af115801561410f573d6000803e3d6000fd5b505050506040513d606081101561412557600080fd5b5050604080516370a0823160e01b81523060048201529051600091737463286a379f6f128058bb92b355e3d6e8bdb219916370a0823191602480820192602092909190829003018186803b15801561417c57600080fd5b505afa158015614190573d6000803e3d6000fd5b505050506040513d60208110156141a657600080fd5b5051905060006141bc828463ffffffff61293516565b98975050505050505050565b600061292c836001600160a01b038416614b33565b6000818484111561426c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614231578181015183820152602001614219565b50505050905090810190601f16801561425e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50508183035b9392505050565b815460009082106142bb5760405162461bcd60e51b8152600401808060200182810382526022815260200180614e256022913960400191505060405180910390fd5b8260000182815481106142ca57fe5b9060005260206000200154905092915050565b5490565b60009081526001919091016020526040902054151590565b600081836143485760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614231578181015183820152602001614219565b50600083858161435457fe5b0495945050505050565b60606143b3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614b7d9092919063ffffffff16565b805190915015612136578080602001905160208110156143d257600080fd5b50516121365760405162461bcd60e51b815260040180806020018281038252602a815260200180614f57602a913960400191505060405180910390fd5b600081815260018301602052604081205480156144cb578354600019808301919081019060009087908390811061444257fe5b906000526020600020015490508087600001848154811061445f57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061448f57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061292f565b600091505061292f565b60006144df611b4a565b905080601a5410156144f05750601a545b8015806144fd5750601d54155b15614508575061453a565b601f5461451b908263ffffffff6128d216565b601f55601a54614531908263ffffffff61293516565b601a5550426008555b565b601d5461454857614b2f565b620151806145616009544261293590919063ffffffff16565b101561456c57614b2f565b600c60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156145bc57600080fd5b505af11580156145d0573d6000803e3d6000fd5b5050505060006145ed601e54601f546128d290919063ffffffff16565b905060006145f9611296565b905080614607575050614b2f565b601f5481101561466157601f54600090614627908363ffffffff61293516565b601f5490915061463d908263ffffffff61293516565b601e54909350614653908263ffffffff6128d216565b601e55506000601f556146aa565b8181101561469f57600061467b838363ffffffff61293516565b905061468d838263ffffffff61293516565b601e919091556000601f5591506146aa565b6000601f819055601e555b816146b6575050614b2f565b604080516370a0823160e01b815230600482015290518391600080516020614f00833981519152916370a0823191602480820192602092909190829003018186803b15801561470457600080fd5b505afa158015614718573d6000803e3d6000fd5b505050506040513d602081101561472e57600080fd5b5051101561473d575050614b2f565b600b5461476990600080516020614f008339815191529061010090046001600160a01b03166000613d12565b600b5461479490600080516020614f008339815191529061010090046001600160a01b031684613d12565b6000600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156147e457600080fd5b505afa1580156147f8573d6000803e3d6000fd5b505050506040513d602081101561480e57600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561485857600080fd5b505afa15801561486c573d6000803e3d6000fd5b505050506040513d602081101561488257600080fd5b5051600b546040516338ed173960e01b8152600481018681526024820189905230606483018190526084830189905260a060448401908152600d805460a486018190529697506101009095046001600160a01b0316956338ed1739958a958d959194938d93909160c401908690801561492457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614906575b50509650505050505050600060405180830381600087803b15801561494857600080fd5b505af115801561495c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561498557600080fd5b8101908080516040519392919084600160201b8211156149a457600080fd5b9083019060208201858111156149b957600080fd5b82518660208202830111600160201b821117156149d557600080fd5b82525081516020918201928201910280838360005b83811015614a025781810151838201526020016149ea565b50505050905001604052505050506000600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015614a6057600080fd5b505afa158015614a74573d6000803e3d6000fd5b505050506040513d6020811015614a8a57600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015614ad457600080fd5b505afa158015614ae8573d6000803e3d6000fd5b505050506040513d6020811015614afe57600080fd5b505190506000614b14828463ffffffff61293516565b90508015614b2557614b2581614b94565b5050426009555050505b5050565b6000614b3f83836142e1565b614b755750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561292f565b50600061292f565b6060614b8c8484600085614c62565b949350505050565b600081118015614ba657506000601d54115b614bf7576040805162461bcd60e51b815260206004820152601960248201527f6469737472696275746544697673457468206661696c65642100000000000000604482015290519081900360640190fd5b601d54614c2990614c1a9061122884670de0b6b3a764000063ffffffff6129a316565b601c549063ffffffff6128d216565b601c556040805182815290517f56ce0eae0b79fabf707cf07252ae767ac575085fbf32b98546f8f0f01725b9749181900360200190a150565b606082471015614ca35760405162461bcd60e51b8152600401808060200182810382526026815260200180614e476026913960400191505060405180910390fd5b614cac85612a9e565b614cfd576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310614d3c5780518252601f199092019160209182019101614d1d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614d9e576040519150601f19603f3d011682016040523d82523d6000602084013e614da3565b606091505b5091509150614db3828286614dbe565b979650505050505050565b60608315614dcd575081614272565b825115614ddd5782518084602001fd5b60405162461bcd60e51b815260206004820181815284516024840152845185939192839260440191908501908083836000831561423157818101518382015260200161421956fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c43616e6e6f74206578656375746520647572696e6720656d657267656e63792152657761726420546f6b656e205265636569766564206c6f776572207468616e20657870656374656421536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774261736520546f6b656e205265636569766564206c6f776572207468616e20657870656374656421000000000000000000000000bd100d061e120b2c67a24453cf6368e63f1be056596f7520726563656e746c79206465706f73697465642c20706c656173652077616974206265666f7265207769746864726177696e672e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220a40395afee83dde14c144a8c38b98e8045891292edd217517466335349cced6664736f6c634300060b003300000000000000000000000000000000000000000000000000000000000000600000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000910090ea889b64b4e722ea4b8ff6d5e734dfb38f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000bd100d061e120b2c67a24453cf6368e63f1be056000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106104075760003560e01c80638b21990911610220578063c326bf4f11610130578063e3956a95116100b8578063f2fde38b11610087578063f2fde38b14610b05578063f3f91fa014610b2b578063f7e453b714610b51578063fccc281314610c09578063fe547f7214610c1157610407565b8063e3956a9514610a96578063e9dc18ec14610a9e578063efa9a9be14610ad4578063f1bab2ec14610afd57610407565b8063d140d6eb116100ff578063d140d6eb14610a1a578063d578ceab14610a58578063d7130e1414610a60578063dbcdc2cc14610a68578063e027c61f14610a8e57610407565b8063c326bf4f146109be578063c725e6d2146109e4578063ca7e083514610a0a578063ca9a213214610a1257610407565b8063a3c962c7116101b3578063ac51de8d11610182578063ac51de8d14610963578063b7ad18c41461096b578063b7d3786e14610973578063b9dffd3214610990578063c1665f40146109b657610407565b8063a3c962c714610893578063a6f5388c1461089b578063a891fa8914610953578063aabcad821461095b57610407565b80638f5705be116101ef5780638f5705be1461084057806398896d10146108485780639f54790d1461086e578063a1ccb8131461087657610407565b80638b219909146108025780638b7afe2e146108285780638da5cb5b146108305780638e20a1d91461083857610407565b8063452b4cfc1161031b57806358ee82fe116102ae5780636949b9d61161027d5780636949b9d6146107da578063765ae8bf146107e25780637a6eb0d0146107ea5780637e1c0c09146107f25780637e44b933146107fa57610407565b806358ee82fe1461077e578063596fa9e3146107a45780635f9e8f82146107ac5780636270cd18146107b457610407565b806349bd5a5e116102ea57806349bd5a5e146107495780634b62b70b146107515780634ca5610b1461076e57806358a3d9631461077657610407565b8063452b4cfc146106f6578063468b4d411461071357806346a28f631461071b57806346c648731461072357610407565b80632ba2ed981161039e57806331a5dda11161036d57806331a5dda1146106b057806331e244e5146106b85780633992fba5146106c05780633bed5043146106c857806344aa796a146106ee57610407565b80632ba2ed981461060b5780632e9f87a614610628578063307e52a71461066e578063308feec3146106a857610407565b80631cfa8021116103da5780631cfa80211461059c5780631f04461c146105c0578063271c23fa146105e65780632b4beea6146105ee57610407565b806305447d251461040c5780630c9a0c78146105525780630f1a64441461056c5780631419841d14610574575b600080fd5b61042f6004803603604081101561042257600080fd5b5080359060200135610c19565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b8381101561047b578181015183820152602001610463565b50505050905001858103845288818151815260200191508051906020019060200280838360005b838110156104ba5781810151838201526020016104a2565b50505050905001858103835287818151815260200191508051906020019060200280838360005b838110156104f95781810151838201526020016104e1565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015610538578181015183820152602001610520565b505050509050019850505050505050505060405180910390f35b61055a610e9d565b60408051918252519081900360200190f35b61055a610ea3565b61059a6004803603602081101561058a57600080fd5b50356001600160a01b0316610ea9565b005b6105a4610f7f565b604080516001600160a01b039092168252519081900360200190f35b61055a600480360360208110156105d657600080fd5b50356001600160a01b0316610f97565b61055a610fa9565b6105a46004803603602081101561060457600080fd5b5035610faf565b61059a6004803603602081101561062157600080fd5b5035610fd6565b61059a600480360360c081101561063e57600080fd5b508035906020810135906040810135906060810135906001600160a01b03608082013581169160a0013516611028565b6106946004803603602081101561068457600080fd5b50356001600160a01b031661107d565b604080519115158252519081900360200190f35b61055a611092565b6105a46110a3565b61059a6110b5565b61055a61117b565b61055a600480360360208110156106de57600080fd5b50356001600160a01b0316611181565b61055a61123f565b61059a6004803603602081101561070c57600080fd5b5035611246565b61055a611296565b61055a611355565b61055a6004803603602081101561073957600080fd5b50356001600160a01b031661135b565b6105a461136d565b61059a6004803603602081101561076757600080fd5b503561137c565b6105a461141e565b61055a611436565b61055a6004803603602081101561079457600080fd5b50356001600160a01b031661143c565b6105a461144e565b610694611462565b61055a600480360360208110156107ca57600080fd5b50356001600160a01b031661146b565b61055a61147d565b6105a4611483565b61055a61149b565b61055a6114a1565b61055a6114a7565b61055a6004803603602081101561081857600080fd5b50356001600160a01b03166114ad565b61055a6114bf565b6105a46114c5565b61055a6114d4565b61055a6114da565b61055a6004803603602081101561085e57600080fd5b50356001600160a01b03166114e2565b61055a611551565b61059a6004803603602081101561088c57600080fd5b5035611557565b6105a46115ee565b61059a600480360360808110156108b157600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156108e057600080fd5b8201836020820111156108f257600080fd5b803590602001918460208302840111600160201b8311171561091357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611606915050565b61055a6119eb565b61059a6119f2565b61055a611b4a565b61055a611be2565b61059a6004803603602081101561098957600080fd5b5035611be8565b61059a600480360360208110156109a657600080fd5b50356001600160a01b0316611c7f565b61055a611ce2565b61055a600480360360208110156109d457600080fd5b50356001600160a01b0316611ce8565b61059a600480360360208110156109fa57600080fd5b50356001600160a01b0316611cfa565b61055a611d5a565b61055a611d60565b61059a600480360360a0811015610a3057600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135611d67565b61055a611e8d565b61055a611e93565b61059a60048036036020811015610a7e57600080fd5b50356001600160a01b0316611e9b565b61055a611f5a565b61059a611f60565b61059a60048036036060811015610ab457600080fd5b506001600160a01b03813581169160208101359091169060400135612013565b61059a60048036036060811015610aea57600080fd5b508035906020810135906040013561213b565b6105a46121eb565b61059a60048036036020811015610b1b57600080fd5b50356001600160a01b03166121fa565b61055a60048036036020811015610b4157600080fd5b50356001600160a01b031661227f565b61059a60048036036080811015610b6757600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115610b9657600080fd5b820183602082011115610ba857600080fd5b803590602001918460208302840111600160201b83111715610bc957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250612291915050565b6105a46128be565b61055a6128c4565b606080606080848610610c2b57600080fd5b6000610c3d868863ffffffff61293516565b905060608167ffffffffffffffff81118015610c5857600080fd5b50604051908082528060200260200182016040528015610c82578160200160208202803683370190505b50905060608267ffffffffffffffff81118015610c9e57600080fd5b50604051908082528060200260200182016040528015610cc8578160200160208202803683370190505b50905060608367ffffffffffffffff81118015610ce457600080fd5b50604051908082528060200260200182016040528015610d0e578160200160208202803683370190505b50905060608467ffffffffffffffff81118015610d2a57600080fd5b50604051908082528060200260200182016040528015610d54578160200160208202803683370190505b5090508a5b8a811015610e8b576000610d7460118363ffffffff61297716565b90506000610d88838f63ffffffff61293516565b905081878281518110610d9757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060146000836001600160a01b03166001600160a01b0316815260200190815260200160002054868281518110610de957fe5b60200260200101818152505060156000836001600160a01b03166001600160a01b0316815260200190815260200160002054858281518110610e2757fe5b60200260200101818152505060136000836001600160a01b03166001600160a01b0316815260200190815260200160002054848281518110610e6557fe5b602090810291909101015250610e84905081600163ffffffff6128d216565b9050610d59565b50929a91995097509095509350505050565b61271081565b60015481565b6000546001600160a01b03163314610ec057600080fd5b6001600160a01b038116610f1b576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420726f75746572206164647265737321000000000000000000604482015290519081900360640190fd5b600b80546001600160a01b03808416610100908102610100600160a81b03199093169290921792839055604080519290930416815290517f49381de8f56ca0c45bdd955e613a01e042fdf45d2ae4b0cfd920226fe0ed2ede9181900360200190a150565b737463286a379f6f128058bb92b355e3d6e8bdb21981565b60186020526000908152604090205481565b60095481565b600d8181548110610fbc57fe5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314610fed57600080fd5b60048190556040805182815290517ffb06af695e3e2ab9f65ec2316a3cb72fd442f2288bb3bb1fa8f52cea13e446db9181900360200190a150565b6000546001600160a01b0316331461103f57600080fd5b61104886610fd6565b6110518561137c565b61105a84611be8565b61106383611557565b61106c82610ea9565b61107581611e9b565b505050505050565b60056020526000908152604090205460ff1681565b600061109e6011612983565b905090565b600080516020614f0083398151915281565b6000546001600160a01b031633146110cc57600080fd5b600b5460ff1615611112576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6d833981519152604482015290519081900360640190fd5b600b805460ff19166001179055611132426203f48063ffffffff6128d216565b6007556000600181905554604080516001600160a01b039092168252517fe465b068e033879ed58088ba05882c35e2a52240ea1432b95753d6aebdd0814a9181900360200190a1565b60045481565b600061119460118363ffffffff61298e16565b6111a05750600061123a565b6001600160a01b0382166000908152601360205260409020546111c55750600061123a565b6001600160a01b038216600090815260196020526040812054601c546111f09163ffffffff61293516565b6001600160a01b038416600090815260136020526040812054919250611234670de0b6b3a7640000611228848663ffffffff6129a316565b9063ffffffff6129fc16565b93505050505b919050565b6201518081565b6000546001600160a01b0316331461125d57600080fd5b61127d600080516020614f0083398151915233308463ffffffff612a3e16565b601a54611290908263ffffffff6128d216565b601a5550565b604080516370a0823160e01b8152737463286a379f6f128058bb92b355e3d6e8bdb219600482015290516000918291600080516020614f00833981519152916370a08231916024808301926020929190829003018186803b1580156112fa57600080fd5b505afa15801561130e573d6000803e3d6000fd5b505050506040513d602081101561132457600080fd5b505160045490915060009061134e90670de0b6b3a76400009061122890859063ffffffff6129a316565b9250505090565b60105481565b60146020526000908152604090205481565b600c546001600160a01b031681565b6000546001600160a01b0316331461139357600080fd5b6276a7008111156113e3576040805162461bcd60e51b81526020600482015260156024820152744c6f636b75702074696d6520746f6f206c6f6e672160581b604482015290519081900360640190fd5b60018190556040805182815290517fadbac78f382a6f10bef84ad4b704cac4817788ffec4f83ac665d7a1152dc44729181900360200190a150565b730b92e7f074e7ade0181a29647ea8474522e6a7c281565b601f5481565b60176020526000908152604090205481565b600b5461010090046001600160a01b031681565b600b5460ff1681565b60166020526000908152604090205481565b600a5481565b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1781565b601e5481565b601d5481565b60025481565b60196020526000908152604090205481565b601a5481565b6000546001600160a01b031681565b601b5481565b6301e1338081565b60006114f560118363ffffffff61298e16565b6115015750600061123a565b6001600160a01b0382166000908152601360205260409020546115265750600061123a565b6001600160a01b038216600090815260186020526040812054601b546111f09163ffffffff61293516565b60065481565b6000546001600160a01b0316331461156e57600080fd5b61271081106115b3576040805162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206665652160a01b604482015290519081900360640190fd5b60038190556040805182815290517f0a9e89cff3f9f01bd1c6aeb9b71324bb138123c40d02eb478613fb3427b231009181900360200190a150565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61160f33612a9e565b15801561161b57503233145b611664576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b81516006146116b0576040805162461bcd60e51b8152602060048201526013602482015272496e76616c6964206d696e416d6f756e74732160681b604482015290519081900360640190fd5b6001600160a01b03841661170b576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420776974686472617720746f6b656e21000000000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526005602052604090205460ff16611778576040805162461bcd60e51b815260206004820152601b60248201527f576974686472617720746f6b656e206e6f742074727573746564210000000000604482015290519081900360640190fd5b600083116117cd576040805162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207769746864726177203020546f6b656e732100000000000000604482015290519081900360640190fd5b33600090815260136020526040902054831115611831576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420616d6f756e7420746f207769746864726177000000000000604482015290519081900360640190fd5b6001543360009081526014602052604090205461185590429063ffffffff61293516565b116118915760405162461bcd60e51b8152600401808060200182810382526037815260200180614f206037913960400191505060405180910390fd5b6118c533836004815181106118a257fe5b6020026020010151846005815181106118b757fe5b602002602001015184612aa4565b60006118e2612710611228600354876129a390919063ffffffff16565b905060006118f6858363ffffffff61293516565b9050811561193057600e5461193090737463286a379f6f128058bb92b355e3d6e8bdb219906001600160a01b03168463ffffffff612ab316565b600061193e87838787612b05565b905061195a6001600160a01b038816338363ffffffff612ab316565b3360009081526013602052604090205461197a908763ffffffff61293516565b33600090815260136020526040902055601d5461199d908763ffffffff61293516565b601d556119b160113363ffffffff61298e16565b80156119ca575033600090815260136020526040902054155b156119e2576119e060113363ffffffff612f0c16565b505b50505050505050565b62093a8081565b6000546001600160a01b03163314611a0957600080fd5b62093a80611a22600a544261293590919063ffffffff16565b11611a74576040805162461bcd60e51b815260206004820152601f60248201527f526563656e746c792065786563757465642c20506c6561736520776169742100604482015290519081900360640190fd5b600c60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ac457600080fd5b505af1158015611ad8573d6000803e3d6000fd5b505050506000611ae6611296565b601e54909150600081831015611b0c57611b06828463ffffffff61293516565b90508291505b611b1582612f21565b8015611b3c57611b3c600080516020614f0083398151915261dead8363ffffffff612ab316565b50506000601e555042600a55565b600654600090819042908290611b6a906301e1338063ffffffff6128d216565b905080821115611b78578091505b8160085410611b8a5760009250611ba1565b600854611b9e90839063ffffffff61293516565b92505b6000611bd96127106112286301e133808188611bcd698bc2abf40221f48000008663ffffffff6129a316565b9063ffffffff6129a316565b94505050505090565b601c5481565b6000546001600160a01b03163314611bff57600080fd5b6127108110611c44576040805162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206665652160a01b604482015290519081900360640190fd5b60028190556040805182815290517f327680b8ba8221210809b2aae37f88a529ae9eec9a3a3fe952fe0a3a262b487f9181900360200190a150565b6000546001600160a01b03163314611c9657600080fd5b6001600160a01b038116600081815260056020526040808220805460ff19166001179055517f74bd711825aaf93834b0d2fb7bce500caae1be2723cbe48022e2584d6151e3329190a250565b60035481565b60136020526000908152604090205481565b6000546001600160a01b03163314611d1157600080fd5b6001600160a01b038116600081815260056020526040808220805460ff19169055517f091fc62f7712ef1aa0d7d7957476c0cf7e066e7cd795eae019e0f45f64ea00989190a250565b60075481565b6203f48081565b611d7033612a9e565b158015611d7c57503233145b611dc5576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b600b5460ff1615611e0b576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6d833981519152604482015290519081900360640190fd5b6001600160a01b03851660009081526005602052604090205460ff16611e78576040805162461bcd60e51b815260206004820152601b60248201527f63616e6e6f7420636c61696d206173207468697320746f6b656e210000000000604482015290519081900360640190fd5b611e86338686868686612fe8565b5050505050565b600f5481565b630208c08081565b6000546001600160a01b03163314611eb257600080fd5b6001600160a01b038116611f00576040805162461bcd60e51b815260206004820152601060248201526f496e76616c696420616464726573732160801b604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b03838116919091179182905560408051929091168252517fafc54c644914e872610dbc4334999d957d145108fd88d63d83cc3a710dc6ee71916020908290030190a150565b60085481565b6000546001600160a01b03163314611f7757600080fd5b62093a80611f90600a544261293590919063ffffffff16565b11611fe2576040805162461bcd60e51b815260206004820152601f60248201527f526563656e746c792065786563757465642c20506c6561736520776169742100604482015290519081900360640190fd5b601e5461200890600080516020614f008339815191529061dead9063ffffffff612ab316565b6000601e5542600a55565b6000546001600160a01b0316331461202a57600080fd5b6001600160a01b038216612079576040805162461bcd60e51b8152602060048201526011602482015270125b9d985b1a5908149958da5c1a595b9d607a1b604482015290519081900360640190fd5b60075442116120cf576040805162461bcd60e51b815260206004820152601960248201527f436f6e7472616374206e6f742065787069726564207965742100000000000000604482015290519081900360640190fd5b6001600160a01b03831661211c5760405182906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612115573d6000803e3d6000fd5b5050612136565b6121366001600160a01b038416838363ffffffff612ab316565b505050565b61214433612a9e565b15801561215057503233145b612199576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b600b5460ff16156121df576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6d833981519152604482015290519081900360640190fd5b61213633848484612aa4565b600e546001600160a01b031681565b6000546001600160a01b0316331461221157600080fd5b6001600160a01b03811661222457600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60156020526000908152604090205481565b61229a33612a9e565b1580156122a657503233145b6122ef576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b600b5460ff1615612335576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6d833981519152604482015290519081900360640190fd5b815160081461238b576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206d696e416d6f756e7473206c656e67746821000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526005602052604090205460ff166123f1576040805162461bcd60e51b8152602060048201526016602482015275496e76616c6964206465706f73697420746f6b656e2160501b604482015290519081900360640190fd5b6001600160a01b038416737463286a379f6f128058bb92b355e3d6e8bdb2191415612463576040805162461bcd60e51b815260206004820152601b60248201527f43616e6e6f74206465706f736974204c50206469726563746c79210000000000604482015290519081900360640190fd5b6001600160a01b0384166124be576040805162461bcd60e51b815260206004820152601a60248201527f4465706f73697420746f6b656e2063616e6e6f74206265203021000000000000604482015290519081900360640190fd5b60008311612513576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420616d6f756e7420746f205374616b65210000000000000000604482015290519081900360640190fd5b61252e6001600160a01b03851633308663ffffffff612a3e16565b600061254b612710611228600254876129a390919063ffffffff16565b9050600061255f858363ffffffff61293516565b9050811561258757600e54612587906001600160a01b0388811691168463ffffffff612ab316565b60006125a161271061122884611d4c63ffffffff6129a316565b905060006125b5838363ffffffff61293516565b905060006125ee8973961c8c0b1aad0c0b10a51fef6a867e3091bcef17848a6000815181106125e057fe5b60200260200101518a613758565b905061262a73961c8c0b1aad0c0b10a51fef6a867e3091bcef17730b92e7f074e7ade0181a29647ea8474522e6a7c2600063ffffffff613d1216565b61266373961c8c0b1aad0c0b10a51fef6a867e3091bcef17730b92e7f074e7ade0181a29647ea8474522e6a7c28363ffffffff613d1216565b730b92e7f074e7ade0181a29647ea8474522e6a7c26001600160a01b03166355468afa33838a60018151811061269557fe5b60200260200101518a6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001848152602001838152602001828152602001945050505050600060405180830381600087803b1580156126fb57600080fd5b505af115801561270f573d6000803e3d6000fd5b5050505060006127296002856129fc90919063ffffffff16565b9050600061273d858363ffffffff61293516565b905060006127708c600080516020614f00833981519152858d60048151811061276257fe5b60200260200101518d613758565b905060006127a98d73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2858e60058151811061279b57fe5b60200260200101518e613758565b905060006127b983838e8e613e25565b905060008111612810576040805162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206465706f736974203020546f6b656e73000000000000000000604482015290519081900360640190fd5b612844338d60068151811061282157fe5b60200260200101518e60078151811061283657fe5b60200260200101518e612aa4565b33600090815260136020526040902054612864908263ffffffff6128d216565b33600090815260136020526040902055601d54612887908263ffffffff6128d216565b601d5561289b60113363ffffffff6141c816565b505033600090815260146020526040902042905550505050505050505050505050565b61dead81565b698bc2abf40221f480000081565b60008282018381101561292c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b600061292c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506141dd565b600061292c8383614279565b600061292f826142dd565b600061292c836001600160a01b0384166142e1565b6000826129b25750600061292f565b828202828482816129bf57fe5b041461292c5760405162461bcd60e51b8152600401808060200182810382526021815260200180614eb76021913960400191505060405180910390fd5b600061292c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506142f9565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a9890859061435e565b50505050565b3b151590565b612a9884600080868686612fe8565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261213690849061435e565b600b54600090612b3990737463286a379f6f128058bb92b355e3d6e8bdb2199061010090046001600160a01b031683613d12565b600b54612b6a90737463286a379f6f128058bb92b355e3d6e8bdb2199061010090046001600160a01b031686613d12565b604080516370a0823160e01b81523060048201529051600091600080516020614f00833981519152916370a0823191602480820192602092909190829003018186803b158015612bb957600080fd5b505afa158015612bcd573d6000803e3d6000fd5b505050506040513d6020811015612be357600080fd5b5051604080516370a0823160e01b8152306004820152905191925060009173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2916370a08231916024808301926020929190829003018186803b158015612c3c57600080fd5b505afa158015612c50573d6000803e3d6000fd5b505050506040513d6020811015612c6657600080fd5b5051600b54865191925061010090046001600160a01b03169063baa2abde90600080516020614f008339815191529073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2908a908a90600090612cb857fe5b60200260200101518a600181518110612ccd57fe5b6020908102919091010151604080516001600160e01b031960e089901b1681526001600160a01b0396871660048201529490951660248501526044840192909252606483015260848201523060a482015260c48101889052815160e480830193928290030181600087803b158015612d4457600080fd5b505af1158015612d58573d6000803e3d6000fd5b505050506040513d6040811015612d6e57600080fd5b5050604080516370a0823160e01b81523060048201529051600091600080516020614f00833981519152916370a0823191602480820192602092909190829003018186803b158015612dbf57600080fd5b505afa158015612dd3573d6000803e3d6000fd5b505050506040513d6020811015612de957600080fd5b5051604080516370a0823160e01b8152306004820152905191925060009173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2916370a08231916024808301926020929190829003018186803b158015612e4257600080fd5b505afa158015612e56573d6000803e3d6000fd5b505050506040513d6020811015612e6c57600080fd5b505190506000612e82838663ffffffff61293516565b90506000612e96838663ffffffff61293516565b90506000612ebb600080516020614f008339815191528d858d60028151811061276257fe5b90506000612ee673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28e858e60038151811061279b57fe5b90506000612efa838363ffffffff6128d216565b9e9d5050505050505050505050505050565b600061292c836001600160a01b03841661440f565b600081118015612f3357506000601d54115b612f7d576040805162461bcd60e51b81526020600482015260166024820152756469737472696275746544697673206661696c65642160501b604482015290519081900360640190fd5b601d54612faf90612fa09061122884670de0b6b3a764000063ffffffff6129a316565b601b549063ffffffff6128d216565b601b556040805182815290517f497e6c34cb46390a801e970e8c72fd87aa7fded87c9b77cdac588f235904a8259181900360200190a150565b612ff06144d5565b612ffa828261453c565b6000613005876114e2565b90508015613158576000806001600160a01b038816158061304257506001600160a01b03881673961c8c0b1aad0c0b10a51fef6a867e3091bcef17145b1561307f575073961c8c0b1aad0c0b10a51fef6a867e3091bcef17613078600080516020614f0083398151915282858988613758565b915061309f565b508661309c600080516020614f0083398151915282858988613758565b91505b6130b96001600160a01b0382168a8463ffffffff612ab316565b6001600160a01b0389166000908152601660205260409020546130e2908463ffffffff6128d216565b6001600160a01b038a16600090815260166020526040902055600f5461310e908463ffffffff6128d216565b600f55604080516001600160a01b038b1681526020810185905281517f586b2e63a21a7a4e1402e36f48ce10cb1ec94684fea254c186b76d1f98ecf130929181900390910190a150505b600061316388611181565b90508015613719576001600160a01b03871615806132055750600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156131ca57600080fd5b505afa1580156131de573d6000803e3d6000fd5b505050506040513d60208110156131f457600080fd5b50516001600160a01b038881169116145b156132a45761329f8882600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561325d57600080fd5b505afa158015613271573d6000803e3d6000fd5b505050506040513d602081101561328757600080fd5b50516001600160a01b0316919063ffffffff612ab316565b61367c565b6001600160a01b03871660009081526005602052604090205460ff16613311576040805162461bcd60e51b815260206004820152601b60248201527f63616e6e6f7420636c61696d206173207468697320746f6b656e210000000000604482015290519081900360640190fd5b600b54604080516315ab88c960e31b815290516133a39261010090046001600160a01b031691600091839163ad5c4648916004808301926020929190829003018186803b15801561336157600080fd5b505afa158015613375573d6000803e3d6000fd5b505050506040513d602081101561338b57600080fd5b50516001600160a01b0316919063ffffffff613d1216565b600b54604080516315ab88c960e31b815290516133f29261010090046001600160a01b0316918491839163ad5c4648916004808301926020929190829003018186803b15801561336157600080fd5b6040805160028082526060808301845292602083019080368337019050509050600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561346057600080fd5b505afa158015613474573d6000803e3d6000fd5b505050506040513d602081101561348a57600080fd5b50518151829060009061349957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505087816001815181106134c757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b60019054906101000a90046001600160a01b03166001600160a01b03166338ed17398389848d896040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613589578181015183820152602001613571565b505050509050019650505050505050600060405180830381600087803b1580156135b257600080fd5b505af11580156135c6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156135ef57600080fd5b8101908080516040519392919084600160201b82111561360e57600080fd5b90830190602082018581111561362357600080fd5b82518660208202830111600160201b8211171561363f57600080fd5b82525081516020918201928201910280838360005b8381101561366c578181015183820152602001613654565b5050505090500160405250505050505b6001600160a01b0388166000908152601760205260409020546136a5908263ffffffff6128d216565b6001600160a01b0389166000908152601760205260409020556010546136d1908263ffffffff6128d216565b601055604080516001600160a01b038a1681526020810183905281517ff17669744a2126d947b5b82df9711ffdcc0fcea345193964bf642c98e1563b99929181900390910190a15b5050506001600160a01b039094166000908152601560209081526040808320429055601b546018835281842055601c5460199092529091205550505050565b6000846001600160a01b0316866001600160a01b0316141561377b575082613d09565b600b546137a1906001600160a01b0388811691610100900416600063ffffffff613d1216565b600b546137c6906001600160a01b03888116916101009004168663ffffffff613d1216565b604080516370a0823160e01b815230600482015290516000916001600160a01b038816916370a0823191602480820192602092909190829003018186803b15801561381057600080fd5b505afa158015613824573d6000803e3d6000fd5b505050506040513d602081101561383a57600080fd5b5051600b54604080516315ab88c960e31b815290519293506060926101009092046001600160a01b03169163ad5c464891600480820192602092909190829003018186803b15801561388b57600080fd5b505afa15801561389f573d6000803e3d6000fd5b505050506040513d60208110156138b557600080fd5b50516001600160a01b03898116911614806139545750600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561391957600080fd5b505afa15801561392d573d6000803e3d6000fd5b505050506040513d602081101561394357600080fd5b50516001600160a01b038881169116145b156139da576040805160028082526060820183529091602083019080368337019050509050878160008151811061398757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505086816001815181106139b557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613b01565b6040805160038082526080820190925290602082016060803683370190505090508781600081518110613a0957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613a7757600080fd5b505afa158015613a8b573d6000803e3d6000fd5b505050506040513d6020811015613aa157600080fd5b5051815182906001908110613ab257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508681600281518110613ae057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600b546040516338ed173960e01b8152600481018881526024820188905230606483018190526084830188905260a060448401908152855160a485015285516101009095046001600160a01b0316946338ed1739948c948c94899490938d9360c401906020878101910280838360005b83811015613b89578181015183820152602001613b71565b505050509050019650505050505050600060405180830381600087803b158015613bb257600080fd5b505af1158015613bc6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613bef57600080fd5b8101908080516040519392919084600160201b821115613c0e57600080fd5b908301906020820185811115613c2357600080fd5b82518660208202830111600160201b82111715613c3f57600080fd5b82525081516020918201928201910280838360005b83811015613c6c578181015183820152602001613c54565b505050509190910160408181526370a0823160e01b825230600483015251600096506001600160a01b038e1695506370a08231945060248083019450602093509091829003018186803b158015613cc257600080fd5b505afa158015613cd6573d6000803e3d6000fd5b505050506040513d6020811015613cec57600080fd5b505190506000613d02828563ffffffff61293516565b9450505050505b95945050505050565b801580613d98575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613d6a57600080fd5b505afa158015613d7e573d6000803e3d6000fd5b505050506040513d6020811015613d9457600080fd5b5051155b613dd35760405162461bcd60e51b8152600401808060200182810382526036815260200180614f816036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261213690849061435e565b600082600281518110613e3457fe5b6020026020010151851015613e7a5760405162461bcd60e51b815260040180806020018281038252602a815260200180614e8d602a913960400191505060405180910390fd5b82600381518110613e8757fe5b6020026020010151841015613ecd5760405162461bcd60e51b8152600401808060200182810382526028815260200180614ed86028913960400191505060405180910390fd5b604080516370a0823160e01b81523060048201529051600091737463286a379f6f128058bb92b355e3d6e8bdb219916370a0823191602480820192602092909190829003018186803b158015613f2257600080fd5b505afa158015613f36573d6000803e3d6000fd5b505050506040513d6020811015613f4c57600080fd5b5051600b54909150613f7d90600080516020614f008339815191529061010090046001600160a01b03166000613d12565b600b54613fa890600080516020614f008339815191529061010090046001600160a01b031688613d12565b600b54613fda9073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29061010090046001600160a01b03166000613d12565b600b5461400b9073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29061010090046001600160a01b031687613d12565b600b60019054906101000a90046001600160a01b03166001600160a01b031663e8e33700600080516020614f0083398151915273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc289898960028151811061406257fe5b60200260200101518a60038151811061407757fe5b6020908102919091010151604080516001600160e01b031960e08a901b1681526001600160a01b03978816600482015295909616602486015260448501939093526064840191909152608483015260a48201523060c482015260e4810187905290516101048083019260609291908290030181600087803b1580156140fb57600080fd5b505af115801561410f573d6000803e3d6000fd5b505050506040513d606081101561412557600080fd5b5050604080516370a0823160e01b81523060048201529051600091737463286a379f6f128058bb92b355e3d6e8bdb219916370a0823191602480820192602092909190829003018186803b15801561417c57600080fd5b505afa158015614190573d6000803e3d6000fd5b505050506040513d60208110156141a657600080fd5b5051905060006141bc828463ffffffff61293516565b98975050505050505050565b600061292c836001600160a01b038416614b33565b6000818484111561426c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614231578181015183820152602001614219565b50505050905090810190601f16801561425e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50508183035b9392505050565b815460009082106142bb5760405162461bcd60e51b8152600401808060200182810382526022815260200180614e256022913960400191505060405180910390fd5b8260000182815481106142ca57fe5b9060005260206000200154905092915050565b5490565b60009081526001919091016020526040902054151590565b600081836143485760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614231578181015183820152602001614219565b50600083858161435457fe5b0495945050505050565b60606143b3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614b7d9092919063ffffffff16565b805190915015612136578080602001905160208110156143d257600080fd5b50516121365760405162461bcd60e51b815260040180806020018281038252602a815260200180614f57602a913960400191505060405180910390fd5b600081815260018301602052604081205480156144cb578354600019808301919081019060009087908390811061444257fe5b906000526020600020015490508087600001848154811061445f57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061448f57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061292f565b600091505061292f565b60006144df611b4a565b905080601a5410156144f05750601a545b8015806144fd5750601d54155b15614508575061453a565b601f5461451b908263ffffffff6128d216565b601f55601a54614531908263ffffffff61293516565b601a5550426008555b565b601d5461454857614b2f565b620151806145616009544261293590919063ffffffff16565b101561456c57614b2f565b600c60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156145bc57600080fd5b505af11580156145d0573d6000803e3d6000fd5b5050505060006145ed601e54601f546128d290919063ffffffff16565b905060006145f9611296565b905080614607575050614b2f565b601f5481101561466157601f54600090614627908363ffffffff61293516565b601f5490915061463d908263ffffffff61293516565b601e54909350614653908263ffffffff6128d216565b601e55506000601f556146aa565b8181101561469f57600061467b838363ffffffff61293516565b905061468d838263ffffffff61293516565b601e919091556000601f5591506146aa565b6000601f819055601e555b816146b6575050614b2f565b604080516370a0823160e01b815230600482015290518391600080516020614f00833981519152916370a0823191602480820192602092909190829003018186803b15801561470457600080fd5b505afa158015614718573d6000803e3d6000fd5b505050506040513d602081101561472e57600080fd5b5051101561473d575050614b2f565b600b5461476990600080516020614f008339815191529061010090046001600160a01b03166000613d12565b600b5461479490600080516020614f008339815191529061010090046001600160a01b031684613d12565b6000600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156147e457600080fd5b505afa1580156147f8573d6000803e3d6000fd5b505050506040513d602081101561480e57600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561485857600080fd5b505afa15801561486c573d6000803e3d6000fd5b505050506040513d602081101561488257600080fd5b5051600b546040516338ed173960e01b8152600481018681526024820189905230606483018190526084830189905260a060448401908152600d805460a486018190529697506101009095046001600160a01b0316956338ed1739958a958d959194938d93909160c401908690801561492457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614906575b50509650505050505050600060405180830381600087803b15801561494857600080fd5b505af115801561495c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561498557600080fd5b8101908080516040519392919084600160201b8211156149a457600080fd5b9083019060208201858111156149b957600080fd5b82518660208202830111600160201b821117156149d557600080fd5b82525081516020918201928201910280838360005b83811015614a025781810151838201526020016149ea565b50505050905001604052505050506000600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015614a6057600080fd5b505afa158015614a74573d6000803e3d6000fd5b505050506040513d6020811015614a8a57600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015614ad457600080fd5b505afa158015614ae8573d6000803e3d6000fd5b505050506040513d6020811015614afe57600080fd5b505190506000614b14828463ffffffff61293516565b90508015614b2557614b2581614b94565b5050426009555050505b5050565b6000614b3f83836142e1565b614b755750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561292f565b50600061292f565b6060614b8c8484600085614c62565b949350505050565b600081118015614ba657506000601d54115b614bf7576040805162461bcd60e51b815260206004820152601960248201527f6469737472696275746544697673457468206661696c65642100000000000000604482015290519081900360640190fd5b601d54614c2990614c1a9061122884670de0b6b3a764000063ffffffff6129a316565b601c549063ffffffff6128d216565b601c556040805182815290517f56ce0eae0b79fabf707cf07252ae767ac575085fbf32b98546f8f0f01725b9749181900360200190a150565b606082471015614ca35760405162461bcd60e51b8152600401808060200182810382526026815260200180614e476026913960400191505060405180910390fd5b614cac85612a9e565b614cfd576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310614d3c5780518252601f199092019160209182019101614d1d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614d9e576040519150601f19603f3d011682016040523d82523d6000602084013e614da3565b606091505b5091509150614db3828286614dbe565b979650505050505050565b60608315614dcd575081614272565b825115614ddd5782518084602001fd5b60405162461bcd60e51b815260206004820181815284516024840152845185939192839260440191908501908083836000831561423157818101518382015260200161421956fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c43616e6e6f74206578656375746520647572696e6720656d657267656e63792152657761726420546f6b656e205265636569766564206c6f776572207468616e20657870656374656421536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774261736520546f6b656e205265636569766564206c6f776572207468616e20657870656374656421000000000000000000000000bd100d061e120b2c67a24453cf6368e63f1be056596f7520726563656e746c79206465706f73697465642c20706c656173652077616974206265666f7265207769746864726177696e672e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220a40395afee83dde14c144a8c38b98e8045891292edd217517466335349cced6664736f6c634300060b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000600000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000910090ea889b64b4e722ea4b8ff6d5e734dfb38f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000bd100d061e120b2c67a24453cf6368e63f1be056000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : swapPath (address[]): 0xBD100d061E120b2c67A24453CF6368E63f1Be056,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [1] : _uniswapV2RouterAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _feeRecipientAddress (address): 0x910090Ea889B64B4e722ea4b8fF6D5e734dFb38F
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 000000000000000000000000910090ea889b64b4e722ea4b8ff6d5e734dfb38f
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [4] : 000000000000000000000000bd100d061e120b2c67a24453cf6368e63f1be056
Arg [5] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode Sourcemap
33491:32103:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63895:1131;;;;;;;;;;;;;;;;-1:-1:-1;63895:1131:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36353:48;;;:::i;:::-;;;;;;;;;;;;;;;;35636:33;;;:::i;40173:253::-;;;;;;;;;;;;;;;;-1:-1:-1;40173:253:0;-1:-1:-1;;;;;40173:253:0;;:::i;:::-;;34671:95;;;:::i;:::-;;;;-1:-1:-1;;;;;34671:95:0;;;;;;;;;;;;;;39760:46;;;;;;;;;;;;;;;;-1:-1:-1;39760:46:0;-1:-1:-1;;;;;39760:46:0;;:::i;37498:33::-;;;:::i;37720:26::-;;;;;;;;;;;;;;;;-1:-1:-1;37720:26:0;;:::i;40984:158::-;;;;;;;;;;;;;;;;-1:-1:-1;40984:158:0;;:::i;41376:588::-;;;;;;;;;;;;;;;;-1:-1:-1;41376:588:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41376:588:0;;;;;;;;;;;;:::i;36839:55::-;;;;;;;;;;;;;;;;-1:-1:-1;36839:55:0;-1:-1:-1;;;;;36839:55:0;;:::i;:::-;;;;;;;;;;;;;;;;;;47752:99;;;:::i;34884:94::-;;;:::i;39105:237::-;;;:::i;36574:43::-;;;:::i;47252:442::-;;;;;;;;;;;;;;;;-1:-1:-1;47252:442:0;-1:-1:-1;;;;;47252:442:0;;:::i;36097:47::-;;;:::i;42044:218::-;;;;;;;;;;;;;;;;-1:-1:-1;42044:218:0;;:::i;62710:289::-;;;:::i;39392:38::-;;;:::i;39543:44::-;;;;;;;;;;;;;;;;-1:-1:-1;39543:44:0;-1:-1:-1;;;;;39543:44:0;;:::i;37678:35::-;;;:::i;41148:220::-;;;;;;;;;;;;;;;;-1:-1:-1;41148:220:0;;:::i;34987:98::-;;;:::i;40077:33::-;;;:::i;39706:47::-;;;;;;;;;;;;;;;;-1:-1:-1;39706:47:0;-1:-1:-1;;;;;39706:47:0;;:::i;37632:39::-;;;:::i;37588:31::-;;;:::i;39649:50::-;;;;;;;;;;;;;;;;-1:-1:-1;39649:50:0;-1:-1:-1;;;;;39649:50:0;;:::i;37538:41::-;;;:::i;35159:96::-;;;:::i;40028:42::-;;;:::i;39988:27::-;;;:::i;36476:38::-;;;:::i;39813:49::-;;;;;;;;;;;;;;;;-1:-1:-1;39813:49:0;-1:-1:-1;;;;;39813:49:0;;:::i;39871:31::-;;;:::i;27843:20::-;;;:::i;39911:30::-;;;:::i;35813:48::-;;;:::i;46742:433::-;;;;;;;;;;;;;;;;-1:-1:-1;46742:433:0;-1:-1:-1;;;;;46742:433:0;;:::i;37389:30::-;;;:::i;40701:277::-;;;;;;;;;;;;;;;;-1:-1:-1;40701:277:0;;:::i;35317:92::-;;;:::i;52691:1998::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52691:1998:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52691:1998:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52691:1998:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52691:1998:0;;-1:-1:-1;;52691:1998:0;;;-1:-1:-1;52691:1998:0;;-1:-1:-1;;52691:1998:0:i;36212:56::-;;;:::i;61107:940::-;;;:::i;63106:736::-;;;:::i;39948:33::-;;;:::i;40432:263::-;;;;;;;;;;;;;;;;-1:-1:-1;40432:263:0;;:::i;36901:234::-;;;;;;;;;;;;;;;;-1:-1:-1;36901:234:0;-1:-1:-1;;;;;36901:234:0;;:::i;36521:40::-;;;:::i;39488:48::-;;;;;;;;;;;;;;;;-1:-1:-1;39488:48:0;-1:-1:-1;;;;;39488:48:0;;:::i;37141:240::-;;;;;;;;;;;;;;;;-1:-1:-1;37141:240:0;-1:-1:-1;;;;;37141:240:0;;:::i;37426:30::-;;;:::i;36414:49::-;;;:::i;56943:455::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;56943:455:0;;;;;;;;;;;;;;;;;;;;;;;:::i;39350:35::-;;;:::i;35995:50::-;;;:::i;38455:283::-;;;;;;;;;;;;;;;;-1:-1:-1;38455:283:0;-1:-1:-1;;;;;38455:283:0;;:::i;37463:28::-;;;:::i;62112:361::-;;;:::i;65129:462::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;65129:462:0;;;;;;;;;;;;;;;;;:::i;56672:259::-;;;;;;;;;;;;;;;;-1:-1:-1;56672:259:0;;;;;;;;;;;;:::i;37759:34::-;;;:::i;28462:178::-;;;;;;;;;;;;;;;;-1:-1:-1;28462:178:0;-1:-1:-1;;;;;28462:178:0;;:::i;39594:48::-;;;;;;;;;;;;;;;;-1:-1:-1;39594:48:0;-1:-1:-1;;;;;39594:48:0;;:::i;47903:3257::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47903:3257:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47903:3257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47903:3257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47903:3257:0;;-1:-1:-1;;47903:3257:0;;;-1:-1:-1;47903:3257:0;;-1:-1:-1;;47903:3257:0:i;35469:81::-;;;:::i;35703:47::-;;;:::i;63895:1131::-;64002:24;64041:31;64087:35;64137:26;64198:8;64185:10;:21;64176:31;;;;;;64220:11;64234:24;:8;64247:10;64234:24;:12;:24;:::i;:::-;64220:38;;64269:25;64311:6;64297:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64297:21:0;;64269:49;;64329:32;64375:6;64364:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64364:18:0;;64329:53;;64393:36;64443:6;64432:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64432:18:0;;64393:57;;64461:27;64502:6;64491:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64491:18:0;-1:-1:-1;64461:48:0;-1:-1:-1;64536:10:0;64522:408;64552:8;64548:1;:12;64522:408;;;64591:14;64608:13;:7;64619:1;64608:13;:10;:13;:::i;:::-;64591:30;-1:-1:-1;64636:14:0;64653:17;:1;64659:10;64653:17;:5;:17;:::i;:::-;64636:34;;64707:6;64685:8;64694:9;64685:19;;;;;;;;;;;;;:28;-1:-1:-1;;;;;64685:28:0;;;-1:-1:-1;;;;;64685:28:0;;;;;64760:11;:19;64772:6;-1:-1:-1;;;;;64760:19:0;-1:-1:-1;;;;;64760:19:0;;;;;;;;;;;;;64728:18;64747:9;64728:29;;;;;;;;;;;;;:51;;;;;64830:15;:23;64846:6;-1:-1:-1;;;;;64830:23:0;-1:-1:-1;;;;;64830:23:0;;;;;;;;;;;;;64794:22;64817:9;64794:33;;;;;;;;;;;;;:59;;;;;64895:15;:23;64911:6;-1:-1:-1;;;;;64895:23:0;-1:-1:-1;;;;;64895:23:0;;;;;;;;;;;;;64868:13;64882:9;64868:24;;;;;;;;;;;;;;;;;:50;-1:-1:-1;64566:8:0;;-1:-1:-1;64566:1:0;64572;64566:8;:5;:8;:::i;:::-;64562:12;;64522:408;;;-1:-1:-1;64950:8:0;;64960:18;;-1:-1:-1;64960:18:0;-1:-1:-1;64950:8:0;;-1:-1:-1;63895:1131:0;-1:-1:-1;;;;63895:1131:0:o;36353:48::-;36396:5;36353:48;:::o;35636:33::-;;;;:::o;40173:253::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;-1:-1:-1;;;;;40262:29:0;::::1;40254:65;;;::::0;;-1:-1:-1;;;40254:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;40330:15;:24:::0;;-1:-1:-1;;;;;40330:24:0;;::::1;;::::0;;::::1;-1:-1:-1::0;;;;;;40330:24:0;;::::1;::::0;;;::::1;::::0;;;;40370:48:::1;::::0;;40401:15;;;::::1;;40370:48:::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;40173:253:::0;:::o;34671:95::-;34724:42;34671:95;:::o;39760:46::-;;;;;;;;;;;;;:::o;37498:33::-;;;;:::o;37720:26::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37720:26:0;;-1:-1:-1;37720:26:0;:::o;40984:158::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;41057:12:::1;:29:::0;;;41102:32:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;40984:158:::0;:::o;41376:588::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;41653:30:::1;41668:14;41653;:30::i;:::-;41694:25;41708:10;41694:13;:25::i;:::-;41730:41;41752:18;41730:21;:41::i;:::-;41782:45;41806:20;41782:23;:45::i;:::-;41838:61;41874:23;41838:18;:61::i;:::-;41910:46;41933:22;41910;:46::i;:::-;41376:588:::0;;;;;;:::o;36839:55::-;;;;;;;;;;;;;;;:::o;47752:99::-;47803:4;47827:16;:7;:14;:16::i;:::-;47820:23;;47752:99;:::o;34884:94::-;-1:-1:-1;;;;;;;;;;;34884:94:0;:::o;39105:237::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;39025:11:::1;::::0;::::1;;39024:12;39016:57;;;::::0;;-1:-1:-1;;;39016:57:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;39016:57:0;;;;;;;;;;;;;::::1;;39182:11:::2;:18:::0;;-1:-1:-1;;39182:18:0::2;39196:4;39182:18;::::0;;39232:28:::2;:3;36457:6;39232:28;:7;:28;:::i;:::-;39211:18;:49:::0;39283:1:::2;39271:9;:13:::0;;;39328:5;39310:24:::2;::::0;;-1:-1:-1;;;;;39328:5:0;;::::2;39310:24:::0;;;::::2;::::0;;;;::::2;::::0;;::::2;39105:237::o:0;36574:43::-;;;;:::o;47252:442::-;47317:4;47339:25;:7;47356;47339:25;:16;:25;:::i;:::-;47334:40;;-1:-1:-1;47373:1:0;47366:8;;47334:40;-1:-1:-1;;;;;47389:24:0;;;;;;:15;:24;;;;;;47385:43;;-1:-1:-1;47427:1:0;47420:8;;47385:43;-1:-1:-1;;;;;47483:25:0;;47441:17;47483:25;;;:16;:25;;;;;;47461:17;;:48;;;:21;:48;:::i;:::-;-1:-1:-1;;;;;47545:24:0;;47522:20;47545:24;;;:15;:24;;;;;;47441:68;;-1:-1:-1;47601:54:0;40160:4;47601:33;47545:24;47441:68;47601:33;:19;:33;:::i;:::-;:37;:54;:37;:54;:::i;:::-;47582:73;-1:-1:-1;;;;47252:442:0;;;;:::o;36097:47::-;36138:6;36097:47;:::o;42044:218::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;42113:85:::1;-1:-1:-1::0;;;;;;;;;;;42164:10:0::1;42184:4;42191:6:::0;42113:85:::1;:50;:85;:::i;:::-;42227:15;::::0;:27:::1;::::0;42247:6;42227:27:::1;:19;:27;:::i;:::-;42209:15;:45:::0;-1:-1:-1;42044:218:0:o;62710:289::-;62804:71;;;-1:-1:-1;;;62804:71:0;;34724:42;62804:71;;;;;;62764:4;;;;-1:-1:-1;;;;;;;;;;;34936:42:0;62804:43;;:71;;;;;;;;;;;;;;34936:42;62804:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62804:71:0;62932:12;;62804:71;;-1:-1:-1;62886:23:0;;62912:43;;62950:4;;62912:33;;62804:71;;62912:33;:19;:33;:::i;:43::-;62886:69;-1:-1:-1;;;62710:289:0;:::o;39392:38::-;;;;:::o;39543:44::-;;;;;;;;;;;;;:::o;37678:35::-;;;-1:-1:-1;;;;;37678:35:0;;:::o;41148:220::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;41246:7:::1;41228:14;:25;;41220:59;;;::::0;;-1:-1:-1;;;41220:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41220:59:0;;;;;;;;;;;;;::::1;;41290:9;:26:::0;;;41332:28:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;41148:220:::0;:::o;34987:98::-;35043:42;34987:98;:::o;40077:33::-;;;;:::o;39706:47::-;;;;;;;;;;;;;:::o;37632:39::-;;;;;;-1:-1:-1;;;;;37632:39:0;;:::o;37588:31::-;;;;;;:::o;39649:50::-;;;;;;;;;;;;;:::o;37538:41::-;;;;:::o;35159:96::-;35213:42;35159:96;:::o;40028:42::-;;;;:::o;39988:27::-;;;;:::o;36476:38::-;;;;:::o;39813:49::-;;;;;;;;;;;;;:::o;39871:31::-;;;;:::o;27843:20::-;;;-1:-1:-1;;;;;27843:20:0;;:::o;39911:30::-;;;;:::o;35813:48::-;35853:8;35813:48;:::o;46742:433::-;46804:4;46826:25;:7;46843;46826:25;:16;:25;:::i;:::-;46821:40;;-1:-1:-1;46860:1:0;46853:8;;46821:40;-1:-1:-1;;;;;46876:24:0;;;;;;:15;:24;;;;;;46872:43;;-1:-1:-1;46914:1:0;46907:8;;46872:43;-1:-1:-1;;;;;46967:22:0;;46928:17;46967:22;;;:13;:22;;;;;;46948:14;;:42;;;:18;:42;:::i;37389:30::-;;;;:::o;40701:277::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;40826:5:::1;40800:23;:31;40792:56;;;::::0;;-1:-1:-1;;;40792:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40792:56:0;;;;;;;;;;;;;::::1;;40859:24;:50:::0;;;40925:45:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;40701:277:::0;:::o;35317:92::-;35367:42;35317:92;:::o;52691:1998::-;38861:32;38869:10;38861:30;:32::i;:::-;38859:35;:62;;;;-1:-1:-1;38898:9:0;38911:10;38898:23;38859:62;38851:96;;;;;-1:-1:-1;;;38851:96:0;;;;;;;;;;;;-1:-1:-1;;;38851:96:0;;;;;;;;;;;;;;;53246:10:::1;:17;53267:1;53246:22;53238:54;;;::::0;;-1:-1:-1;;;53238:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;53238:54:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;53311:29:0;::::1;53303:65;;;::::0;;-1:-1:-1;;;53303:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;53387:39:0;::::1;;::::0;;;:22:::1;:39;::::0;;;;;::::1;;53379:79;;;::::0;;-1:-1:-1;;;53379:79:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;53496:1;53477:16;:20;53469:58;;;::::0;;-1:-1:-1;;;53469:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;53564:10;53548:27;::::0;;;:15:::1;:27;::::0;;;;;:47;-1:-1:-1;53548:47:0::1;53540:86;;;::::0;;-1:-1:-1;;;53540:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;53680:9;::::0;53665:10:::1;53653:23;::::0;;;:11:::1;:23;::::0;;;;;53645:32:::1;::::0;:3:::1;::::0;:32:::1;:7;:32;:::i;:::-;:44;53637:112;;;;-1:-1:-1::0;;;53637:112:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53770:132;53784:10;53831;53842:1;53831:13;;;;;;;;;;;;;;53877:10;53888:1;53877:13;;;;;;;;;;;;;;53892:9;53770:13;:132::i;:::-;53923:8;53934:57;53985:5;53934:46;53955:24;;53934:16;:20;;:46;;;;:::i;:57::-;53923:68:::0;-1:-1:-1;54002:19:0::1;54024:25;:16:::0;53923:68;54024:25:::1;:20;:25;:::i;:::-;54002:47:::0;-1:-1:-1;54064:7:0;;54060:113:::1;;54136:19;::::0;54088:73:::1;::::0;34724:42:::1;::::0;-1:-1:-1;;;;;54136:19:0::1;54157:3:::0;54088:73:::1;:47;:73;:::i;:::-;54185:26;54214:98;54257:15;54274:14;54290:10;54302:9;54214:42;:98::i;:::-;54185:127:::0;-1:-1:-1;54325:71:0::1;-1:-1:-1::0;;;;;54325:36:0;::::1;54362:10;54185:127:::0;54325:71:::1;:36;:71;:::i;:::-;54455:10;54439:27;::::0;;;:15:::1;:27;::::0;;;;;:49:::1;::::0;54471:16;54439:49:::1;:31;:49;:::i;:::-;54425:10;54409:27;::::0;;;:15:::1;:27;::::0;;;;:79;54513:11:::1;::::0;:33:::1;::::0;54529:16;54513:33:::1;:15;:33;:::i;:::-;54499:11;:47:::0;54563:28:::1;:7;54580:10;54563:28;:16;:28;:::i;:::-;:64;;;;-1:-1:-1::0;54611:10:0::1;54595:27;::::0;;;:15:::1;:27;::::0;;;;;:32;54563:64:::1;54559:123;;;54644:26;:7;54659:10;54644:26;:14;:26;:::i;:::-;;54559:123;38958:1;;;52691:1998:::0;;;;:::o;36212:56::-;36262:6;36212:56;:::o;61107:940::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;36262:6:::1;61175:38;61183:29;;61175:3;:7;;:38;;;;:::i;:::-;:67;61167:111;;;::::0;;-1:-1:-1;;;61167:111:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;61344:13;;;;;;;;;-1:-1:-1::0;;;;;61344:13:0::1;-1:-1:-1::0;;;;;61344:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;61385:23;61411;:21;:23::i;:::-;61483:26;::::0;61385:49;;-1:-1:-1;61455:25:0::1;61566:41:::0;;::::1;61562:193;;;61643:44;:20:::0;61668:18;61643:44:::1;:24;:44;:::i;:::-;61624:63;;61725:18;61702:41;;61562:193;61775:36;61790:20;61775:14;:36::i;:::-;61826:20:::0;;61822:131:::1;;61863:78;-1:-1:-1::0;;;;;;;;;;;35508:42:0::1;61924:16:::0;61863:78:::1;:46;:78;:::i;:::-;-1:-1:-1::0;;61992:1:0::1;61963:26;:30:::0;-1:-1:-1;62036:3:0::1;62004:29;:35:::0;61107:940::o;63106:736::-;63251:18;;63161:4;;;;63214:3;;63161:4;;63251:40;;35853:8;63251:40;:22;:40;:::i;:::-;63228:63;;63313:15;63306:4;:22;63302:77;;;63352:15;63345:22;;63302:77;63413:4;63393:16;;:24;63389:139;;63445:1;63434:12;;63389:139;;;63499:16;;63490:26;;:4;;:26;:8;:26;:::i;:::-;63479:37;;63389:139;63540:20;63563:238;63795:5;63563:189;35853:8;63563:189;63683:8;63563:77;35741:9;63795:5;63563:77;:56;:77;:::i;:::-;:119;:129;:119;:129;:::i;:238::-;63540:261;-1:-1:-1;;;;;63106:736:0;:::o;39948:33::-;;;;:::o;40432:263::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;40551:5:::1;40527:21;:29;40519:54;;;::::0;;-1:-1:-1;;;40519:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40519:54:0;;;;;;;;;;;;;::::1;;40584:22;:46:::0;;;40646:41:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;40432:263:::0;:::o;36901:234::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;-1:-1:-1;;;;;37003:52:0;::::1;;::::0;;;:22:::1;:52;::::0;;;;;:59;;-1:-1:-1;;37003:59:0::1;37058:4;37003:59;::::0;;37078:49;::::1;::::0;37003:52;37078:49:::1;36901:234:::0;:::o;36521:40::-;;;;:::o;39488:48::-;;;;;;;;;;;;;:::o;37141:240::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;-1:-1:-1;;;;;37246:52:0;::::1;37301:5;37246:52:::0;;;:22:::1;:52;::::0;;;;;:60;;-1:-1:-1;;37246:60:0::1;::::0;;37322:51;::::1;::::0;37301:5;37322:51:::1;37141:240:::0;:::o;37426:30::-;;;;:::o;36414:49::-;36457:6;36414:49;:::o;56943:455::-;38861:32;38869:10;38861:30;:32::i;:::-;38859:35;:62;;;;-1:-1:-1;38898:9:0;38911:10;38898:23;38859:62;38851:96;;;;;-1:-1:-1;;;38851:96:0;;;;;;;;;;;;-1:-1:-1;;;38851:96:0;;;;;;;;;;;;;;;39025:11:::1;::::0;::::1;;39024:12;39016:57;;;::::0;;-1:-1:-1;;;39016:57:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;39016:57:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;57169:36:0;::::2;;::::0;;;:22:::2;:36;::::0;;;;;::::2;;57161:76;;;::::0;;-1:-1:-1;;;57161:76:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;57248:142;57262:10;57274:12;57288:31;57321:30;57353:25;57380:9;57248:13;:142::i;:::-;56943:455:::0;;;;;:::o;39350:35::-;;;;:::o;35995:50::-;36037:8;35995:50;:::o;38455:283::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;-1:-1:-1;;;;;38555:36:0;::::1;38547:65;;;::::0;;-1:-1:-1;;;38547:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38547:65:0;;;;;;;;;;;;;::::1;;38623:19;:44:::0;;-1:-1:-1;;;;;;38623:44:0::1;-1:-1:-1::0;;;;;38623:44:0;;::::1;::::0;;;::::1;::::0;;;;38683:47:::1;::::0;;38710:19;;;::::1;38683:47:::0;;;::::1;::::0;::::1;::::0;;;;;;::::1;38455:283:::0;:::o;37463:28::-;;;;:::o;62112:361::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;36262:6:::1;62176:38;62184:29;;62176:3;:7;;:38;;;;:::i;:::-;:67;62168:111;;;::::0;;-1:-1:-1;;;62168:111:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;62351:26;::::0;62290:88:::1;::::0;-1:-1:-1;;;;;;;;;;;34936:42:0;35508::::1;::::0;62290:88:::1;:46;:88;:::i;:::-;62418:1;62389:26;:30:::0;62462:3:::1;62430:29;:35:::0;62112:361::o;65129:462::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;-1:-1:-1;;;;;65237:23:0;::::1;65229:53;;;::::0;;-1:-1:-1;;;65229:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;65229:53:0;;;;;;;;;;;;;::::1;;65307:18;;65301:3;:24;65293:62;;;::::0;;-1:-1:-1;;;65293:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;65370:19:0;::::1;65366:162;;65468:27;::::0;65443:9;;-1:-1:-1;;;;;65468:19:0;::::1;::::0;:27;::::1;;;::::0;65488:6;;65406:26:::1;65468:27:::0;65406:26;65468:27;65488:6;65468:19;:27;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;65510:7;;;65366:162;65538:45;-1:-1:-1::0;;;;;65538:26:0;::::1;65565:9:::0;65576:6;65538:45:::1;:26;:45;:::i;:::-;65129:462:::0;;;:::o;56672:259::-;38861:32;38869:10;38861:30;:32::i;:::-;38859:35;:62;;;;-1:-1:-1;38898:9:0;38911:10;38898:23;38859:62;38851:96;;;;;-1:-1:-1;;;38851:96:0;;;;;;;;;;;;-1:-1:-1;;;38851:96:0;;;;;;;;;;;;;;;39025:11:::1;::::0;::::1;;39024:12;39016:57;;;::::0;;-1:-1:-1;;;39016:57:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;39016:57:0;;;;;;;;;;;;;::::1;;56828:95:::2;56842:10;56854:30;56886:25;56913:9;56828:13;:95::i;37759:34::-:0;;;-1:-1:-1;;;;;37759:34:0;;:::o;28462:178::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;-1:-1:-1;;;;;28539:22:0;::::1;28531:31;;;::::0;::::1;;28595:5;::::0;;28574:37:::1;::::0;-1:-1:-1;;;;;28574:37:0;;::::1;::::0;28595:5;::::1;::::0;28574:37:::1;::::0;::::1;28618:5;:16:::0;;-1:-1:-1;;;;;;28618:16:0::1;-1:-1:-1::0;;;;;28618:16:0;;;::::1;::::0;;;::::1;::::0;;28462:178::o;39594:48::-;;;;;;;;;;;;;:::o;47903:3257::-;38861:32;38869:10;38861:30;:32::i;:::-;38859:35;:62;;;;-1:-1:-1;38898:9:0;38911:10;38898:23;38859:62;38851:96;;;;;-1:-1:-1;;;38851:96:0;;;;;;;;;;;;-1:-1:-1;;;38851:96:0;;;;;;;;;;;;;;;39025:11:::1;::::0;::::1;;39024:12;39016:57;;;::::0;;-1:-1:-1;;;39016:57:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;39016:57:0;;;;;;;;;;;;;::::1;;48553:10:::2;:17;48574:1;48553:22;48545:61;;;::::0;;-1:-1:-1;;;48545:61:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;48635:36:0;::::2;;::::0;;;:22:::2;:36;::::0;;;;;::::2;;48627:71;;;::::0;;-1:-1:-1;;;48627:71:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48627:71:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;48871:42:0;::::2;34724;48871;;48863:82;;;::::0;;-1:-1:-1;;;48863:82:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;48964:26:0;::::2;48956:65;;;::::0;;-1:-1:-1;;;48956:65:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;49058:1;49042:13;:17;49034:54;;;::::0;;-1:-1:-1;;;49034:54:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;49101:79;-1:-1:-1::0;;;;;49101:37:0;::::2;49139:10;49159:4;49166:13:::0;49101:79:::2;:37;:79;:::i;:::-;49193:8;49204:52;49250:5;49204:41;49222:22;;49204:13;:17;;:41;;;;:::i;:52::-;49193:63:::0;-1:-1:-1;49267:19:0::2;49289:22;:13:::0;49193:63;49289:22:::2;:17;:22;:::i;:::-;49267:44:::0;-1:-1:-1;49326:7:0;;49322:99:::2;;49384:19;::::0;49350:59:::2;::::0;-1:-1:-1;;;;;49350:33:0;;::::2;::::0;49384:19:::2;49405:3:::0;49350:59:::2;:33;:59;:::i;:::-;49433:15;49451:35;49480:5;49451:24;:14:::0;49470:4:::2;49451:24;:18;:24;:::i;:35::-;49433:53:::0;-1:-1:-1;49497:15:0::2;49515:30;:14:::0;49433:53;49515:30:::2;:18;:30;:::i;:::-;49497:48;;49558:30;49591:114;49598:12;35213:42;49641:10;49680;49691:1;49680:13;;;;;;;;;;;;;;49695:9;49591:6;:114::i;:::-;49558:147:::0;-1:-1:-1;49718:90:0::2;35213:42;35043;49806:1;49718:90;:47;:90;:::i;:::-;49819:114;35213:42;35043;49907:25:::0;49819:114:::2;:47;:114;:::i;:::-;35043:42;-1:-1:-1::0;;;;;49946:64:0::2;;50011:10;50023:25;50086:10;50097:1;50086:13;;;;;;;;;;;;;;50101:9;49946:165;;;;;;;;;;;;;-1:-1:-1::0;;;;;49946:165:0::2;-1:-1:-1::0;;;;;49946:165:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;50124:9;50136:17;50151:1;50136:10;:14;;:17;;;;:::i;:::-;50124:29:::0;-1:-1:-1;50164:14:0::2;50181:20;:10:::0;50124:29;50181:20:::2;:14;:20;:::i;:::-;50164:37;;50214:25;50242:116;50249:12;-1:-1:-1::0;;;;;;;;;;;50290:4:0::2;50333:10;50344:1;50333:13;;;;;;;;;;;;;;50348:9;50242:6;:116::i;:::-;50214:144;;50369:23;50395:117;50402:12;35367:42;50441:9;50487:10;50498:1;50487:13;;;;;;;;;;;;;;50502:9;50395:6;:117::i;:::-;50369:143;;50525:20;50548:162;50596:20;50632:18;50665:10;50690:9;50548:33;:162::i;:::-;50525:185;;50749:1;50731:15;:19;50723:55;;;::::0;;-1:-1:-1;;;50723:55:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;50791:129;50805:10;50851;50862:1;50851:13;;;;;;;;;;;;;;50895:10;50906:1;50895:13;;;;;;;;;;;;;;50910:9;50791:13;:129::i;:::-;50987:10;50971:27;::::0;;;:15:::2;:27;::::0;;;;;:48:::2;::::0;51003:15;50971:48:::2;:31;:48;:::i;:::-;50957:10;50941:27;::::0;;;:15:::2;:27;::::0;;;;:78;51044:11:::2;::::0;:32:::2;::::0;51060:15;51044:32:::2;:15;:32;:::i;:::-;51030:11;:46:::0;51089:23:::2;:7;51101:10;51089:23;:11;:23;:::i;:::-;-1:-1:-1::0;;51135:10:0::2;51123:23;::::0;;;:11:::2;:23;::::0;;;;51149:3:::2;51123:29:::0;;-1:-1:-1;;;;;;;;;;;;;47903:3257:0:o;35469:81::-;35508:42;35469:81;:::o;35703:47::-;35741:9;35703:47;:::o;911:181::-;969:7;1001:5;;;1025:6;;;;1017:46;;;;;-1:-1:-1;;;1017:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1083:1;-1:-1:-1;911:181:0;;;;;:::o;1375:136::-;1433:7;1460:43;1464:1;1467;1460:43;;;;;;;;;;;;;;;;;:3;:43::i;11578:149::-;11652:7;11695:22;11699:3;11711:5;11695:3;:22::i;11117:117::-;11180:7;11207:19;11215:3;11207:7;:19::i;10873:158::-;10953:4;10977:46;10987:3;-1:-1:-1;;;;;11007:14:0;;10977:9;:46::i;2265:471::-;2323:7;2568:6;2564:47;;-1:-1:-1;2598:1:0;2591:8;;2564:47;2635:5;;;2639:1;2635;:5;:1;2659:5;;;;;:10;2651:56;;;;-1:-1:-1;;;2651:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3212:132;3270:7;3297:39;3301:1;3304;3297:39;;;;;;;;;;;;;;;;;:3;:39::i;24738:205::-;24866:68;;;-1:-1:-1;;;;;24866:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24866:68:0;-1:-1:-1;;;24866:68:0;;;24839:96;;24859:5;;24839:19;:96::i;:::-;24738:205;;;;:::o;14022:422::-;14389:20;14428:8;;;14022:422::o;46411:259::-;46555:107;46569:7;46586:1;46590;46593:30;46625:25;46652:9;46555:13;:107::i;24553:177::-;24663:58;;;-1:-1:-1;;;;;24663:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24663:58:0;-1:-1:-1;;;24663:58:0;;;24636:86;;24656:5;;24636:19;:86::i;54701:1911::-;54985:15;;54903:4;;54930:75;;34724:42;;54985:15;;;-1:-1:-1;;;;;54985:15:0;54903:4;54930:46;:75::i;:::-;55071:15;;55016:88;;34724:42;;55071:15;;;-1:-1:-1;;;;;55071:15:0;55089:14;55016:46;:88::i;:::-;55147:58;;;-1:-1:-1;;;55147:58:0;;55199:4;55147:58;;;;;;55117:27;;-1:-1:-1;;;;;;;;;;;34936:42:0;55147:43;;:58;;;;;;;;;;;;;;;34936:42;55147:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55147:58:0;55244:56;;;-1:-1:-1;;;55244:56:0;;55294:4;55244:56;;;;;;55147:58;;-1:-1:-1;55216:25:0;;35367:42;;55244:41;;:56;;;;;55147:58;;55244:56;;;;;;;35367:42;55244:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55244:56:0;55313:15;;55502:13;;55244:56;;-1:-1:-1;55313:15:0;;;-1:-1:-1;;;;;55313:15:0;;:31;;-1:-1:-1;;;;;;;;;;;34936:42:0;35367;;55437:14;;55502:13;;55513:1;;55502:13;;;;;;;;;;55563:10;55574:1;55563:13;;;;;;;;;;;;;;;;;;55313:326;;;-1:-1:-1;;;;;;55313:326:0;;;;;;;-1:-1:-1;;;;;55313:326:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55599:4;55313:326;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55313:326:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55313:326:0;55682:58;;-1:-1:-1;;;55682:58:0;;55734:4;55682:58;;;;;;55652:27;;-1:-1:-1;;;;;;;;;;;34936:42:0;55682:43;;:58;;;;;55313:326;;55682:58;;;;;;;;34936:42;55682:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55682:58:0;55779:56;;;-1:-1:-1;;;55779:56:0;;55829:4;55779:56;;;;;;55682:58;;-1:-1:-1;55751:25:0;;35367:42;;55779:41;;:56;;;;;55682:58;;55779:56;;;;;;;35367:42;55779:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55779:56:0;;-1:-1:-1;55848:47:0;55898:50;:22;55925;55898:50;:26;:50;:::i;:::-;55848:100;-1:-1:-1;55959:45:0;56007:46;:20;56032;56007:46;:24;:46;:::i;:::-;55959:94;;56066:27;56096:173;-1:-1:-1;;;;;;;;;;;56130:15:0;56147:42;56244:10;56255:1;56244:13;;;;;;;56096:173;56066:203;;56280:27;56310:167;35367:42;56342:15;56359:40;56452:10;56463:1;56452:13;;;;;;;56310:167;56280:197;-1:-1:-1;56490:19:0;56512:50;:22;56280:197;56512:50;:26;:50;:::i;:::-;56490:72;54701:1911;-1:-1:-1;;;;;;;;;;;;;;54701:1911:0:o;10638:149::-;10711:4;10735:44;10743:3;-1:-1:-1;;;;;10763:14:0;;10735:7;:44::i;57461:260::-;57534:1;57525:6;:10;:29;;;;;57553:1;57539:11;;:15;57525:29;57517:64;;;;;-1:-1:-1;;;57517:64:0;;;;;;;;;;;;-1:-1:-1;;;57517:64:0;;;;;;;;;;;;;;;57660:11;;57609:64;;57628:44;;:27;:6;40160:4;57628:27;:10;:27;:::i;:44::-;57609:14;;;:64;:18;:64;:::i;:::-;57592:14;:81;57689:24;;;;;;;;;;;;;;;;;57461:260;:::o;43630:2769::-;43900:16;:14;:16::i;:::-;43927:49;43939:25;43966:9;43927:11;:49::i;:::-;43987:16;44006:23;44021:7;44006:14;:23::i;:::-;43987:42;-1:-1:-1;44044:15:0;;44040:998;;44090:21;;-1:-1:-1;;;;;44182:26:0;;;;:73;;-1:-1:-1;;;;;;44212:43:0;;35213:42;44212:43;44182:73;44178:527;;;-1:-1:-1;35213:42:0;44359:118;-1:-1:-1;;;;;;;;;;;35213:42:0;44422:11;44435:30;44467:9;44359:6;:118::i;:::-;44340:137;;44178:527;;;-1:-1:-1;44536:12:0;44586:103;-1:-1:-1;;;;;;;;;;;44536:12:0;44634:11;44647:30;44679:9;44586:6;:103::i;:::-;44567:122;;44178:527;44733:63;-1:-1:-1;;;;;44733:36:0;;44770:7;44779:16;44733:63;:36;:63;:::i;:::-;-1:-1:-1;;;;;44850:26:0;;;;;;:17;:26;;;;;;:43;;44881:11;44850:43;:30;:43;:::i;:::-;-1:-1:-1;;;;;44821:26:0;;;;;;:17;:26;;;;;:72;44930:19;;:36;;44954:11;44930:36;:23;:36;:::i;:::-;44908:19;:58;44986:40;;;-1:-1:-1;;;;;44986:40:0;;;;;;;;;;;;;;;;;;;;;;;44040:998;;;45058:19;45080:26;45098:7;45080:17;:26::i;:::-;45058:48;-1:-1:-1;45121:18:0;;45117:1118;;-1:-1:-1;;;;;45174:26:0;;;;:68;;;45220:15;;;;;;;;;-1:-1:-1;;;;;45220:15:0;-1:-1:-1;;;;;45220:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45220:22:0;-1:-1:-1;;;;;45204:38:0;;;;;;45174:68;45170:808;;;45263:68;45307:7;45316:14;45270:15;;;;;;;;;-1:-1:-1;;;;;45270:15:0;-1:-1:-1;;;;;45270:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45270:22:0;-1:-1:-1;;;;;45263:43:0;;:68;;:43;:68;:::i;:::-;45170:808;;;-1:-1:-1;;;;;45380:36:0;;;;;;:22;:36;;;;;;;;45372:76;;;;;-1:-1:-1;;;45372:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45536:15;;45492:22;;;-1:-1:-1;;;45492:22:0;;;;45485:71;;45536:15;;;-1:-1:-1;;;;;45536:15:0;;45554:1;;45536:15;;45492:20;;:22;;;;;;;;;;;;;;45536:15;45492:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45492:22:0;-1:-1:-1;;;;;45485:42:0;;:71;;:42;:71;:::i;:::-;45626:15;;45582:22;;;-1:-1:-1;;;45582:22:0;;;;45575:84;;45626:15;;;-1:-1:-1;;;;;45626:15:0;;45644:14;;45626:15;;45582:20;;:22;;;;;;;;;;;;;;45626:15;45582:22;;;;;;;;;;45575:84;45702:16;;;45716:1;45702:16;;;45678:21;45702:16;;;;;45678:21;45702:16;;;;;;;;;;-1:-1:-1;45702:16:0;45678:40;;45747:15;;;;;;;;;-1:-1:-1;;;;;45747:15:0;-1:-1:-1;;;;;45747:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45747:22:0;45737:7;;:4;;45742:1;;45737:7;;;;;;;;;:32;-1:-1:-1;;;;;45737:32:0;;;-1:-1:-1;;;;;45737:32:0;;;;;45798:12;45788:4;45793:1;45788:7;;;;;;;;;;;;;:22;-1:-1:-1;;;;;45788:22:0;;;-1:-1:-1;;;;;45788:22:0;;;;;45847:15;;;;;;;;;-1:-1:-1;;;;;45847:15:0;-1:-1:-1;;;;;45847:40:0;;45888:14;45904:31;45937:4;45943:7;45952:9;45847:115;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45847:115:0;-1:-1:-1;;;;;45847:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45847:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45847:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45847:115:0;;;;;;;;;;;;-1:-1:-1;45847:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45170:808;;-1:-1:-1;;;;;46032:23:0;;;;;;:14;:23;;;;;;:43;;46060:14;46032:43;:27;:43;:::i;:::-;-1:-1:-1;;;;;46006:23:0;;;;;;:14;:23;;;;;:69;46115:22;;:42;;46142:14;46115:42;:26;:42;:::i;:::-;46090:22;:67;46177:46;;;-1:-1:-1;;;;;46177:46:0;;;;;;;;;;;;;;;;;;;;;;;45117:1118;-1:-1:-1;;;;;;;;46255:24:0;;;;;;;:15;:24;;;;;;;;46282:3;46255:30;;46321:14;;46296:13;:22;;;;;:39;46374:17;;46346:16;:25;;;;;;:45;-1:-1:-1;;;;43630:2769:0:o;42274:1258::-;42409:21;42474:7;-1:-1:-1;;;;;42461:20:0;:9;-1:-1:-1;;;;;42461:20:0;;42457:75;;;-1:-1:-1;42505:15:0;42498:22;;42457:75;42594:15;;42556:58;;-1:-1:-1;;;;;42556:29:0;;;;42594:15;;;;42612:1;42556:58;:29;:58;:::i;:::-;42663:15;;42625:72;;-1:-1:-1;;;;;42625:29:0;;;;42663:15;;;;42681;42625:72;:29;:72;:::i;:::-;42743:40;;;-1:-1:-1;;;42743:40:0;;42777:4;42743:40;;;;;;42718:22;;-1:-1:-1;;;;;42743:25:0;;;;;:40;;;;;;;;;;;;;;;:25;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42743:40:0;42863:15;;:22;;;-1:-1:-1;;;42863:22:0;;;;42743:40;;-1:-1:-1;42804:21:0;;42863:15;;;;-1:-1:-1;;;;;42863:15:0;;:20;;:22;;;;;42743:40;;42863:22;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42863:22:0;-1:-1:-1;;;;;42850:35:0;;;;;;;:72;;;42900:15;;;;;;;;;-1:-1:-1;;;;;42900:15:0;-1:-1:-1;;;;;42900:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42900:22:0;-1:-1:-1;;;;;42889:33:0;;;;;;42850:72;42846:363;;;42946:16;;;42960:1;42946:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42946:16:0;42939:23;;42987:9;42977:4;42982:1;42977:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;42977:19:0;;;-1:-1:-1;;;;;42977:19:0;;;;;43021:7;43011:4;43016:1;43011:7;;;;;;;;;;;;;:17;-1:-1:-1;;;;;43011:17:0;;;-1:-1:-1;;;;;43011:17:0;;;;;42846:363;;;43068:16;;;43082:1;43068:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43068:16:0;43061:23;;43109:9;43099:4;43104:1;43099:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;43099:19:0;;;-1:-1:-1;;;;;43099:19:0;;;;;43143:15;;;;;;;;;-1:-1:-1;;;;;43143:15:0;-1:-1:-1;;;;;43143:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43143:22:0;43133:7;;:4;;43138:1;;43133:7;;;;;;;;;;;:32;-1:-1:-1;;;;;43133:32:0;;;-1:-1:-1;;;;;43133:32:0;;;;;43190:7;43180:4;43185:1;43180:7;;;;;;;;;;;;;:17;-1:-1:-1;;;;;43180:17:0;;;-1:-1:-1;;;;;43180:17:0;;;;;42846:363;43229:15;;:102;;-1:-1:-1;;;43229:102:0;;;;;;;;;;;;;;43315:4;43229:102;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;;;;-1:-1:-1;;;;;43229:15:0;;:40;;:102;;;;;;43315:4;;43229:102;;;;;-1:-1:-1;43229:102:0;;;;;;;;-1:-1:-1;43229:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43229:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43229:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43229:102:0;;;;;;;;;;;;-1:-1:-1;43229:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;43229:102:0;;;;;;;;-1:-1:-1;;;43377:40:0;;43411:4;43377:40;;;;;43352:22;;-1:-1:-1;;;;;;43377:25:0;;;-1:-1:-1;43377:25:0;;-1:-1:-1;43377:40:0;;;;;-1:-1:-1;43377:40:0;;-1:-1:-1;43377:40:0;;;;;;;:25;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43377:40:0;;-1:-1:-1;43428:20:0;43451:40;43377;43473:17;43451:40;:21;:40;:::i;:::-;43428:63;-1:-1:-1;;;;;42274:1258:0;;;;;;;;:::o;25212:622::-;25582:10;;;25581:62;;-1:-1:-1;25598:39:0;;;-1:-1:-1;;;25598:39:0;;25622:4;25598:39;;;;-1:-1:-1;;;;;25598:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25598:39:0;:44;25581:62;25573:152;;;;-1:-1:-1;;;25573:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25763:62;;;-1:-1:-1;;;;;25763:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25763:62:0;-1:-1:-1;;;25763:62:0;;;25736:90;;25756:5;;25736:19;:90::i;51172:1464::-;51371:4;51420:10;51431:1;51420:13;;;;;;;;;;;;;;51396:20;:37;;51388:92;;;;-1:-1:-1;;;51388:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51521:10;51532:1;51521:13;;;;;;;;;;;;;;51499:18;:35;;51491:88;;;;-1:-1:-1;;;51491:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51612:59;;;-1:-1:-1;;;51612:59:0;;51665:4;51612:59;;;;;;51592:17;;34724:42;;51612:44;;:59;;;;;;;;;;;;;;;34724:42;51612:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51612:59:0;51738:15;;51612:59;;-1:-1:-1;51684:74:0;;-1:-1:-1;;;;;;;;;;;34936:42:0;51738:15;;;-1:-1:-1;;;;;51738:15:0;51756:1;51684:45;:74::i;:::-;51823:15;;51769:93;;-1:-1:-1;;;;;;;;;;;34936:42:0;51823:15;;;-1:-1:-1;;;;;51823:15:0;51841:20;51769:45;:93::i;:::-;51927:15;;51875:72;;35367:42;;51927:15;;;-1:-1:-1;;;;;51927:15:0;51945:1;51875:43;:72::i;:::-;52010:15;;51958:89;;35367:42;;52010:15;;;-1:-1:-1;;;;;52010:15:0;52028:18;51958:43;:89::i;:::-;52060:15;;;;;;;;;-1:-1:-1;;;;;52060:15:0;-1:-1:-1;;;;;52060:28:0;;-1:-1:-1;;;;;;;;;;;35367:42:0;52181:20;52216:18;52291:10;52302:1;52291:13;;;;;;;;;;;;;;52359:10;52370:1;52359:13;;;;;;;;;;;;;;;;;;52060:375;;;-1:-1:-1;;;;;;52060:375:0;;;;;;;-1:-1:-1;;;;;52060:375:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52395:4;52060:375;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52060:375:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52060:375:0;52468:59;;-1:-1:-1;;;52468:59:0;;52521:4;52468:59;;;;;;52448:17;;34724:42;;52468:44;;:59;;;;;52060:375;;52468:59;;;;;;;;34724:42;52468:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52468:59:0;;-1:-1:-1;52538:21:0;52562:30;52468:59;52579:12;52562:30;:16;:30;:::i;:::-;52538:54;51172:1464;-1:-1:-1;;;;;;;;51172:1464:0:o;10319:143::-;10389:4;10413:41;10418:3;-1:-1:-1;;;;;10438:14:0;;10413:4;:41::i;1814:192::-;1900:7;1936:12;1928:6;;;;1920:29;;;;-1:-1:-1;;;1920:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1972:5:0;;;1814:192;;;;;;:::o;9861:204::-;9956:18;;9928:7;;9956:26;-1:-1:-1;9948:73:0;;;;-1:-1:-1;;;9948:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10039:3;:11;;10051:5;10039:18;;;;;;;;;;;;;;;;10032:25;;9861:204;;;;:::o;9408:109::-;9491:18;;9408:109::o;9193:129::-;9266:4;9290:19;;;:12;;;;;:19;;;;;;:24;;;9193:129::o;3840:278::-;3926:7;3961:12;3954:5;3946:28;;;;-1:-1:-1;;;3946:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3985:9;4001:1;3997;:5;;;;;;;3840:278;-1:-1:-1;;;;;3840:278:0:o;26858:761::-;27282:23;27308:69;27336:4;27308:69;;;;;;;;;;;;;;;;;27316:5;-1:-1:-1;;;;;27308:27:0;;;:69;;;;;:::i;:::-;27392:17;;27282:95;;-1:-1:-1;27392:21:0;27388:224;;27534:10;27523:30;;;;;;;;;;;;;;;-1:-1:-1;27523:30:0;27515:85;;;;-1:-1:-1;;;27515:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7563:1544;7629:4;7768:19;;;:12;;;:19;;;;;;7804:15;;7800:1300;;8239:18;;-1:-1:-1;;8190:14:0;;;;8239:22;;;;8166:21;;8239:3;;:22;;8526;;;;;;;;;;;;;;8506:42;;8672:9;8643:3;:11;;8655:13;8643:26;;;;;;;;;;;;;;;;;;;:38;;;;8749:23;;;8791:1;8749:12;;;:23;;;;;;8775:17;;;8749:43;;8901:17;;8749:3;;8901:17;;;;;;;;;;;;;;;;;;;;;;8996:3;:12;;:19;9009:5;8996:19;;;;;;;;;;;8989:26;;;9039:4;9032:11;;;;;;;;7800:1300;9083:5;9076:12;;;;;58161:399;58206:11;58220:24;:22;:24::i;:::-;58206:38;;58279:6;58261:15;;:24;58257:81;;;-1:-1:-1;58311:15:0;;58257:81;58352:11;;;:31;;-1:-1:-1;58367:11:0;;:16;58352:31;58348:44;;;58385:7;;;58348:44;58424:17;;:29;;58446:6;58424:29;:21;:29;:::i;:::-;58404:17;:49;58492:15;;:27;;58512:6;58492:27;:19;:27;:::i;:::-;58474:15;:45;-1:-1:-1;58549:3:0;58530:16;:22;58161:399;:::o;58572:2469::-;58716:11;;58712:55;;58749:7;;58712:55;36138:6;58834:30;58842:21;;58834:3;:7;;:30;;;;:::i;:::-;:50;58830:89;;;58901:7;;58830:89;58980:13;;;;;;;;;-1:-1:-1;;;;;58980:13:0;-1:-1:-1;;;;;58980:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59017:23;59043:49;59065:26;;59043:17;;:21;;:49;;;;:::i;:::-;59017:75;;59113:23;59139;:21;:23::i;:::-;59113:49;-1:-1:-1;59229:23:0;59225:36;;59254:7;;;;59225:36;59302:17;;59281:18;:38;59277:714;;;59362:17;;59350:9;;59362:41;;59384:18;59362:41;:21;:41;:::i;:::-;59439:17;;59350:53;;-1:-1:-1;59439:27:0;;59350:53;59439:27;:21;:27;:::i;:::-;59510:26;;59418:48;;-1:-1:-1;59510:36:0;;59541:4;59510:36;:30;:36;:::i;:::-;59481:26;:65;-1:-1:-1;59581:1:0;59561:17;:21;59277:714;;;59631:18;59610;:39;59606:385;;;59672:9;59684:42;:18;59707;59684:42;:22;:42;:::i;:::-;59672:54;-1:-1:-1;59762:28:0;:18;59672:54;59762:28;:22;:28;:::i;:::-;59805:26;:33;;;;59873:1;59853:17;:21;59741:49;-1:-1:-1;59606:385:0;;;59933:1;59913:17;:21;;;59949:26;:30;59606:385;60051:23;60047:62;;60091:7;;;;60047:62;60185:58;;;-1:-1:-1;;;60185:58:0;;60237:4;60185:58;;;;;;60246:18;;-1:-1:-1;;;;;;;;;;;34936:42:0;60185:43;;:58;;;;;;;;;;;;;;;34936:42;60185:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60185:58:0;:79;60181:118;;;60281:7;;;;60181:118;60369:15;;60315:74;;-1:-1:-1;;;;;;;;;;;34936:42:0;60369:15;;;-1:-1:-1;;;;;60369:15:0;60387:1;60315:45;:74::i;:::-;60454:15;;60400:91;;-1:-1:-1;;;;;;;;;;;34936:42:0;60454:15;;;-1:-1:-1;;;;;60454:15:0;60472:18;60400:45;:91::i;:::-;60508:19;60537:15;;;;;;;;;-1:-1:-1;;;;;60537:15:0;-1:-1:-1;;;;;60537:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60537:22:0;60530:55;;;-1:-1:-1;;;60530:55:0;;60579:4;60530:55;;;;;;-1:-1:-1;;;;;60530:40:0;;;;;;:55;;;;;60537:22;;60530:55;;;;;;;;:40;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60530:55:0;60606:15;;:124;;-1:-1:-1;;;60606:124:0;;;;;;;;;;;;;;60713:4;60606:124;;;;;;;;;;;;;;;;;;;60694:9;60606:124;;;;;;;;60530:55;;-1:-1:-1;60606:15:0;;;;-1:-1:-1;;;;;60606:15:0;;:40;;:124;;;;60694:9;;60713:4;60606:124;;;;;;;60694:9;;60606:124;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60606:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60606:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60606:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60606:124:0;;;;;;;;;;;;-1:-1:-1;60606:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60747:19;60776:15;;;;;;;;;-1:-1:-1;;;;;60776:15:0;-1:-1:-1;;;;;60776:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60776:22:0;60769:55;;;-1:-1:-1;;;60769:55:0;;60818:4;60769:55;;;;;;-1:-1:-1;;;;;60769:40:0;;;;;;:55;;;;;60776:22;;60769:55;;;;;;;;:40;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60769:55:0;;-1:-1:-1;60835:17:0;60855:34;60769:55;60874:14;60855:34;:18;:34;:::i;:::-;60835:54;-1:-1:-1;60914:16:0;;60910:84;;60947:31;60965:12;60947:17;:31::i;:::-;-1:-1:-1;;61030:3:0;61006:21;:27;-1:-1:-1;;;58572:2469:0;;;:::o;6973:414::-;7036:4;7058:21;7068:3;7073:5;7058:9;:21::i;:::-;7053:327;;-1:-1:-1;7096:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;7279:18;;7257:19;;;:12;;;:19;;;;;;:40;;;;7312:11;;7053:327;-1:-1:-1;7363:5:0;7356:12;;16940:195;17043:12;17075:52;17097:6;17105:4;17111:1;17114:12;17075:21;:52::i;:::-;17068:59;16940:195;-1:-1:-1;;;;16940:195:0:o;57785:275::-;57861:1;57852:6;:10;:29;;;;;57880:1;57866:11;;:15;57852:29;57844:67;;;;;-1:-1:-1;;;57844:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57996:11;;57942:67;;57964:44;;:27;:6;40160:4;57964:27;:10;:27;:::i;:44::-;57942:17;;;:67;:21;:67;:::i;:::-;57922:17;:87;58025:27;;;;;;;;;;;;;;;;;57785:275;:::o;17992:530::-;18119:12;18177:5;18152:21;:30;;18144:81;;;;-1:-1:-1;;;18144:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18244:18;18255:6;18244:10;:18::i;:::-;18236:60;;;;;-1:-1:-1;;;18236:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18370:12;18384:23;18411:6;-1:-1:-1;;;;;18411:11:0;18431:5;18439:4;18411:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18411:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18369:75;;;;18462:52;18480:7;18489:10;18501:12;18462:17;:52::i;:::-;18455:59;17992:530;-1:-1:-1;;;;;;;17992:530:0:o;20532:742::-;20647:12;20676:7;20672:595;;;-1:-1:-1;20707:10:0;20700:17;;20672:595;20821:17;;:21;20817:439;;21084:10;21078:17;21145:15;21132:10;21128:2;21124:19;21117:44;21032:148;21220:20;;-1:-1:-1;;;21220:20:0;;;;;;;;;;;;;;;;;21227:12;;21220:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://a40395afee83dde14c144a8c38b98e8045891292edd217517466335349cced66
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BSC | 100.00% | $659.39 | 0.00055319 | $0.364769 |
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.