Polygon Sponsored slots available. Book your slot here!
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x9753b4bc9463f6ef489e074f259910c7aa4258e2e57a37157ac55e49616ef277 | 15704593 | 647 days 12 hrs ago | 0x3631b6bbf1e51d18dabd1d0e1b1589668ddf250b | Contract Creation | 0 MATIC |
[ Download CSV Export ]
Contract Name:
VaultIronLP
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-14 */ // Sources flattened with hardhat v2.3.0 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/proxy/utils/[email protected] // solhint-disable-next-line compiler-version pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^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/utils/[email protected] pragma solidity ^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/utils/[email protected] pragma solidity ^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 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _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 @openzeppelin/contracts/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File contracts/interfaces/IUniswapV2Pair.sol pragma solidity 0.8.4; interface IUniswapV2Pair { function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); } // File contracts/interfaces/IRouter.sol pragma solidity 0.8.4; interface IRouter { struct RouteInfo { address router; address[] path; } function getSwapRoute(address _fromToken, address _toToken) external view returns (address _router, address[] memory _path); } // File @openzeppelin/contracts/security/[email protected] pragma solidity ^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() { _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 contracts/interfaces/IVault.sol pragma solidity 0.8.4; interface IVault { function owner() external view returns (address); function wantAddress() external view returns (address); function balanceInFarm() external view returns (uint256); function pending() external view returns (uint256); function abandoned() external view returns (bool); function initialize(address _owner, uint256 _vaultTemplateId) external; function compound() external; function abandon() external; function claimRewards() external; function deposit(uint256 _wantAmt) external returns (uint256); function withdraw(uint256 _wantAmt) external returns (uint256); function withdrawAll() external returns (uint256); function updateSlippage(uint256 _slippage) external; function rescueFund(address _token, uint256 _amount) external; function canAbandon() external returns (bool); function info() external view returns ( uint256 _templateId, uint256 _balanceInFarm, uint256 _pendingRewards, bool _abandoned, bool _canDeposit, bool _canAbandon ); } // File contracts/interfaces/IVaultPolicy.sol pragma solidity 0.8.4; interface IVaultPolicy { function canDeposit(address _strategy, address _owner) external view returns (bool); } // File contracts/interfaces/IVaultFactory.sol pragma solidity 0.8.4; interface IVaultFactory { function policy() external view returns (address); function router() external view returns (address); } // File contracts/interfaces/IUniswapV2Router.sol pragma solidity 0.8.4; interface IUniswapV2Router { function factory() external pure returns (address); function WBNB() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityBNB( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountBNBMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountBNB, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityBNB( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountBNBMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountBNB); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityBNBWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountBNBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountBNB); function removeLiquidityBNBSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountBNBMin, address to, uint256 deadline ) external returns (uint256 amountBNB); function removeLiquidityBNBWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountBNBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountBNB); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactBNBForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForBNBSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactBNBForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactBNB( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForBNB( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapBNBForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // File contracts/interfaces/IWETH.sol pragma solidity 0.8.4; interface IWETH is IERC20 { function deposit() external payable; function withdraw(uint256 wad) external; } // File contracts/vaults/VaultBase.sol pragma solidity 0.8.4; abstract contract VaultBase is IVault, ReentrancyGuard { using SafeERC20 for IERC20; struct RouteInfo { address router; address[] path; } uint256 internal constant RATIO_PRECISION = 1000000; // 6 decimals address internal constant weth = 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270; // matic // =========== state variables ================================ bool public initialized; IVaultFactory public factory; address public override owner; // the only address can deposit, withdraw address public harvestor; // this address can call earn method uint256 public lastEarnBlock; address public override wantAddress; bool public override abandoned; uint256 public slippage = 50000; // 0.5% uint256 public templateId; // =========== events ================================ event Earned(address indexed _earnedToken, uint256 _amount); event Deposited(uint256 _amount); event Withdraw(uint256 _amount); event Exit(uint256 _lpAmount); // =========== constructor =========================== constructor() { factory = IVaultFactory(msg.sender); } function initialize(address _owner, uint256 _vaultTemplateId) external virtual override { require(!initialized, "already init"); require(msg.sender == address(factory), "!factory"); harvestor = _owner; owner = _owner; templateId = _vaultTemplateId; _syncSwapRoutes(); initialized = true; } // =========== views =============================== function canAbandon() public view virtual override returns (bool); function info() external view virtual override returns ( uint256 _templateId, uint256 _balanceInFarm, uint256 _pendingRewards, bool _abandoned, bool _canDeposit, bool _canAbandon ); function getPolicy() public view virtual returns (IVaultPolicy) { address _policy = factory.policy(); return IVaultPolicy(_policy); } function getRouter() public view virtual returns (IRouter) { address _router = factory.router(); return IRouter(_router); } // =========== modifiers =========================== modifier onlyOwner() { require(msg.sender == owner, "!owner"); _; } modifier onlyHarvestor() { require(msg.sender == harvestor || msg.sender == owner, "!owner && !harvestor"); _; } modifier canHarvest() { require(initialized, "!init"); _; } modifier canDeposit() { require(initialized, "!init"); IVaultPolicy policy = getPolicy(); require(policy.canDeposit(address(this), owner), "!canDeposit"); _; } // =========== restricted functions ================= function updateSlippage(uint256 _slippage) public virtual override onlyOwner { slippage = _slippage; } function setHarvestor(address _harvestor) external onlyOwner { require(_harvestor != address(0x0), "cannot address set to zero"); harvestor = _harvestor; } function abandon() external virtual override; function claimRewards() external virtual override; // =========== internal functions ================== function _safeSwap( address _swapRouterAddress, uint256 _amountIn, uint256 _slippage, address[] memory _path, address _to, uint256 _deadline ) internal { IUniswapV2Router _swapRouter = IUniswapV2Router(_swapRouterAddress); require(_path.length > 0, "invalidSwapPath"); uint256[] memory amounts = _swapRouter.getAmountsOut(_amountIn, _path); uint256 _minAmountOut = (amounts[amounts.length - 1] * (RATIO_PRECISION - _slippage)) / RATIO_PRECISION; _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(_amountIn, _minAmountOut, _path, _to, _deadline); } function _unwrapETH() internal { // WETH -> ETH uint256 wethBalance = IERC20(weth).balanceOf(address(this)); if (wethBalance > 0) { IWETH(weth).withdraw(wethBalance); } } function _wrapETH() internal { // ETH -> WETH uint256 ethBalance = address(this).balance; if (ethBalance > 0) { IWETH(weth).deposit{value: ethBalance}(); } } function _isWETH(address _token) internal pure returns (bool) { return _token == weth; } function _syncSwapRoutes() internal virtual; // =========== emergency functions ================= function rescueFund(address _token, uint256 _amount) public virtual override onlyOwner { IERC20(_token).safeTransfer(owner, _amount); } function executeTransaction( address target, uint256 value, string memory signature, bytes memory data ) public onlyOwner returns (bytes memory) { bytes memory callData; if (bytes(signature).length == 0) { callData = data; } else { callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data); } // solium-disable-next-line security/no-call-value (bool success, bytes memory returnData) = target.call{value: value}(callData); require(success, string("DevFund::executeTransaction: Transaction execution reverted.")); return returnData; } receive() external payable {} } // File contracts/vaults/VaultIronLP/IMasterChefIron.sol pragma solidity 0.8.4; interface IMasterChefIron { function poolInfo(uint256 poolId) external view returns ( address lpToken, uint256 allocPoint, uint256 lastRewardBlock, uint256 accRewardPerShare ); function userInfo(uint256 poolId, address user) external view returns (uint256 amount, uint256 debt); function pendingReward(uint256 _pid, address _user) external view returns (uint256); function deposit(uint256 poolId, uint256 amount) external; function withdraw(uint256 poolId, uint256 amount) external; function rewardToken() external view returns (address); function add( uint256 _allocPoint, address _lpToken, bool _withUpdate ) external; } // File contracts/vaults/VaultIronLP/VaultIronLP.sol pragma solidity 0.8.4; contract VaultIronLP is VaultBase { using SafeERC20 for IERC20; IMasterChefIron public masterChef; address public token0; address public token1; address public rewardToken; uint256 public poolId; address public liquidityRouter; mapping(address => mapping(address => RouteInfo)) public routes; uint256 public swapTimeout; // hardcoded when deploy constructor( address _liquidityRouter, IMasterChefIron _masterChef, uint256 _poolId ) VaultBase() { liquidityRouter = _liquidityRouter; poolId = _poolId; masterChef = _masterChef; (wantAddress, , , ) = _masterChef.poolInfo(poolId); rewardToken = _masterChef.rewardToken(); token0 = IUniswapV2Pair(wantAddress).token0(); token1 = IUniswapV2Pair(wantAddress).token1(); _syncSwapRoutes(); } // ========== views ================= function balanceInFarm() public view override returns (uint256) { (uint256 _amount, ) = masterChef.userInfo(poolId, address(this)); return _amount; } function pending() public view override returns (uint256) { return masterChef.pendingReward(poolId, address(this)); } function canAbandon() public view override returns (bool) { bool _noRewardTokenLeft = IERC20(rewardToken).balanceOf(address(this)) == 0; bool _noLpTokenLeft = IERC20(wantAddress).balanceOf(address(this)) == 0; bool _noPending = pending() == 0; return _noRewardTokenLeft && _noLpTokenLeft && _noPending; } function info() external view virtual override returns ( uint256 _templateId, uint256 _balanceInFarm, uint256 _pendingRewards, bool _abandoned, bool _canDeposit, bool _canAbandon ) { IVaultPolicy policy = getPolicy(); _templateId = templateId; _balanceInFarm = balanceInFarm(); _pendingRewards = pending(); _canDeposit = policy.canDeposit(address(this), owner); _canAbandon = canAbandon(); _abandoned = abandoned; } // ========== vault core functions =========== function compound() external override onlyHarvestor { // Harvest farm tokens uint256 _initBalance = balanceInFarm(); _widthdrawFromFarm(0); if (_isWETH(rewardToken)) { _wrapETH(); } // Converts farm tokens into want tokens uint256 earnedAmt = IERC20(rewardToken).balanceOf(address(this)); if (rewardToken != token0) { _swap(rewardToken, token0, earnedAmt / 2); } if (rewardToken != token1) { _swap(rewardToken, token1, earnedAmt / 2); } IERC20 _token0 = IERC20(token0); IERC20 _token1 = IERC20(token1); // Get want tokens, ie. add liquidity uint256 token0Amt = _token0.balanceOf(address(this)); uint256 token1Amt = _token1.balanceOf(address(this)); if (token0Amt > 0 && token1Amt > 0) { _token0.safeIncreaseAllowance(liquidityRouter, token0Amt); _token1.safeIncreaseAllowance(liquidityRouter, token1Amt); IUniswapV2Router(liquidityRouter).addLiquidity( token0, token1, token0Amt, token1Amt, 0, 0, address(this), block.timestamp + swapTimeout ); } lastEarnBlock = block.number; _depositToFarm(); _cleanUp(); uint256 _afterBalance = balanceInFarm(); if (_afterBalance > _initBalance) { emit Earned(wantAddress, _afterBalance - _initBalance); } else { emit Earned(wantAddress, 0); } } function deposit(uint256 _wantAmt) public override onlyOwner nonReentrant returns (uint256) { IERC20(wantAddress).safeTransferFrom(address(msg.sender), address(this), _wantAmt); _depositToFarm(); return _wantAmt; } function withdrawAll() external override onlyOwner returns (uint256 _withdrawBalance) { uint256 _balance = balanceInFarm(); _withdrawBalance = withdraw(_balance); _cleanUp(); _withdrawFromVault(); emit Exit(_withdrawBalance); } function withdraw(uint256 _wantAmt) public override onlyOwner nonReentrant returns (uint256) { require(_wantAmt > 0, "_wantAmt <= 0"); _widthdrawFromFarm(_wantAmt); uint256 _balance = IERC20(rewardToken).balanceOf(address(this)); _withdrawFromVault(); return _balance; } function claimRewards() external override onlyOwner { _widthdrawFromFarm(0); uint256 _balance = IERC20(rewardToken).balanceOf(address(this)); if (_balance > 0) { IERC20(rewardToken).safeTransfer(msg.sender, _balance); } } function abandon() external override onlyOwner { require(canAbandon(), "Vault cannot be abandoned"); abandoned = true; } function syncSwapRoutes() external onlyOwner { _syncSwapRoutes(); } // ============= internal functions ================ function _syncSwapRoutes() internal override { _addRouteInfo(rewardToken, token0); _addRouteInfo(rewardToken, token1); _addRouteInfo(token0, rewardToken); _addRouteInfo(token1, rewardToken); } function _addRouteInfo(address _from, address _to) internal { if (_from != _to) { IRouter router = getRouter(); (address _router, address[] memory _path) = router.getSwapRoute(_from, _to); require(_from != address(0), "Src token is invalid"); require(_to != address(0), "Dst token is invalid"); require(_router != address(0), "Router is invalid"); require(_path[0] == _from, "Route must start with src token"); require(_path[_path.length - 1] == _to, "Route must end with dst token"); routes[_from][_to] = RouteInfo(_router, _path); } } function _getSwapRoute(address _fromToken, address _toToken) internal view returns (address _router, address[] memory _path) { RouteInfo storage _info = routes[_fromToken][_toToken]; _router = _info.router; _path = _info.path; } function _withdrawFromVault() internal { uint256 _dustRewardBal = IERC20(rewardToken).balanceOf(address(this)); if (_dustRewardBal > 0) { IERC20(rewardToken).safeTransfer(msg.sender, _dustRewardBal); } uint256 _wantBalance = IERC20(wantAddress).balanceOf(address(this)); if (_wantBalance > 0) { IERC20(wantAddress).safeTransfer(msg.sender, _wantBalance); } } function _cleanUp() internal { // Converts dust tokens into earned tokens, which will be reinvested on the next earn(). // Converts token0 dust (if any) to earned tokens uint256 token0Amt = IERC20(token0).balanceOf(address(this)); if (token0 != rewardToken && token0Amt > 0) { _swap(token0, rewardToken, token0Amt); } // Converts token1 dust (if any) to earned tokens uint256 token1Amt = IERC20(token1).balanceOf(address(this)); if (token1 != rewardToken && token1Amt > 0) { _swap(token1, rewardToken, token1Amt); } } function _depositToFarm() internal canDeposit { IERC20 wantToken = IERC20(wantAddress); uint256 wantAmt = wantToken.balanceOf(address(this)); wantToken.safeIncreaseAllowance(address(masterChef), wantAmt); masterChef.deposit(poolId, wantAmt); emit Deposited(wantAmt); } function _widthdrawFromFarm(uint256 _wantAmt) internal { masterChef.withdraw(poolId, _wantAmt); emit Withdraw(_wantAmt); } function _swap( address _inputToken, address _outputToken, uint256 _inputAmount ) internal { if (_inputAmount == 0) { return; } (address _router, address[] memory _path) = _getSwapRoute(_inputToken, _outputToken); require(_router != address(0), "invalid route"); require(_path[0] == _inputToken, "Route must start with src token"); require(_path[_path.length - 1] == _outputToken, "Route must end with dst token"); IERC20(_inputToken).safeApprove(_router, 0); IERC20(_inputToken).safeApprove(_router, _inputAmount); _safeSwap(_router, _inputAmount, slippage, _path, address(this), block.timestamp + swapTimeout); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_liquidityRouter","type":"address"},{"internalType":"contract IMasterChefIron","name":"_masterChef","type":"address"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_earnedToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Earned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_lpAmount","type":"uint256"}],"name":"Exit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"abandon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"abandoned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceInFarm","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canAbandon","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wantAmt","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IVaultFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPolicy","outputs":[{"internalType":"contract IVaultPolicy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRouter","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"info","outputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"},{"internalType":"uint256","name":"_balanceInFarm","type":"uint256"},{"internalType":"uint256","name":"_pendingRewards","type":"uint256"},{"internalType":"bool","name":"_abandoned","type":"bool"},{"internalType":"bool","name":"_canDeposit","type":"bool"},{"internalType":"bool","name":"_canAbandon","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_vaultTemplateId","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastEarnBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterChef","outputs":[{"internalType":"contract IMasterChefIron","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"routes","outputs":[{"internalType":"address","name":"router","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_harvestor","type":"address"}],"name":"setHarvestor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTimeout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"syncSwapRoutes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"templateId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slippage","type":"uint256"}],"name":"updateSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wantAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wantAmt","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[{"internalType":"uint256","name":"_withdrawBalance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405261c3506006553480156200001757600080fd5b5060405162003976380380620039768339810160408190526200003a91620008f5565b6001600081905580546101003302610100600160a81b0319909116179055600d80546001600160a01b038581166001600160a01b031992831617909255600c839055600880549285169290911682179055604051631526fe2760e01b815260048101839052631526fe279060240160806040518083038186803b158015620000c157600080fd5b505afa158015620000d6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000fc91906200093c565b5050600580546001600160a01b0319166001600160a01b03938416179055506040805163f7c618c160e01b815290519184169163f7c618c191600480820192602092909190829003018186803b1580156200015657600080fd5b505afa1580156200016b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001919190620007e2565b600b80546001600160a01b0319166001600160a01b0392831617905560055460408051630dfe168160e01b815290519190921691630dfe1681916004808301926020929190829003018186803b158015620001eb57600080fd5b505afa15801562000200573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002269190620007e2565b600980546001600160a01b0319166001600160a01b039283161790556005546040805163d21220a760e01b81529051919092169163d21220a7916004808301926020929190829003018186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb9190620007e2565b600a80546001600160a01b0319166001600160a01b0392909216919091179055620002e5620002ee565b505050620009d0565b600b546009546200030c916001600160a01b03908116911662000368565b600b54600a546200032a916001600160a01b03908116911662000368565b600954600b5462000348916001600160a01b03908116911662000368565b600a54600b5462000366916001600160a01b03908116911662000368565b565b806001600160a01b0316826001600160a01b031614620006ba5760006200038e620006be565b60405163102b34a360e01b81526001600160a01b038581166004830152848116602483015291925060009182919084169063102b34a39060440160006040518083038186803b158015620003e157600080fd5b505afa158015620003f6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000420919081019062000808565b90925090506001600160a01b038516620004815760405162461bcd60e51b815260206004820152601460248201527f53726320746f6b656e20697320696e76616c696400000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b038416620004d95760405162461bcd60e51b815260206004820152601460248201527f44737420746f6b656e20697320696e76616c6964000000000000000000000000604482015260640162000478565b6001600160a01b038216620005255760405162461bcd60e51b8152602060048201526011602482015270149bdd5d195c881a5cc81a5b9d985b1a59607a1b604482015260640162000478565b846001600160a01b0316816000815181106200055157634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614620005b15760405162461bcd60e51b815260206004820152601f60248201527f526f757465206d75737420737461727420776974682073726320746f6b656e00604482015260640162000478565b836001600160a01b03168160018351620005cc91906200097d565b81518110620005eb57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146200064b5760405162461bcd60e51b815260206004820152601d60248201527f526f757465206d75737420656e6420776974682064737420746f6b656e000000604482015260640162000478565b6040805180820182526001600160a01b03848116825260208083018581528983166000908152600e83528581208a85168252835294909420835181546001600160a01b03191693169290921782559251805192939192620006b392600185019201906200074f565b5050505050505b5050565b60008060018054906101000a90046001600160a01b03166001600160a01b031663f887ea406040518163ffffffff1660e01b815260040160206040518083038186803b1580156200070e57600080fd5b505afa15801562000723573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007499190620007e2565b92915050565b828054828255906000526020600020908101928215620007a7579160200282015b82811115620007a757825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000770565b50620007b5929150620007b9565b5090565b5b80821115620007b55760008155600101620007ba565b8051620007dd81620009b7565b919050565b600060208284031215620007f4578081fd5b81516200080181620009b7565b9392505050565b600080604083850312156200081b578081fd5b82516200082881620009b7565b602084810151919350906001600160401b038082111562000847578384fd5b818601915086601f8301126200085b578384fd5b815181811115620008705762000870620009a1565b8060051b604051601f19603f83011681018181108582111715620008985762000898620009a1565b604052828152858101935084860182860187018b1015620008b7578788fd5b8795505b83861015620008e457620008cf81620007d0565b855260019590950194938601938601620008bb565b508096505050505050509250929050565b6000806000606084860312156200090a578081fd5b83516200091781620009b7565b60208501519093506200092a81620009b7565b80925050604084015190509250925092565b6000806000806080858703121562000952578081fd5b84516200095f81620009b7565b60208601516040870151606090970151919890975090945092505050565b6000828210156200099c57634e487b7160e01b81526011600452602481fd5b500390565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114620009cd57600080fd5b50565b612f9680620009e06000396000f3fe6080604052600436106102085760003560e01c8063827cdc7f11610118578063c45a0155116100a0578063e20ccec31161006f578063e20ccec3146105e8578063e7a03679146105fd578063edc3e87b1461061d578063f69e204614610632578063f7c618c11461064757600080fd5b8063c45a01551461056e578063cd6dc68714610593578063ce1e4626146105b3578063d21220a7146105c857600080fd5b806394de34f1116100e757806394de34f1146104ee578063b0f479a114610504578063b6b55f2514610519578063b79eb3a114610539578063ba27240d1461054e57600080fd5b8063827cdc7f1461048f578063853828b6146104a457806388318834146104b95780638da5cb5b146104ce57600080fd5b8063370158ea1161019b5780635055374d1161016a5780635055374d146103d8578063575a86b21461041957806358a79eb9146104395780636e261df1146104595780637aa77f291461047957600080fd5b8063370158ea1461034f578063372500ab146103975780633e032a3b146103ac5780633e0dc34e146103c257600080fd5b806315b0d496116101d757806315b0d496146102c05780632224fa25146102e2578063247029441461030f5780632e1a7d4d1461032f57600080fd5b8063047168e0146102145780630dfe16811461024a5780630fa4e01e14610282578063158ef93e146102a657600080fd5b3661020f57005b600080fd5b34801561022057600080fd5b5060055461023590600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b34801561025657600080fd5b5060095461026a906001600160a01b031681565b6040516001600160a01b039091168152602001610241565b34801561028e57600080fd5b5061029860045481565b604051908152602001610241565b3480156102b257600080fd5b506001546102359060ff1681565b3480156102cc57600080fd5b506102e06102db366004612c30565b610667565b005b3480156102ee57600080fd5b506103026102fd366004612ae3565b61069f565b6040516102419190612d6c565b34801561031b57600080fd5b50600d5461026a906001600160a01b031681565b34801561033b57600080fd5b5061029861034a366004612c30565b6107b2565b34801561035b57600080fd5b5061036461090e565b604080519687526020870195909552938501929092521515606084015215156080830152151560a082015260c001610241565b3480156103a357600080fd5b506102e06109e6565b3480156103b857600080fd5b5061029860065481565b3480156103ce57600080fd5b50610298600c5481565b3480156103e457600080fd5b5061026a6103f33660046129c8565b600e6020908152600092835260408084209091529082529020546001600160a01b031681565b34801561042557600080fd5b5060085461026a906001600160a01b031681565b34801561044557600080fd5b5060035461026a906001600160a01b031681565b34801561046557600080fd5b506102e0610474366004612ab8565b610ab8565b34801561048557600080fd5b5061029860075481565b34801561049b57600080fd5b50610298610b00565b3480156104b057600080fd5b50610298610b91565b3480156104c557600080fd5b506102e0610c1c565b3480156104da57600080fd5b5060025461026a906001600160a01b031681565b3480156104fa57600080fd5b50610298600f5481565b34801561051057600080fd5b5061026a610caf565b34801561052557600080fd5b50610298610534366004612c30565b610d3c565b34801561054557600080fd5b506102e0610dea565b34801561055a57600080fd5b506102e0610569366004612990565b610e1e565b34801561057a57600080fd5b5060015461026a9061010090046001600160a01b031681565b34801561059f57600080fd5b506102e06105ae366004612ab8565b610ec0565b3480156105bf57600080fd5b5061026a610f94565b3480156105d457600080fd5b50600a5461026a906001600160a01b031681565b3480156105f457600080fd5b50610298610fe3565b34801561060957600080fd5b5060055461026a906001600160a01b031681565b34801561062957600080fd5b5061023561106f565b34801561063e57600080fd5b506102e061119c565b34801561065357600080fd5b50600b5461026a906001600160a01b031681565b6002546001600160a01b0316331461069a5760405162461bcd60e51b815260040161069190612d7f565b60405180910390fd5b600655565b6002546060906001600160a01b031633146106cc5760405162461bcd60e51b815260040161069190612d7f565b60608351600014156106df57508161070b565b8380519060200120836040516020016106f9929190612d1f565b60405160208183030381529060405290505b600080876001600160a01b031687846040516107279190612d50565b60006040518083038185875af1925050503d8060008114610764576040519150601f19603f3d011682016040523d82523d6000602084013e610769565b606091505b5091509150816040518060600160405280603c8152602001612f25603c9139906107a65760405162461bcd60e51b81526004016106919190612d6c565b50979650505050505050565b6002546000906001600160a01b031633146107df5760405162461bcd60e51b815260040161069190612d7f565b600260005414156108325760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610691565b6002600055816108745760405162461bcd60e51b815260206004820152600d60248201526c05f77616e74416d74203c3d203609c1b6044820152606401610691565b61087d8261163b565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156108c157600080fd5b505afa1580156108d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f99190612c48565b90506109036116e5565b600160005592915050565b6000806000806000806000610921610f94565b90506007549650610930610b00565b955061093a610fe3565b60025460405163f0b919ab60e01b81523060048201526001600160a01b03918216602482015291965082169063f0b919ab9060440160206040518083038186803b15801561098757600080fd5b505afa15801561099b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bf9190612c10565b92506109c961106f565b9150600560149054906101000a900460ff16935050909192939495565b6002546001600160a01b03163314610a105760405162461bcd60e51b815260040161069190612d7f565b610a1a600061163b565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610a5e57600080fd5b505afa158015610a72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a969190612c48565b90508015610ab557600b54610ab5906001600160a01b03163383611817565b50565b6002546001600160a01b03163314610ae25760405162461bcd60e51b815260040161069190612d7f565b600254610afc906001600160a01b03848116911683611817565b5050565b600854600c546040516393f1a40b60e01b8152600481019190915230602482015260009182916001600160a01b03909116906393f1a40b90604401604080518083038186803b158015610b5257600080fd5b505afa158015610b66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8a9190612c60565b5092915050565b6002546000906001600160a01b03163314610bbe5760405162461bcd60e51b815260040161069190612d7f565b6000610bc8610b00565b9050610bd3816107b2565b9150610bdd61187f565b610be56116e5565b6040518281527fb20101a10c7cc8d4a9b5accf3d34c34f89d53ec195fce51620af16429526c7559060200160405180910390a15090565b6002546001600160a01b03163314610c465760405162461bcd60e51b815260040161069190612d7f565b610c4e61106f565b610c9a5760405162461bcd60e51b815260206004820152601960248201527f5661756c742063616e6e6f74206265206162616e646f6e6564000000000000006044820152606401610691565b6005805460ff60a01b1916600160a01b179055565b60008060018054906101000a90046001600160a01b03166001600160a01b031663f887ea406040518163ffffffff1660e01b815260040160206040518083038186803b158015610cfe57600080fd5b505afa158015610d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3691906129ac565b92915050565b6002546000906001600160a01b03163314610d695760405162461bcd60e51b815260040161069190612d7f565b60026000541415610dbc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610691565b6002600055600554610dd9906001600160a01b0316333085611a03565b610de1611a41565b50600160005590565b6002546001600160a01b03163314610e145760405162461bcd60e51b815260040161069190612d7f565b610e1c611c8d565b565b6002546001600160a01b03163314610e485760405162461bcd60e51b815260040161069190612d7f565b6001600160a01b038116610e9e5760405162461bcd60e51b815260206004820152601a60248201527f63616e6e6f7420616464726573732073657420746f207a65726f0000000000006044820152606401610691565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60015460ff1615610f025760405162461bcd60e51b815260206004820152600c60248201526b185b1c9958591e481a5b9a5d60a21b6044820152606401610691565b60015461010090046001600160a01b03163314610f4c5760405162461bcd60e51b815260206004820152600860248201526721666163746f727960c01b6044820152606401610691565b600380546001600160a01b0384166001600160a01b031991821681179092556002805490911690911790556007819055610f84611c8d565b50506001805460ff191681179055565b60008060018054906101000a90046001600160a01b03166001600160a01b0316630505c8c96040518163ffffffff1660e01b815260040160206040518083038186803b158015610cfe57600080fd5b600854600c54604051634c4b4f4160e11b815260048101919091523060248201526000916001600160a01b0316906398969e829060440160206040518083038186803b15801561103257600080fd5b505afa158015611046573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106a9190612c48565b905090565b600b546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a082319060240160206040518083038186803b1580156110b757600080fd5b505afa1580156110cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ef9190612c48565b6005546040516370a0823160e01b8152306004820152911592506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561113957600080fd5b505afa15801561114d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111719190612c48565b159050600061117e610fe3565b15905082801561118b5750815b80156111945750805b935050505090565b6003546001600160a01b03163314806111bf57506002546001600160a01b031633145b6112025760405162461bcd60e51b815260206004820152601460248201527310b7bbb732b91013131010b430b93b32b9ba37b960611b6044820152606401610691565b600061120c610b00565b9050611218600061163b565b600b546001600160a01b0316730d500b1d8e8ef31e21c99d1db9a6444d3adf1270141561124757611247611cfd565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561128b57600080fd5b505afa15801561129f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c39190612c48565b600954600b549192506001600160a01b0391821691161461130557600b54600954611305916001600160a01b039081169116611300600285612e61565b611d6f565b600a54600b546001600160a01b0390811691161461133f57600b54600a5461133f916001600160a01b039081169116611300600285612e61565b600954600a546040516370a0823160e01b81523060048201526001600160a01b03928316929091169060009083906370a082319060240160206040518083038186803b15801561138e57600080fd5b505afa1580156113a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c69190612c48565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b15801561140b57600080fd5b505afa15801561141f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114439190612c48565b90506000821180156114555750600081115b1561157957600d54611474906001600160a01b03868116911684611f3c565b600d5461148e906001600160a01b03858116911683611f3c565b600d54600954600a54600f546001600160a01b039384169363e8e3370093811692169086908690600090819030906114c69042612e49565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e481019190915261010401606060405180830381600087803b15801561153d57600080fd5b505af1158015611551573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115759190612c83565b5050505b43600455611585611a41565b61158d61187f565b6000611597610b00565b9050868111156115ee576005546001600160a01b03167f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a6115d88984612ea0565b60405190815260200160405180910390a2611632565b600554604051600081526001600160a01b03909116907f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a9060200160405180910390a25b50505050505050565b600854600c54604051630441a3e760e41b81526001600160a01b039092169163441a3e7091611677918590600401918252602082015260400190565b600060405180830381600087803b15801561169157600080fd5b505af11580156116a5573d6000803e3d6000fd5b505050507f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d816040516116da91815260200190565b60405180910390a150565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561172957600080fd5b505afa15801561173d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117619190612c48565b9050801561178057600b54611780906001600160a01b03163383611817565b6005546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156117c457600080fd5b505afa1580156117d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fc9190612c48565b90508015610afc57600554610afc906001600160a01b031633835b6040516001600160a01b03831660248201526044810182905261187a90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611ffd565b505050565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156118c357600080fd5b505afa1580156118d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fb9190612c48565b600b546009549192506001600160a01b0391821691161480159061191f5750600081115b1561194157600954600b54611941916001600160a01b03908116911683611d6f565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561198557600080fd5b505afa158015611999573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bd9190612c48565b600b54600a549192506001600160a01b039182169116148015906119e15750600081115b15610afc57600a54600b54610afc916001600160a01b03908116911683611d6f565b6040516001600160a01b0380851660248301528316604482015260648101829052611a3b9085906323b872dd60e01b90608401611843565b50505050565b60015460ff16611a7b5760405162461bcd60e51b8152602060048201526005602482015264085a5b9a5d60da1b6044820152606401610691565b6000611a85610f94565b60025460405163f0b919ab60e01b81523060048201526001600160a01b03918216602482015291925082169063f0b919ab9060440160206040518083038186803b158015611ad257600080fd5b505afa158015611ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0a9190612c10565b611b445760405162461bcd60e51b815260206004820152600b60248201526a0858d85b91195c1bdcda5d60aa1b6044820152606401610691565b6005546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015611b8c57600080fd5b505afa158015611ba0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc49190612c48565b600854909150611be1906001600160a01b03848116911683611f3c565b600854600c54604051631c57762b60e31b81526001600160a01b039092169163e2bbb15891611c1d918590600401918252602082015260400190565b600060405180830381600087803b158015611c3757600080fd5b505af1158015611c4b573d6000803e3d6000fd5b505050507f2a89b2e3d580398d6dc2db5e0f336b52602bbaa51afa9bb5cdf59239cf0d2bea81604051611c8091815260200190565b60405180910390a1505050565b600b54600954611ca9916001600160a01b0390811691166120cf565b600b54600a54611cc5916001600160a01b0390811691166120cf565b600954600b54611ce1916001600160a01b0390811691166120cf565b600a54600b54610e1c916001600160a01b0390811691166120cf565b478015610ab557730d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d5357600080fd5b505af1158015611d67573d6000803e3d6000fd5b505050505050565b80611d7957505050565b600080611d8685856123f7565b90925090506001600160a01b038216611dd15760405162461bcd60e51b815260206004820152600d60248201526c696e76616c696420726f75746560981b6044820152606401610691565b846001600160a01b031681600081518110611dfc57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614611e5a5760405162461bcd60e51b815260206004820152601f60248201527f526f757465206d75737420737461727420776974682073726320746f6b656e006044820152606401610691565b836001600160a01b03168160018351611e739190612ea0565b81518110611e9157634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614611eef5760405162461bcd60e51b815260206004820152601d60248201527f526f757465206d75737420656e6420776974682064737420746f6b656e0000006044820152606401610691565b611f046001600160a01b03861683600061248a565b611f186001600160a01b038616838561248a565b611f3582846006548430600f5442611f309190612e49565b6125ae565b5050505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b158015611f8857600080fd5b505afa158015611f9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc09190612c48565b611fca9190612e49565b6040516001600160a01b038516602482015260448101829052909150611a3b90859063095ea7b360e01b90606401611843565b6000612052826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127449092919063ffffffff16565b80519091501561187a57808060200190518101906120709190612c10565b61187a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610691565b806001600160a01b0316826001600160a01b031614610afc5760006120f2610caf565b60405163102b34a360e01b81526001600160a01b038581166004830152848116602483015291925060009182919084169063102b34a39060440160006040518083038186803b15801561214457600080fd5b505afa158015612158573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121809190810190612a00565b90925090506001600160a01b0385166121d25760405162461bcd60e51b815260206004820152601460248201527314dc98c81d1bdad95b881a5cc81a5b9d985b1a5960621b6044820152606401610691565b6001600160a01b03841661221f5760405162461bcd60e51b8152602060048201526014602482015273111cdd081d1bdad95b881a5cc81a5b9d985b1a5960621b6044820152606401610691565b6001600160a01b0382166122695760405162461bcd60e51b8152602060048201526011602482015270149bdd5d195c881a5cc81a5b9d985b1a59607a1b6044820152606401610691565b846001600160a01b03168160008151811061229457634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146122f25760405162461bcd60e51b815260206004820152601f60248201527f526f757465206d75737420737461727420776974682073726320746f6b656e006044820152606401610691565b836001600160a01b0316816001835161230b9190612ea0565b8151811061232957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146123875760405162461bcd60e51b815260206004820152601d60248201527f526f757465206d75737420656e6420776974682064737420746f6b656e0000006044820152606401610691565b6040805180820182526001600160a01b03848116825260208083018581528983166000908152600e83528581208a85168252835294909420835181546001600160a01b031916931692909217825592518051929391926123ed92600185019201906128be565b5050505050505050565b6001600160a01b038083166000908152600e60209081526040808320858516845282529182902080546001820180548551818602810186019096528086529190951694606094929390919083018282801561247b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161245d575b50505050509150509250929050565b8015806125135750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156124d957600080fd5b505afa1580156124ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125119190612c48565b155b61257e5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610691565b6040516001600160a01b03831660248201526044810182905261187a90849063095ea7b360e01b90606401611843565b825186906125f05760405162461bcd60e51b815260206004820152600f60248201526e0d2dcecc2d8d2c8a6eec2e0a0c2e8d608b1b6044820152606401610691565b60405163d06ca61f60e01b81526000906001600160a01b0383169063d06ca61f90612621908a908990600401612d9f565b60006040518083038186803b15801561263957600080fd5b505afa15801561264d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126759190810190612b89565b90506000620f42406126878882612ea0565b83600185516126969190612ea0565b815181106126b457634e487b7160e01b600052603260045260246000fd5b60200260200101516126c69190612e81565b6126d09190612e61565b604051635c11d79560e01b81529091506001600160a01b03841690635c11d79590612707908b9085908b908b908b90600401612db8565b600060405180830381600087803b15801561272157600080fd5b505af1158015612735573d6000803e3d6000fd5b50505050505050505050505050565b6060612753848460008561275d565b90505b9392505050565b6060824710156127be5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610691565b843b61280c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610691565b600080866001600160a01b031685876040516128289190612d50565b60006040518083038185875af1925050503d8060008114612865576040519150601f19603f3d011682016040523d82523d6000602084013e61286a565b606091505b509150915061287a828286612885565b979650505050505050565b60608315612894575081612756565b8251156128a45782518084602001fd5b8160405162461bcd60e51b81526004016106919190612d6c565b828054828255906000526020600020908101928215612913579160200282015b8281111561291357825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906128de565b5061291f929150612923565b5090565b5b8082111561291f5760008155600101612924565b600067ffffffffffffffff83111561295257612952612ef9565b612965601f8401601f1916602001612df4565b905082815283838301111561297957600080fd5b828260208301376000602084830101529392505050565b6000602082840312156129a1578081fd5b813561275681612f0f565b6000602082840312156129bd578081fd5b815161275681612f0f565b600080604083850312156129da578081fd5b82356129e581612f0f565b915060208301356129f581612f0f565b809150509250929050565b60008060408385031215612a12578182fd5b8251612a1d81612f0f565b8092505060208084015167ffffffffffffffff811115612a3b578283fd5b8401601f81018613612a4b578283fd5b8051612a5e612a5982612e25565b612df4565b80828252848201915084840189868560051b8701011115612a7d578687fd5b8694505b83851015612aa8578051612a9481612f0f565b835260019490940193918501918501612a81565b5080955050505050509250929050565b60008060408385031215612aca578182fd5b8235612ad581612f0f565b946020939093013593505050565b60008060008060808587031215612af8578182fd5b8435612b0381612f0f565b935060208501359250604085013567ffffffffffffffff80821115612b26578384fd5b818701915087601f830112612b39578384fd5b612b4888833560208501612938565b93506060870135915080821115612b5d578283fd5b508501601f81018713612b6e578182fd5b612b7d87823560208401612938565b91505092959194509250565b60006020808385031215612b9b578182fd5b825167ffffffffffffffff811115612bb1578283fd5b8301601f81018513612bc1578283fd5b8051612bcf612a5982612e25565b80828252848201915084840188868560051b8701011115612bee578687fd5b8694505b838510156107a6578051835260019490940193918501918501612bf2565b600060208284031215612c21578081fd5b81518015158114612756578182fd5b600060208284031215612c41578081fd5b5035919050565b600060208284031215612c59578081fd5b5051919050565b60008060408385031215612c72578182fd5b505080516020909101519092909150565b600080600060608486031215612c97578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015612ce85781516001600160a01b031687529582019590820190600101612cc3565b509495945050505050565b60008151808452612d0b816020860160208601612eb7565b601f01601f19169290920160200192915050565b6001600160e01b0319831681528151600090612d42816004850160208701612eb7565b919091016004019392505050565b60008251612d62818460208701612eb7565b9190910192915050565b6020815260006127566020830184612cf3565b60208082526006908201526510b7bbb732b960d11b604082015260600190565b8281526040602082015260006127536040830184612cb0565b85815284602082015260a060408201526000612dd760a0830186612cb0565b6001600160a01b0394909416606083015250608001529392505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e1d57612e1d612ef9565b604052919050565b600067ffffffffffffffff821115612e3f57612e3f612ef9565b5060051b60200190565b60008219821115612e5c57612e5c612ee3565b500190565b600082612e7c57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612e9b57612e9b612ee3565b500290565b600082821015612eb257612eb2612ee3565b500390565b60005b83811015612ed2578181015183820152602001612eba565b83811115611a3b5750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ab557600080fdfe44657646756e643a3a657865637574655472616e73616374696f6e3a205472616e73616374696f6e20657865637574696f6e2072657665727465642ea26469706673582212208fcb610c0122246695e311272c599decbbfe886742ffe66e8684ea86c8edc84064736f6c634300080400330000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b4799750600000000000000000000000065430393358e55a658bcde6ff69ab28cf1cbb77a0000000000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b4799750600000000000000000000000065430393358e55a658bcde6ff69ab28cf1cbb77a0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _liquidityRouter (address): 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506
Arg [1] : _masterChef (address): 0x65430393358e55a658bcde6ff69ab28cf1cbb77a
Arg [2] : _poolId (uint256): 0
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b47997506
Arg [1] : 00000000000000000000000065430393358e55a658bcde6ff69ab28cf1cbb77a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
40181:8947:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34194:30;;;;;;;;;;-1:-1:-1;34194:30:0;;;;-1:-1:-1;;;34194:30:0;;;;;;;;;9604:14:1;;9597:22;9579:41;;9567:2;9552:18;34194:30:0;;;;;;;;40297:21;;;;;;;;;;-1:-1:-1;40297:21:0;;;;-1:-1:-1;;;;;40297:21:0;;;;;;-1:-1:-1;;;;;7662:32:1;;;7644:51;;7632:2;7617:18;40297:21:0;7599:102:1;34117:28:0;;;;;;;;;;;;;;;;;;;10921:25:1;;;10909:2;10894:18;34117:28:0;10876:76:1;33904:23:0;;;;;;;;;;-1:-1:-1;33904:23:0;;;;;;;;36490:116;;;;;;;;;;-1:-1:-1;36490:116:0;;;;;:::i;:::-;;:::i;:::-;;38483:692;;;;;;;;;;-1:-1:-1;38483:692:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40414:30::-;;;;;;;;;;-1:-1:-1;40414:30:0;;;;-1:-1:-1;;;;;40414:30:0;;;44720:320;;;;;;;;;;-1:-1:-1;44720:320:0;;;;;:::i;:::-;;:::i;41811:620::-;;;;;;;;;;;;;:::i;:::-;;;;20571:25:1;;;20627:2;20612:18;;20605:34;;;;20655:18;;;20648:34;;;;20725:14;20718:22;20713:2;20698:18;;20691:50;20785:14;20778:22;20772:3;20757:19;;20750:51;20845:14;20838:22;20832:3;20817:19;;20810:51;20558:3;20543:19;41811:620:0;20525:342:1;45048:275:0;;;;;;;;;;;;;:::i;34231:31::-;;;;;;;;;;;;;;;;40386:21;;;;;;;;;;;;;;;;40453:63;;;;;;;;;;-1:-1:-1;40453:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40453:63:0;;;40257:33;;;;;;;;;;-1:-1:-1;40257:33:0;;;;-1:-1:-1;;;;;40257:33:0;;;34049:24;;;;;;;;;;-1:-1:-1;34049:24:0;;;;-1:-1:-1;;;;;34049:24:0;;;38326:149;;;;;;;;;;-1:-1:-1;38326:149:0;;;;;:::i;:::-;;:::i;34277:25::-;;;;;;;;;;;;;;;;41139:172;;;;;;;;;;;;;:::i;44435:277::-;;;;;;;;;;;;;:::i;45331:143::-;;;;;;;;;;;;;:::i;33971:29::-;;;;;;;;;;-1:-1:-1;33971:29:0;;;;-1:-1:-1;;;;;33971:29:0;;;40525:26;;;;;;;;;;;;;;;;35676:146;;;;;;;;;;;;;:::i;44181:246::-;;;;;;;;;;-1:-1:-1;44181:246:0;;;;;:::i;:::-;;:::i;45482:81::-;;;;;;;;;;;;;:::i;36614:178::-;;;;;;;;;;-1:-1:-1;36614:178:0;;;;;:::i;:::-;;:::i;33934:28::-;;;;;;;;;;-1:-1:-1;33934:28:0;;;;;;;-1:-1:-1;;;;;33934:28:0;;;34692:357;;;;;;;;;;-1:-1:-1;34692:357:0;;;;;:::i;:::-;;:::i;35512:156::-;;;;;;;;;;;;;:::i;40325:21::-;;;;;;;;;;-1:-1:-1;40325:21:0;;;;-1:-1:-1;;;;;40325:21:0;;;41319:131;;;;;;;;;;;;;:::i;34152:35::-;;;;;;;;;;-1:-1:-1;34152:35:0;;;;-1:-1:-1;;;;;34152:35:0;;;41458:345;;;;;;;;;;;;;:::i;42493:1680::-;;;;;;;;;;;;;:::i;40353:26::-;;;;;;;;;;-1:-1:-1;40353:26:0;;;;-1:-1:-1;;;;;40353:26:0;;;36490:116;35944:5;;-1:-1:-1;;;;;35944:5:0;35930:10;:19;35922:38;;;;-1:-1:-1;;;35922:38:0;;;;;;;:::i;:::-;;;;;;;;;36578:8:::1;:20:::0;36490:116::o;38483:692::-;35944:5;;38655:12;;-1:-1:-1;;;;;35944:5:0;35930:10;:19;35922:38;;;;-1:-1:-1;;;35922:38:0;;;;;;;:::i;:::-;38680:21:::1;38724:9;38718:23;38745:1;38718:28;38714:179;;;-1:-1:-1::0;38774:4:0;38714:179:::1;;;38862:9;38846:27;;;;;;38876:4;38822:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38811:70;;38714:179;38964:12;38978:23:::0;39005:6:::1;-1:-1:-1::0;;;;;39005:11:0::1;39024:5;39031:8;39005:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38963:77;;;;39059:7;39068:70;;;;;;;;;;;;;;;;;39051:88;;;;;-1:-1:-1::0;;;39051:88:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;39157:10:0;38483:692;-1:-1:-1;;;;;;;38483:692:0:o;44720:320::-;35944:5;;44804:7;;-1:-1:-1;;;;;35944:5:0;35930:10;:19;35922:38;;;;-1:-1:-1;;;35922:38:0;;;;;;;:::i;:::-;24979:1:::1;25575:7;;:19;;25567:63;;;::::0;-1:-1:-1;;;25567:63:0;;17757:2:1;25567:63:0::1;::::0;::::1;17739:21:1::0;17796:2;17776:18;;;17769:30;17835:33;17815:18;;;17808:61;17886:18;;25567:63:0::1;17729:181:1::0;25567:63:0::1;24979:1;25708:7;:18:::0;44832:12;44824:38:::2;;;::::0;-1:-1:-1;;;44824:38:0;;13534:2:1;44824:38:0::2;::::0;::::2;13516:21:1::0;13573:2;13553:18;;;13546:30;-1:-1:-1;;;13592:18:1;;;13585:43;13645:18;;44824:38:0::2;13506:163:1::0;44824:38:0::2;44873:28;44892:8;44873:18;:28::i;:::-;44938:11;::::0;44931:44:::2;::::0;-1:-1:-1;;;44931:44:0;;44969:4:::2;44931:44;::::0;::::2;7644:51:1::0;44912:16:0::2;::::0;-1:-1:-1;;;;;44938:11:0::2;::::0;44931:29:::2;::::0;7617:18:1;;44931:44:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44912:63;;44986:20;:18;:20::i;:::-;24935:1:::1;25887:7;:22:::0;45024:8;44720:320;-1:-1:-1;;44720:320:0:o;41811:620::-;41926:19;41960:22;41997:23;42035:15;42065:16;42096;42140:19;42162:11;:9;:11::i;:::-;42140:33;;42198:10;;42184:24;;42236:15;:13;:15::i;:::-;42219:32;;42280:9;:7;:9::i;:::-;42347:5;;42314:39;;-1:-1:-1;;;42314:39:0;;42340:4;42314:39;;;7918:34:1;-1:-1:-1;;;;;42347:5:0;;;7968:18:1;;;7961:43;42262:27:0;;-1:-1:-1;42314:17:0;;;;;7853:18:1;;42314:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42300:53;;42378:12;:10;:12::i;:::-;42364:26;;42414:9;;;;;;;;;;;42401:22;;41811:620;;;;;;;:::o;45048:275::-;35944:5;;-1:-1:-1;;;;;35944:5:0;35930:10;:19;35922:38;;;;-1:-1:-1;;;35922:38:0;;;;;;;:::i;:::-;45111:21:::1;45130:1;45111:18;:21::i;:::-;45169:11;::::0;45162:44:::1;::::0;-1:-1:-1;;;45162:44:0;;45200:4:::1;45162:44;::::0;::::1;7644:51:1::0;45143:16:0::1;::::0;-1:-1:-1;;;;;45169:11:0::1;::::0;45162:29:::1;::::0;7617:18:1;;45162:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45143:63:::0;-1:-1:-1;45221:12:0;;45217:99:::1;;45257:11;::::0;45250:54:::1;::::0;-1:-1:-1;;;;;45257:11:0::1;45283:10;45295:8:::0;45250:32:::1;:54::i;:::-;35971:1;45048:275::o:0;38326:149::-;35944:5;;-1:-1:-1;;;;;35944:5:0;35930:10;:19;35922:38;;;;-1:-1:-1;;;35922:38:0;;;;;;;:::i;:::-;38452:5:::1;::::0;38424:43:::1;::::0;-1:-1:-1;;;;;38424:27:0;;::::1;::::0;38452:5:::1;38459:7:::0;38424:27:::1;:43::i;:::-;38326:149:::0;;:::o;41139:172::-;41236:10;;41256:6;;41236:42;;-1:-1:-1;;;41236:42:0;;;;;19028:25:1;;;;41272:4:0;19069:18:1;;;19062:60;41194:7:0;;;;-1:-1:-1;;;;;41236:10:0;;;;:19;;19001:18:1;;41236:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41214:64:0;41139:172;-1:-1:-1;;41139:172:0:o;44435:277::-;35944:5;;44495:24;;-1:-1:-1;;;;;35944:5:0;35930:10;:19;35922:38;;;;-1:-1:-1;;;35922:38:0;;;;;;;:::i;:::-;44532:16:::1;44551:15;:13;:15::i;:::-;44532:34;;44596:18;44605:8;44596;:18::i;:::-;44577:37;;44625:10;:8;:10::i;:::-;44646:20;:18;:20::i;:::-;44682:22;::::0;10921:25:1;;;44682:22:0::1;::::0;10909:2:1;10894:18;44682:22:0::1;;;;;;;35971:1;44435:277:::0;:::o;45331:143::-;35944:5;;-1:-1:-1;;;;;35944:5:0;35930:10;:19;35922:38;;;;-1:-1:-1;;;35922:38:0;;;;;;;:::i;:::-;45397:12:::1;:10;:12::i;:::-;45389:50;;;::::0;-1:-1:-1;;;45389:50:0;;15608:2:1;45389:50:0::1;::::0;::::1;15590:21:1::0;15647:2;15627:18;;;15620:30;15686:27;15666:18;;;15659:55;15731:18;;45389:50:0::1;15580:175:1::0;45389:50:0::1;45450:9;:16:::0;;-1:-1:-1;;;;45450:16:0::1;-1:-1:-1::0;;;45450:16:0::1;::::0;;45331:143::o;35676:146::-;35726:7;35746:15;35764:7;;;;;;;;-1:-1:-1;;;;;35764:7:0;-1:-1:-1;;;;;35764:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35746:34;35676:146;-1:-1:-1;;35676:146:0:o;44181:246::-;35944:5;;44264:7;;-1:-1:-1;;;;;35944:5:0;35930:10;:19;35922:38;;;;-1:-1:-1;;;35922:38:0;;;;;;;:::i;:::-;24979:1:::1;25575:7;;:19;;25567:63;;;::::0;-1:-1:-1;;;25567:63:0;;17757:2:1;25567:63:0::1;::::0;::::1;17739:21:1::0;17796:2;17776:18;;;17769:30;17835:33;17815:18;;;17808:61;17886:18;;25567:63:0::1;17729:181:1::0;25567:63:0::1;24979:1;25708:7;:18:::0;44291:11:::2;::::0;44284:82:::2;::::0;-1:-1:-1;;;;;44291:11:0::2;44329:10;44350:4;44357:8:::0;44284:36:::2;:82::i;:::-;44377:16;:14;:16::i;:::-;-1:-1:-1::0;24935:1:0::1;25887:7;:22:::0;44411:8;44181:246::o;45482:81::-;35944:5;;-1:-1:-1;;;;;35944:5:0;35930:10;:19;35922:38;;;;-1:-1:-1;;;35922:38:0;;;;;;;:::i;:::-;45538:17:::1;:15;:17::i;:::-;45482:81::o:0;36614:178::-;35944:5;;-1:-1:-1;;;;;35944:5:0;35930:10;:19;35922:38;;;;-1:-1:-1;;;35922:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36694:26:0;::::1;36686:65;;;::::0;-1:-1:-1;;;36686:65:0;;12436:2:1;36686:65:0::1;::::0;::::1;12418:21:1::0;12475:2;12455:18;;;12448:30;12514:28;12494:18;;;12487:56;12560:18;;36686:65:0::1;12408:176:1::0;36686:65:0::1;36762:9;:22:::0;;-1:-1:-1;;;;;;36762:22:0::1;-1:-1:-1::0;;;;;36762:22:0;;;::::1;::::0;;;::::1;::::0;;36614:178::o;34692:357::-;34800:11;;;;34799:12;34791:37;;;;-1:-1:-1;;;34791:37:0;;14225:2:1;34791:37:0;;;14207:21:1;14264:2;14244:18;;;14237:30;-1:-1:-1;;;14283:18:1;;;14276:42;14335:18;;34791:37:0;14197:162:1;34791:37:0;34869:7;;;;;-1:-1:-1;;;;;34869:7:0;34847:10;:30;34839:51;;;;-1:-1:-1;;;34839:51:0;;13198:2:1;34839:51:0;;;13180:21:1;13237:1;13217:18;;;13210:29;-1:-1:-1;;;13255:18:1;;;13248:38;13303:18;;34839:51:0;13170:157:1;34839:51:0;34901:9;:18;;-1:-1:-1;;;;;34901:18:0;;-1:-1:-1;;;;;;34901:18:0;;;;;;;;34930:5;:14;;;;;;;;;;34955:10;:29;;;34995:17;:15;:17::i;:::-;-1:-1:-1;;35037:4:0;35023:18;;-1:-1:-1;;35023:18:0;;;;;34692:357::o;35512:156::-;35562:12;35587:15;35605:7;;;;;;;;-1:-1:-1;;;;;35605:7:0;-1:-1:-1;;;;;35605:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41319:131;41395:10;;41420:6;;41395:47;;-1:-1:-1;;;41395:47:0;;;;;19028:25:1;;;;41436:4:0;19069:18:1;;;19062:60;41368:7:0;;-1:-1:-1;;;;;41395:10:0;;:24;;19001:18:1;;41395:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41388:54;;41319:131;:::o;41458:345::-;41560:11;;41553:44;;-1:-1:-1;;;41553:44:0;;41591:4;41553:44;;;7644:51:1;41510:4:0;;;;-1:-1:-1;;;;;41560:11:0;;;;41553:29;;7617:18:1;;41553:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41642:11;;41635:44;;-1:-1:-1;;;41635:44:0;;41673:4;41635:44;;;7644:51:1;41553:49:0;;;-1:-1:-1;41601:1:0;;-1:-1:-1;;;;;41642:11:0;;;;41635:29;;7617:18:1;;41635:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;-1:-1:-1;41683:1:0;41713:9;:7;:9::i;:::-;:14;;-1:-1:-1;41745:18:0;:36;;;;;41767:14;41745:36;:50;;;;;41785:10;41745:50;41738:57;;;;;41458:345;:::o;42493:1680::-;36046:9;;-1:-1:-1;;;;;36046:9:0;36032:10;:23;;:46;;-1:-1:-1;36073:5:0;;-1:-1:-1;;;;;36073:5:0;36059:10;:19;36032:46;36024:79;;;;-1:-1:-1;;;36024:79:0;;13876:2:1;36024:79:0;;;13858:21:1;13915:2;13895:18;;;13888:30;-1:-1:-1;;;13934:18:1;;;13927:50;13994:18;;36024:79:0;13848:170:1;36024:79:0;42588:20:::1;42611:15;:13;:15::i;:::-;42588:38;;42637:21;42656:1;42637:18;:21::i;:::-;42683:11;::::0;-1:-1:-1;;;;;42683:11:0::1;33773:42:::0;38184:14;42671:63:::1;;;42712:10;:8;:10::i;:::-;42823:11;::::0;42816:44:::1;::::0;-1:-1:-1;;;42816:44:0;;42854:4:::1;42816:44;::::0;::::1;7644:51:1::0;42796:17:0::1;::::0;-1:-1:-1;;;;;42823:11:0::1;::::0;42816:29:::1;::::0;7617:18:1;;42816:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42892:6;::::0;42877:11:::1;::::0;42796:64;;-1:-1:-1;;;;;;42877:11:0;;::::1;42892:6:::0;::::1;42877:21;42873:95;;42921:11;::::0;42934:6:::1;::::0;42915:41:::1;::::0;-1:-1:-1;;;;;42921:11:0;;::::1;::::0;42934:6:::1;42942:13;42954:1;42942:9:::0;:13:::1;:::i;:::-;42915:5;:41::i;:::-;42999:6;::::0;42984:11:::1;::::0;-1:-1:-1;;;;;42984:11:0;;::::1;42999:6:::0;::::1;42984:21;42980:95;;43028:11;::::0;43041:6:::1;::::0;43022:41:::1;::::0;-1:-1:-1;;;;;43028:11:0;;::::1;::::0;43041:6:::1;43049:13;43061:1;43049:9:::0;:13:::1;:::i;43022:41::-;43111:6;::::0;43153::::1;::::0;43238:32:::1;::::0;-1:-1:-1;;;43238:32:0;;43264:4:::1;43238:32;::::0;::::1;7644:51:1::0;-1:-1:-1;;;;;43111:6:0;;::::1;::::0;43153;;::::1;::::0;43087:14:::1;::::0;43111:6;;43238:17:::1;::::0;7617:18:1;;43238:32:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43301;::::0;-1:-1:-1;;;43301:32:0;;43327:4:::1;43301:32;::::0;::::1;7644:51:1::0;43218:52:0;;-1:-1:-1;43281:17:0::1;::::0;-1:-1:-1;;;;;43301:17:0;::::1;::::0;::::1;::::0;7617:18:1;;43301:32:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43281:52;;43360:1;43348:9;:13;:30;;;;;43377:1;43365:9;:13;43348:30;43344:494;;;43425:15;::::0;43395:57:::1;::::0;-1:-1:-1;;;;;43395:29:0;;::::1;::::0;43425:15:::1;43442:9:::0;43395:29:::1;:57::i;:::-;43497:15;::::0;43467:57:::1;::::0;-1:-1:-1;;;;;43467:29:0;;::::1;::::0;43497:15:::1;43514:9:::0;43467:29:::1;:57::i;:::-;43556:15;::::0;43604:6:::1;::::0;43629::::1;::::0;43800:11:::1;::::0;-1:-1:-1;;;;;43556:15:0;;::::1;::::0;43539:46:::1;::::0;43604:6;::::1;::::0;43629::::1;::::0;43654:9;;43682;;43556:15:::1;::::0;;;43758:4:::1;::::0;43782:29:::1;::::0;:15:::1;:29;:::i;:::-;43539:287;::::0;::::1;::::0;;;-1:-1:-1;;;;;;43539:287:0;;;-1:-1:-1;;;;;8810:15:1;;;43539:287:0::1;::::0;::::1;8792:34:1::0;8862:15;;;8842:18;;;8835:43;8894:18;;;8887:34;;;;8937:18;;;8930:34;;;;8980:19;;;8973:35;;;;9024:19;;;9017:35;9089:15;;;9068:19;;;9061:44;9121:19;;;9114:35;;;;8726:19;;43539:287:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;43344:494;43866:12;43850:13;:28:::0;43891:16:::1;:14;:16::i;:::-;43918:10;:8;:10::i;:::-;43941:21;43965:15;:13;:15::i;:::-;43941:39;;44011:12;43995:13;:28;43991:175;;;44052:11;::::0;-1:-1:-1;;;;;44052:11:0::1;44045:49;44065:28;44081:12:::0;44065:13;:28:::1;:::i;:::-;44045:49;::::0;10921:25:1;;;10909:2;10894:18;44045:49:0::1;;;;;;;43991:175;;;44139:11;::::0;44132:22:::1;::::0;44139:11:::1;10921:25:1::0;;-1:-1:-1;;;;;44139:11:0;;::::1;::::0;44132:22:::1;::::0;10909:2:1;10894:18;44132:22:0::1;;;;;;;43991:175;36114:1;;;;;;;42493:1680::o:0;48227:145::-;48293:10;;48313:6;;48293:37;;-1:-1:-1;;;48293:37:0;;-1:-1:-1;;;;;48293:10:0;;;;:19;;:37;;48321:8;;48293:37;;19644:25:1;;;19700:2;19685:18;;19678:34;19632:2;19617:18;;19599:119;48293:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48346:18;48355:8;48346:18;;;;10921:25:1;;10909:2;10894:18;;10876:76;48346:18:0;;;;;;;;48227:145;:::o;46811:443::-;46893:11;;46886:44;;-1:-1:-1;;;46886:44:0;;46924:4;46886:44;;;7644:51:1;46861:22:0;;-1:-1:-1;;;;;46893:11:0;;46886:29;;7617:18:1;;46886:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46861:69;-1:-1:-1;46945:18:0;;46941:111;;46987:11;;46980:60;;-1:-1:-1;;;;;46987:11:0;47013:10;47025:14;46980:32;:60::i;:::-;47092:11;;47085:44;;-1:-1:-1;;;47085:44:0;;47123:4;47085:44;;;7644:51:1;47062:20:0;;-1:-1:-1;;;;;47092:11:0;;47085:29;;7617:18:1;;47085:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47062:67;-1:-1:-1;47144:16:0;;47140:107;;47184:11;;47177:58;;-1:-1:-1;;;;;47184:11:0;47210:10;47222:12;16970:211;17114:58;;-1:-1:-1;;;;;9352:32:1;;17114:58:0;;;9334:51:1;9401:18;;;9394:34;;;17087:86:0;;17107:5;;-1:-1:-1;;;17137:23:0;9307:18:1;;17114:58:0;;;;-1:-1:-1;;17114:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;17114:58:0;-1:-1:-1;;;;;;17114:58:0;;;;;;;;;;17087:19;:86::i;:::-;16970:211;;;:::o;47262:631::-;47486:6;;47479:39;;-1:-1:-1;;;47479:39:0;;47512:4;47479:39;;;7644:51:1;47459:17:0;;-1:-1:-1;;;;;47486:6:0;;47479:24;;7617:18:1;;47479:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47543:11;;47533:6;;47459:59;;-1:-1:-1;;;;;;47533:6:0;;;47543:11;;47533:21;;;;:38;;;47570:1;47558:9;:13;47533:38;47529:108;;;47594:6;;47602:11;;47588:37;;-1:-1:-1;;;;;47594:6:0;;;;47602:11;47615:9;47588:5;:37::i;:::-;47735:6;;47728:39;;-1:-1:-1;;;47728:39:0;;47761:4;47728:39;;;7644:51:1;47708:17:0;;-1:-1:-1;;;;;47735:6:0;;47728:24;;7617:18:1;;47728:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47792:11;;47782:6;;47708:59;;-1:-1:-1;;;;;;47782:6:0;;;47792:11;;47782:21;;;;:38;;;47819:1;47807:9;:13;47782:38;47778:108;;;47843:6;;47851:11;;47837:37;;-1:-1:-1;;;;;47843:6:0;;;;47851:11;47864:9;47837:5;:37::i;17189:248::-;17360:68;;-1:-1:-1;;;;;8273:15:1;;;17360:68:0;;;8255:34:1;8325:15;;8305:18;;;8298:43;8357:18;;;8350:34;;;17333:96:0;;17353:5;;-1:-1:-1;;;17383:27:0;8190:18:1;;17360:68:0;8172:218:1;17333:96:0;17189:248;;;;:::o;47901:318::-;36262:11;;;;36254:29;;;;-1:-1:-1;;;36254:29:0;;14915:2:1;36254:29:0;;;14897:21:1;14954:1;14934:18;;;14927:29;-1:-1:-1;;;14972:18:1;;;14965:35;15017:18;;36254:29:0;14887:154:1;36254:29:0;36294:19;36316:11;:9;:11::i;:::-;36379:5;;36346:39;;-1:-1:-1;;;36346:39:0;;36372:4;36346:39;;;7918:34:1;-1:-1:-1;;;;;36379:5:0;;;7968:18:1;;;7961:43;36294:33:0;;-1:-1:-1;36346:17:0;;;;;7853:18:1;;36346:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36338:63;;;;-1:-1:-1;;;36338:63:0;;15962:2:1;36338:63:0;;;15944:21:1;16001:2;15981:18;;;15974:30;-1:-1:-1;;;16020:18:1;;;16013:41;16071:18;;36338:63:0;15934:161:1;36338:63:0;47984:11:::1;::::0;48025:34:::1;::::0;-1:-1:-1;;;48025:34:0;;48053:4:::1;48025:34;::::0;::::1;7644:51:1::0;-1:-1:-1;;;;;47984:11:0;;::::1;::::0;47958:16:::1;::::0;47984:11;;48025:19:::1;::::0;7617:18:1;;48025:34:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48110:10;::::0;48007:52;;-1:-1:-1;48070:61:0::1;::::0;-1:-1:-1;;;;;48070:31:0;;::::1;::::0;48110:10:::1;48007:52:::0;48070:31:::1;:61::i;:::-;48142:10;::::0;48161:6:::1;::::0;48142:35:::1;::::0;-1:-1:-1;;;48142:35:0;;-1:-1:-1;;;;;48142:10:0;;::::1;::::0;:18:::1;::::0;:35:::1;::::0;48169:7;;48142:35:::1;;19644:25:1::0;;;19700:2;19685:18;;19678:34;19632:2;19617:18;;19599:119;48142:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48193:18;48203:7;48193:18;;;;10921:25:1::0;;10909:2;10894:18;;10876:76;48193:18:0::1;;;;;;;;36412:1;;47901:318:::0;:::o;45631:233::-;45701:11;;45714:6;;45687:34;;-1:-1:-1;;;;;45701:11:0;;;;45714:6;45687:13;:34::i;:::-;45746:11;;45759:6;;45732:34;;-1:-1:-1;;;;;45746:11:0;;;;45759:6;45732:13;:34::i;:::-;45791:6;;45799:11;;45777:34;;-1:-1:-1;;;;;45791:6:0;;;;45799:11;45777:13;:34::i;:::-;45836:6;;45844:11;;45822:34;;-1:-1:-1;;;;;45836:6:0;;;;45844:11;45822:13;:34::i;37885:211::-;37970:21;38006:14;;38002:87;;33773:42;-1:-1:-1;;;;;38037:19:0;;38064:10;38037:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37885:211;:::o;48380:745::-;48518:17;48514:56;;48380:745;;;:::o;48514:56::-;48581:15;48598:22;48624:40;48638:11;48651:12;48624:13;:40::i;:::-;48580:84;;-1:-1:-1;48580:84:0;-1:-1:-1;;;;;;48683:21:0;;48675:47;;;;-1:-1:-1;;;48675:47:0;;17004:2:1;48675:47:0;;;16986:21:1;17043:2;17023:18;;;17016:30;-1:-1:-1;;;17062:18:1;;;17055:43;17115:18;;48675:47:0;16976:163:1;48675:47:0;48753:11;-1:-1:-1;;;;;48741:23:0;:5;48747:1;48741:8;;;;;;-1:-1:-1;;;48741:8:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48741:23:0;;48733:67;;;;-1:-1:-1;;;48733:67:0;;15248:2:1;48733:67:0;;;15230:21:1;15287:2;15267:18;;;15260:30;15326:33;15306:18;;;15299:61;15377:18;;48733:67:0;15220:181:1;48733:67:0;48846:12;-1:-1:-1;;;;;48819:39:0;:5;48840:1;48825:5;:12;:16;;;;:::i;:::-;48819:23;;;;;;-1:-1:-1;;;48819:23:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48819:39:0;;48811:81;;;;-1:-1:-1;;;48811:81:0;;12078:2:1;48811:81:0;;;12060:21:1;12117:2;12097:18;;;12090:30;12156:31;12136:18;;;12129:59;12205:18;;48811:81:0;12050:179:1;48811:81:0;48903:43;-1:-1:-1;;;;;48903:31:0;;48935:7;48944:1;48903:31;:43::i;:::-;48957:54;-1:-1:-1;;;;;48957:31:0;;48989:7;48998:12;48957:31;:54::i;:::-;49022:95;49032:7;49041:12;49055:8;;49065:5;49080:4;49105:11;;49087:15;:29;;;;:::i;:::-;49022:9;:95::i;:::-;48380:745;;;;;:::o;18384:317::-;18538:39;;-1:-1:-1;;;18538:39:0;;18562:4;18538:39;;;7918:34:1;-1:-1:-1;;;;;7988:15:1;;;7968:18;;;7961:43;18515:20:0;;18580:5;;18538:15;;;;;7853:18:1;;18538:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;18623:69;;-1:-1:-1;;;;;9352:32:1;;18623:69:0;;;9334:51:1;9401:18;;;9394:34;;;18515:70:0;;-1:-1:-1;18596:97:0;;18616:5;;-1:-1:-1;;;18646:22:0;9307:18:1;;18623:69:0;9289:145:1;19597:774:0;20021:23;20047:69;20075:4;20047:69;;;;;;;;;;;;;;;;;20055:5;-1:-1:-1;;;;;20047:27:0;;;:69;;;;;:::i;:::-;20131:17;;20021:95;;-1:-1:-1;20131:21:0;20127:237;;20286:10;20275:30;;;;;;;;;;;;:::i;:::-;20267:85;;;;-1:-1:-1;;;20267:85:0;;17346:2:1;20267:85:0;;;17328:21:1;17385:2;17365:18;;;17358:30;17424:34;17404:18;;;17397:62;-1:-1:-1;;;17475:18:1;;;17468:40;17525:19;;20267:85:0;17318:232:1;45872:663:0;45956:3;-1:-1:-1;;;;;45947:12:0;:5;-1:-1:-1;;;;;45947:12:0;;45943:585;;45976:14;45993:11;:9;:11::i;:::-;46063:31;;-1:-1:-1;;;46063:31:0;;-1:-1:-1;;;;;7936:15:1;;;46063:31:0;;;7918:34:1;7988:15;;;7968:18;;;7961:43;45976:28:0;;-1:-1:-1;46020:15:0;;;;46063:19;;;;;;7853:18:1;;46063:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46063:31:0;;;;;;;;;;;;:::i;:::-;46019:75;;-1:-1:-1;46019:75:0;-1:-1:-1;;;;;;46117:19:0;;46109:52;;;;-1:-1:-1;;;46109:52:0;;14566:2:1;46109:52:0;;;14548:21:1;14605:2;14585:18;;;14578:30;-1:-1:-1;;;14624:18:1;;;14617:50;14684:18;;46109:52:0;14538:170:1;46109:52:0;-1:-1:-1;;;;;46184:17:0;;46176:50;;;;-1:-1:-1;;;46176:50:0;;11729:2:1;46176:50:0;;;11711:21:1;11768:2;11748:18;;;11741:30;-1:-1:-1;;;11787:18:1;;;11780:50;11847:18;;46176:50:0;11701:170:1;46176:50:0;-1:-1:-1;;;;;46249:21:0;;46241:51;;;;-1:-1:-1;;;46241:51:0;;11383:2:1;46241:51:0;;;11365:21:1;11422:2;11402:18;;;11395:30;-1:-1:-1;;;11441:18:1;;;11434:47;11498:18;;46241:51:0;11355:167:1;46241:51:0;46327:5;-1:-1:-1;;;;;46315:17:0;:5;46321:1;46315:8;;;;;;-1:-1:-1;;;46315:8:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46315:17:0;;46307:61;;;;-1:-1:-1;;;46307:61:0;;15248:2:1;46307:61:0;;;15230:21:1;15287:2;15267:18;;;15260:30;15326:33;15306:18;;;15299:61;15377:18;;46307:61:0;15220:181:1;46307:61:0;46418:3;-1:-1:-1;;;;;46391:30:0;:5;46412:1;46397:5;:12;:16;;;;:::i;:::-;46391:23;;;;;;-1:-1:-1;;;46391:23:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46391:30:0;;46383:72;;;;-1:-1:-1;;;46383:72:0;;12078:2:1;46383:72:0;;;12060:21:1;12117:2;12097:18;;;12090:30;12156:31;12136:18;;;12129:59;12205:18;;46383:72:0;12050:179:1;46383:72:0;46491:25;;;;;;;;-1:-1:-1;;;;;46491:25:0;;;;;;;;;;;;46470:13;;;-1:-1:-1;46470:13:0;;;:6;:13;;;;;:18;;;;;;;;;;;:46;;;;-1:-1:-1;;;;;;46470:46:0;;;;;;;;;;;;;46491:25;;46470:18;;:46;;-1:-1:-1;46470:46:0;;;;;;:::i;:::-;-1:-1:-1;;;;;;45872:663:0;;:::o;46543:260::-;-1:-1:-1;;;;;46705:18:0;;;46627:15;46705:18;;;:6;:18;;;;;;;;:28;;;;;;;;;;;46754:12;;;46785:10;;46777:18;;;;;;;;;;;;;;;;;46754:12;;;;;46644:22;;46705:28;;46785:10;;46777:18;;;46785:10;46777:18;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46777:18:0;;;;;;;;;;;;;;;;;;;;;;;46543:260;;;;;;:::o;17706:670::-;18124:10;;;18123:62;;-1:-1:-1;18140:39:0;;-1:-1:-1;;;18140:39:0;;18164:4;18140:39;;;7918:34:1;-1:-1:-1;;;;;7988:15:1;;;7968:18;;;7961:43;18140:15:0;;;;;7853:18:1;;18140:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;18123:62;18101:166;;;;-1:-1:-1;;;18101:166:0;;18117:2:1;18101:166:0;;;18099:21:1;18156:2;18136:18;;;18129:30;18195:34;18175:18;;;18168:62;-1:-1:-1;;;18246:18:1;;;18239:52;18308:19;;18101:166:0;18089:244:1;18101:166:0;18305:62;;-1:-1:-1;;;;;9352:32:1;;18305:62:0;;;9334:51:1;9401:18;;;9394:34;;;18278:90:0;;18298:5;;-1:-1:-1;;;18328:22:0;9307:18:1;;18305:62:0;9289:145:1;36971:674:0;37279:12;;37241:18;;37271:44;;;;-1:-1:-1;;;37271:44:0;;16302:2:1;37271:44:0;;;16284:21:1;16341:2;16321:18;;;16314:30;-1:-1:-1;;;16360:18:1;;;16353:45;16415:18;;37271:44:0;16274:165:1;37271:44:0;37353:43;;-1:-1:-1;;;37353:43:0;;37326:24;;-1:-1:-1;;;;;37353:25:0;;;;;:43;;37379:9;;37390:5;;37353:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37353:43:0;;;;;;;;;;;;:::i;:::-;37326:70;-1:-1:-1;37407:21:0;33712:7;37463:27;37481:9;33712:7;37463:27;:::i;:::-;37432:7;37457:1;37440:7;:14;:18;;;;:::i;:::-;37432:27;;;;;;-1:-1:-1;;;37432:27:0;;;;;;;;;;;;;;;:59;;;;:::i;:::-;37431:79;;;;:::i;:::-;37523:114;;-1:-1:-1;;;37523:114:0;;37407:103;;-1:-1:-1;;;;;;37523:65:0;;;;;:114;;37589:9;;37407:103;;37615:5;;37622:3;;37627:9;;37523:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36971:674;;;;;;;;;:::o;11790:229::-;11927:12;11959:52;11981:6;11989:4;11995:1;11998:12;11959:21;:52::i;:::-;11952:59;;11790:229;;;;;;:::o;12910:571::-;13080:12;13138:5;13113:21;:30;;13105:81;;;;-1:-1:-1;;;13105:81:0;;12791:2:1;13105:81:0;;;12773:21:1;12830:2;12810:18;;;12803:30;12869:34;12849:18;;;12842:62;-1:-1:-1;;;12920:18:1;;;12913:36;12966:19;;13105:81:0;12763:228:1;13105:81:0;9230:20;;13197:60;;;;-1:-1:-1;;;13197:60:0;;16646:2:1;13197:60:0;;;16628:21:1;16685:2;16665:18;;;16658:30;16724:31;16704:18;;;16697:59;16773:18;;13197:60:0;16618:179:1;13197:60:0;13331:12;13345:23;13372:6;-1:-1:-1;;;;;13372:11:0;13391:5;13398:4;13372:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13330:73;;;;13421:52;13439:7;13448:10;13460:12;13421:17;:52::i;:::-;13414:59;12910:571;-1:-1:-1;;;;;;;12910:571:0:o;15559:777::-;15709:12;15738:7;15734:595;;;-1:-1:-1;15769:10:0;15762:17;;15734:595;15883:17;;:21;15879:439;;16146:10;16140:17;16207:15;16194:10;16190:2;16186:19;16179:44;16094:148;16289:12;16282:20;;-1:-1:-1;;;16282:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:257::-;484:6;537:2;525:9;516:7;512:23;508:32;505:2;;;558:6;550;543:22;505:2;602:9;589:23;621:31;646:5;621:31;:::i;687:261::-;757:6;810:2;798:9;789:7;785:23;781:32;778:2;;;831:6;823;816:22;778:2;868:9;862:16;887:31;912:5;887:31;:::i;953:398::-;1021:6;1029;1082:2;1070:9;1061:7;1057:23;1053:32;1050:2;;;1103:6;1095;1088:22;1050:2;1147:9;1134:23;1166:31;1191:5;1166:31;:::i;:::-;1216:5;-1:-1:-1;1273:2:1;1258:18;;1245:32;1286:33;1245:32;1286:33;:::i;:::-;1338:7;1328:17;;;1040:311;;;;;:::o;1356:1146::-;1460:6;1468;1521:2;1509:9;1500:7;1496:23;1492:32;1489:2;;;1542:6;1534;1527:22;1489:2;1579:9;1573:16;1598:31;1623:5;1598:31;:::i;:::-;1648:5;1638:15;;;1672:2;1718;1707:9;1703:18;1697:25;1745:18;1737:6;1734:30;1731:2;;;1782:6;1774;1767:22;1731:2;1810:22;;1863:4;1855:13;;1851:27;-1:-1:-1;1841:2:1;;1897:6;1889;1882:22;1841:2;1931;1925:9;1954:60;1970:43;2010:2;1970:43;:::i;:::-;1954:60;:::i;:::-;2036:3;2060:2;2055:3;2048:15;2088:2;2083:3;2079:12;2072:19;;2119:2;2115;2111:11;2167:7;2162:2;2156;2153:1;2149:10;2145:2;2141:19;2137:28;2134:41;2131:2;;;2193:6;2185;2178:22;2131:2;2220:6;2211:15;;2235:237;2249:2;2246:1;2243:9;2235:237;;;2315:3;2309:10;2332:33;2357:7;2332:33;:::i;:::-;2378:20;;2267:1;2260:9;;;;;2418:12;;;;2450;;2235:237;;;2239:3;2491:5;2481:15;;;;;;;1479:1023;;;;;:::o;2507:325::-;2575:6;2583;2636:2;2624:9;2615:7;2611:23;2607:32;2604:2;;;2657:6;2649;2642:22;2604:2;2701:9;2688:23;2720:31;2745:5;2720:31;:::i;:::-;2770:5;2822:2;2807:18;;;;2794:32;;-1:-1:-1;;;2594:238:1:o;2837:1052::-;2942:6;2950;2958;2966;3019:3;3007:9;2998:7;2994:23;2990:33;2987:2;;;3041:6;3033;3026:22;2987:2;3085:9;3072:23;3104:31;3129:5;3104:31;:::i;:::-;3154:5;-1:-1:-1;3206:2:1;3191:18;;3178:32;;-1:-1:-1;3261:2:1;3246:18;;3233:32;3284:18;3314:14;;;3311:2;;;3346:6;3338;3331:22;3311:2;3389:6;3378:9;3374:22;3364:32;;3434:7;3427:4;3423:2;3419:13;3415:27;3405:2;;3461:6;3453;3446:22;3405:2;3489:73;3554:7;3549:2;3536:16;3531:2;3527;3523:11;3489:73;:::i;:::-;3479:83;;3615:2;3604:9;3600:18;3587:32;3571:48;;3644:2;3634:8;3631:16;3628:2;;;3665:6;3657;3650:22;3628:2;-1:-1:-1;3693:24:1;;3748:4;3740:13;;3736:27;-1:-1:-1;3726:2:1;;3782:6;3774;3767:22;3726:2;3810:73;3875:7;3870:2;3857:16;3852:2;3848;3844:11;3810:73;:::i;:::-;3800:83;;;2977:912;;;;;;;:::o;3894:937::-;3989:6;4020:2;4063;4051:9;4042:7;4038:23;4034:32;4031:2;;;4084:6;4076;4069:22;4031:2;4122:9;4116:16;4155:18;4147:6;4144:30;4141:2;;;4192:6;4184;4177:22;4141:2;4220:22;;4273:4;4265:13;;4261:27;-1:-1:-1;4251:2:1;;4307:6;4299;4292:22;4251:2;4341;4335:9;4364:60;4380:43;4420:2;4380:43;:::i;4364:60::-;4446:3;4470:2;4465:3;4458:15;4498:2;4493:3;4489:12;4482:19;;4529:2;4525;4521:11;4577:7;4572:2;4566;4563:1;4559:10;4555:2;4551:19;4547:28;4544:41;4541:2;;;4603:6;4595;4588:22;4541:2;4630:6;4621:15;;4645:156;4659:2;4656:1;4653:9;4645:156;;;4716:10;;4704:23;;4677:1;4670:9;;;;;4747:12;;;;4779;;4645:156;;4836:297;4903:6;4956:2;4944:9;4935:7;4931:23;4927:32;4924:2;;;4977:6;4969;4962:22;4924:2;5014:9;5008:16;5067:5;5060:13;5053:21;5046:5;5043:32;5033:2;;5094:6;5086;5079:22;5138:190;5197:6;5250:2;5238:9;5229:7;5225:23;5221:32;5218:2;;;5271:6;5263;5256:22;5218:2;-1:-1:-1;5299:23:1;;5208:120;-1:-1:-1;5208:120:1:o;5333:194::-;5403:6;5456:2;5444:9;5435:7;5431:23;5427:32;5424:2;;;5477:6;5469;5462:22;5424:2;-1:-1:-1;5505:16:1;;5414:113;-1:-1:-1;5414:113:1:o;5532:255::-;5611:6;5619;5672:2;5660:9;5651:7;5647:23;5643:32;5640:2;;;5693:6;5685;5678:22;5640:2;-1:-1:-1;;5721:16:1;;5777:2;5762:18;;;5756:25;5721:16;;5756:25;;-1:-1:-1;5630:157:1:o;5792:316::-;5880:6;5888;5896;5949:2;5937:9;5928:7;5924:23;5920:32;5917:2;;;5970:6;5962;5955:22;5917:2;6004:9;5998:16;5988:26;;6054:2;6043:9;6039:18;6033:25;6023:35;;6098:2;6087:9;6083:18;6077:25;6067:35;;5907:201;;;;;:::o;6113:463::-;6166:3;6204:5;6198:12;6231:6;6226:3;6219:19;6257:4;6286:2;6281:3;6277:12;6270:19;;6323:2;6316:5;6312:14;6344:3;6356:195;6370:6;6367:1;6364:13;6356:195;;;6435:13;;-1:-1:-1;;;;;6431:39:1;6419:52;;6491:12;;;;6526:15;;;;6467:1;6385:9;6356:195;;;-1:-1:-1;6567:3:1;;6174:402;-1:-1:-1;;;;;6174:402:1:o;6581:257::-;6622:3;6660:5;6654:12;6687:6;6682:3;6675:19;6703:63;6759:6;6752:4;6747:3;6743:14;6736:4;6729:5;6725:16;6703:63;:::i;:::-;6820:2;6799:15;-1:-1:-1;;6795:29:1;6786:39;;;;6827:4;6782:50;;6630:208;-1:-1:-1;;6630:208:1:o;6843:371::-;-1:-1:-1;;;;;;7028:33:1;;7016:46;;7085:13;;6998:3;;7107:61;7085:13;7157:1;7148:11;;7141:4;7129:17;;7107:61;:::i;:::-;7188:16;;;;7206:1;7184:24;;7006:208;-1:-1:-1;;;7006:208:1:o;7219:274::-;7348:3;7386:6;7380:13;7402:53;7448:6;7443:3;7436:4;7428:6;7424:17;7402:53;:::i;:::-;7471:16;;;;;7356:137;-1:-1:-1;;7356:137:1:o;9631:217::-;9778:2;9767:9;9760:21;9741:4;9798:44;9838:2;9827:9;9823:18;9815:6;9798:44;:::i;18338:329::-;18540:2;18522:21;;;18579:1;18559:18;;;18552:29;-1:-1:-1;;;18612:2:1;18597:18;;18590:36;18658:2;18643:18;;18512:155::o;19133:332::-;19340:6;19329:9;19322:25;19383:2;19378;19367:9;19363:18;19356:30;19303:4;19403:56;19455:2;19444:9;19440:18;19432:6;19403:56;:::i;19723:574::-;20014:6;20003:9;19996:25;20057:6;20052:2;20041:9;20037:18;20030:34;20100:3;20095:2;20084:9;20080:18;20073:31;19977:4;20121:57;20173:3;20162:9;20158:19;20150:6;20121:57;:::i;:::-;-1:-1:-1;;;;;20214:32:1;;;;20209:2;20194:18;;20187:60;-1:-1:-1;20278:3:1;20263:19;20256:35;20113:65;19986:311;-1:-1:-1;;;19986:311:1:o;20872:275::-;20943:2;20937:9;21008:2;20989:13;;-1:-1:-1;;20985:27:1;20973:40;;21043:18;21028:34;;21064:22;;;21025:62;21022:2;;;21090:18;;:::i;:::-;21126:2;21119:22;20917:230;;-1:-1:-1;20917:230:1:o;21152:183::-;21212:4;21245:18;21237:6;21234:30;21231:2;;;21267:18;;:::i;:::-;-1:-1:-1;21312:1:1;21308:14;21324:4;21304:25;;21221:114::o;21340:128::-;21380:3;21411:1;21407:6;21404:1;21401:13;21398:2;;;21417:18;;:::i;:::-;-1:-1:-1;21453:9:1;;21388:80::o;21473:217::-;21513:1;21539;21529:2;;-1:-1:-1;;;21564:31:1;;21618:4;21615:1;21608:15;21646:4;21571:1;21636:15;21529:2;-1:-1:-1;21675:9:1;;21519:171::o;21695:168::-;21735:7;21801:1;21797;21793:6;21789:14;21786:1;21783:21;21778:1;21771:9;21764:17;21760:45;21757:2;;;21808:18;;:::i;:::-;-1:-1:-1;21848:9:1;;21747:116::o;21868:125::-;21908:4;21936:1;21933;21930:8;21927:2;;;21941:18;;:::i;:::-;-1:-1:-1;21978:9:1;;21917:76::o;21998:258::-;22070:1;22080:113;22094:6;22091:1;22088:13;22080:113;;;22170:11;;;22164:18;22151:11;;;22144:39;22116:2;22109:10;22080:113;;;22211:6;22208:1;22205:13;22202:2;;;-1:-1:-1;;22246:1:1;22228:16;;22221:27;22051:205::o;22261:127::-;22322:10;22317:3;22313:20;22310:1;22303:31;22353:4;22350:1;22343:15;22377:4;22374:1;22367:15;22393:127;22454:10;22449:3;22445:20;22442:1;22435:31;22485:4;22482:1;22475:15;22509:4;22506:1;22499:15;22525:131;-1:-1:-1;;;;;22600:31:1;;22590:42;;22580:2;;22646:1;22643;22636:12
Swarm Source
ipfs://8fcb610c0122246695e311272c599decbbfe886742ffe66e8684ea86c8edc840
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.