Contract
0xA5aDE4EAC20a1F1f90a51E5eaA2852D8ea098C89
2
Contract Overview
Balance:
0 FTM
FTM Value:
$0.00
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
VaultH2O
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at FtmScan.com on 2021-11-21 */ // SPDX-License-Identifier: MIT pragma solidity =0.8.9; interface IERC20Simplified { /** * @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 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); } 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); } interface IERC20MetadataS is IERC20Simplified { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } contract ERC20Simplified is Context, IERC20Simplified, IERC20MetadataS { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function decimals() public view virtual override returns (uint8) { return 18; } function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); } } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(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: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } interface IStrategy { function WETH() external view returns (address); function router() external view returns (address); function lpToken() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function farm() external view returns (address); function pid() external view returns (uint256); function hasPid() external view returns (bool); function getTotalCapitalInternal() external view returns (uint256); function getTotalCapital() external view returns (uint256); function getAmountLPFromFarm() external view returns (uint256); function getPendingYel(address) external view returns (uint256); function claimYel(address) external; function setRouter(address) external; function requestWithdraw(address, uint256) external; function withdrawUSDTFee(address) external; function emergencyWithdraw(address) external; function autoCompound() external; function deposit() external payable returns (uint256); function depositAsMigrate() external; function migrate(uint256) external; function updateTWAP() external; function token1TWAP() external view returns (uint256); function token0TWAP() external view returns (uint256); function token1Price() external view returns (uint256); function token0Price() external view returns (uint256); } contract VaultH2O is ERC20Simplified, Ownable { using SafeERC20 for IERC20; using Address for address; mapping(address => uint256) private requestBlock; mapping(uint256 => bool) public nameExist; mapping(uint256 => address) public strategies; mapping(address => bool) public strategyExist; uint256 public constant REQUIRED_NUMBER_OF_BLOCKS = 10; uint256 public NUMBER_OF_BLOCKS_BTW_TX = 2; uint256 public lastExecutableBlockByOwner; uint256 public lastExecutableBlockAfterDeposit; uint256 public depositLimitMIN; uint256 public defaultStrategyID = 0; uint256 public depositLimit; address public governance; // string messages string DIFFERENCE_BLOCK_ERROR = "Difference of blocks is less than REQUIRED_NUMBER_OF_BLOCKS"; string NO_STRATEGY_ERROR = "There is no strategy"; string STRATEGY_DOES_NOT_EXIST = "The Name of strategy with this ID does not exist"; uint256[] private names; event DepositToVault(uint256 amount); event RequestYelFromStrategies(); event PartialMigrate(uint256 amount); event Migrate(uint256 amount); constructor() ERC20Simplified("EQ Shares H2O", "EQS") { depositLimit = 1000 * 10 ** 18; depositLimitMIN = 1 * 10 ** 17; // 0.1 governance = 0x4e5b3043FEB9f939448e2F791a66C4EA65A315a8; } receive() external payable { deposit(); } modifier onlyOwnerOrGovernance() { require( owner() == _msgSender() || governance == _msgSender(), "The sender is not the owner or governance" ); _; } modifier onlyGovernance() { require(governance == _msgSender(), "The sender is not governance"); _; } modifier whenNotBlocked() { uint256 currentBlock = block.number; if(requestBlock[msg.sender] == 0) { _; requestBlock[msg.sender] = currentBlock; } else { if(_isNotBlockedByTime()) { _; requestBlock[msg.sender] = currentBlock; } else { revert(DIFFERENCE_BLOCK_ERROR); } } } modifier notBlocked() { _checkBlockedByTime(); _executableAfterUpdate(); _; } modifier executableAfterUpdate() { _executableAfterUpdate(); _; } function deposit() public payable notBlocked { require( block.number - lastExecutableBlockAfterDeposit > NUMBER_OF_BLOCKS_BTW_TX, "NUMBER_OF_BLOCKS_BTW_TX blocks is required between deposit" ); require(msg.value >= depositLimitMIN, "Funds should be >= than depositLimitMIN"); autoCompound(); _checkDeposit(getTotalCapital(), msg.value); require(names.length != 0, NO_STRATEGY_ERROR); uint256 shares; uint256 totalCapitalInternal = getTotalCapitalInternal(); uint256 depositorCapitalValue = IStrategy(currentStrategy()).deposit{value: msg.value}(); if (totalCapitalInternal == 0 || totalSupply() == 0) { shares = depositorCapitalValue; } else { uint256 FTMperShare = totalCapitalInternal * (10**12) / totalSupply(); shares = depositorCapitalValue * (10**12) / FTMperShare; } _mint(msg.sender, shares); lastExecutableBlockAfterDeposit = block.number; emit DepositToVault(depositorCapitalValue); } function requestWithdraw(uint256 _shares) public whenNotBlocked { require(names.length != 0, NO_STRATEGY_ERROR); require(totalSupply() != 0, "Total share value is zero"); require(_shares > 0, "Amount of shares can not be a zero value"); autoCompound(); uint256 percent = _shares * 100 * 10**12 / totalSupply(); require(_shares <= totalSupply(), "Percent can not be more than 100"); _burn(msg.sender, _shares); _requestYelFromStrategies(msg.sender, percent); emit RequestYelFromStrategies(); } function claimYel() public notBlocked { autoCompound(); uint256 _YELamount = 0; uint256 _YELamountTotal = 0; for (uint256 i; i < names.length; i++) { _YELamount = IStrategy(strategies[names[i]]).getPendingYel(msg.sender); if(_YELamount > 0) { IStrategy(strategies[names[i]]).claimYel(msg.sender); _YELamountTotal += _YELamount; } } require(_YELamountTotal > 0, "You don't have any pending YEL"); } function setDefaultStrategy(uint256 _nameID) public onlyOwnerOrGovernance { _checkParameters(_nameID); defaultStrategyID = _nameID; } function getPendingYel(address _address) public view returns (uint256 _YELamount) { for (uint256 i; i < names.length; i++) { _YELamount += IStrategy(strategies[names[i]]).getPendingYel(_address); } } function getRemainingBlocks(address _address) public view returns (uint256) { // just double check if the user uses the contract at the first time if (requestBlock[_address] == 0) { return 0; } uint256 amountFromLast = block.number - requestBlock[_address]; if (amountFromLast >= REQUIRED_NUMBER_OF_BLOCKS) return 0; else return REQUIRED_NUMBER_OF_BLOCKS - amountFromLast; } function nameIDs() public view returns (uint256[] memory) { return names; } function nameIDLength() public view returns(uint256) { return names.length; } function currentStrategy() public view returns (address) { require(names.length > 0, "This vault does not have any strategies"); return strategies[defaultStrategyID]; } function strategyInfo(uint256 _nameID) public view returns ( address _router, address _lpToken, address _token1, address _token0, address _farm, string memory _pid, uint256 _totalLP, uint256 _totalCapital, uint256 _totalCapitalInternal) { require(nameExist[_nameID], STRATEGY_DOES_NOT_EXIST); _router = IStrategy(strategies[_nameID]).router(); _lpToken = IStrategy(strategies[_nameID]).lpToken(); _token1 = IStrategy(strategies[_nameID]).token1(); _token0 = IStrategy(strategies[_nameID]).token0(); _farm = IStrategy(strategies[_nameID]).farm(); if(IStrategy(strategies[_nameID]).hasPid()) { _pid = Strings.toString(IStrategy(strategies[_nameID]).pid()); } else { _pid = "No pid"; } _totalCapital = IStrategy(strategies[_nameID]).getTotalCapital(); _totalCapitalInternal = IStrategy(strategies[_nameID]).getTotalCapitalInternal(); _totalLP = IStrategy(strategies[_nameID]).getAmountLPFromFarm(); } function strategyInfo2(uint256 _nameID) public view returns ( uint256 _token1TWAP, uint256 _token0TWAP, uint256 _token1Price, uint256 _token0Price) { require(nameExist[_nameID], STRATEGY_DOES_NOT_EXIST); address _strategy = strategies[_nameID]; _token1TWAP = IStrategy(_strategy).token1TWAP(); _token0TWAP = IStrategy(_strategy).token0TWAP(); _token1Price = IStrategy(_strategy).token1Price(); _token0Price = IStrategy(_strategy).token0Price(); } function autoCompound() public executableAfterUpdate { require(names.length != 0, NO_STRATEGY_ERROR); for (uint256 i = 0; i < names.length; i++) { IStrategy(strategies[names[i]]).autoCompound(); } } function getTotalCapital() public view returns (uint256 totalCapital) { require(names.length != 0, NO_STRATEGY_ERROR); for (uint256 i = 0; i < names.length; i++) { totalCapital += IStrategy(strategies[names[i]]).getTotalCapital(); } } function getTotalCapitalInternal() public view returns (uint256 totalCapital) { require(names.length != 0, NO_STRATEGY_ERROR); for (uint256 i = 0; i < names.length; i++) { totalCapital += IStrategy(strategies[names[i]]).getTotalCapitalInternal(); } } function withdrawFee() onlyOwner public { for(uint256 i = 0; i < names.length; i++) { IStrategy(strategies[names[i]]).withdrawUSDTFee(msg.sender); } } function setNumberOfBlocksBtwTX(uint256 _amount) onlyOwner public { NUMBER_OF_BLOCKS_BTW_TX = _amount; } function updateTWAP() onlyOwner public { for(uint256 i = 0; i < names.length; i++) { IStrategy(strategies[names[i]]).updateTWAP(); } lastExecutableBlockByOwner = block.number; } function emergencyWithdraw() public onlyGovernance { for (uint256 i; i < names.length; i++) { IStrategy(strategies[names[i]]).emergencyWithdraw(msg.sender); } } function setGovernance(address _governance) external onlyOwner { require( _governance != address(0), "Government can not be a zero address" ); governance = _governance; } function setDepositLimit(uint256 _amount) external onlyOwnerOrGovernance { depositLimit = _amount; } function addStrategy(address _newStrategy, uint256 _nameID) public onlyOwnerOrGovernance { require(_newStrategy != address(0), "The strategy can not be a zero address"); require(strategies[_nameID] == address(0), "This strategy is not empty"); require(!strategyExist[_newStrategy], "This strategy already exists"); if (!nameExist[_nameID]) { names.push(_nameID); nameExist[_nameID] = true; strategyExist[_newStrategy] = true; } strategies[_nameID] = _newStrategy; } function removeStrategy(uint256 _nameID) public onlyOwnerOrGovernance { _checkParameters(_nameID); require( strategies[_nameID] != currentStrategy(), "Can not remove the current strategy" ); require(IStrategy(strategies[_nameID]).getTotalCapitalInternal() == 0, "Total capital internal is not zero" ); require(IStrategy(strategies[_nameID]).getTotalCapital() == 0, "Total capital is not zero" ); // continue removing strategy nameExist[_nameID] = false; strategyExist[strategies[_nameID]] = false; strategies[_nameID] = address(0); if(names.length != 1) { for(uint256 i = 0; i < names.length; i++){ if(names[i] == _nameID) { if(i != names.length-1) { names[i] = names[names.length-1]; } names.pop(); } } } else { names.pop(); } } function setRouterForStrategy(address _newRouter, uint256 _nameID) public onlyOwnerOrGovernance { _checkParameters(_nameID); require(_newRouter != address(0), "Router can not be a zero address"); IStrategy(strategies[_nameID]).setRouter(_newRouter); } function migrate( uint256 _nameIdFrom, uint256 _amountInPercent, uint256 _nameIdTo) public onlyOwnerOrGovernance { _migrate(_nameIdFrom, _amountInPercent, _nameIdTo); } function withdrawSuddenTokens(address _token) public onlyOwner { IERC20(_token).transfer(payable(msg.sender), IERC20(_token).balanceOf(address(this))); } function _executableAfterUpdate() internal view { require( block.number - lastExecutableBlockByOwner > NUMBER_OF_BLOCKS_BTW_TX, "NUMBER_OF_BLOCKS_BTW_TX blocks is required" ); } function _checkParameters(uint256 _nameID) internal view { require(names.length > 1, "Not enough strategies"); require(nameExist[_nameID], STRATEGY_DOES_NOT_EXIST); } function _isNotBlockedByTime() internal view returns (bool) { return block.number - requestBlock[msg.sender] >= REQUIRED_NUMBER_OF_BLOCKS; } function _checkBlockedByTime() internal view { require(_isNotBlockedByTime(), DIFFERENCE_BLOCK_ERROR); } function _migrate(uint256 _nameIdFrom, uint256 _amountInPercent, uint256 _nameIdTo) internal { // TODO: return error if totalCapital on strategy 0 _checkParameters(_nameIdFrom); require(nameExist[_nameIdTo], "The _nameIdTo value does not exist"); require( _amountInPercent > 0 && _amountInPercent <= 100, "The _amountInPercent value sould be more than 0 and less than 100" ); autoCompound(); address WETH = IStrategy(strategies[_nameIdFrom]).WETH(); // take Native Tokens from old strategy IStrategy(strategies[_nameIdFrom]).migrate(_amountInPercent); uint256 _balance = IERC20(WETH).balanceOf(address(this)); if(_balance > 0){ // put Native Tokens to new strategy IERC20(WETH).safeTransfer(strategies[_nameIdTo], _balance); IStrategy(strategies[_nameIdTo]).depositAsMigrate(); } emit PartialMigrate(_amountInPercent); } function _requestYelFromStrategies(address _receiver, uint256 _percent) internal { for (uint256 i; i < names.length; i++) { IStrategy(strategies[names[i]]).requestWithdraw(_receiver, _percent); } } function _checkDeposit(uint256 _totalCapital, uint256 _depositValue) internal view { require(_totalCapital + _depositValue <= depositLimit, "Deposit is limited by contract"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositToVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PartialMigrate","type":"event"},{"anonymous":false,"inputs":[],"name":"RequestYelFromStrategies","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"},{"inputs":[],"name":"NUMBER_OF_BLOCKS_BTW_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REQUIRED_NUMBER_OF_BLOCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newStrategy","type":"address"},{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"addStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimYel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentStrategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultStrategyID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositLimitMIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getPendingYel","outputs":[{"internalType":"uint256","name":"_YELamount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getRemainingBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCapital","outputs":[{"internalType":"uint256","name":"totalCapital","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCapitalInternal","outputs":[{"internalType":"uint256","name":"totalCapital","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastExecutableBlockAfterDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastExecutableBlockByOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameIdFrom","type":"uint256"},{"internalType":"uint256","name":"_amountInPercent","type":"uint256"},{"internalType":"uint256","name":"_nameIdTo","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nameExist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nameIDLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nameIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"removeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"requestWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"setDefaultStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setDepositLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setNumberOfBlocksBtwTX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRouter","type":"address"},{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"setRouterForStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategies","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"strategyExist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"strategyInfo","outputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_farm","type":"address"},{"internalType":"string","name":"_pid","type":"string"},{"internalType":"uint256","name":"_totalLP","type":"uint256"},{"internalType":"uint256","name":"_totalCapital","type":"uint256"},{"internalType":"uint256","name":"_totalCapitalInternal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"strategyInfo2","outputs":[{"internalType":"uint256","name":"_token1TWAP","type":"uint256"},{"internalType":"uint256","name":"_token0TWAP","type":"uint256"},{"internalType":"uint256","name":"_token1Price","type":"uint256"},{"internalType":"uint256","name":"_token0Price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateTWAP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawSuddenTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6002600a556000600e5560e0604052603b60808181529062003c2c60a03980516200003391601191602090910190620001e2565b506040805180820190915260148082527f5468657265206973206e6f20737472617465677900000000000000000000000060209092019182526200007a91601291620001e2565b5060405180606001604052806030815260200162003c67603091398051620000ab91601391602090910190620001e2565b50348015620000b957600080fd5b506040518060400160405280600d81526020016c4551205368617265732048324f60981b8152506040518060400160405280600381526020016245515360e81b815250816003908051906020019062000114929190620001e2565b5080516200012a906004906020840190620001e2565b50505062000147620001416200018c60201b60201c565b62000190565b683635c9adc5dea00000600f5567016345785d8a0000600d55601080546001600160a01b031916734e5b3043feb9f939448e2f791a66c4ea65a315a8179055620002c5565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001f09062000288565b90600052602060002090601f0160209004810192826200021457600085556200025f565b82601f106200022f57805160ff19168380011785556200025f565b828001600101855582156200025f579182015b828111156200025f57825182559160200191906001019062000242565b506200026d92915062000271565b5090565b5b808211156200026d576000815560010162000272565b600181811c908216806200029d57607f821691505b60208210811415620002bf57634e487b7160e01b600052602260045260246000fd5b50919050565b61395780620002d56000396000f3fe60806040526004361061026b5760003560e01c8063ab033ea911610144578063d0e30db0116100b6578063e941fa781161007a578063e941fa7814610736578063ecf708581461074b578063f2fde38b14610761578063f705c03b14610781578063f921215d146107a1578063fc039165146107c157600080fd5b8063d0e30db014610693578063d574ea3d1461069b578063d84dbb1c146106d1578063db2e21bc14610701578063e1a4877a1461071657600080fd5b8063bb91c33911610108578063bb91c339146105d2578063bdc8144b14610607578063c03601cc14610627578063c0cbbca61461063d578063c6cf43861461065d578063c9411e221461067357600080fd5b8063ab033ea914610527578063b032cf6c14610547578063b070a44f1461055d578063b42a8e5514610572578063b44d0b9f1461059257600080fd5b80635eb674b6116101dd578063745400c9116101a1578063745400c91461048a578063821c0576146104aa57806388c95018146104bf5780638da5cb5b146104df57806395d89b41146104fd5780639bea590e1461051257600080fd5b80635eb674b6146103f557806366f2b1a7146104155780636a1ceb2d1461042a57806370a082311461043f578063715018a61461047557600080fd5b80632d73fc081161022f5780632d73fc081461033e5780632d751e0814610354578063313ce5671461036957806351a5cc5b1461038557806354b35d001461039b5780635aa6e675146103bd57600080fd5b806302ee8de91461027f57806305131172146102a757806306fdde03146102c757806318160ddd146102e95780631c7b048d146102fe57600080fd5b3661027a576102786107d6565b005b600080fd5b34801561028b57600080fd5b50610294610a3d565b6040519081526020015b60405180910390f35b3480156102b357600080fd5b506102786102c23660046134aa565b610b47565b3480156102d357600080fd5b506102dc610c74565b60405161029e9190613523565b3480156102f557600080fd5b50600254610294565b34801561030a57600080fd5b5061032e6103193660046134aa565b60096020526000908152604090205460ff1681565b604051901515815260200161029e565b34801561034a57600080fd5b50610294600c5481565b34801561036057600080fd5b50601454610294565b34801561037557600080fd5b506040516012815260200161029e565b34801561039157600080fd5b50610294600e5481565b3480156103a757600080fd5b506103b0610d06565b60405161029e9190613536565b3480156103c957600080fd5b506010546103dd906001600160a01b031681565b6040516001600160a01b03909116815260200161029e565b34801561040157600080fd5b5061027861041036600461357a565b610d5d565b34801561042157600080fd5b50610294600a81565b34801561043657600080fd5b506103dd610e6b565b34801561044b57600080fd5b5061029461045a3660046134aa565b6001600160a01b031660009081526020819052604090205490565b34801561048157600080fd5b50610278610eec565b34801561049657600080fd5b506102786104a53660046135a6565b610f22565b3480156104b657600080fd5b50610278611139565b3480156104cb57600080fd5b506102786104da3660046135bf565b61121e565b3480156104eb57600080fd5b506005546001600160a01b03166103dd565b34801561050957600080fd5b506102dc61126d565b34801561051e57600080fd5b5061027861127c565b34801561053357600080fd5b506102786105423660046134aa565b611363565b34801561055357600080fd5b50610294600a5481565b34801561056957600080fd5b50610278611411565b34801561057e57600080fd5b5061029461058d3660046134aa565b6115f1565b34801561059e57600080fd5b506105b26105ad3660046135a6565b6116d3565b60408051948552602085019390935291830152606082015260800161029e565b3480156105de57600080fd5b506105f26105ed3660046135a6565b6118f6565b60405161029e999897969594939291906135eb565b34801561061357600080fd5b506102786106223660046135a6565b611ecc565b34801561063357600080fd5b50610294600d5481565b34801561064957600080fd5b506102786106583660046135a6565b611f10565b34801561066957600080fd5b50610294600b5481565b34801561067f57600080fd5b5061027861068e36600461357a565b6122de565b6102786107d6565b3480156106a757600080fd5b506103dd6106b63660046135a6565b6008602052600090815260409020546001600160a01b031681565b3480156106dd57600080fd5b5061032e6106ec3660046135a6565b60076020526000908152604090205460ff1681565b34801561070d57600080fd5b50610278612502565b34801561072257600080fd5b506102946107313660046134aa565b61260c565b34801561074257600080fd5b50610278612679565b34801561075757600080fd5b50610294600f5481565b34801561076d57600080fd5b5061027861077c3660046134aa565b612753565b34801561078d57600080fd5b5061027861079c3660046135a6565b6127eb565b3480156107ad57600080fd5b506102786107bc3660046135a6565b612838565b3480156107cd57600080fd5b50610294612867565b6107de61296d565b6107e6612995565b600a54600c546107f69043613669565b1161086e5760405162461bcd60e51b815260206004820152603a60248201527f4e554d4245525f4f465f424c4f434b535f4254575f545820626c6f636b73206960448201527f73207265717569726564206265747765656e206465706f73697400000000000060648201526084015b60405180910390fd5b600d543410156108d05760405162461bcd60e51b815260206004820152602760248201527f46756e64732073686f756c64206265203e3d207468616e206465706f7369744c60448201526634b6b4ba26a4a760c91b6064820152608401610865565b6108d8611139565b6108e96108e3612867565b34612a05565b60145460129061090c5760405162461bcd60e51b815260040161086591906136b5565b50600080610918610a3d565b90506000610924610e6b565b6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016020604051808303818588803b15801561095e57600080fd5b505af1158015610972573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610997919061375d565b90508115806109a65750600254155b156109b3578092506109f7565b60006109be60025490565b6109cd8464e8d4a51000613776565b6109d791906137ab565b9050806109e98364e8d4a51000613776565b6109f391906137ab565b9350505b610a013384612a60565b43600c556040518181527f5c77db97122dd8c9d62f829c415e3e3a2c5ff855518cff951750ce07fa0cd4e39060200160405180910390a1505050565b601454600090601290610a635760405162461bcd60e51b815260040161086591906136b5565b5060005b601454811015610b43576008600060148381548110610a8857610a886137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b03166302ee8de96040518163ffffffff1660e01b815260040160206040518083038186803b158015610aed57600080fd5b505afa158015610b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b25919061375d565b610b2f90836137d5565b915080610b3b816137ed565b915050610a67565b5090565b6005546001600160a01b03163314610b715760405162461bcd60e51b815260040161086590613808565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a082319060240160206040518083038186803b158015610bba57600080fd5b505afa158015610bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf2919061375d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610c3857600080fd5b505af1158015610c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c70919061383d565b5050565b606060038054610c8390613680565b80601f0160208091040260200160405190810160405280929190818152602001828054610caf90613680565b8015610cfc5780601f10610cd157610100808354040283529160200191610cfc565b820191906000526020600020905b815481529060010190602001808311610cdf57829003601f168201915b5050505050905090565b60606014805480602002602001604051908101604052809291908181526020018280548015610cfc57602002820191906000526020600020905b815481526020019060010190808311610d40575050505050905090565b6005546001600160a01b0316331480610d8057506010546001600160a01b031633145b610d9c5760405162461bcd60e51b81526004016108659061385f565b610da581612b3f565b6001600160a01b038216610dfb5760405162461bcd60e51b815260206004820181905260248201527f526f757465722063616e206e6f742062652061207a65726f20616464726573736044820152606401610865565b6000818152600860205260409081902054905163c0d7865560e01b81526001600160a01b0384811660048301529091169063c0d7865590602401600060405180830381600087803b158015610e4f57600080fd5b505af1158015610e63573d6000803e3d6000fd5b505050505050565b601454600090610ecd5760405162461bcd60e51b815260206004820152602760248201527f54686973207661756c7420646f6573206e6f74206861766520616e79207374726044820152666174656769657360c81b6064820152608401610865565b50600e546000908152600860205260409020546001600160a01b031690565b6005546001600160a01b03163314610f165760405162461bcd60e51b815260040161086590613808565b610f206000612bbb565b565b3360009081526006602052604090205443906110ee57601454601290610f5b5760405162461bcd60e51b815260040161086591906136b5565b50600254610fab5760405162461bcd60e51b815260206004820152601960248201527f546f74616c2073686172652076616c7565206973207a65726f000000000000006044820152606401610865565b6000821161100c5760405162461bcd60e51b815260206004820152602860248201527f416d6f756e74206f66207368617265732063616e206e6f742062652061207a65604482015267726f2076616c756560c01b6064820152608401610865565b611014611139565b600061101f60025490565b61102a846064613776565b6110399064e8d4a51000613776565b61104391906137ab565b905061104e60025490565b83111561109d5760405162461bcd60e51b815260206004820181905260248201527f50657263656e742063616e206e6f74206265206d6f7265207468616e203130306044820152606401610865565b6110a73384612c0d565b6110b13382612d5b565b6040517f9b03fe2597ba68323093f58db21a496f6639cdfb717bfc837078f99f41acf38e90600090a1503360009081526006602052604090205550565b6110f6612e14565b1561111e57601454601290610f5b5760405162461bcd60e51b815260040161086591906136b5565b601160405162461bcd60e51b815260040161086591906136b5565b611141612995565b6014546012906111645760405162461bcd60e51b815260040161086591906136b5565b5060005b60145481101561121b576008600060148381548110611189576111896137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031663821c05766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111f057600080fd5b505af1158015611204573d6000803e3d6000fd5b505050508080611213906137ed565b915050611168565b50565b6005546001600160a01b031633148061124157506010546001600160a01b031633145b61125d5760405162461bcd60e51b81526004016108659061385f565b611268838383612e38565b505050565b606060048054610c8390613680565b6005546001600160a01b031633146112a65760405162461bcd60e51b815260040161086590613808565b60005b60145481101561135c5760086000601483815481106112ca576112ca6137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b0316639bea590e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561133157600080fd5b505af1158015611345573d6000803e3d6000fd5b505050508080611354906137ed565b9150506112a9565b5043600b55565b6005546001600160a01b0316331461138d5760405162461bcd60e51b815260040161086590613808565b6001600160a01b0381166113ef5760405162461bcd60e51b8152602060048201526024808201527f476f7665726e6d656e742063616e206e6f742062652061207a65726f206164646044820152637265737360e01b6064820152608401610865565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b61141961296d565b611421612995565b611429611139565b60008060005b6014548110156115a0576008600060148381548110611450576114506137bf565b6000918252602080832091909101548352820192909252604090810190912054905163b42a8e5560e01b81523360048201526001600160a01b039091169063b42a8e559060240160206040518083038186803b1580156114af57600080fd5b505afa1580156114c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e7919061375d565b9250821561158e576008600060148381548110611506576115066137bf565b6000918252602080832091909101548352820192909252604090810190912054905163b06dd06f60e01b81523360048201526001600160a01b039091169063b06dd06f90602401600060405180830381600087803b15801561156757600080fd5b505af115801561157b573d6000803e3d6000fd5b50505050828261158b91906137d5565b91505b80611598816137ed565b91505061142f565b5060008111610c705760405162461bcd60e51b815260206004820152601e60248201527f596f7520646f6e2774206861766520616e792070656e64696e672059454c00006044820152606401610865565b6000805b6014548110156116cd576008600060148381548110611616576116166137bf565b6000918252602080832091909101548352820192909252604090810190912054905163b42a8e5560e01b81526001600160a01b0385811660048301529091169063b42a8e559060240160206040518083038186803b15801561167757600080fd5b505afa15801561168b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116af919061375d565b6116b990836137d5565b9150806116c5816137ed565b9150506115f5565b50919050565b60008181526007602052604081205481908190819060139060ff1661170b5760405162461bcd60e51b815260040161086591906136b5565b5060008581526008602090815260409182902054825163d920a90160e01b815292516001600160a01b0390911692839263d920a90192600480840193829003018186803b15801561175b57600080fd5b505afa15801561176f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611793919061375d565b9450806001600160a01b031663ae4bbfc96040518163ffffffff1660e01b815260040160206040518083038186803b1580156117ce57600080fd5b505afa1580156117e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611806919061375d565b9350806001600160a01b0316633750440d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561184157600080fd5b505afa158015611855573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611879919061375d565b9250806001600160a01b0316639b1b4d496040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b457600080fd5b505afa1580156118c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ec919061375d565b9150509193509193565b600081815260076020526040812054819081908190819060609082908190819060139060ff166119395760405162461bcd60e51b815260040161086591906136b5565b5060008a8152600860209081526040918290205482516303e21fa960e61b815292516001600160a01b039091169263f887ea40926004808301939192829003018186803b15801561198957600080fd5b505afa15801561199d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c191906138a8565b60008b815260086020908152604091829020548251635fcbd28560e01b81529251939c506001600160a01b031692635fcbd285926004808201939291829003018186803b158015611a1157600080fd5b505afa158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4991906138a8565b60008b81526008602090815260409182902054825163d21220a760e01b81529251939b506001600160a01b03169263d21220a7926004808201939291829003018186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad191906138a8565b60008b815260086020908152604091829020548251630dfe168160e01b81529251939a506001600160a01b031692630dfe1681926004808201939291829003018186803b158015611b2157600080fd5b505afa158015611b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5991906138a8565b60008b8152600860209081526040918290205482516336e9332d60e01b815292519399506001600160a01b0316926336e9332d926004808201939291829003018186803b158015611ba957600080fd5b505afa158015611bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be191906138a8565b60008b81526008602090815260409182902054825163a644d68560e01b815292519398506001600160a01b03169263a644d685926004808201939291829003018186803b158015611c3157600080fd5b505afa158015611c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c69919061383d565b15611d045760008a815260086020908152604091829020548251633c41a11560e21b81529251611cfd936001600160a01b039092169263f10684549260048082019391829003018186803b158015611cc057600080fd5b505afa158015611cd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf8919061375d565b613177565b9350611d26565b60405180604001604052806006815260200165139bc81c1a5960d21b81525093505b60008a81526008602090815260409182902054825163fc03916560e01b815292516001600160a01b039091169263fc039165926004808301939192829003018186803b158015611d7557600080fd5b505afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad919061375d565b60008b8152600860209081526040918290205482516302ee8de960e01b815292519395506001600160a01b0316926302ee8de9926004808201939291829003018186803b158015611dfd57600080fd5b505afa158015611e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e35919061375d565b60008b815260086020908152604091829020548251639ad160e360e01b815292519394506001600160a01b031692639ad160e3926004808201939291829003018186803b158015611e8557600080fd5b505afa158015611e99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebd919061375d565b92509193959799909294969850565b6005546001600160a01b0316331480611eef57506010546001600160a01b031633145b611f0b5760405162461bcd60e51b81526004016108659061385f565b600f55565b6005546001600160a01b0316331480611f3357506010546001600160a01b031633145b611f4f5760405162461bcd60e51b81526004016108659061385f565b611f5881612b3f565b611f60610e6b565b6000828152600860205260409020546001600160a01b0390811691161415611fd65760405162461bcd60e51b815260206004820152602360248201527f43616e206e6f742072656d6f7665207468652063757272656e7420737472617460448201526265677960e81b6064820152608401610865565b6000818152600860209081526040918290205482516302ee8de960e01b815292516001600160a01b03909116926302ee8de9926004808301939192829003018186803b15801561202557600080fd5b505afa158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d919061375d565b156120b55760405162461bcd60e51b815260206004820152602260248201527f546f74616c206361706974616c20696e7465726e616c206973206e6f74207a65604482015261726f60f01b6064820152608401610865565b60008181526008602090815260409182902054825163fc03916560e01b815292516001600160a01b039091169263fc039165926004808301939192829003018186803b15801561210457600080fd5b505afa158015612118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213c919061375d565b156121895760405162461bcd60e51b815260206004820152601960248201527f546f74616c206361706974616c206973206e6f74207a65726f000000000000006044820152606401610865565b6000818152600760209081526040808320805460ff19908116909155600880845282852080546001600160a01b031686526009855292852080549092169091559284905291905280546001600160a01b03191690556014546001146122b45760005b601454811015610c70578160148281548110612209576122096137bf565b906000526020600020015414156122a25760145461222990600190613669565b811461227a576014805461223f90600190613669565b8154811061224f5761224f6137bf565b90600052602060002001546014828154811061226d5761226d6137bf565b6000918252602090912001555b601480548061228b5761228b6138c5565b600190038181906000526020600020016000905590555b806122ac816137ed565b9150506121eb565b60148054806122c5576122c56138c5565b6001900381819060005260206000200160009055905550565b6005546001600160a01b031633148061230157506010546001600160a01b031633145b61231d5760405162461bcd60e51b81526004016108659061385f565b6001600160a01b0382166123825760405162461bcd60e51b815260206004820152602660248201527f5468652073747261746567792063616e206e6f742062652061207a65726f206160448201526564647265737360d01b6064820152608401610865565b6000818152600860205260409020546001600160a01b0316156123e75760405162461bcd60e51b815260206004820152601a60248201527f54686973207374726174656779206973206e6f7420656d7074790000000000006044820152606401610865565b6001600160a01b03821660009081526009602052604090205460ff16156124505760405162461bcd60e51b815260206004820152601c60248201527f5468697320737472617465677920616c726561647920657869737473000000006044820152606401610865565b60008181526007602052604090205460ff166124d4576014805460018181019092557fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec018290556000828152600760209081526040808320805460ff1990811686179091556001600160a01b03871684526009909252909120805490911690911790555b600090815260086020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6010546001600160a01b0316331461255c5760405162461bcd60e51b815260206004820152601c60248201527f5468652073656e646572206973206e6f7420676f7665726e616e6365000000006044820152606401610865565b60005b60145481101561121b576008600060148381548110612580576125806137bf565b60009182526020808320919091015483528201929092526040908101909120549051631bfc726f60e21b81523360048201526001600160a01b0390911690636ff1c9bc90602401600060405180830381600087803b1580156125e157600080fd5b505af11580156125f5573d6000803e3d6000fd5b505050508080612604906137ed565b91505061255f565b6001600160a01b03811660009081526006602052604081205461263157506000919050565b6001600160a01b0382166000908152600660205260408120546126549043613669565b9050600a81106126675750600092915050565b61267281600a613669565b9392505050565b6005546001600160a01b031633146126a35760405162461bcd60e51b815260040161086590613808565b60005b60145481101561121b5760086000601483815481106126c7576126c76137bf565b60009182526020808320919091015483528201929092526040908101909120549051630987b04f60e41b81523360048201526001600160a01b039091169063987b04f090602401600060405180830381600087803b15801561272857600080fd5b505af115801561273c573d6000803e3d6000fd5b50505050808061274b906137ed565b9150506126a6565b6005546001600160a01b0316331461277d5760405162461bcd60e51b815260040161086590613808565b6001600160a01b0381166127e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610865565b61121b81612bbb565b6005546001600160a01b031633148061280e57506010546001600160a01b031633145b61282a5760405162461bcd60e51b81526004016108659061385f565b61283381612b3f565b600e55565b6005546001600160a01b031633146128625760405162461bcd60e51b815260040161086590613808565b600a55565b60145460009060129061288d5760405162461bcd60e51b815260040161086591906136b5565b5060005b601454811015610b435760086000601483815481106128b2576128b26137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031663fc0391656040518163ffffffff1660e01b815260040160206040518083038186803b15801561291757600080fd5b505afa15801561292b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294f919061375d565b61295990836137d5565b915080612965816137ed565b915050612891565b612975612e14565b60119061121b5760405162461bcd60e51b815260040161086591906136b5565b600a54600b546129a59043613669565b11610f205760405162461bcd60e51b815260206004820152602a60248201527f4e554d4245525f4f465f424c4f434b535f4254575f545820626c6f636b7320696044820152691cc81c995c5d5a5c995960b21b6064820152608401610865565b600f54612a1282846137d5565b1115610c705760405162461bcd60e51b815260206004820152601e60248201527f4465706f736974206973206c696d6974656420627920636f6e747261637400006044820152606401610865565b6001600160a01b038216612ab65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610865565b8060026000828254612ac891906137d5565b90915550506001600160a01b03821660009081526020819052604081208054839290612af59084906137d5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b601454600110612b895760405162461bcd60e51b81526020600482015260156024820152744e6f7420656e6f756768207374726174656769657360581b6044820152606401610865565b60008181526007602052604090205460139060ff16610c705760405162461bcd60e51b815260040161086591906136b5565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216612c6d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610865565b6001600160a01b03821660009081526020819052604090205481811015612ce15760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610865565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612d10908490613669565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60005b601454811015611268576008600060148381548110612d7f57612d7f6137bf565b6000918252602080832091909101548352820192909252604090810190912054905163072f436560e31b81526001600160a01b038581166004830152602482018590529091169063397a1b2890604401600060405180830381600087803b158015612de957600080fd5b505af1158015612dfd573d6000803e3d6000fd5b505050508080612e0c906137ed565b915050612d5e565b33600090815260066020526040812054600a90612e319043613669565b1015905090565b612e4183612b3f565b60008181526007602052604090205460ff16612eaa5760405162461bcd60e51b815260206004820152602260248201527f546865205f6e616d654964546f2076616c756520646f6573206e6f74206578696044820152611cdd60f21b6064820152608401610865565b600082118015612ebb575060648211155b612f375760405162461bcd60e51b815260206004820152604160248201527f546865205f616d6f756e74496e50657263656e742076616c756520736f756c6460448201527f206265206d6f7265207468616e203020616e64206c657373207468616e2031306064820152600360fc1b608482015260a401610865565b612f3f611139565b60008381526008602090815260408083205481516315ab88c960e31b815291516001600160a01b039091169263ad5c46489260048082019391829003018186803b158015612f8c57600080fd5b505afa158015612fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc491906138a8565b600085815260086020526040908190205490516308a960c160e31b8152600481018690529192506001600160a01b03169063454b060890602401600060405180830381600087803b15801561301857600080fd5b505af115801561302c573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b03841691506370a082319060240160206040518083038186803b15801561307257600080fd5b505afa158015613086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130aa919061375d565b9050801561313d576000838152600860205260409020546130d8906001600160a01b0384811691168361327d565b6000838152600860205260408082205481516336bcdbf360e11b815291516001600160a01b0390911692636d79b7e6926004808201939182900301818387803b15801561312457600080fd5b505af1158015613138573d6000803e3d6000fd5b505050505b6040518481527ff62d3ca87d830abd296c5769ca4ad2d1e22910c4754d33689394d55287c033369060200160405180910390a15050505050565b60608161319b5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156131c557806131af816137ed565b91506131be9050600a836137ab565b915061319f565b60008167ffffffffffffffff8111156131e0576131e06138db565b6040519080825280601f01601f19166020018201604052801561320a576020820181803683370190505b5090505b84156132755761321f600183613669565b915061322c600a866138f1565b6132379060306137d5565b60f81b81838151811061324c5761324c6137bf565b60200101906001600160f81b031916908160001a90535061326e600a866137ab565b945061320e565b949350505050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526112689286929160009161330d91851690849061338a565b805190915015611268578080602001905181019061332b919061383d565b6112685760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610865565b6060613275848460008585843b6133e35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610865565b600080866001600160a01b031685876040516133ff9190613905565b60006040518083038185875af1925050503d806000811461343c576040519150601f19603f3d011682016040523d82523d6000602084013e613441565b606091505b509150915061345182828661345c565b979650505050505050565b6060831561346b575081612672565b82511561347b5782518084602001fd5b8160405162461bcd60e51b81526004016108659190613523565b6001600160a01b038116811461121b57600080fd5b6000602082840312156134bc57600080fd5b813561267281613495565b60005b838110156134e25781810151838201526020016134ca565b838111156134f1576000848401525b50505050565b6000815180845261350f8160208601602086016134c7565b601f01601f19169290920160200192915050565b60208152600061267260208301846134f7565b6020808252825182820181905260009190848201906040850190845b8181101561356e57835183529284019291840191600101613552565b50909695505050505050565b6000806040838503121561358d57600080fd5b823561359881613495565b946020939093013593505050565b6000602082840312156135b857600080fd5b5035919050565b6000806000606084860312156135d457600080fd5b505081359360208301359350604090920135919050565b6001600160a01b038a811682528981166020830152888116604083015287811660608301528616608082015261012060a08201819052600090613630838201886134f7565b60c0840196909652505060e0810192909252610100909101529695505050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561367b5761367b613653565b500390565b600181811c9082168061369457607f821691505b602082108114156116cd57634e487b7160e01b600052602260045260246000fd5b600060208083526000845481600182811c9150808316806136d757607f831692505b8583108114156136f557634e487b7160e01b85526022600452602485fd5b87860183815260200181801561371257600181146137235761374e565b60ff1986168252878201965061374e565b60008b81526020902060005b868110156137485781548482015290850190890161372f565b83019750505b50949998505050505050505050565b60006020828403121561376f57600080fd5b5051919050565b600081600019048311821515161561379057613790613653565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826137ba576137ba613795565b500490565b634e487b7160e01b600052603260045260246000fd5b600082198211156137e8576137e8613653565b500190565b600060001982141561380157613801613653565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561384f57600080fd5b8151801515811461267257600080fd5b60208082526029908201527f5468652073656e646572206973206e6f7420746865206f776e6572206f7220676040820152686f7665726e616e636560b81b606082015260800190565b6000602082840312156138ba57600080fd5b815161267281613495565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60008261390057613900613795565b500690565b600082516139178184602087016134c7565b919091019291505056fea2646970667358221220b38aa27e0f0c8f3125627fe81d09efc26f0670f22ce39700c704bba1de8500a164736f6c63430008090033446966666572656e6365206f6620626c6f636b73206973206c657373207468616e2052455155495245445f4e554d4245525f4f465f424c4f434b53546865204e616d65206f662073747261746567792077697468207468697320494420646f6573206e6f74206578697374
Deployed ByteCode Sourcemap
33503:14092:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34925:9;:7;:9::i;:::-;33503:14092;;;;;41674:295;;;;;;;;;;;;;:::i;:::-;;;160:25:1;;;148:2;133:18;41674:295:0;;;;;;;;45251:167;;;;;;;;;;-1:-1:-1;45251:167:0;;;;;:::i;:::-;;:::i;18029:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18350:108::-;;;;;;;;;;-1:-1:-1;18438:12:0;;18350:108;;33778:45;;;;;;;;;;-1:-1:-1;33778:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1655:14:1;;1648:22;1630:41;;1618:2;1603:18;33778:45:0;1490:187:1;33990:46:0;;;;;;;;;;;;;;;;39162:91;;;;;;;;;;-1:-1:-1;39233:5:0;:12;39162:91;;18249:93;;;;;;;;;;-1:-1:-1;18249:93:0;;18332:2;1824:36:1;;1812:2;1797:18;18249:93:0;1682:184:1;34080:36:0;;;;;;;;;;;;;;;;39065:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34157:25::-;;;;;;;;;;-1:-1:-1;34157:25:0;;;;-1:-1:-1;;;;;34157:25:0;;;;;;-1:-1:-1;;;;;2672:32:1;;;2654:51;;2642:2;2627:18;34157:25:0;2508:203:1;44743:283:0;;;;;;;;;;-1:-1:-1;44743:283:0;;;;;:::i;:::-;;:::i;33832:54::-;;;;;;;;;;;;33884:2;33832:54;;39261:191;;;;;;;;;;;;;:::i;18466:127::-;;;;;;;;;;-1:-1:-1;18466:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;18567:18:0;18540:7;18567:18;;;;;;;;;;;;18466:127;13428:103;;;;;;;;;;;;;:::i;37055:578::-;;;;;;;;;;-1:-1:-1;37055:578:0;;;;;:::i;:::-;;:::i;41134:243::-;;;;;;;;;;;;;:::i;45034:209::-;;;;;;;;;;-1:-1:-1;45034:209:0;;;;;:::i;:::-;;:::i;12777:87::-;;;;;;;;;;-1:-1:-1;12850:6:0;;-1:-1:-1;;;;;12850:6:0;12777:87;;18137:104;;;;;;;;;;;;;:::i;42297:222::-;;;;;;;;;;;;;:::i;42731:228::-;;;;;;;;;;-1:-1:-1;42731:228:0;;;;;:::i;:::-;;:::i;33893:42::-;;;;;;;;;;;;;;;;37641:529;;;;;;;;;;;;;:::i;38342:235::-;;;;;;;;;;-1:-1:-1;38342:235:0;;;;;:::i;:::-;;:::i;40585:541::-;;;;;;;;;;-1:-1:-1;40585:541:0;;;;;:::i;:::-;;:::i;:::-;;;;3773:25:1;;;3829:2;3814:18;;3807:34;;;;3857:18;;;3850:34;3915:2;3900:18;;3893:34;3760:3;3745:19;40585:541:0;3542:391:1;39460:1117:0;;;;;;;;;;-1:-1:-1;39460:1117:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;42967:114::-;;;;;;;;;;-1:-1:-1;42967:114:0;;;;;:::i;:::-;;:::i;34043:30::-;;;;;;;;;;;;;;;;43660:1075;;;;;;;;;;-1:-1:-1;43660:1075:0;;;;;:::i;:::-;;:::i;33942:41::-;;;;;;;;;;;;;;;;43089:563;;;;;;;;;;-1:-1:-1;43089:563:0;;;;;:::i;:::-;;:::i;35948:1099::-;;;:::i;33726:45::-;;;;;;;;;;-1:-1:-1;33726:45:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;33726:45:0;;;33678:41;;;;;;;;;;-1:-1:-1;33678:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42527:196;;;;;;;;;;;;;:::i;38585:472::-;;;;;;;;;;-1:-1:-1;38585:472:0;;;;;:::i;:::-;;:::i;41977:186::-;;;;;;;;;;;;;:::i;34123:27::-;;;;;;;;;;;;;;;;13686:201;;;;;;;;;;-1:-1:-1;13686:201:0;;;;;:::i;:::-;;:::i;38178:156::-;;;;;;;;;;-1:-1:-1;38178:156:0;;;;;:::i;:::-;;:::i;42171:118::-;;;;;;;;;;-1:-1:-1;42171:118:0;;;;;:::i;:::-;;:::i;41387:279::-;;;;;;;;;;;;;:::i;35948:1099::-;35768:21;:19;:21::i;:::-;35800:24;:22;:24::i;:::-;36075:23:::1;::::0;36041:31:::1;::::0;36026:46:::1;::::0;:12:::1;:46;:::i;:::-;:72;36004:180;;;::::0;-1:-1:-1;;;36004:180:0;;5305:2:1;36004:180:0::1;::::0;::::1;5287:21:1::0;5344:2;5324:18;;;5317:30;5383:34;5363:18;;;5356:62;5454:28;5434:18;;;5427:56;5500:19;;36004:180:0::1;;;;;;;;;36216:15;;36203:9;:28;;36195:80;;;::::0;-1:-1:-1;;;36195:80:0;;5732:2:1;36195:80:0::1;::::0;::::1;5714:21:1::0;5771:2;5751:18;;;5744:30;5810:34;5790:18;;;5783:62;-1:-1:-1;;;5861:18:1;;;5854:37;5908:19;;36195:80:0::1;5530:403:1::0;36195:80:0::1;36286:14;:12;:14::i;:::-;36311:43;36325:17;:15;:17::i;:::-;36344:9;36311:13;:43::i;:::-;36373:5;:12:::0;36392:17:::1;::::0;36365:45:::1;;;;-1:-1:-1::0;;;36365:45:0::1;;;;;;;;:::i;:::-;;36421:14;36446:28:::0;36477:25:::1;:23;:25::i;:::-;36446:56;;36513:29;36555:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;36545:36:0::1;;36589:9;36545:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36513:88:::0;-1:-1:-1;36616:25:0;;;:47:::1;;-1:-1:-1::0;18438:12:0;;36645:18;36616:47:::1;36612:282;;;36689:21;36680:30;;36612:282;;;36743:19;36799:13;18438:12:::0;;;18350:108;36799:13:::1;36765:31;:20:::0;36789:6:::1;36765:31;:::i;:::-;:47;;;;:::i;:::-;36743:69:::0;-1:-1:-1;36743:69:0;36836:32:::1;:21:::0;36861:6:::1;36836:32;:::i;:::-;:46;;;;:::i;:::-;36827:55;;36728:166;36612:282;36904:25;36910:10;36922:6;36904:5;:25::i;:::-;36974:12;36940:31;:46:::0;37002:37:::1;::::0;160:25:1;;;37002:37:0::1;::::0;148:2:1;133:18;37002:37:0::1;;;;;;;35993:1054;;;35948:1099::o:0;41674:295::-;41771:5;:12;41730:20;;41790:17;;41763:45;;;;-1:-1:-1;;;41763:45:0;;;;;;;;:::i;:::-;;41824:9;41819:143;41843:5;:12;41839:16;;41819:143;;;41903:10;:20;41914:5;41920:1;41914:8;;;;;;;;:::i;:::-;;;;;;;;;41903:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41903:20:0;-1:-1:-1;;;;;41893:55:0;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41877:73;;;;:::i;:::-;;-1:-1:-1;41857:3:0;;;;:::i;:::-;;;;41819:143;;;;41674:295;:::o;45251:167::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;45370:39:::1;::::0;-1:-1:-1;;;45370:39:0;;45403:4:::1;45370:39;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;45325:23:0;::::1;::::0;::::1;::::0;45357:10:::1;::::0;45325:23;;45370:24:::1;::::0;2627:18:1;;45370:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45325:85;::::0;-1:-1:-1;;;;;;45325:85:0::1;::::0;;;;;;-1:-1:-1;;;;;9225:32:1;;;45325:85:0::1;::::0;::::1;9207:51:1::0;9274:18;;;9267:34;9180:18;;45325:85:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45251:167:::0;:::o;18029:100::-;18083:13;18116:5;18109:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18029:100;:::o;39065:89::-;39105:16;39141:5;39134:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39065:89;:::o;44743:283::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35016:23;;:53;;-1:-1:-1;35043:10:0;;-1:-1:-1;;;;;35043:10:0;12231;35043:26;35016:53;34994:144;;;;-1:-1:-1;;;34994:144:0;;;;;;;:::i;:::-;44850:25:::1;44867:7;44850:16;:25::i;:::-;-1:-1:-1::0;;;;;44894:24:0;::::1;44886:69;;;::::0;-1:-1:-1;;;44886:69:0;;10206:2:1;44886:69:0::1;::::0;::::1;10188:21:1::0;;;10225:18;;;10218:30;10284:34;10264:18;;;10257:62;10336:18;;44886:69:0::1;10004:356:1::0;44886:69:0::1;44976:19;::::0;;;:10:::1;:19;::::0;;;;;;;44966:52;;-1:-1:-1;;;44966:52:0;;-1:-1:-1;;;;;2672:32:1;;;44966:52:0::1;::::0;::::1;2654:51:1::0;44976:19:0;;::::1;::::0;44966:40:::1;::::0;2627:18:1;;44966:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44743:283:::0;;:::o;39261:191::-;39337:5;:12;39309:7;;39329:68;;;;-1:-1:-1;;;39329:68:0;;10567:2:1;39329:68:0;;;10549:21:1;10606:2;10586:18;;;10579:30;10645:34;10625:18;;;10618:62;-1:-1:-1;;;10696:18:1;;;10689:37;10743:19;;39329:68:0;10365:403:1;39329:68:0;-1:-1:-1;39426:17:0;;39415:29;;;;:10;:29;;;;;;-1:-1:-1;;;;;39415:29:0;;39261:191::o;13428:103::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;13493:30:::1;13520:1;13493:18;:30::i;:::-;13428:103::o:0;37055:578::-;35397:10;35335:20;35384:24;;;:12;:24;;;;;;35358:12;;35381:339;;37138:5:::1;:12:::0;37157:17:::1;::::0;37130:45:::1;;;;-1:-1:-1::0;;;37130:45:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;18438:12:0;;37186:56:::1;;;::::0;-1:-1:-1;;;37186:56:0;;10975:2:1;37186:56:0::1;::::0;::::1;10957:21:1::0;11014:2;10994:18;;;10987:30;11053:27;11033:18;;;11026:55;11098:18;;37186:56:0::1;10773:349:1::0;37186:56:0::1;37271:1;37261:7;:11;37253:64;;;::::0;-1:-1:-1;;;37253:64:0;;11329:2:1;37253:64:0::1;::::0;::::1;11311:21:1::0;11368:2;11348:18;;;11341:30;11407:34;11387:18;;;11380:62;-1:-1:-1;;;11458:18:1;;;11451:38;11506:19;;37253:64:0::1;11127:404:1::0;37253:64:0::1;37328:14;:12;:14::i;:::-;37353:15;37396:13;18438:12:::0;;;18350:108;37396:13:::1;37371;:7:::0;37381:3:::1;37371:13;:::i;:::-;:22;::::0;37387:6:::1;37371:22;:::i;:::-;:38;;;;:::i;:::-;37353:56;;37439:13;18438:12:::0;;;18350:108;37439:13:::1;37428:7;:24;;37420:69;;;::::0;-1:-1:-1;;;37420:69:0;;11738:2:1;37420:69:0::1;::::0;::::1;11720:21:1::0;;;11757:18;;;11750:30;11816:34;11796:18;;;11789:62;11868:18;;37420:69:0::1;11536:356:1::0;37420:69:0::1;37500:26;37506:10;37518:7;37500:5;:26::i;:::-;37537:46;37563:10;37575:7;37537:25;:46::i;:::-;37599:26;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;35459:10:0;35446:24;;;;:12;:24;;;;;:39;-1:-1:-1;45251:167:0:o;35381:339::-;35521:21;:19;:21::i;:::-;35518:191;;;37138:5:::1;:12:::0;37157:17:::1;::::0;37130:45:::1;;;;-1:-1:-1::0;;;37130:45:0::1;;;;;;;;:::i;35518:191::-:0;35670:22;35663:30;;-1:-1:-1;;;35663:30:0;;;;;;;;:::i;41134:243::-;35896:24;:22;:24::i;:::-;41206:5:::1;:12:::0;41225:17:::1;::::0;41198:45:::1;;;;-1:-1:-1::0;;;41198:45:0::1;;;;;;;;:::i;:::-;;41259:9;41254:116;41278:5;:12:::0;41274:16;::::1;41254:116;;;41322:10;:20;41333:5;41339:1;41333:8;;;;;;;;:::i;:::-;;;;;;;;;41322:20;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;41322:20:0::1;-1:-1:-1::0;;;;;41312:44:0::1;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41292:3;;;;;:::i;:::-;;;;41254:116;;;;41134:243::o:0;45034:209::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35016:23;;:53;;-1:-1:-1;35043:10:0;;-1:-1:-1;;;;;35043:10:0;12231;35043:26;35016:53;34994:144;;;;-1:-1:-1;;;34994:144:0;;;;;;;:::i;:::-;45185:50:::1;45194:11;45207:16;45225:9;45185:8;:50::i;:::-;45034:209:::0;;;:::o;18137:104::-;18193:13;18226:7;18219:14;;;;;:::i;42297:222::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;42351:9:::1;42347:113;42370:5;:12:::0;42366:16;::::1;42347:113;;;42414:10;:20;42425:5;42431:1;42425:8;;;;;;;;:::i;:::-;;;;;;;;;42414:20;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42414:20:0::1;-1:-1:-1::0;;;;;42404:42:0::1;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42384:3;;;;;:::i;:::-;;;;42347:113;;;-1:-1:-1::0;42499:12:0::1;42470:26;:41:::0;42297:222::o;42731:228::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42827:25:0;::::1;42805:111;;;::::0;-1:-1:-1;;;42805:111:0;;12099:2:1;42805:111:0::1;::::0;::::1;12081:21:1::0;12138:2;12118:18;;;12111:30;12177:34;12157:18;;;12150:62;-1:-1:-1;;;12228:18:1;;;12221:34;12272:19;;42805:111:0::1;11897:400:1::0;42805:111:0::1;42927:10;:24:::0;;-1:-1:-1;;;;;;42927:24:0::1;-1:-1:-1::0;;;;;42927:24:0;;;::::1;::::0;;;::::1;::::0;;42731:228::o;37641:529::-;35768:21;:19;:21::i;:::-;35800:24;:22;:24::i;:::-;37690:14:::1;:12;:14::i;:::-;37715:18;37748:23:::0;37791:9:::1;37786:304;37806:5;:12:::0;37802:16;::::1;37786:304;;;37863:10;:20;37874:5;37880:1;37874:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;37863:20;;;::::1;::::0;;;;;;;;;;;;37853:57;;-1:-1:-1;;;37853:57:0;;37899:10:::1;37853:57;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;37863:20:0;;::::1;::::0;37853:45:::1;::::0;2627:18:1;;37853:57:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37840:70:::0;-1:-1:-1;37928:14:0;;37925:154:::1;;37973:10;:20;37984:5;37990:1;37984:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;37973:20;;;::::1;::::0;;;;;;;;;;;;37963:52;;-1:-1:-1;;;37963:52:0;;38004:10:::1;37963:52;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;37973:20:0;;::::1;::::0;37963:40:::1;::::0;2627:18:1;;37963:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38053:10;38034:29;;;;;:::i;:::-;;;37925:154;37820:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37786:304;;;;38126:1;38108:15;:19;38100:62;;;::::0;-1:-1:-1;;;38100:62:0;;12504:2:1;38100:62:0::1;::::0;::::1;12486:21:1::0;12543:2;12523:18;;;12516:30;12582:32;12562:18;;;12555:60;12632:18;;38100:62:0::1;12302:354:1::0;38342:235:0;38404:18;38440:9;38435:135;38455:5;:12;38451:16;;38435:135;;;38513:10;:20;38524:5;38530:1;38524:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;;38513:20;;;;;;;;;;;;;;;;38503:55;;-1:-1:-1;;;38503:55:0;;-1:-1:-1;;;;;2672:32:1;;;38503:55:0;;;2654:51:1;38513:20:0;;;;38503:45;;2627:18:1;;38503:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38489:69;;;;:::i;:::-;;-1:-1:-1;38469:3:0;;;;:::i;:::-;;;;38435:135;;;;38342:235;;;:::o;40585:541::-;40656:19;40788:18;;;:9;:18;;;;;;40656:19;;;;;;40808:23;;40788:18;;40780:52;;;;-1:-1:-1;;;40780:52:0;;;;;;;;:::i;:::-;-1:-1:-1;40843:17:0;40863:19;;;:10;:19;;;;;;;;;;40907:33;;-1:-1:-1;;;40907:33:0;;;;-1:-1:-1;;;;;40863:19:0;;;;;;40907:31;;:33;;;;;;;;;;40863:19;40907:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40893:47;;40975:9;-1:-1:-1;;;;;40965:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40951:47;;41034:9;-1:-1:-1;;;;;41024:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41009:49;;41094:9;-1:-1:-1;;;;;41084:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41069:49;;40769:357;40585:541;;;;;:::o;39460:1117::-;39530:15;39797:18;;;:9;:18;;;;;;39530:15;;;;;;;;39659:18;;39530:15;;;;;;39817:23;;39797:18;;39789:52;;;;-1:-1:-1;;;39789:52:0;;;;;;;;:::i;:::-;-1:-1:-1;39872:19:0;;;;:10;:19;;;;;;;;;;39862:39;;-1:-1:-1;;;39862:39:0;;;;-1:-1:-1;;;;;39872:19:0;;;;39862:37;;:39;;;;;39872:19;;39862:39;;;;;39872:19;39862:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39933:19;;;;:10;:19;;;;;;;;;;39923:40;;-1:-1:-1;;;39923:40:0;;;;39852:49;;-1:-1:-1;;;;;;39933:19:0;;39923:38;;:40;;;;;39933:19;39923:40;;;;;;39933:19;39923:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39994:19;;;;:10;:19;;;;;;;;;;39984:39;;-1:-1:-1;;;39984:39:0;;;;39912:51;;-1:-1:-1;;;;;;39994:19:0;;39984:37;;:39;;;;;39994:19;39984:39;;;;;;39994:19;39984:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40054:19;;;;:10;:19;;;;;;;;;;40044:39;;-1:-1:-1;;;40044:39:0;;;;39974:49;;-1:-1:-1;;;;;;40054:19:0;;40044:37;;:39;;;;;40054:19;40044:39;;;;;;40054:19;40044:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40112:19;;;;:10;:19;;;;;;;;;;40102:37;;-1:-1:-1;;;40102:37:0;;;;40034:49;;-1:-1:-1;;;;;;40112:19:0;;40102:35;;:37;;;;;40112:19;40102:37;;;;;;40112:19;40102:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40163:19;;;;:10;:19;;;;;;;;;;40153:39;;-1:-1:-1;;;40153:39:0;;;;40094:45;;-1:-1:-1;;;;;;40163:19:0;;40153:37;;:39;;;;;40163:19;40153:39;;;;;;40163:19;40153:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40150:180;;;40243:19;;;;:10;:19;;;;;;;;;;40233:36;;-1:-1:-1;;;40233:36:0;;;;40216:54;;-1:-1:-1;;;;;40243:19:0;;;;40233:34;;:36;;;;;;;;;;;40243:19;40233:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40216:16;:54::i;:::-;40209:61;;40150:180;;;40303:15;;;;;;;;;;;;;-1:-1:-1;;;40303:15:0;;;;;40150:180;40366:19;;;;:10;:19;;;;;;;;;;40356:48;;-1:-1:-1;;;40356:48:0;;;;-1:-1:-1;;;;;40366:19:0;;;;40356:46;;:48;;;;;40366:19;;40356:48;;;;;40366:19;40356:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40449:19;;;;:10;:19;;;;;;;;;;40439:56;;-1:-1:-1;;;40439:56:0;;;;40340:64;;-1:-1:-1;;;;;;40449:19:0;;40439:54;;:56;;;;;40449:19;40439:56;;;;;;40449:19;40439:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40527:19;;;;:10;:19;;;;;;;;;;40517:52;;-1:-1:-1;;;40517:52:0;;;;40415:80;;-1:-1:-1;;;;;;40527:19:0;;40517:50;;:52;;;;;40527:19;40517:52;;;;;;40527:19;40517:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40506:63;;39460:1117;;;;;;;;;;;:::o;42967:114::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35016:23;;:53;;-1:-1:-1;35043:10:0;;-1:-1:-1;;;;;35043:10:0;12231;35043:26;35016:53;34994:144;;;;-1:-1:-1;;;34994:144:0;;;;;;;:::i;:::-;43051:12:::1;:22:::0;42967:114::o;43660:1075::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35016:23;;:53;;-1:-1:-1;35043:10:0;;-1:-1:-1;;;;;35043:10:0;12231;35043:26;35016:53;34994:144;;;;-1:-1:-1;;;34994:144:0;;;;;;;:::i;:::-;43741:25:::1;43758:7;43741:16;:25::i;:::-;43822:17;:15;:17::i;:::-;43799:19;::::0;;;:10:::1;:19;::::0;;;;;-1:-1:-1;;;;;43799:19:0;;::::1;:40:::0;::::1;;;43777:125;;;::::0;-1:-1:-1;;;43777:125:0;;13119:2:1;43777:125:0::1;::::0;::::1;13101:21:1::0;13158:2;13138:18;;;13131:30;13197:34;13177:18;;;13170:62;-1:-1:-1;;;13248:18:1;;;13241:33;13291:19;;43777:125:0::1;12917:399:1::0;43777:125:0::1;43931:19;::::0;;;:10:::1;:19;::::0;;;;;;;;;43921:56;;-1:-1:-1;;;43921:56:0;;;;-1:-1:-1;;;;;43931:19:0;;::::1;::::0;43921:54:::1;::::0;:56:::1;::::0;;::::1;::::0;43931:19;;43921:56;;;;;43931:19;43921:56;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61:::0;43913:131:::1;;;::::0;-1:-1:-1;;;43913:131:0;;13523:2:1;43913:131:0::1;::::0;::::1;13505:21:1::0;13562:2;13542:18;;;13535:30;13601:34;13581:18;;;13574:62;-1:-1:-1;;;13652:18:1;;;13645:32;13694:19;;43913:131:0::1;13321:398:1::0;43913:131:0::1;44073:19;::::0;;;:10:::1;:19;::::0;;;;;;;;;44063:48;;-1:-1:-1;;;44063:48:0;;;;-1:-1:-1;;;;;44073:19:0;;::::1;::::0;44063:46:::1;::::0;:48:::1;::::0;;::::1;::::0;44073:19;;44063:48;;;;;44073:19;44063:48;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53:::0;44055:114:::1;;;::::0;-1:-1:-1;;;44055:114:0;;13926:2:1;44055:114:0::1;::::0;::::1;13908:21:1::0;13965:2;13945:18;;;13938:30;14004:27;13984:18;;;13977:55;14049:18;;44055:114:0::1;13724:349:1::0;44055:114:0::1;44242:5;44221:18:::0;;;:9:::1;:18;::::0;;;;;;;:26;;-1:-1:-1;;44221:26:0;;::::1;::::0;;;44272:10:::1;:19:::0;;;;;;;;-1:-1:-1;;;;;44272:19:0::1;44258:34:::0;;:13:::1;:34:::0;;;;;:42;;;;::::1;::::0;;;44311:19;;;;;;;:32;;-1:-1:-1;;;;;;44311:32:0::1;::::0;;44357:5:::1;:12:::0;44221:26;44357:17:::1;44354:374;;44395:9;44391:282;44414:5;:12:::0;44410:16;::::1;44391:282;;;44466:7;44454:5;44460:1;44454:8;;;;;;;;:::i;:::-;;;;;;;;;:19;44451:207;;;44506:5;:12:::0;:14:::1;::::0;44519:1:::1;::::0;44506:14:::1;:::i;:::-;44501:1;:19;44498:107;;44560:5;44566:12:::0;;:14:::1;::::0;44579:1:::1;::::0;44566:14:::1;:::i;:::-;44560:21;;;;;;;;:::i;:::-;;;;;;;;;44549:5;44555:1;44549:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:32:::0;44498:107:::1;44627:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;44451:207;44428:3:::0;::::1;::::0;::::1;:::i;:::-;;;;44391:282;;44354:374;44705:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43660:1075:::0;:::o;43089:563::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35016:23;;:53;;-1:-1:-1;35043:10:0;;-1:-1:-1;;;;;35043:10:0;12231;35043:26;35016:53;34994:144;;;;-1:-1:-1;;;34994:144:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43197:26:0;::::1;43189:77;;;::::0;-1:-1:-1;;;43189:77:0;;14412:2:1;43189:77:0::1;::::0;::::1;14394:21:1::0;14451:2;14431:18;;;14424:30;14490:34;14470:18;;;14463:62;-1:-1:-1;;;14541:18:1;;;14534:36;14587:19;;43189:77:0::1;14210:402:1::0;43189:77:0::1;43316:1;43285:19:::0;;;:10:::1;:19;::::0;;;;;-1:-1:-1;;;;;43285:19:0::1;:33:::0;43277:72:::1;;;::::0;-1:-1:-1;;;43277:72:0;;14819:2:1;43277:72:0::1;::::0;::::1;14801:21:1::0;14858:2;14838:18;;;14831:30;14897:28;14877:18;;;14870:56;14943:18;;43277:72:0::1;14617:350:1::0;43277:72:0::1;-1:-1:-1::0;;;;;43369:27:0;::::1;;::::0;;;:13:::1;:27;::::0;;;;;::::1;;43368:28;43360:69;;;::::0;-1:-1:-1;;;43360:69:0;;15174:2:1;43360:69:0::1;::::0;::::1;15156:21:1::0;15213:2;15193:18;;;15186:30;15252;15232:18;;;15225:58;15300:18;;43360:69:0::1;14972:352:1::0;43360:69:0::1;43445:18;::::0;;;:9:::1;:18;::::0;;;;;::::1;;43440:160;;43480:5;:19:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;-1:-1:-1;43514:18:0;;;:9:::1;43480:19;43514:18:::0;;;;;;;:25;;-1:-1:-1;;43514:25:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;43554:27:0;::::1;::::0;;:13:::1;:27:::0;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;43440:160:::1;43610:19;::::0;;;:10:::1;:19;::::0;;;;:34;;-1:-1:-1;;;;;;43610:34:0::1;-1:-1:-1::0;;;;;43610:34:0;;;::::1;::::0;;;::::1;::::0;;43089:563::o;42527:196::-;35211:10;;-1:-1:-1;;;;;35211:10:0;12231;35211:26;35203:67;;;;-1:-1:-1;;;35203:67:0;;15531:2:1;35203:67:0;;;15513:21:1;15570:2;15550:18;;;15543:30;15609;15589:18;;;15582:58;15657:18;;35203:67:0;15329:352:1;35203:67:0;42594:9:::1;42589:127;42609:5;:12:::0;42605:16;::::1;42589:127;;;42653:10;:20;42664:5;42670:1;42664:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;42653:20;;;::::1;::::0;;;;;;;;;;;;42643:61;;-1:-1:-1;;;42643:61:0;;42693:10:::1;42643:61;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;42653:20:0;;::::1;::::0;42643:49:::1;::::0;2627:18:1;;42643:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42623:3;;;;;:::i;:::-;;;;42589:127;;38585:472:::0;-1:-1:-1;;;;;38754:22:0;;38652:7;38754:22;;;:12;:22;;;;;;38750:68;;-1:-1:-1;38805:1:0;;38585:472;-1:-1:-1;38585:472:0:o;38750:68::-;-1:-1:-1;;;;;38868:22:0;;38828;38868;;;:12;:22;;;;;;38853:37;;:12;:37;:::i;:::-;38828:62;;33884:2;38905:14;:43;38901:148;;-1:-1:-1;38970:1:0;;38585:472;-1:-1:-1;;38585:472:0:o;38901:148::-;39007:42;39035:14;33884:2;39007:42;:::i;:::-;39000:49;38585:472;-1:-1:-1;;;38585:472:0:o;41977:186::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;42032:9:::1;42028:128;42051:5;:12:::0;42047:16;::::1;42028:128;;;42095:10;:20;42106:5;42112:1;42106:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;42095:20;;;::::1;::::0;;;;;;;;;;;;42085:59;;-1:-1:-1;;;42085:59:0;;42133:10:::1;42085:59;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;42095:20:0;;::::1;::::0;42085:47:::1;::::0;2627:18:1;;42085:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42065:3;;;;;:::i;:::-;;;;42028:128;;13686:201:::0;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13775:22:0;::::1;13767:73;;;::::0;-1:-1:-1;;;13767:73:0;;15888:2:1;13767:73:0::1;::::0;::::1;15870:21:1::0;15927:2;15907:18;;;15900:30;15966:34;15946:18;;;15939:62;-1:-1:-1;;;16017:18:1;;;16010:36;16063:19;;13767:73:0::1;15686:402:1::0;13767:73:0::1;13851:28;13870:8;13851:18;:28::i;38178:156::-:0;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35016:23;;:53;;-1:-1:-1;35043:10:0;;-1:-1:-1;;;;;35043:10:0;12231;35043:26;35016:53;34994:144;;;;-1:-1:-1;;;34994:144:0;;;;;;;:::i;:::-;38263:25:::1;38280:7;38263:16;:25::i;:::-;38299:17;:27:::0;38178:156::o;42171:118::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;42248:23:::1;:33:::0;42171:118::o;41387:279::-;41476:5;:12;41435:20;;41495:17;;41468:45;;;;-1:-1:-1;;;41468:45:0;;;;;;;;:::i;:::-;;41529:9;41524:135;41548:5;:12;41544:16;;41524:135;;;41608:10;:20;41619:5;41625:1;41619:8;;;;;;;;:::i;:::-;;;;;;;;;41608:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41608:20:0;-1:-1:-1;;;;;41598:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41582:65;;;;:::i;:::-;;-1:-1:-1;41562:3:0;;;;:::i;:::-;;;;41524:135;;46019:118;46083:21;:19;:21::i;:::-;46106:22;46075:54;;;;;-1:-1:-1;;;46075:54:0;;;;;;;;:::i;45426:226::-;45551:23;;45522:26;;45507:41;;:12;:41;:::i;:::-;:67;45485:159;;;;-1:-1:-1;;;45485:159:0;;16295:2:1;45485:159:0;;;16277:21:1;16334:2;16314:18;;;16307:30;16373:34;16353:18;;;16346:62;-1:-1:-1;;;16424:18:1;;;16417:40;16474:19;;45485:159:0;16093:406:1;47402:190:0;47537:12;;47504:29;47520:13;47504;:29;:::i;:::-;:45;;47496:88;;;;-1:-1:-1;;;47496:88:0;;16706:2:1;47496:88:0;;;16688:21:1;16745:2;16725:18;;;16718:30;16784:32;16764:18;;;16757:60;16834:18;;47496:88:0;16504:354:1;18601:276:0;-1:-1:-1;;;;;18685:21:0;;18677:65;;;;-1:-1:-1;;;18677:65:0;;17065:2:1;18677:65:0;;;17047:21:1;17104:2;17084:18;;;17077:30;17143:33;17123:18;;;17116:61;17194:18;;18677:65:0;16863:355:1;18677:65:0;18771:6;18755:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;18788:18:0;;:9;:18;;;;;;;;;;:28;;18810:6;;18788:9;:28;;18810:6;;18788:28;:::i;:::-;;;;-1:-1:-1;;18832:37:0;;160:25:1;;;-1:-1:-1;;;;;18832:37:0;;;18849:1;;18832:37;;148:2:1;133:18;18832:37:0;;;;;;;18601:276;;:::o;45660:189::-;45736:5;:12;45751:1;-1:-1:-1;45728:50:0;;;;-1:-1:-1;;;45728:50:0;;17425:2:1;45728:50:0;;;17407:21:1;17464:2;17444:18;;;17437:30;-1:-1:-1;;;17483:18:1;;;17476:51;17544:18;;45728:50:0;17223:345:1;45728:50:0;45797:18;;;;:9;:18;;;;;;45817:23;;45797:18;;45789:52;;;;-1:-1:-1;;;45789:52:0;;;;;;;;:::i;14047:191::-;14140:6;;;-1:-1:-1;;;;;14157:17:0;;;-1:-1:-1;;;;;;14157:17:0;;;;;;;14190:40;;14140:6;;;14157:17;14140:6;;14190:40;;14121:16;;14190:40;14110:128;14047:191;:::o;18885:468::-;-1:-1:-1;;;;;18969:21:0;;18961:67;;;;-1:-1:-1;;;18961:67:0;;17775:2:1;18961:67:0;;;17757:21:1;17814:2;17794:18;;;17787:30;17853:34;17833:18;;;17826:62;-1:-1:-1;;;17904:18:1;;;17897:31;17945:19;;18961:67:0;17573:397:1;18961:67:0;-1:-1:-1;;;;;19066:18:0;;19041:22;19066:18;;;;;;;;;;;19103:24;;;;19095:71;;;;-1:-1:-1;;;19095:71:0;;18177:2:1;19095:71:0;;;18159:21:1;18216:2;18196:18;;;18189:30;18255:34;18235:18;;;18228:62;-1:-1:-1;;;18306:18:1;;;18299:32;18348:19;;19095:71:0;17975:398:1;19095:71:0;-1:-1:-1;;;;;19202:18:0;;:9;:18;;;;;;;;;;19223:23;;;19202:44;;19268:12;:22;;19240:6;;19202:9;19268:22;;19240:6;;19268:22;:::i;:::-;;;;-1:-1:-1;;19308:37:0;;160:25:1;;;19334:1:0;;-1:-1:-1;;;;;19308:37:0;;;;;148:2:1;133:18;19308:37:0;;;;;;;18950:403;18885:468;;:::o;47161:233::-;47258:9;47253:134;47273:5;:12;47269:16;;47253:134;;;47317:10;:20;47328:5;47334:1;47328:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;;47317:20;;;;;;;;;;;;;;;;47307:68;;-1:-1:-1;;;47307:68:0;;-1:-1:-1;;;;;9225:32:1;;;47307:68:0;;;9207:51:1;9274:18;;;9267:34;;;47317:20:0;;;;47307:47;;9180:18:1;;47307:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47287:3;;;;;:::i;:::-;;;;47253:134;;45857:154;45963:10;45911:4;45950:24;;;:12;:24;;;;;;33884:2;;45935:39;;:12;:39;:::i;:::-;:68;;45928:75;;45857:154;:::o;46145:1008::-;46311:29;46328:11;46311:16;:29::i;:::-;46359:20;;;;:9;:20;;;;;;;;46351:67;;;;-1:-1:-1;;;46351:67:0;;18859:2:1;46351:67:0;;;18841:21:1;18898:2;18878:18;;;18871:30;18937:34;18917:18;;;18910:62;-1:-1:-1;;;18988:18:1;;;18981:32;19030:19;;46351:67:0;18657:398:1;46351:67:0;46470:1;46451:16;:20;:47;;;;;46495:3;46475:16;:23;;46451:47;46429:162;;;;-1:-1:-1;;;46429:162:0;;19262:2:1;46429:162:0;;;19244:21:1;19301:2;19281:18;;;19274:30;19340:34;19320:18;;;19313:62;19411:34;19391:18;;;19384:62;-1:-1:-1;;;19462:19:1;;;19455:32;19504:19;;46429:162:0;19060:469:1;46429:162:0;46602:14;:12;:14::i;:::-;46627:12;46652:23;;;:10;:23;;;;;;;;;46642:41;;-1:-1:-1;;;46642:41:0;;;;-1:-1:-1;;;;;46652:23:0;;;;46642:39;;:41;;;;;;;;;;;46652:23;46642:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46753:23;;;;:10;:23;;;;;;;;46743:60;;-1:-1:-1;;;46743:60:0;;;;;160:25:1;;;46627:56:0;;-1:-1:-1;;;;;;46753:23:0;;46743:42;;133:18:1;;46743:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46833:37:0;;-1:-1:-1;;;46833:37:0;;46864:4;46833:37;;;2654:51:1;46814:16:0;;-1:-1:-1;;;;;;46833:22:0;;;-1:-1:-1;46833:22:0;;2627:18:1;;46833:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46814:56;-1:-1:-1;46884:12:0;;46881:217;;46988:21;;;;:10;:21;;;;;;46962:58;;-1:-1:-1;;;;;46962:25:0;;;;46988:21;47011:8;46962:25;:58::i;:::-;47045:21;;;;:10;:21;;;;;;;47035:51;;-1:-1:-1;;;47035:51:0;;;;-1:-1:-1;;;;;47045:21:0;;;;47035:49;;:51;;;;;;;;;;;47045:21;;47035:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46881:217;47113:32;;160:25:1;;;47113:32:0;;148:2:1;133:18;47113:32:0;;;;;;;46238:915;;46145:1008;;;:::o;30293:723::-;30349:13;30570:10;30566:53;;-1:-1:-1;;30597:10:0;;;;;;;;;;;;-1:-1:-1;;;30597:10:0;;;;;30293:723::o;30566:53::-;30644:5;30629:12;30685:78;30692:9;;30685:78;;30718:8;;;;:::i;:::-;;-1:-1:-1;30741:10:0;;-1:-1:-1;30749:2:0;30741:10;;:::i;:::-;;;30685:78;;;30773:19;30805:6;30795:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30795:17:0;;30773:39;;30823:154;30830:10;;30823:154;;30857:11;30867:1;30857:11;;:::i;:::-;;-1:-1:-1;30926:10:0;30934:2;30926:5;:10;:::i;:::-;30913:24;;:2;:24;:::i;:::-;30900:39;;30883:6;30890;30883:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;30883:56:0;;;;;;;;-1:-1:-1;30954:11:0;30963:2;30954:11;;:::i;:::-;;;30823:154;;;31001:6;30293:723;-1:-1:-1;;;;30293:723:0:o;14304:211::-;14448:58;;;-1:-1:-1;;;;;9225:32:1;;;14448:58:0;;;9207:51:1;9274:18;;;;9267:34;;;14448:58:0;;;;;;;;;;9180:18:1;;;;14448:58:0;;;;;;;;-1:-1:-1;;;;;14448:58:0;-1:-1:-1;;;14448:58:0;;;17327:69;;;;;;;;;;;;;;;;14421:86;;14441:5;;14448:58;-1:-1:-1;;17327:69:0;;:27;;;14448:58;;17327:27;:69::i;:::-;17411:17;;17301:95;;-1:-1:-1;17411:21:0;17407:179;;17508:10;17497:30;;;;;;;;;;;;:::i;:::-;17489:85;;;;-1:-1:-1;;;17489:85:0;;19985:2:1;17489:85:0;;;19967:21:1;20024:2;20004:18;;;19997:30;20063:34;20043:18;;;20036:62;-1:-1:-1;;;20114:18:1;;;20107:40;20164:19;;17489:85:0;19783:406:1;7593:229:0;7730:12;7762:52;7784:6;7792:4;7798:1;7801:12;7730;5110:20;;9000:60;;;;-1:-1:-1;;;9000:60:0;;20803:2:1;9000:60:0;;;20785:21:1;20842:2;20822:18;;;20815:30;20881:31;20861:18;;;20854:59;20930:18;;9000:60:0;20601:353:1;9000:60:0;9074:12;9088:23;9115:6;-1:-1:-1;;;;;9115:11:0;9134:5;9141:4;9115:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9073:73;;;;9164:51;9181:7;9190:10;9202:12;9164:16;:51::i;:::-;9157:58;8713:510;-1:-1:-1;;;;;;;8713:510:0:o;11399:712::-;11549:12;11578:7;11574:530;;;-1:-1:-1;11609:10:0;11602:17;;11574:530;11723:17;;:21;11719:374;;11921:10;11915:17;11982:15;11969:10;11965:2;11961:19;11954:44;11719:374;12064:12;12057:20;;-1:-1:-1;;;12057:20:0;;;;;;;;:::i;196:131:1:-;-1:-1:-1;;;;;271:31:1;;261:42;;251:70;;317:1;314;307:12;332:247;391:6;444:2;432:9;423:7;419:23;415:32;412:52;;;460:1;457;450:12;412:52;499:9;486:23;518:31;543:5;518:31;:::i;739:258::-;811:1;821:113;835:6;832:1;829:13;821:113;;;911:11;;;905:18;892:11;;;885:39;857:2;850:10;821:113;;;952:6;949:1;946:13;943:48;;;987:1;978:6;973:3;969:16;962:27;943:48;;739:258;;;:::o;1002:::-;1044:3;1082:5;1076:12;1109:6;1104:3;1097:19;1125:63;1181:6;1174:4;1169:3;1165:14;1158:4;1151:5;1147:16;1125:63;:::i;:::-;1242:2;1221:15;-1:-1:-1;;1217:29:1;1208:39;;;;1249:4;1204:50;;1002:258;-1:-1:-1;;1002:258:1:o;1265:220::-;1414:2;1403:9;1396:21;1377:4;1434:45;1475:2;1464:9;1460:18;1452:6;1434:45;:::i;1871:632::-;2042:2;2094:21;;;2164:13;;2067:18;;;2186:22;;;2013:4;;2042:2;2265:15;;;;2239:2;2224:18;;;2013:4;2308:169;2322:6;2319:1;2316:13;2308:169;;;2383:13;;2371:26;;2452:15;;;;2417:12;;;;2344:1;2337:9;2308:169;;;-1:-1:-1;2494:3:1;;1871:632;-1:-1:-1;;;;;;1871:632:1:o;2716:315::-;2784:6;2792;2845:2;2833:9;2824:7;2820:23;2816:32;2813:52;;;2861:1;2858;2851:12;2813:52;2900:9;2887:23;2919:31;2944:5;2919:31;:::i;:::-;2969:5;3021:2;3006:18;;;;2993:32;;-1:-1:-1;;;2716:315:1:o;3036:180::-;3095:6;3148:2;3136:9;3127:7;3123:23;3119:32;3116:52;;;3164:1;3161;3154:12;3116:52;-1:-1:-1;3187:23:1;;3036:180;-1:-1:-1;3036:180:1:o;3221:316::-;3298:6;3306;3314;3367:2;3355:9;3346:7;3342:23;3338:32;3335:52;;;3383:1;3380;3373:12;3335:52;-1:-1:-1;;3406:23:1;;;3476:2;3461:18;;3448:32;;-1:-1:-1;3527:2:1;3512:18;;;3499:32;;3221:316;-1:-1:-1;3221:316:1:o;3938:898::-;-1:-1:-1;;;;;4371:15:1;;;4353:34;;4423:15;;;4418:2;4403:18;;4396:43;4475:15;;;4470:2;4455:18;;4448:43;4527:15;;;4522:2;4507:18;;4500:43;4580:15;;4574:3;4559:19;;4552:44;4303:3;4333;4612:19;;4605:31;;;4274:4;;4653:45;4679:18;;;4671:6;4653:45;:::i;:::-;4729:3;4714:19;;4707:35;;;;-1:-1:-1;;4773:3:1;4758:19;;4751:35;;;;4817:3;4802:19;;;4795:35;4645:53;3938:898;-1:-1:-1;;;;;;3938:898:1:o;4841:127::-;4902:10;4897:3;4893:20;4890:1;4883:31;4933:4;4930:1;4923:15;4957:4;4954:1;4947:15;4973:125;5013:4;5041:1;5038;5035:8;5032:34;;;5046:18;;:::i;:::-;-1:-1:-1;5083:9:1;;4973:125::o;5938:380::-;6017:1;6013:12;;;;6060;;;6081:61;;6135:4;6127:6;6123:17;6113:27;;6081:61;6188:2;6180:6;6177:14;6157:18;6154:38;6151:161;;;6234:10;6229:3;6225:20;6222:1;6215:31;6269:4;6266:1;6259:15;6297:4;6294:1;6287:15;6449:1186;6558:4;6587:2;6616;6605:9;6598:21;6639:1;6672:6;6666:13;6702:3;6724:1;6752:9;6748:2;6744:18;6734:28;;6812:2;6801:9;6797:18;6834;6824:61;;6878:4;6870:6;6866:17;6856:27;;6824:61;6931:2;6923:6;6920:14;6900:18;6897:38;6894:165;;;-1:-1:-1;;;6958:33:1;;7014:4;7011:1;7004:15;7044:4;6965:3;7032:17;6894:165;7115:18;;;671:19;;;723:4;714:14;7158:18;7185:100;;;;7299:1;7294:315;;;;7151:458;;7185:100;-1:-1:-1;;7218:24:1;;7206:37;;7263:12;;;;-1:-1:-1;7185:100:1;;7294:315;6396:1;6389:14;;;6433:4;6420:18;;7389:1;7403:165;7417:6;7414:1;7411:13;7403:165;;;7495:14;;7482:11;;;7475:35;7538:16;;;;7432:10;;7403:165;;;7588:11;;;-1:-1:-1;;7151:458:1;-1:-1:-1;7626:3:1;;6449:1186;-1:-1:-1;;;;;;;;;6449:1186:1:o;7640:184::-;7710:6;7763:2;7751:9;7742:7;7738:23;7734:32;7731:52;;;7779:1;7776;7769:12;7731:52;-1:-1:-1;7802:16:1;;7640:184;-1:-1:-1;7640:184:1:o;7829:168::-;7869:7;7935:1;7931;7927:6;7923:14;7920:1;7917:21;7912:1;7905:9;7898:17;7894:45;7891:71;;;7942:18;;:::i;:::-;-1:-1:-1;7982:9:1;;7829:168::o;8002:127::-;8063:10;8058:3;8054:20;8051:1;8044:31;8094:4;8091:1;8084:15;8118:4;8115:1;8108:15;8134:120;8174:1;8200;8190:35;;8205:18;;:::i;:::-;-1:-1:-1;8239:9:1;;8134:120::o;8259:127::-;8320:10;8315:3;8311:20;8308:1;8301:31;8351:4;8348:1;8341:15;8375:4;8372:1;8365:15;8391:128;8431:3;8462:1;8458:6;8455:1;8452:13;8449:39;;;8468:18;;:::i;:::-;-1:-1:-1;8504:9:1;;8391:128::o;8524:135::-;8563:3;-1:-1:-1;;8584:17:1;;8581:43;;;8604:18;;:::i;:::-;-1:-1:-1;8651:1:1;8640:13;;8524:135::o;8664:356::-;8866:2;8848:21;;;8885:18;;;8878:30;8944:34;8939:2;8924:18;;8917:62;9011:2;8996:18;;8664:356::o;9312:277::-;9379:6;9432:2;9420:9;9411:7;9407:23;9403:32;9400:52;;;9448:1;9445;9438:12;9400:52;9480:9;9474:16;9533:5;9526:13;9519:21;9512:5;9509:32;9499:60;;9555:1;9552;9545:12;9594:405;9796:2;9778:21;;;9835:2;9815:18;;;9808:30;9874:34;9869:2;9854:18;;9847:62;-1:-1:-1;;;9940:2:1;9925:18;;9918:39;9989:3;9974:19;;9594:405::o;12661:251::-;12731:6;12784:2;12772:9;12763:7;12759:23;12755:32;12752:52;;;12800:1;12797;12790:12;12752:52;12832:9;12826:16;12851:31;12876:5;12851:31;:::i;14078:127::-;14139:10;14134:3;14130:20;14127:1;14120:31;14170:4;14167:1;14160:15;14194:4;14191:1;14184:15;19534:127;19595:10;19590:3;19586:20;19583:1;19576:31;19626:4;19623:1;19616:15;19650:4;19647:1;19640:15;19666:112;19698:1;19724;19714:35;;19729:18;;:::i;:::-;-1:-1:-1;19763:9:1;;19666:112::o;20959:274::-;21088:3;21126:6;21120:13;21142:53;21188:6;21183:3;21176:4;21168:6;21164:17;21142:53;:::i;:::-;21211:16;;;;;20959:274;-1:-1:-1;;20959:274:1:o
Swarm Source
ipfs://b38aa27e0f0c8f3125627fe81d09efc26f0670f22ce39700c704bba1de8500a1
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.