Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
VaultFarm
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-02 */ // File: @openzeppelin/contracts-ethereum-package/contracts/math/Math.sol pragma solidity ^0.5.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol pragma solidity ^0.5.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, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ 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-ethereum-package/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @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]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.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 ERC20;` 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)); } 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. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/upgrades/contracts/Initializable.sol pragma solidity >=0.4.24 <0.6.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. uint256 cs; assembly { cs := extcodesize(address) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol pragma solidity ^0.5.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. */ contract Context is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view 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-ethereum-package/contracts/token/ERC20/ERC20.sol pragma solidity ^0.5.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 {ERC20Mintable}. * * 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 Initializable, Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view 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 returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public 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 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 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 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 { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _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 { require(account != address(0), "ERC20: mint to the zero address"); _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 { require(account != address(0), "ERC20: burn from the zero address"); _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 is 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 { 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 Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20Detailed.sol pragma solidity ^0.5.0; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is Initializable, IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ function initialize(string memory name, string memory symbol, uint8 decimals) public initializer { _name = name; _symbol = symbol; _decimals = decimals; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view 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. * * 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 returns (uint8) { return _decimals; } uint256[50] private ______gap; } // File: contracts/hardworkInterface/IStrategy.sol pragma solidity 0.5.16; interface IStrategy { function unsalvagableTokens(address tokens) external view returns (bool); function governance() external view returns (address); function controller() external view returns (address); function underlying() external view returns (address); function vault() external view returns (address); function withdrawAllToVault() external; function withdrawToVault(uint256 amount) external; function investedUnderlyingBalance() external view returns (uint256); // itsNotMuch() // should only be called by controller function salvage(address recipient, address token, uint256 amount) external; function doHardWork() external; function depositArbCheck() external view returns(bool); } // File: contracts/hardworkInterface/IStrategyV2.sol pragma solidity 0.5.16; interface IStrategyV2 { function unsalvagableTokens(address tokens) external view returns (bool); function governance() external view returns (address); function controller() external view returns (address); function underlying() external view returns (address); function vault() external view returns (address); function withdrawAllToVault() external; function withdrawToVault(uint256 correspondingShares, uint256 totalShares) external; function investedUnderlyingBalance() external view returns (uint256); // itsNotMuch() // should only be called by controller function salvage(address recipient, address token, uint256 amount) external; function doHardWork() external; function depositArbCheck() external view returns(bool); } // File: contracts/hardworkInterface/IVault.sol pragma solidity 0.5.16; interface IVault { function underlyingBalanceInVault() external view returns (uint256); function underlyingBalanceWithInvestment() external view returns (uint256); // function store() external view returns (address); function governance() external view returns (address); function controller() external view returns (address); function underlying() external view returns (address); function strategy() external view returns (address); function setStrategy(address _strategy) external; function setVaultFractionToInvest(uint256 numerator, uint256 denominator) external; function deposit(uint256 amountWei) external; function depositFor(uint256 amountWei, address holder) external; function withdrawAll() external; function withdraw(uint256 numberOfShares) external; function getPricePerFullShare() external view returns (uint256); function underlyingBalanceWithInvestmentForHolder(address holder) view external returns (uint256); // hard work should be callable only by the controller (by the hard worker) or by governance function doHardWork() external; } // File: contracts/hardworkInterface/IController.sol pragma solidity 0.5.16; interface IController { // [Grey list] // An EOA can safely interact with the system no matter what. // If you're using Metamask, you're using an EOA. // Only smart contracts may be affected by this grey list. // // This contract will not be able to ban any EOA from the system // even if an EOA is being added to the greyList, he/she will still be able // to interact with the whole system as if nothing happened. // Only smart contracts will be affected by being added to the greyList. // This grey list is only used in Vault.sol, see the code there for reference function greyList(address _target) external view returns(bool); function addVaultAndStrategy(address _vault, address _strategy) external; function doHardWork(address _vault, uint256 hint, uint256 devianceNumerator, uint256 devianceDenominator) external; function hasVault(address _vault) external returns(bool); function salvage(address _token, uint256 amount) external; function salvageStrategy(address _strategy, address _token, uint256 amount) external; function notifyFee(address _underlying, uint256 fee) external; function profitSharingNumerator() external view returns (uint256); function profitSharingDenominator() external view returns (uint256); } // File: contracts/hardworkInterface/IUpgradeSource.sol pragma solidity 0.5.16; interface IUpgradeSource { function shouldUpgrade() external view returns (bool, address); function finalizeUpgrade() external; } // File: contracts/hardworkInterface/IFFarmStrategy.sol pragma solidity 0.5.16; interface IFFarmStrategy { function refreshAutoStaking() external; } // File: contracts/Storage.sol pragma solidity 0.5.16; contract Storage { address public governance; address public controller; constructor() public { governance = msg.sender; } modifier onlyGovernance() { require(isGovernance(msg.sender), "Not governance"); _; } function setGovernance(address _governance) public onlyGovernance { require(_governance != address(0), "new governance shouldn't be empty"); governance = _governance; } function setController(address _controller) public onlyGovernance { require(_controller != address(0), "new controller shouldn't be empty"); controller = _controller; } function isGovernance(address account) public view returns (bool) { return account == governance; } function isController(address account) public view returns (bool) { return account == controller; } } // File: contracts/GovernableInit.sol pragma solidity 0.5.16; // A clone of Governable supporting the Initializable interface and pattern contract GovernableInit is Initializable { bytes32 internal constant _STORAGE_SLOT = 0xa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc; modifier onlyGovernance() { require(Storage(_storage()).isGovernance(msg.sender), "Not governance"); _; } constructor() public { assert(_STORAGE_SLOT == bytes32(uint256(keccak256("eip1967.governableInit.storage")) - 1)); } function initialize(address _store) public initializer { _setStorage(_store); } function _setStorage(address newStorage) private { bytes32 slot = _STORAGE_SLOT; // solhint-disable-next-line no-inline-assembly assembly { sstore(slot, newStorage) } } function setStorage(address _store) public onlyGovernance { require(_store != address(0), "new storage shouldn't be empty"); _setStorage(_store); } function _storage() internal view returns (address str) { bytes32 slot = _STORAGE_SLOT; // solhint-disable-next-line no-inline-assembly assembly { str := sload(slot) } } function governance() public view returns (address) { return Storage(_storage()).governance(); } } // File: contracts/ControllableInit.sol pragma solidity 0.5.16; // A clone of Governable supporting the Initializable interface and pattern contract ControllableInit is GovernableInit { constructor() public { } function initialize(address _storage) public initializer { GovernableInit.initialize(_storage); } modifier onlyController() { require(Storage(_storage()).isController(msg.sender), "Not a controller"); _; } modifier onlyControllerOrGovernance(){ require((Storage(_storage()).isController(msg.sender) || Storage(_storage()).isGovernance(msg.sender)), "The caller must be controller or governance"); _; } function controller() public view returns (address) { return Storage(_storage()).controller(); } } // File: contracts/VaultStorage.sol pragma solidity 0.5.16; contract VaultStorage is Initializable { bytes32 internal constant _STRATEGY_SLOT = 0xf1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea; bytes32 internal constant _UNDERLYING_SLOT = 0x1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a7371; bytes32 internal constant _UNDERLYING_UNIT_SLOT = 0xa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff; bytes32 internal constant _VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT = 0x39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a; bytes32 internal constant _VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT = 0x469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed32308; bytes32 internal constant _NEXT_IMPLEMENTATION_SLOT = 0xb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df; bytes32 internal constant _NEXT_IMPLEMENTATION_TIMESTAMP_SLOT = 0x3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c9; bytes32 internal constant _NEXT_IMPLEMENTATION_DELAY_SLOT = 0x82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf0; bytes32 internal constant _STRATEGY_TIME_LOCK_SLOT = 0x6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b; bytes32 internal constant _FUTURE_STRATEGY_SLOT = 0xb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc8590610; bytes32 internal constant _STRATEGY_UPDATE_TIME_SLOT = 0x56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e72; bytes32 internal constant _ALLOW_SHARE_PRICE_DECREASE_SLOT = 0x22f7033891e85fc76735ebd320e0d3f546da431c4729c2f6d2613b11923aaaed; bytes32 internal constant _WITHDRAW_BEFORE_REINVESTING_SLOT = 0x4215fbb95dc0890d3e1660fb9089350f2d3f350c0a756934874cae6febf42a79; constructor() public { assert(_STRATEGY_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.strategy")) - 1)); assert(_UNDERLYING_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.underlying")) - 1)); assert(_UNDERLYING_UNIT_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.underlyingUnit")) - 1)); assert(_VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.vaultFractionToInvestNumerator")) - 1)); assert(_VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.vaultFractionToInvestDenominator")) - 1)); assert(_NEXT_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.nextImplementation")) - 1)); assert(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.nextImplementationTimestamp")) - 1)); assert(_NEXT_IMPLEMENTATION_DELAY_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.nextImplementationDelay")) - 1)); assert(_STRATEGY_TIME_LOCK_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.strategyTimeLock")) - 1)); assert(_FUTURE_STRATEGY_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.futureStrategy")) - 1)); assert(_STRATEGY_UPDATE_TIME_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.strategyUpdateTime")) - 1)); assert(_ALLOW_SHARE_PRICE_DECREASE_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.allowSharePriceDecrease")) - 1)); assert(_WITHDRAW_BEFORE_REINVESTING_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.withdrawBeforeReinvesting")) - 1)); } function initialize( address _underlying, uint256 _toInvestNumerator, uint256 _toInvestDenominator, uint256 _underlyingUnit, uint256 _implementationChangeDelay, uint256 _strategyChangeDelay ) public initializer { _setUnderlying(_underlying); _setVaultFractionToInvestNumerator(_toInvestNumerator); _setVaultFractionToInvestDenominator(_toInvestDenominator); _setUnderlyingUnit(_underlyingUnit); _setNextImplementationDelay(_implementationChangeDelay); _setStrategyTimeLock(_strategyChangeDelay); _setStrategyUpdateTime(0); _setFutureStrategy(address(0)); _setAllowSharePriceDecrease(false); _setWithdrawBeforeReinvesting(false); } function _setStrategy(address _address) internal { setAddress(_STRATEGY_SLOT, _address); } function _strategy() internal view returns (address) { return getAddress(_STRATEGY_SLOT); } function _setUnderlying(address _address) internal { setAddress(_UNDERLYING_SLOT, _address); } function _underlying() internal view returns (address) { return getAddress(_UNDERLYING_SLOT); } function _setUnderlyingUnit(uint256 _value) internal { setUint256(_UNDERLYING_UNIT_SLOT, _value); } function _underlyingUnit() internal view returns (uint256) { return getUint256(_UNDERLYING_UNIT_SLOT); } function _setVaultFractionToInvestNumerator(uint256 _value) internal { setUint256(_VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT, _value); } function _vaultFractionToInvestNumerator() internal view returns (uint256) { return getUint256(_VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT); } function _setVaultFractionToInvestDenominator(uint256 _value) internal { setUint256(_VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT, _value); } function _vaultFractionToInvestDenominator() internal view returns (uint256) { return getUint256(_VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT); } function _setAllowSharePriceDecrease(bool _value) internal { setBoolean(_ALLOW_SHARE_PRICE_DECREASE_SLOT, _value); } function _allowSharePriceDecrease() internal view returns (bool) { return getBoolean(_ALLOW_SHARE_PRICE_DECREASE_SLOT); } function _setWithdrawBeforeReinvesting(bool _value) internal { setBoolean(_WITHDRAW_BEFORE_REINVESTING_SLOT, _value); } function _withdrawBeforeReinvesting() internal view returns (bool) { return getBoolean(_WITHDRAW_BEFORE_REINVESTING_SLOT); } function _setNextImplementation(address _address) internal { setAddress(_NEXT_IMPLEMENTATION_SLOT, _address); } function _nextImplementation() internal view returns (address) { return getAddress(_NEXT_IMPLEMENTATION_SLOT); } function _setNextImplementationTimestamp(uint256 _value) internal { setUint256(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT, _value); } function _nextImplementationTimestamp() internal view returns (uint256) { return getUint256(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT); } function _setNextImplementationDelay(uint256 _value) internal { setUint256(_NEXT_IMPLEMENTATION_DELAY_SLOT, _value); } function _nextImplementationDelay() internal view returns (uint256) { return getUint256(_NEXT_IMPLEMENTATION_DELAY_SLOT); } function _setStrategyTimeLock(uint256 _value) internal { setUint256(_STRATEGY_TIME_LOCK_SLOT, _value); } function _strategyTimeLock() internal view returns (uint256) { return getUint256(_STRATEGY_TIME_LOCK_SLOT); } function _setFutureStrategy(address _value) internal { setAddress(_FUTURE_STRATEGY_SLOT, _value); } function _futureStrategy() internal view returns (address) { return getAddress(_FUTURE_STRATEGY_SLOT); } function _setStrategyUpdateTime(uint256 _value) internal { setUint256(_STRATEGY_UPDATE_TIME_SLOT, _value); } function _strategyUpdateTime() internal view returns (uint256) { return getUint256(_STRATEGY_UPDATE_TIME_SLOT); } function setBoolean(bytes32 slot, bool _value) internal { setUint256(slot, _value ? 1 : 0); } function getBoolean(bytes32 slot) internal view returns (bool) { return (getUint256(slot) == 1); } function setAddress(bytes32 slot, address _address) private { // solhint-disable-next-line no-inline-assembly assembly { sstore(slot, _address) } } function setUint256(bytes32 slot, uint256 _value) private { // solhint-disable-next-line no-inline-assembly assembly { sstore(slot, _value) } } function getAddress(bytes32 slot) private view returns (address str) { // solhint-disable-next-line no-inline-assembly assembly { str := sload(slot) } } function getUint256(bytes32 slot) private view returns (uint256 str) { // solhint-disable-next-line no-inline-assembly assembly { str := sload(slot) } } uint256[50] private ______gap; } // File: contracts/VaultFarm.sol pragma solidity 0.5.16; contract VaultFarm is ERC20, ERC20Detailed, IVault, IUpgradeSource, ControllableInit, VaultStorage { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; event Withdraw(address indexed beneficiary, uint256 amount); event Deposit(address indexed beneficiary, uint256 amount); event Invest(uint256 amount); event StrategyAnnounced(address newStrategy, uint256 time); event StrategyChanged(address newStrategy, address oldStrategy); // FFarm-specific: bytes32 internal constant _AUTO_STAKE_UPON_WITHDRAWAL = 0x158e3584387f31a4bfc2a994fe2a56ca1db54829287d1cf620c6cc66c7644160; constructor() public { assert(_AUTO_STAKE_UPON_WITHDRAWAL == bytes32(uint256(keccak256("eip1967.vaultStorage.autoStakeUponWithdrawal")) - 1)); } // the function is name differently to not cause inheritance clash in truffle and allows tests function initializeVault(address _storage, address _underlying, uint256 _toInvestNumerator, uint256 _toInvestDenominator ) public initializer { require(_toInvestNumerator <= _toInvestDenominator, "cannot invest more than 100%"); require(_toInvestDenominator != 0, "cannot divide by 0"); ERC20Detailed.initialize( string(abi.encodePacked("i", ERC20Detailed(_underlying).symbol())), string(abi.encodePacked("i", ERC20Detailed(_underlying).symbol())), ERC20Detailed(_underlying).decimals() ); ControllableInit.initialize( _storage ); uint256 underlyingUnit = 10 ** uint256(ERC20Detailed(address(_underlying)).decimals()); uint256 implementationDelay = 12 hours; uint256 strategyChangeDelay = 12 hours; VaultStorage.initialize( _underlying, _toInvestNumerator, _toInvestDenominator, underlyingUnit, implementationDelay, strategyChangeDelay ); } function strategy() public view returns(address) { return _strategy(); } function underlying() public view returns(address) { return _underlying(); } function underlyingUnit() public view returns(uint256) { return _underlyingUnit(); } function vaultFractionToInvestNumerator() public view returns(uint256) { return _vaultFractionToInvestNumerator(); } function vaultFractionToInvestDenominator() public view returns(uint256) { return _vaultFractionToInvestDenominator(); } function nextImplementation() public view returns(address) { return _nextImplementation(); } function nextImplementationTimestamp() public view returns(uint256) { return _nextImplementationTimestamp(); } function nextImplementationDelay() public view returns(uint256) { return _nextImplementationDelay(); } modifier whenStrategyDefined() { require(address(strategy()) != address(0), "Strategy must be defined"); _; } // Only smart contracts will be affected by this modifier modifier defense() { require( (msg.sender == tx.origin) || // If it is a normal user and not smart contract, // then the requirement will pass !IController(controller()).greyList(msg.sender), // If it is a smart contract, then "This smart contract has been grey listed" // make sure that it is not on our greyList. ); _; } /** * Chooses the best strategy and re-invests. If the strategy did not change, it just calls * doHardWork on the current strategy. Call this through controller to claim hard rewards. */ function doHardWork() whenStrategyDefined onlyControllerOrGovernance external { // ensure that new funds are invested too invest(); IStrategy(strategy()).doHardWork(); } /* * Returns the cash balance across all users in this contract. */ function underlyingBalanceInVault() view public returns (uint256) { return IERC20(underlying()).balanceOf(address(this)); } /* Returns the current underlying (e.g., DAI's) balance together with * the invested amount (if DAI is invested elsewhere by the strategy). */ function underlyingBalanceWithInvestment() view public returns (uint256) { if (address(strategy()) == address(0)) { // initial state, when not set return underlyingBalanceInVault(); } return underlyingBalanceInVault().add(IStrategy(strategy()).investedUnderlyingBalance()); } function getPricePerFullShare() public view returns (uint256) { return totalSupply() == 0 ? underlyingUnit() : underlyingUnit().mul(underlyingBalanceWithInvestment()).div(totalSupply()); } /* get the user's share (in underlying) */ function underlyingBalanceWithInvestmentForHolder(address holder) view external returns (uint256) { if (totalSupply() == 0) { return 0; } return underlyingBalanceWithInvestment() .mul(balanceOf(holder)) .div(totalSupply()); } function futureStrategy() public view returns (address) { return _futureStrategy(); } function strategyUpdateTime() public view returns (uint256) { return _strategyUpdateTime(); } function strategyTimeLock() public view returns (uint256) { return _strategyTimeLock(); } // FFarm-specific: function autoStakeUponWithdrawal() public view returns (bool) { return getBoolean(_AUTO_STAKE_UPON_WITHDRAWAL); } function setAutoStakeUponWithdrawal(bool _value) public onlyGovernance { return setBoolean(_AUTO_STAKE_UPON_WITHDRAWAL, _value); } function canUpdateStrategy(address _strategy) public view returns(bool) { return strategy() == address(0) // no strategy was set yet || (_strategy == futureStrategy() && block.timestamp > strategyUpdateTime() && strategyUpdateTime() > 0); // or the timelock has passed } /** * Indicates that the strategy update will happen in the future */ function announceStrategyUpdate(address _strategy) public onlyControllerOrGovernance { // records a new timestamp uint256 when = block.timestamp.add(strategyTimeLock()); _setStrategyUpdateTime(when); _setFutureStrategy(_strategy); emit StrategyAnnounced(_strategy, when); } /** * Finalizes (or cancels) the strategy update by resetting the data */ function finalizeStrategyUpdate() public onlyControllerOrGovernance { _setStrategyUpdateTime(0); _setFutureStrategy(address(0)); } function setStrategy(address _strategy) public onlyControllerOrGovernance { require(canUpdateStrategy(_strategy), "The strategy exists and switch timelock did not elapse yet"); require(_strategy != address(0), "new _strategy cannot be empty"); require(IStrategy(_strategy).underlying() == address(underlying()), "Vault underlying must match Strategy underlying"); require(IStrategy(_strategy).vault() == address(this), "the strategy does not belong to this vault"); emit StrategyChanged(_strategy, strategy()); if (address(_strategy) != address(strategy())) { if (address(strategy()) != address(0)) { // if the original strategy (no underscore) is defined IERC20(underlying()).safeApprove(address(strategy()), 0); IStrategy(strategy()).withdrawAllToVault(); } _setStrategy(_strategy); IERC20(underlying()).safeApprove(address(strategy()), 0); IERC20(underlying()).safeApprove(address(strategy()), uint256(~0)); } finalizeStrategyUpdate(); } function setVaultFractionToInvest(uint256 numerator, uint256 denominator) external onlyGovernance { require(denominator > 0, "denominator must be greater than 0"); require(numerator <= denominator, "denominator must be greater than or equal to the numerator"); _setVaultFractionToInvestNumerator(numerator); _setVaultFractionToInvestDenominator(denominator); } function rebalance() external onlyControllerOrGovernance { withdrawAll(); invest(); } function availableToInvestOut() public view returns (uint256) { uint256 wantInvestInTotal = underlyingBalanceWithInvestment() .mul(vaultFractionToInvestNumerator()) .div(vaultFractionToInvestDenominator()); uint256 alreadyInvested = IStrategy(strategy()).investedUnderlyingBalance(); if (alreadyInvested >= wantInvestInTotal) { return 0; } else { uint256 remainingToInvest = wantInvestInTotal.sub(alreadyInvested); return remainingToInvest <= underlyingBalanceInVault() // TODO: we think that the "else" branch of the ternary operation is not // going to get hit ? remainingToInvest : underlyingBalanceInVault(); } } function invest() internal whenStrategyDefined { uint256 availableAmount = availableToInvestOut(); if (availableAmount > 0) { IERC20(underlying()).safeTransfer(address(strategy()), availableAmount); emit Invest(availableAmount); } } /* * Allows for depositing the underlying asset in exchange for shares. * Approval is assumed. */ function deposit(uint256 amount) external defense { _deposit(amount, msg.sender, msg.sender); } /* * Allows for depositing the underlying asset in exchange for shares * assigned to the holder. * This facilitates depositing for someone else (using DepositHelper) */ function depositFor(uint256 amount, address holder) public defense { _deposit(amount, msg.sender, holder); } function withdrawAll() public onlyControllerOrGovernance whenStrategyDefined { IStrategy(strategy()).withdrawAllToVault(); } function withdraw(uint256 numberOfShares) external { require(totalSupply() > 0, "Vault has no shares"); require(numberOfShares > 0, "numberOfShares must be greater than 0"); uint256 totalSupply = totalSupply(); _burn(msg.sender, numberOfShares); uint256 underlyingAmountToWithdraw = underlyingBalanceWithInvestment() .mul(numberOfShares) .div(totalSupply); if (underlyingAmountToWithdraw > underlyingBalanceInVault()) { // withdraw everything from the strategy to accurately check the share value if (numberOfShares == totalSupply) { IStrategy(strategy()).withdrawAllToVault(); } else { uint256 missing = underlyingAmountToWithdraw.sub(underlyingBalanceInVault()); IStrategy(strategy()).withdrawToVault(missing); } // recalculate to improve accuracy underlyingAmountToWithdraw = Math.min(underlyingBalanceWithInvestment() .mul(numberOfShares) .div(totalSupply), underlyingBalanceInVault()); } IERC20(underlying()).safeTransfer(msg.sender, underlyingAmountToWithdraw); // FFarm-specific: // Even if we have enough buffer, we need to call doHardWork // for auto-staking if (autoStakeUponWithdrawal()) { IFFarmStrategy(strategy()).refreshAutoStaking(); } // update the withdrawal amount for the holder emit Withdraw(msg.sender, underlyingAmountToWithdraw); } function _deposit(uint256 amount, address sender, address beneficiary) internal { require(amount > 0, "Cannot deposit 0"); require(beneficiary != address(0), "holder must be defined"); if (address(strategy()) != address(0)) { require(IStrategy(strategy()).depositArbCheck(), "Too much arb"); } uint256 toMint = totalSupply() == 0 ? amount : amount.mul(totalSupply()).div(underlyingBalanceWithInvestment()); _mint(beneficiary, toMint); IERC20(underlying()).safeTransferFrom(sender, address(this), amount); // update the contribution amount for the beneficiary emit Deposit(beneficiary, amount); } /** * Schedules an upgrade for this vault's proxy. */ function scheduleUpgrade(address impl) public onlyGovernance { _setNextImplementation(impl); _setNextImplementationTimestamp(block.timestamp.add(nextImplementationDelay())); } function shouldUpgrade() external view returns (bool, address) { return ( nextImplementationTimestamp() != 0 && block.timestamp > nextImplementationTimestamp() && nextImplementation() != address(0), nextImplementation() ); } function finalizeUpgrade() external onlyGovernance { _setNextImplementation(address(0)); _setNextImplementationTimestamp(0); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Invest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newStrategy","type":"address"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"StrategyAnnounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newStrategy","type":"address"},{"indexed":false,"internalType":"address","name":"oldStrategy","type":"address"}],"name":"StrategyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"announceStrategyUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"autoStakeUponWithdrawal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"availableToInvestOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"canUpdateStrategy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"holder","type":"address"}],"name":"depositFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"doHardWork","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalizeStrategyUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalizeUpgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"futureStrategy","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"uint256","name":"_toInvestNumerator","type":"uint256"},{"internalType":"uint256","name":"_toInvestDenominator","type":"uint256"},{"internalType":"uint256","name":"_underlyingUnit","type":"uint256"},{"internalType":"uint256","name":"_implementationChangeDelay","type":"uint256"},{"internalType":"uint256","name":"_strategyChangeDelay","type":"uint256"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_storage","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_storage","type":"address"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"uint256","name":"_toInvestNumerator","type":"uint256"},{"internalType":"uint256","name":"_toInvestDenominator","type":"uint256"}],"name":"initializeVault","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextImplementationDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextImplementationTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"impl","type":"address"}],"name":"scheduleUpgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setAutoStakeUponWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_store","type":"address"}],"name":"setStorage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"setStrategy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"setVaultFractionToInvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"shouldUpgrade","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"strategy","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"strategyTimeLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"strategyUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"underlyingBalanceInVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"underlyingBalanceWithInvestment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"underlyingBalanceWithInvestmentForHolder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"underlyingUnit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vaultFractionToInvestDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vaultFractionToInvestNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"numberOfShares","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604080517f656970313936372e676f7665726e61626c65496e69742e73746f7261676500008152905190819003601e0190207fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc600019909101146200007357fe5b604080517f656970313936372e7661756c7453746f726167652e73747261746567790000008152905190819003601d0190207ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea60001990910114620000d457fe5b604080517f656970313936372e7661756c7453746f726167652e756e6465726c79696e67008152905190819003601f0190207f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a7371600019909101146200013557fe5b6001604051808062004c12602391396023019050604051809103902060001c0360001b7fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff60001b146200018457fe5b6001604051808062004ad4603391396033019050604051809103902060001c0360001b7f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a60001b14620001d357fe5b6001604051808062004b65603591396035019050604051809103902060001c0360001b7f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed3230860001b146200022257fe5b6001604051808062004c35602791396027019050604051809103902060001c0360001b7fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df60001b146200027157fe5b6001604051808062004b07603091396030019050604051809103902060001c0360001b7f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c960001b14620002c057fe5b6001604051808062004be6602c9139602c019050604051809103902060001c0360001b7f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf060001b146200030f57fe5b6001604051808062004bc1602591396025019050604051809103902060001c0360001b7f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b60001b146200035e57fe5b6001604051808062004c5c602391396023019050604051809103902060001c0360001b7fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc859061060001b14620003ad57fe5b6001604051808062004b9a602791396027019050604051809103902060001c0360001b7f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e7260001b14620003fc57fe5b6001604051808062004aa8602c9139602c019050604051809103902060001c0360001b7f22f7033891e85fc76735ebd320e0d3f546da431c4729c2f6d2613b11923aaaed60001b146200044b57fe5b6001604051808062004b37602e9139602e019050604051809103902060001c0360001b7f4215fbb95dc0890d3e1660fb9089350f2d3f350c0a756934874cae6febf42a7960001b146200049a57fe5b6001604051808062004a7c602c9139602c019050604051809103902060001c0360001b7f158e3584387f31a4bfc2a994fe2a56ca1db54829287d1cf620c6cc66c764416060001b14620004e957fe5b61458380620004f96000396000f3fe608060405234801561001057600080fd5b50600436106102b65760003560e01c806382de9c1b11610172578063a9059cbb116100d9578063c2baf35611610092578063c2baf3561461088d578063c4d66de814610895578063dd62ed3e146108bb578063eda199aa146108e9578063f0cf91e7146108f1578063f2768c1e14610917578063f77c47911461091f576102b6565b8063a9059cbb1461080d578063aa04462514610839578063b592c39014610841578063b635bf8f14610849578063b6b55f2514610868578063bdd1475e14610885576102b6565b80639a508c8e1161012b5780639a508c8e1461077b5780639d16acfd14610783578063a457c2d7146107ae578063a5b1a24d146107da578063a8365693146107fd578063a8c62e7614610805576102b6565b806382de9c1b146106db578063853828b6146106e35780638cb1d67f146106eb5780638fc1708c146107115780639137c1a71461074d57806395d89b4114610773576102b6565b806333a100ca1161022157806353ceb01c116101da57806353ceb01c146106855780635aa6e6751461068d5780635fe51e6d146106955780636f307dc31461069d57806370a08231146106a557806377c7b8fc146106cb5780637d7c2a1c146106d3576102b6565b806333a100ca146105b357806336efd16f146105d9578063395093511461060557806345ff4c80146106315780634af1758b146106755780634fa5d8541461067d576102b6565b80631624f6c6116102735780631624f6c61461040457806318160ddd146105325780631bf8e7be1461053a57806323b872dd146105425780632e1a7d4d14610578578063313ce56714610595576102b6565b806306fdde03146102bb578063095ea7b31461033857806309ff18f0146103785780630a6bbeb31461039c5780630ad2239d146103c45780630c80447a146103de575b600080fd5b6102c3610927565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102fd5781810151838201526020016102e5565b50505050905090810190601f16801561032a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103646004803603604081101561034e57600080fd5b506001600160a01b0381351690602001356109be565b604080519115158252519081900360200190f35b6103806109dc565b604080516001600160a01b039092168252519081900360200190f35b6103c2600480360360208110156103b257600080fd5b50356001600160a01b03166109eb565b005b6103cc610bb5565b60408051918252519081900360200190f35b6103c2600480360360208110156103f457600080fd5b50356001600160a01b0316610bbf565b6103c26004803603606081101561041a57600080fd5b810190602081018135600160201b81111561043457600080fd5b82018360208201111561044657600080fd5b803590602001918460018302840111600160201b8311171561046757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156104b957600080fd5b8201836020820111156104cb57600080fd5b803590602001918460018302840111600160201b831117156104ec57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903560ff169150610ca99050565b6103cc610d85565b6103cc610d8b565b6103646004803603606081101561055857600080fd5b506001600160a01b03813581169160208101359091169060400135610e37565b6103c26004803603602081101561058e57600080fd5b5035610ec4565b61059d611179565b6040805160ff9092168252519081900360200190f35b6103c2600480360360208110156105c957600080fd5b50356001600160a01b0316611182565b6103c2600480360360408110156105ef57600080fd5b50803590602001356001600160a01b0316611623565b6103646004803603604081101561061b57600080fd5b506001600160a01b038135169060200135611701565b6103c2600480360360c081101561064757600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a00135611755565b6103cc61185b565b6103c2611865565b6103cc611a78565b610380611a82565b610380611af5565b610380611aff565b6103cc600480360360208110156106bb57600080fd5b50356001600160a01b0316611b09565b6103cc611b28565b6103c2611b62565b6103cc611cc8565b6103c2611cd2565b6103cc6004803603602081101561070157600080fd5b50356001600160a01b0316611ec9565b6103c26004803603608081101561072757600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611efe565b6103c26004803603602081101561076357600080fd5b50356001600160a01b0316612466565b6102c3612595565b6103c26125f6565b61078b6126d5565b6040805192151583526001600160a01b0390911660208301528051918290030190f35b610364600480360360408110156107c457600080fd5b506001600160a01b038135169060200135612721565b6103c2600480360360408110156107f057600080fd5b508035906020013561278f565b6103cc6128ea565b6103806128f4565b6103646004803603604081101561082357600080fd5b506001600160a01b0381351690602001356128fe565b6103cc612912565b6103cc61291c565b6103c26004803603602081101561085f57600080fd5b503515156129f5565b6103c26004803603602081101561087e57600080fd5b5035612aea565b610364612bc4565b6103cc612bef565b6103c2600480360360208110156108ab57600080fd5b50356001600160a01b0316612c4e565b6103cc600480360360408110156108d157600080fd5b506001600160a01b0381358116916020013516612cf9565b6103c2612d24565b6103646004803603602081101561090757600080fd5b50356001600160a01b0316612e8c565b6103cc612eed565b610380612ef7565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109b35780601f10610988576101008083540402835291602001916109b3565b820191906000526020600020905b81548152906001019060200180831161099657829003601f168201915b505050505090505b90565b60006109d26109cb612f39565b8484612f3d565b5060015b92915050565b60006109e6613029565b905090565b6109f3613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610a4857600080fd5b505afa158015610a5c573d6000803e3d6000fd5b505050506040513d6020811015610a7257600080fd5b505180610b045750610a82613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610ad757600080fd5b505afa158015610aeb573d6000803e3d6000fd5b505050506040513d6020811015610b0157600080fd5b50515b610b3f5760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b6000610b59610b4c610bb5565b429063ffffffff61307916565b9050610b64816130da565b610b6d82613104565b604080516001600160a01b03841681526020810183905281517f7d5e1cfe55788983acd19d248da36a27c9413e8e43445ed36a76ae0e741a04ed929181900390910190a15050565b60006109e661312e565b610bc7613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610c1c57600080fd5b505afa158015610c30573d6000803e3d6000fd5b505050506040513d6020811015610c4657600080fd5b5051610c8a576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b610c9381613159565b610ca6610ca1610b4c6128ea565b613183565b50565b600054610100900460ff1680610cc25750610cc26131ad565b80610cd0575060005460ff16155b610d0b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015610d36576000805460ff1961ff0019909116610100171660011790555b8351610d4990606890602087019061415c565b508251610d5d90606990602086019061415c565b50606a805460ff191660ff84161790558015610d7f576000805461ff00191690555b50505050565b60355490565b600080610d966128f4565b6001600160a01b03161415610db457610dad612bef565b90506109bb565b6109e6610dbf6128f4565b6001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610df757600080fd5b505afa158015610e0b573d6000803e3d6000fd5b505050506040513d6020811015610e2157600080fd5b5051610e2b612bef565b9063ffffffff61307916565b6000610e448484846131b3565b610eba84610e50612f39565b610eb5856040518060600160405280602881526020016143ab602891396001600160a01b038a16600090815260346020526040812090610e8e612f39565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61331116565b612f3d565b5060019392505050565b6000610ece610d85565b11610f16576040805162461bcd60e51b81526020600482015260136024820152725661756c7420686173206e6f2073686172657360681b604482015290519081900360640190fd5b60008111610f555760405162461bcd60e51b815260040180806020018281038252602581526020018061443b6025913960400191505060405180910390fd5b6000610f5f610d85565b9050610f6b33836133a8565b6000610f9582610f8985610f7d610d8b565b9063ffffffff6134a416565b9063ffffffff6134fd16565b9050610f9f612bef565b8111156110b3578183141561100d57610fb66128f4565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ff057600080fd5b505af1158015611004573d6000803e3d6000fd5b50505050611090565b600061102761101a612bef565b839063ffffffff61353f16565b90506110316128f4565b6001600160a01b031663ce8c42e8826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561107657600080fd5b505af115801561108a573d6000803e3d6000fd5b50505050505b6110b06110a383610f8986610f7d610d8b565b6110ab612bef565b613581565b90505b6110d633826110c0611aff565b6001600160a01b0316919063ffffffff61359716565b6110de612bc4565b1561113e576110eb6128f4565b6001600160a01b031663203971926040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561112557600080fd5b505af1158015611139573d6000803e3d6000fd5b505050505b60408051828152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b606a5460ff1690565b61118a613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156111df57600080fd5b505afa1580156111f3573d6000803e3d6000fd5b505050506040513d602081101561120957600080fd5b50518061129b5750611219613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561126e57600080fd5b505afa158015611282573d6000803e3d6000fd5b505050506040513d602081101561129857600080fd5b50515b6112d65760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b6112df81612e8c565b61131a5760405162461bcd60e51b815260040180806020018281038252603a815260200180614401603a913960400191505060405180910390fd5b6001600160a01b038116611375576040805162461bcd60e51b815260206004820152601d60248201527f6e6577205f73747261746567792063616e6e6f7420626520656d707479000000604482015290519081900360640190fd5b61137d611aff565b6001600160a01b0316816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156113bf57600080fd5b505afa1580156113d3573d6000803e3d6000fd5b505050506040513d60208110156113e957600080fd5b50516001600160a01b0316146114305760405162461bcd60e51b815260040180806020018281038252602f81526020018061435b602f913960400191505060405180910390fd5b306001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561147357600080fd5b505afa158015611487573d6000803e3d6000fd5b505050506040513d602081101561149d57600080fd5b50516001600160a01b0316146114e45760405162461bcd60e51b815260040180806020018281038252602a8152602001806142a9602a913960400191505060405180910390fd5b7f254c88e7a2ea123aeeb89b7cc413fb949188fefcdb7584c4f3d493294daf65c58161150e6128f4565b604080516001600160a01b03938416815291909216602082015281519081900390910190a161153b6128f4565b6001600160a01b0316816001600160a01b03161461161b57600061155d6128f4565b6001600160a01b0316146115f1576115966115766128f4565b6000611580611aff565b6001600160a01b0316919063ffffffff6135ee16565b61159e6128f4565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115d857600080fd5b505af11580156115ec573d6000803e3d6000fd5b505050505b6115fa81613701565b6116056115766128f4565b61161b6116106128f4565b600019611580611aff565b610ca6612d24565b333214806116b75750611634612ef7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561168957600080fd5b505afa15801561169d573d6000803e3d6000fd5b505050506040513d60208110156116b357600080fd5b5051155b6116f25760405162461bcd60e51b81526004018080602001828103825260288152602001806143336028913960400191505060405180910390fd5b6116fd82338361372b565b5050565b60006109d261170e612f39565b84610eb5856034600061171f612f39565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61307916565b600054610100900460ff168061176e575061176e6131ad565b8061177c575060005460ff16155b6117b75760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff161580156117e2576000805460ff1961ff0019909116610100171660011790555b6117eb8761393a565b6117f486613964565b6117fd8561398e565b611806846139b8565b61180f836139e2565b61181882613a0c565b61182260006130da565b61182c6000613104565b6118366000613a36565b6118406000613a60565b8015611852576000805461ff00191690555b50505050505050565b60006109e6613a8a565b600061186f6128f4565b6001600160a01b031614156118c6576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6118ce613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561192357600080fd5b505afa158015611937573d6000803e3d6000fd5b505050506040513d602081101561194d57600080fd5b5051806119df575061195d613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156119b257600080fd5b505afa1580156119c6573d6000803e3d6000fd5b505050506040513d60208110156119dc57600080fd5b50515b611a1a5760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b611a22613ab5565b611a2a6128f4565b6001600160a01b0316634fa5d8546040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a6457600080fd5b505af1158015610d7f573d6000803e3d6000fd5b60006109e6613b72565b6000611a8c613054565b6001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac457600080fd5b505afa158015611ad8573d6000803e3d6000fd5b505050506040513d6020811015611aee57600080fd5b5051905090565b60006109e6613b9d565b60006109e6613bc8565b6001600160a01b0381166000908152603360205260409020545b919050565b6000611b32610d85565b15611b5a57611b55611b42610d85565b610f89611b4d610d8b565b610f7d611a78565b6109e6565b6109e6611a78565b611b6a613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611bbf57600080fd5b505afa158015611bd3573d6000803e3d6000fd5b505050506040513d6020811015611be957600080fd5b505180611c7b5750611bf9613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611c4e57600080fd5b505afa158015611c62573d6000803e3d6000fd5b505050506040513d6020811015611c7857600080fd5b50515b611cb65760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b611cbe611cd2565b611cc6613ab5565b565b60006109e6613bf3565b611cda613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611d2f57600080fd5b505afa158015611d43573d6000803e3d6000fd5b505050506040513d6020811015611d5957600080fd5b505180611deb5750611d69613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611dbe57600080fd5b505afa158015611dd2573d6000803e3d6000fd5b505050506040513d6020811015611de857600080fd5b50515b611e265760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b6000611e306128f4565b6001600160a01b03161415611e87576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b611e8f6128f4565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a6457600080fd5b6000611ed3610d85565b611edf57506000611b23565b6109d6611eea610d85565b610f89611ef685611b09565b610f7d610d8b565b600054610100900460ff1680611f175750611f176131ad565b80611f25575060005460ff16155b611f605760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015611f8b576000805460ff1961ff0019909116610100171660011790555b81831115611fe0576040805162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420696e76657374206d6f7265207468616e203130302500000000604482015290519081900360640190fd5b81612027576040805162461bcd60e51b8152602060048201526012602482015271063616e6e6f742064697669646520627920360741b604482015290519081900360640190fd5b6123c0846001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561206357600080fd5b505afa158015612077573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156120a057600080fd5b8101908080516040519392919084600160201b8211156120bf57600080fd5b9083019060208201858111156120d457600080fd5b8251600160201b8111828201881017156120ed57600080fd5b82525081516020918201929091019080838360005b8381101561211a578181015183820152602001612102565b50505050905090810190601f1680156121475780820380516001836020036101000a031916815260200191505b506040525050506040516020018080606960f81b81525060010182805190602001908083835b6020831061218c5780518252601f19909201916020918201910161216d565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052856001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156121f957600080fd5b505afa15801561220d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561223657600080fd5b8101908080516040519392919084600160201b82111561225557600080fd5b90830190602082018581111561226a57600080fd5b8251600160201b81118282018810171561228357600080fd5b82525081516020918201929091019080838360005b838110156122b0578181015183820152602001612298565b50505050905090810190601f1680156122dd5780820380516001836020036101000a031916815260200191505b506040525050506040516020018080606960f81b81525060010182805190602001908083835b602083106123225780518252601f199092019160209182019101612303565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561238f57600080fd5b505afa1580156123a3573d6000803e3d6000fd5b505050506040513d60208110156123b957600080fd5b5051610ca9565b6123c985612c4e565b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561240457600080fd5b505afa158015612418573d6000803e3d6000fd5b505050506040513d602081101561242e57600080fd5b505160ff16600a0a905061a8c08061244a878787868580611755565b505050801561245f576000805461ff00191690555b5050505050565b61246e613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156124c357600080fd5b505afa1580156124d7573d6000803e3d6000fd5b505050506040513d60208110156124ed57600080fd5b5051612531576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b03811661258c576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b610ca681613c1e565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109b35780601f10610988576101008083540402835291602001916109b3565b6125fe613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561265357600080fd5b505afa158015612667573d6000803e3d6000fd5b505050506040513d602081101561267d57600080fd5b50516126c1576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6126cb6000613159565b611cc66000613183565b6000806126e0611cc8565b158015906126f457506126f1611cc8565b42115b8015612711575060006127056109dc565b6001600160a01b031614155b6127196109dc565b915091509091565b60006109d261272e612f39565b84610eb58560405180606001604052806025815260200161452a6025913960346000612758612f39565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61331116565b612797613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156127ec57600080fd5b505afa158015612800573d6000803e3d6000fd5b505050506040513d602081101561281657600080fd5b505161285a576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b600081116128995760405162461bcd60e51b81526004018080602001828103825260228152602001806142436022913960400191505060405180910390fd5b808211156128d85760405162461bcd60e51b815260040180806020018281038252603a8152602001806142d3603a913960400191505060405180910390fd5b6128e182613964565b6116fd8161398e565b60006109e6613c42565b60006109e6613c6d565b60006109d261290b612f39565b84846131b3565b60006109e6613c98565b60008061293561292a612eed565b610f89611ef661185b565b905060006129416128f4565b6001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561297957600080fd5b505afa15801561298d573d6000803e3d6000fd5b505050506040513d60208110156129a357600080fd5b505190508181106129b9576000925050506109bb565b60006129cb838363ffffffff61353f16565b90506129d5612bef565b8111156129e9576129e4612bef565b6129eb565b805b93505050506109bb565b6129fd613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612a5257600080fd5b505afa158015612a66573d6000803e3d6000fd5b505050506040513d6020811015612a7c57600080fd5b5051612ac0576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b610ca67f158e3584387f31a4bfc2a994fe2a56ca1db54829287d1cf620c6cc66c764416082613cc3565b33321480612b7e5750612afb612ef7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612b5057600080fd5b505afa158015612b64573d6000803e3d6000fd5b505050506040513d6020811015612b7a57600080fd5b5051155b612bb95760405162461bcd60e51b81526004018080602001828103825260288152602001806143336028913960400191505060405180910390fd5b610ca681333361372b565b60006109e67f158e3584387f31a4bfc2a994fe2a56ca1db54829287d1cf620c6cc66c7644160613cde565b6000612bf9611aff565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611ac457600080fd5b600054610100900460ff1680612c675750612c676131ad565b80612c75575060005460ff16155b612cb05760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015612cdb576000805460ff1961ff0019909116610100171660011790555b612ce482613cf2565b80156116fd576000805461ff00191690555050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b612d2c613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612d8157600080fd5b505afa158015612d95573d6000803e3d6000fd5b505050506040513d6020811015612dab57600080fd5b505180612e3d5750612dbb613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612e1057600080fd5b505afa158015612e24573d6000803e3d6000fd5b505050506040513d6020811015612e3a57600080fd5b50515b612e785760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b612e8260006130da565b611cc66000613104565b600080612e976128f4565b6001600160a01b031614806109d65750612eaf611af5565b6001600160a01b0316826001600160a01b0316148015612ed55750612ed2612912565b42115b80156109d657506000612ee6612912565b1192915050565b60006109e6613d88565b6000612f01613054565b6001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac457600080fd5b3390565b6001600160a01b038316612f825760405162461bcd60e51b81526004018080602001828103825260248152602001806144a66024913960400191505060405180910390fd5b6001600160a01b038216612fc75760405162461bcd60e51b81526004018080602001828103825260228152602001806142876022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006109e67fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df613daf565b7fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc5490565b6000828201838110156130d3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610ca67f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e7282613db3565b610ca67fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc859061082613db3565b60006109e67f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b613daf565b610ca67fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df82613db3565b610ca67f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c982613db3565b303b1590565b6001600160a01b0383166131f85760405162461bcd60e51b81526004018080602001828103825260258152602001806144816025913960400191505060405180910390fd5b6001600160a01b03821661323d5760405162461bcd60e51b81526004018080602001828103825260238152602001806142206023913960400191505060405180910390fd5b6132808160405180606001604052806026815260200161430d602691396001600160a01b038616600090815260336020526040902054919063ffffffff61331116565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546132b5908263ffffffff61307916565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156133a05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561336557818101518382015260200161334d565b50505050905090810190601f1680156133925780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166133ed5760405162461bcd60e51b81526004018080602001828103825260218152602001806144606021913960400191505060405180910390fd5b61343081604051806060016040528060228152602001614265602291396001600160a01b038516600090815260336020526040902054919063ffffffff61331116565b6001600160a01b03831660009081526033602052604090205560355461345c908263ffffffff61353f16565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000826134b3575060006109d6565b828202828482816134c057fe5b04146130d35760405162461bcd60e51b815260040180806020018281038252602181526020018061438a6021913960400191505060405180910390fd5b60006130d383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613db7565b60006130d383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613311565b600081831061359057816130d3565b5090919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526135e9908490613e1c565b505050565b801580613674575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561364657600080fd5b505afa15801561365a573d6000803e3d6000fd5b505050506040513d602081101561367057600080fd5b5051155b6136af5760405162461bcd60e51b81526004018080602001828103825260368152602001806144f46036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526135e9908490613e1c565b610ca67ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea82613db3565b60008311613773576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6001600160a01b0381166137c7576040805162461bcd60e51b81526020600482015260166024820152751a1bdb19195c881b5d5cdd081899481919599a5b995960521b604482015290519081900360640190fd5b60006137d16128f4565b6001600160a01b03161461388b576137e76128f4565b6001600160a01b031663c2a2a07b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561381f57600080fd5b505afa158015613833573d6000803e3d6000fd5b505050506040513d602081101561384957600080fd5b505161388b576040805162461bcd60e51b815260206004820152600c60248201526b2a37b79036bab1b41030b93160a11b604482015290519081900360640190fd5b6000613895610d85565b156138c2576138bd6138a5610d8b565b610f896138b0610d85565b879063ffffffff6134a416565b6138c4565b835b90506138d08282613fd4565b6138f58330866138de611aff565b6001600160a01b031692919063ffffffff6140c616565b6040805185815290516001600160a01b038416917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a250505050565b610ca67f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a737182613db3565b610ca67f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a82613db3565b610ca67f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed3230882613db3565b610ca67fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff82613db3565b610ca67f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf082613db3565b610ca67f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b82613db3565b610ca67f22f7033891e85fc76735ebd320e0d3f546da431c4729c2f6d2613b11923aaaed82613cc3565b610ca67f4215fbb95dc0890d3e1660fb9089350f2d3f350c0a756934874cae6febf42a7982613cc3565b60006109e67f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a613daf565b6000613abf6128f4565b6001600160a01b03161415613b16576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6000613b2061291c565b90508015610ca657613b3c613b336128f4565b826110c0611aff565b6040805182815290517fa09b7ae452b7bffb9e204c3a016e80caeecf46f554d112644f36fa114dac6ffa9181900360200190a150565b60006109e67fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff613daf565b60006109e67fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc8590610613daf565b60006109e67f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a7371613daf565b60006109e67f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c9613daf565b7fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc55565b60006109e67f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf0613daf565b60006109e67ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea613daf565b60006109e67f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e72613daf565b6116fd8282613cd3576000613cd6565b60015b60ff16613db3565b6000613ce982613daf565b60011492915050565b600054610100900460ff1680613d0b5750613d0b6131ad565b80613d19575060005460ff16155b613d545760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015613d7f576000805460ff1961ff0019909116610100171660011790555b612ce482613c1e565b60006109e67f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed323085b5490565b9055565b60008183613e065760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561336557818101518382015260200161334d565b506000838581613e1257fe5b0495945050505050565b613e2e826001600160a01b0316614120565b613e7f576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613ebd5780518252601f199092019160209182019101613e9e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613f1f576040519150601f19603f3d011682016040523d82523d6000602084013e613f24565b606091505b509150915081613f7b576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610d7f57808060200190516020811015613f9757600080fd5b5051610d7f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806144ca602a913960400191505060405180910390fd5b6001600160a01b03821661402f576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b603554614042908263ffffffff61307916565b6035556001600160a01b03821660009081526033602052604090205461406e908263ffffffff61307916565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d7f908590613e1c565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061415457508115155b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061419d57805160ff19168380011785556141ca565b828001600101855582156141ca579182015b828111156141ca5782518255916020019190600101906141af565b506141d69291506141da565b5090565b6109bb91905b808211156141d657600081556001016141e056fe5468652063616c6c6572206d75737420626520636f6e74726f6c6c6572206f7220676f7665726e616e636545524332303a207472616e7366657220746f20746865207a65726f206164647265737364656e6f6d696e61746f72206d7573742062652067726561746572207468616e203045524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737374686520737472617465677920646f6573206e6f742062656c6f6e6720746f2074686973207661756c7464656e6f6d696e61746f72206d7573742062652067726561746572207468616e206f7220657175616c20746f20746865206e756d657261746f7245524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655468697320736d61727420636f6e747261637420686173206265656e2067726579206c69737465645661756c7420756e6465726c79696e67206d757374206d6174636820537472617465677920756e6465726c79696e67536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645468652073747261746567792065786973747320616e64207377697463682074696d656c6f636b20646964206e6f7420656c61707365207965746e756d6265724f66536861726573206d7573742062652067726561746572207468616e203045524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820a7e08d6be18da9085daf733e25e4c3e4b5ce8a48f9dc5f103fc011429fe4ae1c64736f6c63430005100032656970313936372e7661756c7453746f726167652e6175746f5374616b6555706f6e5769746864726177616c656970313936372e7661756c7453746f726167652e616c6c6f77536861726550726963654465637265617365656970313936372e7661756c7453746f726167652e7661756c744672616374696f6e546f496e766573744e756d657261746f72656970313936372e7661756c7453746f726167652e6e657874496d706c656d656e746174696f6e54696d657374616d70656970313936372e7661756c7453746f726167652e77697468647261774265666f72655265696e76657374696e67656970313936372e7661756c7453746f726167652e7661756c744672616374696f6e546f496e7665737444656e6f6d696e61746f72656970313936372e7661756c7453746f726167652e737472617465677955706461746554696d65656970313936372e7661756c7453746f726167652e737472617465677954696d654c6f636b656970313936372e7661756c7453746f726167652e6e657874496d706c656d656e746174696f6e44656c6179656970313936372e7661756c7453746f726167652e756e6465726c79696e67556e6974656970313936372e7661756c7453746f726167652e6e657874496d706c656d656e746174696f6e656970313936372e7661756c7453746f726167652e6675747572655374726174656779
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102b65760003560e01c806382de9c1b11610172578063a9059cbb116100d9578063c2baf35611610092578063c2baf3561461088d578063c4d66de814610895578063dd62ed3e146108bb578063eda199aa146108e9578063f0cf91e7146108f1578063f2768c1e14610917578063f77c47911461091f576102b6565b8063a9059cbb1461080d578063aa04462514610839578063b592c39014610841578063b635bf8f14610849578063b6b55f2514610868578063bdd1475e14610885576102b6565b80639a508c8e1161012b5780639a508c8e1461077b5780639d16acfd14610783578063a457c2d7146107ae578063a5b1a24d146107da578063a8365693146107fd578063a8c62e7614610805576102b6565b806382de9c1b146106db578063853828b6146106e35780638cb1d67f146106eb5780638fc1708c146107115780639137c1a71461074d57806395d89b4114610773576102b6565b806333a100ca1161022157806353ceb01c116101da57806353ceb01c146106855780635aa6e6751461068d5780635fe51e6d146106955780636f307dc31461069d57806370a08231146106a557806377c7b8fc146106cb5780637d7c2a1c146106d3576102b6565b806333a100ca146105b357806336efd16f146105d9578063395093511461060557806345ff4c80146106315780634af1758b146106755780634fa5d8541461067d576102b6565b80631624f6c6116102735780631624f6c61461040457806318160ddd146105325780631bf8e7be1461053a57806323b872dd146105425780632e1a7d4d14610578578063313ce56714610595576102b6565b806306fdde03146102bb578063095ea7b31461033857806309ff18f0146103785780630a6bbeb31461039c5780630ad2239d146103c45780630c80447a146103de575b600080fd5b6102c3610927565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102fd5781810151838201526020016102e5565b50505050905090810190601f16801561032a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103646004803603604081101561034e57600080fd5b506001600160a01b0381351690602001356109be565b604080519115158252519081900360200190f35b6103806109dc565b604080516001600160a01b039092168252519081900360200190f35b6103c2600480360360208110156103b257600080fd5b50356001600160a01b03166109eb565b005b6103cc610bb5565b60408051918252519081900360200190f35b6103c2600480360360208110156103f457600080fd5b50356001600160a01b0316610bbf565b6103c26004803603606081101561041a57600080fd5b810190602081018135600160201b81111561043457600080fd5b82018360208201111561044657600080fd5b803590602001918460018302840111600160201b8311171561046757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156104b957600080fd5b8201836020820111156104cb57600080fd5b803590602001918460018302840111600160201b831117156104ec57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903560ff169150610ca99050565b6103cc610d85565b6103cc610d8b565b6103646004803603606081101561055857600080fd5b506001600160a01b03813581169160208101359091169060400135610e37565b6103c26004803603602081101561058e57600080fd5b5035610ec4565b61059d611179565b6040805160ff9092168252519081900360200190f35b6103c2600480360360208110156105c957600080fd5b50356001600160a01b0316611182565b6103c2600480360360408110156105ef57600080fd5b50803590602001356001600160a01b0316611623565b6103646004803603604081101561061b57600080fd5b506001600160a01b038135169060200135611701565b6103c2600480360360c081101561064757600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a00135611755565b6103cc61185b565b6103c2611865565b6103cc611a78565b610380611a82565b610380611af5565b610380611aff565b6103cc600480360360208110156106bb57600080fd5b50356001600160a01b0316611b09565b6103cc611b28565b6103c2611b62565b6103cc611cc8565b6103c2611cd2565b6103cc6004803603602081101561070157600080fd5b50356001600160a01b0316611ec9565b6103c26004803603608081101561072757600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611efe565b6103c26004803603602081101561076357600080fd5b50356001600160a01b0316612466565b6102c3612595565b6103c26125f6565b61078b6126d5565b6040805192151583526001600160a01b0390911660208301528051918290030190f35b610364600480360360408110156107c457600080fd5b506001600160a01b038135169060200135612721565b6103c2600480360360408110156107f057600080fd5b508035906020013561278f565b6103cc6128ea565b6103806128f4565b6103646004803603604081101561082357600080fd5b506001600160a01b0381351690602001356128fe565b6103cc612912565b6103cc61291c565b6103c26004803603602081101561085f57600080fd5b503515156129f5565b6103c26004803603602081101561087e57600080fd5b5035612aea565b610364612bc4565b6103cc612bef565b6103c2600480360360208110156108ab57600080fd5b50356001600160a01b0316612c4e565b6103cc600480360360408110156108d157600080fd5b506001600160a01b0381358116916020013516612cf9565b6103c2612d24565b6103646004803603602081101561090757600080fd5b50356001600160a01b0316612e8c565b6103cc612eed565b610380612ef7565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109b35780601f10610988576101008083540402835291602001916109b3565b820191906000526020600020905b81548152906001019060200180831161099657829003601f168201915b505050505090505b90565b60006109d26109cb612f39565b8484612f3d565b5060015b92915050565b60006109e6613029565b905090565b6109f3613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610a4857600080fd5b505afa158015610a5c573d6000803e3d6000fd5b505050506040513d6020811015610a7257600080fd5b505180610b045750610a82613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610ad757600080fd5b505afa158015610aeb573d6000803e3d6000fd5b505050506040513d6020811015610b0157600080fd5b50515b610b3f5760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b6000610b59610b4c610bb5565b429063ffffffff61307916565b9050610b64816130da565b610b6d82613104565b604080516001600160a01b03841681526020810183905281517f7d5e1cfe55788983acd19d248da36a27c9413e8e43445ed36a76ae0e741a04ed929181900390910190a15050565b60006109e661312e565b610bc7613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610c1c57600080fd5b505afa158015610c30573d6000803e3d6000fd5b505050506040513d6020811015610c4657600080fd5b5051610c8a576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b610c9381613159565b610ca6610ca1610b4c6128ea565b613183565b50565b600054610100900460ff1680610cc25750610cc26131ad565b80610cd0575060005460ff16155b610d0b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015610d36576000805460ff1961ff0019909116610100171660011790555b8351610d4990606890602087019061415c565b508251610d5d90606990602086019061415c565b50606a805460ff191660ff84161790558015610d7f576000805461ff00191690555b50505050565b60355490565b600080610d966128f4565b6001600160a01b03161415610db457610dad612bef565b90506109bb565b6109e6610dbf6128f4565b6001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610df757600080fd5b505afa158015610e0b573d6000803e3d6000fd5b505050506040513d6020811015610e2157600080fd5b5051610e2b612bef565b9063ffffffff61307916565b6000610e448484846131b3565b610eba84610e50612f39565b610eb5856040518060600160405280602881526020016143ab602891396001600160a01b038a16600090815260346020526040812090610e8e612f39565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61331116565b612f3d565b5060019392505050565b6000610ece610d85565b11610f16576040805162461bcd60e51b81526020600482015260136024820152725661756c7420686173206e6f2073686172657360681b604482015290519081900360640190fd5b60008111610f555760405162461bcd60e51b815260040180806020018281038252602581526020018061443b6025913960400191505060405180910390fd5b6000610f5f610d85565b9050610f6b33836133a8565b6000610f9582610f8985610f7d610d8b565b9063ffffffff6134a416565b9063ffffffff6134fd16565b9050610f9f612bef565b8111156110b3578183141561100d57610fb66128f4565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ff057600080fd5b505af1158015611004573d6000803e3d6000fd5b50505050611090565b600061102761101a612bef565b839063ffffffff61353f16565b90506110316128f4565b6001600160a01b031663ce8c42e8826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561107657600080fd5b505af115801561108a573d6000803e3d6000fd5b50505050505b6110b06110a383610f8986610f7d610d8b565b6110ab612bef565b613581565b90505b6110d633826110c0611aff565b6001600160a01b0316919063ffffffff61359716565b6110de612bc4565b1561113e576110eb6128f4565b6001600160a01b031663203971926040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561112557600080fd5b505af1158015611139573d6000803e3d6000fd5b505050505b60408051828152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b606a5460ff1690565b61118a613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156111df57600080fd5b505afa1580156111f3573d6000803e3d6000fd5b505050506040513d602081101561120957600080fd5b50518061129b5750611219613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561126e57600080fd5b505afa158015611282573d6000803e3d6000fd5b505050506040513d602081101561129857600080fd5b50515b6112d65760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b6112df81612e8c565b61131a5760405162461bcd60e51b815260040180806020018281038252603a815260200180614401603a913960400191505060405180910390fd5b6001600160a01b038116611375576040805162461bcd60e51b815260206004820152601d60248201527f6e6577205f73747261746567792063616e6e6f7420626520656d707479000000604482015290519081900360640190fd5b61137d611aff565b6001600160a01b0316816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156113bf57600080fd5b505afa1580156113d3573d6000803e3d6000fd5b505050506040513d60208110156113e957600080fd5b50516001600160a01b0316146114305760405162461bcd60e51b815260040180806020018281038252602f81526020018061435b602f913960400191505060405180910390fd5b306001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561147357600080fd5b505afa158015611487573d6000803e3d6000fd5b505050506040513d602081101561149d57600080fd5b50516001600160a01b0316146114e45760405162461bcd60e51b815260040180806020018281038252602a8152602001806142a9602a913960400191505060405180910390fd5b7f254c88e7a2ea123aeeb89b7cc413fb949188fefcdb7584c4f3d493294daf65c58161150e6128f4565b604080516001600160a01b03938416815291909216602082015281519081900390910190a161153b6128f4565b6001600160a01b0316816001600160a01b03161461161b57600061155d6128f4565b6001600160a01b0316146115f1576115966115766128f4565b6000611580611aff565b6001600160a01b0316919063ffffffff6135ee16565b61159e6128f4565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115d857600080fd5b505af11580156115ec573d6000803e3d6000fd5b505050505b6115fa81613701565b6116056115766128f4565b61161b6116106128f4565b600019611580611aff565b610ca6612d24565b333214806116b75750611634612ef7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561168957600080fd5b505afa15801561169d573d6000803e3d6000fd5b505050506040513d60208110156116b357600080fd5b5051155b6116f25760405162461bcd60e51b81526004018080602001828103825260288152602001806143336028913960400191505060405180910390fd5b6116fd82338361372b565b5050565b60006109d261170e612f39565b84610eb5856034600061171f612f39565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61307916565b600054610100900460ff168061176e575061176e6131ad565b8061177c575060005460ff16155b6117b75760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff161580156117e2576000805460ff1961ff0019909116610100171660011790555b6117eb8761393a565b6117f486613964565b6117fd8561398e565b611806846139b8565b61180f836139e2565b61181882613a0c565b61182260006130da565b61182c6000613104565b6118366000613a36565b6118406000613a60565b8015611852576000805461ff00191690555b50505050505050565b60006109e6613a8a565b600061186f6128f4565b6001600160a01b031614156118c6576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6118ce613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561192357600080fd5b505afa158015611937573d6000803e3d6000fd5b505050506040513d602081101561194d57600080fd5b5051806119df575061195d613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156119b257600080fd5b505afa1580156119c6573d6000803e3d6000fd5b505050506040513d60208110156119dc57600080fd5b50515b611a1a5760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b611a22613ab5565b611a2a6128f4565b6001600160a01b0316634fa5d8546040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a6457600080fd5b505af1158015610d7f573d6000803e3d6000fd5b60006109e6613b72565b6000611a8c613054565b6001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac457600080fd5b505afa158015611ad8573d6000803e3d6000fd5b505050506040513d6020811015611aee57600080fd5b5051905090565b60006109e6613b9d565b60006109e6613bc8565b6001600160a01b0381166000908152603360205260409020545b919050565b6000611b32610d85565b15611b5a57611b55611b42610d85565b610f89611b4d610d8b565b610f7d611a78565b6109e6565b6109e6611a78565b611b6a613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611bbf57600080fd5b505afa158015611bd3573d6000803e3d6000fd5b505050506040513d6020811015611be957600080fd5b505180611c7b5750611bf9613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611c4e57600080fd5b505afa158015611c62573d6000803e3d6000fd5b505050506040513d6020811015611c7857600080fd5b50515b611cb65760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b611cbe611cd2565b611cc6613ab5565b565b60006109e6613bf3565b611cda613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611d2f57600080fd5b505afa158015611d43573d6000803e3d6000fd5b505050506040513d6020811015611d5957600080fd5b505180611deb5750611d69613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611dbe57600080fd5b505afa158015611dd2573d6000803e3d6000fd5b505050506040513d6020811015611de857600080fd5b50515b611e265760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b6000611e306128f4565b6001600160a01b03161415611e87576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b611e8f6128f4565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a6457600080fd5b6000611ed3610d85565b611edf57506000611b23565b6109d6611eea610d85565b610f89611ef685611b09565b610f7d610d8b565b600054610100900460ff1680611f175750611f176131ad565b80611f25575060005460ff16155b611f605760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015611f8b576000805460ff1961ff0019909116610100171660011790555b81831115611fe0576040805162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420696e76657374206d6f7265207468616e203130302500000000604482015290519081900360640190fd5b81612027576040805162461bcd60e51b8152602060048201526012602482015271063616e6e6f742064697669646520627920360741b604482015290519081900360640190fd5b6123c0846001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561206357600080fd5b505afa158015612077573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156120a057600080fd5b8101908080516040519392919084600160201b8211156120bf57600080fd5b9083019060208201858111156120d457600080fd5b8251600160201b8111828201881017156120ed57600080fd5b82525081516020918201929091019080838360005b8381101561211a578181015183820152602001612102565b50505050905090810190601f1680156121475780820380516001836020036101000a031916815260200191505b506040525050506040516020018080606960f81b81525060010182805190602001908083835b6020831061218c5780518252601f19909201916020918201910161216d565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052856001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156121f957600080fd5b505afa15801561220d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561223657600080fd5b8101908080516040519392919084600160201b82111561225557600080fd5b90830190602082018581111561226a57600080fd5b8251600160201b81118282018810171561228357600080fd5b82525081516020918201929091019080838360005b838110156122b0578181015183820152602001612298565b50505050905090810190601f1680156122dd5780820380516001836020036101000a031916815260200191505b506040525050506040516020018080606960f81b81525060010182805190602001908083835b602083106123225780518252601f199092019160209182019101612303565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561238f57600080fd5b505afa1580156123a3573d6000803e3d6000fd5b505050506040513d60208110156123b957600080fd5b5051610ca9565b6123c985612c4e565b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561240457600080fd5b505afa158015612418573d6000803e3d6000fd5b505050506040513d602081101561242e57600080fd5b505160ff16600a0a905061a8c08061244a878787868580611755565b505050801561245f576000805461ff00191690555b5050505050565b61246e613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156124c357600080fd5b505afa1580156124d7573d6000803e3d6000fd5b505050506040513d60208110156124ed57600080fd5b5051612531576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b03811661258c576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b610ca681613c1e565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109b35780601f10610988576101008083540402835291602001916109b3565b6125fe613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561265357600080fd5b505afa158015612667573d6000803e3d6000fd5b505050506040513d602081101561267d57600080fd5b50516126c1576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6126cb6000613159565b611cc66000613183565b6000806126e0611cc8565b158015906126f457506126f1611cc8565b42115b8015612711575060006127056109dc565b6001600160a01b031614155b6127196109dc565b915091509091565b60006109d261272e612f39565b84610eb58560405180606001604052806025815260200161452a6025913960346000612758612f39565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61331116565b612797613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156127ec57600080fd5b505afa158015612800573d6000803e3d6000fd5b505050506040513d602081101561281657600080fd5b505161285a576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b600081116128995760405162461bcd60e51b81526004018080602001828103825260228152602001806142436022913960400191505060405180910390fd5b808211156128d85760405162461bcd60e51b815260040180806020018281038252603a8152602001806142d3603a913960400191505060405180910390fd5b6128e182613964565b6116fd8161398e565b60006109e6613c42565b60006109e6613c6d565b60006109d261290b612f39565b84846131b3565b60006109e6613c98565b60008061293561292a612eed565b610f89611ef661185b565b905060006129416128f4565b6001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561297957600080fd5b505afa15801561298d573d6000803e3d6000fd5b505050506040513d60208110156129a357600080fd5b505190508181106129b9576000925050506109bb565b60006129cb838363ffffffff61353f16565b90506129d5612bef565b8111156129e9576129e4612bef565b6129eb565b805b93505050506109bb565b6129fd613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612a5257600080fd5b505afa158015612a66573d6000803e3d6000fd5b505050506040513d6020811015612a7c57600080fd5b5051612ac0576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b610ca67f158e3584387f31a4bfc2a994fe2a56ca1db54829287d1cf620c6cc66c764416082613cc3565b33321480612b7e5750612afb612ef7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612b5057600080fd5b505afa158015612b64573d6000803e3d6000fd5b505050506040513d6020811015612b7a57600080fd5b5051155b612bb95760405162461bcd60e51b81526004018080602001828103825260288152602001806143336028913960400191505060405180910390fd5b610ca681333361372b565b60006109e67f158e3584387f31a4bfc2a994fe2a56ca1db54829287d1cf620c6cc66c7644160613cde565b6000612bf9611aff565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611ac457600080fd5b600054610100900460ff1680612c675750612c676131ad565b80612c75575060005460ff16155b612cb05760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015612cdb576000805460ff1961ff0019909116610100171660011790555b612ce482613cf2565b80156116fd576000805461ff00191690555050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b612d2c613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612d8157600080fd5b505afa158015612d95573d6000803e3d6000fd5b505050506040513d6020811015612dab57600080fd5b505180612e3d5750612dbb613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612e1057600080fd5b505afa158015612e24573d6000803e3d6000fd5b505050506040513d6020811015612e3a57600080fd5b50515b612e785760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b612e8260006130da565b611cc66000613104565b600080612e976128f4565b6001600160a01b031614806109d65750612eaf611af5565b6001600160a01b0316826001600160a01b0316148015612ed55750612ed2612912565b42115b80156109d657506000612ee6612912565b1192915050565b60006109e6613d88565b6000612f01613054565b6001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac457600080fd5b3390565b6001600160a01b038316612f825760405162461bcd60e51b81526004018080602001828103825260248152602001806144a66024913960400191505060405180910390fd5b6001600160a01b038216612fc75760405162461bcd60e51b81526004018080602001828103825260228152602001806142876022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006109e67fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df613daf565b7fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc5490565b6000828201838110156130d3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610ca67f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e7282613db3565b610ca67fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc859061082613db3565b60006109e67f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b613daf565b610ca67fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df82613db3565b610ca67f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c982613db3565b303b1590565b6001600160a01b0383166131f85760405162461bcd60e51b81526004018080602001828103825260258152602001806144816025913960400191505060405180910390fd5b6001600160a01b03821661323d5760405162461bcd60e51b81526004018080602001828103825260238152602001806142206023913960400191505060405180910390fd5b6132808160405180606001604052806026815260200161430d602691396001600160a01b038616600090815260336020526040902054919063ffffffff61331116565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546132b5908263ffffffff61307916565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156133a05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561336557818101518382015260200161334d565b50505050905090810190601f1680156133925780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166133ed5760405162461bcd60e51b81526004018080602001828103825260218152602001806144606021913960400191505060405180910390fd5b61343081604051806060016040528060228152602001614265602291396001600160a01b038516600090815260336020526040902054919063ffffffff61331116565b6001600160a01b03831660009081526033602052604090205560355461345c908263ffffffff61353f16565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000826134b3575060006109d6565b828202828482816134c057fe5b04146130d35760405162461bcd60e51b815260040180806020018281038252602181526020018061438a6021913960400191505060405180910390fd5b60006130d383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613db7565b60006130d383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613311565b600081831061359057816130d3565b5090919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526135e9908490613e1c565b505050565b801580613674575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561364657600080fd5b505afa15801561365a573d6000803e3d6000fd5b505050506040513d602081101561367057600080fd5b5051155b6136af5760405162461bcd60e51b81526004018080602001828103825260368152602001806144f46036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526135e9908490613e1c565b610ca67ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea82613db3565b60008311613773576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6001600160a01b0381166137c7576040805162461bcd60e51b81526020600482015260166024820152751a1bdb19195c881b5d5cdd081899481919599a5b995960521b604482015290519081900360640190fd5b60006137d16128f4565b6001600160a01b03161461388b576137e76128f4565b6001600160a01b031663c2a2a07b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561381f57600080fd5b505afa158015613833573d6000803e3d6000fd5b505050506040513d602081101561384957600080fd5b505161388b576040805162461bcd60e51b815260206004820152600c60248201526b2a37b79036bab1b41030b93160a11b604482015290519081900360640190fd5b6000613895610d85565b156138c2576138bd6138a5610d8b565b610f896138b0610d85565b879063ffffffff6134a416565b6138c4565b835b90506138d08282613fd4565b6138f58330866138de611aff565b6001600160a01b031692919063ffffffff6140c616565b6040805185815290516001600160a01b038416917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a250505050565b610ca67f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a737182613db3565b610ca67f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a82613db3565b610ca67f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed3230882613db3565b610ca67fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff82613db3565b610ca67f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf082613db3565b610ca67f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b82613db3565b610ca67f22f7033891e85fc76735ebd320e0d3f546da431c4729c2f6d2613b11923aaaed82613cc3565b610ca67f4215fbb95dc0890d3e1660fb9089350f2d3f350c0a756934874cae6febf42a7982613cc3565b60006109e67f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a613daf565b6000613abf6128f4565b6001600160a01b03161415613b16576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6000613b2061291c565b90508015610ca657613b3c613b336128f4565b826110c0611aff565b6040805182815290517fa09b7ae452b7bffb9e204c3a016e80caeecf46f554d112644f36fa114dac6ffa9181900360200190a150565b60006109e67fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff613daf565b60006109e67fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc8590610613daf565b60006109e67f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a7371613daf565b60006109e67f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c9613daf565b7fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc55565b60006109e67f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf0613daf565b60006109e67ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea613daf565b60006109e67f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e72613daf565b6116fd8282613cd3576000613cd6565b60015b60ff16613db3565b6000613ce982613daf565b60011492915050565b600054610100900460ff1680613d0b5750613d0b6131ad565b80613d19575060005460ff16155b613d545760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015613d7f576000805460ff1961ff0019909116610100171660011790555b612ce482613c1e565b60006109e67f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed323085b5490565b9055565b60008183613e065760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561336557818101518382015260200161334d565b506000838581613e1257fe5b0495945050505050565b613e2e826001600160a01b0316614120565b613e7f576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613ebd5780518252601f199092019160209182019101613e9e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613f1f576040519150601f19603f3d011682016040523d82523d6000602084013e613f24565b606091505b509150915081613f7b576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610d7f57808060200190516020811015613f9757600080fd5b5051610d7f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806144ca602a913960400191505060405180910390fd5b6001600160a01b03821661402f576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b603554614042908263ffffffff61307916565b6035556001600160a01b03821660009081526033602052604090205461406e908263ffffffff61307916565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d7f908590613e1c565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061415457508115155b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061419d57805160ff19168380011785556141ca565b828001600101855582156141ca579182015b828111156141ca5782518255916020019190600101906141af565b506141d69291506141da565b5090565b6109bb91905b808211156141d657600081556001016141e056fe5468652063616c6c6572206d75737420626520636f6e74726f6c6c6572206f7220676f7665726e616e636545524332303a207472616e7366657220746f20746865207a65726f206164647265737364656e6f6d696e61746f72206d7573742062652067726561746572207468616e203045524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737374686520737472617465677920646f6573206e6f742062656c6f6e6720746f2074686973207661756c7464656e6f6d696e61746f72206d7573742062652067726561746572207468616e206f7220657175616c20746f20746865206e756d657261746f7245524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655468697320736d61727420636f6e747261637420686173206265656e2067726579206c69737465645661756c7420756e6465726c79696e67206d757374206d6174636820537472617465677920756e6465726c79696e67536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645468652073747261746567792065786973747320616e64207377697463682074696d656c6f636b20646964206e6f7420656c61707365207965746e756d6265724f66536861726573206d7573742062652067726561746572207468616e203045524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820a7e08d6be18da9085daf733e25e4c3e4b5ce8a48f9dc5f103fc011429fe4ae1c64736f6c63430005100032
Deployed Bytecode Sourcemap
46116:12557:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46116:12557:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28771:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28771:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22214:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22214:152:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;48546:100;;;:::i;:::-;;;;-1:-1:-1;;;;;48546:100:0;;;;;;;;;;;;;;52122:301;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52122:301:0;-1:-1:-1;;;;;52122:301:0;;:::i;:::-;;51336:97;;;:::i;:::-;;;;;;;;;;;;;;;;58062:188;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58062:188:0;-1:-1:-1;;;;;58062:188:0;;:::i;28515:186::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28515:186:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;28515:186:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;28515:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;28515:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;28515:186:0;;;;;;;;-1:-1:-1;28515:186:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;28515:186:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;28515:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;28515:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;28515:186:0;;-1:-1:-1;;;28515:186:0;;;;;-1:-1:-1;28515:186:0;;-1:-1:-1;28515:186:0:i;21235:91::-;;;:::i;50274:307::-;;;:::i;22838:304::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22838:304:0;;;;;;;;;;;;;;;;;:::i;55854:1457::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55854:1457:0;;:::i;29623:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52661:1045;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52661:1045:0;-1:-1:-1;;;;;52661:1045:0;;:::i;55594:116::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55594:116:0;;;;;;-1:-1:-1;;;;;55594:116:0;;:::i;23551:210::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23551:210:0;;;;;;;;:::i;41000:716::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;41000:716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48282:124::-;;;:::i;49714:187::-;;;:::i;48184:92::-;;;:::i;36685:104::-;;;:::i;51130:93::-;;;:::i;48094:84::-;;;:::i;21389:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21389:110:0;-1:-1:-1;;;;;21389:110:0;;:::i;50587:214::-;;;:::i;54101:98::-;;;:::i;48652:118::-;;;:::i;55716:132::-;;;:::i;50856:268::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50856:268:0;-1:-1:-1;;;;;50856:268:0;;:::i;47012:990::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;47012:990:0;;;;;;;;;;;;;;;;;;;;;;:::i;36314:160::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36314:160:0;-1:-1:-1;;;;;36314:160:0;;:::i;28973:87::-;;;:::i;58531:139::-;;;:::i;58256:269::-;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;58256:269:0;;;;;;;;;;;;;;;;24264:261;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24264:261:0;;;;;;;;:::i;53712:383::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53712:383:0;;;;;;;:::i;48776:110::-;;;:::i;48008:80::-;;;:::i;21712:158::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21712:158:0;;;;;;;;:::i;51229:101::-;;;:::i;54205:710::-;;;:::i;51586:138::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51586:138:0;;;;:::i;55301:103::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55301:103:0;;:::i;51461:121::-;;;:::i;49984:131::-;;;:::i;37029:105::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37029:105:0;-1:-1:-1;;;;;37029:105:0;;:::i;21933:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21933:134:0;;;;;;;;;;:::i;52512:143::-;;;:::i;51730:307::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51730:307:0;-1:-1:-1;;;;;51730:307:0;;:::i;48412:128::-;;;:::i;37487:104::-;;;:::i;28771:83::-;28841:5;28834:12;;;;;;;;-1:-1:-1;;28834:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28808:13;;28834:12;;28841:5;;28834:12;;28841:5;28834:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28771:83;;:::o;22214:152::-;22280:4;22297:39;22306:12;:10;:12::i;:::-;22320:7;22329:6;22297:8;:39::i;:::-;-1:-1:-1;22354:4:0;22214:152;;;;;:::o;48546:100::-;48596:7;48619:21;:19;:21::i;:::-;48612:28;;48546:100;:::o;52122:301::-;37327:10;:8;:10::i;:::-;-1:-1:-1;;;;;37319:32:0;;37352:10;37319:44;;;;;;;;;;;;;-1:-1:-1;;;;;37319:44:0;-1:-1:-1;;;;;37319:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37319:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37319:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37319:44:0;;:92;;;37375:10;:8;:10::i;:::-;-1:-1:-1;;;;;37367:32:0;;37400:10;37367:44;;;;;;;;;;;;;-1:-1:-1;;;;;37367:44:0;-1:-1:-1;;;;;37367:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37367:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37367:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37367:44:0;37319:92;37310:157;;;;-1:-1:-1;;;37310:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52246:12;52261:39;52281:18;:16;:18::i;:::-;52261:15;;:39;:19;:39;:::i;:::-;52246:54;;52307:28;52330:4;52307:22;:28::i;:::-;52342:29;52361:9;52342:18;:29::i;:::-;52383:34;;;-1:-1:-1;;;;;52383:34:0;;;;;;;;;;;;;;;;;;;;;;;37474:1;52122:301;:::o;51336:97::-;51385:7;51408:19;:17;:19::i;58062:188::-;35812:10;:8;:10::i;:::-;-1:-1:-1;;;;;35804:32:0;;35837:10;35804:44;;;;;;;;;;;;;-1:-1:-1;;;;;35804:44:0;-1:-1:-1;;;;;35804:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35804:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35804:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35804:44:0;35796:71;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;;;;58130:28;58153:4;58130:22;:28::i;:::-;58165:79;58197:46;58217:25;:23;:25::i;58197:46::-;58165:31;:79::i;:::-;58062:188;:::o;28515:186::-;17386:12;;;;;;;;:31;;;17402:15;:13;:15::i;:::-;17386:47;;;-1:-1:-1;17422:11:0;;;;17421:12;17386:47;17378:106;;;;-1:-1:-1;;;17378:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17493:19;17516:12;;;;;;17515:13;17535:83;;;;17564:12;:19;;-1:-1:-1;;;;17564:19:0;;;;;17592:18;17579:4;17592:18;;;17535:83;28623:12;;;;:5;;:12;;;;;:::i;:::-;-1:-1:-1;28646:16:0;;;;:7;;:16;;;;;:::i;:::-;-1:-1:-1;28673:9:0;:20;;-1:-1:-1;;28673:20:0;;;;;;;17636:57;;;;17680:5;17665:20;;-1:-1:-1;;17665:20:0;;;17636:57;28515:186;;;;:::o;21235:91::-;21306:12;;21235:91;:::o;50274:307::-;50338:7;;50366:10;:8;:10::i;:::-;-1:-1:-1;;;;;50358:33:0;;50354:127;;;50447:26;:24;:26::i;:::-;50440:33;;;;50354:127;50494:81;50535:10;:8;:10::i;:::-;-1:-1:-1;;;;;50525:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50525:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50525:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50525:49:0;50494:26;:24;:26::i;:::-;:30;:81;:30;:81;:::i;22838:304::-;22927:4;22944:36;22954:6;22962:9;22973:6;22944:9;:36::i;:::-;22991:121;23000:6;23008:12;:10;:12::i;:::-;23022:89;23060:6;23022:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23022:19:0;;;;;;:11;:19;;;;;;23042:12;:10;:12::i;:::-;-1:-1:-1;;;;;23022:33:0;;;;;;;;;;;;-1:-1:-1;23022:33:0;;;:89;;:37;:89;:::i;:::-;22991:8;:121::i;:::-;-1:-1:-1;23130:4:0;22838:304;;;;;:::o;55854:1457::-;55936:1;55920:13;:11;:13::i;:::-;:17;55912:49;;;;;-1:-1:-1;;;55912:49:0;;;;;;;;;;;;-1:-1:-1;;;55912:49:0;;;;;;;;;;;;;;;55993:1;55976:14;:18;55968:68;;;;-1:-1:-1;;;55968:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56043:19;56065:13;:11;:13::i;:::-;56043:35;;56085:33;56091:10;56103:14;56085:5;:33::i;:::-;56127:34;56164:90;56242:11;56164:63;56212:14;56164:33;:31;:33::i;:::-;:47;:63;:47;:63;:::i;:::-;:77;:90;:77;:90;:::i;:::-;56127:127;;56294:26;:24;:26::i;:::-;56265;:55;56261:631;;;56437:11;56419:14;:29;56415:258;;;56471:10;:8;:10::i;:::-;-1:-1:-1;;;;;56461:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56461:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56461:42:0;;;;56415:258;;;56530:15;56548:58;56579:26;:24;:26::i;:::-;56548;;:58;:30;:58;:::i;:::-;56530:76;;56627:10;:8;:10::i;:::-;-1:-1:-1;;;;;56617:37:0;;56655:7;56617:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56617:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56617:46:0;;;;56415:258;;56752:132;56761:94;56843:11;56761:65;56811:14;56761:33;:31;:33::i;:94::-;56857:26;:24;:26::i;:::-;56752:8;:132::i;:::-;56723:161;;56261:631;56900:73;56934:10;56946:26;56907:12;:10;:12::i;:::-;-1:-1:-1;;;;;56900:33:0;;:73;;:33;:73;:::i;:::-;57101:25;:23;:25::i;:::-;57097:95;;;57152:10;:8;:10::i;:::-;-1:-1:-1;;;;;57137:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57137:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57137:47:0;;;;57097:95;57257:48;;;;;;;;57266:10;;57257:48;;;;;;;;;;55854:1457;;;:::o;29623:83::-;29689:9;;;;29623:83;:::o;52661:1045::-;37327:10;:8;:10::i;:::-;-1:-1:-1;;;;;37319:32:0;;37352:10;37319:44;;;;;;;;;;;;;-1:-1:-1;;;;;37319:44:0;-1:-1:-1;;;;;37319:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37319:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37319:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37319:44:0;;:92;;;37375:10;:8;:10::i;:::-;-1:-1:-1;;;;;37367:32:0;;37400:10;37367:44;;;;;;;;;;;;;-1:-1:-1;;;;;37367:44:0;-1:-1:-1;;;;;37367:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37367:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37367:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37367:44:0;37319:92;37310:157;;;;-1:-1:-1;;;37310:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52750:28;52768:9;52750:17;:28::i;:::-;52742:106;;;;-1:-1:-1;;;52742:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52863:23:0;;52855:65;;;;;-1:-1:-1;;;52855:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52980:12;:10;:12::i;:::-;-1:-1:-1;;;;;52935:58:0;52945:9;-1:-1:-1;;;;;52935:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52935:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52935:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52935:33:0;-1:-1:-1;;;;;52935:58:0;;52927:118;;;;-1:-1:-1;;;52927:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53100:4;-1:-1:-1;;;;;53060:45:0;53070:9;-1:-1:-1;;;;;53060:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53060:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53060:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53060:28:0;-1:-1:-1;;;;;53060:45:0;;53052:100;;;;-1:-1:-1;;;53052:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53166:38;53182:9;53193:10;:8;:10::i;:::-;53166:38;;;-1:-1:-1;;;;;53166:38:0;;;;;;;;;;;;;;;;;;;;;;;;53245:10;:8;:10::i;:::-;-1:-1:-1;;;;;53215:41:0;53223:9;-1:-1:-1;;;;;53215:41:0;;53211:459;;53302:1;53279:10;:8;:10::i;:::-;-1:-1:-1;;;;;53271:33:0;;53267:224;;53372:56;53413:10;:8;:10::i;:::-;53426:1;53379:12;:10;:12::i;:::-;-1:-1:-1;;;;;53372:32:0;;:56;;:32;:56;:::i;:::-;53449:10;:8;:10::i;:::-;-1:-1:-1;;;;;53439:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53439:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53439:42:0;;;;53267:224;53499:23;53512:9;53499:12;:23::i;:::-;53531:56;53572:10;:8;:10::i;53531:56::-;53596:66;53637:10;:8;:10::i;:::-;-1:-1:-1;;53603:12:0;:10;:12::i;53596:66::-;53676:24;:22;:24::i;55594:116::-;49124:10;49138:9;49124:23;;49123:233;;;49322:12;:10;:12::i;:::-;-1:-1:-1;;;;;49310:34:0;;49345:10;49310:46;;;;;;;;;;;;;-1:-1:-1;;;;;49310:46:0;-1:-1:-1;;;;;49310:46:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49310:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49310:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49310:46:0;49309:47;49123:233;49107:388;;;;-1:-1:-1;;;49107:388:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55668:36;55677:6;55685:10;55697:6;55668:8;:36::i;:::-;55594:116;;:::o;23551:210::-;23631:4;23648:83;23657:12;:10;:12::i;:::-;23671:7;23680:50;23719:10;23680:11;:25;23692:12;:10;:12::i;:::-;-1:-1:-1;;;;;23680:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;23680:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;41000:716::-;17386:12;;;;;;;;:31;;;17402:15;:13;:15::i;:::-;17386:47;;;-1:-1:-1;17422:11:0;;;;17421:12;17386:47;17378:106;;;;-1:-1:-1;;;17378:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17493:19;17516:12;;;;;;17515:13;17535:83;;;;17564:12;:19;;-1:-1:-1;;;;17564:19:0;;;;;17592:18;17579:4;17592:18;;;17535:83;41251:27;41266:11;41251:14;:27::i;:::-;41285:54;41320:18;41285:34;:54::i;:::-;41346:58;41383:20;41346:36;:58::i;:::-;41411:35;41430:15;41411:18;:35::i;:::-;41453:55;41481:26;41453:27;:55::i;:::-;41515:42;41536:20;41515;:42::i;:::-;41564:25;41587:1;41564:22;:25::i;:::-;41596:30;41623:1;41596:18;:30::i;:::-;41633:34;41661:5;41633:27;:34::i;:::-;41674:36;41704:5;41674:29;:36::i;:::-;17640:14;17636:57;;;17680:5;17665:20;;-1:-1:-1;;17665:20:0;;;17636:57;41000:716;;;;;;;:::o;48282:124::-;48344:7;48367:33;:31;:33::i;49714:187::-;48969:1;48946:10;:8;:10::i;:::-;-1:-1:-1;;;;;48938:33:0;;;48930:70;;;;;-1:-1:-1;;;48930:70:0;;;;;;;;;;;;-1:-1:-1;;;48930:70:0;;;;;;;;;;;;;;;37327:10;:8;:10::i;:::-;-1:-1:-1;;;;;37319:32:0;;37352:10;37319:44;;;;;;;;;;;;;-1:-1:-1;;;;;37319:44:0;-1:-1:-1;;;;;37319:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37319:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37319:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37319:44:0;;:92;;;37375:10;:8;:10::i;:::-;-1:-1:-1;;;;;37367:32:0;;37400:10;37367:44;;;;;;;;;;;;;-1:-1:-1;;;;;37367:44:0;-1:-1:-1;;;;;37367:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37367:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37367:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37367:44:0;37319:92;37310:157;;;;-1:-1:-1;;;37310:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49846:8;:6;:8::i;:::-;49871:10;:8;:10::i;:::-;-1:-1:-1;;;;;49861:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49861:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;48184:92:0;48230:7;48253:17;:15;:17::i;36685:104::-;36728:7;36759:10;:8;:10::i;:::-;-1:-1:-1;;;;;36751:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36751:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36751:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36751:32:0;;-1:-1:-1;36685:104:0;:::o;51130:93::-;51177:7;51200:17;:15;:17::i;48094:84::-;48136:7;48159:13;:11;:13::i;21389:110::-;-1:-1:-1;;;;;21473:18:0;;21446:7;21473:18;;;:9;:18;;;;;;21389:110;;;;:::o;50587:214::-;50640:7;50663:13;:11;:13::i;:::-;:18;:132;;50721:74;50781:13;:11;:13::i;:::-;50721:55;50742:33;:31;:33::i;:::-;50721:16;:14;:16::i;:74::-;50663:132;;;50693:16;:14;:16::i;54101:98::-;37327:10;:8;:10::i;:::-;-1:-1:-1;;;;;37319:32:0;;37352:10;37319:44;;;;;;;;;;;;;-1:-1:-1;;;;;37319:44:0;-1:-1:-1;;;;;37319:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37319:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37319:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37319:44:0;;:92;;;37375:10;:8;:10::i;:::-;-1:-1:-1;;;;;37367:32:0;;37400:10;37367:44;;;;;;;;;;;;;-1:-1:-1;;;;;37367:44:0;-1:-1:-1;;;;;37367:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37367:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37367:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37367:44:0;37319:92;37310:157;;;;-1:-1:-1;;;37310:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54165:13;:11;:13::i;:::-;54185:8;:6;:8::i;:::-;54101:98::o;48652:118::-;48711:7;48734:30;:28;:30::i;55716:132::-;37327:10;:8;:10::i;:::-;-1:-1:-1;;;;;37319:32:0;;37352:10;37319:44;;;;;;;;;;;;;-1:-1:-1;;;;;37319:44:0;-1:-1:-1;;;;;37319:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37319:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37319:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37319:44:0;;:92;;;37375:10;:8;:10::i;:::-;-1:-1:-1;;;;;37367:32:0;;37400:10;37367:44;;;;;;;;;;;;;-1:-1:-1;;;;;37367:44:0;-1:-1:-1;;;;;37367:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37367:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37367:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37367:44:0;37319:92;37310:157;;;;-1:-1:-1;;;37310:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48969:1;48946:10;:8;:10::i;:::-;-1:-1:-1;;;;;48938:33:0;;;48930:70;;;;;-1:-1:-1;;;48930:70:0;;;;;;;;;;;;-1:-1:-1;;;48930:70:0;;;;;;;;;;;;;;;55810:10;:8;:10::i;:::-;-1:-1:-1;;;;;55800:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;50856:268:0;50945:7;50965:13;:11;:13::i;:::-;50961:49;;-1:-1:-1;51001:1:0;50994:8;;50961:49;51023:95;51104:13;:11;:13::i;:::-;51023:66;51071:17;51081:6;51071:9;:17::i;:::-;51023:33;:31;:33::i;47012:990::-;17386:12;;;;;;;;:31;;;17402:15;:13;:15::i;:::-;17386:47;;;-1:-1:-1;17422:11:0;;;;17421:12;17386:47;17378:106;;;;-1:-1:-1;;;17378:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17493:19;17516:12;;;;;;17515:13;17535:83;;;;17564:12;:19;;-1:-1:-1;;;;17564:19:0;;;;;17592:18;17579:4;17592:18;;;17535:83;47209:20;47187:18;:42;;47179:83;;;;;-1:-1:-1;;;47179:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47277:25;47269:56;;;;;-1:-1:-1;;;47269:56:0;;;;;;;;;;;;-1:-1:-1;;;47269:56:0;;;;;;;;;;;;;;;47334:227;47410:11;-1:-1:-1;;;;;47396:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47396:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47396:35:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;47396:35:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;47396:35:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;47396:35:0;;420:4:-1;411:14;;;;47396:35:0;;;;;411:14:-1;47396:35:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;47396:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47374:58;;;;;;-1:-1:-1;;;47374:58:0;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;47374:58:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;47374:58:0;;;47485:11;-1:-1:-1;;;;;47471:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47471:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47471:35:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;47471:35:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;47471:35:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;47471:35:0;;420:4:-1;411:14;;;;47471:35:0;;;;;411:14:-1;47471:35:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;47471:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47449:58;;;;;;-1:-1:-1;;;47449:58:0;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;47449:58:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;47449:58:0;;;47531:11;-1:-1:-1;;;;;47517:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47517:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47517:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47517:37:0;47334:24;:227::i;:::-;47568:51;47604:8;47568:27;:51::i;:::-;47628:22;47689:11;-1:-1:-1;;;;;47667:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47667:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47667:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47667:46:0;47659:55;;47653:2;:61;;-1:-1:-1;47751:8:0;;47811:185;47843:11;47863:18;47890:20;47653:61;47751:8;;47811:23;:185::i;:::-;17626:1;;;17640:14;17636:57;;;17680:5;17665:20;;-1:-1:-1;;17665:20:0;;;17636:57;47012:990;;;;;:::o;36314:160::-;35812:10;:8;:10::i;:::-;-1:-1:-1;;;;;35804:32:0;;35837:10;35804:44;;;;;;;;;;;;;-1:-1:-1;;;;;35804:44:0;-1:-1:-1;;;;;35804:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35804:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35804:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35804:44:0;35796:71;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36387:20:0;;36379:63;;;;;-1:-1:-1;;;36379:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36449:19;36461:6;36449:11;:19::i;28973:87::-;29045:7;29038:14;;;;;;;;-1:-1:-1;;29038:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29012:13;;29038:14;;29045:7;;29038:14;;29045:7;29038:14;;;;;;;;;;;;;;;;;;;;;;;;58531:139;35812:10;:8;:10::i;:::-;-1:-1:-1;;;;;35804:32:0;;35837:10;35804:44;;;;;;;;;;;;;-1:-1:-1;;;;;35804:44:0;-1:-1:-1;;;;;35804:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35804:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35804:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35804:44:0;35796:71;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;;;;58589:34;58620:1;58589:22;:34::i;:::-;58630;58662:1;58630:31;:34::i;58256:269::-;58304:4;58310:7;58342:29;:27;:29::i;:::-;:34;;;;:94;;;58407:29;:27;:29::i;:::-;58389:15;:47;58342:94;:141;;;;-1:-1:-1;58481:1:0;58449:20;:18;:20::i;:::-;-1:-1:-1;;;;;58449:34:0;;;58342:141;58492:20;:18;:20::i;:::-;58326:193;;;;58256:269;;:::o;24264:261::-;24349:4;24366:129;24375:12;:10;:12::i;:::-;24389:7;24398:96;24437:15;24398:96;;;;;;;;;;;;;;;;;:11;:25;24410:12;:10;:12::i;:::-;-1:-1:-1;;;;;24398:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;24398:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;53712:383::-;35812:10;:8;:10::i;:::-;-1:-1:-1;;;;;35804:32:0;;35837:10;35804:44;;;;;;;;;;;;;-1:-1:-1;;;;;35804:44:0;-1:-1:-1;;;;;35804:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35804:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35804:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35804:44:0;35796:71;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;;;;53839:1;53825:11;:15;53817:62;;;;-1:-1:-1;;;53817:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53907:11;53894:9;:24;;53886:95;;;;-1:-1:-1;;;53886:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53988:45;54023:9;53988:34;:45::i;:::-;54040:49;54077:11;54040:36;:49::i;48776:110::-;48831:7;48854:26;:24;:26::i;48008:80::-;48048:7;48071:11;:9;:11::i;21712:158::-;21781:4;21798:42;21808:12;:10;:12::i;:::-;21822:9;21833:6;21798:9;:42::i;51229:101::-;51280:7;51303:21;:19;:21::i;54205:710::-;54258:7;54274:25;54302:131;54398:34;:32;:34::i;:::-;54302:81;54350:32;:30;:32::i;54302:131::-;54274:159;;54440:23;54476:10;:8;:10::i;:::-;-1:-1:-1;;;;;54466:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54466:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54466:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54466:49:0;;-1:-1:-1;54526:36:0;;;54522:388;;54580:1;54573:8;;;;;;54522:388;54604:25;54632:38;:17;54654:15;54632:38;:21;:38;:::i;:::-;54604:66;;54707:26;:24;:26::i;:::-;54686:17;:47;;:216;;54876:26;:24;:26::i;:::-;54686:216;;;54856:17;54686:216;54679:223;;;;;;;51586:138;35812:10;:8;:10::i;:::-;-1:-1:-1;;;;;35804:32:0;;35837:10;35804:44;;;;;;;;;;;;;-1:-1:-1;;;;;35804:44:0;-1:-1:-1;;;;;35804:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35804:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35804:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35804:44:0;35796:71;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;;;;51671:47;46685:66;51711:6;51671:10;:47::i;55301:103::-;49124:10;49138:9;49124:23;;49123:233;;;49322:12;:10;:12::i;:::-;-1:-1:-1;;;;;49310:34:0;;49345:10;49310:46;;;;;;;;;;;;;-1:-1:-1;;;;;49310:46:0;-1:-1:-1;;;;;49310:46:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49310:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49310:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49310:46:0;49309:47;49123:233;49107:388;;;;-1:-1:-1;;;49107:388:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55358:40;55367:6;55375:10;55387;55358:8;:40::i;51461:121::-;51517:4;51537:39;46685:66;51537:10;:39::i;49984:131::-;50041:7;50071:12;:10;:12::i;:::-;-1:-1:-1;;;;;50064:30:0;;50103:4;50064:45;;;;;;;;;;;;;-1:-1:-1;;;;;50064:45:0;-1:-1:-1;;;;;50064:45:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;37029:105:0;17386:12;;;;;;;;:31;;;17402:15;:13;:15::i;:::-;17386:47;;;-1:-1:-1;17422:11:0;;;;17421:12;17386:47;17378:106;;;;-1:-1:-1;;;17378:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17493:19;17516:12;;;;;;17515:13;17535:83;;;;17564:12;:19;;-1:-1:-1;;;;17564:19:0;;;;;17592:18;17579:4;17592:18;;;17535:83;37093:35;37119:8;37093:25;:35::i;:::-;17640:14;17636:57;;;17680:5;17665:20;;-1:-1:-1;;17665:20:0;;;37029:105;;:::o;21933:134::-;-1:-1:-1;;;;;22032:18:0;;;22005:7;22032:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21933:134::o;52512:143::-;37327:10;:8;:10::i;:::-;-1:-1:-1;;;;;37319:32:0;;37352:10;37319:44;;;;;;;;;;;;;-1:-1:-1;;;;;37319:44:0;-1:-1:-1;;;;;37319:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37319:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37319:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37319:44:0;;:92;;;37375:10;:8;:10::i;:::-;-1:-1:-1;;;;;37367:32:0;;37400:10;37367:44;;;;;;;;;;;;;-1:-1:-1;;;;;37367:44:0;-1:-1:-1;;;;;37367:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37367:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37367:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37367:44:0;37319:92;37310:157;;;;-1:-1:-1;;;37310:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52587:25;52610:1;52587:22;:25::i;:::-;52619:30;52646:1;52619:18;:30::i;51730:307::-;51796:4;;51816:10;:8;:10::i;:::-;-1:-1:-1;;;;;51816:24:0;;:185;;;;51892:16;:14;:16::i;:::-;-1:-1:-1;;;;;51879:29:0;:9;-1:-1:-1;;;;;51879:29:0;;:82;;;;;51941:20;:18;:20::i;:::-;51923:15;:38;51879:82;:121;;;;;51999:1;51976:20;:18;:20::i;:::-;:24;;51730:307;-1:-1:-1;;51730:307:0:o;48412:128::-;48476:7;48499:35;:33;:35::i;37487:104::-;37530:7;37561:10;:8;:10::i;:::-;-1:-1:-1;;;;;37553:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;19282:98:0;19362:10;19282:98;:::o;27195:338::-;-1:-1:-1;;;;;27289:19:0;;27281:68;;;;-1:-1:-1;;;27281:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27368:21:0;;27360:68;;;;-1:-1:-1;;;27360:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27441:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;27493:32;;;;;;;;;;;;;;;;;27195:338;;;:::o;43650:120::-;43704:7;43727:37;38399:66;43727:10;:37::i;36480:199::-;35690:66;36656:11;;36640:34::o;1816:181::-;1874:7;1906:5;;;1930:6;;;;1922:46;;;;;-1:-1:-1;;;1922:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1988:1;1816:181;-1:-1:-1;;;1816:181:0:o;44802:116::-;44866:46;39036:66;44905:6;44866:10;:46::i;44571:107::-;44631:41;38910:66;44665:6;44631:10;:41::i;44448:117::-;44500:7;44523:36;38789:66;44523:10;:36::i;43525:119::-;43591:47;38399:66;43629:8;43591:10;:47::i;43776:134::-;43849:55;38534:66;43897:6;43849:10;:55::i;17787:476::-;18227:7;18215:20;18250:7;17787:476;:::o;25015:471::-;-1:-1:-1;;;;;25113:20:0;;25105:70;;;;-1:-1:-1;;;25105:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25194:23:0;;25186:71;;;;-1:-1:-1;;;25186:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25290;25312:6;25290:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25290:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;25270:17:0;;;;;;;:9;:17;;;;;;:91;;;;25395:20;;;;;;;:32;;25420:6;25395:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;25372:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;25443:35;;;;;;;25372:20;;25443:35;;;;;;;;;;;;;25015:471;;;:::o;2745:192::-;2831:7;2867:12;2859:6;;;;2851:29;;;;-1:-1:-1;;;2851:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2851:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2903:5:0;;;2745:192::o;26407:348::-;-1:-1:-1;;;;;26483:21:0;;26475:67;;;;-1:-1:-1;;;26475:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26576:68;26599:6;26576:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26576:18:0;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;26555:18:0;;;;;;:9;:18;;;;;:89;26670:12;;:24;;26687:6;26670:24;:16;:24;:::i;:::-;26655:12;:39;26710:37;;;;;;;;26736:1;;-1:-1:-1;;;;;26710:37:0;;;;;;;;;;;;26407:348;;:::o;3188:471::-;3246:7;3491:6;3487:47;;-1:-1:-1;3521:1:0;3514:8;;3487:47;3558:5;;;3562:1;3558;:5;:1;3582:5;;;;;:10;3574:56;;;;-1:-1:-1;;;3574:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4127:132;4185:7;4212:39;4216:1;4219;4212:39;;;;;;;;;;;;;;;;;:3;:39::i;2272:136::-;2330:7;2357:43;2361:1;2364;2357:43;;;;;;;;;;;;;;;;;:3;:43::i;451:106::-;509:7;540:1;536;:5;:13;;548:1;536:13;;;-1:-1:-1;544:1:0;;451:106;-1:-1:-1;451:106:0:o;13108:176::-;13217:58;;;-1:-1:-1;;;;;13217:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13217:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13191:85:0;;13210:5;;13191:18;:85::i;:::-;13108:176;;;:::o;13504:621::-;13874:10;;;13873:62;;-1:-1:-1;13890:39:0;;;-1:-1:-1;;;13890:39:0;;13914:4;13890:39;;;;-1:-1:-1;;;;;13890:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;13890:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13890:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13890:39:0;:44;13873:62;13865:152;;;;-1:-1:-1;;;13865:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14054:62;;;-1:-1:-1;;;;;14054:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;14054:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;14028:89:0;;14047:5;;14028:18;:89::i;41722:98::-;41778:36;37755:66;41805:8;41778:10;:36::i;57317:676::-;57421:1;57412:6;:10;57404:39;;;;;-1:-1:-1;;;57404:39:0;;;;;;;;;;;;-1:-1:-1;;;57404:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;57458:25:0;;57450:60;;;;;-1:-1:-1;;;57450:60:0;;;;;;;;;;;;-1:-1:-1;;;57450:60:0;;;;;;;;;;;;;;;57554:1;57531:10;:8;:10::i;:::-;-1:-1:-1;;;;;57523:33:0;;57519:120;;57585:10;:8;:10::i;:::-;-1:-1:-1;;;;;57575:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57575:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57575:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57575:39:0;57567:64;;;;;-1:-1:-1;;;57567:64:0;;;;;;;;;;;;-1:-1:-1;;;57567:64:0;;;;;;;;;;;;;;;57647:14;57664:13;:11;:13::i;:::-;:18;:112;;57712:64;57742:33;:31;:33::i;:::-;57712:25;57723:13;:11;:13::i;:::-;57712:6;;:25;:10;:25;:::i;:64::-;57664:112;;;57694:6;57664:112;57647:129;;57783:26;57789:11;57802:6;57783:5;:26::i;:::-;57818:68;57856:6;57872:4;57879:6;57825:12;:10;:12::i;:::-;-1:-1:-1;;;;;57818:37:0;;:68;;;:37;:68;:::i;:::-;57959:28;;;;;;;;-1:-1:-1;;;;;57959:28:0;;;;;;;;;;;;;57317:676;;;;:::o;41931:102::-;41989:38;37871:66;42018:8;41989:10;:38::i;42379:142::-;42455:60;38132:66;42508:6;42455:10;:60::i;42680:146::-;42758:62;38274:66;42813:6;42758:10;:62::i;42148:107::-;42208:41;37992:66;42242:6;42208:10;:41::i;44061:126::-;44130:51;38665:66;44174:6;44130:10;:51::i;44330:112::-;44392:44;38789:66;44429:6;44392:10;:44::i;42989:124::-;43055:52;39168:66;43100:6;43055:10;:52::i;43254:127::-;43322:53;39301:66;43368:6;43322:10;:53::i;42527:147::-;42593:7;42616:52;38132:66;42616:10;:52::i;54921:264::-;48969:1;48946:10;:8;:10::i;:::-;-1:-1:-1;;;;;48938:33:0;;;48930:70;;;;;-1:-1:-1;;;48930:70:0;;;;;;;;;;;;-1:-1:-1;;;48930:70:0;;;;;;;;;;;;;;;54975:23;55001:22;:20;:22::i;:::-;54975:48;-1:-1:-1;55034:19:0;;55030:150;;55064:71;55106:10;:8;:10::i;:::-;55119:15;55071:12;:10;:12::i;55064:71::-;55149:23;;;;;;;;;;;;;;;;;49007:1;54921:264::o;42261:112::-;42311:7;42334:33;37992:66;42334:10;:33::i;44684:112::-;44734:7;44757:33;38910:66;44757:10;:33::i;42039:103::-;42085:7;42108:28;37871:66;42108:10;:28::i;43916:139::-;43979:7;44002:47;38534:66;44002:10;:47::i;36110:198::-;35690:66;36272:24;36263:40::o;44193:131::-;44252:7;44275:43;38665:66;44275:10;:43::i;41826:99::-;41870:7;41893:26;37755:66;41893:10;:26::i;44924:121::-;44978:7;45001:38;39036:66;45001:10;:38::i;45051:101::-;45114:32;45125:4;45131:6;:14;;45144:1;45131:14;;;45140:1;45131:14;45114:32;;:10;:32::i;45158:106::-;45215:4;45236:16;45247:4;45236:10;:16::i;:::-;45256:1;45236:21;;45158:106;-1:-1:-1;;45158:106:0:o;36017:87::-;17386:12;;;;;;;;:31;;;17402:15;:13;:15::i;:::-;17386:47;;;-1:-1:-1;17422:11:0;;;;17421:12;17386:47;17378:106;;;;-1:-1:-1;;;17378:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17493:19;17516:12;;;;;;17515:13;17535:83;;;;17564:12;:19;;-1:-1:-1;;;;17564:19:0;;;;;17592:18;17579:4;17592:18;;;17535:83;36079:19;36091:6;36079:11;:19::i;42832:151::-;42900:7;42923:54;38274:66;45622:177;45776:11;;45760:34::o;45448:168::-;45584:20;;45575:36::o;4789:345::-;4875:7;4977:12;4970:5;4962:28;;;;-1:-1:-1;;;4962:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4962:28:0;;5001:9;5017:1;5013;:5;;;;;;;4789:345;-1:-1:-1;;;;;4789:345:0:o;15147:1114::-;15751:27;15759:5;-1:-1:-1;;;;;15751:25:0;;:27::i;:::-;15743:71;;;;;-1:-1:-1;;;15743:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15888:12;15902:23;15937:5;-1:-1:-1;;;;;15929:19:0;15949:4;15929:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15929:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;15887:67:0;;;;15973:7;15965:52;;;;;-1:-1:-1;;;15965:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16034:17;;:21;16030:224;;16176:10;16165:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16165:30:0;16157:85;;;;-1:-1:-1;;;16157:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25767:308;-1:-1:-1;;;;;25843:21:0;;25835:65;;;;;-1:-1:-1;;;25835:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25928:12;;:24;;25945:6;25928:24;:16;:24;:::i;:::-;25913:12;:39;-1:-1:-1;;;;;25984:18:0;;;;;;:9;:18;;;;;;:30;;26007:6;25984:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;25963:18:0;;;;;;:9;:18;;;;;;;;:51;;;;26030:37;;;;;;;25963:18;;;;26030:37;;;;;;;;;;25767:308;;:::o;13292:204::-;13419:68;;;-1:-1:-1;;;;;13419:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13419:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13393:95:0;;13412:5;;13393:18;:95::i;10110:619::-;10170:4;10638:20;;10481:66;10678:23;;;;;;:42;;-1:-1:-1;10705:15:0;;;10678:42;10670:51;10110:619;-1:-1:-1;;;;10110:619:0:o;46116:12557::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46116:12557:0;;;-1:-1:-1;46116:12557:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://a7e08d6be18da9085daf733e25e4c3e4b5ce8a48f9dc5f103fc011429fe4ae1c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.