Source Code
Overview
GLMR Balance
GLMR Value
$0.00Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 533229 | 1423 days ago | 0 GLMR | ||||
| 533229 | 1423 days ago | 0 GLMR | ||||
| 533229 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533205 | 1423 days ago | 0 GLMR | ||||
| 533147 | 1423 days ago | 0 GLMR | ||||
| 533147 | 1423 days ago | 0 GLMR | ||||
| 533147 | 1423 days ago | 0 GLMR | ||||
| 533147 | 1423 days ago | 0 GLMR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
StrategySolarbeamV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at moonbeam.moonscan.io on 2022-03-04
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Context.sol
pragma solidity >=0.6.0 <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 GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) public {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal virtual {
_decimals = decimals_;
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: contracts/BIFI/interfaces/solar/ISolarRouter.sol
pragma solidity >=0.6.0 <0.9.0;
interface ISolarRouter {
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function getAmountsOut(uint amountIn, address[] calldata path, uint fee) external view returns (uint[] memory amounts);
}
// File: contracts/BIFI/interfaces/common/IUniswapV2Pair.sol
pragma solidity ^0.6.0;
interface IUniswapV2Pair {
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function burn(address to) external returns (uint amount0, uint amount1);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
}
// File: contracts/BIFI/interfaces/solar/ISolarChef.sol
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;
interface ISolarChef {
function deposit(uint256 _pid, uint256 _amount) external;
function withdraw(uint256 _pid, uint256 _amount) external;
function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256, uint256, uint256);
function emergencyWithdraw(uint256 _pid) external;
function pendingTokens(uint256 _pid, address _user)
external
view
returns (address[] calldata addresses, string[] calldata symbols, uint256[] calldata decimals, uint256[] calldata amounts);
}
// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity >=0.6.0 <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 () internal {
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/utils/Pausable.sol
pragma solidity >=0.6.0 <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 () internal {
_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/BIFI/strategies/Common/StratManager.sol
pragma solidity ^0.6.12;
contract StratManager is Ownable, Pausable {
/**
* @dev Beefy Contracts:
* {keeper} - Address to manage a few lower risk features of the strat
* {strategist} - Address of the strategy author/deployer where strategist fee will go.
* {vault} - Address of the vault that controls the strategy's funds.
* {unirouter} - Address of exchange to execute swaps.
*/
address public keeper;
address public strategist;
address public unirouter;
address public vault;
address public beefyFeeRecipient;
/**
* @dev Initializes the base strategy.
* @param _keeper address to use as alternative owner.
* @param _strategist address where strategist fees go.
* @param _unirouter router to use for swaps
* @param _vault address of parent vault.
* @param _beefyFeeRecipient address where to send Beefy's fees.
*/
constructor(
address _keeper,
address _strategist,
address _unirouter,
address _vault,
address _beefyFeeRecipient
) public {
keeper = _keeper;
strategist = _strategist;
unirouter = _unirouter;
vault = _vault;
beefyFeeRecipient = _beefyFeeRecipient;
}
// checks that caller is either owner or keeper.
modifier onlyManager() {
require(msg.sender == owner() || msg.sender == keeper, "!manager");
_;
}
/**
* @dev Updates address of the strat keeper.
* @param _keeper new keeper address.
*/
function setKeeper(address _keeper) external onlyManager {
keeper = _keeper;
}
/**
* @dev Updates address where strategist fee earnings will go.
* @param _strategist new strategist address.
*/
function setStrategist(address _strategist) external {
require(msg.sender == strategist, "!strategist");
strategist = _strategist;
}
/**
* @dev Updates router that will be used for swaps.
* @param _unirouter new unirouter address.
*/
function setUnirouter(address _unirouter) external onlyOwner {
unirouter = _unirouter;
}
/**
* @dev Updates parent vault.
* @param _vault new vault address.
*/
function setVault(address _vault) external onlyOwner {
vault = _vault;
}
/**
* @dev Updates beefy fee recipient.
* @param _beefyFeeRecipient new beefy fee recipient address.
*/
function setBeefyFeeRecipient(address _beefyFeeRecipient) external onlyOwner {
beefyFeeRecipient = _beefyFeeRecipient;
}
/**
* @dev Function to synchronize balances before new user deposit.
* Can be overridden in the strategy.
*/
function beforeDeposit() external virtual {}
}
// File: contracts/BIFI/strategies/Common/FeeManager.sol
pragma solidity ^0.6.12;
abstract contract FeeManager is StratManager {
uint constant public STRATEGIST_FEE = 112;
uint constant public MAX_FEE = 1000;
uint constant public MAX_CALL_FEE = 111;
uint constant public WITHDRAWAL_FEE_CAP = 50;
uint constant public WITHDRAWAL_MAX = 10000;
uint public withdrawalFee = 10;
uint public callFee = 111;
uint public beefyFee = MAX_FEE - STRATEGIST_FEE - callFee;
function setCallFee(uint256 _fee) public onlyManager {
require(_fee <= MAX_CALL_FEE, "!cap");
callFee = _fee;
beefyFee = MAX_FEE - STRATEGIST_FEE - callFee;
}
function setWithdrawalFee(uint256 _fee) public onlyManager {
require(_fee <= WITHDRAWAL_FEE_CAP, "!cap");
withdrawalFee = _fee;
}
}
// File: contracts/BIFI/strategies/Solarbeam/StrategySolarbeamV2.sol
pragma solidity ^0.6.0;
contract StrategySolarbeamV2 is StratManager, FeeManager {
using SafeERC20 for IERC20;
using SafeMath for uint256;
// Tokens used
address public native;
address public output;
address public want;
address public lpToken0;
address public lpToken1;
// Third party contracts
address public chef;
uint256 public poolId;
bool public harvestOnDeposit;
uint256 public lastHarvest;
// Routes
address[] public outputToNativeRoute;
address[] public outputToLp0Route;
address[] public outputToLp1Route;
address[][] public rewardToOutputRoute;
/**
* @dev Event that is fired each time someone harvests the strat.
*/
event StratHarvest(address indexed harvester, uint256 wantHarvested, uint256 tvl);
event Deposit(uint256 tvl);
event Withdraw(uint256 tvl);
event ChargedFees(uint256 callFees, uint256 beefyFees, uint256 strategistFees);
constructor(
address _want,
uint256 _poolId,
address _chef,
address _vault,
address _unirouter,
address _keeper,
address _strategist,
address _beefyFeeRecipient,
address[] memory _outputToNativeRoute,
address[] memory _outputToLp0Route,
address[] memory _outputToLp1Route
) StratManager(_keeper, _strategist, _unirouter, _vault, _beefyFeeRecipient) public {
want = _want;
poolId = _poolId;
chef = _chef;
output = _outputToNativeRoute[0];
native = _outputToNativeRoute[_outputToNativeRoute.length - 1];
outputToNativeRoute = _outputToNativeRoute;
// setup lp routing
lpToken0 = IUniswapV2Pair(want).token0();
require(_outputToLp0Route[0] == output, "outputToLp0Route[0] != output");
require(_outputToLp0Route[_outputToLp0Route.length - 1] == lpToken0, "outputToLp0Route[last] != lpToken0");
outputToLp0Route = _outputToLp0Route;
lpToken1 = IUniswapV2Pair(want).token1();
require(_outputToLp1Route[0] == output, "outputToLp1Route[0] != output");
require(_outputToLp1Route[_outputToLp1Route.length - 1] == lpToken1, "outputToLp1Route[last] != lpToken1");
outputToLp1Route = _outputToLp1Route;
_giveAllowances();
}
// puts the funds to work
function deposit() public whenNotPaused {
uint256 wantBal = IERC20(want).balanceOf(address(this));
if (wantBal > 0) {
ISolarChef(chef).deposit(poolId, wantBal);
emit Deposit(balanceOf());
}
}
function withdraw(uint256 _amount) external {
require(msg.sender == vault, "!vault");
uint256 wantBal = IERC20(want).balanceOf(address(this));
if (wantBal < _amount) {
ISolarChef(chef).withdraw(poolId, _amount.sub(wantBal));
wantBal = IERC20(want).balanceOf(address(this));
}
if (wantBal > _amount) {
wantBal = _amount;
}
if (tx.origin != owner() && !paused()) {
uint256 withdrawalFeeAmount = wantBal.mul(withdrawalFee).div(WITHDRAWAL_MAX);
wantBal = wantBal.sub(withdrawalFeeAmount);
}
IERC20(want).safeTransfer(vault, wantBal);
emit Withdraw(balanceOf());
}
function beforeDeposit() external override {
if (harvestOnDeposit) {
require(msg.sender == vault, "!vault");
_harvest(tx.origin);
}
}
function harvest() external virtual {
_harvest(tx.origin);
}
function harvest(address callFeeRecipient) external virtual {
_harvest(callFeeRecipient);
}
function managerHarvest() external onlyManager {
_harvest(tx.origin);
}
// compounds earnings and charges performance fee
function _harvest(address callFeeRecipient) internal {
ISolarChef(chef).deposit(poolId, 0);
uint256 outputBal = IERC20(output).balanceOf(address(this));
if (outputBal > 0) {
chargeFees(callFeeRecipient);
addLiquidity();
uint256 wantHarvested = balanceOfWant();
deposit();
lastHarvest = block.timestamp;
emit StratHarvest(msg.sender, wantHarvested, balanceOf());
}
}
// performance fees
function chargeFees(address callFeeRecipient) internal {
if (rewardToOutputRoute.length != 0) {
for (uint i; i < rewardToOutputRoute.length; i++) {
uint256 rewardBal = IERC20(rewardToOutputRoute[i][0]).balanceOf(address(this));
if (rewardBal > 0) {
ISolarRouter(unirouter).swapExactTokensForTokens(rewardBal, 0, rewardToOutputRoute[i], address(this), now);
}
}
}
uint256 toNative = IERC20(output).balanceOf(address(this)).mul(45).div(1000);
ISolarRouter(unirouter).swapExactTokensForTokens(toNative, 0, outputToNativeRoute, address(this), now);
uint256 nativeBal = IERC20(native).balanceOf(address(this));
uint256 callFeeAmount = nativeBal.mul(callFee).div(MAX_FEE);
IERC20(native).safeTransfer(callFeeRecipient, callFeeAmount);
uint256 beefyFeeAmount = nativeBal.mul(beefyFee).div(MAX_FEE);
IERC20(native).safeTransfer(beefyFeeRecipient, beefyFeeAmount);
uint256 strategistFee = nativeBal.mul(STRATEGIST_FEE).div(MAX_FEE);
IERC20(native).safeTransfer(strategist, strategistFee);
emit ChargedFees(callFeeAmount, beefyFeeAmount, strategistFee);
}
// Adds liquidity to AMM and gets more LP tokens.
function addLiquidity() internal {
uint256 outputHalf = IERC20(output).balanceOf(address(this)).div(2);
if (lpToken0 != output) {
ISolarRouter(unirouter).swapExactTokensForTokens(outputHalf, 0, outputToLp0Route, address(this), now);
}
if (lpToken1 != output) {
ISolarRouter(unirouter).swapExactTokensForTokens(outputHalf, 0, outputToLp1Route, address(this), now);
}
uint256 lp0Bal = IERC20(lpToken0).balanceOf(address(this));
uint256 lp1Bal = IERC20(lpToken1).balanceOf(address(this));
ISolarRouter(unirouter).addLiquidity(lpToken0, lpToken1, lp0Bal, lp1Bal, 1, 1, address(this), now);
}
// calculate the total underlaying 'want' held by the strat.
function balanceOf() public view returns (uint256) {
return balanceOfWant().add(balanceOfPool());
}
// it calculates how much 'want' this contract holds.
function balanceOfWant() public view returns (uint256) {
return IERC20(want).balanceOf(address(this));
}
// it calculates how much 'want' the strategy has working in the farm.
function balanceOfPool() public view returns (uint256) {
(uint256 _amount,,,) = ISolarChef(chef).userInfo(poolId, address(this));
return _amount;
}
function rewardsAvailable() public view returns (uint256[] memory) {
(,,,uint256[] memory amounts) = ISolarChef(chef).pendingTokens(poolId, address(this));
return amounts;
}
function callReward() public view returns (uint256) {
uint256[] memory rewardBal = rewardsAvailable();
uint256 nativeBal;
try ISolarRouter(unirouter).getAmountsOut(rewardBal[0], outputToNativeRoute, 25)
returns (uint256[] memory amountOut)
{
nativeBal = amountOut[amountOut.length - 1];
} catch {}
if (rewardToOutputRoute.length != 0) {
for (uint i; i < rewardToOutputRoute.length; i++) {
try ISolarRouter(unirouter).getAmountsOut(rewardBal[i+1], rewardToOutputRoute[i], 25)
returns (uint256[] memory initialAmountOut)
{
uint256 outputBal = initialAmountOut[initialAmountOut.length - 1];
try ISolarRouter(unirouter).getAmountsOut(outputBal, outputToNativeRoute, 25)
returns (uint256[] memory finalAmountOut)
{
nativeBal += finalAmountOut[finalAmountOut.length - 1];
} catch {}
} catch {}
}
}
return nativeBal.mul(45).div(1000).mul(callFee).div(MAX_FEE);
}
function setHarvestOnDeposit(bool _harvestOnDeposit) external onlyManager {
harvestOnDeposit = _harvestOnDeposit;
if (harvestOnDeposit) {
setWithdrawalFee(0);
} else {
setWithdrawalFee(10);
}
}
// called as part of strat migration. Sends all the available funds back to the vault.
function retireStrat() external {
require(msg.sender == vault, "!vault");
ISolarChef(chef).emergencyWithdraw(poolId);
uint256 wantBal = IERC20(want).balanceOf(address(this));
IERC20(want).transfer(vault, wantBal);
}
// pauses deposits and withdraws all funds from third party systems.
function panic() public onlyManager {
pause();
ISolarChef(chef).emergencyWithdraw(poolId);
}
function pause() public onlyManager {
_pause();
_removeAllowances();
}
function unpause() external onlyManager {
_unpause();
_giveAllowances();
deposit();
}
function _giveAllowances() internal {
IERC20(want).safeApprove(chef, uint256(-1));
IERC20(output).safeApprove(unirouter, uint256(-1));
IERC20(lpToken0).safeApprove(unirouter, 0);
IERC20(lpToken0).safeApprove(unirouter, uint256(-1));
IERC20(lpToken1).safeApprove(unirouter, 0);
IERC20(lpToken1).safeApprove(unirouter, uint256(-1));
if (rewardToOutputRoute.length != 0) {
for (uint i; i < rewardToOutputRoute.length; i++) {
IERC20(rewardToOutputRoute[i][0]).safeApprove(unirouter, 0);
IERC20(rewardToOutputRoute[i][0]).safeApprove(unirouter, uint256(-1));
}
}
}
function _removeAllowances() internal {
IERC20(want).safeApprove(chef, 0);
IERC20(output).safeApprove(unirouter, 0);
IERC20(lpToken0).safeApprove(unirouter, 0);
IERC20(lpToken1).safeApprove(unirouter, 0);
if (rewardToOutputRoute.length != 0) {
for (uint i; i < rewardToOutputRoute.length; i++) {
IERC20(rewardToOutputRoute[i][0]).safeApprove(unirouter, 0);
}
}
}
function addRewardRoute(address[] memory _rewardToOutputRoute) external onlyOwner {
IERC20(_rewardToOutputRoute[0]).safeApprove(unirouter, 0);
IERC20(_rewardToOutputRoute[0]).safeApprove(unirouter, uint256(-1));
rewardToOutputRoute.push(_rewardToOutputRoute);
}
function removeLastRewardRoute() external onlyOwner {
address reward = rewardToOutputRoute[rewardToOutputRoute.length - 1][0];
if (reward != lpToken0 && reward != lpToken1) {
IERC20(reward).safeApprove(unirouter, 0);
}
rewardToOutputRoute.pop();
}
function outputToNative() external view returns (address[] memory) {
return outputToNativeRoute;
}
function outputToLp0() external view returns (address[] memory) {
return outputToLp0Route;
}
function outputToLp1() external view returns (address[] memory) {
return outputToLp1Route;
}
function rewardToOutput() external view returns (address[][] memory) {
return rewardToOutputRoute;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_want","type":"address"},{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"address","name":"_chef","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_unirouter","type":"address"},{"internalType":"address","name":"_keeper","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_beefyFeeRecipient","type":"address"},{"internalType":"address[]","name":"_outputToNativeRoute","type":"address[]"},{"internalType":"address[]","name":"_outputToLp0Route","type":"address[]"},{"internalType":"address[]","name":"_outputToLp1Route","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"callFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beefyFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"strategistFees","type":"uint256"}],"name":"ChargedFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"harvester","type":"address"},{"indexed":false,"internalType":"uint256","name":"wantHarvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"StratHarvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAX_CALL_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STRATEGIST_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWAL_FEE_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWAL_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_rewardToOutputRoute","type":"address[]"}],"name":"addRewardRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beefyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beefyFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beforeDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"callFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"callFeeRecipient","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestOnDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"native","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"output","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"outputToLp0","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"outputToLp0Route","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"outputToLp1","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"outputToLp1Route","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"outputToNative","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"outputToNativeRoute","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"panic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLastRewardRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retireStrat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToOutput","outputs":[{"internalType":"address[][]","name":"","type":"address[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardToOutputRoute","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsAvailable","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beefyFeeRecipient","type":"address"}],"name":"setBeefyFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setCallFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_harvestOnDeposit","type":"bool"}],"name":"setHarvestOnDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_unirouter","type":"address"}],"name":"setUnirouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setWithdrawalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unirouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6080604052600a600655606f6007556103096008553480156200002157600080fd5b506040516200460c3803806200460c833981016040819052620000449162000a80565b8585888a8760006200005562000482565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805460ff60a01b19168155600180546001600160a01b03199081166001600160a01b0398891617909155600280548216968816969096179095556003805486169487169490941790935560048054851692861692909217909155600580548416918516919091179055600b805483168f8516179055600f8d9055600e8054909216928c1692909217905583518491906200013757fe5b6020026020010151600a60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550826001845103815181106200017657fe5b602090810291909101810151600980546001600160a01b0319166001600160a01b039092169190911790558351620001b5916012919086019062000917565b50600b60009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156200020557600080fd5b505afa1580156200021a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000240919062000a62565b600c80546001600160a01b0319166001600160a01b03928316179055600a54835191169083906000906200027057fe5b60200260200101516001600160a01b031614620002aa5760405162461bcd60e51b8152600401620002a19062000d75565b60405180910390fd5b600c5482516001600160a01b039091169083906000198101908110620002cc57fe5b60200260200101516001600160a01b031614620002fd5760405162461bcd60e51b8152600401620002a19062000cfc565b81516200031290601390602085019062000917565b50600b60009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156200036257600080fd5b505afa15801562000377573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039d919062000a62565b600d80546001600160a01b0319166001600160a01b03928316179055600a5482519116908290600090620003cd57fe5b60200260200101516001600160a01b031614620003fe5760405162461bcd60e51b8152600401620002a19062000d3e565b600d5481516001600160a01b0390911690829060001981019081106200042057fe5b60200260200101516001600160a01b031614620004515760405162461bcd60e51b8152600401620002a19062000c74565b80516200046690601490602084019062000917565b506200047162000486565b505050505050505050505062000ebd565b3390565b600e54600b54620004b3916001600160a01b0391821691166000196200063e602090811b62001c2d17901c565b600354600a54620004e0916001600160a01b0391821691166000196200063e602090811b62001c2d17901c565b600354600c546200050c916001600160a01b03918216911660006200063e602090811b62001c2d17901c565b600354600c5462000539916001600160a01b0391821691166000196200063e602090811b62001c2d17901c565b600354600d5462000565916001600160a01b03918216911660006200063e602090811b62001c2d17901c565b600354600d5462000592916001600160a01b0391821691166000196200063e602090811b62001c2d17901c565b601554156200063c5760005b6015548110156200063a57600354601580546200060c926001600160a01b03169160009185908110620005cd57fe5b90600052602060002001600081548110620005e457fe5b600091825260209182902001546001600160a01b031692919062001c2d6200063e821b17901c565b6003546015805462000631926001600160a01b0316916000199185908110620005cd57fe5b6001016200059e565b505b565b801580620006cd5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9062000677903090869060040162000c0c565b60206040518083038186803b1580156200069057600080fd5b505afa158015620006a5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006cb919062000bd5565b155b620006ec5760405162461bcd60e51b8152600401620002a19062000e2d565b620007478363095ea7b360e01b84846040516024016200070e92919062000c26565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b03938416179052906200074c16565b505050565b6060620007a8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620007e860201b62001d2c179092919060201c565b805190915015620007475780806020019051810190620007c9919062000bb3565b620007475760405162461bcd60e51b8152600401620002a19062000de3565b6060620007f9848460008562000803565b90505b9392505050565b606082471015620008285760405162461bcd60e51b8152600401620002a19062000cb6565b6200083385620008d3565b620008525760405162461bcd60e51b8152600401620002a19062000dac565b60006060866001600160a01b0316858760405162000871919062000bee565b60006040518083038185875af1925050503d8060008114620008b0576040519150601f19603f3d011682016040523d82523d6000602084013e620008b5565b606091505b509092509050620008c8828286620008d9565b979650505050505050565b3b151590565b60608315620008ea575081620007fc565b825115620008fb5782518084602001fd5b8160405162461bcd60e51b8152600401620002a1919062000c3f565b8280548282559060005260206000209081019282156200096f579160200282015b828111156200096f57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000938565b506200097d92915062000981565b5090565b5b808211156200097d5780546001600160a01b031916815560010162000982565b80516001600160a01b0381168114620009ba57600080fd5b92915050565b600082601f830112620009d1578081fd5b81516001600160401b0380821115620009e8578283fd5b60208083026040518282820101818110858211171562000a06578687fd5b60405284815294508185019250858201818701830188101562000a2857600080fd5b600091505b8482101562000a575762000a428882620009a2565b84529282019260019190910190820162000a2d565b505050505092915050565b60006020828403121562000a74578081fd5b620007fc8383620009a2565b60008060008060008060008060008060006101608c8e03121562000aa2578687fd5b62000aae8d8d620009a2565b9a5060208c0151995062000ac68d60408e01620009a2565b985062000ad78d60608e01620009a2565b975062000ae88d60808e01620009a2565b965062000af98d60a08e01620009a2565b955062000b0a8d60c08e01620009a2565b945062000b1b8d60e08e01620009a2565b6101008d01519094506001600160401b0381111562000b38578384fd5b62000b468e828f01620009c0565b6101208e015190945090506001600160401b0381111562000b65578283fd5b62000b738e828f01620009c0565b6101408e015190935090506001600160401b0381111562000b92578182fd5b62000ba08e828f01620009c0565b9150509295989b509295989b9093969950565b60006020828403121562000bc5578081fd5b81518015158114620007fc578182fd5b60006020828403121562000be7578081fd5b5051919050565b6000825162000c0281846020870162000e8a565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b600060208252825180602084015262000c6081604085016020870162000e8a565b601f01601f19169190910160400192915050565b60208082526022908201527f6f7574707574546f4c7031526f7574655b6c6173745d20213d206c70546f6b656040820152616e3160f01b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526022908201527f6f7574707574546f4c7030526f7574655b6c6173745d20213d206c70546f6b6560408201526106e360f41b606082015260800190565b6020808252601d908201527f6f7574707574546f4c7031526f7574655b305d20213d206f7574707574000000604082015260600190565b6020808252601d908201527f6f7574707574546f4c7030526f7574655b305d20213d206f7574707574000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b60005b8381101562000ea757818101518382015260200162000e8d565b8381111562000eb7576000848401525b50505050565b61373f8062000ecd6000396000f3fe608060405234801561001057600080fd5b50600436106103995760003560e01c80638912cb8b116101e9578063c7b9d5301161010f578063e7a7250a116100ad578063fa5c9edd1161007c578063fa5c9edd14610647578063fb6177871461065c578063fbfa77cf14610664578063fd63a8871461066c57610399565b8063e7a7250a1461060f578063f1a392da14610624578063f20eaeb81461062c578063f2fde38b1461063457610399565b8063d3102589116100e9578063d3102589146105e4578063d801d946146105ec578063d92f3d73146105f4578063dfbdc4371461060757610399565b8063c7b9d530146105b6578063cc289480146105c9578063d0e30db0146105dc57610399565b8063989ef4e311610187578063aced166111610156578063aced16611461058b578063bc063e1a14610593578063be12a9781461059b578063c1a3d44c146105ae57610399565b8063989ef4e314610555578063a39219f91461055d578063a68833e514610565578063ac1e50251461057857610399565b80638e145459116101c35780638e1454591461052a57806390321e1a1461053257806396813fca1461053a57806397fd323d1461054d57610399565b80638912cb8b146105125780638bc7e8c41461051a5780638da5cb5b1461052257610399565b80633e0dc34e116102ce5780635ee167c01161026c578063748747e61161023b578063748747e6146104e75780637d38ca65146104fa5780638456cb5914610502578063877562b61461050a57610399565b80635ee167c0146104bc5780636817031b146104c4578063715018a6146104d7578063722713f7146104df57610399565b80634700d305116102a85780634700d3051461048f57806354518b1a14610497578063573fef0a1461049f5780635c975abb146104a757610399565b80633e0dc34e146104775780633f4ba83a1461047f5780634641257d1461048757610399565b80631fc8bc5d1161033b578063264658261161031557806326465826146104365780632ad5a53f146104495780632e1a7d4d1461045157806336c6cf211461046457610399565b80631fc8bc5d1461041e5780631fe4a68614610426578063257ae0de1461042e57610399565b8063115880861161037757806311588086146103e457806311b0b42d146103f957806313e120b11461040e5780631f1fcd511461041657610399565b80630587f7851461039e5780630e5c011e146103bc5780630e8fbb5a146103d1575b600080fd5b6103a661067f565b6040516103b39190613156565b60405180910390f35b6103cf6103ca366004612d48565b6106e1565b005b6103cf6103df366004612f41565b6106ed565b6103ec610774565b6040516103b391906135a6565b610401610806565b6040516103b391906130c6565b6103a6610815565b610401610875565b610401610884565b610401610893565b6104016108a2565b6103cf610444366004612f79565b6108b1565b6103ec61092d565b6103cf61045f366004612f79565b610932565b610401610472366004612f79565b610bab565b6103ec610bd2565b6103cf610bd8565b6103cf610c3f565b6103cf610c48565b6103ec610d02565b6103cf610d08565b6104af610d3d565b6040516103b3919061320d565b610401610d4d565b6103cf6104d2366004612d48565b610d5c565b6103cf610dbd565b6103ec610e46565b6103cf6104f5366004612d48565b610e66565b6103ec610ed5565b6103cf610eda565b610401610f37565b6104af610f46565b6103ec610f4f565b610401610f55565b610401610f64565b6103ec610f73565b610401610548366004612fa9565b610f79565b6103ec610fb7565b6103a661125e565b6103cf6112be565b6103cf610573366004612d48565b6113af565b6103cf610586366004612f79565b611410565b610401611483565b6103ec611492565b6104016105a9366004612f79565b611498565b6103ec6114a5565b6103cf6105c4366004612d48565b611526565b6103cf6105d7366004612d64565b611572565b6103cf61165a565b6103ec6117ae565b6103cf6117b4565b6103cf610602366004612d48565b611801565b6103ec611862565b610617611867565b6040516103b391906131c9565b6103ec6118ff565b610401611905565b6103cf610642366004612d48565b611914565b61064f6119d4565b6040516103b39190613169565b6103cf611a77565b610401611c11565b61040161067a366004612f79565b611c20565b606060148054806020026020016040519081016040528092919081815260200182805480156106d757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106b9575b5050505050905090565b6106ea81611d45565b50565b6106f5610f55565b6001600160a01b0316336001600160a01b0316148061071e57506001546001600160a01b031633145b6107435760405162461bcd60e51b815260040161073a906134e4565b60405180910390fd5b6010805460ff1916821515179081905560ff161561076a576107656000611410565b6106ea565b6106ea600a611410565b600e54600f546040516393f1a40b60e01b815260009283926001600160a01b03909116916393f1a40b916107ac9130906004016135af565b60806040518083038186803b1580156107c457600080fd5b505afa1580156107d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fc9190612ff7565b5091935050505090565b6009546001600160a01b031681565b606060128054806020026020016040519081016040528092919081815260200182805480156106d7576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116106b9575050505050905090565b600b546001600160a01b031681565b600e546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b031681565b6108b9610f55565b6001600160a01b0316336001600160a01b031614806108e257506001546001600160a01b031633145b6108fe5760405162461bcd60e51b815260040161073a906134e4565b606f81111561091f5760405162461bcd60e51b815260040161073a906133f9565b600781905561037803600855565b606f81565b6004546001600160a01b0316331461095c5760405162461bcd60e51b815260040161073a90613458565b600b546040516370a0823160e01b81526000916001600160a01b0316906370a082319061098d9030906004016130c6565b60206040518083038186803b1580156109a557600080fd5b505afa1580156109b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dd9190612f91565b905081811015610adb57600e54600f546001600160a01b039091169063441a3e7090610a098585611ea5565b6040518363ffffffff1660e01b8152600401610a269291906135ef565b600060405180830381600087803b158015610a4057600080fd5b505af1158015610a54573d6000803e3d6000fd5b5050600b546040516370a0823160e01b81526001600160a01b0390911692506370a082319150610a889030906004016130c6565b60206040518083038186803b158015610aa057600080fd5b505afa158015610ab4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad89190612f91565b90505b81811115610ae65750805b610aee610f55565b6001600160a01b0316326001600160a01b031614158015610b145750610b12610d3d565b155b15610b4c576000610b3c612710610b3660065485611ed290919063ffffffff16565b90611f0c565b9050610b488282611ea5565b9150505b600454600b54610b69916001600160a01b03918216911683611f3e565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d610b92610e46565b604051610b9f91906135a6565b60405180910390a15050565b60138181548110610bb857fe5b6000918252602090912001546001600160a01b0316905081565b600f5481565b610be0610f55565b6001600160a01b0316336001600160a01b03161480610c0957506001546001600160a01b031633145b610c255760405162461bcd60e51b815260040161073a906134e4565b610c2d611f5d565b610c35611fce565b610c3d61165a565b565b610c3d32611d45565b610c50610f55565b6001600160a01b0316336001600160a01b03161480610c7957506001546001600160a01b031633145b610c955760405162461bcd60e51b815260040161073a906134e4565b610c9d610eda565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e91610cce916004016135a6565b600060405180830381600087803b158015610ce857600080fd5b505af1158015610cfc573d6000803e3d6000fd5b50505050565b61271081565b60105460ff1615610c3d576004546001600160a01b03163314610c3f5760405162461bcd60e51b815260040161073a90613458565b600054600160a01b900460ff1690565b600c546001600160a01b031681565b610d6461211a565b6001600160a01b0316610d75610f55565b6001600160a01b031614610d9b5760405162461bcd60e51b815260040161073a90613478565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610dc561211a565b6001600160a01b0316610dd6610f55565b6001600160a01b031614610dfc5760405162461bcd60e51b815260040161073a90613478565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610e61610e53610774565b610e5b6114a5565b9061211e565b905090565b610e6e610f55565b6001600160a01b0316336001600160a01b03161480610e9757506001546001600160a01b031633145b610eb35760405162461bcd60e51b815260040161073a906134e4565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b607081565b610ee2610f55565b6001600160a01b0316336001600160a01b03161480610f0b57506001546001600160a01b031633145b610f275760405162461bcd60e51b815260040161073a906134e4565b610f2f612143565b610c3d6121a4565b600d546001600160a01b031681565b60105460ff1681565b60065481565b6000546001600160a01b031690565b6005546001600160a01b031681565b60075481565b60158281548110610f8657fe5b906000526020600020018181548110610f9b57fe5b6000918252602090912001546001600160a01b03169150829050565b60006060610fc3611867565b60035481519192506000916001600160a01b0390911690634955796c9084908490610fea57fe5b6020026020010151601260196040518463ffffffff1660e01b8152600401611014939291906135c6565b60006040518083038186803b15801561102c57600080fd5b505afa92505050801561106157506040513d6000823e601f3d908101601f1916820160405261105e9190810190612f06565b60015b61106a57611086565b8060018251038151811061107a57fe5b60200260200101519150505b6015541561122b5760005b6015548110156112295760035483516001600160a01b0390911690634955796c908590600185019081106110c157fe5b6020026020010151601584815481106110d657fe5b9060005260206000200160196040518463ffffffff1660e01b8152600401611100939291906135c6565b60006040518083038186803b15801561111857600080fd5b505afa92505050801561114d57506040513d6000823e601f3d908101601f1916820160405261114a9190810190612f06565b60015b61115657611221565b60008160018351038151811061116857fe5b60209081029190910101516003546040516312555e5b60e21b81529192506001600160a01b031690634955796c906111aa9084906012906019906004016135c6565b60006040518083038186803b1580156111c257600080fd5b505afa9250505080156111f757506040513d6000823e601f3d908101601f191682016040526111f49190810190612f06565b60015b6112005761121e565b8060018251038151811061121057fe5b602002602001015185019450505b50505b600101611091565b505b6112576103e8610b366007546112516103e8610b36602d88611ed290919063ffffffff16565b90611ed2565b9250505090565b606060138054806020026020016040519081016040528092919081815260200182805480156106d7576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116106b9575050505050905090565b6112c661211a565b6001600160a01b03166112d7610f55565b6001600160a01b0316146112fd5760405162461bcd60e51b815260040161073a90613478565b6015805460009190600019810190811061131357fe5b9060005260206000200160008154811061132957fe5b600091825260209091200154600c546001600160a01b0391821692501681148015906113635750600d546001600160a01b03828116911614155b1561138357600354611383906001600160a01b0383811691166000611c2d565b601580548061138e57fe5b6001900381819060005260206000200160006113aa9190612b84565b905550565b6113b761211a565b6001600160a01b03166113c8610f55565b6001600160a01b0316146113ee5760405162461bcd60e51b815260040161073a90613478565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b611418610f55565b6001600160a01b0316336001600160a01b0316148061144157506001546001600160a01b031633145b61145d5760405162461bcd60e51b815260040161073a906134e4565b603281111561147e5760405162461bcd60e51b815260040161073a906133f9565b600655565b6001546001600160a01b031681565b6103e881565b60128181548110610bb857fe5b600b546040516370a0823160e01b81526000916001600160a01b0316906370a08231906114d69030906004016130c6565b60206040518083038186803b1580156114ee57600080fd5b505afa158015611502573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e619190612f91565b6002546001600160a01b031633146115505760405162461bcd60e51b815260040161073a90613279565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61157a61211a565b6001600160a01b031661158b610f55565b6001600160a01b0316146115b15760405162461bcd60e51b815260040161073a90613478565b60035481516115f1916001600160a01b031690600090849082906115d157fe5b60200260200101516001600160a01b0316611c2d9092919063ffffffff16565b6003548151611613916001600160a01b0316906000199084906000906115d157fe5b601580546001810182556000919091528151611656917f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47501906020840190612ba2565b5050565b611662610d3d565b1561167f5760405162461bcd60e51b815260040161073a906133cf565b600b546040516370a0823160e01b81526000916001600160a01b0316906370a08231906116b09030906004016130c6565b60206040518083038186803b1580156116c857600080fd5b505afa1580156116dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117009190612f91565b905080156106ea57600e54600f54604051631c57762b60e31b81526001600160a01b039092169163e2bbb1589161173b9185906004016135ef565b600060405180830381600087803b15801561175557600080fd5b505af1158015611769573d6000803e3d6000fd5b505050507f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e38426611796610e46565b6040516117a391906135a6565b60405180910390a150565b60085481565b6117bc610f55565b6001600160a01b0316336001600160a01b031614806117e557506001546001600160a01b031633145b610c3f5760405162461bcd60e51b815260040161073a906134e4565b61180961211a565b6001600160a01b031661181a610f55565b6001600160a01b0316146118405760405162461bcd60e51b815260040161073a90613478565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b603281565b600e54600f5460405160016232bd9d60e01b0319815260609283926001600160a01b039091169163ffcd4263916118a29130906004016135af565b60006040518083038186803b1580156118ba57600080fd5b505afa1580156118ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118f69190810190612dfc565b94505050505090565b60115481565b600a546001600160a01b031681565b61191c61211a565b6001600160a01b031661192d610f55565b6001600160a01b0316146119535760405162461bcd60e51b815260040161073a90613478565b6001600160a01b0381166119795760405162461bcd60e51b815260040161073a9061329e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60606015805480602002602001604051908101604052809291908181526020016000905b82821015611a6e57600084815260209081902083018054604080518285028101850190915281815292830182828015611a5a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a3c575b5050505050815260200190600101906119f8565b50505050905090565b6004546001600160a01b03163314611aa15760405162461bcd60e51b815260040161073a90613458565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e91611ad2916004016135a6565b600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b5050600b546040516370a0823160e01b8152600093506001600160a01b0390911691506370a0823190611b379030906004016130c6565b60206040518083038186803b158015611b4f57600080fd5b505afa158015611b63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b879190612f91565b600b546004805460405163a9059cbb60e01b81529394506001600160a01b039283169363a9059cbb93611bbf9392169186910161313d565b602060405180830381600087803b158015611bd957600080fd5b505af1158015611bed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116569190612f5d565b6004546001600160a01b031681565b60148181548110610bb857fe5b801580611cb55750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611c6390309086906004016130da565b60206040518083038186803b158015611c7b57600080fd5b505afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190612f91565b155b611cd15760405162461bcd60e51b815260040161073a90613550565b611d278363095ea7b360e01b8484604051602401611cf092919061313d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261225b565b505050565b6060611d3b84846000856122ea565b90505b9392505050565b600e54600f54604051631c57762b60e31b81526001600160a01b039092169163e2bbb15891611d79916000906004016135ef565b600060405180830381600087803b158015611d9357600080fd5b505af1158015611da7573d6000803e3d6000fd5b5050600a546040516370a0823160e01b8152600093506001600160a01b0390911691506370a0823190611dde9030906004016130c6565b60206040518083038186803b158015611df657600080fd5b505afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e9190612f91565b9050801561165657611e3f826123ab565b611e476127bd565b6000611e516114a5565b9050611e5b61165a565b42601155337f9bc239f1724cacfb88cb1d66a2dc437467699b68a8c90d7b63110cf4b6f9241082611e8a610e46565b604051611e989291906135ef565b60405180910390a2505050565b600082821115611ec75760405162461bcd60e51b815260040161073a9061331b565b508082035b92915050565b600082611ee157506000611ecc565b82820282848281611eee57fe5b0414611d3e5760405162461bcd60e51b815260040161073a90613417565b6000808211611f2d5760405162461bcd60e51b815260040161073a90613398565b818381611f3657fe5b049392505050565b611d278363a9059cbb60e01b8484604051602401611cf092919061313d565b611f65610d3d565b611f815760405162461bcd60e51b815260040161073a9061324b565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611fb761211a565b604051611fc491906130c6565b60405180910390a1565b600e54600b54611fed916001600160a01b039182169116600019611c2d565b600354600a5461200c916001600160a01b039182169116600019611c2d565b600354600c5461202a916001600160a01b0391821691166000611c2d565b600354600c54612049916001600160a01b039182169116600019611c2d565b600354600d54612067916001600160a01b0391821691166000611c2d565b600354600d54612086916001600160a01b039182169116600019611c2d565b60155415610c3d5760005b6015548110156106ea57600354601580546120ef926001600160a01b031691600091859081106120bd57fe5b906000526020600020016000815481106120d357fe5b6000918252602090912001546001600160a01b03169190611c2d565b60035460158054612112926001600160a01b03169160001991859081106120bd57fe5b600101612091565b3390565b600082820183811015611d3e5760405162461bcd60e51b815260040161073a906132e4565b61214b610d3d565b156121685760405162461bcd60e51b815260040161073a906133cf565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fb761211a565b600e54600b546121c2916001600160a01b0391821691166000611c2d565b600354600a546121e0916001600160a01b0391821691166000611c2d565b600354600c546121fe916001600160a01b0391821691166000611c2d565b600354600d5461221c916001600160a01b0391821691166000611c2d565b60155415610c3d5760005b6015548110156106ea5760035460158054612253926001600160a01b031691600091859081106120bd57fe5b600101612227565b60606122b0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d2c9092919063ffffffff16565b805190915015611d2757808060200190518101906122ce9190612f5d565b611d275760405162461bcd60e51b815260040161073a90613506565b60608247101561230c5760405162461bcd60e51b815260040161073a90613352565b61231585612b45565b6123315760405162461bcd60e51b815260040161073a906134ad565b60006060866001600160a01b0316858760405161234e91906130aa565b60006040518083038185875af1925050503d806000811461238b576040519150601f19603f3d011682016040523d82523d6000602084013e612390565b606091505b50915091506123a0828286612b4b565b979650505050505050565b6015541561252e5760005b60155481101561252c576000601582815481106123cf57fe5b906000526020600020016000815481106123e557fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a082319061241e9030906004016130c6565b60206040518083038186803b15801561243657600080fd5b505afa15801561244a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246e9190612f91565b9050801561252357600354601580546001600160a01b03909216916338ed1739918491600091908790811061249f57fe5b9060005260206000200130426040518663ffffffff1660e01b81526004016124cb9594939291906135fd565b600060405180830381600087803b1580156124e557600080fd5b505af11580156124f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125219190810190612f06565b505b506001016123b6565b505b600a546040516370a0823160e01b81526000916125be916103e891610b3691602d916001600160a01b0316906370a082319061256e9030906004016130c6565b60206040518083038186803b15801561258657600080fd5b505afa15801561259a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112519190612f91565b6003546040516338ed173960e01b81529192506001600160a01b0316906338ed1739906125f9908490600090601290309042906004016135fd565b600060405180830381600087803b15801561261357600080fd5b505af1158015612627573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261264f9190810190612f06565b506009546040516370a0823160e01b81526000916001600160a01b0316906370a08231906126819030906004016130c6565b60206040518083038186803b15801561269957600080fd5b505afa1580156126ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d19190612f91565b905060006126f06103e8610b3660075485611ed290919063ffffffff16565b60095490915061270a906001600160a01b03168583611f3e565b60006127276103e8610b3660085486611ed290919063ffffffff16565b600554600954919250612747916001600160a01b03908116911683611f3e565b600061275a6103e8610b36866070611ed2565b60025460095491925061277a916001600160a01b03908116911683611f3e565b7fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a8383836040516127ad93929190613639565b60405180910390a1505050505050565b600a546040516370a0823160e01b8152600091612845916002916001600160a01b0316906370a08231906127f59030906004016130c6565b60206040518083038186803b15801561280d57600080fd5b505afa158015612821573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b369190612f91565b600a54600c549192506001600160a01b039182169116146128f2576003546040516338ed173960e01b81526001600160a01b03909116906338ed17399061289a908490600090601390309042906004016135fd565b600060405180830381600087803b1580156128b457600080fd5b505af11580156128c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128f09190810190612f06565b505b600a54600d546001600160a01b0390811691161461299c576003546040516338ed173960e01b81526001600160a01b03909116906338ed173990612944908490600090601490309042906004016135fd565b600060405180830381600087803b15801561295e57600080fd5b505af1158015612972573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261299a9190810190612f06565b505b600c546040516370a0823160e01b81526000916001600160a01b0316906370a08231906129cd9030906004016130c6565b60206040518083038186803b1580156129e557600080fd5b505afa1580156129f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1d9190612f91565b600d546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190612a539030906004016130c6565b60206040518083038186803b158015612a6b57600080fd5b505afa158015612a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa39190612f91565b600354600c54600d5460405162e8e33760e81b81529394506001600160a01b039283169363e8e3370093612aeb938116921690879087906001908190309042906004016130f4565b606060405180830381600087803b158015612b0557600080fd5b505af1158015612b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3d9190612fca565b505050505050565b3b151590565b60608315612b5a575081611d3e565b825115612b6a5782518084602001fd5b8160405162461bcd60e51b815260040161073a9190613218565b50805460008255906000526020600020908101906106ea9190612c07565b828054828255906000526020600020908101928215612bf7579160200282015b82811115612bf757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612bc2565b50612c03929150612c1c565b5090565b5b80821115612c035760008155600101612c08565b5b80821115612c035780546001600160a01b0319168155600101612c1d565b8035611ecc816136e6565b600082601f830112612c56578081fd5b8151612c69612c6482613676565b61364f565b818152915060208083019084810160005b84811015612cdf578151870188603f820112612c9557600080fd5b83810151612ca5612c6482613696565b81815260408b81848601011115612cbb57600080fd5b612cca838884018387016136ba565b50865250509282019290820190600101612c7a565b505050505092915050565b600082601f830112612cfa578081fd5b8151612d08612c6482613676565b818152915060208083019084810181840286018201871015612d2957600080fd5b60005b84811015612cdf57815184529282019290820190600101612d2c565b600060208284031215612d59578081fd5b8135611d3e816136e6565b60006020808385031215612d76578182fd5b823567ffffffffffffffff811115612d8c578283fd5b8301601f81018513612d9c578283fd5b8035612daa612c6482613676565b8181528381019083850185840285018601891015612dc6578687fd5b8694505b83851015612df057612ddc8982612c3b565b835260019490940193918501918501612dca565b50979650505050505050565b60008060008060808587031215612e11578283fd5b845167ffffffffffffffff80821115612e28578485fd5b818701915087601f830112612e3b578485fd5b8151612e49612c6482613676565b80828252602080830192508086018c828387028901011115612e6957898afd5b8996505b84871015612e94578051612e80816136e6565b845260019690960195928101928101612e6d565b508a01519098509350505080821115612eab578485fd5b612eb788838901612c46565b94506040870151915080821115612ecc578384fd5b612ed888838901612cea565b93506060870151915080821115612eed578283fd5b50612efa87828801612cea565b91505092959194509250565b600060208284031215612f17578081fd5b815167ffffffffffffffff811115612f2d578182fd5b612f3984828501612cea565b949350505050565b600060208284031215612f52578081fd5b8135611d3e816136fb565b600060208284031215612f6e578081fd5b8151611d3e816136fb565b600060208284031215612f8a578081fd5b5035919050565b600060208284031215612fa2578081fd5b5051919050565b60008060408385031215612fbb578182fd5b50508035926020909101359150565b600080600060608486031215612fde578283fd5b8351925060208401519150604084015190509250925092565b6000806000806080858703121561300c578384fd5b505082516020840151604085015160609095015191969095509092509050565b6000815180845260208085019450808401835b838110156130645781516001600160a01b03168752958201959082019060010161303f565b509495945050505050565b6000815480845260208085019450838352808320835b838110156130645781546001600160a01b031687529582019560019182019101613085565b600082516130bc8184602087016136ba565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b6001600160a01b03929092168252602082015260400190565b600060208252611d3e602083018461302c565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156131bc57603f198886030184526131aa85835161302c565b9450928501929085019060010161318e565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613201578351835292840192918401916001016131e5565b50909695505050505050565b901515815260200190565b60006020825282518060208401526132378160408501602087016136ba565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252600490820152630216361760e41b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526008908201526710b6b0b730b3b2b960c11b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b9182526001600160a01b0316602082015260400190565b6000848252606060208301526135df606083018561306f565b9050826040830152949350505050565b918252602082015260400190565b600086825285602083015260a0604083015261361c60a083018661306f565b6001600160a01b0394909416606083015250608001529392505050565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561366e57600080fd5b604052919050565b600067ffffffffffffffff82111561368c578081fd5b5060209081020190565b600067ffffffffffffffff8211156136ac578081fd5b50601f01601f191660200190565b60005b838110156136d55781810151838201526020016136bd565b83811115610cfc5750506000910152565b6001600160a01b03811681146106ea57600080fd5b80151581146106ea57600080fdfea26469706673582212203c9465a9a568e7befb436066f97b5865b1f164f4808cc8a2258913d9c1d02d5764736f6c634300060c003300000000000000000000000026a2abd79583155ea5d34443b62399879d42748a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000995da7dfb96b4dd1e2bd954be384a1e66cbb4b8c0000000000000000000000008cbaac87fdd9bb6c3fdb5b3c870b2443d0284fa6000000000000000000000000d3b02ff30c218c7f7756ba14bca075bf7c2c951e00000000000000000000000010aee6b5594942433e7fc2783598c979b030ef3d000000000000000000000000b2e4a61d99ca58fb8aac58bb2f8a59d63f552fc0000000000000000000000000adb9ddfa24e326dc9d337561f6c7ba2a6ecec697000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000e3e43888fa7803cdc7bea478ab327cf1a0dc11a7000000000000000000000000acc15dc74880c9944775448304b263d191c6077f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000e3e43888fa7803cdc7bea478ab327cf1a0dc11a7000000000000000000000000acc15dc74880c9944775448304b263d191c6077f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e3e43888fa7803cdc7bea478ab327cf1a0dc11a7
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103995760003560e01c80638912cb8b116101e9578063c7b9d5301161010f578063e7a7250a116100ad578063fa5c9edd1161007c578063fa5c9edd14610647578063fb6177871461065c578063fbfa77cf14610664578063fd63a8871461066c57610399565b8063e7a7250a1461060f578063f1a392da14610624578063f20eaeb81461062c578063f2fde38b1461063457610399565b8063d3102589116100e9578063d3102589146105e4578063d801d946146105ec578063d92f3d73146105f4578063dfbdc4371461060757610399565b8063c7b9d530146105b6578063cc289480146105c9578063d0e30db0146105dc57610399565b8063989ef4e311610187578063aced166111610156578063aced16611461058b578063bc063e1a14610593578063be12a9781461059b578063c1a3d44c146105ae57610399565b8063989ef4e314610555578063a39219f91461055d578063a68833e514610565578063ac1e50251461057857610399565b80638e145459116101c35780638e1454591461052a57806390321e1a1461053257806396813fca1461053a57806397fd323d1461054d57610399565b80638912cb8b146105125780638bc7e8c41461051a5780638da5cb5b1461052257610399565b80633e0dc34e116102ce5780635ee167c01161026c578063748747e61161023b578063748747e6146104e75780637d38ca65146104fa5780638456cb5914610502578063877562b61461050a57610399565b80635ee167c0146104bc5780636817031b146104c4578063715018a6146104d7578063722713f7146104df57610399565b80634700d305116102a85780634700d3051461048f57806354518b1a14610497578063573fef0a1461049f5780635c975abb146104a757610399565b80633e0dc34e146104775780633f4ba83a1461047f5780634641257d1461048757610399565b80631fc8bc5d1161033b578063264658261161031557806326465826146104365780632ad5a53f146104495780632e1a7d4d1461045157806336c6cf211461046457610399565b80631fc8bc5d1461041e5780631fe4a68614610426578063257ae0de1461042e57610399565b8063115880861161037757806311588086146103e457806311b0b42d146103f957806313e120b11461040e5780631f1fcd511461041657610399565b80630587f7851461039e5780630e5c011e146103bc5780630e8fbb5a146103d1575b600080fd5b6103a661067f565b6040516103b39190613156565b60405180910390f35b6103cf6103ca366004612d48565b6106e1565b005b6103cf6103df366004612f41565b6106ed565b6103ec610774565b6040516103b391906135a6565b610401610806565b6040516103b391906130c6565b6103a6610815565b610401610875565b610401610884565b610401610893565b6104016108a2565b6103cf610444366004612f79565b6108b1565b6103ec61092d565b6103cf61045f366004612f79565b610932565b610401610472366004612f79565b610bab565b6103ec610bd2565b6103cf610bd8565b6103cf610c3f565b6103cf610c48565b6103ec610d02565b6103cf610d08565b6104af610d3d565b6040516103b3919061320d565b610401610d4d565b6103cf6104d2366004612d48565b610d5c565b6103cf610dbd565b6103ec610e46565b6103cf6104f5366004612d48565b610e66565b6103ec610ed5565b6103cf610eda565b610401610f37565b6104af610f46565b6103ec610f4f565b610401610f55565b610401610f64565b6103ec610f73565b610401610548366004612fa9565b610f79565b6103ec610fb7565b6103a661125e565b6103cf6112be565b6103cf610573366004612d48565b6113af565b6103cf610586366004612f79565b611410565b610401611483565b6103ec611492565b6104016105a9366004612f79565b611498565b6103ec6114a5565b6103cf6105c4366004612d48565b611526565b6103cf6105d7366004612d64565b611572565b6103cf61165a565b6103ec6117ae565b6103cf6117b4565b6103cf610602366004612d48565b611801565b6103ec611862565b610617611867565b6040516103b391906131c9565b6103ec6118ff565b610401611905565b6103cf610642366004612d48565b611914565b61064f6119d4565b6040516103b39190613169565b6103cf611a77565b610401611c11565b61040161067a366004612f79565b611c20565b606060148054806020026020016040519081016040528092919081815260200182805480156106d757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106b9575b5050505050905090565b6106ea81611d45565b50565b6106f5610f55565b6001600160a01b0316336001600160a01b0316148061071e57506001546001600160a01b031633145b6107435760405162461bcd60e51b815260040161073a906134e4565b60405180910390fd5b6010805460ff1916821515179081905560ff161561076a576107656000611410565b6106ea565b6106ea600a611410565b600e54600f546040516393f1a40b60e01b815260009283926001600160a01b03909116916393f1a40b916107ac9130906004016135af565b60806040518083038186803b1580156107c457600080fd5b505afa1580156107d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fc9190612ff7565b5091935050505090565b6009546001600160a01b031681565b606060128054806020026020016040519081016040528092919081815260200182805480156106d7576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116106b9575050505050905090565b600b546001600160a01b031681565b600e546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b031681565b6108b9610f55565b6001600160a01b0316336001600160a01b031614806108e257506001546001600160a01b031633145b6108fe5760405162461bcd60e51b815260040161073a906134e4565b606f81111561091f5760405162461bcd60e51b815260040161073a906133f9565b600781905561037803600855565b606f81565b6004546001600160a01b0316331461095c5760405162461bcd60e51b815260040161073a90613458565b600b546040516370a0823160e01b81526000916001600160a01b0316906370a082319061098d9030906004016130c6565b60206040518083038186803b1580156109a557600080fd5b505afa1580156109b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dd9190612f91565b905081811015610adb57600e54600f546001600160a01b039091169063441a3e7090610a098585611ea5565b6040518363ffffffff1660e01b8152600401610a269291906135ef565b600060405180830381600087803b158015610a4057600080fd5b505af1158015610a54573d6000803e3d6000fd5b5050600b546040516370a0823160e01b81526001600160a01b0390911692506370a082319150610a889030906004016130c6565b60206040518083038186803b158015610aa057600080fd5b505afa158015610ab4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad89190612f91565b90505b81811115610ae65750805b610aee610f55565b6001600160a01b0316326001600160a01b031614158015610b145750610b12610d3d565b155b15610b4c576000610b3c612710610b3660065485611ed290919063ffffffff16565b90611f0c565b9050610b488282611ea5565b9150505b600454600b54610b69916001600160a01b03918216911683611f3e565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d610b92610e46565b604051610b9f91906135a6565b60405180910390a15050565b60138181548110610bb857fe5b6000918252602090912001546001600160a01b0316905081565b600f5481565b610be0610f55565b6001600160a01b0316336001600160a01b03161480610c0957506001546001600160a01b031633145b610c255760405162461bcd60e51b815260040161073a906134e4565b610c2d611f5d565b610c35611fce565b610c3d61165a565b565b610c3d32611d45565b610c50610f55565b6001600160a01b0316336001600160a01b03161480610c7957506001546001600160a01b031633145b610c955760405162461bcd60e51b815260040161073a906134e4565b610c9d610eda565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e91610cce916004016135a6565b600060405180830381600087803b158015610ce857600080fd5b505af1158015610cfc573d6000803e3d6000fd5b50505050565b61271081565b60105460ff1615610c3d576004546001600160a01b03163314610c3f5760405162461bcd60e51b815260040161073a90613458565b600054600160a01b900460ff1690565b600c546001600160a01b031681565b610d6461211a565b6001600160a01b0316610d75610f55565b6001600160a01b031614610d9b5760405162461bcd60e51b815260040161073a90613478565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610dc561211a565b6001600160a01b0316610dd6610f55565b6001600160a01b031614610dfc5760405162461bcd60e51b815260040161073a90613478565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610e61610e53610774565b610e5b6114a5565b9061211e565b905090565b610e6e610f55565b6001600160a01b0316336001600160a01b03161480610e9757506001546001600160a01b031633145b610eb35760405162461bcd60e51b815260040161073a906134e4565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b607081565b610ee2610f55565b6001600160a01b0316336001600160a01b03161480610f0b57506001546001600160a01b031633145b610f275760405162461bcd60e51b815260040161073a906134e4565b610f2f612143565b610c3d6121a4565b600d546001600160a01b031681565b60105460ff1681565b60065481565b6000546001600160a01b031690565b6005546001600160a01b031681565b60075481565b60158281548110610f8657fe5b906000526020600020018181548110610f9b57fe5b6000918252602090912001546001600160a01b03169150829050565b60006060610fc3611867565b60035481519192506000916001600160a01b0390911690634955796c9084908490610fea57fe5b6020026020010151601260196040518463ffffffff1660e01b8152600401611014939291906135c6565b60006040518083038186803b15801561102c57600080fd5b505afa92505050801561106157506040513d6000823e601f3d908101601f1916820160405261105e9190810190612f06565b60015b61106a57611086565b8060018251038151811061107a57fe5b60200260200101519150505b6015541561122b5760005b6015548110156112295760035483516001600160a01b0390911690634955796c908590600185019081106110c157fe5b6020026020010151601584815481106110d657fe5b9060005260206000200160196040518463ffffffff1660e01b8152600401611100939291906135c6565b60006040518083038186803b15801561111857600080fd5b505afa92505050801561114d57506040513d6000823e601f3d908101601f1916820160405261114a9190810190612f06565b60015b61115657611221565b60008160018351038151811061116857fe5b60209081029190910101516003546040516312555e5b60e21b81529192506001600160a01b031690634955796c906111aa9084906012906019906004016135c6565b60006040518083038186803b1580156111c257600080fd5b505afa9250505080156111f757506040513d6000823e601f3d908101601f191682016040526111f49190810190612f06565b60015b6112005761121e565b8060018251038151811061121057fe5b602002602001015185019450505b50505b600101611091565b505b6112576103e8610b366007546112516103e8610b36602d88611ed290919063ffffffff16565b90611ed2565b9250505090565b606060138054806020026020016040519081016040528092919081815260200182805480156106d7576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116106b9575050505050905090565b6112c661211a565b6001600160a01b03166112d7610f55565b6001600160a01b0316146112fd5760405162461bcd60e51b815260040161073a90613478565b6015805460009190600019810190811061131357fe5b9060005260206000200160008154811061132957fe5b600091825260209091200154600c546001600160a01b0391821692501681148015906113635750600d546001600160a01b03828116911614155b1561138357600354611383906001600160a01b0383811691166000611c2d565b601580548061138e57fe5b6001900381819060005260206000200160006113aa9190612b84565b905550565b6113b761211a565b6001600160a01b03166113c8610f55565b6001600160a01b0316146113ee5760405162461bcd60e51b815260040161073a90613478565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b611418610f55565b6001600160a01b0316336001600160a01b0316148061144157506001546001600160a01b031633145b61145d5760405162461bcd60e51b815260040161073a906134e4565b603281111561147e5760405162461bcd60e51b815260040161073a906133f9565b600655565b6001546001600160a01b031681565b6103e881565b60128181548110610bb857fe5b600b546040516370a0823160e01b81526000916001600160a01b0316906370a08231906114d69030906004016130c6565b60206040518083038186803b1580156114ee57600080fd5b505afa158015611502573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e619190612f91565b6002546001600160a01b031633146115505760405162461bcd60e51b815260040161073a90613279565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61157a61211a565b6001600160a01b031661158b610f55565b6001600160a01b0316146115b15760405162461bcd60e51b815260040161073a90613478565b60035481516115f1916001600160a01b031690600090849082906115d157fe5b60200260200101516001600160a01b0316611c2d9092919063ffffffff16565b6003548151611613916001600160a01b0316906000199084906000906115d157fe5b601580546001810182556000919091528151611656917f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47501906020840190612ba2565b5050565b611662610d3d565b1561167f5760405162461bcd60e51b815260040161073a906133cf565b600b546040516370a0823160e01b81526000916001600160a01b0316906370a08231906116b09030906004016130c6565b60206040518083038186803b1580156116c857600080fd5b505afa1580156116dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117009190612f91565b905080156106ea57600e54600f54604051631c57762b60e31b81526001600160a01b039092169163e2bbb1589161173b9185906004016135ef565b600060405180830381600087803b15801561175557600080fd5b505af1158015611769573d6000803e3d6000fd5b505050507f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e38426611796610e46565b6040516117a391906135a6565b60405180910390a150565b60085481565b6117bc610f55565b6001600160a01b0316336001600160a01b031614806117e557506001546001600160a01b031633145b610c3f5760405162461bcd60e51b815260040161073a906134e4565b61180961211a565b6001600160a01b031661181a610f55565b6001600160a01b0316146118405760405162461bcd60e51b815260040161073a90613478565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b603281565b600e54600f5460405160016232bd9d60e01b0319815260609283926001600160a01b039091169163ffcd4263916118a29130906004016135af565b60006040518083038186803b1580156118ba57600080fd5b505afa1580156118ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118f69190810190612dfc565b94505050505090565b60115481565b600a546001600160a01b031681565b61191c61211a565b6001600160a01b031661192d610f55565b6001600160a01b0316146119535760405162461bcd60e51b815260040161073a90613478565b6001600160a01b0381166119795760405162461bcd60e51b815260040161073a9061329e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60606015805480602002602001604051908101604052809291908181526020016000905b82821015611a6e57600084815260209081902083018054604080518285028101850190915281815292830182828015611a5a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a3c575b5050505050815260200190600101906119f8565b50505050905090565b6004546001600160a01b03163314611aa15760405162461bcd60e51b815260040161073a90613458565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e91611ad2916004016135a6565b600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b5050600b546040516370a0823160e01b8152600093506001600160a01b0390911691506370a0823190611b379030906004016130c6565b60206040518083038186803b158015611b4f57600080fd5b505afa158015611b63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b879190612f91565b600b546004805460405163a9059cbb60e01b81529394506001600160a01b039283169363a9059cbb93611bbf9392169186910161313d565b602060405180830381600087803b158015611bd957600080fd5b505af1158015611bed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116569190612f5d565b6004546001600160a01b031681565b60148181548110610bb857fe5b801580611cb55750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611c6390309086906004016130da565b60206040518083038186803b158015611c7b57600080fd5b505afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190612f91565b155b611cd15760405162461bcd60e51b815260040161073a90613550565b611d278363095ea7b360e01b8484604051602401611cf092919061313d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261225b565b505050565b6060611d3b84846000856122ea565b90505b9392505050565b600e54600f54604051631c57762b60e31b81526001600160a01b039092169163e2bbb15891611d79916000906004016135ef565b600060405180830381600087803b158015611d9357600080fd5b505af1158015611da7573d6000803e3d6000fd5b5050600a546040516370a0823160e01b8152600093506001600160a01b0390911691506370a0823190611dde9030906004016130c6565b60206040518083038186803b158015611df657600080fd5b505afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e9190612f91565b9050801561165657611e3f826123ab565b611e476127bd565b6000611e516114a5565b9050611e5b61165a565b42601155337f9bc239f1724cacfb88cb1d66a2dc437467699b68a8c90d7b63110cf4b6f9241082611e8a610e46565b604051611e989291906135ef565b60405180910390a2505050565b600082821115611ec75760405162461bcd60e51b815260040161073a9061331b565b508082035b92915050565b600082611ee157506000611ecc565b82820282848281611eee57fe5b0414611d3e5760405162461bcd60e51b815260040161073a90613417565b6000808211611f2d5760405162461bcd60e51b815260040161073a90613398565b818381611f3657fe5b049392505050565b611d278363a9059cbb60e01b8484604051602401611cf092919061313d565b611f65610d3d565b611f815760405162461bcd60e51b815260040161073a9061324b565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611fb761211a565b604051611fc491906130c6565b60405180910390a1565b600e54600b54611fed916001600160a01b039182169116600019611c2d565b600354600a5461200c916001600160a01b039182169116600019611c2d565b600354600c5461202a916001600160a01b0391821691166000611c2d565b600354600c54612049916001600160a01b039182169116600019611c2d565b600354600d54612067916001600160a01b0391821691166000611c2d565b600354600d54612086916001600160a01b039182169116600019611c2d565b60155415610c3d5760005b6015548110156106ea57600354601580546120ef926001600160a01b031691600091859081106120bd57fe5b906000526020600020016000815481106120d357fe5b6000918252602090912001546001600160a01b03169190611c2d565b60035460158054612112926001600160a01b03169160001991859081106120bd57fe5b600101612091565b3390565b600082820183811015611d3e5760405162461bcd60e51b815260040161073a906132e4565b61214b610d3d565b156121685760405162461bcd60e51b815260040161073a906133cf565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fb761211a565b600e54600b546121c2916001600160a01b0391821691166000611c2d565b600354600a546121e0916001600160a01b0391821691166000611c2d565b600354600c546121fe916001600160a01b0391821691166000611c2d565b600354600d5461221c916001600160a01b0391821691166000611c2d565b60155415610c3d5760005b6015548110156106ea5760035460158054612253926001600160a01b031691600091859081106120bd57fe5b600101612227565b60606122b0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d2c9092919063ffffffff16565b805190915015611d2757808060200190518101906122ce9190612f5d565b611d275760405162461bcd60e51b815260040161073a90613506565b60608247101561230c5760405162461bcd60e51b815260040161073a90613352565b61231585612b45565b6123315760405162461bcd60e51b815260040161073a906134ad565b60006060866001600160a01b0316858760405161234e91906130aa565b60006040518083038185875af1925050503d806000811461238b576040519150601f19603f3d011682016040523d82523d6000602084013e612390565b606091505b50915091506123a0828286612b4b565b979650505050505050565b6015541561252e5760005b60155481101561252c576000601582815481106123cf57fe5b906000526020600020016000815481106123e557fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a082319061241e9030906004016130c6565b60206040518083038186803b15801561243657600080fd5b505afa15801561244a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246e9190612f91565b9050801561252357600354601580546001600160a01b03909216916338ed1739918491600091908790811061249f57fe5b9060005260206000200130426040518663ffffffff1660e01b81526004016124cb9594939291906135fd565b600060405180830381600087803b1580156124e557600080fd5b505af11580156124f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125219190810190612f06565b505b506001016123b6565b505b600a546040516370a0823160e01b81526000916125be916103e891610b3691602d916001600160a01b0316906370a082319061256e9030906004016130c6565b60206040518083038186803b15801561258657600080fd5b505afa15801561259a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112519190612f91565b6003546040516338ed173960e01b81529192506001600160a01b0316906338ed1739906125f9908490600090601290309042906004016135fd565b600060405180830381600087803b15801561261357600080fd5b505af1158015612627573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261264f9190810190612f06565b506009546040516370a0823160e01b81526000916001600160a01b0316906370a08231906126819030906004016130c6565b60206040518083038186803b15801561269957600080fd5b505afa1580156126ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d19190612f91565b905060006126f06103e8610b3660075485611ed290919063ffffffff16565b60095490915061270a906001600160a01b03168583611f3e565b60006127276103e8610b3660085486611ed290919063ffffffff16565b600554600954919250612747916001600160a01b03908116911683611f3e565b600061275a6103e8610b36866070611ed2565b60025460095491925061277a916001600160a01b03908116911683611f3e565b7fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a8383836040516127ad93929190613639565b60405180910390a1505050505050565b600a546040516370a0823160e01b8152600091612845916002916001600160a01b0316906370a08231906127f59030906004016130c6565b60206040518083038186803b15801561280d57600080fd5b505afa158015612821573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b369190612f91565b600a54600c549192506001600160a01b039182169116146128f2576003546040516338ed173960e01b81526001600160a01b03909116906338ed17399061289a908490600090601390309042906004016135fd565b600060405180830381600087803b1580156128b457600080fd5b505af11580156128c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128f09190810190612f06565b505b600a54600d546001600160a01b0390811691161461299c576003546040516338ed173960e01b81526001600160a01b03909116906338ed173990612944908490600090601490309042906004016135fd565b600060405180830381600087803b15801561295e57600080fd5b505af1158015612972573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261299a9190810190612f06565b505b600c546040516370a0823160e01b81526000916001600160a01b0316906370a08231906129cd9030906004016130c6565b60206040518083038186803b1580156129e557600080fd5b505afa1580156129f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1d9190612f91565b600d546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190612a539030906004016130c6565b60206040518083038186803b158015612a6b57600080fd5b505afa158015612a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa39190612f91565b600354600c54600d5460405162e8e33760e81b81529394506001600160a01b039283169363e8e3370093612aeb938116921690879087906001908190309042906004016130f4565b606060405180830381600087803b158015612b0557600080fd5b505af1158015612b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3d9190612fca565b505050505050565b3b151590565b60608315612b5a575081611d3e565b825115612b6a5782518084602001fd5b8160405162461bcd60e51b815260040161073a9190613218565b50805460008255906000526020600020908101906106ea9190612c07565b828054828255906000526020600020908101928215612bf7579160200282015b82811115612bf757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612bc2565b50612c03929150612c1c565b5090565b5b80821115612c035760008155600101612c08565b5b80821115612c035780546001600160a01b0319168155600101612c1d565b8035611ecc816136e6565b600082601f830112612c56578081fd5b8151612c69612c6482613676565b61364f565b818152915060208083019084810160005b84811015612cdf578151870188603f820112612c9557600080fd5b83810151612ca5612c6482613696565b81815260408b81848601011115612cbb57600080fd5b612cca838884018387016136ba565b50865250509282019290820190600101612c7a565b505050505092915050565b600082601f830112612cfa578081fd5b8151612d08612c6482613676565b818152915060208083019084810181840286018201871015612d2957600080fd5b60005b84811015612cdf57815184529282019290820190600101612d2c565b600060208284031215612d59578081fd5b8135611d3e816136e6565b60006020808385031215612d76578182fd5b823567ffffffffffffffff811115612d8c578283fd5b8301601f81018513612d9c578283fd5b8035612daa612c6482613676565b8181528381019083850185840285018601891015612dc6578687fd5b8694505b83851015612df057612ddc8982612c3b565b835260019490940193918501918501612dca565b50979650505050505050565b60008060008060808587031215612e11578283fd5b845167ffffffffffffffff80821115612e28578485fd5b818701915087601f830112612e3b578485fd5b8151612e49612c6482613676565b80828252602080830192508086018c828387028901011115612e6957898afd5b8996505b84871015612e94578051612e80816136e6565b845260019690960195928101928101612e6d565b508a01519098509350505080821115612eab578485fd5b612eb788838901612c46565b94506040870151915080821115612ecc578384fd5b612ed888838901612cea565b93506060870151915080821115612eed578283fd5b50612efa87828801612cea565b91505092959194509250565b600060208284031215612f17578081fd5b815167ffffffffffffffff811115612f2d578182fd5b612f3984828501612cea565b949350505050565b600060208284031215612f52578081fd5b8135611d3e816136fb565b600060208284031215612f6e578081fd5b8151611d3e816136fb565b600060208284031215612f8a578081fd5b5035919050565b600060208284031215612fa2578081fd5b5051919050565b60008060408385031215612fbb578182fd5b50508035926020909101359150565b600080600060608486031215612fde578283fd5b8351925060208401519150604084015190509250925092565b6000806000806080858703121561300c578384fd5b505082516020840151604085015160609095015191969095509092509050565b6000815180845260208085019450808401835b838110156130645781516001600160a01b03168752958201959082019060010161303f565b509495945050505050565b6000815480845260208085019450838352808320835b838110156130645781546001600160a01b031687529582019560019182019101613085565b600082516130bc8184602087016136ba565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b6001600160a01b03929092168252602082015260400190565b600060208252611d3e602083018461302c565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156131bc57603f198886030184526131aa85835161302c565b9450928501929085019060010161318e565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613201578351835292840192918401916001016131e5565b50909695505050505050565b901515815260200190565b60006020825282518060208401526132378160408501602087016136ba565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252600490820152630216361760e41b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526008908201526710b6b0b730b3b2b960c11b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b9182526001600160a01b0316602082015260400190565b6000848252606060208301526135df606083018561306f565b9050826040830152949350505050565b918252602082015260400190565b600086825285602083015260a0604083015261361c60a083018661306f565b6001600160a01b0394909416606083015250608001529392505050565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561366e57600080fd5b604052919050565b600067ffffffffffffffff82111561368c578081fd5b5060209081020190565b600067ffffffffffffffff8211156136ac578081fd5b50601f01601f191660200190565b60005b838110156136d55781810151838201526020016136bd565b83811115610cfc5750506000910152565b6001600160a01b03811681146106ea57600080fd5b80151581146106ea57600080fdfea26469706673582212203c9465a9a568e7befb436066f97b5865b1f164f4808cc8a2258913d9c1d02d5764736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000026a2abd79583155ea5d34443b62399879d42748a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000995da7dfb96b4dd1e2bd954be384a1e66cbb4b8c0000000000000000000000008cbaac87fdd9bb6c3fdb5b3c870b2443d0284fa6000000000000000000000000d3b02ff30c218c7f7756ba14bca075bf7c2c951e00000000000000000000000010aee6b5594942433e7fc2783598c979b030ef3d000000000000000000000000b2e4a61d99ca58fb8aac58bb2f8a59d63f552fc0000000000000000000000000adb9ddfa24e326dc9d337561f6c7ba2a6ecec697000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000e3e43888fa7803cdc7bea478ab327cf1a0dc11a7000000000000000000000000acc15dc74880c9944775448304b263d191c6077f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000e3e43888fa7803cdc7bea478ab327cf1a0dc11a7000000000000000000000000acc15dc74880c9944775448304b263d191c6077f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e3e43888fa7803cdc7bea478ab327cf1a0dc11a7
-----Decoded View---------------
Arg [0] : _want (address): 0x26A2abD79583155EA5d34443b62399879D42748A
Arg [1] : _poolId (uint256): 0
Arg [2] : _chef (address): 0x995da7dfB96B4dd1e2bd954bE384A1e66cBB4b8c
Arg [3] : _vault (address): 0x8cbaAC87FDD9Bb6C3FdB5b3C870b2443D0284fa6
Arg [4] : _unirouter (address): 0xd3B02Ff30c218c7f7756BA14bcA075Bf7C2C951e
Arg [5] : _keeper (address): 0x10aee6B5594942433e7Fc2783598c979B030eF3D
Arg [6] : _strategist (address): 0xb2e4A61D99cA58fB8aaC58Bb2F8A59d63f552fC0
Arg [7] : _beefyFeeRecipient (address): 0xaDB9DDFA24E326dC9d337561f6c7ba2a6Ecec697
Arg [8] : _outputToNativeRoute (address[]): 0xE3e43888fa7803cDC7BEA478aB327cF1A0dc11a7,0xAcc15dC74880C9944775448304B263D191c6077F
Arg [9] : _outputToLp0Route (address[]): 0xE3e43888fa7803cDC7BEA478aB327cF1A0dc11a7,0xAcc15dC74880C9944775448304B263D191c6077F
Arg [10] : _outputToLp1Route (address[]): 0xE3e43888fa7803cDC7BEA478aB327cF1A0dc11a7
-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 00000000000000000000000026a2abd79583155ea5d34443b62399879d42748a
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 000000000000000000000000995da7dfb96b4dd1e2bd954be384a1e66cbb4b8c
Arg [3] : 0000000000000000000000008cbaac87fdd9bb6c3fdb5b3c870b2443d0284fa6
Arg [4] : 000000000000000000000000d3b02ff30c218c7f7756ba14bca075bf7c2c951e
Arg [5] : 00000000000000000000000010aee6b5594942433e7fc2783598c979b030ef3d
Arg [6] : 000000000000000000000000b2e4a61d99ca58fb8aac58bb2f8a59d63f552fc0
Arg [7] : 000000000000000000000000adb9ddfa24e326dc9d337561f6c7ba2a6ecec697
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [9] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [12] : 000000000000000000000000e3e43888fa7803cdc7bea478ab327cf1a0dc11a7
Arg [13] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [15] : 000000000000000000000000e3e43888fa7803cdc7bea478ab327cf1a0dc11a7
Arg [16] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [18] : 000000000000000000000000e3e43888fa7803cdc7bea478ab327cf1a0dc11a7
Deployed Bytecode Sourcemap
45724:11803:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57296:106;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49372:105;;;;;;:::i;:::-;;:::i;:::-;;54207:262;;;;;;:::i;:::-;;:::i;52635:170::-;;;:::i;:::-;;;;;;;:::i;45876:21::-;;;:::i;:::-;;;;;;;:::i;57062:112::-;;;:::i;45932:19::-;;;:::i;46050:::-;;;:::i;42310:25::-;;;:::i;42342:24::-;;;:::i;45238:200::-;;;;;;:::i;:::-;;:::i;44950:39::-;;;:::i;48361:731::-;;;;;;:::i;:::-;;:::i;46234:33::-;;;;;;:::i;:::-;;:::i;46076:21::-;;;:::i;55137:121::-;;;:::i;49290:74::-;;;:::i;54911:115::-;;;:::i;45049:43::-;;;:::i;49100:182::-;;;:::i;40598:86::-;;;:::i;:::-;;;;;;;:::i;45958:23::-;;;:::i;44170:86::-;;;;;;:::i;:::-;;:::i;38957:148::-;;;:::i;52253:113::-;;;:::i;43442:92::-;;;;;;:::i;:::-;;:::i;44860:41::-;;;:::i;55034:95::-;;;:::i;45988:23::-;;;:::i;46106:28::-;;;:::i;45101:30::-;;;:::i;38306:87::-;;;:::i;42400:32::-;;;:::i;45140:25::-;;;:::i;46314:38::-;;;;;;:::i;:::-;;:::i;53017:1182::-;;;:::i;57182:106::-;;;:::i;56753:301::-;;;:::i;44391:134::-;;;;;;:::i;:::-;;:::i;45446:154::-;;;;;;:::i;:::-;;:::i;42282:21::-;;;:::i;44908:35::-;;;:::i;46191:36::-;;;;;;:::i;:::-;;:::i;52433:118::-;;;:::i;43679:155::-;;;;;;:::i;:::-;;:::i;56452:293::-;;;;;;:::i;:::-;;:::i;48102:251::-;;;:::i;45172:57::-;;;:::i;49485:85::-;;;:::i;43966:102::-;;;;;;:::i;:::-;;:::i;44998:44::-;;;:::i;52813:196::-;;;:::i;:::-;;;;;;;:::i;46141:26::-;;;:::i;45904:21::-;;;:::i;39260:244::-;;;;;;:::i;:::-;;:::i;57410:114::-;;;:::i;:::-;;;;;;;:::i;54569:260::-;;;:::i;42373:20::-;;;:::i;46274:33::-;;;;;;:::i;:::-;;:::i;57296:106::-;57342:16;57378;57371:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57371:23:0;;;;;;;;;;;;;;;;;;;;;;;57296:106;:::o;49372:105::-;49443:26;49452:16;49443:8;:26::i;:::-;49372:105;:::o;54207:262::-;43259:7;:5;:7::i;:::-;-1:-1:-1;;;;;43245:21:0;:10;-1:-1:-1;;;;;43245:21:0;;:45;;;-1:-1:-1;43284:6:0;;-1:-1:-1;;;;;43284:6:0;43270:10;:20;43245:45;43237:66;;;;-1:-1:-1;;;43237:66:0;;;;;;;:::i;:::-;;;;;;;;;54292:16:::1;:36:::0;;-1:-1:-1;;54292:36:0::1;::::0;::::1;;;::::0;;;;::::1;54345:16;54341:121;;;54378:19;54395:1;54378:16;:19::i;:::-;54341:121;;;54430:20;54447:2;54430:16;:20::i;52635:170::-:0;52735:4;;52750:6;;52724:48;;-1:-1:-1;;;52724:48:0;;52681:7;;;;-1:-1:-1;;;;;52735:4:0;;;;52724:25;;:48;;52766:4;;52724:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;52701:71:0;;-1:-1:-1;;;;52635:170:0;:::o;45876:21::-;;;-1:-1:-1;;;;;45876:21:0;;:::o;57062:112::-;57111:16;57147:19;57140:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57140:26:0;;;;;;;;;;;;;;;;;;;;;;57062:112;:::o;45932:19::-;;;-1:-1:-1;;;;;45932:19:0;;:::o;46050:::-;;;-1:-1:-1;;;;;46050:19:0;;:::o;42310:25::-;;;-1:-1:-1;;;;;42310:25:0;;:::o;42342:24::-;;;-1:-1:-1;;;;;42342:24:0;;:::o;45238:200::-;43259:7;:5;:7::i;:::-;-1:-1:-1;;;;;43245:21:0;:10;-1:-1:-1;;;;;43245:21:0;;:45;;;-1:-1:-1;43284:6:0;;-1:-1:-1;;;;;43284:6:0;43270:10;:20;43245:45;43237:66;;;;-1:-1:-1;;;43237:66:0;;;;;;;:::i;:::-;44986:3:::1;45310:4;:20;;45302:37;;;;-1:-1:-1::0;;;45302:37:0::1;;;;;;;:::i;:::-;45360:7;:14:::0;;;45396:24;:34:::1;45385:8;:45:::0;45238:200::o;44950:39::-;44986:3;44950:39;:::o;48361:731::-;48438:5;;-1:-1:-1;;;;;48438:5:0;48424:10;:19;48416:38;;;;-1:-1:-1;;;48416:38:0;;;;;;;:::i;:::-;48492:4;;48485:37;;-1:-1:-1;;;48485:37:0;;48467:15;;-1:-1:-1;;;;;48492:4:0;;48485:22;;:37;;48516:4;;48485:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48467:55;;48549:7;48539;:17;48535:167;;;48584:4;;48599:6;;-1:-1:-1;;;;;48584:4:0;;;;48573:25;;48607:20;:7;48619;48607:11;:20::i;:::-;48573:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48660:4:0;;48653:37;;-1:-1:-1;;;48653:37:0;;-1:-1:-1;;;;;48660:4:0;;;;-1:-1:-1;48653:22:0;;-1:-1:-1;48653:37:0;;48684:4;;48653:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48643:47;;48535:167;48728:7;48718;:17;48714:67;;;-1:-1:-1;48762:7:0;48714:67;48810:7;:5;:7::i;:::-;-1:-1:-1;;;;;48797:20:0;:9;-1:-1:-1;;;;;48797:20:0;;;:33;;;;;48822:8;:6;:8::i;:::-;48821:9;48797:33;48793:199;;;48847:27;48877:46;45087:5;48877:26;48889:13;;48877:7;:11;;:26;;;;:::i;:::-;:30;;:46::i;:::-;48847:76;-1:-1:-1;48948:32:0;:7;48847:76;48948:11;:32::i;:::-;48938:42;;48793:199;;49030:5;;49011:4;;49004:41;;-1:-1:-1;;;;;49011:4:0;;;;49030:5;49037:7;49004:25;:41::i;:::-;49063:21;49072:11;:9;:11::i;:::-;49063:21;;;;;;:::i;:::-;;;;;;;;48361:731;;:::o;46234:33::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46234:33:0;;-1:-1:-1;46234:33:0;:::o;46076:21::-;;;;:::o;55137:121::-;43259:7;:5;:7::i;:::-;-1:-1:-1;;;;;43245:21:0;:10;-1:-1:-1;;;;;43245:21:0;;:45;;;-1:-1:-1;43284:6:0;;-1:-1:-1;;;;;43284:6:0;43270:10;:20;43245:45;43237:66;;;;-1:-1:-1;;;43237:66:0;;;;;;;:::i;:::-;55188:10:::1;:8;:10::i;:::-;55211:17;:15;:17::i;:::-;55241:9;:7;:9::i;:::-;55137:121::o:0;49290:74::-;49337:19;49346:9;49337:8;:19::i;54911:115::-;43259:7;:5;:7::i;:::-;-1:-1:-1;;;;;43245:21:0;:10;-1:-1:-1;;;;;43245:21:0;;:45;;;-1:-1:-1;43284:6:0;;-1:-1:-1;;;;;43284:6:0;43270:10;:20;43245:45;43237:66;;;;-1:-1:-1;;;43237:66:0;;;;;;;:::i;:::-;54958:7:::1;:5;:7::i;:::-;54987:4;::::0;55011:6:::1;::::0;54976:42:::1;::::0;-1:-1:-1;;;54976:42:0;;-1:-1:-1;;;;;54987:4:0;;::::1;::::0;54976:34:::1;::::0;:42:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54911:115::o:0;45049:43::-;45087:5;45049:43;:::o;49100:182::-;49158:16;;;;49154:121;;;49213:5;;-1:-1:-1;;;;;49213:5:0;49199:10;:19;49191:38;;;;-1:-1:-1;;;49191:38:0;;;;;;;:::i;40598:86::-;40645:4;40669:7;-1:-1:-1;;;40669:7:0;;;;;40598:86::o;45958:23::-;;;-1:-1:-1;;;;;45958:23:0;;:::o;44170:86::-;38537:12;:10;:12::i;:::-;-1:-1:-1;;;;;38526:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38526:23:0;;38518:68;;;;-1:-1:-1;;;38518:68:0;;;;;;;:::i;:::-;44234:5:::1;:14:::0;;-1:-1:-1;;;;;;44234:14:0::1;-1:-1:-1::0;;;;;44234:14:0;;;::::1;::::0;;;::::1;::::0;;44170:86::o;38957:148::-;38537:12;:10;:12::i;:::-;-1:-1:-1;;;;;38526:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38526:23:0;;38518:68;;;;-1:-1:-1;;;38518:68:0;;;;;;;:::i;:::-;39064:1:::1;39048:6:::0;;39027:40:::1;::::0;-1:-1:-1;;;;;39048:6:0;;::::1;::::0;39027:40:::1;::::0;39064:1;;39027:40:::1;39095:1;39078:19:::0;;-1:-1:-1;;;;;;39078:19:0::1;::::0;;38957:148::o;52253:113::-;52295:7;52322:36;52342:15;:13;:15::i;:::-;52322;:13;:15::i;:::-;:19;;:36::i;:::-;52315:43;;52253:113;:::o;43442:92::-;43259:7;:5;:7::i;:::-;-1:-1:-1;;;;;43245:21:0;:10;-1:-1:-1;;;;;43245:21:0;;:45;;;-1:-1:-1;43284:6:0;;-1:-1:-1;;;;;43284:6:0;43270:10;:20;43245:45;43237:66;;;;-1:-1:-1;;;43237:66:0;;;;;;;:::i;:::-;43510:6:::1;:16:::0;;-1:-1:-1;;;;;;43510:16:0::1;-1:-1:-1::0;;;;;43510:16:0;;;::::1;::::0;;;::::1;::::0;;43442:92::o;44860:41::-;44898:3;44860:41;:::o;55034:95::-;43259:7;:5;:7::i;:::-;-1:-1:-1;;;;;43245:21:0;:10;-1:-1:-1;;;;;43245:21:0;;:45;;;-1:-1:-1;43284:6:0;;-1:-1:-1;;;;;43284:6:0;43270:10;:20;43245:45;43237:66;;;;-1:-1:-1;;;43237:66:0;;;;;;;:::i;:::-;55081:8:::1;:6;:8::i;:::-;55102:19;:17;:19::i;45988:23::-:0;;;-1:-1:-1;;;;;45988:23:0;;:::o;46106:28::-;;;;;;:::o;45101:30::-;;;;:::o;38306:87::-;38352:7;38379:6;-1:-1:-1;;;;;38379:6:0;38306:87;:::o;42400:32::-;;;-1:-1:-1;;;;;42400:32:0;;:::o;45140:25::-;;;;:::o;46314:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46314:38:0;;-1:-1:-1;46314:38:0;;-1:-1:-1;46314:38:0:o;53017:1182::-;53060:7;53080:26;53109:18;:16;:18::i;:::-;53183:9;;53208:12;;53080:47;;-1:-1:-1;53138:17:0;;-1:-1:-1;;;;;53183:9:0;;;;53170:37;;53080:47;;53138:17;;53208:12;;;;;;;;;;53222:19;53243:2;53170:76;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53170:76:0;;;;;;;;;;;;:::i;:::-;;;53166:215;;;;;53329:9;53358:1;53339:9;:16;:20;53329:31;;;;;;;;;;;;;;53317:43;;53256:116;53166:215;53397:19;:26;:31;53393:726;;53450:6;53445:663;53462:19;:26;53458:30;;53445:663;;;53531:9;;53556:14;;-1:-1:-1;;;;;53531:9:0;;;;53518:37;;53556:9;;53531;53566:3;;;53556:14;;;;;;;;;;;;53572:19;53592:1;53572:22;;;;;;;;;;;;;;;53596:2;53518:81;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53518:81:0;;;;;;;;;;;;:::i;:::-;;;53514:579;;;;;53701:17;53721:16;53764:1;53738:16;:23;:27;53721:45;;;;;;;;;;;;;;;;;;53806:9;;53793:73;;-1:-1:-1;;;53793:73:0;;53721:45;;-1:-1:-1;;;;;;53806:9:0;;53793:37;;:73;;53721:45;;53842:19;;53863:2;;53793:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53793:73:0;;;;;;;;;;;;:::i;:::-;;;53789:276;;;;;53991:14;54030:1;54006:14;:21;:25;53991:41;;;;;;;;;;;;;;53978:54;;;;53888:168;53789:276;53617:467;;53514:579;53490:3;;53445:663;;;;53393:726;54138:53;44939:4;54138:40;54170:7;;54138:27;54160:4;54138:17;54152:2;54138:9;:13;;:17;;;;:::i;:27::-;:31;;:40::i;:53::-;54131:60;;;;53017:1182;:::o;57182:106::-;57228:16;57264;57257:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57257:23:0;;;;;;;;;;;;;;;;;;;;;;57182:106;:::o;56753:301::-;38537:12;:10;:12::i;:::-;-1:-1:-1;;;;;38526:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38526:23:0;;38518:68;;;;-1:-1:-1;;;38518:68:0;;;;;;;:::i;:::-;56833:19:::1;56853:26:::0;;56816:14:::1;::::0;56833:19;-1:-1:-1;;56853:30:0;;;56833:51;::::1;;;;;;;;;;;;56885:1;56833:54;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;56912:8:::1;::::0;-1:-1:-1;;;;;56833:54:0;;::::1;::::0;-1:-1:-1;56912:8:0::1;56902:18:::0;::::1;::::0;::::1;::::0;:40:::1;;-1:-1:-1::0;56934:8:0::1;::::0;-1:-1:-1;;;;;56924:18:0;;::::1;56934:8:::0;::::1;56924:18;;56902:40;56898:113;;;56986:9;::::0;56959:40:::1;::::0;-1:-1:-1;;;;;56959:26:0;;::::1;::::0;56986:9:::1;;56959:26;:40::i;:::-;57021:19;:25;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38597:1;56753:301::o:0;44391:134::-;38537:12;:10;:12::i;:::-;-1:-1:-1;;;;;38526:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38526:23:0;;38518:68;;;;-1:-1:-1;;;38518:68:0;;;;;;;:::i;:::-;44479:17:::1;:38:::0;;-1:-1:-1;;;;;;44479:38:0::1;-1:-1:-1::0;;;;;44479:38:0;;;::::1;::::0;;;::::1;::::0;;44391:134::o;45446:154::-;43259:7;:5;:7::i;:::-;-1:-1:-1;;;;;43245:21:0;:10;-1:-1:-1;;;;;43245:21:0;;:45;;;-1:-1:-1;43284:6:0;;-1:-1:-1;;;;;43284:6:0;43270:10;:20;43245:45;43237:66;;;;-1:-1:-1;;;43237:66:0;;;;;;;:::i;:::-;45040:2:::1;45524:4;:26;;45516:43;;;;-1:-1:-1::0;;;45516:43:0::1;;;;;;;:::i;:::-;45572:13;:20:::0;45446:154::o;42282:21::-;;;-1:-1:-1;;;;;42282:21:0;;:::o;44908:35::-;44939:4;44908:35;:::o;46191:36::-;;;;;;;;;;52433:118;52513:4;;52506:37;;-1:-1:-1;;;52506:37:0;;52479:7;;-1:-1:-1;;;;;52513:4:0;;52506:22;;:37;;52537:4;;52506:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43679:155::-;43765:10;;-1:-1:-1;;;;;43765:10:0;43751;:24;43743:48;;;;-1:-1:-1;;;43743:48:0;;;;;;;:::i;:::-;43802:10;:24;;-1:-1:-1;;;;;;43802:24:0;-1:-1:-1;;;;;43802:24:0;;;;;;;;;;43679:155::o;56452:293::-;38537:12;:10;:12::i;:::-;-1:-1:-1;;;;;38526:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38526:23:0;;38518:68;;;;-1:-1:-1;;;38518:68:0;;;;;;;:::i;:::-;56589:9:::1;::::0;56552:23;;56545:57:::1;::::0;-1:-1:-1;;;;;56589:9:0::1;::::0;::::1;::::0;56552:20;;56589:9;;56552:23:::1;;;;;;;;;;-1:-1:-1::0;;;;;56545:43:0::1;;;:57;;;;;:::i;:::-;56657:9;::::0;56620:23;;56613:67:::1;::::0;-1:-1:-1;;;;;56657:9:0::1;::::0;-1:-1:-1;;56676:2:0;56620:20;;56657:9:::1;::::0;56620:23:::1;;;56613:67;56691:19;:46:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;56691:46:0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;56452:293:::0;:::o;48102:251::-;40924:8;:6;:8::i;:::-;40923:9;40915:38;;;;-1:-1:-1;;;40915:38:0;;;;;;;:::i;:::-;48178:4:::1;::::0;48171:37:::1;::::0;-1:-1:-1;;;48171:37:0;;48153:15:::1;::::0;-1:-1:-1;;;;;48178:4:0::1;::::0;48171:22:::1;::::0;:37:::1;::::0;48202:4:::1;::::0;48171:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48153:55:::0;-1:-1:-1;48225:11:0;;48221:125:::1;;48264:4;::::0;48278:6:::1;::::0;48253:41:::1;::::0;-1:-1:-1;;;48253:41:0;;-1:-1:-1;;;;;48264:4:0;;::::1;::::0;48253:24:::1;::::0;:41:::1;::::0;48286:7;;48253:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48314:20;48322:11;:9;:11::i;:::-;48314:20;;;;;;:::i;:::-;;;;;;;;40964:1;48102:251::o:0;45172:57::-;;;;:::o;49485:85::-;43259:7;:5;:7::i;:::-;-1:-1:-1;;;;;43245:21:0;:10;-1:-1:-1;;;;;43245:21:0;;:45;;;-1:-1:-1;43284:6:0;;-1:-1:-1;;;;;43284:6:0;43270:10;:20;43245:45;43237:66;;;;-1:-1:-1;;;43237:66:0;;;;;;;:::i;43966:102::-;38537:12;:10;:12::i;:::-;-1:-1:-1;;;;;38526:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38526:23:0;;38518:68;;;;-1:-1:-1;;;38518:68:0;;;;;;;:::i;:::-;44038:9:::1;:22:::0;;-1:-1:-1;;;;;;44038:22:0::1;-1:-1:-1::0;;;;;44038:22:0;;;::::1;::::0;;;::::1;::::0;;43966:102::o;44998:44::-;45040:2;44998:44;:::o;52813:196::-;52934:4;;52954:6;;52923:53;;-1:-1:-1;;;;;;52923:53:0;;52862:16;;;;-1:-1:-1;;;;;52934:4:0;;;;52923:30;;:53;;52970:4;;52923:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52923:53:0;;;;;;;;;;;;:::i;:::-;52891:85;-1:-1:-1;;;;;52813:196:0;:::o;46141:26::-;;;;:::o;45904:21::-;;;-1:-1:-1;;;;;45904:21:0;;:::o;39260:244::-;38537:12;:10;:12::i;:::-;-1:-1:-1;;;;;38526:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38526:23:0;;38518:68;;;;-1:-1:-1;;;38518:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39349:22:0;::::1;39341:73;;;;-1:-1:-1::0;;;39341:73:0::1;;;;;;;:::i;:::-;39451:6;::::0;;39430:38:::1;::::0;-1:-1:-1;;;;;39430:38:0;;::::1;::::0;39451:6;::::1;::::0;39430:38:::1;::::0;::::1;39479:6;:17:::0;;-1:-1:-1;;;;;;39479:17:0::1;-1:-1:-1::0;;;;;39479:17:0;;;::::1;::::0;;;::::1;::::0;;39260:244::o;57410:114::-;57459:18;57497:19;57490:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57490:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57410:114;:::o;54569:260::-;54634:5;;-1:-1:-1;;;;;54634:5:0;54620:10;:19;54612:38;;;;-1:-1:-1;;;54612:38:0;;;;;;;:::i;:::-;54674:4;;54698:6;;54663:42;;-1:-1:-1;;;54663:42:0;;-1:-1:-1;;;;;54674:4:0;;;;54663:34;;:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54743:4:0;;54736:37;;-1:-1:-1;;;54736:37:0;;54718:15;;-1:-1:-1;;;;;;54743:4:0;;;;-1:-1:-1;54736:22:0;;:37;;54767:4;;54736:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54791:4;;54806:5;;;54784:37;;-1:-1:-1;;;54784:37:0;;54718:55;;-1:-1:-1;;;;;;54791:4:0;;;;54784:21;;:37;;54806:5;;;54718:55;;54784:37;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42373:20::-;;;-1:-1:-1;;;;;42373:20:0;;:::o;46274:33::-;;;;;;;;;;31685:622;32055:10;;;32054:62;;-1:-1:-1;32071:39:0;;-1:-1:-1;;;32071:39:0;;-1:-1:-1;;;;;32071:15:0;;;;;:39;;32095:4;;32102:7;;32071:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;32054:62;32046:152;;;;-1:-1:-1;;;32046:152:0;;;;;;;:::i;:::-;32209:90;32229:5;32259:22;;;32283:7;32292:5;32236:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;32236:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;32236:62:0;-1:-1:-1;;;;;;32236:62:0;;;;;;;;;;32209:19;:90::i;:::-;31685:622;;;:::o;26021:195::-;26124:12;26156:52;26178:6;26186:4;26192:1;26195:12;26156:21;:52::i;:::-;26149:59;;26021:195;;;;;;:::o;49633:486::-;49708:4;;49722:6;;49697:35;;-1:-1:-1;;;49697:35:0;;-1:-1:-1;;;;;49708:4:0;;;;49697:24;;:35;;49708:4;;49697:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49770:6:0;;49763:39;;-1:-1:-1;;;49763:39:0;;49743:17;;-1:-1:-1;;;;;;49770:6:0;;;;-1:-1:-1;49763:24:0;;:39;;49796:4;;49763:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49743:59;-1:-1:-1;49817:13:0;;49813:299;;49847:28;49858:16;49847:10;:28::i;:::-;49890:14;:12;:14::i;:::-;49919:21;49943:15;:13;:15::i;:::-;49919:39;;49973:9;:7;:9::i;:::-;50013:15;49999:11;:29;50061:10;50048:52;50073:13;50088:11;:9;:11::i;:::-;50048:52;;;;;;;:::i;:::-;;;;;;;;49813:299;49633:486;;:::o;7087:158::-;7145:7;7178:1;7173;:6;;7165:49;;;;-1:-1:-1;;;7165:49:0;;;;;;;:::i;:::-;-1:-1:-1;7232:5:0;;;7087:158;;;;;:::o;7504:220::-;7562:7;7586:6;7582:20;;-1:-1:-1;7601:1:0;7594:8;;7582:20;7625:5;;;7629:1;7625;:5;:1;7649:5;;;;;:10;7641:56;;;;-1:-1:-1;;;7641:56:0;;;;;;;:::i;8202:153::-;8260:7;8292:1;8288;:5;8280:44;;;;-1:-1:-1;;;8280:44:0;;;;;;;:::i;:::-;8346:1;8342;:5;;;;;;;8202:153;-1:-1:-1;;;8202:153:0:o;31026:177::-;31109:86;31129:5;31159:23;;;31184:2;31188:5;31136:58;;;;;;;;;:::i;41657:120::-;41201:8;:6;:8::i;:::-;41193:41;;;;-1:-1:-1;;;41193:41:0;;;;;;;:::i;:::-;41726:5:::1;41716:15:::0;;-1:-1:-1;;;;41716:15:0::1;::::0;;41747:22:::1;41756:12;:10;:12::i;:::-;41747:22;;;;;;:::i;:::-;;;;;;;;41657:120::o:0;55266:702::-;55338:4;;55320;;55313:43;;-1:-1:-1;;;;;55320:4:0;;;;55338;-1:-1:-1;;55313:24:0;:43::i;:::-;55394:9;;55374:6;;55367:50;;-1:-1:-1;;;;;55374:6:0;;;;55394:9;-1:-1:-1;;55367:26:0;:50::i;:::-;55459:9;;55437:8;;55430:42;;-1:-1:-1;;;;;55437:8:0;;;;55459:9;;55430:28;:42::i;:::-;55512:9;;55490:8;;55483:52;;-1:-1:-1;;;;;55490:8:0;;;;55512:9;-1:-1:-1;;55483:28:0;:52::i;:::-;55577:9;;55555:8;;55548:42;;-1:-1:-1;;;;;55555:8:0;;;;55577:9;;55548:28;:42::i;:::-;55630:9;;55608:8;;55601:52;;-1:-1:-1;;;;;55608:8:0;;;;55630:9;-1:-1:-1;;55601:28:0;:52::i;:::-;55670:19;:26;:31;55666:295;;55723:6;55718:232;55735:19;:26;55731:30;;55718:232;;;55833:9;;55794:19;:22;;55787:59;;-1:-1:-1;;;;;55833:9:0;;;;55814:1;;55794:22;;;;;;;;;;;;;55817:1;55794:25;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55794:25:0;;55787:59;:45;:59::i;:::-;55911:9;;55872:19;:22;;55865:69;;-1:-1:-1;;;;;55911:9:0;;-1:-1:-1;;55930:2:0;55892:1;;55872:22;;;;;55865:69;55763:3;;55718:232;;667:106;755:10;667:106;:::o;6625:179::-;6683:7;6715:5;;;6739:6;;;;6731:46;;;;-1:-1:-1;;;6731:46:0;;;;;;;:::i;41398:118::-;40924:8;:6;:8::i;:::-;40923:9;40915:38;;;;-1:-1:-1;;;40915:38:0;;;;;;;:::i;:::-;41458:7:::1;:14:::0;;-1:-1:-1;;;;41458:14:0::1;-1:-1:-1::0;;;41458:14:0::1;::::0;;41488:20:::1;41495:12;:10;:12::i;55976:468::-:0;56050:4;;56032;;56025:33;;-1:-1:-1;;;;;56032:4:0;;;;56050;;56025:24;:33::i;:::-;56096:9;;56076:6;;56069:40;;-1:-1:-1;;;;;56076:6:0;;;;56096:9;;56069:26;:40::i;:::-;56151:9;;56129:8;;56122:42;;-1:-1:-1;;;;;56129:8:0;;;;56151:9;;56122:28;:42::i;:::-;56204:9;;56182:8;;56175:42;;-1:-1:-1;;;;;56182:8:0;;;;56204:9;;56175:28;:42::i;:::-;56234:19;:26;:31;56230:207;;56287:6;56282:144;56299:19;:26;56295:30;;56282:144;;;56397:9;;56358:19;:22;;56351:59;;-1:-1:-1;;;;;56397:9:0;;;;56378:1;;56358:22;;;;;56351:59;56327:3;;56282:144;;33331:761;33755:23;33781:69;33809:4;33781:69;;;;;;;;;;;;;;;;;33789:5;-1:-1:-1;;;;;33781:27:0;;;:69;;;;;:::i;:::-;33865:17;;33755:95;;-1:-1:-1;33865:21:0;33861:224;;34007:10;33996:30;;;;;;;;;;;;:::i;:::-;33988:85;;;;-1:-1:-1;;;33988:85:0;;;;;;;:::i;27073:530::-;27200:12;27258:5;27233:21;:30;;27225:81;;;;-1:-1:-1;;;27225:81:0;;;;;;;:::i;:::-;27325:18;27336:6;27325:10;:18::i;:::-;27317:60;;;;-1:-1:-1;;;27317:60:0;;;;;;;:::i;:::-;27451:12;27465:23;27492:6;-1:-1:-1;;;;;27492:11:0;27512:5;27520:4;27492:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27450:75;;;;27543:52;27561:7;27570:10;27582:12;27543:17;:52::i;:::-;27536:59;27073:530;-1:-1:-1;;;;;;;27073:530:0:o;50152:1268::-;50222:19;:26;:31;50218:412;;50275:6;50270:349;50287:19;:26;50283:30;;50270:349;;;50339:17;50366:19;50386:1;50366:22;;;;;;;;;;;;;;;50389:1;50366:25;;;;;;;;;;;;;;;;;;50359:58;;-1:-1:-1;;;50359:58:0;;-1:-1:-1;;;;;50366:25:0;;;;50359:43;;:58;;50411:4;;50359:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50339:78;-1:-1:-1;50440:13:0;;50436:168;;50491:9;;50541:19;:22;;-1:-1:-1;;;;;50491:9:0;;;;50478:48;;50527:9;;50491;;50541:19;50561:1;;50541:22;;;;;;;;;;;;;50573:4;50580:3;50478:106;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50478:106:0;;;;;;;;;;;;:::i;:::-;;50436:168;-1:-1:-1;50315:3:0;;50270:349;;;;50218:412;50668:6;;50661:39;;-1:-1:-1;;;50661:39:0;;50642:16;;50661:57;;50713:4;;50661:47;;50705:2;;-1:-1:-1;;;;;50668:6:0;;50661:24;;:39;;50694:4;;50661:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:57::-;50742:9;;50729:102;;-1:-1:-1;;;50729:102:0;;50642:76;;-1:-1:-1;;;;;;50742:9:0;;50729:48;;:102;;50642:76;;50742:9;;50791:19;;50820:4;;50827:3;;50729:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50729:102:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;50871:6:0;;50864:39;;-1:-1:-1;;;50864:39:0;;50844:17;;-1:-1:-1;;;;;50871:6:0;;50864:24;;:39;;50897:4;;50864:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50844:59;;50916:21;50940:35;44939:4;50940:22;50954:7;;50940:9;:13;;:22;;;;:::i;:35::-;50993:6;;50916:59;;-1:-1:-1;50986:60:0;;-1:-1:-1;;;;;50993:6:0;51014:16;50916:59;50986:27;:60::i;:::-;51059:22;51084:36;44939:4;51084:23;51098:8;;51084:9;:13;;:23;;;;:::i;:36::-;51159:17;;51138:6;;51059:61;;-1:-1:-1;51131:62:0;;-1:-1:-1;;;;;51138:6:0;;;;51159:17;51059:61;51131:27;:62::i;:::-;51206:21;51230:42;44939:4;51230:29;:9;44898:3;51230:13;:29::i;:42::-;51311:10;;51290:6;;51206:66;;-1:-1:-1;51283:54:0;;-1:-1:-1;;;;;51290:6:0;;;;51311:10;51206:66;51283:27;:54::i;:::-;51355:57;51367:13;51382:14;51398:13;51355:57;;;;;;;;:::i;:::-;;;;;;;;50152:1268;;;;;;:::o;51483:696::-;51555:6;;51548:39;;-1:-1:-1;;;51548:39:0;;51527:18;;51548:46;;51592:1;;-1:-1:-1;;;;;51555:6:0;;51548:24;;:39;;51581:4;;51548:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:46::-;51623:6;;51611:8;;51527:67;;-1:-1:-1;;;;;;51611:8:0;;;51623:6;;51611:18;51607:152;;51659:9;;51646:101;;-1:-1:-1;;;51646:101:0;;-1:-1:-1;;;;;51659:9:0;;;;51646:48;;:101;;51695:10;;51659:9;;51710:16;;51736:4;;51743:3;;51646:101;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51646:101:0;;;;;;;;;;;;:::i;:::-;;51607:152;51787:6;;51775:8;;-1:-1:-1;;;;;51775:8:0;;;51787:6;;51775:18;51771:152;;51823:9;;51810:101;;-1:-1:-1;;;51810:101:0;;-1:-1:-1;;;;;51823:9:0;;;;51810:48;;:101;;51859:10;;51823:9;;51874:16;;51900:4;;51907:3;;51810:101;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51810:101:0;;;;;;;;;;;;:::i;:::-;;51771:152;51959:8;;51952:41;;-1:-1:-1;;;51952:41:0;;51935:14;;-1:-1:-1;;;;;51959:8:0;;51952:26;;:41;;51987:4;;51952:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52028:8;;52021:41;;-1:-1:-1;;;52021:41:0;;51935:58;;-1:-1:-1;52004:14:0;;-1:-1:-1;;;;;52028:8:0;;;;52021:26;;:41;;52056:4;;52021:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52086:9;;52110:8;;52120;;52073:98;;-1:-1:-1;;;52073:98:0;;52004:58;;-1:-1:-1;;;;;;52086:9:0;;;;52073:36;;:98;;52110:8;;;52120;;52130:6;;52004:58;;52086:9;;;;52160:4;;52167:3;;52073:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;51483:696;;;:::o;23103:422::-;23470:20;23509:8;;;23103:422::o;29613:742::-;29728:12;29757:7;29753:595;;;-1:-1:-1;29788:10:0;29781:17;;29753:595;29902:17;;:21;29898:439;;30165:10;30159:17;30226:15;30213:10;30209:2;30205:19;30198:44;30113:148;30308:12;30301:20;;-1:-1:-1;;;30301:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:130;72:20;;97:33;72:20;97:33;:::i;1781:716::-;;1919:3;1912:4;1904:6;1900:17;1896:27;1886:2;;-1:-1;;1927:12;1886:2;1967:6;1961:13;1989:90;2004:74;2071:6;2004:74;:::i;:::-;1989:90;:::i;:::-;2107:21;;;1980:99;-1:-1;2151:4;2164:14;;;;2139:17;;;2259:1;2244:247;2269:6;2266:1;2263:13;2244:247;;;2345:3;2339:10;2143:6;2327:23;3633:3;3614:17;2327:23;3614:17;3610:27;3600:2;;2259:1;;3641:12;3600:2;2151:4;2327:23;;3675:13;3703:65;3718:49;3760:6;3718:49;:::i;3703:65::-;3788:6;3781:5;3774:21;3812:17;3892:3;3812:17;3883:6;2327:23;3874:16;;3871:25;3868:2;;;2259:1;;3899:12;3868:2;3919:39;3951:6;2151:4;3850:5;3846:16;3812:17;2327:23;3812:17;3919:39;:::i;:::-;-1:-1;2357:71;;-1:-1;;2442:14;;;;2470;;;;2291:1;2284:9;2244:247;;;2248:14;;;;;1879:618;;;;:::o;2523:722::-;;2651:3;2644:4;2636:6;2632:17;2628:27;2618:2;;-1:-1;;2659:12;2618:2;2699:6;2693:13;2721:80;2736:64;2793:6;2736:64;:::i;2721:80::-;2829:21;;;2712:89;-1:-1;2873:4;2886:14;;;;2861:17;;;2975;;;2966:27;;;;2963:36;-1:-1;2960:2;;;3012:1;;3002:12;2960:2;3037:1;3022:217;3047:6;3044:1;3041:13;3022:217;;;4187:13;;3115:61;;3190:14;;;;3218;;;;3069:1;3062:9;3022:217;;4250:241;;4354:2;4342:9;4333:7;4329:23;4325:32;4322:2;;;-1:-1;;4360:12;4322:2;85:6;72:20;97:33;124:5;97:33;:::i;4498:377::-;;4627:2;;4615:9;4606:7;4602:23;4598:32;4595:2;;;-1:-1;;4633:12;4595:2;4691:17;4678:31;4729:18;4721:6;4718:30;4715:2;;;-1:-1;;4751:12;4715:2;4827:22;;411:4;399:17;;395:27;-1:-1;385:2;;-1:-1;;426:12;385:2;473:6;460:20;495:80;510:64;567:6;510:64;:::i;495:80::-;603:21;;;660:14;;;;635:17;;;749;;;740:27;;;;737:36;-1:-1;734:2;;;-1:-1;;776:12;734:2;-1:-1;802:10;;796:206;821:6;818:1;815:13;796:206;;;901:37;934:3;922:10;901:37;:::i;:::-;889:50;;843:1;836:9;;;;;953:14;;;;981;;796:206;;;-1:-1;4771:88;4589:286;-1:-1;;;;;;;4589:286::o;4882:1208::-;;;;;5158:3;5146:9;5137:7;5133:23;5129:33;5126:2;;;-1:-1;;5165:12;5126:2;5216:17;5210:24;5254:18;;5246:6;5243:30;5240:2;;;-1:-1;;5276:12;5240:2;5378:6;5367:9;5363:22;;;1162:3;1155:4;1147:6;1143:17;1139:27;1129:2;;-1:-1;;1170:12;1129:2;1210:6;1204:13;1232:80;1247:64;1304:6;1247:64;:::i;1232:80::-;1318:16;1354:6;1347:5;1340:21;1384:4;;1401:3;1397:14;1390:21;;1384:4;1376:6;1372:17;1506:3;1384:4;;1490:6;1486:17;1376:6;1477:27;;1474:36;1471:2;;;-1:-1;;1513:12;1471:2;-1:-1;1539:10;;1533:217;1558:6;1555:1;1552:13;1533:217;;;226:6;220:13;238:33;265:5;238:33;:::i;:::-;1626:61;;1580:1;1573:9;;;;;1701:14;;;;1729;;1533:217;;;-1:-1;5438:18;;5432:25;5296:99;;-1:-1;5432:25;-1:-1;;;5466:30;;;5463:2;;;-1:-1;;5499:12;5463:2;5529:99;5620:7;5611:6;5600:9;5596:22;5529:99;:::i;:::-;5519:109;;5686:2;5675:9;5671:18;5665:25;5651:39;;5254:18;5702:6;5699:30;5696:2;;;-1:-1;;5732:12;5696:2;5762:89;5843:7;5834:6;5823:9;5819:22;5762:89;:::i;:::-;5752:99;;5909:2;5898:9;5894:18;5888:25;5874:39;;5254:18;5925:6;5922:30;5919:2;;;-1:-1;;5955:12;5919:2;;5985:89;6066:7;6057:6;6046:9;6042:22;5985:89;:::i;:::-;5975:99;;;5120:970;;;;;;;:::o;6097:392::-;;6237:2;6225:9;6216:7;6212:23;6208:32;6205:2;;;-1:-1;;6243:12;6205:2;6294:17;6288:24;6332:18;6324:6;6321:30;6318:2;;;-1:-1;;6354:12;6318:2;6384:89;6465:7;6456:6;6445:9;6441:22;6384:89;:::i;:::-;6374:99;6199:290;-1:-1;;;;6199:290::o;6496:235::-;;6597:2;6585:9;6576:7;6572:23;6568:32;6565:2;;;-1:-1;;6603:12;6565:2;3330:6;3317:20;3342:30;3366:5;3342:30;:::i;6738:257::-;;6850:2;6838:9;6829:7;6825:23;6821:32;6818:2;;;-1:-1;;6856:12;6818:2;3465:6;3459:13;3477:30;3501:5;3477:30;:::i;7002:241::-;;7106:2;7094:9;7085:7;7081:23;7077:32;7074:2;;;-1:-1;;7112:12;7074:2;-1:-1;4039:20;;7068:175;-1:-1;7068:175::o;7250:263::-;;7365:2;7353:9;7344:7;7340:23;7336:32;7333:2;;;-1:-1;;7371:12;7333:2;-1:-1;4187:13;;7327:186;-1:-1;7327:186::o;7520:366::-;;;7641:2;7629:9;7620:7;7616:23;7612:32;7609:2;;;-1:-1;;7647:12;7609:2;-1:-1;;4039:20;;;7799:2;7838:22;;;4039:20;;-1:-1;7603:283::o;7893:535::-;;;;8042:2;8030:9;8021:7;8017:23;8013:32;8010:2;;;-1:-1;;8048:12;8010:2;4193:6;4187:13;8100:74;;8211:2;8265:9;8261:22;4187:13;8219:74;;8330:2;8384:9;8380:22;4187:13;8338:74;;8004:424;;;;;:::o;8435:672::-;;;;;8601:3;8589:9;8580:7;8576:23;8572:33;8569:2;;;-1:-1;;8608:12;8569:2;-1:-1;;4187:13;;8771:2;8821:22;;4187:13;8890:2;8940:22;;4187:13;9009:2;9059:22;;;4187:13;;;;;-1:-1;4187:13;;-1:-1;8563:544;-1:-1;8563:544::o;10150:670::-;;10333:5;37657:12;39019:6;39014:3;39007:19;39056:4;;39051:3;39047:14;10345:83;;39056:4;10499:5;36990:14;-1:-1;10538:260;10563:6;10560:1;10557:13;10538:260;;;10624:13;;-1:-1;;;;;40061:54;9950:37;;9268:14;;;;38505;;;;4729:18;10578:9;10538:260;;;-1:-1;10804:10;;10264:556;-1:-1;;;;;10264:556::o;11588:709::-;;11775:5;37804:12;39019:6;39014:3;39007:19;39056:4;;39051:3;39047:14;11787:93;;37153:3;-1:-1;37143:14;39056:4;-1:-1;37172:18;-1:-1;11987:288;12012:6;12009:1;12006:13;11987:288;;;41839:11;;-1:-1;;;;;40061:54;9950:37;;9268:14;;;;4729:18;38617:14;;;;12027:9;11987:288;;21172:271;;14396:5;37657:12;14507:52;14552:6;14547:3;14540:4;14533:5;14529:16;14507:52;:::i;:::-;14571:16;;;;;21306:137;-1:-1;;21306:137::o;21450:222::-;-1:-1;;;;;40061:54;;;;9950:37;;21577:2;21562:18;;21548:124::o;21924:333::-;-1:-1;;;;;40061:54;;;9950:37;;40061:54;;22243:2;22228:18;;9950:37;22079:2;22064:18;;22050:207::o;22264:1036::-;-1:-1;;;;;40061:54;;;9950:37;;40061:54;;;22768:2;22753:18;;9950:37;22851:2;22836:18;;21003:37;;;;22934:2;22919:18;;21003:37;;;;23025:3;23010:19;;14678:58;;;;40072:42;23102:19;;14678:58;40061:54;;;23201:3;23186:19;;9950:37;23285:3;23270:19;;21003:37;;;;22603:3;22588:19;;22574:726::o;23307:333::-;-1:-1;;;;;40061:54;;;;9950:37;;23626:2;23611:18;;21003:37;23462:2;23447:18;;23433:207::o;23647:370::-;;23824:2;23845:17;23838:47;23899:108;23824:2;23813:9;23809:18;23993:6;23899:108;:::i;24024:470::-;;24251:2;;24240:9;24236:18;24251:2;24272:17;24265:47;24326:158;12608:5;37657:12;39019:6;39014:3;39007:19;39047:14;24240:9;39047:14;12620:118;;39047:14;24251:2;12795:6;12791:17;24240:9;12782:27;;12770:39;;24251:2;12905:5;36990:14;-1:-1;12944:405;12969:6;12966:1;12963:13;12944:405;;;13021:20;;24240:9;13025:4;13021:20;;13016:3;13009:33;9448:96;9540:3;13076:6;13070:13;9448:96;:::i;:::-;13090:122;-1:-1;13328:14;;;;38505;;;;12991:1;12984:9;12944:405;;;-1:-1;24318:166;;24222:272;-1:-1;;;;;;;24222:272::o;24501:370::-;24678:2;24692:47;;;37657:12;;24663:18;;;39007:19;;;24501:370;;24678:2;36990:14;;;;39047;;;;24501:370;13835:260;13860:6;13857:1;13854:13;13835:260;;;13921:13;;21003:37;;38505:14;;;;9712;;;;13882:1;13875:9;13835:260;;;-1:-1;24745:116;;24649:222;-1:-1;;;;;;24649:222::o;24878:210::-;40291:13;;40284:21;14190:34;;24999:2;24984:18;;24970:118::o;25095:310::-;;25242:2;25263:17;25256:47;15193:5;37657:12;39019:6;25242:2;25231:9;25227:18;39007:19;15287:52;15332:6;39047:14;25231:9;39047:14;25242:2;15313:5;15309:16;15287:52;:::i;:::-;41947:7;41931:14;-1:-1;;41927:28;15351:39;;;;39047:14;15351:39;;25213:192;-1:-1;;25213:192::o;25412:416::-;25612:2;25626:47;;;15627:2;25597:18;;;39007:19;-1:-1;;;39047:14;;;15643:43;15705:12;;;25583:245::o;25835:416::-;26035:2;26049:47;;;15956:2;26020:18;;;39007:19;-1:-1;;;39047:14;;;15972:34;16025:12;;;26006:245::o;26258:416::-;26458:2;26472:47;;;16276:2;26443:18;;;39007:19;16312:34;39047:14;;;16292:55;-1:-1;;;16367:12;;;16360:30;16409:12;;;26429:245::o;26681:416::-;26881:2;26895:47;;;16660:2;26866:18;;;39007:19;16696:29;39047:14;;;16676:50;16745:12;;;26852:245::o;27104:416::-;27304:2;27318:47;;;16996:2;27289:18;;;39007:19;17032:32;39047:14;;;17012:53;17084:12;;;27275:245::o;27527:416::-;27727:2;27741:47;;;17335:2;27712:18;;;39007:19;17371:34;39047:14;;;17351:55;-1:-1;;;17426:12;;;17419:30;17468:12;;;27698:245::o;27950:416::-;28150:2;28164:47;;;17719:2;28135:18;;;39007:19;17755:28;39047:14;;;17735:49;17803:12;;;28121:245::o;28373:416::-;28573:2;28587:47;;;18054:2;28558:18;;;39007:19;-1:-1;;;39047:14;;;18070:39;18128:12;;;28544:245::o;28796:416::-;28996:2;29010:47;;;18379:1;28981:18;;;39007:19;-1:-1;;;39047:14;;;18394:27;18440:12;;;28967:245::o;29219:416::-;29419:2;29433:47;;;18691:2;29404:18;;;39007:19;18727:34;39047:14;;;18707:55;-1:-1;;;18782:12;;;18775:25;18819:12;;;29390:245::o;29642:416::-;29842:2;29856:47;;;19070:1;29827:18;;;39007:19;-1:-1;;;39047:14;;;19085:29;19133:12;;;29813:245::o;30065:416::-;30265:2;30279:47;;;30250:18;;;39007:19;19420:34;39047:14;;;19400:55;19474:12;;;30236:245::o;30488:416::-;30688:2;30702:47;;;19725:2;30673:18;;;39007:19;19761:31;39047:14;;;19741:52;19812:12;;;30659:245::o;30911:416::-;31111:2;31125:47;;;20063:1;31096:18;;;39007:19;-1:-1;;;39047:14;;;20078:31;20128:12;;;31082:245::o;31334:416::-;31534:2;31548:47;;;20379:2;31519:18;;;39007:19;20415:34;39047:14;;;20395:55;-1:-1;;;20470:12;;;20463:34;20516:12;;;31505:245::o;31757:416::-;31957:2;31971:47;;;20767:2;31942:18;;;39007:19;20803:34;39047:14;;;20783:55;-1:-1;;;20858:12;;;20851:46;20916:12;;;31928:245::o;32180:222::-;21003:37;;;32307:2;32292:18;;32278:124::o;32409:333::-;21003:37;;;-1:-1;;;;;40061:54;32728:2;32713:18;;9950:37;32564:2;32549:18;;32535:207::o;32749:604::-;;21033:5;21010:3;21003:37;32988:2;33106;33095:9;33091:18;33084:48;33146:105;32988:2;32977:9;32973:18;33237:6;33146:105;:::i;:::-;33138:113;;40747:24;33339:2;33328:9;33324:18;14678:58;32959:394;;;;;;:::o;33360:349::-;21003:37;;;33695:2;33680:18;;14678:58;33523:2;33508:18;;33494:215::o;33716:826::-;;21033:5;21010:3;21003:37;14729:5;34183:2;34172:9;34168:18;14678:58;34010:3;34220:2;34209:9;34205:18;34198:48;34260:105;34010:3;33999:9;33995:19;34351:6;34260:105;:::i;:::-;-1:-1;;;;;40061:54;;;;34444:2;34429:18;;9950:37;-1:-1;34527:3;34512:19;21003:37;34252:113;33981:561;-1:-1;;;33981:561::o;34889:444::-;21003:37;;;35236:2;35221:18;;21003:37;;;;35319:2;35304:18;;21003:37;35072:2;35057:18;;35043:290::o;35340:256::-;35402:2;35396:9;35428:17;;;35503:18;35488:34;;35524:22;;;35485:62;35482:2;;;35560:1;;35550:12;35482:2;35402;35569:22;35380:216;;-1:-1;35380:216::o;35603:304::-;;35762:18;35754:6;35751:30;35748:2;;;-1:-1;;35784:12;35748:2;-1:-1;35829:4;35817:17;;;35882:15;;35685:222::o;36546:322::-;;36690:18;36682:6;36679:30;36676:2;;;-1:-1;;36712:12;36676:2;-1:-1;41947:7;36766:17;-1:-1;;36762:33;36853:4;36843:15;;36613:255::o;41274:268::-;41339:1;41346:101;41360:6;41357:1;41354:13;41346:101;;;41427:11;;;41421:18;41408:11;;;41401:39;41382:2;41375:10;41346:101;;;41462:6;41459:1;41456:13;41453:2;;;-1:-1;;41339:1;41509:16;;41502:27;41323:219::o;42078:117::-;-1:-1;;;;;40061:54;;42137:35;;42127:2;;42186:1;;42176:12;42202:111;42283:5;40291:13;40284:21;42261:5;42258:32;42248:2;;42304:1;;42294:12
Swarm Source
ipfs://3c9465a9a568e7befb436066f97b5865b1f164f4808cc8a2258913d9c1d02d57
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$28.59
Net Worth in GLMR
Token Allocations
MAGIC
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ARB | 100.00% | $0.089416 | 319.707 | $28.59 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.