Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
Latest 25 from a total of 93 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 19260458 | 157 days ago | IN | 0 ETH | 0.00409074 | ||||
Liquidate | 19260440 | 157 days ago | IN | 0 ETH | 0.00327064 | ||||
Liquidate | 19260436 | 157 days ago | IN | 0 ETH | 0.00438863 | ||||
Withdraw | 18531714 | 260 days ago | IN | 0 ETH | 0.00423368 | ||||
Repay | 18531710 | 260 days ago | IN | 0 ETH | 0.00332647 | ||||
Withdraw | 15073082 | 753 days ago | IN | 0 ETH | 0.00168742 | ||||
Liquidate | 15073056 | 753 days ago | IN | 0 ETH | 0.0033937 | ||||
Withdraw | 14572376 | 835 days ago | IN | 0 ETH | 0.00592212 | ||||
Liquidate | 14572350 | 835 days ago | IN | 0 ETH | 0.00811116 | ||||
Mint | 14572340 | 835 days ago | IN | 0 ETH | 0.00971214 | ||||
Deposit | 14572318 | 835 days ago | IN | 0 ETH | 0.00643456 | ||||
Withdraw | 13777869 | 958 days ago | IN | 0 ETH | 0.00730707 | ||||
Liquidate | 13777860 | 958 days ago | IN | 0 ETH | 0.00777595 | ||||
Repay | 13777852 | 958 days ago | IN | 0 ETH | 0.00612615 | ||||
Withdraw | 13744092 | 964 days ago | IN | 0 ETH | 0.0086776 | ||||
Repay | 13744048 | 964 days ago | IN | 0 ETH | 0.00453504 | ||||
Withdraw | 13726815 | 966 days ago | IN | 0 ETH | 0.00878266 | ||||
Repay | 13726725 | 966 days ago | IN | 0 ETH | 0.00857924 | ||||
Mint | 13551994 | 994 days ago | IN | 0 ETH | 0.01909651 | ||||
Deposit | 13551867 | 994 days ago | IN | 0 ETH | 0.01682799 | ||||
Withdraw | 13542050 | 996 days ago | IN | 0 ETH | 0.01170749 | ||||
Repay | 13542042 | 996 days ago | IN | 0 ETH | 0.01229198 | ||||
Withdraw | 13265452 | 1039 days ago | IN | 0 ETH | 0.00776545 | ||||
Liquidate | 13265434 | 1039 days ago | IN | 0 ETH | 0.0089925 | ||||
Withdraw | 13258939 | 1040 days ago | IN | 0 ETH | 0.00570182 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
YumLinkVesperVault
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-18 */ // Sources flattened with hardhat v2.6.0 https://hardhat.org // File @openzeppelin/contracts/math/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.2 <0.8.0; /** * @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.4._ */ 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.4._ */ 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); } } } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @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); } // File @openzeppelin/contracts/math/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @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, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @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) { 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, reverting 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) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * 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); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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; } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @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"); } } } // File contracts/libraries/FixedPointMath.sol pragma solidity ^0.6.12; library FixedPointMath { uint256 public constant DECIMALS = 18; uint256 public constant SCALAR = 10**DECIMALS; struct uq192x64 { uint256 x; } function fromU256(uint256 value) internal pure returns (uq192x64 memory) { uint256 x; require(value == 0 || (x = value * SCALAR) / SCALAR == value); return uq192x64(x); } function maximumValue() internal pure returns (uq192x64 memory) { return uq192x64(uint256(-1)); } function add(uq192x64 memory self, uq192x64 memory value) internal pure returns (uq192x64 memory) { uint256 x; require((x = self.x + value.x) >= self.x); return uq192x64(x); } function add(uq192x64 memory self, uint256 value) internal pure returns (uq192x64 memory) { return add(self, fromU256(value)); } function sub(uq192x64 memory self, uq192x64 memory value) internal pure returns (uq192x64 memory) { uint256 x; require((x = self.x - value.x) <= self.x); return uq192x64(x); } function sub(uq192x64 memory self, uint256 value) internal pure returns (uq192x64 memory) { return sub(self, fromU256(value)); } function mul(uq192x64 memory self, uint256 value) internal pure returns (uq192x64 memory) { uint256 x; require(value == 0 || (x = self.x * value) / value == self.x); return uq192x64(x); } function div(uq192x64 memory self, uint256 value) internal pure returns (uq192x64 memory) { require(value != 0); return uq192x64(self.x / value); } function cmp(uq192x64 memory self, uq192x64 memory value) internal pure returns (int256) { if (self.x < value.x) { return -1; } if (self.x > value.x) { return 1; } return 0; } function decode(uq192x64 memory self) internal pure returns (uint256) { return self.x / SCALAR; } } // File contracts/interfaces/IDetailedERC20.sol pragma solidity ^0.6.12; interface IDetailedERC20 is IERC20 { function name() external returns (string memory); function symbol() external returns (string memory); function decimals() external returns (uint8); } // File hardhat/[email protected] pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } } // File contracts/libraries/alchemist/CDP.sol pragma solidity ^0.6.12; /// @title CDP /// /// @dev A library which provides the CDP data struct and associated functions. library CDP { using CDP for Data; using FixedPointMath for FixedPointMath.uq192x64; using SafeERC20 for IDetailedERC20; using SafeMath for uint256; struct Context { FixedPointMath.uq192x64 collateralizationLimit; FixedPointMath.uq192x64 accumulatedYieldWeight; } struct Data { uint256 totalDeposited; uint256 totalDebt; uint256 totalCredit; uint256 lastDeposit; FixedPointMath.uq192x64 lastAccumulatedYieldWeight; } function update(Data storage _self, Context storage _ctx) internal { uint256 _earnedYield = _self.getEarnedYield(_ctx); if (_earnedYield > _self.totalDebt) { uint256 _currentTotalDebt = _self.totalDebt; _self.totalDebt = 0; _self.totalCredit = _earnedYield.sub(_currentTotalDebt); } else { _self.totalDebt = _self.totalDebt.sub(_earnedYield); } _self.lastAccumulatedYieldWeight = _ctx.accumulatedYieldWeight; } /// @dev Assures that the CDP is healthy. /// /// This function will revert if the CDP is unhealthy. function checkHealth(Data storage _self, Context storage _ctx, string memory _msg) internal view { require(_self.isHealthy(_ctx), _msg); } /// @dev Gets if the CDP is considered healthy. /// /// A CDP is healthy if its collateralization ratio is greater than the global collateralization limit. /// /// @return if the CDP is healthy. function isHealthy(Data storage _self, Context storage _ctx) internal view returns (bool) { return _ctx.collateralizationLimit.cmp(_self.getCollateralizationRatio(_ctx)) <= 0; } function getUpdatedTotalDebt(Data storage _self, Context storage _ctx) internal view returns (uint256) { uint256 _unclaimedYield = _self.getEarnedYield(_ctx); if (_unclaimedYield == 0) { return _self.totalDebt; } uint256 _currentTotalDebt = _self.totalDebt; if (_unclaimedYield >= _currentTotalDebt) { return 0; } return _currentTotalDebt - _unclaimedYield; } function getUpdatedTotalCredit(Data storage _self, Context storage _ctx) internal view returns (uint256) { uint256 _unclaimedYield = _self.getEarnedYield(_ctx); if (_unclaimedYield == 0) { return _self.totalCredit; } uint256 _currentTotalDebt = _self.totalDebt; if (_unclaimedYield <= _currentTotalDebt) { return 0; } return _self.totalCredit + (_unclaimedYield - _currentTotalDebt); } /// @dev Gets the amount of yield that a CDP has earned since the last time it was updated. /// /// @param _self the CDP to query. /// @param _ctx the CDP context. /// /// @return the amount of earned yield. function getEarnedYield(Data storage _self, Context storage _ctx) internal view returns (uint256) { FixedPointMath.uq192x64 memory _currentAccumulatedYieldWeight = _ctx.accumulatedYieldWeight; FixedPointMath.uq192x64 memory _lastAccumulatedYieldWeight = _self.lastAccumulatedYieldWeight; if (_currentAccumulatedYieldWeight.cmp(_lastAccumulatedYieldWeight) == 0) { return 0; } return _currentAccumulatedYieldWeight .sub(_lastAccumulatedYieldWeight) .mul(_self.totalDeposited) .decode(); } /// @dev Gets a CDPs collateralization ratio. /// /// The collateralization ratio is defined as the ratio of collateral to debt. If the CDP has zero debt then this /// will return the maximum value of a fixed point integer. /// /// This function will use the updated total debt so an update before calling this function is not required. /// /// @param _self the CDP to query. /// /// @return a fixed point integer representing the collateralization ratio. function getCollateralizationRatio(Data storage _self, Context storage _ctx) internal view returns (FixedPointMath.uq192x64 memory) { uint256 _totalDebt = _self.getUpdatedTotalDebt(_ctx); if (_totalDebt == 0) { return FixedPointMath.maximumValue(); } return FixedPointMath.fromU256(_self.totalDeposited).div(_totalDebt); } } // File contracts/interfaces/ITransmuter.sol pragma solidity ^0.6.12; interface ITransmuter { function distribute (address origin, uint256 amount) external; } // File contracts/interfaces/IMintableERC20.sol pragma solidity ^0.6.12; interface IMintableERC20 is IDetailedERC20{ function mint(address _recipient, uint256 _amount) external; function burnFrom(address account, uint256 amount) external; function lowerHasMinted(uint256 amount)external; } // File contracts/interfaces/IChainlink.sol pragma solidity ^0.6.12; interface IChainlink { function latestAnswer() external view returns (int256); } // File contracts/interfaces/IVaultAdapterV2.sol pragma solidity ^0.6.12; /// Interface for all Vault Adapter implementations. interface IVaultAdapterV2 { /// @dev Gets the token that the adapter accepts. function token() external view returns (IDetailedERC20); /// @dev The total value of the assets deposited into the vault. function totalValue() external view returns (uint256); /// @dev Deposits funds into the vault. /// /// @param _amount the amount of funds to deposit. function deposit(uint256 _amount) external; /// @dev Attempts to withdraw funds from the wrapped vault. /// /// The amount withdrawn to the recipient may be less than the amount requested. /// /// @param _recipient the recipient of the funds. /// @param _amount the amount of funds to withdraw. function withdraw(address _recipient, uint256 _amount, bool _isHarvest) external; } // File contracts/libraries/alchemist/VaultV2.sol pragma solidity ^0.6.12; //import "hardhat/console.sol"; /// @title Pool /// /// @dev A library which provides the Vault data struct and associated functions. library VaultV2 { using VaultV2 for Data; using VaultV2 for List; using SafeERC20 for IDetailedERC20; using SafeMath for uint256; struct Data { IVaultAdapterV2 adapter; uint256 totalDeposited; } struct List { Data[] elements; } /// @dev Gets the total amount of assets deposited in the vault. /// /// @return the total assets. function totalValue(Data storage _self) internal view returns (uint256) { return _self.adapter.totalValue(); } /// @dev Gets the token that the vault accepts. /// /// @return the accepted token. function token(Data storage _self) internal view returns (IDetailedERC20) { return IDetailedERC20(_self.adapter.token()); } /// @dev Deposits funds from the caller into the vault. /// /// @param _amount the amount of funds to deposit. function deposit(Data storage _self, uint256 _amount) internal returns (uint256) { // Push the token that the vault accepts onto the stack to save gas. IDetailedERC20 _token = _self.token(); _token.safeTransfer(address(_self.adapter), _amount); _self.adapter.deposit(_amount); _self.totalDeposited = _self.totalDeposited.add(_amount); return _amount; } /// @dev Deposits the entire token balance of the caller into the vault. function depositAll(Data storage _self) internal returns (uint256) { IDetailedERC20 _token = _self.token(); return _self.deposit(_token.balanceOf(address(this))); } /// @dev Withdraw deposited funds from the vault. /// /// @param _recipient the account to withdraw the tokens to. /// @param _amount the amount of tokens to withdraw. function withdraw(Data storage _self, address _recipient, uint256 _amount, bool _isHarvest) internal returns (uint256, uint256) { (uint256 _withdrawnAmount, uint256 _decreasedValue) = _self.directWithdraw(_recipient, _amount, _isHarvest); _self.totalDeposited = _self.totalDeposited.sub(_decreasedValue); return (_withdrawnAmount, _decreasedValue); } /// @dev Directly withdraw deposited funds from the vault. /// /// @param _recipient the account to withdraw the tokens to. /// @param _amount the amount of tokens to withdraw. function directWithdraw(Data storage _self, address _recipient, uint256 _amount, bool _isHarvest) internal returns (uint256, uint256) { IDetailedERC20 _token = _self.token(); uint256 _startingBalance = _token.balanceOf(_recipient); uint256 _startingTotalValue = _self.totalValue(); _self.adapter.withdraw(_recipient, _amount, _isHarvest); uint256 _endingBalance = _token.balanceOf(_recipient); uint256 _withdrawnAmount = _endingBalance.sub(_startingBalance); uint256 _endingTotalValue = _self.totalValue(); uint256 _decreasedValue = _startingTotalValue.sub(_endingTotalValue); return (_withdrawnAmount, _decreasedValue); } /// @dev Withdraw all the deposited funds from the vault. /// /// @param _recipient the account to withdraw the tokens to. function withdrawAll(Data storage _self, address _recipient) internal returns (uint256, uint256) { return _self.withdraw(_recipient, _self.totalDeposited, false); } /// @dev Harvests yield from the vault. /// /// @param _recipient the account to withdraw the harvested yield to. function harvest(Data storage _self, address _recipient) internal returns (uint256, uint256) { if (_self.totalValue() <= _self.totalDeposited) { return (0, 0); } uint256 _withdrawAmount = _self.totalValue().sub(_self.totalDeposited); return _self.directWithdraw(_recipient, _withdrawAmount, true); } /// @dev Adds a element to the list. /// /// @param _element the element to add. function push(List storage _self, Data memory _element) internal { _self.elements.push(_element); } /// @dev Gets a element from the list. /// /// @param _index the index in the list. /// /// @return the element at the specified index. function get(List storage _self, uint256 _index) internal view returns (Data storage) { return _self.elements[_index]; } /// @dev Gets the last element in the list. /// /// This function will revert if there are no elements in the list. /// /// @return the last element in the list. function last(List storage _self) internal view returns (Data storage) { return _self.elements[_self.lastIndex()]; } /// @dev Gets the index of the last element in the list. /// /// This function will revert if there are no elements in the list. /// /// @return the index of the last element. function lastIndex(List storage _self) internal view returns (uint256) { uint256 _length = _self.length(); return _length.sub(1, "Vault.List: empty"); } /// @dev Gets the number of elements in the list. /// /// @return the number of elements. function length(List storage _self) internal view returns (uint256) { return _self.elements.length; } } // File contracts/interfaces/IVotingEscrow.sol pragma solidity ^0.6.12; interface IVotingEscrow { function balanceOf(address account) external view returns (uint256); function totalSupply() external view returns (uint256); } // File contracts/YumLinkVesperVault.sol pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; contract YumLinkVesperVault is ReentrancyGuard { using CDP for CDP.Data; using FixedPointMath for FixedPointMath.uq192x64; using VaultV2 for VaultV2.Data; using VaultV2 for VaultV2.List; using SafeERC20 for IMintableERC20; using SafeMath for uint256; using Address for address; address public constant ZERO_ADDRESS = address(0); /// @dev Resolution for all fixed point numeric parameters which represent percents. The resolution allows for a /// granularity of 0.01% increments. uint256 public constant PERCENT_RESOLUTION = 10000; /// @dev The minimum value that the collateralization limit can be set to by the governance. This is a safety rail /// to prevent the collateralization from being set to a value which breaks the system. /// /// This value is equal to 100%. /// /// IMPORTANT: This constant is a raw FixedPointMath.uq192x64 value and assumes a resolution of 64 bits. If the /// resolution for the FixedPointMath library changes this constant must change as well. uint256 public constant MINIMUM_COLLATERALIZATION_LIMIT = 1000000000000000000; /// @dev The maximum value that the collateralization limit can be set to by the governance. This is a safety rail /// to prevent the collateralization from being set to a value which breaks the system. /// /// This value is equal to 400%. /// /// IMPORTANT: This constant is a raw FixedPointMath.uq192x64 value and assumes a resolution of 64 bits. If the /// resolution for the FixedPointMath library changes this constant must change as well. uint256 public constant MAXIMUM_COLLATERALIZATION_LIMIT = 4000000000000000000; event GovernanceUpdated( address governance ); event PendingGovernanceUpdated( address pendingGovernance ); event SentinelUpdated( address sentinel ); event TransmuterUpdated( address transmuter ); event RewardsUpdated( address treasury ); event HarvestFeeUpdated( uint256 fee ); event CollateralizationLimitUpdated( uint256 limit ); event EmergencyExitUpdated( bool status ); event ActiveVaultUpdated( IVaultAdapterV2 indexed adapter ); event FundsHarvested( uint256 withdrawnAmount, uint256 decreasedValue ); event FundsRecalled( uint256 indexed vaultId, uint256 withdrawnAmount, uint256 decreasedValue ); event FundsFlushed( uint256 amount ); event TokensDeposited( address indexed account, uint256 amount ); event TokensWithdrawn( address indexed account, uint256 requestedAmount, uint256 withdrawnAmount, uint256 decreasedValue ); event TokensRepaid( address indexed account, uint256 parentAmount, uint256 childAmount ); event TokensLiquidated( address indexed account, uint256 requestedAmount, uint256 withdrawnAmount, uint256 decreasedValue ); /// @dev The token that this contract is using as the parent asset. IMintableERC20 public token; /// @dev The token that this contract is using as the child asset. IMintableERC20 public xtoken; /// @dev The votingEscrow for discount calculation IVotingEscrow public votingEscrow; /// @dev The address of the account which currently has administrative capabilities over this contract. address public governance; /// @dev The address of the pending governance. address public pendingGovernance; /// @dev The address of the account which can initiate an emergency withdraw of funds in a vault. address public sentinel; /// @dev The address of the account which collect minting and withdraw fee from vault. address public feeCollector; /// @dev The address of the contract which will transmute synthetic tokens back into native tokens. address public transmuter; /// @dev The address of the contract which will receive fees. address public rewards; /// @dev The percent of each profitable harvest that will go to the rewards contract. uint256 public harvestFee; /// @dev The total amount the native token deposited into the system that is owned by external users. uint256 public totalDeposited; /// @dev when movemetns are bigger than this number flush is activated. uint256 public flushActivator; /// @dev A flag indicating if the contract has been initialized yet. bool public initialized; /// @dev A flag indicating if deposits and flushes should be halted and if all parties should be able to recall /// from the active vault. bool public emergencyExit; /// @dev The context shared between the CDPs. CDP.Context private _ctx; /// @dev A mapping of all of the user CDPs. If a user wishes to have multiple CDPs they will have to either /// create a new address or set up a proxy contract that interfaces with this contract. mapping(address => CDP.Data) private _cdps; /// @dev A list of all of the vaults. The last element of the list is the vault that is currently being used for /// deposits and withdraws. Vaults before the last element are considered inactive and are expected to be cleared. VaultV2.List private _vaults; /// @dev The address of the link oracle. address public _linkGasOracle; /// @dev The minimum returned amount needed to be on peg according to the oracle. uint256 public pegMinimum; // @dev fee related uint256[] public feeLevel; // fixed length = 9 (unit without 10^18); [50,200,500,1000,2000,3500,6000,9000,11000] uint256[] public discountTable; // fixed length = 9; [9,19,28,40,50,60,70,80,90] uint256 public vaultFee; // divided by 10000 constructor( IMintableERC20 _token, IMintableERC20 _xtoken, IVotingEscrow _votingEscrow, address _governance, address _sentinel, address _feeCollector ) public { require(_governance != ZERO_ADDRESS, "YumLinkVesperVault: governance address cannot be 0x0."); require(_sentinel != ZERO_ADDRESS, "YumLinkVesperVault: sentinel address cannot be 0x0."); require(_feeCollector != ZERO_ADDRESS, "YumLinkVesperVault: feeCollector address cannot be 0x0."); token = _token; xtoken = _xtoken; votingEscrow = _votingEscrow; governance = _governance; sentinel = _sentinel; feeCollector = _feeCollector; flushActivator = 5000 ether;// change for non 18 digit tokens uint256 COLL_LIMIT = MINIMUM_COLLATERALIZATION_LIMIT.mul(2); _ctx.collateralizationLimit = FixedPointMath.uq192x64(COLL_LIMIT); _ctx.accumulatedYieldWeight = FixedPointMath.uq192x64(0); feeLevel = [50,200,500,1000,2000,3500,6000,9000,11000]; discountTable = [10,20,30,40,50,60,72,81,91]; vaultFee = 20; } /// @dev Sets the pending governance. /// /// This function reverts if the new pending governance is the zero address or the caller is not the current /// governance. This is to prevent the contract governance being set to the zero address which would deadlock /// privileged contract functionality. /// /// @param _pendingGovernance the new pending governance. function setPendingGovernance(address _pendingGovernance) external onlyGov { require(_pendingGovernance != ZERO_ADDRESS, "YumLinkVesperVault: governance address cannot be 0x0."); pendingGovernance = _pendingGovernance; emit PendingGovernanceUpdated(_pendingGovernance); } /// @dev Accepts the role as governance. /// /// This function reverts if the caller is not the new pending governance. function acceptGovernance() external { require(msg.sender == pendingGovernance,"sender is not pendingGovernance"); address _pendingGovernance = pendingGovernance; governance = _pendingGovernance; emit GovernanceUpdated(_pendingGovernance); } function setSentinel(address _sentinel) external onlyGov { require(_sentinel != ZERO_ADDRESS, "YumLinkVesperVault: sentinel address cannot be 0x0."); sentinel = _sentinel; emit SentinelUpdated(_sentinel); } /// @dev Sets the transmuter. /// /// This function reverts if the new transmuter is the zero address or the caller is not the current governance. /// /// @param _transmuter the new transmuter. function setTransmuter(address _transmuter) external onlyGov { // Check that the transmuter address is not the zero address. Setting the transmuter to the zero address would break // transfers to the address because of `safeTransfer` checks. require(_transmuter != ZERO_ADDRESS, "YumLinkVesperVault: transmuter address cannot be 0x0."); transmuter = _transmuter; emit TransmuterUpdated(_transmuter); } /// @dev Sets the flushActivator. /// /// @param _flushActivator the new flushActivator. function setFlushActivator(uint256 _flushActivator) external onlyGov { flushActivator = _flushActivator; } /// @dev Sets the rewards contract. /// /// This function reverts if the new rewards contract is the zero address or the caller is not the current governance. /// /// @param _rewards the new rewards contract. function setRewards(address _rewards) external onlyGov { // Check that the rewards address is not the zero address. Setting the rewards to the zero address would break // transfers to the address because of `safeTransfer` checks. require(_rewards != ZERO_ADDRESS, "YumLinkVesperVault: rewards address cannot be 0x0."); rewards = _rewards; emit RewardsUpdated(_rewards); } /// @dev Sets the harvest fee. /// /// This function reverts if the caller is not the current governance. /// /// @param _harvestFee the new harvest fee. function setHarvestFee(uint256 _harvestFee) external onlyGov { // Check that the harvest fee is within the acceptable range. Setting the harvest fee greater than 100% could // potentially break internal logic when calculating the harvest fee. require(_harvestFee <= PERCENT_RESOLUTION, "YumLinkVesperVault: harvest fee above maximum."); harvestFee = _harvestFee; emit HarvestFeeUpdated(_harvestFee); } function setFeeLevel(uint256[] calldata _feeLevel) external onlyGov { require(_feeLevel.length == 9, "YumLinkVesperVault: feeLevel length mismatch"); feeLevel = _feeLevel; } function setDiscountTable(uint256[] calldata _discountTable) external onlyGov { require(_discountTable.length == 9, "YumLinkVesperVault: discountTable length mismatch"); discountTable = _discountTable; } function setVaultFee(uint256 _vaultFee) external onlyGov { vaultFee = _vaultFee; } /// @dev Sets the collateralization limit. /// /// This function reverts if the caller is not the current governance or if the collateralization limit is outside /// of the accepted bounds. /// /// @param _limit the new collateralization limit. function setCollateralizationLimit(uint256 _limit) external onlyGov { require(_limit >= MINIMUM_COLLATERALIZATION_LIMIT, "YumLinkVesperVault: collateralization limit below minimum."); require(_limit <= MAXIMUM_COLLATERALIZATION_LIMIT, "YumLinkVesperVault: collateralization limit above maximum."); _ctx.collateralizationLimit = FixedPointMath.uq192x64(_limit); emit CollateralizationLimitUpdated(_limit); } /// @dev Set oracle. function setOracleAddress(address Oracle, uint256 peg) external onlyGov { _linkGasOracle = Oracle; pegMinimum = peg; } /// @dev Sets if the contract should enter emergency exit mode. /// /// @param _emergencyExit if the contract should enter emergency exit mode. function setEmergencyExit(bool _emergencyExit) external { require(msg.sender == governance || msg.sender == sentinel, ""); emergencyExit = _emergencyExit; emit EmergencyExitUpdated(_emergencyExit); } /// @dev Gets the collateralization limit. /// /// The collateralization limit is the minimum ratio of collateral to debt that is allowed by the system. /// /// @return the collateralization limit. function collateralizationLimit() external view returns (FixedPointMath.uq192x64 memory) { return _ctx.collateralizationLimit; } /// @dev Initializes the contract. /// /// This function checks that the transmuter and rewards have been set and sets up the active vault. /// /// @param _adapter the vault adapter of the active vault. function initialize(IVaultAdapterV2 _adapter) external onlyGov { require(!initialized, "YumLinkVesperVault: already initialized"); require(transmuter != ZERO_ADDRESS, "YumLinkVesperVault: cannot initialize transmuter address to 0x0"); require(rewards != ZERO_ADDRESS, "YumLinkVesperVault: cannot initialize rewards address to 0x0"); _updateActiveVault(_adapter); initialized = true; } /// @dev Migrates the system to a new vault. /// /// This function reverts if the vault adapter is the zero address, if the token that the vault adapter accepts /// is not the token that this contract defines as the parent asset, or if the contract has not yet been initialized. /// /// @param _adapter the adapter for the vault the system will migrate to. function migrate(IVaultAdapterV2 _adapter) external expectInitialized onlyGov { _updateActiveVault(_adapter); } /// @dev Harvests yield from a vault. /// /// @param _vaultId the identifier of the vault to harvest from. /// /// @return the amount of funds that were harvested from the vault. function harvest(uint256 _vaultId) external expectInitialized returns (uint256, uint256) { VaultV2.Data storage _vault = _vaults.get(_vaultId); (uint256 _harvestedAmount, uint256 _decreasedValue) = _vault.harvest(address(this)); if (_harvestedAmount > 0) { uint256 _feeAmount = _harvestedAmount.mul(harvestFee).div(PERCENT_RESOLUTION); uint256 _distributeAmount = _harvestedAmount.sub(_feeAmount); FixedPointMath.uq192x64 memory _weight = FixedPointMath.fromU256(_distributeAmount).div(totalDeposited); _ctx.accumulatedYieldWeight = _ctx.accumulatedYieldWeight.add(_weight); if (_feeAmount > 0) { token.safeTransfer(rewards, _feeAmount); } if (_distributeAmount > 0) { _distributeToTransmuter(_distributeAmount); } } emit FundsHarvested(_harvestedAmount, _decreasedValue); return (_harvestedAmount, _decreasedValue); } /// @dev Recalls an amount of deposited funds from a vault to this contract. /// /// @param _vaultId the identifier of the recall funds from. /// /// @return the amount of funds that were recalled from the vault to this contract and the decreased vault value. function recall(uint256 _vaultId, uint256 _amount) external nonReentrant expectInitialized returns (uint256, uint256) { return _recallFunds(_vaultId, _amount); } /// @dev Recalls all the deposited funds from a vault to this contract. /// /// @param _vaultId the identifier of the recall funds from. /// /// @return the amount of funds that were recalled from the vault to this contract and the decreased vault value. function recallAll(uint256 _vaultId) external nonReentrant expectInitialized returns (uint256, uint256) { VaultV2.Data storage _vault = _vaults.get(_vaultId); return _recallFunds(_vaultId, _vault.totalDeposited); } /// @dev Flushes buffered tokens to the active vault. /// /// This function reverts if an emergency exit is active. This is in place to prevent the potential loss of /// additional funds. /// /// @return the amount of tokens flushed to the active vault. function flush() external nonReentrant expectInitialized returns (uint256) { // Prevent flushing to the active vault when an emergency exit is enabled to prevent potential loss of funds if // the active vault is poisoned for any reason. require(!emergencyExit, "emergency pause enabled"); return flushActiveVault(); } /// @dev Internal function to flush buffered tokens to the active vault. /// /// This function reverts if an emergency exit is active. This is in place to prevent the potential loss of /// additional funds. /// /// @return the amount of tokens flushed to the active vault. function flushActiveVault() internal returns (uint256) { VaultV2.Data storage _activeVault = _vaults.last(); uint256 _depositedAmount = _activeVault.depositAll(); emit FundsFlushed(_depositedAmount); return _depositedAmount; } /// @dev Deposits collateral into a CDP. /// /// This function reverts if an emergency exit is active. This is in place to prevent the potential loss of /// additional funds. /// /// @param _amount the amount of collateral to deposit. function deposit(uint256 _amount) external nonReentrant noContractAllowed expectInitialized { require(!emergencyExit, "emergency pause enabled"); CDP.Data storage _cdp = _cdps[msg.sender]; _cdp.update(_ctx); token.safeTransferFrom(msg.sender, address(this), _amount); if(_amount >= flushActivator) { flushActiveVault(); } totalDeposited = totalDeposited.add(_amount); _cdp.totalDeposited = _cdp.totalDeposited.add(_amount); _cdp.lastDeposit = block.number; emit TokensDeposited(msg.sender, _amount); } function getVaultFeeAmount(address _account, uint256 _amount) internal view returns (uint256) { uint256 outputFee = 0; uint256 hundred = 100; uint256 votingBalance = votingEscrow.balanceOf(_account); outputFee = _amount.mul(vaultFee).div(10000); if(votingBalance > 0){ for (uint256 i = 0; i < 9; ++i) { if(votingBalance >= (feeLevel[i]).mul(1 ether)){ outputFee = _amount.mul(vaultFee).div(10000); outputFee = outputFee.mul(hundred.sub(discountTable[i])).div(100); } } } return outputFee; } /// @dev Attempts to withdraw part of a CDP's collateral. /// /// This function reverts if a deposit into the CDP was made in the same block. This is to prevent flash loan attacks /// on other internal or external systems. /// /// @param _amount the amount of collateral to withdraw. function withdraw(uint256 _amount) external nonReentrant noContractAllowed expectInitialized returns (uint256, uint256) { CDP.Data storage _cdp = _cdps[msg.sender]; require(block.number > _cdp.lastDeposit, ""); _cdp.update(_ctx); uint256 calculateVaultFee = getVaultFeeAmount(msg.sender,_amount); uint256 finalizedAmount = _amount; uint256 _withdrawnAmount = 0; uint256 _decreasedValue = 0; if(calculateVaultFee > 0){ (uint256 _withdrawnFeeAmount, uint256 _decreasedFeeValue) = _withdrawFundsTo(feeCollector, calculateVaultFee); finalizedAmount = finalizedAmount.sub(calculateVaultFee); (_withdrawnAmount, _decreasedValue) = _withdrawFundsTo(msg.sender, finalizedAmount); _decreasedValue = _decreasedValue.add(_decreasedFeeValue); _withdrawnAmount = _withdrawnAmount.add(_withdrawnFeeAmount); } else { (_withdrawnAmount, _decreasedValue) = _withdrawFundsTo(msg.sender, finalizedAmount); } _cdp.totalDeposited = _cdp.totalDeposited.sub(_decreasedValue, "Exceeds withdrawable amount"); _cdp.checkHealth(_ctx, "Action blocked: unhealthy collateralization ratio"); emit TokensWithdrawn(msg.sender, _amount, _withdrawnAmount, _decreasedValue); return (_withdrawnAmount, _decreasedValue); } /// @dev Repays debt with the native and or synthetic token. /// /// An approval is required to transfer native tokens to the transmuter. function repay(uint256 _parentAmount, uint256 _childAmount) external nonReentrant noContractAllowed onLinkCheck expectInitialized { CDP.Data storage _cdp = _cdps[msg.sender]; _cdp.update(_ctx); if (_parentAmount > 0) { token.safeTransferFrom(msg.sender, address(this), _parentAmount); _distributeToTransmuter(_parentAmount); } if (_childAmount > 0) { xtoken.burnFrom(msg.sender, _childAmount); //lower debt cause burn xtoken.lowerHasMinted(_childAmount); } uint256 _totalAmount = _parentAmount.add(_childAmount); _cdp.totalDebt = _cdp.totalDebt.sub(_totalAmount, ""); emit TokensRepaid(msg.sender, _parentAmount, _childAmount); } /// @dev Attempts to liquidate part of a CDP's collateral to pay back its debt. /// /// @param _amount the amount of collateral to attempt to liquidate. function liquidate(uint256 _amount) external nonReentrant noContractAllowed onLinkCheck expectInitialized returns (uint256, uint256) { CDP.Data storage _cdp = _cdps[msg.sender]; _cdp.update(_ctx); // don't attempt to liquidate more than is possible if(_amount > _cdp.totalDebt){ _amount = _cdp.totalDebt; } (uint256 _withdrawnAmount, uint256 _decreasedValue) = _withdrawFundsTo(address(this), _amount); //changed to new transmuter compatibillity _distributeToTransmuter(_withdrawnAmount); _cdp.totalDeposited = _cdp.totalDeposited.sub(_decreasedValue, ""); _cdp.totalDebt = _cdp.totalDebt.sub(_withdrawnAmount, ""); emit TokensLiquidated(msg.sender, _amount, _withdrawnAmount, _decreasedValue); return (_withdrawnAmount, _decreasedValue); } /// @dev Mints synthetic tokens by either claiming credit or increasing the debt. /// /// Claiming credit will take priority over increasing the debt. /// /// This function reverts if the debt is increased and the CDP health check fails. /// /// @param _amount the amount of alchemic tokens to borrow. function mint(uint256 _amount) external nonReentrant noContractAllowed onLinkCheck expectInitialized { CDP.Data storage _cdp = _cdps[msg.sender]; _cdp.update(_ctx); uint256 _totalCredit = _cdp.totalCredit; if (_totalCredit < _amount) { uint256 _remainingAmount = _amount.sub(_totalCredit); _cdp.totalDebt = _cdp.totalDebt.add(_remainingAmount); _cdp.totalCredit = 0; _cdp.checkHealth(_ctx, "YumLinkVesperVault: Loan-to-value ratio breached"); } else { _cdp.totalCredit = _totalCredit.sub(_amount); } uint256 calculateVaultFee = getVaultFeeAmount(msg.sender,_amount); uint256 finalizedAmount = _amount; if( calculateVaultFee > 0 ){ xtoken.mint(feeCollector, calculateVaultFee); finalizedAmount = finalizedAmount.sub(calculateVaultFee); } xtoken.mint(msg.sender, finalizedAmount); } /// @dev Gets the number of vaults in the vault list. /// /// @return the vault count. function vaultCount() external view returns (uint256) { return _vaults.length(); } /// @dev Get the adapter of a vault. /// /// @param _vaultId the identifier of the vault. /// /// @return the vault adapter. function getVaultAdapter(uint256 _vaultId) external view returns (IVaultAdapterV2) { VaultV2.Data storage _vault = _vaults.get(_vaultId); return _vault.adapter; } /// @dev Get the total amount of the parent asset that has been deposited into a vault. /// /// @param _vaultId the identifier of the vault. /// /// @return the total amount of deposited tokens. function getVaultTotalDeposited(uint256 _vaultId) external view returns (uint256) { VaultV2.Data storage _vault = _vaults.get(_vaultId); return _vault.totalDeposited; } /// @dev Get the total amount of collateral deposited into a CDP. /// /// @param _account the user account of the CDP to query. /// /// @return the deposited amount of tokens. function getCdpTotalDeposited(address _account) external view returns (uint256) { CDP.Data storage _cdp = _cdps[_account]; return _cdp.totalDeposited; } /// @dev Get the total amount of alchemic tokens borrowed from a CDP. /// /// @param _account the user account of the CDP to query. /// /// @return the borrowed amount of tokens. function getCdpTotalDebt(address _account) external view returns (uint256) { CDP.Data storage _cdp = _cdps[_account]; return _cdp.getUpdatedTotalDebt(_ctx); } /// @dev Get the total amount of credit that a CDP has. /// /// @param _account the user account of the CDP to query. /// /// @return the amount of credit. function getCdpTotalCredit(address _account) external view returns (uint256) { CDP.Data storage _cdp = _cdps[_account]; return _cdp.getUpdatedTotalCredit(_ctx); } /// @dev Gets the last recorded block of when a user made a deposit into their CDP. /// /// @param _account the user account of the CDP to query. /// /// @return the block number of the last deposit. function getCdpLastDeposit(address _account) external view returns (uint256) { CDP.Data storage _cdp = _cdps[_account]; return _cdp.lastDeposit; } /// @dev sends tokens to the transmuter /// /// benefit of great nation of transmuter function _distributeToTransmuter(uint256 amount) internal { token.approve(transmuter,amount); ITransmuter(transmuter).distribute(address(this),amount); // lower debt cause of 'burn' xtoken.lowerHasMinted(amount); } /// @dev Checks that parent token is on peg. /// /// This is used over a modifier limit of pegged interactions. modifier onLinkCheck() { if(pegMinimum > 0 ){ uint256 oracleAnswer = uint256(IChainlink(_linkGasOracle).latestAnswer()); require(oracleAnswer > pegMinimum, "off peg limitation"); } _; } /// @dev Checks that caller is not a eoa. /// /// This is used to prevent contracts from interacting. modifier noContractAllowed() { require(!address(msg.sender).isContract() && msg.sender == tx.origin, "Sorry we do not accept contract!"); _; } /// @dev Checks that the contract is in an initialized state. /// /// This is used over a modifier to reduce the size of the contract modifier expectInitialized() { require(initialized, "YumLinkVesperVault: not initialized."); _; } /// @dev Checks that the current message sender or caller is a specific address. /// /// @param _expectedCaller the expected caller. function _expectCaller(address _expectedCaller) internal { require(msg.sender == _expectedCaller, ""); } /// @dev Checks that the current message sender or caller is the governance address. /// /// modifier onlyGov() { require(msg.sender == governance, "YumLinkVesperVault: only governance."); _; } /// @dev Updates the active vault. /// /// This function reverts if the vault adapter is the zero address, if the token that the vault adapter accepts /// is not the token that this contract defines as the parent asset, or if the contract has not yet been initialized. /// /// @param _adapter the adapter for the new active vault. function _updateActiveVault(IVaultAdapterV2 _adapter) internal { require(_adapter != IVaultAdapterV2(ZERO_ADDRESS), "YumLinkVesperVault: active vault address cannot be 0x0."); require(_adapter.token() == token, "YumLinkVesperVault: token mismatch."); _vaults.push(VaultV2.Data({ adapter: _adapter, totalDeposited: 0 })); emit ActiveVaultUpdated(_adapter); } /// @dev Recalls an amount of funds from a vault to this contract. /// /// @param _vaultId the identifier of the recall funds from. /// @param _amount the amount of funds to recall from the vault. /// /// @return the amount of funds that were recalled from the vault to this contract and the decreased vault value. function _recallFunds(uint256 _vaultId, uint256 _amount) internal returns (uint256, uint256) { require(emergencyExit || msg.sender == governance || _vaultId != _vaults.lastIndex(), "YumLinkVesperVault: not an emergency, not governance, and user does not have permission to recall funds from active vault"); VaultV2.Data storage _vault = _vaults.get(_vaultId); (uint256 _withdrawnAmount, uint256 _decreasedValue) = _vault.withdraw(address(this), _amount, false); emit FundsRecalled(_vaultId, _withdrawnAmount, _decreasedValue); return (_withdrawnAmount, _decreasedValue); } /// @dev Attempts to withdraw funds from the active vault to the recipient. /// /// Funds will be first withdrawn from this contracts balance and then from the active vault. This function /// is different from `recallFunds` in that it reduces the total amount of deposited tokens by the decreased /// value of the vault. /// /// @param _recipient the account to withdraw the funds to. /// @param _amount the amount of funds to withdraw. function _withdrawFundsTo(address _recipient, uint256 _amount) internal returns (uint256, uint256) { // Pull the funds from the buffer. uint256 _bufferedAmount = Math.min(_amount, token.balanceOf(address(this))); if (_recipient != address(this)) { token.transfer(_recipient, _bufferedAmount); } uint256 _totalWithdrawn = _bufferedAmount; uint256 _totalDecreasedValue = _bufferedAmount; uint256 _remainingAmount = _amount.sub(_bufferedAmount); // Pull the remaining funds from the active vault. if (_remainingAmount > 0) { VaultV2.Data storage _activeVault = _vaults.last(); (uint256 _withdrawAmount, uint256 _decreasedValue) = _activeVault.withdraw( _recipient, _remainingAmount, false ); _totalWithdrawn = _totalWithdrawn.add(_withdrawAmount); _totalDecreasedValue = _totalDecreasedValue.add(_decreasedValue); } totalDeposited = totalDeposited.sub(_totalDecreasedValue); return (_totalWithdrawn, _totalDecreasedValue); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IMintableERC20","name":"_token","type":"address"},{"internalType":"contract IMintableERC20","name":"_xtoken","type":"address"},{"internalType":"contract IVotingEscrow","name":"_votingEscrow","type":"address"},{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_sentinel","type":"address"},{"internalType":"address","name":"_feeCollector","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IVaultAdapterV2","name":"adapter","type":"address"}],"name":"ActiveVaultUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"CollateralizationLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"EmergencyExitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FundsFlushed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decreasedValue","type":"uint256"}],"name":"FundsHarvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decreasedValue","type":"uint256"}],"name":"FundsRecalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"governance","type":"address"}],"name":"GovernanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"HarvestFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingGovernance","type":"address"}],"name":"PendingGovernanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"RewardsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sentinel","type":"address"}],"name":"SentinelUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"requestedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decreasedValue","type":"uint256"}],"name":"TokensLiquidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"parentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"childAmount","type":"uint256"}],"name":"TokensRepaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"requestedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decreasedValue","type":"uint256"}],"name":"TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"transmuter","type":"address"}],"name":"TransmuterUpdated","type":"event"},{"inputs":[],"name":"MAXIMUM_COLLATERALIZATION_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_COLLATERALIZATION_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_RESOLUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_linkGasOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collateralizationLimit","outputs":[{"components":[{"internalType":"uint256","name":"x","type":"uint256"}],"internalType":"struct FixedPointMath.uq192x64","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"discountTable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyExit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flush","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flushActivator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getCdpLastDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getCdpTotalCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getCdpTotalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getCdpTotalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"getVaultAdapter","outputs":[{"internalType":"contract IVaultAdapterV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"getVaultTotalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"harvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IVaultAdapterV2","name":"_adapter","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"liquidate","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVaultAdapterV2","name":"_adapter","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pegMinimum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recall","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"recallAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_parentAmount","type":"uint256"},{"internalType":"uint256","name":"_childAmount","type":"uint256"}],"name":"repay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sentinel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setCollateralizationLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_discountTable","type":"uint256[]"}],"name":"setDiscountTable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_emergencyExit","type":"bool"}],"name":"setEmergencyExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_feeLevel","type":"uint256[]"}],"name":"setFeeLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_flushActivator","type":"uint256"}],"name":"setFlushActivator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_harvestFee","type":"uint256"}],"name":"setHarvestFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Oracle","type":"address"},{"internalType":"uint256","name":"peg","type":"uint256"}],"name":"setOracleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pendingGovernance","type":"address"}],"name":"setPendingGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewards","type":"address"}],"name":"setRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sentinel","type":"address"}],"name":"setSentinel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_transmuter","type":"address"}],"name":"setTransmuter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultFee","type":"uint256"}],"name":"setVaultFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IMintableERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transmuter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingEscrow","outputs":[{"internalType":"contract IVotingEscrow","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"xtoken","outputs":[{"internalType":"contract IMintableERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200410b3803806200410b833981016040819052620000349162000341565b60016000556001600160a01b0383166200006b5760405162461bcd60e51b8152600401620000629062000431565b60405180910390fd5b6001600160a01b038216620000945760405162461bcd60e51b81526004016200006290620003d4565b6001600160a01b038116620000bd5760405162461bcd60e51b81526004016200006290620004cf565b600180546001600160a01b03199081166001600160a01b03898116919091179092556002805482168884161781556003805483168885161790556004805483168785161790556006805483168685161790556007805490921692841692909217905569010f0cf064dd59200000600c556000906200015190670de0b6b3a76400009062000248602090811b62001d2217901c565b604080516020808201835290839052600e83905581518082018352600090819052600f558151610120810183526032815260c8918101919091526101f4918101919091526103e860608201526107d06080820152610dac60a082015261177060c082015261232860e0820152612af8610100820152909150620001d990601490600962000291565b506040805161012081018252600a815260146020820152601e918101919091526028606082015260326080820152603c60a0820152604860c0820152605160e0820152605b61010082015262000234906015906009620002e7565b505060146016555062000545945050505050565b60008262000259575060006200028b565b828202828482816200026757fe5b0414620002885760405162461bcd60e51b815260040162000062906200048e565b90505b92915050565b828054828255906000526020600020908101928215620002d5579160200282015b82811115620002d5578251829061ffff16905591602001919060010190620002b2565b50620002e39291506200032a565b5090565b828054828255906000526020600020908101928215620002d5579160200282015b82811115620002d5578251829060ff1690559160200191906001019062000308565b5b80821115620002e357600081556001016200032b565b60008060008060008060c087890312156200035a578182fd5b865162000367816200052c565b60208801519096506200037a816200052c565b60408801519095506200038d816200052c565b6060880151909450620003a0816200052c565b6080880151909350620003b3816200052c565b60a0880151909250620003c6816200052c565b809150509295509295509295565b60208082526033908201527f59756d4c696e6b5665737065725661756c743a2073656e74696e656c2061646460408201527f726573732063616e6e6f74206265203078302e00000000000000000000000000606082015260800190565b60208082526035908201527f59756d4c696e6b5665737065725661756c743a20676f7665726e616e6365206160408201527f6464726573732063616e6e6f74206265203078302e0000000000000000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526037908201527f59756d4c696e6b5665737065725661756c743a20666565436f6c6c6563746f7260408201527f20616464726573732063616e6e6f74206265203078302e000000000000000000606082015260800190565b6001600160a01b03811681146200054257600080fd5b50565b613bb680620005556000396000f3fe608060405234801561001057600080fd5b506004361061035d5760003560e01c8063792b55b6116101d3578063c415b95c11610104578063f0d787a3116100a2578063fc00e8a01161007c578063fc00e8a01461067b578063fc0c546a1461068e578063fefdc5d114610696578063ff50abdc146106a95761035d565b8063f0d787a314610663578063f39c38a01461066b578063f58c251c146106735761035d565b8063d8aed145116100de578063d8aed14514610617578063ddc632621461062a578063e07fc7451461063d578063ec38a862146106505761035d565b8063c415b95c146105e9578063c4d66de8146105f1578063ce5494bb146106045761035d565b8063a2315e9411610171578063aaf166601161014b578063aaf16660146105a8578063adb4a9ad146105bb578063b5962917146105ce578063b6b55f25146105d65761035d565b8063a2315e941461057a578063a7c6a1001461058d578063aa6e0434146105955761035d565b80639ec5a894116101ad5780639ec5a89414610544578063a005fda31461054c578063a0712d6814610554578063a1e401a9146105675761035d565b8063792b55b61461050b5780638c3d78191461051e5780639a9af221146105315761035d565b806345ee0755116102ad578063538ba4f91161024b5780635a9b5e92116102255780635a9b5e92146104e05780635aa6e675146104f35780636b9f96ea146104fb5780637239d2b9146105035761035d565b8063538ba4f9146104bd57806353ffa18b146104c55780635641ec03146104d85761035d565b80634aaf7c65116102875780634aaf7c651461047a5780634bb493d61461048f5780634c3a8e02146104a25780634f2bfe5b146104b55761035d565b806345ee07551461044c57806345f867b31461045f57806348f7d8e0146104675761035d565b806322c37b751161031a5780632e1a7d4d116102f45780632e1a7d4d1461040857806330d4d190146104295780633847f03814610431578063415f1240146104395761035d565b806322c37b75146103da578063238efcbc146103ed5780632670fdd8146103f55761035d565b806301ac145b146103625780630510111e1461038057806309dac061146103885780630abb60351461039d578063158ef93e146103b05780631718a68f146103c5575b600080fd5b61036a6106b1565b6040516103779190613aa3565b60405180910390f35b61036a6106b7565b61039b610396366004612fe6565b6106c3565b005b61039b6103ab366004612fe6565b610772565b6103b861080d565b60405161037791906131d1565b6103cd610816565b604051610377919061315d565b61039b6103e8366004613108565b610825565b61039b610854565b6103cd610403366004613108565b6108cf565b61041b610416366004613108565b6108ee565b604051610377929190613aac565b61036a610aec565b61036a610af8565b61041b610447366004613108565b610afe565b61039b61045a36600461309c565b610cfe565b61036a610d80565b61036a610475366004613108565b610d86565b610482610da4565b6040516103779190613a99565b61039b61049d36600461302d565b610dc0565b61041b6104b0366004613108565b610e1b565b6103cd610e95565b6103cd610ea4565b61039b6104d3366004613108565b610ea9565b6103b8610f63565b61039b6104ee366004613002565b610f71565b6103cd610fc1565b61036a610fd0565b6103cd611056565b61039b610519366004613108565b611065565b61039b61052c366004613108565b6110e6565b61036a61053f366004612fe6565b611115565b6103cd611133565b6103cd611142565b61039b610562366004613108565b611151565b61036a610575366004612fe6565b611407565b61039b61058836600461302d565b611422565b61036a611478565b61036a6105a3366004612fe6565b611489565b61036a6105b6366004613108565b6114b3565b61039b6105c9366004612fe6565b6114cc565b61036a611567565b61039b6105e4366004613108565b61156d565b6103cd6116bc565b61039b6105ff366004612fe6565b6116cb565b61039b610612366004612fe6565b611781565b61039b610625366004613120565b6117d9565b61041b610638366004613108565b611a8e565b61036a61064b366004613108565b611bc7565b61039b61065e366004612fe6565b611bd4565b61036a611c6f565b6103cd611c75565b6103cd611c84565b61036a610689366004612fe6565b611c93565b6103cd611cb6565b61041b6106a4366004613120565b611cc5565b61036a611d1c565b60165481565b673782dace9d90000081565b6004546001600160a01b031633146106f65760405162461bcd60e51b81526004016106ed90613715565b60405180910390fd5b6001600160a01b03811661071c5760405162461bcd60e51b81526004016106ed906133c3565b600680546001600160a01b0319166001600160a01b0383161790556040517fdc117600f93282860144d2cd2745f8e2e15c3ca2a32b4290c30f7cd1ae7ffcb99061076790839061315d565b60405180910390a150565b6004546001600160a01b0316331461079c5760405162461bcd60e51b81526004016106ed90613715565b6001600160a01b0381166107c25760405162461bcd60e51b81526004016106ed90613482565b600580546001600160a01b0319166001600160a01b0383161790556040517fc9e2377236eab4280090ce8f2317332649736d92f00dcf20a8dd6684ec5e78399061076790839061315d565b600d5460ff1681565b6002546001600160a01b031681565b6004546001600160a01b0316331461084f5760405162461bcd60e51b81526004016106ed90613715565b600c55565b6005546001600160a01b0316331461087e5760405162461bcd60e51b81526004016106ed90613759565b600554600480546001600160a01b0319166001600160a01b0390921691821790556040517f9d3e522e1e47a2f6009739342b9cc7b252a1888154e843ab55ee1c81745795ab9061076790839061315d565b6000806108dd601184611d65565b546001600160a01b03169392505050565b600080600260005414156109145760405162461bcd60e51b81526004016106ed90613a36565b600260005561092233611d8c565b15801561092e57503332145b61094a5760405162461bcd60e51b81526004016106ed9061344d565b600d5460ff1661096c5760405162461bcd60e51b81526004016106ed9061394b565b3360009081526010602052604090206003810154431161099e5760405162461bcd60e51b81526004016106ed90613825565b6109a981600e611d92565b60006109b53386611dee565b9050846000808315610a1b5760075460009081906109dc906001600160a01b031687611f4e565b90925090506109eb85876120e9565b94506109f73386611f4e565b9094509250610a068382612111565b9250610a128483612111565b93505050610a2b565b610a253384611f4e565b90925090505b60408051808201909152601b81527f4578636565647320776974686472617761626c6520616d6f756e74000000000060208201528554610a6c918390612136565b855560408051606081019091526031808252610a9591600e91613b206020830139879190612162565b336001600160a01b03167fb3ad69dc1d2c6b1f5f5b0927ffd8ee8f1437a156253c8f6dccc75e6f8e4fd38b898484604051610ad293929190613aba565b60405180910390a260016000559097909650945050505050565b670de0b6b3a764000081565b60135481565b60008060026000541415610b245760405162461bcd60e51b81526004016106ed90613a36565b6002600055610b3233611d8c565b158015610b3e57503332145b610b5a5760405162461bcd60e51b81526004016106ed9061344d565b60135415610c0457601254604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b158015610ba757600080fd5b505afa158015610bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdf91906130f0565b90506013548111610c025760405162461bcd60e51b81526004016106ed90613a6d565b505b600d5460ff16610c265760405162461bcd60e51b81526004016106ed9061394b565b336000908152601060205260409020610c4081600e611d92565b8060010154841115610c5457806001015493505b600080610c613087611f4e565b91509150610c6e82612191565b6040805160208101909152600081528354610c8a918390612136565b83556040805160208101909152600081526001840154610cab918490612136565b600184015560405133907f3ea051727656be6fd11c2260f244f29ff3c70d1fb077bfa73e89d554e9bb95c790610ce690899086908690613aba565b60405180910390a26001600055909590945092505050565b6004546001600160a01b0316331480610d2157506006546001600160a01b031633145b610d3d5760405162461bcd60e51b81526004016106ed90613825565b600d805461ff001916610100831515021790556040517ff0064f2efd0da4bc63eecf2e75590fe8a308eaa526a51c334e50eec09a711049906107679083906131d1565b61271081565b60158181548110610d9357fe5b600091825260209091200154905081565b610dac612f73565b506040805160208101909152600e54815290565b6004546001600160a01b03163314610dea5760405162461bcd60e51b81526004016106ed90613715565b60098114610e0a5760405162461bcd60e51b81526004016106ed90613645565b610e1660148383612f86565b505050565b60008060026000541415610e415760405162461bcd60e51b81526004016106ed90613a36565b6002600055600d5460ff16610e685760405162461bcd60e51b81526004016106ed9061394b565b6000610e75601185611d65565b9050610e858482600101546122e3565b6001600055909590945092505050565b6003546001600160a01b031681565b600081565b6004546001600160a01b03163314610ed35760405162461bcd60e51b81526004016106ed90613715565b670de0b6b3a7640000811015610efb5760405162461bcd60e51b81526004016106ed9061320f565b673782dace9d900000811115610f235760405162461bcd60e51b81526004016106ed90613315565b60408051602081018252829052600e829055517ff78180bc708b1292177c888900951cd66a39faf48dc7b6d111e93285dbbe55a090610767908390613aa3565b600d54610100900460ff1681565b6004546001600160a01b03163314610f9b5760405162461bcd60e51b81526004016106ed90613715565b601280546001600160a01b0319166001600160a01b039390931692909217909155601355565b6004546001600160a01b031681565b600060026000541415610ff55760405162461bcd60e51b81526004016106ed90613a36565b6002600055600d5460ff1661101c5760405162461bcd60e51b81526004016106ed9061394b565b600d54610100900460ff16156110445760405162461bcd60e51b81526004016106ed90613836565b61104c6123a0565b9050600160005590565b6008546001600160a01b031681565b6004546001600160a01b0316331461108f5760405162461bcd60e51b81526004016106ed90613715565b6127108111156110b15760405162461bcd60e51b81526004016106ed906137d7565b600a8190556040517fc36862a253ff42cc71f4f200d3c62e8e5eaaece01041fc6900aeace64ade72a890610767908390613aa3565b6004546001600160a01b031633146111105760405162461bcd60e51b81526004016106ed90613715565b601655565b6001600160a01b031660009081526010602052604090206003015490565b6009546001600160a01b031681565b6012546001600160a01b031681565b600260005414156111745760405162461bcd60e51b81526004016106ed90613a36565b600260005561118233611d8c565b15801561118e57503332145b6111aa5760405162461bcd60e51b81526004016106ed9061344d565b6013541561125457601254604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b1580156111f757600080fd5b505afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f91906130f0565b905060135481116112525760405162461bcd60e51b81526004016106ed90613a6d565b505b600d5460ff166112765760405162461bcd60e51b81526004016106ed9061394b565b33600090815260106020526040902061129081600e611d92565b6002810154828110156112f45760006112a984836120e9565b60018401549091506112bb9082612111565b600184015560006002840155604080516060810190915260308082526112ee91600e91613b516020830139859190612162565b50611304565b6112fe81846120e9565b60028301555b60006113103385611dee565b9050838115611397576002546007546040516340c10f1960e01b81526001600160a01b03928316926340c10f199261134f929116908690600401613171565b600060405180830381600087803b15801561136957600080fd5b505af115801561137d573d6000803e3d6000fd5b5050505061139482826120e990919063ffffffff16565b90505b6002546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906113c99033908590600401613171565b600060405180830381600087803b1580156113e357600080fd5b505af11580156113f7573d6000803e3d6000fd5b5050600160005550505050505050565b6001600160a01b031660009081526010602052604090205490565b6004546001600160a01b0316331461144c5760405162461bcd60e51b81526004016106ed90613715565b6009811461146c5760405162461bcd60e51b81526004016106ed90613372565b610e1660158383612f86565b600061148460116123f9565b905090565b6001600160a01b03811660009081526010602052604081206114ac81600e6123fd565b9392505050565b6000806114c1601184611d65565b600101549392505050565b6004546001600160a01b031633146114f65760405162461bcd60e51b81526004016106ed90613715565b6001600160a01b03811661151c5760405162461bcd60e51b81526004016106ed906138f6565b600880546001600160a01b0319166001600160a01b0383161790556040517fe42bb1780117f5788c6e0042e955291223819875891ddf465b8e4fbb85a933e99061076790839061315d565b600a5481565b600260005414156115905760405162461bcd60e51b81526004016106ed90613a36565b600260005561159e33611d8c565b1580156115aa57503332145b6115c65760405162461bcd60e51b81526004016106ed9061344d565b600d5460ff166115e85760405162461bcd60e51b81526004016106ed9061394b565b600d54610100900460ff16156116105760405162461bcd60e51b81526004016106ed90613836565b33600090815260106020526040902061162a81600e611d92565b600154611642906001600160a01b031633308561243c565b600c548210611655576116536123a0565b505b600b546116629083612111565b600b5580546116719083612111565b815543600382015560405133907f59062170a285eb80e8c6b8ced60428442a51910635005233fc4ce084a475845e906116ab908590613aa3565b60405180910390a250506001600055565b6007546001600160a01b031681565b6004546001600160a01b031633146116f55760405162461bcd60e51b81526004016106ed90613715565b600d5460ff16156117185760405162461bcd60e51b81526004016106ed90613790565b6008546001600160a01b03166117405760405162461bcd60e51b81526004016106ed906135e8565b6009546001600160a01b03166117685760405162461bcd60e51b81526004016106ed9061398f565b61177181612494565b50600d805460ff19166001179055565b600d5460ff166117a35760405162461bcd60e51b81526004016106ed9061394b565b6004546001600160a01b031633146117cd5760405162461bcd60e51b81526004016106ed90613715565b6117d681612494565b50565b600260005414156117fc5760405162461bcd60e51b81526004016106ed90613a36565b600260005561180a33611d8c565b15801561181657503332145b6118325760405162461bcd60e51b81526004016106ed9061344d565b601354156118dc57601254604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b15801561187f57600080fd5b505afa158015611893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b791906130f0565b905060135481116118da5760405162461bcd60e51b81526004016106ed90613a6d565b505b600d5460ff166118fe5760405162461bcd60e51b81526004016106ed9061394b565b33600090815260106020526040902061191881600e611d92565b821561193f57600154611936906001600160a01b031633308661243c565b61193f83612191565b8115611a0c5760025460405163079cc67960e41b81526001600160a01b03909116906379cc6790906119779033908690600401613171565b600060405180830381600087803b15801561199157600080fd5b505af11580156119a5573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb91506119d9908590600401613aa3565b600060405180830381600087803b1580156119f357600080fd5b505af1158015611a07573d6000803e3d6000fd5b505050505b6000611a188484612111565b9050611a42816040518060200160405280600081525084600101546121369092919063ffffffff16565b600183015560405133907fbade234341a40ca3c71df59b3ca02b8bb65b491a098af970953228b4f4a5d38f90611a7b9087908790613aac565b60405180910390a2505060016000555050565b600d54600090819060ff16611ab55760405162461bcd60e51b81526004016106ed9061394b565b6000611ac2601185611d65565b9050600080611ad183306125bf565b90925090508115611b83576000611aff612710611af9600a5486611d2290919063ffffffff16565b90612614565b90506000611b0d84836120e9565b9050611b17612f73565b611b2c600b54611b2684612646565b90612688565b6040805160208101909152600f548152909150611b4990826126bc565b51600f558215611b7057600954600154611b70916001600160a01b039182169116856126ec565b8115611b7f57611b7f82612191565b5050505b7f11d2034f4471d11a13f0f1798ceaf0c9db2812d450a0681958ce7d4f2fb97f098282604051611bb4929190613aac565b60405180910390a1909350915050915091565b60148181548110610d9357fe5b6004546001600160a01b03163314611bfe5760405162461bcd60e51b81526004016106ed90613715565b6001600160a01b038116611c245760405162461bcd60e51b81526004016106ed9061386d565b600980546001600160a01b0319166001600160a01b0383161790556040517f05f3326e0527f309d4015dee3bc3f36e650b53fc823bab69c99847814acfafdf9061076790839061315d565b600c5481565b6005546001600160a01b031681565b6006546001600160a01b031681565b6001600160a01b03811660009081526010602052604081206114ac81600e61270b565b6001546001600160a01b031681565b60008060026000541415611ceb5760405162461bcd60e51b81526004016106ed90613a36565b6002600055600d5460ff16611d125760405162461bcd60e51b81526004016106ed9061394b565b610e8584846122e3565b600b5481565b600082611d3157506000611d5f565b82820282848281611d3e57fe5b0414611d5c5760405162461bcd60e51b81526004016106ed906136d4565b90505b92915050565b6000826000018281548110611d7657fe5b9060005260206000209060020201905092915050565b3b151590565b6000611d9e8383612752565b90508260010154811115611dcc576001830180546000909155611dc182826120e9565b600285015550611de1565b6001830154611ddb90826120e9565b60018401555b5060010154600490910155565b6003546040516370a0823160e01b8152600091829160649183916001600160a01b03909116906370a0823190611e2890899060040161315d565b60206040518083038186803b158015611e4057600080fd5b505afa158015611e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7891906130f0565b9050611e95612710611af960165488611d2290919063ffffffff16565b92508015611f445760005b6009811015611f4257611edb670de0b6b3a764000060148381548110611ec257fe5b9060005260206000200154611d2290919063ffffffff16565b8210611f3a57611efc612710611af960165489611d2290919063ffffffff16565b9350611f376064611af9611f3060158581548110611f1657fe5b9060005260206000200154876120e990919063ffffffff16565b8790611d22565b93505b600101611ea0565b505b5090949350505050565b6001546040516370a0823160e01b815260009182918291611fde9186916001600160a01b0316906370a0823190611f8990309060040161315d565b60206040518083038186803b158015611fa157600080fd5b505afa158015611fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd991906130f0565b6127cb565b90506001600160a01b03851630146120765760015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906120229088908590600401613171565b602060405180830381600087803b15801561203c57600080fd5b505af1158015612050573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207491906130b8565b505b8080600061208487836120e9565b905080156120ca57600061209860116127e1565b90506000806120a9838c868461280c565b90925090506120b88683612111565b95506120c48582612111565b94505050505b600b546120d790836120e9565b600b55509093509150505b9250929050565b60008282111561210b5760405162461bcd60e51b81526004016106ed906134d7565b50900390565b600082820183811015611d5c5760405162461bcd60e51b81526004016106ed90613416565b6000818484111561215a5760405162461bcd60e51b81526004016106ed91906131dc565b505050900390565b61216c8383612844565b819061218b5760405162461bcd60e51b81526004016106ed91906131dc565b50505050565b60015460085460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926121c7929116908590600401613171565b602060405180830381600087803b1580156121e157600080fd5b505af11580156121f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221991906130b8565b50600854604051631f72642160e31b81526001600160a01b039091169063fb9321089061224c9030908590600401613171565b600060405180830381600087803b15801561226657600080fd5b505af115801561227a573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb91506122ae908490600401613aa3565b600060405180830381600087803b1580156122c857600080fd5b505af11580156122dc573d6000803e3d6000fd5b5050505050565b600d546000908190610100900460ff168061230857506004546001600160a01b031633145b8061231c57506123186011612872565b8414155b6123385760405162461bcd60e51b81526004016106ed9061326c565b6000612345601186611d65565b90506000806123568330888461280c565b91509150867fccbd929f935422b28ee209a0db0556280b0a3d9bc4da58f1d3f0ab4f8a499647838360405161238c929190613aac565b60405180910390a290969095509350505050565b6000806123ad60116127e1565b905060006123ba826128bf565b90507f860f4701faa0ecdeecd9e9eaae11a8612bbd01c663081f7c0c4e4873df653d69816040516123eb9190613aa3565b60405180910390a191505090565b5490565b60008061240a8484612752565b90508061241d5750506001820154611d5f565b600184015480821061243457600092505050611d5f565b039392505050565b61218b846323b872dd60e01b85858560405160240161245d9392919061318a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612953565b6001600160a01b0381166124ba5760405162461bcd60e51b81526004016106ed90613554565b60015460408051637e062a3560e11b815290516001600160a01b039283169284169163fc0c546a916004808301926020929190829003018186803b15801561250157600080fd5b505afa158015612515573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253991906130d4565b6001600160a01b03161461255f5760405162461bcd60e51b81526004016106ed90613691565b604080518082019091526001600160a01b038216815260006020820152612588906011906129e2565b6040516001600160a01b038216907f0821015de34e20b0878a40f6f165801417f53b2017016d7321cacee989c8cfa790600090a250565b60008083600101546125d085612a25565b116125e0575060009050806120e2565b60006125f985600101546125f387612a25565b906120e9565b90506126088585836001612aa1565b92509250509250929050565b60008082116126355760405162461bcd60e51b81526004016106ed906135b1565b81838161263e57fe5b049392505050565b61264e612f73565b600082158061266b575050670de0b6b3a764000082810290810483145b61267457600080fd5b604080516020810190915290815292915050565b612690612f73565b8161269a57600080fd5b6040518060200160405280838560000151816126b257fe5b0490529392505050565b6126c4612f73565b825182518101908110156126d757600080fd5b60408051602081019091529081529392505050565b610e168363a9059cbb60e01b848460405160240161245d929190613171565b6000806127188484612752565b90508061272b5750506002820154611d5f565b600184015480821161274257600092505050611d5f565b6002850154910301905092915050565b600061275c612f73565b50604080516020810190915260018301548152612777612f73565b506040805160208101909152600485015481526127948282612c5e565b6127a357600092505050611d5f565b84546127c2906127bd906127b78585612c8f565b90612caa565b612cd8565b95945050505050565b60008183106127da5781611d5c565b5090919050565b6000816127ed81612872565b815481106127f757fe5b90600052602060002090600202019050919050565b600080808061281d88888888612aa1565b60018a0154919350915061283190826120e9565b6001890155909250905094509492505050565b6000806128696128548585612ce7565b60408051602081019091528554815290612c5e565b13159392505050565b60008061287e836123f9565b90506114ac6001604051806040016040528060118152602001705661756c742e4c6973743a20656d70747960781b815250836121369092919063ffffffff16565b6000806128cb83612d2b565b90506114ac816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016128fc919061315d565b60206040518083038186803b15801561291457600080fd5b505afa158015612928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294c91906130f0565b8490612da7565b60606129a8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e4e9092919063ffffffff16565b805190915015610e1657808060200190518101906129c691906130b8565b610e165760405162461bcd60e51b81526004016106ed906139ec565b8154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b039093169290921782559190920151910155565b8054604080516306a61f7560e51b815290516000926001600160a01b03169163d4c3eea0916004808301926020929190829003018186803b158015612a6957600080fd5b505afa158015612a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5f91906130f0565b6000806000612aaf87612d2b565b90506000816001600160a01b03166370a08231886040518263ffffffff1660e01b8152600401612adf919061315d565b60206040518083038186803b158015612af757600080fd5b505afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2f91906130f0565b90506000612b3c89612a25565b895460405163ead5d35960e01b81529192506001600160a01b03169063ead5d35990612b70908b908b908b906004016131ae565b600060405180830381600087803b158015612b8a57600080fd5b505af1158015612b9e573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03861691506370a0823190612bd1908c9060040161315d565b60206040518083038186803b158015612be957600080fd5b505afa158015612bfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2191906130f0565b90506000612c2f82856120e9565b90506000612c3c8c612a25565b90506000612c4a85836120e9565b929d929c50919a5050505050505050505050565b805182516000911115612c745750600019611d5f565b815183511115612c8657506001611d5f565b50600092915050565b612c97612f73565b825182518103908111156126d757600080fd5b612cb2612f73565b6000821580612ccf575050825182810290838281612ccc57fe5b04145b6126d757600080fd5b51670de0b6b3a7640000900490565b612cef612f73565b6000612cfb84846123fd565b905080612d1257612d0a612e5d565b915050611d5f565b612d2381611b268660000154612646565b949350505050565b805460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b158015612d6f57600080fd5b505afa158015612d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5f91906130d4565b600080612db384612d2b565b8454909150612dcf906001600160a01b038084169116856126ec565b835460405163b6b55f2560e01b81526001600160a01b039091169063b6b55f2590612dfe908690600401613aa3565b600060405180830381600087803b158015612e1857600080fd5b505af1158015612e2c573d6000803e3d6000fd5b5050506001850154612e3f915084612111565b60018501555081905092915050565b6060612d238484600085612e79565b612e65612f73565b506040805160208101909152600019815290565b606082471015612e9b5760405162461bcd60e51b81526004016106ed9061350e565b612ea485611d8c565b612ec05760405162461bcd60e51b81526004016106ed906138bf565b60006060866001600160a01b03168587604051612edd9190613141565b60006040518083038185875af1925050503d8060008114612f1a576040519150601f19603f3d011682016040523d82523d6000602084013e612f1f565b606091505b5091509150612f2f828286612f3a565b979650505050505050565b60608315612f495750816114ac565b825115612f595782518084602001fd5b8160405162461bcd60e51b81526004016106ed91906131dc565b6040518060200160405280600081525090565b828054828255906000526020600020908101928215612fc1579160200282015b82811115612fc1578235825591602001919060010190612fa6565b50612fcd929150612fd1565b5090565b5b80821115612fcd5760008155600101612fd2565b600060208284031215612ff7578081fd5b8135611d5c81613afc565b60008060408385031215613014578081fd5b823561301f81613afc565b946020939093013593505050565b6000806020838503121561303f578182fd5b823567ffffffffffffffff80821115613056578384fd5b818501915085601f830112613069578384fd5b813581811115613077578485fd5b866020808302850101111561308a578485fd5b60209290920196919550909350505050565b6000602082840312156130ad578081fd5b8135611d5c81613b11565b6000602082840312156130c9578081fd5b8151611d5c81613b11565b6000602082840312156130e5578081fd5b8151611d5c81613afc565b600060208284031215613101578081fd5b5051919050565b600060208284031215613119578081fd5b5035919050565b60008060408385031215613132578182fd5b50508035926020909101359150565b60008251613153818460208701613ad0565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b901515815260200190565b60006020825282518060208401526131fb816040850160208701613ad0565b601f01601f19169190910160400192915050565b6020808252603a908201527f59756d4c696e6b5665737065725661756c743a20636f6c6c61746572616c697a60408201527f6174696f6e206c696d69742062656c6f77206d696e696d756d2e000000000000606082015260800190565b60208082526079908201527f59756d4c696e6b5665737065725661756c743a206e6f7420616e20656d65726760408201527f656e63792c206e6f7420676f7665726e616e63652c20616e642075736572206460608201527f6f6573206e6f742068617665207065726d697373696f6e20746f20726563616c60808201527f6c2066756e64732066726f6d20616374697665207661756c740000000000000060a082015260c00190565b6020808252603a908201527f59756d4c696e6b5665737065725661756c743a20636f6c6c61746572616c697a60408201527f6174696f6e206c696d69742061626f7665206d6178696d756d2e000000000000606082015260800190565b60208082526031908201527f59756d4c696e6b5665737065725661756c743a20646973636f756e745461626c6040820152700ca40d8cadccee8d040dad2e6dac2e8c6d607b1b606082015260800190565b60208082526033908201527f59756d4c696e6b5665737065725661756c743a2073656e74696e656c206164646040820152723932b9b99031b0b73737ba10313290183c181760691b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f536f72727920776520646f206e6f742061636365707420636f6e747261637421604082015260600190565b60208082526035908201527f59756d4c696e6b5665737065725661756c743a20676f7665726e616e6365206160408201527432323932b9b99031b0b73737ba10313290183c181760591b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526037908201527f59756d4c696e6b5665737065725661756c743a20616374697665207661756c7460408201527f20616464726573732063616e6e6f74206265203078302e000000000000000000606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252603f908201527f59756d4c696e6b5665737065725661756c743a2063616e6e6f7420696e69746960408201527f616c697a65207472616e736d75746572206164647265737320746f2030783000606082015260800190565b6020808252602c908201527f59756d4c696e6b5665737065725661756c743a206665654c6576656c206c656e60408201526b0cee8d040dad2e6dac2e8c6d60a31b606082015260800190565b60208082526023908201527f59756d4c696e6b5665737065725661756c743a20746f6b656e206d69736d617460408201526231b41760e91b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526024908201527f59756d4c696e6b5665737065725661756c743a206f6e6c7920676f7665726e616040820152633731b29760e11b606082015260800190565b6020808252601f908201527f73656e646572206973206e6f742070656e64696e67476f7665726e616e636500604082015260600190565b60208082526027908201527f59756d4c696e6b5665737065725661756c743a20616c726561647920696e69746040820152661a585b1a5e995960ca1b606082015260800190565b6020808252602e908201527f59756d4c696e6b5665737065725661756c743a2068617276657374206665652060408201526d30b137bb329036b0bc34b6bab69760911b606082015260800190565b602080825260009082015260400190565b60208082526017908201527f656d657267656e637920706175736520656e61626c6564000000000000000000604082015260600190565b60208082526032908201527f59756d4c696e6b5665737065725661756c743a2072657761726473206164647260408201527132b9b99031b0b73737ba10313290183c181760711b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526035908201527f59756d4c696e6b5665737065725661756c743a207472616e736d75746572206160408201527432323932b9b99031b0b73737ba10313290183c181760591b606082015260800190565b60208082526024908201527f59756d4c696e6b5665737065725661756c743a206e6f7420696e697469616c696040820152633d32b21760e11b606082015260800190565b6020808252603c908201527f59756d4c696e6b5665737065725661756c743a2063616e6e6f7420696e69746960408201527f616c697a652072657761726473206164647265737320746f2030783000000000606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526012908201527137b333103832b3903634b6b4ba30ba34b7b760711b604082015260600190565b9051815260200190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60005b83811015613aeb578181015183820152602001613ad3565b8381111561218b5750506000910152565b6001600160a01b03811681146117d657600080fd5b80151581146117d657600080fdfe416374696f6e20626c6f636b65643a20756e6865616c74687920636f6c6c61746572616c697a6174696f6e20726174696f59756d4c696e6b5665737065725661756c743a204c6f616e2d746f2d76616c756520726174696f206272656163686564a26469706673582212202c696dca15596e3abd18da69a0f4eb148bf866bd99df8225d6f4e36b75e04f8164736f6c634300060c0033000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca00000000000000000000000029ddf2c4f1e80dc9e95cc57a9ca03a28e4ab6d6c000000000000000000000000b938d8cbf7fc6455d1f2ebede5ff9a8e887493b200000000000000000000000068284083acbabcb6da84f62ea341dd8c30500eee0000000000000000000000009e145af5b3b142a50d871cb4821992dd493d379800000000000000000000000076e2fd0cc4daa40c76f90f3ddfa2e3abf7a75810
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061035d5760003560e01c8063792b55b6116101d3578063c415b95c11610104578063f0d787a3116100a2578063fc00e8a01161007c578063fc00e8a01461067b578063fc0c546a1461068e578063fefdc5d114610696578063ff50abdc146106a95761035d565b8063f0d787a314610663578063f39c38a01461066b578063f58c251c146106735761035d565b8063d8aed145116100de578063d8aed14514610617578063ddc632621461062a578063e07fc7451461063d578063ec38a862146106505761035d565b8063c415b95c146105e9578063c4d66de8146105f1578063ce5494bb146106045761035d565b8063a2315e9411610171578063aaf166601161014b578063aaf16660146105a8578063adb4a9ad146105bb578063b5962917146105ce578063b6b55f25146105d65761035d565b8063a2315e941461057a578063a7c6a1001461058d578063aa6e0434146105955761035d565b80639ec5a894116101ad5780639ec5a89414610544578063a005fda31461054c578063a0712d6814610554578063a1e401a9146105675761035d565b8063792b55b61461050b5780638c3d78191461051e5780639a9af221146105315761035d565b806345ee0755116102ad578063538ba4f91161024b5780635a9b5e92116102255780635a9b5e92146104e05780635aa6e675146104f35780636b9f96ea146104fb5780637239d2b9146105035761035d565b8063538ba4f9146104bd57806353ffa18b146104c55780635641ec03146104d85761035d565b80634aaf7c65116102875780634aaf7c651461047a5780634bb493d61461048f5780634c3a8e02146104a25780634f2bfe5b146104b55761035d565b806345ee07551461044c57806345f867b31461045f57806348f7d8e0146104675761035d565b806322c37b751161031a5780632e1a7d4d116102f45780632e1a7d4d1461040857806330d4d190146104295780633847f03814610431578063415f1240146104395761035d565b806322c37b75146103da578063238efcbc146103ed5780632670fdd8146103f55761035d565b806301ac145b146103625780630510111e1461038057806309dac061146103885780630abb60351461039d578063158ef93e146103b05780631718a68f146103c5575b600080fd5b61036a6106b1565b6040516103779190613aa3565b60405180910390f35b61036a6106b7565b61039b610396366004612fe6565b6106c3565b005b61039b6103ab366004612fe6565b610772565b6103b861080d565b60405161037791906131d1565b6103cd610816565b604051610377919061315d565b61039b6103e8366004613108565b610825565b61039b610854565b6103cd610403366004613108565b6108cf565b61041b610416366004613108565b6108ee565b604051610377929190613aac565b61036a610aec565b61036a610af8565b61041b610447366004613108565b610afe565b61039b61045a36600461309c565b610cfe565b61036a610d80565b61036a610475366004613108565b610d86565b610482610da4565b6040516103779190613a99565b61039b61049d36600461302d565b610dc0565b61041b6104b0366004613108565b610e1b565b6103cd610e95565b6103cd610ea4565b61039b6104d3366004613108565b610ea9565b6103b8610f63565b61039b6104ee366004613002565b610f71565b6103cd610fc1565b61036a610fd0565b6103cd611056565b61039b610519366004613108565b611065565b61039b61052c366004613108565b6110e6565b61036a61053f366004612fe6565b611115565b6103cd611133565b6103cd611142565b61039b610562366004613108565b611151565b61036a610575366004612fe6565b611407565b61039b61058836600461302d565b611422565b61036a611478565b61036a6105a3366004612fe6565b611489565b61036a6105b6366004613108565b6114b3565b61039b6105c9366004612fe6565b6114cc565b61036a611567565b61039b6105e4366004613108565b61156d565b6103cd6116bc565b61039b6105ff366004612fe6565b6116cb565b61039b610612366004612fe6565b611781565b61039b610625366004613120565b6117d9565b61041b610638366004613108565b611a8e565b61036a61064b366004613108565b611bc7565b61039b61065e366004612fe6565b611bd4565b61036a611c6f565b6103cd611c75565b6103cd611c84565b61036a610689366004612fe6565b611c93565b6103cd611cb6565b61041b6106a4366004613120565b611cc5565b61036a611d1c565b60165481565b673782dace9d90000081565b6004546001600160a01b031633146106f65760405162461bcd60e51b81526004016106ed90613715565b60405180910390fd5b6001600160a01b03811661071c5760405162461bcd60e51b81526004016106ed906133c3565b600680546001600160a01b0319166001600160a01b0383161790556040517fdc117600f93282860144d2cd2745f8e2e15c3ca2a32b4290c30f7cd1ae7ffcb99061076790839061315d565b60405180910390a150565b6004546001600160a01b0316331461079c5760405162461bcd60e51b81526004016106ed90613715565b6001600160a01b0381166107c25760405162461bcd60e51b81526004016106ed90613482565b600580546001600160a01b0319166001600160a01b0383161790556040517fc9e2377236eab4280090ce8f2317332649736d92f00dcf20a8dd6684ec5e78399061076790839061315d565b600d5460ff1681565b6002546001600160a01b031681565b6004546001600160a01b0316331461084f5760405162461bcd60e51b81526004016106ed90613715565b600c55565b6005546001600160a01b0316331461087e5760405162461bcd60e51b81526004016106ed90613759565b600554600480546001600160a01b0319166001600160a01b0390921691821790556040517f9d3e522e1e47a2f6009739342b9cc7b252a1888154e843ab55ee1c81745795ab9061076790839061315d565b6000806108dd601184611d65565b546001600160a01b03169392505050565b600080600260005414156109145760405162461bcd60e51b81526004016106ed90613a36565b600260005561092233611d8c565b15801561092e57503332145b61094a5760405162461bcd60e51b81526004016106ed9061344d565b600d5460ff1661096c5760405162461bcd60e51b81526004016106ed9061394b565b3360009081526010602052604090206003810154431161099e5760405162461bcd60e51b81526004016106ed90613825565b6109a981600e611d92565b60006109b53386611dee565b9050846000808315610a1b5760075460009081906109dc906001600160a01b031687611f4e565b90925090506109eb85876120e9565b94506109f73386611f4e565b9094509250610a068382612111565b9250610a128483612111565b93505050610a2b565b610a253384611f4e565b90925090505b60408051808201909152601b81527f4578636565647320776974686472617761626c6520616d6f756e74000000000060208201528554610a6c918390612136565b855560408051606081019091526031808252610a9591600e91613b206020830139879190612162565b336001600160a01b03167fb3ad69dc1d2c6b1f5f5b0927ffd8ee8f1437a156253c8f6dccc75e6f8e4fd38b898484604051610ad293929190613aba565b60405180910390a260016000559097909650945050505050565b670de0b6b3a764000081565b60135481565b60008060026000541415610b245760405162461bcd60e51b81526004016106ed90613a36565b6002600055610b3233611d8c565b158015610b3e57503332145b610b5a5760405162461bcd60e51b81526004016106ed9061344d565b60135415610c0457601254604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b158015610ba757600080fd5b505afa158015610bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdf91906130f0565b90506013548111610c025760405162461bcd60e51b81526004016106ed90613a6d565b505b600d5460ff16610c265760405162461bcd60e51b81526004016106ed9061394b565b336000908152601060205260409020610c4081600e611d92565b8060010154841115610c5457806001015493505b600080610c613087611f4e565b91509150610c6e82612191565b6040805160208101909152600081528354610c8a918390612136565b83556040805160208101909152600081526001840154610cab918490612136565b600184015560405133907f3ea051727656be6fd11c2260f244f29ff3c70d1fb077bfa73e89d554e9bb95c790610ce690899086908690613aba565b60405180910390a26001600055909590945092505050565b6004546001600160a01b0316331480610d2157506006546001600160a01b031633145b610d3d5760405162461bcd60e51b81526004016106ed90613825565b600d805461ff001916610100831515021790556040517ff0064f2efd0da4bc63eecf2e75590fe8a308eaa526a51c334e50eec09a711049906107679083906131d1565b61271081565b60158181548110610d9357fe5b600091825260209091200154905081565b610dac612f73565b506040805160208101909152600e54815290565b6004546001600160a01b03163314610dea5760405162461bcd60e51b81526004016106ed90613715565b60098114610e0a5760405162461bcd60e51b81526004016106ed90613645565b610e1660148383612f86565b505050565b60008060026000541415610e415760405162461bcd60e51b81526004016106ed90613a36565b6002600055600d5460ff16610e685760405162461bcd60e51b81526004016106ed9061394b565b6000610e75601185611d65565b9050610e858482600101546122e3565b6001600055909590945092505050565b6003546001600160a01b031681565b600081565b6004546001600160a01b03163314610ed35760405162461bcd60e51b81526004016106ed90613715565b670de0b6b3a7640000811015610efb5760405162461bcd60e51b81526004016106ed9061320f565b673782dace9d900000811115610f235760405162461bcd60e51b81526004016106ed90613315565b60408051602081018252829052600e829055517ff78180bc708b1292177c888900951cd66a39faf48dc7b6d111e93285dbbe55a090610767908390613aa3565b600d54610100900460ff1681565b6004546001600160a01b03163314610f9b5760405162461bcd60e51b81526004016106ed90613715565b601280546001600160a01b0319166001600160a01b039390931692909217909155601355565b6004546001600160a01b031681565b600060026000541415610ff55760405162461bcd60e51b81526004016106ed90613a36565b6002600055600d5460ff1661101c5760405162461bcd60e51b81526004016106ed9061394b565b600d54610100900460ff16156110445760405162461bcd60e51b81526004016106ed90613836565b61104c6123a0565b9050600160005590565b6008546001600160a01b031681565b6004546001600160a01b0316331461108f5760405162461bcd60e51b81526004016106ed90613715565b6127108111156110b15760405162461bcd60e51b81526004016106ed906137d7565b600a8190556040517fc36862a253ff42cc71f4f200d3c62e8e5eaaece01041fc6900aeace64ade72a890610767908390613aa3565b6004546001600160a01b031633146111105760405162461bcd60e51b81526004016106ed90613715565b601655565b6001600160a01b031660009081526010602052604090206003015490565b6009546001600160a01b031681565b6012546001600160a01b031681565b600260005414156111745760405162461bcd60e51b81526004016106ed90613a36565b600260005561118233611d8c565b15801561118e57503332145b6111aa5760405162461bcd60e51b81526004016106ed9061344d565b6013541561125457601254604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b1580156111f757600080fd5b505afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f91906130f0565b905060135481116112525760405162461bcd60e51b81526004016106ed90613a6d565b505b600d5460ff166112765760405162461bcd60e51b81526004016106ed9061394b565b33600090815260106020526040902061129081600e611d92565b6002810154828110156112f45760006112a984836120e9565b60018401549091506112bb9082612111565b600184015560006002840155604080516060810190915260308082526112ee91600e91613b516020830139859190612162565b50611304565b6112fe81846120e9565b60028301555b60006113103385611dee565b9050838115611397576002546007546040516340c10f1960e01b81526001600160a01b03928316926340c10f199261134f929116908690600401613171565b600060405180830381600087803b15801561136957600080fd5b505af115801561137d573d6000803e3d6000fd5b5050505061139482826120e990919063ffffffff16565b90505b6002546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906113c99033908590600401613171565b600060405180830381600087803b1580156113e357600080fd5b505af11580156113f7573d6000803e3d6000fd5b5050600160005550505050505050565b6001600160a01b031660009081526010602052604090205490565b6004546001600160a01b0316331461144c5760405162461bcd60e51b81526004016106ed90613715565b6009811461146c5760405162461bcd60e51b81526004016106ed90613372565b610e1660158383612f86565b600061148460116123f9565b905090565b6001600160a01b03811660009081526010602052604081206114ac81600e6123fd565b9392505050565b6000806114c1601184611d65565b600101549392505050565b6004546001600160a01b031633146114f65760405162461bcd60e51b81526004016106ed90613715565b6001600160a01b03811661151c5760405162461bcd60e51b81526004016106ed906138f6565b600880546001600160a01b0319166001600160a01b0383161790556040517fe42bb1780117f5788c6e0042e955291223819875891ddf465b8e4fbb85a933e99061076790839061315d565b600a5481565b600260005414156115905760405162461bcd60e51b81526004016106ed90613a36565b600260005561159e33611d8c565b1580156115aa57503332145b6115c65760405162461bcd60e51b81526004016106ed9061344d565b600d5460ff166115e85760405162461bcd60e51b81526004016106ed9061394b565b600d54610100900460ff16156116105760405162461bcd60e51b81526004016106ed90613836565b33600090815260106020526040902061162a81600e611d92565b600154611642906001600160a01b031633308561243c565b600c548210611655576116536123a0565b505b600b546116629083612111565b600b5580546116719083612111565b815543600382015560405133907f59062170a285eb80e8c6b8ced60428442a51910635005233fc4ce084a475845e906116ab908590613aa3565b60405180910390a250506001600055565b6007546001600160a01b031681565b6004546001600160a01b031633146116f55760405162461bcd60e51b81526004016106ed90613715565b600d5460ff16156117185760405162461bcd60e51b81526004016106ed90613790565b6008546001600160a01b03166117405760405162461bcd60e51b81526004016106ed906135e8565b6009546001600160a01b03166117685760405162461bcd60e51b81526004016106ed9061398f565b61177181612494565b50600d805460ff19166001179055565b600d5460ff166117a35760405162461bcd60e51b81526004016106ed9061394b565b6004546001600160a01b031633146117cd5760405162461bcd60e51b81526004016106ed90613715565b6117d681612494565b50565b600260005414156117fc5760405162461bcd60e51b81526004016106ed90613a36565b600260005561180a33611d8c565b15801561181657503332145b6118325760405162461bcd60e51b81526004016106ed9061344d565b601354156118dc57601254604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b15801561187f57600080fd5b505afa158015611893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b791906130f0565b905060135481116118da5760405162461bcd60e51b81526004016106ed90613a6d565b505b600d5460ff166118fe5760405162461bcd60e51b81526004016106ed9061394b565b33600090815260106020526040902061191881600e611d92565b821561193f57600154611936906001600160a01b031633308661243c565b61193f83612191565b8115611a0c5760025460405163079cc67960e41b81526001600160a01b03909116906379cc6790906119779033908690600401613171565b600060405180830381600087803b15801561199157600080fd5b505af11580156119a5573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb91506119d9908590600401613aa3565b600060405180830381600087803b1580156119f357600080fd5b505af1158015611a07573d6000803e3d6000fd5b505050505b6000611a188484612111565b9050611a42816040518060200160405280600081525084600101546121369092919063ffffffff16565b600183015560405133907fbade234341a40ca3c71df59b3ca02b8bb65b491a098af970953228b4f4a5d38f90611a7b9087908790613aac565b60405180910390a2505060016000555050565b600d54600090819060ff16611ab55760405162461bcd60e51b81526004016106ed9061394b565b6000611ac2601185611d65565b9050600080611ad183306125bf565b90925090508115611b83576000611aff612710611af9600a5486611d2290919063ffffffff16565b90612614565b90506000611b0d84836120e9565b9050611b17612f73565b611b2c600b54611b2684612646565b90612688565b6040805160208101909152600f548152909150611b4990826126bc565b51600f558215611b7057600954600154611b70916001600160a01b039182169116856126ec565b8115611b7f57611b7f82612191565b5050505b7f11d2034f4471d11a13f0f1798ceaf0c9db2812d450a0681958ce7d4f2fb97f098282604051611bb4929190613aac565b60405180910390a1909350915050915091565b60148181548110610d9357fe5b6004546001600160a01b03163314611bfe5760405162461bcd60e51b81526004016106ed90613715565b6001600160a01b038116611c245760405162461bcd60e51b81526004016106ed9061386d565b600980546001600160a01b0319166001600160a01b0383161790556040517f05f3326e0527f309d4015dee3bc3f36e650b53fc823bab69c99847814acfafdf9061076790839061315d565b600c5481565b6005546001600160a01b031681565b6006546001600160a01b031681565b6001600160a01b03811660009081526010602052604081206114ac81600e61270b565b6001546001600160a01b031681565b60008060026000541415611ceb5760405162461bcd60e51b81526004016106ed90613a36565b6002600055600d5460ff16611d125760405162461bcd60e51b81526004016106ed9061394b565b610e8584846122e3565b600b5481565b600082611d3157506000611d5f565b82820282848281611d3e57fe5b0414611d5c5760405162461bcd60e51b81526004016106ed906136d4565b90505b92915050565b6000826000018281548110611d7657fe5b9060005260206000209060020201905092915050565b3b151590565b6000611d9e8383612752565b90508260010154811115611dcc576001830180546000909155611dc182826120e9565b600285015550611de1565b6001830154611ddb90826120e9565b60018401555b5060010154600490910155565b6003546040516370a0823160e01b8152600091829160649183916001600160a01b03909116906370a0823190611e2890899060040161315d565b60206040518083038186803b158015611e4057600080fd5b505afa158015611e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7891906130f0565b9050611e95612710611af960165488611d2290919063ffffffff16565b92508015611f445760005b6009811015611f4257611edb670de0b6b3a764000060148381548110611ec257fe5b9060005260206000200154611d2290919063ffffffff16565b8210611f3a57611efc612710611af960165489611d2290919063ffffffff16565b9350611f376064611af9611f3060158581548110611f1657fe5b9060005260206000200154876120e990919063ffffffff16565b8790611d22565b93505b600101611ea0565b505b5090949350505050565b6001546040516370a0823160e01b815260009182918291611fde9186916001600160a01b0316906370a0823190611f8990309060040161315d565b60206040518083038186803b158015611fa157600080fd5b505afa158015611fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd991906130f0565b6127cb565b90506001600160a01b03851630146120765760015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906120229088908590600401613171565b602060405180830381600087803b15801561203c57600080fd5b505af1158015612050573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207491906130b8565b505b8080600061208487836120e9565b905080156120ca57600061209860116127e1565b90506000806120a9838c868461280c565b90925090506120b88683612111565b95506120c48582612111565b94505050505b600b546120d790836120e9565b600b55509093509150505b9250929050565b60008282111561210b5760405162461bcd60e51b81526004016106ed906134d7565b50900390565b600082820183811015611d5c5760405162461bcd60e51b81526004016106ed90613416565b6000818484111561215a5760405162461bcd60e51b81526004016106ed91906131dc565b505050900390565b61216c8383612844565b819061218b5760405162461bcd60e51b81526004016106ed91906131dc565b50505050565b60015460085460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926121c7929116908590600401613171565b602060405180830381600087803b1580156121e157600080fd5b505af11580156121f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221991906130b8565b50600854604051631f72642160e31b81526001600160a01b039091169063fb9321089061224c9030908590600401613171565b600060405180830381600087803b15801561226657600080fd5b505af115801561227a573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb91506122ae908490600401613aa3565b600060405180830381600087803b1580156122c857600080fd5b505af11580156122dc573d6000803e3d6000fd5b5050505050565b600d546000908190610100900460ff168061230857506004546001600160a01b031633145b8061231c57506123186011612872565b8414155b6123385760405162461bcd60e51b81526004016106ed9061326c565b6000612345601186611d65565b90506000806123568330888461280c565b91509150867fccbd929f935422b28ee209a0db0556280b0a3d9bc4da58f1d3f0ab4f8a499647838360405161238c929190613aac565b60405180910390a290969095509350505050565b6000806123ad60116127e1565b905060006123ba826128bf565b90507f860f4701faa0ecdeecd9e9eaae11a8612bbd01c663081f7c0c4e4873df653d69816040516123eb9190613aa3565b60405180910390a191505090565b5490565b60008061240a8484612752565b90508061241d5750506001820154611d5f565b600184015480821061243457600092505050611d5f565b039392505050565b61218b846323b872dd60e01b85858560405160240161245d9392919061318a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612953565b6001600160a01b0381166124ba5760405162461bcd60e51b81526004016106ed90613554565b60015460408051637e062a3560e11b815290516001600160a01b039283169284169163fc0c546a916004808301926020929190829003018186803b15801561250157600080fd5b505afa158015612515573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253991906130d4565b6001600160a01b03161461255f5760405162461bcd60e51b81526004016106ed90613691565b604080518082019091526001600160a01b038216815260006020820152612588906011906129e2565b6040516001600160a01b038216907f0821015de34e20b0878a40f6f165801417f53b2017016d7321cacee989c8cfa790600090a250565b60008083600101546125d085612a25565b116125e0575060009050806120e2565b60006125f985600101546125f387612a25565b906120e9565b90506126088585836001612aa1565b92509250509250929050565b60008082116126355760405162461bcd60e51b81526004016106ed906135b1565b81838161263e57fe5b049392505050565b61264e612f73565b600082158061266b575050670de0b6b3a764000082810290810483145b61267457600080fd5b604080516020810190915290815292915050565b612690612f73565b8161269a57600080fd5b6040518060200160405280838560000151816126b257fe5b0490529392505050565b6126c4612f73565b825182518101908110156126d757600080fd5b60408051602081019091529081529392505050565b610e168363a9059cbb60e01b848460405160240161245d929190613171565b6000806127188484612752565b90508061272b5750506002820154611d5f565b600184015480821161274257600092505050611d5f565b6002850154910301905092915050565b600061275c612f73565b50604080516020810190915260018301548152612777612f73565b506040805160208101909152600485015481526127948282612c5e565b6127a357600092505050611d5f565b84546127c2906127bd906127b78585612c8f565b90612caa565b612cd8565b95945050505050565b60008183106127da5781611d5c565b5090919050565b6000816127ed81612872565b815481106127f757fe5b90600052602060002090600202019050919050565b600080808061281d88888888612aa1565b60018a0154919350915061283190826120e9565b6001890155909250905094509492505050565b6000806128696128548585612ce7565b60408051602081019091528554815290612c5e565b13159392505050565b60008061287e836123f9565b90506114ac6001604051806040016040528060118152602001705661756c742e4c6973743a20656d70747960781b815250836121369092919063ffffffff16565b6000806128cb83612d2b565b90506114ac816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016128fc919061315d565b60206040518083038186803b15801561291457600080fd5b505afa158015612928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294c91906130f0565b8490612da7565b60606129a8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e4e9092919063ffffffff16565b805190915015610e1657808060200190518101906129c691906130b8565b610e165760405162461bcd60e51b81526004016106ed906139ec565b8154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b039093169290921782559190920151910155565b8054604080516306a61f7560e51b815290516000926001600160a01b03169163d4c3eea0916004808301926020929190829003018186803b158015612a6957600080fd5b505afa158015612a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5f91906130f0565b6000806000612aaf87612d2b565b90506000816001600160a01b03166370a08231886040518263ffffffff1660e01b8152600401612adf919061315d565b60206040518083038186803b158015612af757600080fd5b505afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2f91906130f0565b90506000612b3c89612a25565b895460405163ead5d35960e01b81529192506001600160a01b03169063ead5d35990612b70908b908b908b906004016131ae565b600060405180830381600087803b158015612b8a57600080fd5b505af1158015612b9e573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03861691506370a0823190612bd1908c9060040161315d565b60206040518083038186803b158015612be957600080fd5b505afa158015612bfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2191906130f0565b90506000612c2f82856120e9565b90506000612c3c8c612a25565b90506000612c4a85836120e9565b929d929c50919a5050505050505050505050565b805182516000911115612c745750600019611d5f565b815183511115612c8657506001611d5f565b50600092915050565b612c97612f73565b825182518103908111156126d757600080fd5b612cb2612f73565b6000821580612ccf575050825182810290838281612ccc57fe5b04145b6126d757600080fd5b51670de0b6b3a7640000900490565b612cef612f73565b6000612cfb84846123fd565b905080612d1257612d0a612e5d565b915050611d5f565b612d2381611b268660000154612646565b949350505050565b805460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b158015612d6f57600080fd5b505afa158015612d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5f91906130d4565b600080612db384612d2b565b8454909150612dcf906001600160a01b038084169116856126ec565b835460405163b6b55f2560e01b81526001600160a01b039091169063b6b55f2590612dfe908690600401613aa3565b600060405180830381600087803b158015612e1857600080fd5b505af1158015612e2c573d6000803e3d6000fd5b5050506001850154612e3f915084612111565b60018501555081905092915050565b6060612d238484600085612e79565b612e65612f73565b506040805160208101909152600019815290565b606082471015612e9b5760405162461bcd60e51b81526004016106ed9061350e565b612ea485611d8c565b612ec05760405162461bcd60e51b81526004016106ed906138bf565b60006060866001600160a01b03168587604051612edd9190613141565b60006040518083038185875af1925050503d8060008114612f1a576040519150601f19603f3d011682016040523d82523d6000602084013e612f1f565b606091505b5091509150612f2f828286612f3a565b979650505050505050565b60608315612f495750816114ac565b825115612f595782518084602001fd5b8160405162461bcd60e51b81526004016106ed91906131dc565b6040518060200160405280600081525090565b828054828255906000526020600020908101928215612fc1579160200282015b82811115612fc1578235825591602001919060010190612fa6565b50612fcd929150612fd1565b5090565b5b80821115612fcd5760008155600101612fd2565b600060208284031215612ff7578081fd5b8135611d5c81613afc565b60008060408385031215613014578081fd5b823561301f81613afc565b946020939093013593505050565b6000806020838503121561303f578182fd5b823567ffffffffffffffff80821115613056578384fd5b818501915085601f830112613069578384fd5b813581811115613077578485fd5b866020808302850101111561308a578485fd5b60209290920196919550909350505050565b6000602082840312156130ad578081fd5b8135611d5c81613b11565b6000602082840312156130c9578081fd5b8151611d5c81613b11565b6000602082840312156130e5578081fd5b8151611d5c81613afc565b600060208284031215613101578081fd5b5051919050565b600060208284031215613119578081fd5b5035919050565b60008060408385031215613132578182fd5b50508035926020909101359150565b60008251613153818460208701613ad0565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b901515815260200190565b60006020825282518060208401526131fb816040850160208701613ad0565b601f01601f19169190910160400192915050565b6020808252603a908201527f59756d4c696e6b5665737065725661756c743a20636f6c6c61746572616c697a60408201527f6174696f6e206c696d69742062656c6f77206d696e696d756d2e000000000000606082015260800190565b60208082526079908201527f59756d4c696e6b5665737065725661756c743a206e6f7420616e20656d65726760408201527f656e63792c206e6f7420676f7665726e616e63652c20616e642075736572206460608201527f6f6573206e6f742068617665207065726d697373696f6e20746f20726563616c60808201527f6c2066756e64732066726f6d20616374697665207661756c740000000000000060a082015260c00190565b6020808252603a908201527f59756d4c696e6b5665737065725661756c743a20636f6c6c61746572616c697a60408201527f6174696f6e206c696d69742061626f7665206d6178696d756d2e000000000000606082015260800190565b60208082526031908201527f59756d4c696e6b5665737065725661756c743a20646973636f756e745461626c6040820152700ca40d8cadccee8d040dad2e6dac2e8c6d607b1b606082015260800190565b60208082526033908201527f59756d4c696e6b5665737065725661756c743a2073656e74696e656c206164646040820152723932b9b99031b0b73737ba10313290183c181760691b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f536f72727920776520646f206e6f742061636365707420636f6e747261637421604082015260600190565b60208082526035908201527f59756d4c696e6b5665737065725661756c743a20676f7665726e616e6365206160408201527432323932b9b99031b0b73737ba10313290183c181760591b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526037908201527f59756d4c696e6b5665737065725661756c743a20616374697665207661756c7460408201527f20616464726573732063616e6e6f74206265203078302e000000000000000000606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252603f908201527f59756d4c696e6b5665737065725661756c743a2063616e6e6f7420696e69746960408201527f616c697a65207472616e736d75746572206164647265737320746f2030783000606082015260800190565b6020808252602c908201527f59756d4c696e6b5665737065725661756c743a206665654c6576656c206c656e60408201526b0cee8d040dad2e6dac2e8c6d60a31b606082015260800190565b60208082526023908201527f59756d4c696e6b5665737065725661756c743a20746f6b656e206d69736d617460408201526231b41760e91b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526024908201527f59756d4c696e6b5665737065725661756c743a206f6e6c7920676f7665726e616040820152633731b29760e11b606082015260800190565b6020808252601f908201527f73656e646572206973206e6f742070656e64696e67476f7665726e616e636500604082015260600190565b60208082526027908201527f59756d4c696e6b5665737065725661756c743a20616c726561647920696e69746040820152661a585b1a5e995960ca1b606082015260800190565b6020808252602e908201527f59756d4c696e6b5665737065725661756c743a2068617276657374206665652060408201526d30b137bb329036b0bc34b6bab69760911b606082015260800190565b602080825260009082015260400190565b60208082526017908201527f656d657267656e637920706175736520656e61626c6564000000000000000000604082015260600190565b60208082526032908201527f59756d4c696e6b5665737065725661756c743a2072657761726473206164647260408201527132b9b99031b0b73737ba10313290183c181760711b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526035908201527f59756d4c696e6b5665737065725661756c743a207472616e736d75746572206160408201527432323932b9b99031b0b73737ba10313290183c181760591b606082015260800190565b60208082526024908201527f59756d4c696e6b5665737065725661756c743a206e6f7420696e697469616c696040820152633d32b21760e11b606082015260800190565b6020808252603c908201527f59756d4c696e6b5665737065725661756c743a2063616e6e6f7420696e69746960408201527f616c697a652072657761726473206164647265737320746f2030783000000000606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526012908201527137b333103832b3903634b6b4ba30ba34b7b760711b604082015260600190565b9051815260200190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60005b83811015613aeb578181015183820152602001613ad3565b8381111561218b5750506000910152565b6001600160a01b03811681146117d657600080fd5b80151581146117d657600080fdfe416374696f6e20626c6f636b65643a20756e6865616c74687920636f6c6c61746572616c697a6174696f6e20726174696f59756d4c696e6b5665737065725661756c743a204c6f616e2d746f2d76616c756520726174696f206272656163686564a26469706673582212202c696dca15596e3abd18da69a0f4eb148bf866bd99df8225d6f4e36b75e04f8164736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca00000000000000000000000029ddf2c4f1e80dc9e95cc57a9ca03a28e4ab6d6c000000000000000000000000b938d8cbf7fc6455d1f2ebede5ff9a8e887493b200000000000000000000000068284083acbabcb6da84f62ea341dd8c30500eee0000000000000000000000009e145af5b3b142a50d871cb4821992dd493d379800000000000000000000000076e2fd0cc4daa40c76f90f3ddfa2e3abf7a75810
-----Decoded View---------------
Arg [0] : _token (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [1] : _xtoken (address): 0x29DDF2c4F1E80DC9E95CC57a9cA03a28E4aB6D6c
Arg [2] : _votingEscrow (address): 0xb938D8cBF7fc6455d1f2ebeDE5FF9A8e887493B2
Arg [3] : _governance (address): 0x68284083acbabCb6da84f62ea341dd8c30500EEE
Arg [4] : _sentinel (address): 0x9e145AF5b3B142a50d871cb4821992dd493d3798
Arg [5] : _feeCollector (address): 0x76E2FD0CC4DAa40C76f90f3DdfA2E3ABF7A75810
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [1] : 00000000000000000000000029ddf2c4f1e80dc9e95cc57a9ca03a28e4ab6d6c
Arg [2] : 000000000000000000000000b938d8cbf7fc6455d1f2ebede5ff9a8e887493b2
Arg [3] : 00000000000000000000000068284083acbabcb6da84f62ea341dd8c30500eee
Arg [4] : 0000000000000000000000009e145af5b3b142a50d871cb4821992dd493d3798
Arg [5] : 00000000000000000000000076e2fd0cc4daa40c76f90f3ddfa2e3abf7a75810
Deployed Bytecode Sourcemap
103123:30259:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108827:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104734:77;;;:::i;111054:230::-;;;;;;:::i;:::-;;:::i;:::-;;110353:293;;;;;;:::i;:::-;;:::i;107600:23::-;;;:::i;:::-;;;;;;;:::i;106313:28::-;;;:::i;:::-;;;;;;;:::i;112036:116::-;;;;;;:::i;:::-;;:::i;110781:267::-;;;:::i;126401:175::-;;;;;;:::i;:::-;;:::i;121655:1319::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;104173:77::-;;;:::i;108572:25::-;;;:::i;124017:816::-;;;;;;:::i;:::-;;:::i;114927:221::-;;;;;;:::i;:::-;;:::i;103639:50::-;;;:::i;108743:30::-;;;;;;:::i;:::-;;:::i;115367:136::-;;;:::i;:::-;;;;;;;:::i;113403:186::-;;;;;;:::i;:::-;;:::i;118518:227::-;;;;;;:::i;:::-;;:::i;106402:33::-;;;:::i;103427:49::-;;;:::i;114176:435::-;;;;;;:::i;:::-;;:::i;107775:25::-;;;:::i;114639:131::-;;;;;;:::i;:::-;;:::i;106549:25::-;;;:::i;119023:344::-;;;:::i;107029:25::-;;;:::i;112962:435::-;;;;;;:::i;:::-;;:::i;113817:90::-;;;;;;:::i;:::-;;:::i;128279:159::-;;;;;;:::i;:::-;;:::i;107126:22::-;;;:::i;108451:29::-;;;:::i;125162:901::-;;;;;;:::i;:::-;;:::i;127170:165::-;;;;;;:::i;:::-;;:::i;113595:216::-;;;;;;:::i;:::-;;:::i;126165:90::-;;;:::i;127535:171::-;;;;;;:::i;:::-;;:::i;126792:181::-;;;;;;:::i;:::-;;:::i;111499:435::-;;;;;;:::i;:::-;;:::i;107244:25::-;;;:::i;120180:571::-;;;;;;:::i;:::-;;:::i;106892:27::-;;;:::i;115727:420::-;;;;;;:::i;:::-;;:::i;116528:121::-;;;;;;:::i;:::-;;:::i;123127:722::-;;;;;;:::i;:::-;;:::i;116849:941::-;;;;;;:::i;:::-;;:::i;108627:25::-;;;;;;:::i;:::-;;:::i;112382:405::-;;;;;;:::i;:::-;;:::i;107492:29::-;;;:::i;106632:32::-;;;:::i;106772:23::-;;;:::i;127883:175::-;;;;;;:::i;:::-;;:::i;106208:27::-;;;:::i;118071:171::-;;;;;;:::i;:::-;;:::i;107381:29::-;;;:::i;108827:23::-;;;;:::o;104734:77::-;104792:19;104734:77;:::o;111054:230::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;111128:25:0;::::1;111120:89;;;;-1:-1:-1::0;;;111120:89:0::1;;;;;;;:::i;:::-;111218:8;:20:::0;;-1:-1:-1;;;;;;111218:20:0::1;-1:-1:-1::0;;;;;111218:20:0;::::1;;::::0;;111252:26:::1;::::0;::::1;::::0;::::1;::::0;111218:20;;111252:26:::1;:::i;:::-;;;;;;;;111054:230:::0;:::o;110353:293::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;110443:34:0;::::1;110435:100;;;;-1:-1:-1::0;;;110435:100:0::1;;;;;;;:::i;:::-;110544:17;:38:::0;;-1:-1:-1;;;;;;110544:38:0::1;-1:-1:-1::0;;;;;110544:38:0;::::1;;::::0;;110596:44:::1;::::0;::::1;::::0;::::1;::::0;110544:38;;110596:44:::1;:::i;107600:23::-:0;;;;;;:::o;106313:28::-;;;-1:-1:-1;;;;;106313:28:0;;:::o;112036:116::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;112112:14:::1;:32:::0;112036:116::o;110781:267::-;110848:17;;-1:-1:-1;;;;;110848:17:0;110834:10;:31;110826:74;;;;-1:-1:-1;;;110826:74:0;;;;;;;:::i;:::-;110936:17;;110960:10;:31;;-1:-1:-1;;;;;;110960:31:0;-1:-1:-1;;;;;110936:17:0;;;110960:31;;;;;111005:37;;;;;;110936:17;;111005:37;:::i;126401:175::-;126467:15;;126521:21;:7;126533:8;126521:11;:21::i;:::-;126556:14;-1:-1:-1;;;;;126556:14:0;;126401:175;-1:-1:-1;;;126401:175:0:o;121655:1319::-;121757:7;121766;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129292:32:::1;129300:10;129292:30;:32::i;:::-;129291:33;:60;;;;-1:-1:-1::0;129328:10:0::1;129342:9;129328:23;129291:60;129283:105;;;;-1:-1:-1::0;;;129283:105:0::1;;;;;;;:::i;:::-;129593:11:::2;::::0;::::2;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::2;;;;;;;:::i;:::-;121814:10:::3;121784:21;121808:17:::0;;;:5:::3;:17;::::0;;;;121855:16:::3;::::0;::::3;::::0;121840:12:::3;:31;121832:44;;;;-1:-1:-1::0;;;121832:44:0::3;;;;;;;:::i;:::-;121885:17;:4:::0;121897::::3;121885:11;:17::i;:::-;121911:25;121939:37;121957:10;121968:7;121939:17;:37::i;:::-;121911:65:::0;-1:-1:-1;122009:7:0;121983:23:::3;::::0;122097:21;;122094:555:::3;;122205:12;::::0;122129:27:::3;::::0;;;122188:49:::3;::::0;-1:-1:-1;;;;;122205:12:0::3;122219:17:::0;122188:16:::3;:49::i;:::-;122128:109:::0;;-1:-1:-1;122128:109:0;-1:-1:-1;122264:38:0::3;:15:::0;122284:17;122264:19:::3;:38::i;:::-;122246:56;;122353:45;122370:10;122382:15;122353:16;:45::i;:::-;122315:83:::0;;-1:-1:-1;122315:83:0;-1:-1:-1;122427:39:0::3;122315:83:::0;122447:18;122427:19:::3;:39::i;:::-;122409:57:::0;-1:-1:-1;122494:41:0::3;:16:::0;122515:19;122494:20:::3;:41::i;:::-;122475:60;;122094:555;;;;;122596:45;122613:10;122625:15;122596:16;:45::i;:::-;122558:83:::0;;-1:-1:-1;122558:83:0;-1:-1:-1;122094:555:0::3;122679:71;::::0;;;;::::3;::::0;;;::::3;::::0;;::::3;;::::0;::::3;::::0;:19;;:71:::3;::::0;122703:15;;122679:23:::3;:71::i;:::-;122657:93:::0;;122757:75:::3;::::0;;::::3;::::0;::::3;::::0;;;::::3;::::0;;;::::3;::::0;122774:4:::3;::::0;122757:75:::3;;::::0;::::3;;:4:::0;;:75;:16:::3;:75::i;:::-;122862:10;-1:-1:-1::0;;;;;122846:71:0::3;;122874:7;122883:16;122901:15;122846:71;;;;;;;;:::i;:::-;;;;;;;;2674:1:::0;3636:7;:22;122934:16;;;;-1:-1:-1;121655:1319:0;-1:-1:-1;;;;;121655:1319:0:o;104173:77::-;104231:19;104173:77;:::o;108572:25::-;;;;:::o;124017:816::-;124132:7;124141;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129292:32:::1;129300:10;129292:30;:32::i;:::-;129291:33;:60;;;;-1:-1:-1::0;129328:10:0::1;129342:9;129328:23;129291:60;129283:105;;;;-1:-1:-1::0;;;129283:105:0::1;;;;;;;:::i;:::-;128948:10:::2;::::0;:14;128945:174:::2;;129015:14;::::0;129004:41:::2;::::0;;-1:-1:-1;;;129004:41:0;;;;128973:20:::2;::::0;-1:-1:-1;;;;;129015:14:0::2;::::0;129004:39:::2;::::0;:41:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;129015:14;129004:41;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;128973:73;;129078:10;;129063:12;:25;129055:56;;;;-1:-1:-1::0;;;129055:56:0::2;;;;;;;:::i;:::-;128945:174;;129593:11:::3;::::0;::::3;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::3;;;;;;;:::i;:::-;124187:10:::4;124157:21;124181:17:::0;;;:5:::4;:17;::::0;;;;124205::::4;124181::::0;124217:4:::4;124205:11;:17::i;:::-;124301:4;:14;;;124291:7;:24;124288:69;;;124335:4;:14;;;124325:24;;124288:69;124364:24;124390:23:::0;124417:40:::4;124442:4;124449:7;124417:16;:40::i;:::-;124363:94;;;;124512:41;124536:16;124512:23;:41::i;:::-;124584:44;::::0;;::::4;::::0;::::4;::::0;;;-1:-1:-1;124584:44:0;;:19;;:44:::4;::::0;124608:15;;124584:23:::4;:44::i;:::-;124562:66:::0;;124652:40:::4;::::0;;::::4;::::0;::::4;::::0;;;124562:19:::4;124652:40:::0;;:14:::4;::::0;::::4;::::0;:40:::4;::::0;124671:16;;124652:18:::4;:40::i;:::-;124635:14;::::0;::::4;:57:::0;124704:72:::4;::::0;124721:10:::4;::::0;124704:72:::4;::::0;::::4;::::0;124733:7;;124742:16;;124760:15;;124704:72:::4;:::i;:::-;;;;;;;;2674:1:::0;3636:7;:22;124793:16;;;;-1:-1:-1;124017:816:0;-1:-1:-1;;;124017:816:0:o;114927:221::-;115012:10;;-1:-1:-1;;;;;115012:10:0;114998;:24;;:50;;-1:-1:-1;115040:8:0;;-1:-1:-1;;;;;115040:8:0;115026:10;:22;114998:50;114990:63;;;;-1:-1:-1;;;114990:63:0;;;;;;;:::i;:::-;115062:13;:30;;-1:-1:-1;;115062:30:0;;;;;;;;;115106:36;;;;;;115062:30;;115106:36;:::i;103639:50::-;103684:5;103639:50;:::o;108743:30::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;108743:30:0;:::o;115367:136::-;115424:30;;:::i;:::-;-1:-1:-1;115463:34:0;;;;;;;;;115470:4;115463:34;;;115367:136;:::o;113403:186::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;113506:1:::1;113486:21:::0;::::1;113478:78;;;;-1:-1:-1::0;;;113478:78:0::1;;;;;;;:::i;:::-;113563:20;:8;113574:9:::0;;113563:20:::1;:::i;:::-;;113403:186:::0;;:::o;118518:227::-;118604:7;118613;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129593:11:::1;::::0;::::1;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::1;;;;;;;:::i;:::-;118629:27:::2;118659:21;:7;118671:8:::0;118659:11:::2;:21::i;:::-;118629:51;;118694:45;118707:8;118717:6;:21;;;118694:12;:45::i;:::-;2674:1:::0;3636:7;:22;118687:52;;;;-1:-1:-1;118518:227:0;-1:-1:-1;;;118518:227:0:o;106402:33::-;;;-1:-1:-1;;;;;106402:33:0;;:::o;103427:49::-;103474:1;103427:49;:::o;114176:435::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;104231:19:::1;114261:6;:41;;114253:112;;;;-1:-1:-1::0;;;114253:112:0::1;;;;;;;:::i;:::-;104792:19;114380:6;:41;;114372:112;;;;-1:-1:-1::0;;;114372:112:0::1;;;;;;;:::i;:::-;114523:31;::::0;;::::1;::::0;::::1;::::0;;;;;114493:4:::1;:61:::0;;;114568:37;::::1;::::0;::::1;::::0;114547:6;;114568:37:::1;:::i;107775:25::-:0;;;;;;;;;:::o;114639:131::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;114718:14:::1;:23:::0;;-1:-1:-1;;;;;;114718:23:0::1;-1:-1:-1::0;;;;;114718:23:0;;;::::1;::::0;;;::::1;::::0;;;114748:10:::1;:16:::0;114639:131::o;106549:25::-;;;-1:-1:-1;;;;;106549:25:0;;:::o;119023:344::-;119089:7;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129593:11:::1;::::0;::::1;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::1;;;;;;;:::i;:::-;119286:13:::2;::::0;::::2;::::0;::::2;;;119285:14;119277:50;;;;-1:-1:-1::0;;;119277:50:0::2;;;;;;;:::i;:::-;119343:18;:16;:18::i;:::-;119336:25;;2674:1:::0;3636:7;:22;119023:344;:::o;107029:25::-;;;-1:-1:-1;;;;;107029:25:0;;:::o;112962:435::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;103684:5:::1;113230:11;:33;;113222:92;;;;-1:-1:-1::0;;;113222:92:0::1;;;;;;;:::i;:::-;113323:10;:24:::0;;;113361:30:::1;::::0;::::1;::::0;::::1;::::0;113336:11;;113361:30:::1;:::i;113817:90::-:0;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;113881:8:::1;:20:::0;113817:90::o;128279:159::-;-1:-1:-1;;;;;128387:15:0;128347:7;128387:15;;;:5;:15;;;;;128416:16;;;;128279:159::o;107126:22::-;;;-1:-1:-1;;;;;107126:22:0;;:::o;108451:29::-;;;-1:-1:-1;;;;;108451:29:0;;:::o;125162:901::-;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129292:32:::1;129300:10;129292:30;:32::i;:::-;129291:33;:60;;;;-1:-1:-1::0;129328:10:0::1;129342:9;129328:23;129291:60;129283:105;;;;-1:-1:-1::0;;;129283:105:0::1;;;;;;;:::i;:::-;128948:10:::2;::::0;:14;128945:174:::2;;129015:14;::::0;129004:41:::2;::::0;;-1:-1:-1;;;129004:41:0;;;;128973:20:::2;::::0;-1:-1:-1;;;;;129015:14:0::2;::::0;129004:39:::2;::::0;:41:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;129015:14;129004:41;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;128973:73;;129078:10;;129063:12;:25;129055:56;;;;-1:-1:-1::0;;;129055:56:0::2;;;;;;;:::i;:::-;128945:174;;129593:11:::3;::::0;::::3;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::3;;;;;;;:::i;:::-;125302:10:::4;125272:21;125296:17:::0;;;:5:::4;:17;::::0;;;;125320::::4;125296::::0;125332:4:::4;125320:11;:17::i;:::-;125369:16;::::0;::::4;::::0;125398:22;;::::4;125394:340;;;125431:24;125458:25;:7:::0;125470:12;125458:11:::4;:25::i;:::-;125509:14;::::0;::::4;::::0;125431:52;;-1:-1:-1;125509:36:0::4;::::0;125431:52;125509:18:::4;:36::i;:::-;125492:14;::::0;::::4;:53:::0;125573:1:::4;125554:16;::::0;::::4;:20:::0;125585:74:::4;::::0;;::::4;::::0;::::4;::::0;;;::::4;::::0;;;::::4;::::0;125602:4:::4;::::0;125585:74:::4;;::::0;::::4;;:4:::0;;:74;:16:::4;:74::i;:::-;125394:340;;;;125701:25;:12:::0;125718:7;125701:16:::4;:25::i;:::-;125682:16;::::0;::::4;:44:::0;125394:340:::4;125742:25;125770:37;125788:10;125799:7;125770:17;:37::i;:::-;125742:65:::0;-1:-1:-1;125840:7:0;125860:21;;125856:153:::4;;125892:6;::::0;125904:12:::4;::::0;125892:44:::4;::::0;-1:-1:-1;;;125892:44:0;;-1:-1:-1;;;;;125892:6:0;;::::4;::::0;:11:::4;::::0;:44:::4;::::0;125904:12;::::4;::::0;125918:17;;125892:44:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;125963:38;125983:17;125963:15;:19;;:38;;;;:::i;:::-;125945:56;;125856:153;126017:6;::::0;:40:::4;::::0;-1:-1:-1;;;126017:40:0;;-1:-1:-1;;;;;126017:6:0;;::::4;::::0;:11:::4;::::0;:40:::4;::::0;126029:10:::4;::::0;126041:15;;126017:40:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;-1:-1:-1::0;;2674:1:0;3636:7;:22;-1:-1:-1;;;;;;;125162:901:0:o;127170:165::-;-1:-1:-1;;;;;127281:15:0;127241:7;127281:15;;;:5;:15;;;;;127310:19;;127170:165::o;113595:216::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;113713:1:::1;113688:26:::0;::::1;113680:88;;;;-1:-1:-1::0;;;113680:88:0::1;;;;;;;:::i;:::-;113775:30;:13;113791:14:::0;;113775:30:::1;:::i;126165:90::-:0;126210:7;126233:16;:7;:14;:16::i;:::-;126226:23;;126165:90;:::o;127535:171::-;-1:-1:-1;;;;;127641:15:0;;127601:7;127641:15;;;:5;:15;;;;;127670:30;127641:15;127695:4;127670:24;:30::i;:::-;127663:37;127535:171;-1:-1:-1;;;127535:171:0:o;126792:181::-;126865:7;;126911:21;:7;126923:8;126911:11;:21::i;:::-;126946;;;;126792:181;-1:-1:-1;;;126792:181:0:o;111499:435::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;111766:27:0;::::1;111758:93;;;;-1:-1:-1::0;;;111758:93:0::1;;;;;;;:::i;:::-;111860:10;:24:::0;;-1:-1:-1;;;;;;111860:24:0::1;-1:-1:-1::0;;;;;111860:24:0;::::1;;::::0;;111898:30:::1;::::0;::::1;::::0;::::1;::::0;111860:24;;111898:30:::1;:::i;107244:25::-:0;;;;:::o;120180:571::-;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129292:32:::1;129300:10;129292:30;:32::i;:::-;129291:33;:60;;;;-1:-1:-1::0;129328:10:0::1;129342:9;129328:23;129291:60;129283:105;;;;-1:-1:-1::0;;;129283:105:0::1;;;;;;;:::i;:::-;129593:11:::2;::::0;::::2;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::2;;;;;;;:::i;:::-;120290:13:::3;::::0;::::3;::::0;::::3;;;120289:14;120281:50;;;;-1:-1:-1::0;;;120281:50:0::3;;;;;;;:::i;:::-;120370:10;120340:21;120364:17:::0;;;:5:::3;:17;::::0;;;;120388::::3;120364::::0;120400:4:::3;120388:11;:17::i;:::-;120414:5;::::0;:58:::3;::::0;-1:-1:-1;;;;;120414:5:0::3;120437:10;120457:4;120464:7:::0;120414:22:::3;:58::i;:::-;120493:14;;120482:7;:25;120479:65;;120518:18;:16;:18::i;:::-;;120479:65;120567:14;::::0;:27:::3;::::0;120586:7;120567:18:::3;:27::i;:::-;120550:14;:44:::0;120625:19;;:32:::3;::::0;120649:7;120625:23:::3;:32::i;:::-;120603:54:::0;;120683:12:::3;120664:16;::::0;::::3;:31:::0;120709:36:::3;::::0;120725:10:::3;::::0;120709:36:::3;::::0;::::3;::::0;120737:7;;120709:36:::3;:::i;:::-;;;;;;;;-1:-1:-1::0;;2674:1:0;3636:7;:22;120180:571::o;106892:27::-;;;-1:-1:-1;;;;;106892:27:0;;:::o;115727:420::-;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;115808:11:::1;::::0;::::1;;115807:12;115799:64;;;;-1:-1:-1::0;;;115799:64:0::1;;;;;;;:::i;:::-;115880:10;::::0;-1:-1:-1;;;;;115880:10:0::1;115872:102;;;;-1:-1:-1::0;;;115872:102:0::1;;;;;;;:::i;:::-;115989:7;::::0;-1:-1:-1;;;;;115989:7:0::1;115981:96;;;;-1:-1:-1::0;;;115981:96:0::1;;;;;;;:::i;:::-;116086:28;116105:8;116086:18;:28::i;:::-;-1:-1:-1::0;116123:11:0::1;:18:::0;;-1:-1:-1;;116123:18:0::1;116137:4;116123:18;::::0;;115727:420::o;116528:121::-;129593:11;;;;129585:60;;;;-1:-1:-1;;;129585:60:0;;;;;;;:::i;:::-;130075:10:::1;::::0;-1:-1:-1;;;;;130075:10:0::1;130061;:24;130053:73;;;;-1:-1:-1::0;;;130053:73:0::1;;;;;;;:::i;:::-;116615:28:::2;116634:8;116615:18;:28::i;:::-;116528:121:::0;:::o;123127:722::-;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129292:32:::1;129300:10;129292:30;:32::i;:::-;129291:33;:60;;;;-1:-1:-1::0;129328:10:0::1;129342:9;129328:23;129291:60;129283:105;;;;-1:-1:-1::0;;;129283:105:0::1;;;;;;;:::i;:::-;128948:10:::2;::::0;:14;128945:174:::2;;129015:14;::::0;129004:41:::2;::::0;;-1:-1:-1;;;129004:41:0;;;;128973:20:::2;::::0;-1:-1:-1;;;;;129015:14:0::2;::::0;129004:39:::2;::::0;:41:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;129015:14;129004:41;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;128973:73;;129078:10;;129063:12;:25;129055:56;;;;-1:-1:-1::0;;;129055:56:0::2;;;;;;;:::i;:::-;128945:174;;129593:11:::3;::::0;::::3;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::3;;;;;;;:::i;:::-;123296:10:::4;123266:21;123290:17:::0;;;:5:::4;:17;::::0;;;;123314::::4;123290::::0;123326:4:::4;123314:11;:17::i;:::-;123344::::0;;123340:151:::4;;123372:5;::::0;:64:::4;::::0;-1:-1:-1;;;;;123372:5:0::4;123395:10;123415:4;123422:13:::0;123372:22:::4;:64::i;:::-;123445:38;123469:13;123445:23;:38::i;:::-;123503:16:::0;;123499:155:::4;;123530:6;::::0;:41:::4;::::0;-1:-1:-1;;;123530:41:0;;-1:-1:-1;;;;;123530:6:0;;::::4;::::0;:15:::4;::::0;:41:::4;::::0;123546:10:::4;::::0;123558:12;;123530:41:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;-1:-1:-1::0;;123611:6:0::4;::::0;:35:::4;::::0;-1:-1:-1;;;123611:35:0;;-1:-1:-1;;;;;123611:6:0;;::::4;::::0;-1:-1:-1;123611:21:0::4;::::0;-1:-1:-1;123611:35:0::4;::::0;123633:12;;123611:35:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;123499:155;123662:20;123685:31;:13:::0;123703:12;123685:17:::4;:31::i;:::-;123662:54;;123740:36;123759:12;123740:36;;;;;;;;;;;::::0;:4:::4;:14;;;:18;;:36;;;;;:::i;:::-;123723:14;::::0;::::4;:53:::0;123790::::4;::::0;123803:10:::4;::::0;123790:53:::4;::::0;::::4;::::0;123815:13;;123830:12;;123790:53:::4;:::i;:::-;;;;;;;;-1:-1:-1::0;;2674:1:0;3636:7;:22;-1:-1:-1;;123127:722:0:o;116849:941::-;129593:11;;116920:7;;;;129593:11;;129585:60;;;;-1:-1:-1;;;129585:60:0;;;;;;;:::i;:::-;116947:27:::1;116977:21;:7;116989:8:::0;116977:11:::1;:21::i;:::-;116947:51:::0;-1:-1:-1;117008:24:0::1;::::0;117061:29:::1;116947:51:::0;117084:4:::1;117061:14;:29::i;:::-;117007:83:::0;;-1:-1:-1;117007:83:0;-1:-1:-1;117103:20:0;;117099:572:::1;;117134:18;117155:56;103684:5;117155:32;117176:10;;117155:16;:20;;:32;;;;:::i;:::-;:36:::0;::::1;:56::i;:::-;117134:77:::0;-1:-1:-1;117220:25:0::1;117248:32;:16:::0;117134:77;117248:20:::1;:32::i;:::-;117220:60;;117291:38;;:::i;:::-;117332:62;117379:14;;117332:42;117356:17;117332:23;:42::i;:::-;:46:::0;::::1;:62::i;:::-;117433:31;::::0;;::::1;::::0;::::1;::::0;;;:27;:31;;;117291:103;;-1:-1:-1;117433:40:0::1;::::0;117291:103;117433:31:::1;:40::i;:::-;117403:70:::0;:27;:70;117488:14;;117484:80:::1;;117534:7;::::0;;117515:5;:39:::1;::::0;-1:-1:-1;;;;;117515:5:0;;::::1;::::0;117534:7:::1;117543:10:::0;117515:18:::1;:39::i;:::-;117578:21:::0;;117574:90:::1;;117612:42;117636:17;117612:23;:42::i;:::-;117099:572;;;;117684:49;117699:16;117717:15;117684:49;;;;;;;:::i;:::-;;;;;;;;117750:16:::0;;-1:-1:-1;117768:15:0;-1:-1:-1;;116849:941:0;;;:::o;108627:25::-;;;;;;;;;;112382:405;130075:10;;-1:-1:-1;;;;;130075:10:0;130061;:24;130053:73;;;;-1:-1:-1;;;130053:73:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;112637:24:0;::::1;112629:87;;;;-1:-1:-1::0;;;112629:87:0::1;;;;;;;:::i;:::-;112725:7;:18:::0;;-1:-1:-1;;;;;;112725:18:0::1;-1:-1:-1::0;;;;;112725:18:0;::::1;;::::0;;112757:24:::1;::::0;::::1;::::0;::::1;::::0;112725:18;;112757:24:::1;:::i;107492:29::-:0;;;;:::o;106632:32::-;;;-1:-1:-1;;;;;106632:32:0;;:::o;106772:23::-;;;-1:-1:-1;;;;;106772:23:0;;:::o;127883:175::-;-1:-1:-1;;;;;127991:15:0;;127951:7;127991:15;;;:5;:15;;;;;128020:32;127991:15;128047:4;128020:26;:32::i;106208:27::-;;;-1:-1:-1;;;;;106208:27:0;;:::o;118071:171::-;118171:7;118180;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;129593:11:::1;::::0;::::1;;129585:60;;;;-1:-1:-1::0;;;129585:60:0::1;;;;;;;:::i;:::-;118205:31:::2;118218:8;118228:7;118205:12;:31::i;107381:29::-:0;;;;:::o;18205:220::-;18263:7;18287:6;18283:20;;-1:-1:-1;18302:1:0;18295:8;;18283:20;18326:5;;;18330:1;18326;:5;:1;18350:5;;;;;:10;18342:56;;;;-1:-1:-1;;;18342:56:0;;;;;;;:::i;:::-;18416:1;-1:-1:-1;18205:220:0;;;;;:::o;101746:128::-;101818:12;101846:5;:14;;101861:6;101846:22;;;;;;;;;;;;;;;;;;101839:29;;101746:128;;;;:::o;4451:422::-;4818:20;4857:8;;;4451:422::o;92226:466::-;92300:20;92323:26;:5;92344:4;92323:20;:26::i;:::-;92300:49;;92375:5;:15;;;92360:12;:30;92356:262;;;92429:15;;;;;92401:25;92453:19;;;92501:35;:12;92429:15;92501:16;:35::i;:::-;92481:17;;;:55;-1:-1:-1;92356:262:0;;;92577:15;;;;:33;;92597:12;92577:19;:33::i;:::-;92559:15;;;:51;92356:262;-1:-1:-1;92659:27:0;;92624:62;:32;;;;:62;92226:466::o;120759:588::-;120940:12;;:32;;-1:-1:-1;;;120940:32:0;;120844:7;;;;120906:3;;120844:7;;-1:-1:-1;;;;;120940:12:0;;;;:22;;:32;;120963:8;;120940:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;120916:56;;120991:32;121017:5;120991:21;121003:8;;120991:7;:11;;:21;;;;:::i;:32::-;120979:44;-1:-1:-1;121035:17:0;;121032:283;;121067:9;121062:246;121086:1;121082;:5;121062:246;;;121125:26;121143:7;121126:8;121135:1;121126:11;;;;;;;;;;;;;;;;121125:17;;:26;;;;:::i;:::-;121108:13;:43;121105:194;;121177:32;121203:5;121177:21;121189:8;;121177:7;:11;;:21;;;;:::i;:32::-;121165:44;;121234:53;121283:3;121234:44;121248:29;121260:13;121274:1;121260:16;;;;;;;;;;;;;;;;121248:7;:11;;:29;;;;:::i;:::-;121234:9;;:13;:44::i;:53::-;121222:65;;121105:194;121089:3;;121062:246;;;;121032:283;-1:-1:-1;121330:9:0;;120759:588;-1:-1:-1;;;;120759:588:0:o;132312:1067::-;132502:5;;:30;;-1:-1:-1;;;132502:30:0;;132393:7;;;;;;132484:49;;132493:7;;-1:-1:-1;;;;;132502:5:0;;:15;;:30;;132526:4;;132502:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;132484:8;:49::i;:::-;132458:75;-1:-1:-1;;;;;;132546:27:0;;132568:4;132546:27;132542:93;;132584:5;;:43;;-1:-1:-1;;;132584:43:0;;-1:-1:-1;;;;;132584:5:0;;;;:14;;:43;;132599:10;;132611:15;;132584:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;132542:93;132669:15;;132643:23;132773:28;:7;132669:15;132773:11;:28::i;:::-;132746:55;-1:-1:-1;132870:20:0;;132866:387;;132901:33;132937:14;:7;:12;:14::i;:::-;132901:50;-1:-1:-1;132961:23:0;;133013:94;132901:50;133045:10;133066:16;132961:23;133013:21;:94::i;:::-;132960:147;;-1:-1:-1;132960:147:0;-1:-1:-1;133136:36:0;:15;132960:147;133136:19;:36::i;:::-;133118:54;-1:-1:-1;133204:41:0;:20;133229:15;133204:24;:41::i;:::-;133181:64;;132866:387;;;;133278:14;;:40;;133297:20;133278:18;:40::i;:::-;133261:14;:57;-1:-1:-1;133335:15:0;;-1:-1:-1;133352:20:0;-1:-1:-1;;132312:1067:0;;;;;;:::o;17788:158::-;17846:7;17879:1;17874;:6;;17866:49;;;;-1:-1:-1;;;17866:49:0;;;;;;;:::i;:::-;-1:-1:-1;17933:5:0;;;17788:158::o;17326:179::-;17384:7;17416:5;;;17440:6;;;;17432:46;;;;-1:-1:-1;;;17432:46:0;;;;;;;:::i;20153:166::-;20239:7;20275:12;20267:6;;;;20259:29;;;;-1:-1:-1;;;20259:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;20306:5:0;;;20153:166::o;92808:146::-;92920:21;:5;92936:4;92920:15;:21::i;:::-;92943:4;92912:36;;;;;-1:-1:-1;;;92912:36:0;;;;;;;;:::i;:::-;;92808:146;;;:::o;128537:253::-;128606:5;;128620:10;;128606:32;;-1:-1:-1;;;128606:32:0;;-1:-1:-1;;;;;128606:5:0;;;;:13;;:32;;128620:10;;;128631:6;;128606:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;128661:10:0;;128649:56;;-1:-1:-1;;;128649:56:0;;-1:-1:-1;;;;;128661:10:0;;;;128649:34;;:56;;128692:4;;128698:6;;128649:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;128755:6:0;;:29;;-1:-1:-1;;;128755:29:0;;-1:-1:-1;;;;;128755:6:0;;;;-1:-1:-1;128755:21:0;;-1:-1:-1;128755:29:0;;128777:6;;128755:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;128537:253;:::o;131236:606::-;131344:13;;131311:7;;;;131344:13;;;;;;:41;;-1:-1:-1;131375:10:0;;-1:-1:-1;;;;;131375:10:0;131361;:24;131344:41;:76;;;;131401:19;:7;:17;:19::i;:::-;131389:8;:31;;131344:76;131336:210;;;;-1:-1:-1;;;131336:210:0;;;;;;;:::i;:::-;131555:27;131585:21;:7;131597:8;131585:11;:21::i;:::-;131555:51;-1:-1:-1;131614:24:0;;131667:46;131555:51;131691:4;131698:7;131614:24;131667:15;:46::i;:::-;131613:100;;;;131741:8;131727:58;131751:16;131769:15;131727:58;;;;;;;:::i;:::-;;;;;;;;131802:16;;;;-1:-1:-1;131236:606:0;-1:-1:-1;;;;131236:606:0:o;119664:255::-;119710:7;119728:33;119764:14;:7;:12;:14::i;:::-;119728:50;;119785:24;119812:25;:12;:23;:25::i;:::-;119785:52;;119851:30;119864:16;119851:30;;;;;;:::i;:::-;;;;;;;;119897:16;-1:-1:-1;;119664:255:0;:::o;102648:109::-;102730:21;;102648:109::o;93361:415::-;93455:7;;93497:26;:5;93518:4;93497:20;:26::i;:::-;93471:52;-1:-1:-1;93534:20:0;93530:65;;-1:-1:-1;;93572:15:0;;;;93565:22;;93530:65;93631:15;;;;93657:36;;;93653:67;;93711:1;93704:8;;;;;;93653:67;93735:35;;93361:415;-1:-1:-1;;;93361:415:0:o;22846:205::-;22947:96;22967:5;22997:27;;;23026:4;23032:2;23036:5;22974:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22974:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;22974:68:0;-1:-1:-1;;;;;;22974:68:0;;;;;;;;;;22947:19;:96::i;130493:403::-;-1:-1:-1;;;;;130571:41:0;;130563:109;;;;-1:-1:-1;;;130563:109:0;;;;;;;:::i;:::-;130707:5;;130687:16;;;-1:-1:-1;;;130687:16:0;;;;-1:-1:-1;;;;;130707:5:0;;;;130687:14;;;;;:16;;;;;;;;;;;;;;:14;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;130687:25:0;;130679:73;;;;-1:-1:-1;;;130679:73:0;;;;;;;:::i;:::-;130774;;;;;;;;;-1:-1:-1;;;;;130774:73:0;;;;-1:-1:-1;130774:73:0;;;;130761:87;;:7;;:12;:87::i;:::-;130862:28;;-1:-1:-1;;;;;130862:28:0;;;;;;;;130493:403;:::o;101057:329::-;101132:7;101141;101183:5;:20;;;101161:18;:5;:16;:18::i;:::-;:42;101157:78;;-1:-1:-1;101222:1:0;;-1:-1:-1;101222:1:0;101214:13;;101157:78;101241:23;101267:44;101290:5;:20;;;101267:18;:5;:16;:18::i;:::-;:22;;:44::i;:::-;101241:70;-1:-1:-1;101325:55:0;:5;101346:10;101241:70;101375:4;101325:20;:55::i;:::-;101318:62;;;;;101057:329;;;;;:::o;18903:153::-;18961:7;18993:1;18989;:5;18981:44;;;;-1:-1:-1;;;18981:44:0;;;;;;;:::i;:::-;19047:1;19043;:5;;;;;;;18903:153;-1:-1:-1;;;18903:153:0:o;25980:188::-;26036:15;;:::i;:::-;26060:9;26084:10;;;:52;;-1:-1:-1;;25917:12:0;26103:14;;;;26098:29;;:38;;26084:52;26076:61;;;;;;26151:11;;;;;;;;;;;;;25980:188;-1:-1:-1;;25980:188:0:o;27178:160::-;27251:15;;:::i;:::-;27283:10;27275:19;;;;;;27308:24;;;;;;;;27326:5;27317:4;:6;;;:14;;;;;;27308:24;;27301:31;27178:160;-1:-1:-1;;;27178:160:0:o;26285:193::-;26366:15;;:::i;:::-;26440:6;;26428:7;;26419:16;;;26414:32;;;26406:41;;;;;;26461:11;;;;;;;;;;;;;26285:193;-1:-1:-1;;;26285:193:0:o;22661:177::-;22744:86;22764:5;22794:23;;;22819:2;22823:5;22771:58;;;;;;;;;:::i;93782:441::-;93878:7;;93920:26;:5;93941:4;93920:20;:26::i;:::-;93894:52;-1:-1:-1;93957:20:0;93953:67;;-1:-1:-1;;93995:17:0;;;;93988:24;;93953:67;94056:15;;;;94082:36;;;94078:67;;94136:1;94129:8;;;;;;94078:67;94160:17;;;;94181:35;;94160:57;;-1:-1:-1;93782:441:0;;;;:::o;94456:547::-;94545:7;94561:61;;:::i;:::-;-1:-1:-1;94561:91:0;;;;;;;;;94625:27;;;94561:91;;;94659:58;;:::i;:::-;-1:-1:-1;94659:93:0;;;;;;;;;94720:32;;;94659:93;;;94765:63;:30;94659:93;94765:34;:63::i;:::-;94761:99;;94851:1;94844:8;;;;;;94761:99;94959:20;;94875:122;;:105;;:71;:30;94918:27;94875:42;:71::i;:::-;:83;;:105::i;:::-;:120;:122::i;:::-;94868:129;94456:547;-1:-1:-1;;;;;94456:547:0:o;537:106::-;595:7;626:1;622;:5;:13;;634:1;622:13;;;-1:-1:-1;630:1:0;;615:20;-1:-1:-1;537:106:0:o;102057:124::-;102114:12;102142:5;102157:17;102142:5;102157:15;:17::i;:::-;102142:33;;;;;;;;;;;;;;;;;;102135:40;;102057:124;;;:::o;99372:368::-;99482:7;;;;99561:53;:5;99582:10;99594:7;99603:10;99561:20;:53::i;:::-;99644:20;;;;99507:107;;-1:-1:-1;99507:107:0;-1:-1:-1;99644:41:0;;99507:107;99644:24;:41::i;:::-;99621:20;;;:64;99700:16;;-1:-1:-1;99718:15:0;-1:-1:-1;99372:368:0;;;;;;;:::o;93170:185::-;93254:4;;93274:70;93306:37;:5;93338:4;93306:31;:37::i;:::-;93274:31;;;;;;;;;;;;;;;:70::i;:::-;:75;;;93170:185;-1:-1:-1;;;93170:185:0:o;102378:165::-;102440:7;102456:15;102474:14;:5;:12;:14::i;:::-;102456:32;;102502:35;102514:1;102502:35;;;;;;;;;;;;;-1:-1:-1;;;102502:35:0;;;:7;:11;;:35;;;;;:::i;99006:177::-;99064:7;99080:21;99104:13;:5;:11;:13::i;:::-;99080:37;;99131:46;99145:6;-1:-1:-1;;;;;99145:16:0;;99170:4;99145:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;99131:5;;:13;:46::i;24966:761::-;25390:23;25416:69;25444:4;25416:69;;;;;;;;;;;;;;;;;25424:5;-1:-1:-1;;;;;25416:27:0;;;:69;;;;;:::i;:::-;25500:17;;25390:95;;-1:-1:-1;25500:21:0;25496:224;;25642:10;25631:30;;;;;;;;;;;;:::i;:::-;25623:85;;;;-1:-1:-1;;;25623:85:0;;;;;;;:::i;101482:107::-;101554:29;;;;;;;;-1:-1:-1;101554:29:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;101554:29:0;-1:-1:-1;;;;;101554:29:0;;;;;;;;;;;;;;;;;101482:107::o;98061:118::-;98147:13;;:26;;;-1:-1:-1;;;98147:26:0;;;;98124:7;;-1:-1:-1;;;;;98147:13:0;;:24;;:26;;;;;;;;;;;;;;:13;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;99938:680::-;100054:7;100063;100079:21;100103:13;:5;:11;:13::i;:::-;100079:37;;100125:24;100152:6;-1:-1:-1;;;;;100152:16:0;;100169:10;100152:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;100125:55;;100187:27;100217:18;:5;:16;:18::i;:::-;100244:13;;:55;;-1:-1:-1;;;100244:55:0;;100187:48;;-1:-1:-1;;;;;;100244:13:0;;:22;;:55;;100267:10;;100279:7;;100288:10;;100244:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;100333:28:0;;-1:-1:-1;;;100333:28:0;;100308:22;;-1:-1:-1;;;;;;100333:16:0;;;-1:-1:-1;100333:16:0;;:28;;100350:10;;100333:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;100308:53;-1:-1:-1;100368:24:0;100395:36;100308:53;100414:16;100395:18;:36::i;:::-;100368:63;;100440:25;100468:18;:5;:16;:18::i;:::-;100440:46;-1:-1:-1;100493:23:0;100519:42;:19;100440:46;100519:23;:42::i;:::-;100578:16;;;;-1:-1:-1;99938:680:0;;-1:-1:-1;;;;;;;;;;;99938:680:0:o;27344:221::-;27453:7;;27444:6;;27425;;-1:-1:-1;27440:48:0;;;-1:-1:-1;;;27471:9:0;;27440:48;27509:7;;27500:6;;:16;27496:47;;;-1:-1:-1;27534:1:0;27527:8;;27496:47;-1:-1:-1;27558:1:0;27344:221;;;;:::o;26626:193::-;26707:15;;:::i;:::-;26781:6;;26769:7;;26760:16;;;26755:32;;;26747:41;;;;;26967:205;27040:15;;:::i;:::-;27064:9;27088:10;;;:52;;-1:-1:-1;;27134:6:0;;27107:14;;;;27125:5;27107:14;27125:5;27102:28;;;;;:38;27088:52;27080:61;;;;;27571:105;27655:6;25917:12;27655:15;;;27571:105::o;95495:365::-;95605:30;;:::i;:::-;95647:18;95668:31;:5;95694:4;95668:25;:31::i;:::-;95647:52;-1:-1:-1;95710:15:0;95706:74;;95743:29;:27;:29::i;:::-;95736:36;;;;;95706:74;95793:61;95843:10;95793:45;95817:5;:20;;;95793:23;:45::i;:61::-;95786:68;95495:365;-1:-1:-1;;;;95495:365:0:o;98278:131::-;98381:13;;:21;;;-1:-1:-1;;;98381:21:0;;;;98336:14;;-1:-1:-1;;;;;98381:13:0;;:19;;:21;;;;;;;;;;;;;;:13;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;98535:389::-;98607:7;98697:21;98721:13;:5;:11;:13::i;:::-;98771;;98697:37;;-1:-1:-1;98743:52:0;;-1:-1:-1;;;;;98743:19:0;;;;98771:13;98787:7;98743:19;:52::i;:::-;98802:13;;:30;;-1:-1:-1;;;98802:30:0;;-1:-1:-1;;;;;98802:13:0;;;;:21;;:30;;98824:7;;98802:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;98862:20:0;;;;:33;;-1:-1:-1;98887:7:0;98862:24;:33::i;:::-;98839:20;;;:56;-1:-1:-1;98911:7:0;;-1:-1:-1;98535:389:0;;;;:::o;7369:195::-;7472:12;7504:52;7526:6;7534:4;7540:1;7543:12;7504:21;:52::i;26174:105::-;26221:15;;:::i;:::-;-1:-1:-1;26252:21:0;;;;;;;;;-1:-1:-1;;26252:21:0;;26174:105;:::o;8421:530::-;8548:12;8606:5;8581:21;:30;;8573:81;;;;-1:-1:-1;;;8573:81:0;;;;;;;:::i;:::-;8673:18;8684:6;8673:10;:18::i;:::-;8665:60;;;;-1:-1:-1;;;8665:60:0;;;;;;;:::i;:::-;8799:12;8813:23;8840:6;-1:-1:-1;;;;;8840:11:0;8860:5;8868:4;8840:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8798:75;;;;8891:52;8909:7;8918:10;8930:12;8891:17;:52::i;:::-;8884:59;8421:530;-1:-1:-1;;;;;;;8421:530:0:o;10961:742::-;11076:12;11105:7;11101:595;;;-1:-1:-1;11136:10:0;11129:17;;11101:595;11250:17;;:21;11246:439;;11513:10;11507:17;11574:15;11561:10;11557:2;11553:19;11546:44;11461:148;11656:12;11649:20;;-1:-1:-1;;;11649:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;1575:241;;1679:2;1667:9;1658:7;1654:23;1650:32;1647:2;;;-1:-1;;1685:12;1647:2;85:6;72:20;97:33;124:5;97:33;:::i;1823:366::-;;;1944:2;1932:9;1923:7;1919:23;1915:32;1912:2;;;-1:-1;;1950:12;1912:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2002:63;2102:2;2141:22;;;;1364:20;;-1:-1;;;1906:283::o;2196:397::-;;;2335:2;2323:9;2314:7;2310:23;2306:32;2303:2;;;-1:-1;;2341:12;2303:2;2399:17;2386:31;2437:18;;2429:6;2426:30;2423:2;;;-1:-1;;2459:12;2423:2;2560:6;2549:9;2545:22;;;290:3;283:4;275:6;271:17;267:27;257:2;;-1:-1;;298:12;257:2;341:6;328:20;2437:18;360:6;357:30;354:2;;;-1:-1;;390:12;354:2;485:3;2335:2;;469:6;465:17;426:6;451:32;;448:41;445:2;;;-1:-1;;492:12;445:2;2335;422:17;;;;;2479:98;;-1:-1;2297:296;;-1:-1;;;;2297:296::o;2600:235::-;;2701:2;2689:9;2680:7;2676:23;2672:32;2669:2;;;-1:-1;;2707:12;2669:2;597:6;584:20;609:30;633:5;609:30;:::i;2842:257::-;;2954:2;2942:9;2933:7;2929:23;2925:32;2922:2;;;-1:-1;;2960:12;2922:2;732:6;726:13;744:30;768:5;744:30;:::i;3106:309::-;;3244:2;3232:9;3223:7;3219:23;3215:32;3212:2;;;-1:-1;;3250:12;3212:2;893:6;887:13;905:56;955:5;905:56;:::i;3718:261::-;;3832:2;3820:9;3811:7;3807:23;3803:32;3800:2;;;-1:-1;;3838:12;3800:2;-1:-1;1235:13;;3794:185;-1:-1;3794:185::o;3986:241::-;;4090:2;4078:9;4069:7;4065:23;4061:32;4058:2;;;-1:-1;;4096:12;4058:2;-1:-1;1364:20;;4052:175;-1:-1;4052:175::o;4504:366::-;;;4625:2;4613:9;4604:7;4600:23;4596:32;4593:2;;;-1:-1;;4631:12;4593:2;-1:-1;;1364:20;;;4783:2;4822:22;;;1364:20;;-1:-1;4587:283::o;18457:271::-;;5417:5;36041:12;5528:52;5573:6;5568:3;5561:4;5554:5;5550:16;5528:52;:::i;:::-;5592:16;;;;;18591:137;-1:-1;;18591:137::o;18735:222::-;-1:-1;;;;;37109:54;;;;5097:37;;18862:2;18847:18;;18833:124::o;18964:349::-;-1:-1;;;;;37109:54;;;;4956:58;;19299:2;19284:18;;18288:37;19127:2;19112:18;;19098:215::o;19320:444::-;-1:-1;;;;;37109:54;;;5097:37;;37109:54;;;;19667:2;19652:18;;5097:37;19750:2;19735:18;;18288:37;;;;19503:2;19488:18;;19474:290::o;20111:432::-;-1:-1;;;;;37109:54;;;;5097:37;;20452:2;20437:18;;18288:37;;;;36700:13;36693:21;20529:2;20514:18;;5211:34;20288:2;20273:18;;20259:284::o;20550:210::-;36700:13;;36693:21;5211:34;;20671:2;20656:18;;20642:118::o;21594:310::-;;21741:2;21762:17;21755:47;6304:5;36041:12;36480:6;21741:2;21730:9;21726:18;36468:19;6398:52;6443:6;36508:14;21730:9;36508:14;21741:2;6424:5;6420:16;6398:52;:::i;:::-;38933:7;38917:14;-1:-1;;38913:28;6462:39;;;;36508:14;6462:39;;21712:192;-1:-1;;21712:192::o;21911:416::-;22111:2;22125:47;;;6738:2;22096:18;;;36468:19;6774:34;36508:14;;;6754:55;6843:28;6829:12;;;6822:50;6891:12;;;22082:245::o;22334:416::-;22534:2;22548:47;;;7142:3;22519:18;;;36468:19;7179:34;36508:14;;;7159:55;7248:34;7234:12;;;7227:56;7317:34;7303:12;;;7296:56;7386:27;7372:12;;;7365:49;7433:13;;;22505:245::o;22757:416::-;22957:2;22971:47;;;7685:2;22942:18;;;36468:19;7721:34;36508:14;;;7701:55;7790:28;7776:12;;;7769:50;7838:12;;;22928:245::o;23180:416::-;23380:2;23394:47;;;8089:2;23365:18;;;36468:19;8125:34;36508:14;;;8105:55;-1:-1;;;8180:12;;;8173:41;8233:12;;;23351:245::o;23603:416::-;23803:2;23817:47;;;8484:2;23788:18;;;36468:19;8520:34;36508:14;;;8500:55;-1:-1;;;8575:12;;;8568:43;8630:12;;;23774:245::o;24026:416::-;24226:2;24240:47;;;8881:2;24211:18;;;36468:19;8917:29;36508:14;;;8897:50;8966:12;;;24197:245::o;24449:416::-;24649:2;24663:47;;;24634:18;;;36468:19;9253:34;36508:14;;;9233:55;9307:12;;;24620:245::o;24872:416::-;25072:2;25086:47;;;9558:2;25057:18;;;36468:19;9594:34;36508:14;;;9574:55;-1:-1;;;9649:12;;;9642:45;9706:12;;;25043:245::o;25295:416::-;25495:2;25509:47;;;9957:2;25480:18;;;36468:19;9993:32;36508:14;;;9973:53;10045:12;;;25466:245::o;25718:416::-;25918:2;25932:47;;;10296:2;25903:18;;;36468:19;10332:34;36508:14;;;10312:55;-1:-1;;;10387:12;;;10380:30;10429:12;;;25889:245::o;26141:416::-;26341:2;26355:47;;;10680:2;26326:18;;;36468:19;10716:34;36508:14;;;10696:55;10785:25;10771:12;;;10764:47;10830:12;;;26312:245::o;26564:416::-;26764:2;26778:47;;;11081:2;26749:18;;;36468:19;11117:28;36508:14;;;11097:49;11165:12;;;26735:245::o;26987:416::-;27187:2;27201:47;;;11416:2;27172:18;;;36468:19;11452:34;36508:14;;;11432:55;11521:33;11507:12;;;11500:55;11574:12;;;27158:245::o;27410:416::-;27610:2;27624:47;;;11825:2;27595:18;;;36468:19;11861:34;36508:14;;;11841:55;-1:-1;;;11916:12;;;11909:36;11964:12;;;27581:245::o;27833:416::-;28033:2;28047:47;;;12215:2;28018:18;;;36468:19;12251:34;36508:14;;;12231:55;-1:-1;;;12306:12;;;12299:27;12345:12;;;28004:245::o;28256:416::-;28456:2;28470:47;;;12596:2;28441:18;;;36468:19;12632:34;36508:14;;;12612:55;-1:-1;;;12687:12;;;12680:25;12724:12;;;28427:245::o;28679:416::-;28879:2;28893:47;;;12975:2;28864:18;;;36468:19;13011:34;36508:14;;;12991:55;-1:-1;;;13066:12;;;13059:28;13106:12;;;28850:245::o;29102:416::-;29302:2;29316:47;;;13357:2;29287:18;;;36468:19;13393:33;36508:14;;;13373:54;13446:12;;;29273:245::o;29525:416::-;29725:2;29739:47;;;13697:2;29710:18;;;36468:19;13733:34;36508:14;;;13713:55;-1:-1;;;13788:12;;;13781:31;13831:12;;;29696:245::o;29948:416::-;30148:2;30162:47;;;14082:2;30133:18;;;36468:19;14118:34;36508:14;;;14098:55;-1:-1;;;14173:12;;;14166:38;14223:12;;;30119:245::o;30371:416::-;30571:2;30585:47;;;30371:416;30556:18;;;36468:19;36508:14;;;30542:245::o;30794:416::-;30994:2;31008:47;;;14745:2;30979:18;;;36468:19;14781:25;36508:14;;;14761:46;14826:12;;;30965:245::o;31217:416::-;31417:2;31431:47;;;15077:2;31402:18;;;36468:19;15113:34;36508:14;;;15093:55;-1:-1;;;15168:12;;;15161:42;15222:12;;;31388:245::o;31640:416::-;31840:2;31854:47;;;15473:2;31825:18;;;36468:19;15509:31;36508:14;;;15489:52;15560:12;;;31811:245::o;32063:416::-;32263:2;32277:47;;;15811:2;32248:18;;;36468:19;15847:34;36508:14;;;15827:55;-1:-1;;;15902:12;;;15895:45;15959:12;;;32234:245::o;32486:416::-;32686:2;32700:47;;;16210:2;32671:18;;;36468:19;16246:34;36508:14;;;16226:55;-1:-1;;;16301:12;;;16294:28;16341:12;;;32657:245::o;32909:416::-;33109:2;33123:47;;;16592:2;33094:18;;;36468:19;16628:34;36508:14;;;16608:55;16697:30;16683:12;;;16676:52;16747:12;;;33080:245::o;33332:416::-;33532:2;33546:47;;;16998:2;33517:18;;;36468:19;17034:34;36508:14;;;17014:55;-1:-1;;;17089:12;;;17082:34;17135:12;;;33503:245::o;33755:416::-;33955:2;33969:47;;;17386:2;33940:18;;;36468:19;17422:33;36508:14;;;17402:54;17475:12;;;33926:245::o;34178:416::-;34378:2;34392:47;;;17726:2;34363:18;;;36468:19;-1:-1;;;36508:14;;;17742:41;17802:12;;;34349:245::o;34601:326::-;18107:23;;18288:37;;34780:2;34765:18;;34751:176::o;34934:222::-;18288:37;;;35061:2;35046:18;;35032:124::o;35163:333::-;18288:37;;;35482:2;35467:18;;18288:37;35318:2;35303:18;;35289:207::o;35503:444::-;18288:37;;;35850:2;35835:18;;18288:37;;;;35933:2;35918:18;;18288:37;35686:2;35671:18;;35657:290::o;38573:268::-;38638:1;38645:101;38659:6;38656:1;38653:13;38645:101;;;38726:11;;;38720:18;38707:11;;;38700:39;38681:2;38674:10;38645:101;;;38761:6;38758:1;38755:13;38752:2;;;-1:-1;;38638:1;38808:16;;38801:27;38622:219::o;38954:117::-;-1:-1;;;;;37109:54;;39013:35;;39003:2;;39062:1;;39052:12;39078:111;39159:5;36700:13;36693:21;39137:5;39134:32;39124:2;;39180:1;;39170:12
Swarm Source
ipfs://2c696dca15596e3abd18da69a0f4eb148bf866bd99df8225d6f4e36b75e04f81
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $13.45 | 15.134 | $203.55 |
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.