Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 5 from a total of 5 transactions
Loading...
Loading
Contract Name:
zapper
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-01-22 */ //Tombsonic.xyz // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; // Part: IHyperswapRouter01 interface IHyperswapRouter01 { function factory() external pure returns (address); function WFTM() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityFTM( address token, uint amountTokenDesired, uint amountTokenMin, uint amountFTMMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountFTM, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityFTM( address token, uint liquidity, uint amountTokenMin, uint amountFTMMin, address to, uint deadline ) external returns (uint amountToken, uint amountFTM); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityFTMWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountFTMMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountFTM); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactFTMForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactFTM(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForFTM(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapFTMForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // Part: IUniswapV2Pair interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // Part: IUniswapV2Router01 interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // Part: OpenZeppelin/[email protected]/IERC20 /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // Part: IVault interface IVault is IERC20 { function deposit(uint256 amount) external; function withdraw(uint256 shares) external; function want() external pure returns (address); } // Part: OpenZeppelin/[email protected]/Address /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Part: OpenZeppelin/[email protected]/SafeMath // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // Part: TransferHelper // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } } // Part: OpenZeppelin/[email protected]/SafeERC20 /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: Context.sol pragma solidity ^0.8.7; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: Ownable.sol pragma solidity ^0.8.7; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: IZap.sol interface IZap { function estimateZapInToken(address _from, address _to, address _router, uint _amt) external view returns (uint256, uint256); function swapToken(address _from, uint amount, address _to, address routerAddr, address _recipient) external; function swapToNative(address _from, uint amount, address routerAddr, address _recipient) external; function zapIn(address _to, address routerAddr, address _recipient) external payable; function zapInToken(address _from, uint amount, address _to, address routerAddr, address _recipient) external; function zapAcross(address _from, uint amount, address _toRouter, address _recipient) external; function zapOut(address _from, uint amount, address routerAddr, address _recipient) external; function zapOutToken(address _from, uint amount, address _to, address routerAddr, address _recipient) external; } // File: zapper.sol contract zapper is Ownable, IZap { using SafeMath for uint; using SafeERC20 for IERC20; /* ========== STATE VARIABLES ========== */ address private WNATIVE; address public validRouter; mapping(address => mapping(address => address)) private tokenBridgeForRouter; mapping(address => bool) public isFeeOnTransfer; mapping (address => bool) public useNativeRouter; constructor(address _WNATIVE) Ownable() { WNATIVE = _WNATIVE; } modifier authRouter(address _authRouter) { require(_authRouter == validRouter, "invalid router"); _; } /* ========== External Functions ========== */ receive() external payable {} function zapInToken(address _from, uint amount, address _to, address routerAddr, address _recipient) authRouter(routerAddr) external override { _approveTokenIfNeeded(_from, routerAddr); if (isFeeOnTransfer[_from]) { IERC20(_from).transferFrom(msg.sender, address(this), amount); _swapTokenToLP(_from, IERC20(_from).balanceOf(address(this)), _to, _recipient, routerAddr); return; } else { // From an ERC20 to an LP token, through specified router, going through base asset if necessary IERC20(_from).safeTransferFrom(msg.sender, address(this), amount); // we'll need this approval to add liquidity _approveTokenIfNeeded(_from, routerAddr); _swapTokenToLP(_from, amount, _to, _recipient, routerAddr); return; } } function estimateZapInToken(address _from, address _to, address _router, uint _amt) authRouter(_router) public view override returns (uint256, uint256) { // get pairs for desired lp if (_from == IUniswapV2Pair(_to).token0() || _from == IUniswapV2Pair(_to).token1()) { // check if we already have one of the assets // if so, we're going to sell half of _from for the other token we need // figure out which token we need, and approve address other = _from == IUniswapV2Pair(_to).token0() ? IUniswapV2Pair(_to).token1() : IUniswapV2Pair(_to).token0(); // calculate amount of _from to sell uint sellAmount = _amt.div(2); // execute swap uint otherAmount = _estimateSwap(_from, sellAmount, other, _router); if (_from == IUniswapV2Pair(_to).token0()) { return (sellAmount, otherAmount); } else { return (otherAmount, sellAmount); } } else { // go through native token for highest liquidity uint nativeAmount = _from == WNATIVE ? _amt : _estimateSwap(_from, _amt, WNATIVE, _router); if (WNATIVE == IUniswapV2Pair(_to).token0()) { return (nativeAmount.div(2), _estimateSwap(WNATIVE, nativeAmount.div(2), IUniswapV2Pair(_to).token1(), _router )); } if (WNATIVE == IUniswapV2Pair(_to).token1()) { return (_estimateSwap(WNATIVE, nativeAmount.div(2), IUniswapV2Pair(_to).token0(), _router ), nativeAmount.div(2)); } return (_estimateSwap(WNATIVE, nativeAmount.div(2), IUniswapV2Pair(_to).token0(), _router ), _estimateSwap(WNATIVE, nativeAmount.div(2), IUniswapV2Pair(_to).token1(), _router)); } } function zapIn(address _to, address routerAddr, address _recipient) authRouter(routerAddr) external payable override { // from Native to an LP token through the specified router _swapNativeToLP(_to, msg.value, _recipient, routerAddr); if (address(this).balance != 0) { TransferHelper.safeTransferETH(msg.sender, address(this).balance); } } function zapAcross(address _from, uint amount, address _toRouter, address _recipient) authRouter(_toRouter) external override { IERC20(_from).safeTransferFrom(msg.sender, address(this), amount); IUniswapV2Pair pair = IUniswapV2Pair(_from); _approveTokenIfNeeded(pair.token0(), _toRouter); _approveTokenIfNeeded(pair.token1(), _toRouter); IERC20(_from).safeTransfer(_from, amount); uint amt0; uint amt1; (amt0, amt1) = pair.burn(address(this)); IUniswapV2Router01(_toRouter).addLiquidity(pair.token0(), pair.token1(), amt0, amt1, 0, 0, _recipient, block.timestamp); } function zapOut(address _from, uint amount, address routerAddr, address _recipient) authRouter(routerAddr) external override { // from an LP token to Native through specified router // take the LP token IERC20(_from).safeTransferFrom(msg.sender, address(this), amount); _approveTokenIfNeeded(_from, routerAddr); // get pairs for LP address token0 = IUniswapV2Pair(_from).token0(); address token1 = IUniswapV2Pair(_from).token1(); _approveTokenIfNeeded(token0, routerAddr); _approveTokenIfNeeded(token1, routerAddr); // check if either is already native token if (token0 == WNATIVE || token1 == WNATIVE) { // if so, we only need to swap one, figure out which and how much address token = token0 != WNATIVE ? token0 : token1; uint amtToken; uint amtETH; (amtToken, amtETH) = IUniswapV2Router01(routerAddr).removeLiquidityETH(token, amount, 0, 0, address(this), block.timestamp); // swap with msg.sender as recipient, so they already get the Native _swapTokenForNative(token, amtToken, _recipient, routerAddr); // send other half of Native TransferHelper.safeTransferETH(_recipient, amtETH); } else { // convert both for Native with msg.sender as recipient uint amt0; uint amt1; (amt0, amt1) = IUniswapV2Router01(routerAddr).removeLiquidity(token0, token1, amount, 0, 0, address(this), block.timestamp); _swapTokenForNative(token0, amt0, _recipient, routerAddr); _swapTokenForNative(token1, amt1, _recipient, routerAddr); } } function zapOutToken(address _from, uint amount, address _to, address routerAddr, address _recipient) authRouter(routerAddr) external override { // from an LP token to an ERC20 through specified router IERC20(_from).safeTransferFrom(msg.sender, address(this), amount); _approveTokenIfNeeded(_from, routerAddr); address token0 = IUniswapV2Pair(_from).token0(); address token1 = IUniswapV2Pair(_from).token1(); _approveTokenIfNeeded(token0, routerAddr); _approveTokenIfNeeded(token1, routerAddr); uint amt0; uint amt1; (amt0, amt1) = IUniswapV2Router01(routerAddr).removeLiquidity(token0, token1, amount, 0, 0, address(this), block.timestamp); if (token0 != _to) { amt0 = _swap(token0, amt0, _to, address(this), routerAddr); } if (token1 != _to) { amt1 = _swap(token1, amt1, _to, address(this), routerAddr); } IERC20(_to).safeTransfer(_recipient, amt0.add(amt1)); } function swapToken(address _from, uint amount, address _to, address routerAddr, address _recipient) authRouter(routerAddr) external override { IERC20(_from).safeTransferFrom(msg.sender, address(this), amount); _approveTokenIfNeeded(_from, routerAddr); _swap(_from, amount, _to, _recipient, routerAddr); } function swapToNative(address _from, uint amount, address routerAddr, address _recipient) authRouter(routerAddr) external override { IERC20(_from).safeTransferFrom(msg.sender, address(this), amount); _approveTokenIfNeeded(_from, routerAddr); _swapTokenForNative(_from, amount, _recipient, routerAddr); } /* ========== Private Functions ========== */ function _approveTokenIfNeeded(address token, address router) private { if (IERC20(token).allowance(address(this), router) == 0) { IERC20(token).safeApprove(router, type(uint).max); } } function _swapTokenToLP(address _from, uint amount, address _to, address recipient, address routerAddr) private returns (uint) { // get pairs for desired lp if (_from == IUniswapV2Pair(_to).token0() || _from == IUniswapV2Pair(_to).token1()) { // check if we already have one of the assets // if so, we're going to sell half of _from for the other token we need // figure out which token we need, and approve address other = _from == IUniswapV2Pair(_to).token0() ? IUniswapV2Pair(_to).token1() : IUniswapV2Pair(_to).token0(); _approveTokenIfNeeded(other, routerAddr); // calculate amount of _from to sell uint sellAmount = amount.div(2); // execute swap uint otherAmount = _swap(_from, sellAmount, other, address(this), routerAddr); uint liquidity; ( , , liquidity) = IUniswapV2Router01(routerAddr).addLiquidity(_from, other, amount.sub(sellAmount), otherAmount, 0, 0, recipient, block.timestamp); return liquidity; } else { // go through native token for highest liquidity uint nativeAmount = _swapTokenForNative(_from, amount, address(this), routerAddr); return _swapNativeToLP(_to, nativeAmount, recipient, routerAddr); } } function _swapNativeToLP(address _LP, uint amount, address recipient, address routerAddress) private returns (uint) { // LP IUniswapV2Pair pair = IUniswapV2Pair(_LP); address token0 = pair.token0(); address token1 = pair.token1(); uint liquidity; if (token0 == WNATIVE || token1 == WNATIVE) { address token = token0 == WNATIVE ? token1 : token0; ( , , liquidity) = _swapHalfNativeAndProvide(token, amount, routerAddress, recipient); } else { ( , , liquidity) = _swapNativeToEqualTokensAndProvide(token0, token1, amount, routerAddress, recipient); } return liquidity; } function _swapHalfNativeAndProvide(address token, uint amount, address routerAddress, address recipient) private returns (uint, uint, uint) { uint swapValue = amount.div(2); uint tokenAmount = _swapNativeForToken(token, swapValue, address(this), routerAddress); _approveTokenIfNeeded(token, routerAddress); if (useNativeRouter[routerAddress]) { IHyperswapRouter01 router = IHyperswapRouter01(routerAddress); return router.addLiquidityFTM{value : amount.sub(swapValue)}(token, tokenAmount, 0, 0, recipient, block.timestamp); } else { IUniswapV2Router01 router = IUniswapV2Router01(routerAddress); return router.addLiquidityETH{value : amount.sub(swapValue)}(token, tokenAmount, 0, 0, recipient, block.timestamp); } } function _swapNativeToEqualTokensAndProvide(address token0, address token1, uint amount, address routerAddress, address recipient) private returns (uint, uint, uint) { uint swapValue = amount.div(2); uint token0Amount = _swapNativeForToken(token0, swapValue, address(this), routerAddress); uint token1Amount = _swapNativeForToken(token1, amount.sub(swapValue), address(this), routerAddress); _approveTokenIfNeeded(token0, routerAddress); _approveTokenIfNeeded(token1, routerAddress); IUniswapV2Router01 router = IUniswapV2Router01(routerAddress); return router.addLiquidity(token0, token1, token0Amount, token1Amount, 0, 0, recipient, block.timestamp); } function _swapNativeForToken(address token, uint value, address recipient, address routerAddr) private returns (uint) { address[] memory path; IUniswapV2Router01 router = IUniswapV2Router01(routerAddr); if (tokenBridgeForRouter[token][routerAddr] != address(0)) { path = new address[](3); path[0] = WNATIVE; path[1] = tokenBridgeForRouter[token][routerAddr]; path[2] = token; } else { path = new address[](2); path[0] = WNATIVE; path[1] = token; } uint[] memory amounts = router.swapExactETHForTokens{value : value}(0, path, recipient, block.timestamp); return amounts[amounts.length - 1]; } function _swapTokenForNative(address token, uint amount, address recipient, address routerAddr) private returns (uint) { address[] memory path; IUniswapV2Router01 router = IUniswapV2Router01(routerAddr); if (tokenBridgeForRouter[token][routerAddr] != address(0)) { path = new address[](3); path[0] = token; path[1] = tokenBridgeForRouter[token][routerAddr]; path[2] = router.WETH(); } else { path = new address[](2); path[0] = token; path[1] = router.WETH(); } if (isFeeOnTransfer[token]) { router.swapExactTokensForETHSupportingFeeOnTransferTokens(amount, 0, path, recipient, block.timestamp); return IERC20(token).balanceOf(address(this)); } else { uint[] memory amounts = router.swapExactTokensForETH(amount, 0, path, recipient, block.timestamp); return amounts[amounts.length - 1]; } } function _swap(address _from, uint amount, address _to, address recipient, address routerAddr) private returns (uint) { IUniswapV2Router01 router = IUniswapV2Router01(routerAddr); address fromBridge = tokenBridgeForRouter[_from][routerAddr]; address toBridge = tokenBridgeForRouter[_to][routerAddr]; address[] memory path; if (fromBridge != address(0) && toBridge != address(0)) { // both have bridge if (fromBridge != toBridge) { path = new address[](5); path[0] = _from; path[1] = fromBridge; path[2] = WNATIVE; path[3] = toBridge; path[4] = _to; } else { path = new address[](3); path[0] = _from; path[1] = fromBridge; path[2] = _to; } } else if (fromBridge != address(0)) { // from has bridge if (fromBridge == _to) { path = new address[](2); path[0] = _from; path[1] = _to; } else if (_to == WNATIVE) { path = new address[](3); path[0] = _from; path[1] = fromBridge; path[2] = WNATIVE; } else { path = new address[](4); path[0] = _from; path[1] = fromBridge; path[2] = WNATIVE; path[3] = _to; } } else if (toBridge != address(0)) { // only _to ha a bridge, not _from if (_from == toBridge) { path = new address[](2); path[0] = _from; path[1] = _to; } else if (_from == WNATIVE) { path = new address[](3); path[0] = WNATIVE; path[1] = toBridge; path[2] = _to; } else { path = new address[](4); path[0] = _from; path[1] = WNATIVE; path[2] = toBridge; path[3] = _to; } } else if (_from == WNATIVE || _to == WNATIVE) { path = new address[](2); path[0] = _from; path[1] = _to; } else { // Go through WNative path = new address[](3); path[0] = _from; path[1] = WNATIVE; path[2] = _to; } uint[] memory amounts; if (isFeeOnTransfer[_from]) { router.swapExactTokensForTokensSupportingFeeOnTransferTokens(amount, 0, path, recipient, block.timestamp); return IERC20(_to).balanceOf(address(this)); } else { amounts = router.swapExactTokensForTokens(amount, 0, path, recipient, block.timestamp); } return amounts[amounts.length - 1]; } function _estimateSwap(address _from, uint amount, address _to, address routerAddr) private view returns (uint) { IUniswapV2Router01 router = IUniswapV2Router01(routerAddr); address fromBridge = tokenBridgeForRouter[_from][routerAddr]; address toBridge = tokenBridgeForRouter[_to][routerAddr]; address[] memory path; if (fromBridge != address(0) && toBridge != address(0)) { if (fromBridge != toBridge) { path = new address[](5); path[0] = _from; path[1] = fromBridge; path[2] = WNATIVE; path[3] = toBridge; path[4] = _to; } else { path = new address[](3); path[0] = _from; path[1] = fromBridge; path[2] = _to; } } else if (fromBridge != address(0)) { if (fromBridge == _to) { path = new address[](2); path[0] = _from; path[1] = _to; } else if (_to == WNATIVE) { path = new address[](3); path[0] = _from; path[1] = fromBridge; path[2] = WNATIVE; } else { path = new address[](4); path[0] = _from; path[1] = fromBridge; path[2] = WNATIVE; path[3] = _to; } } else if (toBridge != address(0)) { if (_from == toBridge) { path = new address[](2); path[0] = _from; path[1] = _to; } else if (_from == WNATIVE) { path = new address[](3); path[0] = WNATIVE; path[1] = toBridge; path[2] = _to; } else { path = new address[](4); path[0] = _from; path[1] = WNATIVE; path[2] = toBridge; path[3] = _to; } } else if (_from == WNATIVE || _to == WNATIVE) { path = new address[](2); path[0] = _from; path[1] = _to; } else { // Go through WNative path = new address[](3); path[0] = _from; path[1] = WNATIVE; path[2] = _to; } uint[] memory amounts = router.getAmountsOut(amount, path); return amounts[amounts.length - 1]; } /* ========== RESTRICTED FUNCTIONS ========== */ function setTokenBridgeForRouter(address token, address router, address bridgeToken) external onlyOwner { tokenBridgeForRouter[token][router] = bridgeToken; } function setValidRouter(address _validRouter) external onlyOwner { validRouter = _validRouter; } function withdraw(address token) external onlyOwner { if (token == address(0)) { payable(owner()).transfer(address(this).balance); return; } IERC20(token).transfer(owner(), IERC20(token).balanceOf(address(this))); } function setUseNativeRouter(address router) external onlyOwner { useNativeRouter[router] = true; } function setIsFeeOnTransfer(address token) external onlyOwner { isFeeOnTransfer[token] = true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_WNATIVE","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"estimateZapInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeOnTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setIsFeeOnTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"bridgeToken","type":"address"}],"name":"setTokenBridgeForRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"setUseNativeRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validRouter","type":"address"}],"name":"setValidRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"routerAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"swapToNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"routerAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"swapToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"useNativeRouter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"validRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_toRouter","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"zapAcross","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"routerAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"zapIn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"routerAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"zapInToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"routerAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"zapOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"routerAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"zapOutToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620043763803806200437683398101604081905262000034916200009b565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b0319166001600160a01b0392909216919091179055620000cd565b600060208284031215620000ae57600080fd5b81516001600160a01b0381168114620000c657600080fd5b9392505050565b61429980620000dd6000396000f3fe6080604052600436106101185760003560e01c806388f61f9f116100a05780639416cbc6116100645780639416cbc6146102fe578063ba2ebf961461033e578063caaae7f51461035e578063cee6202c1461038e578063f2fde38b146103ae57600080fd5b806388f61f9f1461024b57806388fbe4191461026b57806389fecbd51461028b5780638da5cb5b146102ab5780638e8d8152146102c957600080fd5b806351cff8d9116100e757806351cff8d9146101b65780635424888b146101d65780635cc7647c146101f65780636de6332d14610216578063715018a61461023657600080fd5b8063104bfe551461012457806313aab8ef146101465780631b71afbd1461018357806335e8b7d5146101a357600080fd5b3661011f57005b600080fd5b34801561013057600080fd5b5061014461013f366004613c6e565b6103ce565b005b34801561015257600080fd5b50600254610166906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561018f57600080fd5b5061014461019e366004613d97565b610425565b6101446101b1366004613ca8565b61067a565b3480156101c257600080fd5b506101446101d1366004613c6e565b6106cc565b3480156101e257600080fd5b506101446101f1366004613ca8565b61085b565b34801561020257600080fd5b50610144610211366004613d44565b6108c2565b34801561022257600080fd5b50610144610231366004613c6e565b610bc2565b34801561024257600080fd5b50610144610c0e565b34801561025757600080fd5b50610144610266366004613d44565b610c82565b34801561027757600080fd5b50610144610286366004613c6e565b610f94565b34801561029757600080fd5b506101446102a6366004613d44565b610fe2565b3480156102b757600080fd5b506000546001600160a01b0316610166565b3480156102d557600080fd5b506102e96102e4366004613cf3565b611044565b6040805192835260208301919091520161017a565b34801561030a57600080fd5b5061032e610319366004613c6e565b60056020526000908152604090205460ff1681565b604051901515815260200161017a565b34801561034a57600080fd5b50610144610359366004613d97565b611674565b34801561036a57600080fd5b5061032e610379366004613c6e565b60046020526000908152604090205460ff1681565b34801561039a57600080fd5b506101446103a9366004613d97565b6116cf565b3480156103ba57600080fd5b506101446103c9366004613c6e565b611867565b6000546001600160a01b031633146104015760405162461bcd60e51b81526004016103f890614105565b60405180910390fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b60025482906001600160a01b038083169116146104545760405162461bcd60e51b81526004016103f8906140dd565b6104696001600160a01b038716333088611951565b61047386846119bc565b6000866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156104ae57600080fd5b505afa1580156104c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e69190613c8b565b90506000876001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561052357600080fd5b505afa158015610537573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055b9190613c8b565b905061056782866119bc565b61057181866119bc565b600080866001600160a01b031663baa2abde85858c60008030426040518863ffffffff1660e01b81526004016105ad9796959493929190613fb1565b6040805180830381600087803b1580156105c657600080fd5b505af11580156105da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fe9190613eff565b90925090506001600160a01b03848116908916146106265761062384838a308b611a55565b91505b876001600160a01b0316836001600160a01b03161461064f5761064c83828a308b611a55565b90505b61066e8661065d84846122ca565b6001600160a01b038b1691906122dd565b50505050505050505050565b60025482906001600160a01b038083169116146106a95760405162461bcd60e51b81526004016103f8906140dd565b6106b584348486612312565b5047156106c6576106c6334761248d565b50505050565b6000546001600160a01b031633146106f65760405162461bcd60e51b81526004016103f890614105565b6001600160a01b03811661074257600080546040516001600160a01b03909116914780156108fc02929091818181858888f1935050505015801561073e573d6000803e3d6000fd5b5050565b806001600160a01b031663a9059cbb6107636000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b1580156107a257600080fd5b505afa1580156107b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107da9190613ee6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561082057600080fd5b505af1158015610834573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073e9190613ec4565b50565b6000546001600160a01b031633146108855760405162461bcd60e51b81526004016103f890614105565b6001600160a01b03928316600090815260036020908152604080832094861683529390529190912080546001600160a01b03191691909216179055565b60025482906001600160a01b038083169116146108f15760405162461bcd60e51b81526004016103f8906140dd565b6109066001600160a01b038616333087611951565b61091085846119bc565b6000856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109839190613c8b565b90506000866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156109c057600080fd5b505afa1580156109d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f89190613c8b565b9050610a0482866119bc565b610a0e81866119bc565b6001546001600160a01b0383811691161480610a3757506001546001600160a01b038281169116145b15610b0e576001546000906001600160a01b0384811691161415610a5b5781610a5d565b825b9050600080876001600160a01b03166302751cec848b60008030426040518763ffffffff1660e01b8152600401610a999695949392919061403a565b6040805180830381600087803b158015610ab257600080fd5b505af1158015610ac6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aea9190613eff565b9092509050610afb8383898b612556565b50610b06878261248d565b505050610bb9565b600080866001600160a01b031663baa2abde85858b60008030426040518863ffffffff1660e01b8152600401610b4a9796959493929190613fb1565b6040805180830381600087803b158015610b6357600080fd5b505af1158015610b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9b9190613eff565b9092509050610bac8483888a612556565b5061066e8382888a612556565b50505050505050565b6000546001600160a01b03163314610bec5760405162461bcd60e51b81526004016103f890614105565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610c385760405162461bcd60e51b81526004016103f890614105565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025482906001600160a01b03808316911614610cb15760405162461bcd60e51b81526004016103f8906140dd565b610cc66001600160a01b038616333087611951565b6000859050610d45816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610d0757600080fd5b505afa158015610d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3f9190613c8b565b856119bc565b610d81816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610d0757600080fd5b610d956001600160a01b03871687876122dd565b60405163226bf2d160e21b815230600482015260009081906001600160a01b038416906389afcb44906024016040805180830381600087803b158015610dda57600080fd5b505af1158015610dee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e129190613eff565b8092508193505050856001600160a01b031663e8e33700846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610e6257600080fd5b505afa158015610e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9a9190613c8b565b856001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed357600080fd5b505afa158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0b9190613c8b565b85856000808c426040518963ffffffff1660e01b8152600401610f35989796959493929190613ff1565b606060405180830381600087803b158015610f4f57600080fd5b505af1158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f879190613f23565b5050505050505050505050565b6000546001600160a01b03163314610fbe5760405162461bcd60e51b81526004016103f890614105565b6001600160a01b03166000908152600560205260409020805460ff19166001179055565b60025482906001600160a01b038083169116146110115760405162461bcd60e51b81526004016103f8906140dd565b6110266001600160a01b038616333087611951565b61103085846119bc565b61103c85858486612556565b505050505050565b600254600090819084906001600160a01b038083169116146110785760405162461bcd60e51b81526004016103f8906140dd565b856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b157600080fd5b505afa1580156110c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e99190613c8b565b6001600160a01b0316876001600160a01b031614806111895750856001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561113c57600080fd5b505afa158015611150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111749190613c8b565b6001600160a01b0316876001600160a01b0316145b156113c2576000866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156111c957600080fd5b505afa1580156111dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112019190613c8b565b6001600160a01b0316886001600160a01b03161461128f57866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561125257600080fd5b505afa158015611266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128a9190613c8b565b611300565b866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156112c857600080fd5b505afa1580156112dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113009190613c8b565b9050600061130f866002612996565b9050600061131f8a83858b6129a2565b9050886001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561135a57600080fd5b505afa15801561136e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113929190613c8b565b6001600160a01b03168a6001600160a01b031614156113b757909450925061166a9050565b9450925061166a9050565b6001546000906001600160a01b038981169116146113f9576001546113f490899087906001600160a01b0316896129a2565b6113fb565b845b9050866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561143657600080fd5b505afa15801561144a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146e9190613c8b565b6001546001600160a01b039081169116141561152b5761148f816002612996565b600154611521906001600160a01b03166114aa846002612996565b8a6001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156114e357600080fd5b505afa1580156114f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151b9190613c8b565b8a6129a2565b935093505061166a565b866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561156457600080fd5b505afa158015611578573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159c9190613c8b565b6001546001600160a01b039081169116141561164f57600154611644906001600160a01b03166115cd836002612996565b896001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561160657600080fd5b505afa15801561161a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163e9190613c8b565b896129a2565b611521826002612996565b60015461148f906001600160a01b03166115cd836002612996565b5094509492505050565b60025482906001600160a01b038083169116146116a35760405162461bcd60e51b81526004016103f8906140dd565b6116b86001600160a01b038716333088611951565b6116c286846119bc565b610bb98686868587611a55565b60025482906001600160a01b038083169116146116fe5760405162461bcd60e51b81526004016103f8906140dd565b61170886846119bc565b6001600160a01b03861660009081526004602052604090205460ff161561183b576040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b038716906323b872dd90606401602060405180830381600087803b15801561177757600080fd5b505af115801561178b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117af9190613ec4565b506040516370a0823160e01b81523060048201526118359087906001600160a01b038216906370a082319060240160206040518083038186803b1580156117f557600080fd5b505afa158015611809573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182d9190613ee6565b868587613101565b5061103c565b6118506001600160a01b038716333088611951565b61185a86846119bc565b6118358686868587613101565b6000546001600160a01b031633146118915760405162461bcd60e51b81526004016103f890614105565b6001600160a01b0381166118f65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f8565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03808516602483015283166044820152606481018290526106c69085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613481565b604051636eb1769f60e11b81523060048201526001600160a01b03828116602483015283169063dd62ed3e9060440160206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b9190613ee6565b61073e5761073e6001600160a01b03831682600019613553565b6001600160a01b03808616600090815260036020818152604080842085871680865290835281852054898716865293835281852090855290915282205491928492918116911660608215801590611ab457506001600160a01b03821615155b15611c9657816001600160a01b0316836001600160a01b031614611bf95760408051600580825260c08201909252906020820160a0803683370190505090508981600081518110611b0757611b07614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611b3b57611b3b614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110611b6c57611b6c614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600381518110611ba057611ba0614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600481518110611bd457611bd4614222565b60200260200101906001600160a01b031690816001600160a01b0316815250506120f7565b6040805160038082526080820190925290602082016060803683370190505090508981600081518110611c2e57611c2e614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611c6257611c62614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600281518110611bd457611bd4614222565b6001600160a01b03831615611eb457876001600160a01b0316836001600160a01b03161415611d365760025b604051908082528060200260200182016040528015611ceb578160200160208202803683370190505b5090508981600081518110611d0257611d02614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600181518110611bd457611bd4614222565b6001546001600160a01b0389811691161415611de6576040805160038082526080820190925290602082016060803683370190505090508981600081518110611d8157611d81614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611db557611db5614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110611bd457611bd4614222565b60408051600480825260a0820190925290602082016080803683370190505090508981600081518110611e1b57611e1b614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611e4f57611e4f614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110611e8057611e80614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600381518110611bd457611bd4614222565b6001600160a01b0382161561200857816001600160a01b03168a6001600160a01b03161415611ee4576002611cc2565b6001546001600160a01b038b811691161415611f6f57604080516003808252608082019092529060208201606080368337505060015482519293506001600160a01b031691839150600090611f3b57611f3b614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600181518110611c6257611c62614222565b60408051600480825260a0820190925290602082016080803683370190505090508981600081518110611fa457611fa4614222565b6001600160a01b0392831660209182029290920101526001805483519216918391908110611fd457611fd4614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600281518110611e8057611e80614222565b6001546001600160a01b038b81169116148061203157506001546001600160a01b038981169116145b1561203d576002611cc2565b604080516003808252608082019092529060208201606080368337019050509050898160008151811061207257612072614222565b6001600160a01b03928316602091820292909201015260018054835192169183919081106120a2576120a2614222565b60200260200101906001600160a01b031690816001600160a01b03168152505087816002815181106120d6576120d6614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001600160a01b038a1660009081526004602052604090205460609060ff161561220557604051635c11d79560e01b81526001600160a01b03861690635c11d79590612150908d9060009087908e904290600401614153565b600060405180830381600087803b15801561216a57600080fd5b505af115801561217e573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526001600160a01b038c1692506370a08231915060240160206040518083038186803b1580156121c157600080fd5b505afa1580156121d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f99190613ee6565b955050505050506122c1565b6040516338ed173960e01b81526001600160a01b038616906338ed17399061223a908d9060009087908e904290600401614153565b600060405180830381600087803b15801561225457600080fd5b505af1158015612268573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122909190810190613dff565b905080600182516122a191906141c9565b815181106122b1576122b1614222565b6020026020010151955050505050505b95945050505050565b60006122d6828461418f565b9392505050565b6040516001600160a01b03831660248201526044810182905261230d90849063a9059cbb60e01b90606401611985565b505050565b6000808590506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561235357600080fd5b505afa158015612367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238b9190613c8b565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156123c857600080fd5b505afa1580156123dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124009190613c8b565b6001549091506000906001600160a01b038481169116148061242f57506001546001600160a01b038381169116145b1561246d576001546000906001600160a01b038581169116146124525783612454565b825b9050612462818a898b613677565b935061247f92505050565b61247a83838a898b61378a565b925050505b93505050505b949350505050565b604080516000808252602082019092526001600160a01b0384169083906040516124b79190613f95565b60006040518083038185875af1925050503d80600081146124f4576040519150601f19603f3d011682016040523d82523d6000602084013e6124f9565b606091505b505090508061230d5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016103f8565b6001600160a01b03848116600090815260036020908152604080832084861684529091528120549091606091849116156126d55760408051600380825260808201909252906020820160608036833701905050915086826000815181106125bf576125bf614222565b6001600160a01b0392831660209182029290920181019190915288821660009081526003825260408082208885168352909252205483519116908390600190811061260c5761260c614222565b60200260200101906001600160a01b031690816001600160a01b031681525050806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561266557600080fd5b505afa158015612679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269d9190613c8b565b826002815181106126b0576126b0614222565b60200260200101906001600160a01b031690816001600160a01b0316815250506127ce565b6040805160028082526060820183529091602083019080368337019050509150868260008151811061270957612709614222565b60200260200101906001600160a01b031690816001600160a01b031681525050806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561276257600080fd5b505afa158015612776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279a9190613c8b565b826001815181106127ad576127ad614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001600160a01b03871660009081526004602052604090205460ff16156128d65760405163791ac94760e01b81526001600160a01b0382169063791ac9479061282490899060009087908b904290600401614153565b600060405180830381600087803b15801561283e57600080fd5b505af1158015612852573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526001600160a01b038a1692506370a08231915060240160206040518083038186803b15801561289557600080fd5b505afa1580156128a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128cd9190613ee6565b92505050612485565b6040516318cbafe560e01b81526000906001600160a01b038316906318cbafe59061290d908a90859088908c904290600401614153565b600060405180830381600087803b15801561292757600080fd5b505af115801561293b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129639190810190613dff565b9050806001825161297491906141c9565b8151811061298457612984614222565b60200260200101519350505050612485565b60006122d682846141a7565b6001600160a01b03808516600090815260036020818152604080842085871680865290835281852054888716865293835281852090855290915282205491928492918116911660608215801590612a0157506001600160a01b03821615155b15612be357816001600160a01b0316836001600160a01b031614612b465760408051600580825260c08201909252906020820160a0803683370190505090508881600081518110612a5457612a54614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612a8857612a88614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110612ab957612ab9614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600381518110612aed57612aed614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600481518110612b2157612b21614222565b60200260200101906001600160a01b031690816001600160a01b031681525050613044565b6040805160038082526080820190925290602082016060803683370190505090508881600081518110612b7b57612b7b614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612baf57612baf614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600281518110612b2157612b21614222565b6001600160a01b03831615612e0157866001600160a01b0316836001600160a01b03161415612c835760025b604051908082528060200260200182016040528015612c38578160200160208202803683370190505b5090508881600081518110612c4f57612c4f614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600181518110612b2157612b21614222565b6001546001600160a01b0388811691161415612d33576040805160038082526080820190925290602082016060803683370190505090508881600081518110612cce57612cce614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612d0257612d02614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110612b2157612b21614222565b60408051600480825260a0820190925290602082016080803683370190505090508881600081518110612d6857612d68614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612d9c57612d9c614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110612dcd57612dcd614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600381518110612b2157612b21614222565b6001600160a01b03821615612f5557816001600160a01b0316896001600160a01b03161415612e31576002612c0f565b6001546001600160a01b038a811691161415612ebc57604080516003808252608082019092529060208201606080368337505060015482519293506001600160a01b031691839150600090612e8857612e88614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600181518110612baf57612baf614222565b60408051600480825260a0820190925290602082016080803683370190505090508881600081518110612ef157612ef1614222565b6001600160a01b0392831660209182029290920101526001805483519216918391908110612f2157612f21614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600281518110612dcd57612dcd614222565b6001546001600160a01b038a811691161480612f7e57506001546001600160a01b038881169116145b15612f8a576002612c0f565b6040805160038082526080820190925290602082016060803683370190505090508881600081518110612fbf57612fbf614222565b6001600160a01b0392831660209182029290920101526001805483519216918391908110612fef57612fef614222565b60200260200101906001600160a01b031690816001600160a01b031681525050868160028151811061302357613023614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b60405163d06ca61f60e01b81526000906001600160a01b0386169063d06ca61f90613075908c90869060040161413a565b60006040518083038186803b15801561308d57600080fd5b505afa1580156130a1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130c99190810190613dff565b905080600182516130da91906141c9565b815181106130ea576130ea614222565b602002602001015195505050505050949350505050565b6000836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561313c57600080fd5b505afa158015613150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131749190613c8b565b6001600160a01b0316866001600160a01b031614806132145750836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156131c757600080fd5b505afa1580156131db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ff9190613c8b565b6001600160a01b0316866001600160a01b0316145b1561345d576000846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561325457600080fd5b505afa158015613268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328c9190613c8b565b6001600160a01b0316876001600160a01b03161461331a57846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156132dd57600080fd5b505afa1580156132f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133159190613c8b565b61338b565b846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561335357600080fd5b505afa158015613367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338b9190613c8b565b905061339781846119bc565b60006133a4876002612996565b905060006133b58983853089611a55565b905060006001600160a01b03861663e8e337008b866133d48d88613880565b866000808e426040518963ffffffff1660e01b81526004016133fd989796959493929190613ff1565b606060405180830381600087803b15801561341757600080fd5b505af115801561342b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344f9190613f23565b96506122c195505050505050565b600061346b87873086612556565b905061347985828686612312565b9150506122c1565b60006134d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661388c9092919063ffffffff16565b80519091501561230d57808060200190518101906134f49190613ec4565b61230d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f8565b8015806135dc5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156135a257600080fd5b505afa1580156135b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135da9190613ee6565b155b6136475760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016103f8565b6040516001600160a01b03831660248201526044810182905261230d90849063095ea7b360e01b90606401611985565b6000808080613687876002612996565b905060006136978983308a61389b565b90506136a389886119bc565b6001600160a01b03871660009081526005602052604090205460ff161561376657866001600160a01b03811663d427d12c6136de8b86613880565b8c856000808d426040518863ffffffff1660e01b81526004016137069695949392919061403a565b6060604051808303818588803b15801561371f57600080fd5b505af1158015613733573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906137589190613f23565b955095509550505050613780565b866001600160a01b03811663f305d7196136de8b86613880565b9450945094915050565b600080808061379a876002612996565b905060006137aa8a83308a61389b565b905060006137c38a6137bc8b86613880565b308b61389b565b90506137cf8b896119bc565b6137d98a896119bc565b6000889050806001600160a01b031663e8e337008d8d86866000808f426040518963ffffffff1660e01b8152600401613819989796959493929190613ff1565b606060405180830381600087803b15801561383357600080fd5b505af1158015613847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061386b9190613f23565b96509650965050505050955095509592505050565b60006122d682846141c9565b60606124858484600085613b0d565b6001600160a01b03848116600090815260036020908152604080832084861684529091528120549091606091849116156139b657604080516003808252608082019092529060208201606080368337505060015482519294506001600160a01b03169184915060009061391057613910614222565b6001600160a01b0392831660209182029290920181019190915288821660009081526003825260408082208885168352909252205483519116908390600190811061395d5761395d614222565b60200260200101906001600160a01b031690816001600160a01b031681525050868260028151811061399157613991614222565b60200260200101906001600160a01b031690816001600160a01b031681525050613a4b565b6040805160028082526060820183529091602083019080368337505060015482519294506001600160a01b0316918491506000906139f6576139f6614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508682600181518110613a2a57613a2a614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6000816001600160a01b0316637ff36ab5886000868a426040518663ffffffff1660e01b8152600401613a819493929190614075565b6000604051808303818588803b158015613a9a57600080fd5b505af1158015613aae573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052613ad79190810190613dff565b90508060018251613ae891906141c9565b81518110613af857613af8614222565b60200260200101519350505050949350505050565b606082471015613b6e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f8565b843b613bbc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f8565b600080866001600160a01b03168587604051613bd89190613f95565b60006040518083038185875af1925050503d8060008114613c15576040519150601f19603f3d011682016040523d82523d6000602084013e613c1a565b606091505b5091509150613c2a828286613c35565b979650505050505050565b60608315613c445750816122d6565b825115613c545782518084602001fd5b8160405162461bcd60e51b81526004016103f891906140aa565b600060208284031215613c8057600080fd5b81356122d68161424e565b600060208284031215613c9d57600080fd5b81516122d68161424e565b600080600060608486031215613cbd57600080fd5b8335613cc88161424e565b92506020840135613cd88161424e565b91506040840135613ce88161424e565b809150509250925092565b60008060008060808587031215613d0957600080fd5b8435613d148161424e565b93506020850135613d248161424e565b92506040850135613d348161424e565b9396929550929360600135925050565b60008060008060808587031215613d5a57600080fd5b8435613d658161424e565b9350602085013592506040850135613d7c8161424e565b91506060850135613d8c8161424e565b939692955090935050565b600080600080600060a08688031215613daf57600080fd5b8535613dba8161424e565b9450602086013593506040860135613dd18161424e565b92506060860135613de18161424e565b91506080860135613df18161424e565b809150509295509295909350565b60006020808385031215613e1257600080fd5b825167ffffffffffffffff80821115613e2a57600080fd5b818501915085601f830112613e3e57600080fd5b815181811115613e5057613e50614238565b8060051b604051601f19603f83011681018181108582111715613e7557613e75614238565b604052828152858101935084860182860187018a1015613e9457600080fd5b600095505b83861015613eb7578051855260019590950194938601938601613e99565b5098975050505050505050565b600060208284031215613ed657600080fd5b815180151581146122d657600080fd5b600060208284031215613ef857600080fd5b5051919050565b60008060408385031215613f1257600080fd5b505080516020909101519092909150565b600080600060608486031215613f3857600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b83811015613f8a5781516001600160a01b031687529582019590820190600101613f65565b509495945050505050565b60008251613fa78184602087016141e0565b9190910192915050565b6001600160a01b039788168152958716602087015260408601949094526060850192909252608084015290921660a082015260c081019190915260e00190565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b84815260806020820152600061408e6080830186613f51565b6001600160a01b03949094166040830152506060015292915050565b60208152600082518060208401526140c98160408501602087016141e0565b601f01601f19169190910160400192915050565b6020808252600e908201526d34b73b30b634b2103937baba32b960911b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8281526040602082015260006124856040830184613f51565b85815284602082015260a06040820152600061417260a0830186613f51565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156141a2576141a261420c565b500190565b6000826141c457634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156141db576141db61420c565b500390565b60005b838110156141fb5781810151838201526020016141e3565b838111156106c65750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461085857600080fdfea26469706673582212200c8c505330f2b3115287de2bba91f896bf8d89c8a9ed6abeb5d44b4a799b8b7764736f6c63430008070033000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode
0x6080604052600436106101185760003560e01c806388f61f9f116100a05780639416cbc6116100645780639416cbc6146102fe578063ba2ebf961461033e578063caaae7f51461035e578063cee6202c1461038e578063f2fde38b146103ae57600080fd5b806388f61f9f1461024b57806388fbe4191461026b57806389fecbd51461028b5780638da5cb5b146102ab5780638e8d8152146102c957600080fd5b806351cff8d9116100e757806351cff8d9146101b65780635424888b146101d65780635cc7647c146101f65780636de6332d14610216578063715018a61461023657600080fd5b8063104bfe551461012457806313aab8ef146101465780631b71afbd1461018357806335e8b7d5146101a357600080fd5b3661011f57005b600080fd5b34801561013057600080fd5b5061014461013f366004613c6e565b6103ce565b005b34801561015257600080fd5b50600254610166906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561018f57600080fd5b5061014461019e366004613d97565b610425565b6101446101b1366004613ca8565b61067a565b3480156101c257600080fd5b506101446101d1366004613c6e565b6106cc565b3480156101e257600080fd5b506101446101f1366004613ca8565b61085b565b34801561020257600080fd5b50610144610211366004613d44565b6108c2565b34801561022257600080fd5b50610144610231366004613c6e565b610bc2565b34801561024257600080fd5b50610144610c0e565b34801561025757600080fd5b50610144610266366004613d44565b610c82565b34801561027757600080fd5b50610144610286366004613c6e565b610f94565b34801561029757600080fd5b506101446102a6366004613d44565b610fe2565b3480156102b757600080fd5b506000546001600160a01b0316610166565b3480156102d557600080fd5b506102e96102e4366004613cf3565b611044565b6040805192835260208301919091520161017a565b34801561030a57600080fd5b5061032e610319366004613c6e565b60056020526000908152604090205460ff1681565b604051901515815260200161017a565b34801561034a57600080fd5b50610144610359366004613d97565b611674565b34801561036a57600080fd5b5061032e610379366004613c6e565b60046020526000908152604090205460ff1681565b34801561039a57600080fd5b506101446103a9366004613d97565b6116cf565b3480156103ba57600080fd5b506101446103c9366004613c6e565b611867565b6000546001600160a01b031633146104015760405162461bcd60e51b81526004016103f890614105565b60405180910390fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b60025482906001600160a01b038083169116146104545760405162461bcd60e51b81526004016103f8906140dd565b6104696001600160a01b038716333088611951565b61047386846119bc565b6000866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156104ae57600080fd5b505afa1580156104c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e69190613c8b565b90506000876001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561052357600080fd5b505afa158015610537573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055b9190613c8b565b905061056782866119bc565b61057181866119bc565b600080866001600160a01b031663baa2abde85858c60008030426040518863ffffffff1660e01b81526004016105ad9796959493929190613fb1565b6040805180830381600087803b1580156105c657600080fd5b505af11580156105da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fe9190613eff565b90925090506001600160a01b03848116908916146106265761062384838a308b611a55565b91505b876001600160a01b0316836001600160a01b03161461064f5761064c83828a308b611a55565b90505b61066e8661065d84846122ca565b6001600160a01b038b1691906122dd565b50505050505050505050565b60025482906001600160a01b038083169116146106a95760405162461bcd60e51b81526004016103f8906140dd565b6106b584348486612312565b5047156106c6576106c6334761248d565b50505050565b6000546001600160a01b031633146106f65760405162461bcd60e51b81526004016103f890614105565b6001600160a01b03811661074257600080546040516001600160a01b03909116914780156108fc02929091818181858888f1935050505015801561073e573d6000803e3d6000fd5b5050565b806001600160a01b031663a9059cbb6107636000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b1580156107a257600080fd5b505afa1580156107b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107da9190613ee6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561082057600080fd5b505af1158015610834573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073e9190613ec4565b50565b6000546001600160a01b031633146108855760405162461bcd60e51b81526004016103f890614105565b6001600160a01b03928316600090815260036020908152604080832094861683529390529190912080546001600160a01b03191691909216179055565b60025482906001600160a01b038083169116146108f15760405162461bcd60e51b81526004016103f8906140dd565b6109066001600160a01b038616333087611951565b61091085846119bc565b6000856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109839190613c8b565b90506000866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156109c057600080fd5b505afa1580156109d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f89190613c8b565b9050610a0482866119bc565b610a0e81866119bc565b6001546001600160a01b0383811691161480610a3757506001546001600160a01b038281169116145b15610b0e576001546000906001600160a01b0384811691161415610a5b5781610a5d565b825b9050600080876001600160a01b03166302751cec848b60008030426040518763ffffffff1660e01b8152600401610a999695949392919061403a565b6040805180830381600087803b158015610ab257600080fd5b505af1158015610ac6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aea9190613eff565b9092509050610afb8383898b612556565b50610b06878261248d565b505050610bb9565b600080866001600160a01b031663baa2abde85858b60008030426040518863ffffffff1660e01b8152600401610b4a9796959493929190613fb1565b6040805180830381600087803b158015610b6357600080fd5b505af1158015610b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9b9190613eff565b9092509050610bac8483888a612556565b5061066e8382888a612556565b50505050505050565b6000546001600160a01b03163314610bec5760405162461bcd60e51b81526004016103f890614105565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610c385760405162461bcd60e51b81526004016103f890614105565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025482906001600160a01b03808316911614610cb15760405162461bcd60e51b81526004016103f8906140dd565b610cc66001600160a01b038616333087611951565b6000859050610d45816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610d0757600080fd5b505afa158015610d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3f9190613c8b565b856119bc565b610d81816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610d0757600080fd5b610d956001600160a01b03871687876122dd565b60405163226bf2d160e21b815230600482015260009081906001600160a01b038416906389afcb44906024016040805180830381600087803b158015610dda57600080fd5b505af1158015610dee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e129190613eff565b8092508193505050856001600160a01b031663e8e33700846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610e6257600080fd5b505afa158015610e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9a9190613c8b565b856001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed357600080fd5b505afa158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0b9190613c8b565b85856000808c426040518963ffffffff1660e01b8152600401610f35989796959493929190613ff1565b606060405180830381600087803b158015610f4f57600080fd5b505af1158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f879190613f23565b5050505050505050505050565b6000546001600160a01b03163314610fbe5760405162461bcd60e51b81526004016103f890614105565b6001600160a01b03166000908152600560205260409020805460ff19166001179055565b60025482906001600160a01b038083169116146110115760405162461bcd60e51b81526004016103f8906140dd565b6110266001600160a01b038616333087611951565b61103085846119bc565b61103c85858486612556565b505050505050565b600254600090819084906001600160a01b038083169116146110785760405162461bcd60e51b81526004016103f8906140dd565b856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b157600080fd5b505afa1580156110c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e99190613c8b565b6001600160a01b0316876001600160a01b031614806111895750856001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561113c57600080fd5b505afa158015611150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111749190613c8b565b6001600160a01b0316876001600160a01b0316145b156113c2576000866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156111c957600080fd5b505afa1580156111dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112019190613c8b565b6001600160a01b0316886001600160a01b03161461128f57866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561125257600080fd5b505afa158015611266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128a9190613c8b565b611300565b866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156112c857600080fd5b505afa1580156112dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113009190613c8b565b9050600061130f866002612996565b9050600061131f8a83858b6129a2565b9050886001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561135a57600080fd5b505afa15801561136e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113929190613c8b565b6001600160a01b03168a6001600160a01b031614156113b757909450925061166a9050565b9450925061166a9050565b6001546000906001600160a01b038981169116146113f9576001546113f490899087906001600160a01b0316896129a2565b6113fb565b845b9050866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561143657600080fd5b505afa15801561144a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146e9190613c8b565b6001546001600160a01b039081169116141561152b5761148f816002612996565b600154611521906001600160a01b03166114aa846002612996565b8a6001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156114e357600080fd5b505afa1580156114f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151b9190613c8b565b8a6129a2565b935093505061166a565b866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561156457600080fd5b505afa158015611578573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159c9190613c8b565b6001546001600160a01b039081169116141561164f57600154611644906001600160a01b03166115cd836002612996565b896001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561160657600080fd5b505afa15801561161a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163e9190613c8b565b896129a2565b611521826002612996565b60015461148f906001600160a01b03166115cd836002612996565b5094509492505050565b60025482906001600160a01b038083169116146116a35760405162461bcd60e51b81526004016103f8906140dd565b6116b86001600160a01b038716333088611951565b6116c286846119bc565b610bb98686868587611a55565b60025482906001600160a01b038083169116146116fe5760405162461bcd60e51b81526004016103f8906140dd565b61170886846119bc565b6001600160a01b03861660009081526004602052604090205460ff161561183b576040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b038716906323b872dd90606401602060405180830381600087803b15801561177757600080fd5b505af115801561178b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117af9190613ec4565b506040516370a0823160e01b81523060048201526118359087906001600160a01b038216906370a082319060240160206040518083038186803b1580156117f557600080fd5b505afa158015611809573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182d9190613ee6565b868587613101565b5061103c565b6118506001600160a01b038716333088611951565b61185a86846119bc565b6118358686868587613101565b6000546001600160a01b031633146118915760405162461bcd60e51b81526004016103f890614105565b6001600160a01b0381166118f65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f8565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03808516602483015283166044820152606481018290526106c69085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613481565b604051636eb1769f60e11b81523060048201526001600160a01b03828116602483015283169063dd62ed3e9060440160206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b9190613ee6565b61073e5761073e6001600160a01b03831682600019613553565b6001600160a01b03808616600090815260036020818152604080842085871680865290835281852054898716865293835281852090855290915282205491928492918116911660608215801590611ab457506001600160a01b03821615155b15611c9657816001600160a01b0316836001600160a01b031614611bf95760408051600580825260c08201909252906020820160a0803683370190505090508981600081518110611b0757611b07614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611b3b57611b3b614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110611b6c57611b6c614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600381518110611ba057611ba0614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600481518110611bd457611bd4614222565b60200260200101906001600160a01b031690816001600160a01b0316815250506120f7565b6040805160038082526080820190925290602082016060803683370190505090508981600081518110611c2e57611c2e614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611c6257611c62614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600281518110611bd457611bd4614222565b6001600160a01b03831615611eb457876001600160a01b0316836001600160a01b03161415611d365760025b604051908082528060200260200182016040528015611ceb578160200160208202803683370190505b5090508981600081518110611d0257611d02614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600181518110611bd457611bd4614222565b6001546001600160a01b0389811691161415611de6576040805160038082526080820190925290602082016060803683370190505090508981600081518110611d8157611d81614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611db557611db5614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110611bd457611bd4614222565b60408051600480825260a0820190925290602082016080803683370190505090508981600081518110611e1b57611e1b614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611e4f57611e4f614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110611e8057611e80614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600381518110611bd457611bd4614222565b6001600160a01b0382161561200857816001600160a01b03168a6001600160a01b03161415611ee4576002611cc2565b6001546001600160a01b038b811691161415611f6f57604080516003808252608082019092529060208201606080368337505060015482519293506001600160a01b031691839150600090611f3b57611f3b614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600181518110611c6257611c62614222565b60408051600480825260a0820190925290602082016080803683370190505090508981600081518110611fa457611fa4614222565b6001600160a01b0392831660209182029290920101526001805483519216918391908110611fd457611fd4614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600281518110611e8057611e80614222565b6001546001600160a01b038b81169116148061203157506001546001600160a01b038981169116145b1561203d576002611cc2565b604080516003808252608082019092529060208201606080368337019050509050898160008151811061207257612072614222565b6001600160a01b03928316602091820292909201015260018054835192169183919081106120a2576120a2614222565b60200260200101906001600160a01b031690816001600160a01b03168152505087816002815181106120d6576120d6614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001600160a01b038a1660009081526004602052604090205460609060ff161561220557604051635c11d79560e01b81526001600160a01b03861690635c11d79590612150908d9060009087908e904290600401614153565b600060405180830381600087803b15801561216a57600080fd5b505af115801561217e573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526001600160a01b038c1692506370a08231915060240160206040518083038186803b1580156121c157600080fd5b505afa1580156121d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f99190613ee6565b955050505050506122c1565b6040516338ed173960e01b81526001600160a01b038616906338ed17399061223a908d9060009087908e904290600401614153565b600060405180830381600087803b15801561225457600080fd5b505af1158015612268573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122909190810190613dff565b905080600182516122a191906141c9565b815181106122b1576122b1614222565b6020026020010151955050505050505b95945050505050565b60006122d6828461418f565b9392505050565b6040516001600160a01b03831660248201526044810182905261230d90849063a9059cbb60e01b90606401611985565b505050565b6000808590506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561235357600080fd5b505afa158015612367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238b9190613c8b565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156123c857600080fd5b505afa1580156123dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124009190613c8b565b6001549091506000906001600160a01b038481169116148061242f57506001546001600160a01b038381169116145b1561246d576001546000906001600160a01b038581169116146124525783612454565b825b9050612462818a898b613677565b935061247f92505050565b61247a83838a898b61378a565b925050505b93505050505b949350505050565b604080516000808252602082019092526001600160a01b0384169083906040516124b79190613f95565b60006040518083038185875af1925050503d80600081146124f4576040519150601f19603f3d011682016040523d82523d6000602084013e6124f9565b606091505b505090508061230d5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016103f8565b6001600160a01b03848116600090815260036020908152604080832084861684529091528120549091606091849116156126d55760408051600380825260808201909252906020820160608036833701905050915086826000815181106125bf576125bf614222565b6001600160a01b0392831660209182029290920181019190915288821660009081526003825260408082208885168352909252205483519116908390600190811061260c5761260c614222565b60200260200101906001600160a01b031690816001600160a01b031681525050806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561266557600080fd5b505afa158015612679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269d9190613c8b565b826002815181106126b0576126b0614222565b60200260200101906001600160a01b031690816001600160a01b0316815250506127ce565b6040805160028082526060820183529091602083019080368337019050509150868260008151811061270957612709614222565b60200260200101906001600160a01b031690816001600160a01b031681525050806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561276257600080fd5b505afa158015612776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279a9190613c8b565b826001815181106127ad576127ad614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001600160a01b03871660009081526004602052604090205460ff16156128d65760405163791ac94760e01b81526001600160a01b0382169063791ac9479061282490899060009087908b904290600401614153565b600060405180830381600087803b15801561283e57600080fd5b505af1158015612852573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526001600160a01b038a1692506370a08231915060240160206040518083038186803b15801561289557600080fd5b505afa1580156128a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128cd9190613ee6565b92505050612485565b6040516318cbafe560e01b81526000906001600160a01b038316906318cbafe59061290d908a90859088908c904290600401614153565b600060405180830381600087803b15801561292757600080fd5b505af115801561293b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129639190810190613dff565b9050806001825161297491906141c9565b8151811061298457612984614222565b60200260200101519350505050612485565b60006122d682846141a7565b6001600160a01b03808516600090815260036020818152604080842085871680865290835281852054888716865293835281852090855290915282205491928492918116911660608215801590612a0157506001600160a01b03821615155b15612be357816001600160a01b0316836001600160a01b031614612b465760408051600580825260c08201909252906020820160a0803683370190505090508881600081518110612a5457612a54614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612a8857612a88614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110612ab957612ab9614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600381518110612aed57612aed614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600481518110612b2157612b21614222565b60200260200101906001600160a01b031690816001600160a01b031681525050613044565b6040805160038082526080820190925290602082016060803683370190505090508881600081518110612b7b57612b7b614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612baf57612baf614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600281518110612b2157612b21614222565b6001600160a01b03831615612e0157866001600160a01b0316836001600160a01b03161415612c835760025b604051908082528060200260200182016040528015612c38578160200160208202803683370190505b5090508881600081518110612c4f57612c4f614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600181518110612b2157612b21614222565b6001546001600160a01b0388811691161415612d33576040805160038082526080820190925290602082016060803683370190505090508881600081518110612cce57612cce614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612d0257612d02614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110612b2157612b21614222565b60408051600480825260a0820190925290602082016080803683370190505090508881600081518110612d6857612d68614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612d9c57612d9c614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110612dcd57612dcd614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600381518110612b2157612b21614222565b6001600160a01b03821615612f5557816001600160a01b0316896001600160a01b03161415612e31576002612c0f565b6001546001600160a01b038a811691161415612ebc57604080516003808252608082019092529060208201606080368337505060015482519293506001600160a01b031691839150600090612e8857612e88614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600181518110612baf57612baf614222565b60408051600480825260a0820190925290602082016080803683370190505090508881600081518110612ef157612ef1614222565b6001600160a01b0392831660209182029290920101526001805483519216918391908110612f2157612f21614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600281518110612dcd57612dcd614222565b6001546001600160a01b038a811691161480612f7e57506001546001600160a01b038881169116145b15612f8a576002612c0f565b6040805160038082526080820190925290602082016060803683370190505090508881600081518110612fbf57612fbf614222565b6001600160a01b0392831660209182029290920101526001805483519216918391908110612fef57612fef614222565b60200260200101906001600160a01b031690816001600160a01b031681525050868160028151811061302357613023614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b60405163d06ca61f60e01b81526000906001600160a01b0386169063d06ca61f90613075908c90869060040161413a565b60006040518083038186803b15801561308d57600080fd5b505afa1580156130a1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130c99190810190613dff565b905080600182516130da91906141c9565b815181106130ea576130ea614222565b602002602001015195505050505050949350505050565b6000836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561313c57600080fd5b505afa158015613150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131749190613c8b565b6001600160a01b0316866001600160a01b031614806132145750836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156131c757600080fd5b505afa1580156131db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ff9190613c8b565b6001600160a01b0316866001600160a01b0316145b1561345d576000846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561325457600080fd5b505afa158015613268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328c9190613c8b565b6001600160a01b0316876001600160a01b03161461331a57846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156132dd57600080fd5b505afa1580156132f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133159190613c8b565b61338b565b846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561335357600080fd5b505afa158015613367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338b9190613c8b565b905061339781846119bc565b60006133a4876002612996565b905060006133b58983853089611a55565b905060006001600160a01b03861663e8e337008b866133d48d88613880565b866000808e426040518963ffffffff1660e01b81526004016133fd989796959493929190613ff1565b606060405180830381600087803b15801561341757600080fd5b505af115801561342b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344f9190613f23565b96506122c195505050505050565b600061346b87873086612556565b905061347985828686612312565b9150506122c1565b60006134d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661388c9092919063ffffffff16565b80519091501561230d57808060200190518101906134f49190613ec4565b61230d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f8565b8015806135dc5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156135a257600080fd5b505afa1580156135b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135da9190613ee6565b155b6136475760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016103f8565b6040516001600160a01b03831660248201526044810182905261230d90849063095ea7b360e01b90606401611985565b6000808080613687876002612996565b905060006136978983308a61389b565b90506136a389886119bc565b6001600160a01b03871660009081526005602052604090205460ff161561376657866001600160a01b03811663d427d12c6136de8b86613880565b8c856000808d426040518863ffffffff1660e01b81526004016137069695949392919061403a565b6060604051808303818588803b15801561371f57600080fd5b505af1158015613733573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906137589190613f23565b955095509550505050613780565b866001600160a01b03811663f305d7196136de8b86613880565b9450945094915050565b600080808061379a876002612996565b905060006137aa8a83308a61389b565b905060006137c38a6137bc8b86613880565b308b61389b565b90506137cf8b896119bc565b6137d98a896119bc565b6000889050806001600160a01b031663e8e337008d8d86866000808f426040518963ffffffff1660e01b8152600401613819989796959493929190613ff1565b606060405180830381600087803b15801561383357600080fd5b505af1158015613847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061386b9190613f23565b96509650965050505050955095509592505050565b60006122d682846141c9565b60606124858484600085613b0d565b6001600160a01b03848116600090815260036020908152604080832084861684529091528120549091606091849116156139b657604080516003808252608082019092529060208201606080368337505060015482519294506001600160a01b03169184915060009061391057613910614222565b6001600160a01b0392831660209182029290920181019190915288821660009081526003825260408082208885168352909252205483519116908390600190811061395d5761395d614222565b60200260200101906001600160a01b031690816001600160a01b031681525050868260028151811061399157613991614222565b60200260200101906001600160a01b031690816001600160a01b031681525050613a4b565b6040805160028082526060820183529091602083019080368337505060015482519294506001600160a01b0316918491506000906139f6576139f6614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508682600181518110613a2a57613a2a614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6000816001600160a01b0316637ff36ab5886000868a426040518663ffffffff1660e01b8152600401613a819493929190614075565b6000604051808303818588803b158015613a9a57600080fd5b505af1158015613aae573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052613ad79190810190613dff565b90508060018251613ae891906141c9565b81518110613af857613af8614222565b60200260200101519350505050949350505050565b606082471015613b6e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f8565b843b613bbc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f8565b600080866001600160a01b03168587604051613bd89190613f95565b60006040518083038185875af1925050503d8060008114613c15576040519150601f19603f3d011682016040523d82523d6000602084013e613c1a565b606091505b5091509150613c2a828286613c35565b979650505050505050565b60608315613c445750816122d6565b825115613c545782518084602001fd5b8160405162461bcd60e51b81526004016103f891906140aa565b600060208284031215613c8057600080fd5b81356122d68161424e565b600060208284031215613c9d57600080fd5b81516122d68161424e565b600080600060608486031215613cbd57600080fd5b8335613cc88161424e565b92506020840135613cd88161424e565b91506040840135613ce88161424e565b809150509250925092565b60008060008060808587031215613d0957600080fd5b8435613d148161424e565b93506020850135613d248161424e565b92506040850135613d348161424e565b9396929550929360600135925050565b60008060008060808587031215613d5a57600080fd5b8435613d658161424e565b9350602085013592506040850135613d7c8161424e565b91506060850135613d8c8161424e565b939692955090935050565b600080600080600060a08688031215613daf57600080fd5b8535613dba8161424e565b9450602086013593506040860135613dd18161424e565b92506060860135613de18161424e565b91506080860135613df18161424e565b809150509295509295909350565b60006020808385031215613e1257600080fd5b825167ffffffffffffffff80821115613e2a57600080fd5b818501915085601f830112613e3e57600080fd5b815181811115613e5057613e50614238565b8060051b604051601f19603f83011681018181108582111715613e7557613e75614238565b604052828152858101935084860182860187018a1015613e9457600080fd5b600095505b83861015613eb7578051855260019590950194938601938601613e99565b5098975050505050505050565b600060208284031215613ed657600080fd5b815180151581146122d657600080fd5b600060208284031215613ef857600080fd5b5051919050565b60008060408385031215613f1257600080fd5b505080516020909101519092909150565b600080600060608486031215613f3857600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b83811015613f8a5781516001600160a01b031687529582019590820190600101613f65565b509495945050505050565b60008251613fa78184602087016141e0565b9190910192915050565b6001600160a01b039788168152958716602087015260408601949094526060850192909252608084015290921660a082015260c081019190915260e00190565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b84815260806020820152600061408e6080830186613f51565b6001600160a01b03949094166040830152506060015292915050565b60208152600082518060208401526140c98160408501602087016141e0565b601f01601f19169190910160400192915050565b6020808252600e908201526d34b73b30b634b2103937baba32b960911b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8281526040602082015260006124856040830184613f51565b85815284602082015260a06040820152600061417260a0830186613f51565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156141a2576141a261420c565b500190565b6000826141c457634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156141db576141db61420c565b500390565b60005b838110156141fb5781810151838201526020016141e3565b838111156106c65750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461085857600080fdfea26469706673582212200c8c505330f2b3115287de2bba91f896bf8d89c8a9ed6abeb5d44b4a799b8b7764736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
-----Decoded View---------------
Arg [0] : _WNATIVE (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode Sourcemap
37738:20227:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57852:110;;;;;;;;;;-1:-1:-1;57852:110:0;;;;;:::i;:::-;;:::i;:::-;;37924:26;;;;;;;;;;-1:-1:-1;37924:26:0;;;;-1:-1:-1;;;;;37924:26:0;;;;;;-1:-1:-1;;;;;6069:32:1;;;6051:51;;6039:2;6024:18;37924:26:0;;;;;;;;43983:1031;;;;;;;;;;-1:-1:-1;43983:1031:0;;;;;:::i;:::-;;:::i;41169:393::-;;;;;;:::i;:::-;;:::i;57449:275::-;;;;;;;;;;-1:-1:-1;57449:275:0;;;;;:::i;:::-;;:::i;57152:171::-;;;;;;;;;;-1:-1:-1;57152:171:0;;;;;:::i;:::-;;:::i;42234:1741::-;;;;;;;;;;-1:-1:-1;42234:1741:0;;;;;:::i;:::-;;:::i;57331:110::-;;;;;;;;;;-1:-1:-1;57331:110:0;;;;;:::i;:::-;;:::i;36240:148::-;;;;;;;;;;;;;:::i;41570:656::-;;;;;;;;;;-1:-1:-1;41570:656:0;;;;;:::i;:::-;;:::i;57732:112::-;;;;;;;;;;-1:-1:-1;57732:112:0;;;;;:::i;:::-;;:::i;45366:335::-;;;;;;;;;;-1:-1:-1;45366:335:0;;;;;:::i;:::-;;:::i;35589:87::-;;;;;;;;;;-1:-1:-1;35635:7:0;35662:6;-1:-1:-1;;;;;35662:6:0;35589:87;;39341:1820;;;;;;;;;;-1:-1:-1;39341:1820:0;;;;;:::i;:::-;;:::i;:::-;;;;14458:25:1;;;14514:2;14499:18;;14492:34;;;;14431:18;39341:1820:0;14284:248:1;38098:48:0;;;;;;;;;;-1:-1:-1;38098:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9316:14:1;;9309:22;9291:41;;9279:2;9264:18;38098:48:0;9151:187:1;45022:336:0;;;;;;;;;;-1:-1:-1;45022:336:0;;;;;:::i;:::-;;:::i;38042:47::-;;;;;;;;;;-1:-1:-1;38042:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;38463:870;;;;;;;;;;-1:-1:-1;38463:870:0;;;;;:::i;:::-;;:::i;36543:244::-;;;;;;;;;;-1:-1:-1;36543:244:0;;;;;:::i;:::-;;:::i;57852:110::-;35635:7;35662:6;-1:-1:-1;;;;;35662:6:0;34260:10;35809:23;35801:68;;;;-1:-1:-1;;;35801:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;57925:22:0::1;;::::0;;;:15:::1;:22;::::0;;;;:29;;-1:-1:-1;;57925:29:0::1;57950:4;57925:29;::::0;;57852:110::o;43983:1031::-;38314:11;;44096:10;;-1:-1:-1;;;;;38299:26:0;;;38314:11;;38299:26;38291:53;;;;-1:-1:-1;;;38291:53:0;;;;;;;:::i;:::-;44203:65:::1;-1:-1:-1::0;;;;;44203:30:0;::::1;44234:10;44254:4;44261:6:::0;44203:30:::1;:65::i;:::-;44279:40;44301:5;44308:10;44279:21;:40::i;:::-;44332:14;44364:5;-1:-1:-1::0;;;;;44349:28:0::1;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44332:47;;44390:14;44422:5;-1:-1:-1::0;;;;;44407:28:0::1;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44390:47;;44448:41;44470:6;44478:10;44448:21;:41::i;:::-;44500;44522:6;44530:10;44500:21;:41::i;:::-;44552:9;44572::::0;44626:10:::1;-1:-1:-1::0;;;;;44607:46:0::1;;44654:6;44662;44670;44678:1;44681::::0;44692:4:::1;44699:15;44607:108;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44592:123:::0;;-1:-1:-1;44592:123:0;-1:-1:-1;;;;;;44730:13:0;;::::1;::::0;;::::1;;44726:104;;44767:51;44773:6;44781:4;44787:3;44800:4;44807:10;44767:5;:51::i;:::-;44760:58;;44726:104;44854:3;-1:-1:-1::0;;;;;44844:13:0::1;:6;-1:-1:-1::0;;;;;44844:13:0::1;;44840:104;;44881:51;44887:6;44895:4;44901:3;44914:4;44921:10;44881:5;:51::i;:::-;44874:58;;44840:104;44954:52;44979:10:::0;44991:14:::1;:4:::0;45000;44991:8:::1;:14::i;:::-;-1:-1:-1::0;;;;;44954:24:0;::::1;::::0;:52;:24:::1;:52::i;:::-;44126:888;;;;43983:1031:::0;;;;;;:::o;41169:393::-;38314:11;;41248:10;;-1:-1:-1;;;;;38299:26:0;;;38314:11;;38299:26;38291:53;;;;-1:-1:-1;;;38291:53:0;;;;;;;:::i;:::-;41365:55:::1;41381:3;41386:9;41397:10;41409;41365:15;:55::i;:::-;-1:-1:-1::0;41435:21:0::1;:26:::0;41431:124:::1;;41478:65;41509:10;41521:21;41478:30;:65::i;:::-;41169:393:::0;;;;:::o;57449:275::-;35635:7;35662:6;-1:-1:-1;;;;;35662:6:0;34260:10;35809:23;35801:68;;;;-1:-1:-1;;;35801:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57516:19:0;::::1;57512:121;;35635:7:::0;35662:6;;57552:48:::1;::::0;-1:-1:-1;;;;;35662:6:0;;;;57578:21:::1;57552:48:::0;::::1;;;::::0;57578:21;;57552:48;35635:7;57552:48;57578:21;35662:6;57552:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;57449:275:::0;:::o;57512:121::-:1;57652:5;-1:-1:-1::0;;;;;57645:22:0::1;;57668:7;35635::::0;35662:6;-1:-1:-1;;;;;35662:6:0;;35589:87;57668:7:::1;57677:38;::::0;-1:-1:-1;;;57677:38:0;;57709:4:::1;57677:38;::::0;::::1;6051:51:1::0;-1:-1:-1;;;;;57677:23:0;::::1;::::0;::::1;::::0;6024:18:1;;57677:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57645:71;::::0;-1:-1:-1;;;;;;57645:71:0::1;::::0;;;;;;-1:-1:-1;;;;;8452:32:1;;;57645:71:0::1;::::0;::::1;8434:51:1::0;8501:18;;;8494:34;8407:18;;57645:71:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35880:1::-;57449:275:::0;:::o;57152:171::-;35635:7;35662:6;-1:-1:-1;;;;;35662:6:0;34260:10;35809:23;35801:68;;;;-1:-1:-1;;;35801:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57266:27:0;;::::1;;::::0;;;:20:::1;:27;::::0;;;;;;;:35;;::::1;::::0;;;;;;;;;:49;;-1:-1:-1;;;;;;57266:49:0::1;::::0;;;::::1;;::::0;;57152:171::o;42234:1741::-;38314:11;;42329:10;;-1:-1:-1;;;;;38299:26:0;;;38314:11;;38299:26;38291:53;;;;-1:-1:-1;;;38291:53:0;;;;;;;:::i;:::-;42464:65:::1;-1:-1:-1::0;;;;;42464:30:0;::::1;42495:10;42515:4;42522:6:::0;42464:30:::1;:65::i;:::-;42540:40;42562:5;42569:10;42540:21;:40::i;:::-;42622:14;42654:5;-1:-1:-1::0;;;;;42639:28:0::1;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42622:47;;42680:14;42712:5;-1:-1:-1::0;;;;;42697:28:0::1;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42680:47;;42738:41;42760:6;42768:10;42738:21;:41::i;:::-;42790;42812:6;42820:10;42790:21;:41::i;:::-;42908:7;::::0;-1:-1:-1;;;;;42898:17:0;;::::1;42908:7:::0;::::1;42898:17;::::0;:38:::1;;-1:-1:-1::0;42929:7:0::1;::::0;-1:-1:-1;;;;;42919:17:0;;::::1;42929:7:::0;::::1;42919:17;42898:38;42894:1074;;;43058:7;::::0;43032:13:::1;::::0;-1:-1:-1;;;;;43048:17:0;;::::1;43058:7:::0;::::1;43048:17;;:35;;43077:6;43048:35;;;43068:6;43048:35;43032:51;;43098:13;43126:11:::0;43192:10:::1;-1:-1:-1::0;;;;;43173:49:0::1;;43223:5;43230:6;43238:1;43241::::0;43252:4:::1;43259:15;43173:102;;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43152:123:::0;;-1:-1:-1;43152:123:0;-1:-1:-1;43372:60:0::1;43392:5:::0;43152:123;43409:10;43421;43372:19:::1;:60::i;:::-;;43489:50;43520:10;43532:6;43489:30;:50::i;:::-;42938:613;;;42894:1074;;;43641:9;43665::::0;43723:10:::1;-1:-1:-1::0;;;;;43704:46:0::1;;43751:6;43759;43767;43775:1;43778::::0;43789:4:::1;43796:15;43704:108;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43689:123:::0;;-1:-1:-1;43689:123:0;-1:-1:-1;43827:57:0::1;43847:6:::0;43689:123;43861:10;43873;43827:19:::1;:57::i;:::-;;43899;43919:6;43927:4;43933:10;43945;43899:19;:57::i;42894:1074::-;42359:1616;;42234:1741:::0;;;;;:::o;57331:110::-;35635:7;35662:6;-1:-1:-1;;;;;35662:6:0;34260:10;35809:23;35801:68;;;;-1:-1:-1;;;35801:68:0;;;;;;;:::i;:::-;57407:11:::1;:26:::0;;-1:-1:-1;;;;;;57407:26:0::1;-1:-1:-1::0;;;;;57407:26:0;;;::::1;::::0;;;::::1;::::0;;57331:110::o;36240:148::-;35635:7;35662:6;-1:-1:-1;;;;;35662:6:0;34260:10;35809:23;35801:68;;;;-1:-1:-1;;;35801:68:0;;;;;;;:::i;:::-;36347:1:::1;36331:6:::0;;36310:40:::1;::::0;-1:-1:-1;;;;;36331:6:0;;::::1;::::0;36310:40:::1;::::0;36347:1;;36310:40:::1;36378:1;36361:19:::0;;-1:-1:-1;;;;;;36361:19:0::1;::::0;;36240:148::o;41570:656::-;38314:11;;41667:9;;-1:-1:-1;;;;;38299:26:0;;;38314:11;;38299:26;38291:53;;;;-1:-1:-1;;;38291:53:0;;;;;;;:::i;:::-;41707:65:::1;-1:-1:-1::0;;;;;41707:30:0;::::1;41738:10;41758:4;41765:6:::0;41707:30:::1;:65::i;:::-;41785:19;41822:5;41785:43;;41839:47;41861:4;-1:-1:-1::0;;;;;41861:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41876:9;41839:21;:47::i;:::-;41897;41919:4;-1:-1:-1::0;;;;;41919:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;41897:47;41957:41;-1:-1:-1::0;;;;;41957:26:0;::::1;41984:5:::0;41991:6;41957:26:::1;:41::i;:::-;42064:24;::::0;-1:-1:-1;;;42064:24:0;;42082:4:::1;42064:24;::::0;::::1;6051:51:1::0;42009:9:0::1;::::0;;;-1:-1:-1;;;;;42064:9:0;::::1;::::0;::::1;::::0;6024:18:1;;42064:24:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42049:39;;;;;;;;42118:9;-1:-1:-1::0;;;;;42099:42:0::1;;42142:4;-1:-1:-1::0;;;;;42142:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42157:4;-1:-1:-1::0;;;;;42157:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42172:4;42178;42184:1;42187::::0;42190:10:::1;42202:15;42099:119;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;41696:530;;;41570:656:::0;;;;;:::o;57732:112::-;35635:7;35662:6;-1:-1:-1;;;;;35662:6:0;34260:10;35809:23;35801:68;;;;-1:-1:-1;;;35801:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57806:23:0::1;;::::0;;;:15:::1;:23;::::0;;;;:30;;-1:-1:-1;;57806:30:0::1;57832:4;57806:30;::::0;;57732:112::o;45366:335::-;38314:11;;45467:10;;-1:-1:-1;;;;;38299:26:0;;;38314:11;;38299:26;38291:53;;;;-1:-1:-1;;;38291:53:0;;;;;;;:::i;:::-;45508:65:::1;-1:-1:-1::0;;;;;45508:30:0;::::1;45539:10;45559:4;45566:6:::0;45508:30:::1;:65::i;:::-;45584:40;45606:5;45613:10;45584:21;:40::i;:::-;45635:58;45655:5;45662:6;45670:10;45682;45635:19;:58::i;:::-;;45366:335:::0;;;;;:::o;39341:1820::-;38314:11;;39475:7;;;;39436;;-1:-1:-1;;;;;38299:26:0;;;38314:11;;38299:26;38291:53;;;;-1:-1:-1;;;38291:53:0;;;;;;;:::i;:::-;39569:3:::1;-1:-1:-1::0;;;;;39554:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39545:37:0::1;:5;-1:-1:-1::0;;;;;39545:37:0::1;;:78;;;;39610:3;-1:-1:-1::0;;;;;39595:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39586:37:0::1;:5;-1:-1:-1::0;;;;;39586:37:0::1;;39545:78;39541:1613;;;39831:13;39871:3;-1:-1:-1::0;;;;;39856:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39847:37:0::1;:5;-1:-1:-1::0;;;;;39847:37:0::1;;:99;;39933:3;-1:-1:-1::0;;;;;39918:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39847:99;;;39902:3;-1:-1:-1::0;;;;;39887:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39831:115:::0;-1:-1:-1;40011:15:0::1;40029:11;:4:::0;40038:1:::1;40029:8;:11::i;:::-;40011:29;;40084:16;40103:48;40117:5;40124:10;40136:5;40143:7;40103:13;:48::i;:::-;40084:67;;40194:3;-1:-1:-1::0;;;;;40179:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40170:37:0::1;:5;-1:-1:-1::0;;;;;40170:37:0::1;;40166:183;;;40236:10:::0;;-1:-1:-1;40248:11:0;-1:-1:-1;40228:32:0::1;::::0;-1:-1:-1;40228:32:0::1;40166:183;40309:11:::0;-1:-1:-1;40322:10:0;-1:-1:-1;40301:32:0::1;::::0;-1:-1:-1;40301:32:0::1;39541:1613;40472:7;::::0;40443:17:::1;::::0;-1:-1:-1;;;;;40463:16:0;;::::1;40472:7:::0;::::1;40463:16;:70;;40516:7;::::0;40489:44:::1;::::0;40503:5;;40510:4;;-1:-1:-1;;;;;40516:7:0::1;40525::::0;40489:13:::1;:44::i;:::-;40463:70;;;40482:4;40463:70;40443:90;;40578:3;-1:-1:-1::0;;;;;40563:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40552:7;::::0;-1:-1:-1;;;;;40552:7:0;;::::1;:39:::0;::::1;;40548:193;;;40620:19;:12:::0;40637:1:::1;40620:16;:19::i;:::-;40655:7;::::0;40641:83:::1;::::0;-1:-1:-1;;;;;40655:7:0::1;40664:19;:12:::0;40681:1:::1;40664:16;:19::i;:::-;40700:3;-1:-1:-1::0;;;;;40685:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40715:7;40641:13;:83::i;:::-;40612:113;;;;;;;40548:193;40785:3;-1:-1:-1::0;;;;;40770:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40759:7;::::0;-1:-1:-1;;;;;40759:7:0;;::::1;:39:::0;::::1;;40755:193;;;40841:7;::::0;40827:83:::1;::::0;-1:-1:-1;;;;;40841:7:0::1;40850:19;:12:::0;40867:1:::1;40850:16;:19::i;:::-;40886:3;-1:-1:-1::0;;;;;40871:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40901:7;40827:13;:83::i;:::-;40912:19;:12:::0;40929:1:::1;40912:16;:19::i;40755:193::-;40988:7;::::0;40974:83:::1;::::0;-1:-1:-1;;;;;40988:7:0::1;40997:19;:12:::0;41014:1:::1;40997:16;:19::i;39541:1613::-;39341:1820:::0;;;;;;;;:::o;45022:336::-;38314:11;;45133:10;;-1:-1:-1;;;;;38299:26:0;;;38314:11;;38299:26;38291:53;;;;-1:-1:-1;;;38291:53:0;;;;;;;:::i;:::-;45174:65:::1;-1:-1:-1::0;;;;;45174:30:0;::::1;45205:10;45225:4;45232:6:::0;45174:30:::1;:65::i;:::-;45250:40;45272:5;45279:10;45250:21;:40::i;:::-;45301:49;45307:5;45314:6;45322:3;45327:10;45339;45301:5;:49::i;38463:870::-:0;38314:11;;38575:10;;-1:-1:-1;;;;;38299:26:0;;;38314:11;;38299:26;38291:53;;;;-1:-1:-1;;;38291:53:0;;;;;;;:::i;:::-;38616:40:::1;38638:5;38645:10;38616:21;:40::i;:::-;-1:-1:-1::0;;;;;38673:22:0;::::1;;::::0;;;:15:::1;:22;::::0;;;;;::::1;;38669:657;;;38712:61;::::0;-1:-1:-1;;;38712:61:0;;38739:10:::1;38712:61;::::0;::::1;6662:34:1::0;38759:4:0::1;6712:18:1::0;;;6705:43;6764:18;;;6757:34;;;-1:-1:-1;;;;;38712:26:0;::::1;::::0;::::1;::::0;6597:18:1;;38712:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;38810:38:0::1;::::0;-1:-1:-1;;;38810:38:0;;38842:4:::1;38810:38;::::0;::::1;6051:51:1::0;38788:90:0::1;::::0;38803:5;;-1:-1:-1;;;;;38810:23:0;::::1;::::0;::::1;::::0;6024:18:1;;38810:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38850:3;38855:10;38867;38788:14;:90::i;:::-;;38893:7;;38669:657;39042:65;-1:-1:-1::0;;;;;39042:30:0;::::1;39073:10;39093:4;39100:6:::0;39042:30:::1;:65::i;:::-;39180:40;39202:5;39209:10;39180:21;:40::i;:::-;39235:58;39250:5;39257:6;39265:3;39270:10;39282;39235:14;:58::i;36543:244::-:0;35635:7;35662:6;-1:-1:-1;;;;;35662:6:0;34260:10;35809:23;35801:68;;;;-1:-1:-1;;;35801:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36632:22:0;::::1;36624:73;;;::::0;-1:-1:-1;;;36624:73:0;;10448:2:1;36624:73:0::1;::::0;::::1;10430:21:1::0;10487:2;10467:18;;;10460:30;10526:34;10506:18;;;10499:62;-1:-1:-1;;;10577:18:1;;;10570:36;10623:19;;36624:73:0::1;10246:402:1::0;36624:73:0::1;36734:6;::::0;;36713:38:::1;::::0;-1:-1:-1;;;;;36713:38:0;;::::1;::::0;36734:6;::::1;::::0;36713:38:::1;::::0;::::1;36762:6;:17:::0;;-1:-1:-1;;;;;;36762:17:0::1;-1:-1:-1::0;;;;;36762:17:0;;;::::1;::::0;;;::::1;::::0;;36543:244::o;30573:205::-;30701:68;;-1:-1:-1;;;;;6680:15:1;;;30701:68:0;;;6662:34:1;6732:15;;6712:18;;;6705:43;6764:18;;;6757:34;;;30674:96:0;;30694:5;;-1:-1:-1;;;30724:27:0;6597:18:1;;30701:68:0;;;;-1:-1:-1;;30701:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;30701:68:0;-1:-1:-1;;;;;;30701:68:0;;;;;;;;;;30674:19;:96::i;45764:221::-;45849:46;;-1:-1:-1;;;45849:46:0;;45881:4;45849:46;;;6325:34:1;-1:-1:-1;;;;;6395:15:1;;;6375:18;;;6368:43;45849:23:0;;;;;6260:18:1;;45849:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45845:133;;45917:49;-1:-1:-1;;;;;45917:25:0;;45943:6;-1:-1:-1;;45917:25:0;:49::i;51534:2969::-;-1:-1:-1;;;;;51755:27:0;;;51646:4;51755:27;;;:20;:27;;;;;;;;:39;;;;;;;;;;;;;51824:25;;;;;;;;;;;:37;;;;;;;;;51646:4;;51710:10;;51755:39;;;;51824:37;51874:21;51912:24;;;;;:50;;-1:-1:-1;;;;;;51940:22:0;;;;51912:50;51908:2158;;;52017:8;-1:-1:-1;;;;;52003:22:0;:10;-1:-1:-1;;;;;52003:22:0;;51999:433;;52053:16;;;52067:1;52053:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52053:16:0;52046:23;;52098:5;52088:4;52093:1;52088:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;52088:15:0;;;-1:-1:-1;;;;;52088:15:0;;;;;52132:10;52122:4;52127:1;52122:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52122:20:0;;;:7;;;;;;;;;:20;52171:7;;52161;;52171;;;52161:4;;52166:1;;52161:7;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;52161:17:0;;;-1:-1:-1;;;;;52161:17:0;;;;;52207:8;52197:4;52202:1;52197:7;;;;;;;;:::i;:::-;;;;;;:18;-1:-1:-1;;;;;52197:18:0;;;-1:-1:-1;;;;;52197:18:0;;;;;52244:3;52234:4;52239:1;52234:7;;;;;;;;:::i;:::-;;;;;;:13;-1:-1:-1;;;;;52234:13:0;;;-1:-1:-1;;;;;52234:13:0;;;;;51908:2158;;51999:433;52295:16;;;52309:1;52295:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52295:16:0;52288:23;;52340:5;52330:4;52335:1;52330:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;52330:15:0;;;-1:-1:-1;;;;;52330:15:0;;;;;52374:10;52364:4;52369:1;52364:7;;;;;;;;:::i;:::-;;;;;;:20;-1:-1:-1;;;;;52364:20:0;;;-1:-1:-1;;;;;52364:20:0;;;;;52413:3;52403:4;52408:1;52403:7;;;;;;;;:::i;51908:2158::-;-1:-1:-1;;;;;52453:24:0;;;52449:1617;;52531:3;-1:-1:-1;;;;;52517:17:0;:10;-1:-1:-1;;;;;52517:17:0;;52513:558;;;52576:1;52562:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52562:16:0;;52555:23;;52607:5;52597:4;52602:1;52597:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;52597:15:0;;;-1:-1:-1;;;;;52597:15:0;;;;;52641:3;52631:4;52636:1;52631:7;;;;;;;;:::i;52513:558::-;52690:7;;-1:-1:-1;;;;;52683:14:0;;;52690:7;;52683:14;52679:392;;;52725:16;;;52739:1;52725:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52725:16:0;52718:23;;52770:5;52760:4;52765:1;52760:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;52760:15:0;;;-1:-1:-1;;;;;52760:15:0;;;;;52804:10;52794:4;52799:1;52794:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52794:20:0;;;:7;;;;;;;;;:20;52843:7;;52833;;52843;;;52833:4;;52838:1;;52833:7;;;;;;:::i;52679:392::-;52898:16;;;52912:1;52898:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52898:16:0;52891:23;;52943:5;52933:4;52938:1;52933:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;52933:15:0;;;-1:-1:-1;;;;;52933:15:0;;;;;52977:10;52967:4;52972:1;52967:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52967:20:0;;;:7;;;;;;;;;:20;53016:7;;53006;;53016;;;53006:4;;53011:1;;53006:7;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;53006:17:0;;;-1:-1:-1;;;;;53006:17:0;;;;;53052:3;53042:4;53047:1;53042:7;;;;;;;;:::i;52449:1617::-;-1:-1:-1;;;;;53092:22:0;;;53088:978;;53179:8;-1:-1:-1;;;;;53170:17:0;:5;-1:-1:-1;;;;;53170:17:0;;53166:554;;;53229:1;53215:16;;53166:554;53332:7;;-1:-1:-1;;;;;53323:16:0;;;53332:7;;53323:16;53319:401;;;53367:16;;;53381:1;53367:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;53412:7:0;;53402;;;;-1:-1:-1;;;;;;53412:7:0;;53402;;-1:-1:-1;53412:7:0;;53402;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;53402:17:0;;;-1:-1:-1;;;;;53402:17:0;;;;;53448:8;53438:4;53443:1;53438:7;;;;;;;;:::i;53319:401::-;53549:16;;;53563:1;53549:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53549:16:0;53542:23;;53594:5;53584:4;53589:1;53584:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53584:15:0;;;:7;;;;;;;;;:15;53628:7;;;53618;;53628;;;53618:4;;53628:7;53618;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;53618:17:0;;;-1:-1:-1;;;;;53618:17:0;;;;;53664:8;53654:4;53659:1;53654:7;;;;;;;;:::i;53088:978::-;53750:7;;-1:-1:-1;;;;;53741:16:0;;;53750:7;;53741:16;;:34;;-1:-1:-1;53768:7:0;;-1:-1:-1;;;;;53761:14:0;;;53768:7;;53761:14;53741:34;53737:329;;;53813:1;53799:16;;53737:329;53948:16;;;53962:1;53948:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53948:16:0;53941:23;;53989:5;53979:4;53984:1;53979:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53979:15:0;;;:7;;;;;;;;;:15;54019:7;;;54009;;54019;;;54009:4;;54019:7;54009;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;54009:17:0;;;-1:-1:-1;;;;;54009:17:0;;;;;54051:3;54041:4;54046:1;54041:7;;;;;;;;:::i;:::-;;;;;;:13;-1:-1:-1;;;;;54041:13:0;;;-1:-1:-1;;;;;54041:13:0;;;;;53737:329;-1:-1:-1;;;;;54116:22:0;;;;;;:15;:22;;;;;;54078:21;;54116:22;;54112:337;;;54155:105;;-1:-1:-1;;;54155:105:0;;-1:-1:-1;;;;;54155:60:0;;;;;:105;;54216:6;;54224:1;;54227:4;;54233:9;;54244:15;;54155:105;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54282:36:0;;-1:-1:-1;;;54282:36:0;;54312:4;54282:36;;;6051:51:1;-1:-1:-1;;;;;54282:21:0;;;-1:-1:-1;54282:21:0;;-1:-1:-1;6024:18:1;;54282:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54275:43;;;;;;;;;54112:337;54361:76;;-1:-1:-1;;;54361:76:0;;-1:-1:-1;;;;;54361:31:0;;;;;:76;;54393:6;;54401:1;;54404:4;;54410:9;;54421:15;;54361:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54361:76:0;;;;;;;;;;;;:::i;:::-;54351:86;;54468:7;54493:1;54476:7;:14;:18;;;;:::i;:::-;54468:27;;;;;;;;:::i;:::-;;;;;;;54461:34;;;;;;;51534:2969;;;;;;;;:::o;23992:98::-;24050:7;24077:5;24081:1;24077;:5;:::i;:::-;24070:12;23992:98;-1:-1:-1;;;23992:98:0:o;30388:177::-;30498:58;;-1:-1:-1;;;;;8452:32:1;;30498:58:0;;;8434:51:1;8501:18;;;8494:34;;;30471:86:0;;30491:5;;-1:-1:-1;;;30521:23:0;8407:18:1;;30498:58:0;8260:274:1;30471:86:0;30388:177;;;:::o;47357:741::-;47467:4;47507:19;47544:3;47507:41;;47563:14;47580:4;-1:-1:-1;;;;;47580:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47563:30;;47608:14;47625:4;-1:-1:-1;;;;;47625:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47696:7;;47608:30;;-1:-1:-1;47653:14:0;;-1:-1:-1;;;;;47686:17:0;;;47696:7;;47686:17;;:38;;-1:-1:-1;47717:7:0;;-1:-1:-1;;;;;47707:17:0;;;47717:7;;47707:17;47686:38;47682:378;;;47771:7;;47745:13;;-1:-1:-1;;;;;47761:17:0;;;47771:7;;47761:17;:35;;47790:6;47761:35;;;47781:6;47761:35;47745:51;;47834:66;47860:5;47867:6;47875:13;47890:9;47834:25;:66::i;:::-;47815:85;-1:-1:-1;47682:378:0;;-1:-1:-1;;;47682:378:0;;47960:84;47995:6;48003;48011;48019:13;48034:9;47960:34;:84::i;:::-;47941:103;-1:-1:-1;;;47682:378:0;48081:9;-1:-1:-1;;;;47357:741:0;;;;;;;:::o;29596:195::-;29704:12;;;29666;29704;;;;;;;;;-1:-1:-1;;;;;29683:7:0;;;29697:5;;29683:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29665:52;;;29736:7;29728:55;;;;-1:-1:-1;;;29728:55:0;;12324:2:1;29728:55:0;;;12306:21:1;12363:2;12343:18;;;12336:30;12402:34;12382:18;;;12375:62;-1:-1:-1;;;12453:18:1;;;12446:33;12496:19;;29728:55:0;12122:399:1;50513:1013:0;-1:-1:-1;;;;;50750:27:0;;;50626:4;50750:27;;;:20;:27;;;;;;;;:39;;;;;;;;;;;50626:4;;50643:21;;50722:10;;50750:39;:53;50746:365;;50827:16;;;50841:1;50827:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50827:16:0;50820:23;;50868:5;50858:4;50863:1;50858:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50858:15:0;;;:7;;;;;;;;;;:15;;;;50898:27;;;;;;;:20;:27;;;;;;:39;;;;;;;;;;50888:7;;50898:39;;;50888:4;;50898:39;;50888:7;;;;;;:::i;:::-;;;;;;:49;-1:-1:-1;;;;;50888:49:0;;;-1:-1:-1;;;;;50888:49:0;;;;;50962:6;-1:-1:-1;;;;;50962:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50952:4;50957:1;50952:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;50952:23:0;;;-1:-1:-1;;;;;50952:23:0;;;;;50746:365;;;51015:16;;;51029:1;51015:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51015:16:0;51008:23;;51056:5;51046:4;51051:1;51046:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;51046:15:0;;;-1:-1:-1;;;;;51046:15:0;;;;;51086:6;-1:-1:-1;;;;;51086:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51076:4;51081:1;51076:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;51076:23:0;;;-1:-1:-1;;;;;51076:23:0;;;;;50746:365;-1:-1:-1;;;;;51127:22:0;;;;;;:15;:22;;;;;;;;51123:396;;;51166:102;;-1:-1:-1;;;51166:102:0;;-1:-1:-1;;;;;51166:57:0;;;;;:102;;51224:6;;51232:1;;51235:4;;51241:9;;51252:15;;51166:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51290:38:0;;-1:-1:-1;;;51290:38:0;;51322:4;51290:38;;;6051:51:1;-1:-1:-1;;;;;51290:23:0;;;-1:-1:-1;51290:23:0;;-1:-1:-1;6024:18:1;;51290:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51283:45;;;;;;51123:396;51385:73;;-1:-1:-1;;;51385:73:0;;51361:21;;-1:-1:-1;;;;;51385:28:0;;;;;:73;;51414:6;;51361:21;;51425:4;;51431:9;;51442:15;;51385:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51385:73:0;;;;;;;;;;;;:::i;:::-;51361:97;;51480:7;51505:1;51488:7;:14;:18;;;;:::i;:::-;51480:27;;;;;;;;:::i;:::-;;;;;;;51473:34;;;;;;;25129:98;25187:7;25214:5;25218:1;25214;:5;:::i;54511:2575::-;-1:-1:-1;;;;;54726:27:0;;;54617:4;54726:27;;;:20;:27;;;;;;;;:39;;;;;;;;;;;;;54795:25;;;;;;;;;;;:37;;;;;;;;;54617:4;;54681:10;;54726:39;;;;54795:37;54845:21;54883:24;;;;;:50;;-1:-1:-1;;;;;;54911:22:0;;;;54883:50;54879:2084;;;54968:8;-1:-1:-1;;;;;54954:22:0;:10;-1:-1:-1;;;;;54954:22:0;;54950:433;;55004:16;;;55018:1;55004:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55004:16:0;54997:23;;55049:5;55039:4;55044:1;55039:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;55039:15:0;;;-1:-1:-1;;;;;55039:15:0;;;;;55083:10;55073:4;55078:1;55073:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55073:20:0;;;:7;;;;;;;;;:20;55122:7;;55112;;55122;;;55112:4;;55117:1;;55112:7;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;55112:17:0;;;-1:-1:-1;;;;;55112:17:0;;;;;55158:8;55148:4;55153:1;55148:7;;;;;;;;:::i;:::-;;;;;;:18;-1:-1:-1;;;;;55148:18:0;;;-1:-1:-1;;;;;55148:18:0;;;;;55195:3;55185:4;55190:1;55185:7;;;;;;;;:::i;:::-;;;;;;:13;-1:-1:-1;;;;;55185:13:0;;;-1:-1:-1;;;;;55185:13:0;;;;;54879:2084;;54950:433;55246:16;;;55260:1;55246:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55246:16:0;55239:23;;55291:5;55281:4;55286:1;55281:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;55281:15:0;;;-1:-1:-1;;;;;55281:15:0;;;;;55325:10;55315:4;55320:1;55315:7;;;;;;;;:::i;:::-;;;;;;:20;-1:-1:-1;;;;;55315:20:0;;;-1:-1:-1;;;;;55315:20:0;;;;;55364:3;55354:4;55359:1;55354:7;;;;;;;;:::i;54879:2084::-;-1:-1:-1;;;;;55404:24:0;;;55400:1563;;55463:3;-1:-1:-1;;;;;55449:17:0;:10;-1:-1:-1;;;;;55449:17:0;;55445:558;;;55508:1;55494:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55494:16:0;;55487:23;;55539:5;55529:4;55534:1;55529:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;55529:15:0;;;-1:-1:-1;;;;;55529:15:0;;;;;55573:3;55563:4;55568:1;55563:7;;;;;;;;:::i;55445:558::-;55622:7;;-1:-1:-1;;;;;55615:14:0;;;55622:7;;55615:14;55611:392;;;55657:16;;;55671:1;55657:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55657:16:0;55650:23;;55702:5;55692:4;55697:1;55692:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;55692:15:0;;;-1:-1:-1;;;;;55692:15:0;;;;;55736:10;55726:4;55731:1;55726:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55726:20:0;;;:7;;;;;;;;;:20;55775:7;;55765;;55775;;;55765:4;;55770:1;;55765:7;;;;;;:::i;55611:392::-;55830:16;;;55844:1;55830:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55830:16:0;55823:23;;55875:5;55865:4;55870:1;55865:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;55865:15:0;;;-1:-1:-1;;;;;55865:15:0;;;;;55909:10;55899:4;55904:1;55899:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55899:20:0;;;:7;;;;;;;;;:20;55948:7;;55938;;55948;;;55938:4;;55943:1;;55938:7;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;55938:17:0;;;-1:-1:-1;;;;;55938:17:0;;;;;55984:3;55974:4;55979:1;55974:7;;;;;;;;:::i;55400:1563::-;-1:-1:-1;;;;;56024:22:0;;;56020:943;;56076:8;-1:-1:-1;;;;;56067:17:0;:5;-1:-1:-1;;;;;56067:17:0;;56063:554;;;56126:1;56112:16;;56063:554;56229:7;;-1:-1:-1;;;;;56220:16:0;;;56229:7;;56220:16;56216:401;;;56264:16;;;56278:1;56264:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;56309:7:0;;56299;;;;-1:-1:-1;;;;;;56309:7:0;;56299;;-1:-1:-1;56309:7:0;;56299;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;56299:17:0;;;-1:-1:-1;;;;;56299:17:0;;;;;56345:8;56335:4;56340:1;56335:7;;;;;;;;:::i;56216:401::-;56446:16;;;56460:1;56446:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56446:16:0;56439:23;;56491:5;56481:4;56486:1;56481:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56481:15:0;;;:7;;;;;;;;;:15;56525:7;;;56515;;56525;;;56515:4;;56525:7;56515;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;56515:17:0;;;-1:-1:-1;;;;;56515:17:0;;;;;56561:8;56551:4;56556:1;56551:7;;;;;;;;:::i;56020:943::-;56647:7;;-1:-1:-1;;;;;56638:16:0;;;56647:7;;56638:16;;:34;;-1:-1:-1;56665:7:0;;-1:-1:-1;;;;;56658:14:0;;;56665:7;;56658:14;56638:34;56634:329;;;56710:1;56696:16;;56634:329;56845:16;;;56859:1;56845:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56845:16:0;56838:23;;56886:5;56876:4;56881:1;56876:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56876:15:0;;;:7;;;;;;;;;:15;56916:7;;;56906;;56916;;;56906:4;;56916:7;56906;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;56906:17:0;;;-1:-1:-1;;;;;56906:17:0;;;;;56948:3;56938:4;56943:1;56938:7;;;;;;;;:::i;:::-;;;;;;:13;-1:-1:-1;;;;;56938:13:0;;;-1:-1:-1;;;;;56938:13:0;;;;;56634:329;56999:34;;-1:-1:-1;;;56999:34:0;;56975:21;;-1:-1:-1;;;;;56999:20:0;;;;;:34;;57020:6;;57028:4;;56999:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56999:34:0;;;;;;;;;;;;:::i;:::-;56975:58;;57051:7;57076:1;57059:7;:14;:18;;;;:::i;:::-;57051:27;;;;;;;;:::i;:::-;;;;;;;57044:34;;;;;;;54511:2575;;;;;;:::o;45993:1356::-;46114:4;46204:3;-1:-1:-1;;;;;46189:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46180:37:0;:5;-1:-1:-1;;;;;46180:37:0;;:78;;;;46245:3;-1:-1:-1;;;;;46230:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46221:37:0;:5;-1:-1:-1;;;;;46221:37:0;;46180:78;46176:1166;;;46466:13;46506:3;-1:-1:-1;;;;;46491:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46482:37:0;:5;-1:-1:-1;;;;;46482:37:0;;:99;;46568:3;-1:-1:-1;;;;;46553:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46482:99;;;46537:3;-1:-1:-1;;;;;46522:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46466:115;;46596:40;46618:5;46625:10;46596:21;:40::i;:::-;46701:15;46719:13;:6;46730:1;46719:10;:13::i;:::-;46701:31;;46776:16;46795:58;46801:5;46808:10;46820:5;46835:4;46842:10;46795:5;:58::i;:::-;46776:77;-1:-1:-1;46868:14:0;-1:-1:-1;;;;;46916:43:0;;;46960:5;46967;46974:22;:6;46985:10;46974;:22::i;:::-;46998:11;47011:1;47014;47017:9;47028:15;46916:128;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46897:147;-1:-1:-1;47059:16:0;;-1:-1:-1;;;;;;47059:16:0;46176:1166;47170:17;47190:61;47210:5;47217:6;47233:4;47240:10;47190:19;:61::i;:::-;47170:81;;47273:57;47289:3;47294:12;47308:9;47319:10;47273:15;:57::i;:::-;47266:64;;;;;32822:761;33246:23;33272:69;33300:4;33272:69;;;;;;;;;;;;;;;;;33280:5;-1:-1:-1;;;;;33272:27:0;;;:69;;;;;:::i;:::-;33356:17;;33246:95;;-1:-1:-1;33356:21:0;33352:224;;33498:10;33487:30;;;;;;;;;;;;:::i;:::-;33479:85;;;;-1:-1:-1;;;33479:85:0;;12728:2:1;33479:85:0;;;12710:21:1;12767:2;12747:18;;;12740:30;12806:34;12786:18;;;12779:62;-1:-1:-1;;;12857:18:1;;;12850:40;12907:19;;33479:85:0;12526:406:1;31047:622:0;31417:10;;;31416:62;;-1:-1:-1;31433:39:0;;-1:-1:-1;;;31433:39:0;;31457:4;31433:39;;;6325:34:1;-1:-1:-1;;;;;6395:15:1;;;6375:18;;;6368:43;31433:15:0;;;;;6260:18:1;;31433:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;31416:62;31408:152;;;;-1:-1:-1;;;31408:152:0;;13139:2:1;31408:152:0;;;13121:21:1;13178:2;13158:18;;;13151:30;13217:34;13197:18;;;13190:62;-1:-1:-1;;;13268:18:1;;;13261:52;13330:19;;31408:152:0;12937:418:1;31408:152:0;31598:62;;-1:-1:-1;;;;;8452:32:1;;31598:62:0;;;8434:51:1;8501:18;;;8494:34;;;31571:90:0;;31591:5;;-1:-1:-1;;;31621:22:0;8407:18:1;;31598:62:0;8260:274:1;48106:879:0;48228:4;;;;48278:13;:6;48289:1;48278:10;:13::i;:::-;48261:30;;48306:16;48325:67;48345:5;48352:9;48371:4;48378:13;48325:19;:67::i;:::-;48306:86;;48407:43;48429:5;48436:13;48407:21;:43::i;:::-;-1:-1:-1;;;;;48469:30:0;;;;;;:15;:30;;;;;;;;48465:513;;;48567:13;-1:-1:-1;;;;;48607:22:0;;;48638:21;:6;48649:9;48638:10;:21::i;:::-;48661:5;48668:11;48681:1;48684;48687:9;48698:15;48607:107;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48600:114;;;;;;;;;;;48465:513;48815:13;-1:-1:-1;;;;;48855:22:0;;;48886:21;:6;48897:9;48886:10;:21::i;48106:879::-;;;;;;;;;:::o;48993:750::-;49141:4;;;;49191:13;:6;49202:1;49191:10;:13::i;:::-;49174:30;;49219:17;49239:68;49259:6;49267:9;49286:4;49293:13;49239:19;:68::i;:::-;49219:88;-1:-1:-1;49322:17:0;49342:80;49362:6;49370:21;:6;49381:9;49370:10;:21::i;:::-;49401:4;49408:13;49342:19;:80::i;:::-;49322:100;;49437:44;49459:6;49467:13;49437:21;:44::i;:::-;49496;49518:6;49526:13;49496:21;:44::i;:::-;49555:25;49602:13;49555:61;;49638:6;-1:-1:-1;;;;;49638:19:0;;49658:6;49666;49674:12;49688;49702:1;49705;49708:9;49719:15;49638:97;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49631:104;;;;;;;;;;48993:750;;;;;;;;;:::o;24373:98::-;24431:7;24458:5;24462:1;24458;:5;:::i;16887:195::-;16990:12;17022:52;17044:6;17052:4;17058:1;17061:12;17022:21;:52::i;49751:754::-;-1:-1:-1;;;;;49987:27:0;;;49863:4;49987:27;;;:20;:27;;;;;;;;:39;;;;;;;;;;;49863:4;;49880:21;;49959:10;;49987:39;:53;49983:353;;50064:16;;;50078:1;50064:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;50105:7:0;;50095;;;;-1:-1:-1;;;;;;50105:7:0;;50095;;-1:-1:-1;50105:7:0;;50095;;;;:::i;:::-;-1:-1:-1;;;;;50095:17:0;;;:7;;;;;;;;;;:17;;;;50137:27;;;;;;;:20;:27;;;;;;:39;;;;;;;;;;50127:7;;50137:39;;;50127:4;;50137:39;;50127:7;;;;;;:::i;:::-;;;;;;:49;-1:-1:-1;;;;;50127:49:0;;;-1:-1:-1;;;;;50127:49:0;;;;;50201:5;50191:4;50196:1;50191:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;50191:15:0;;;-1:-1:-1;;;;;50191:15:0;;;;;49983:353;;;50246:16;;;50260:1;50246:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;50287:7:0;;50277;;;;-1:-1:-1;;;;;;50287:7:0;;50277;;-1:-1:-1;50287:7:0;;50277;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;50277:17:0;;;-1:-1:-1;;;;;50277:17:0;;;;;50319:5;50309:4;50314:1;50309:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;50309:15:0;;;-1:-1:-1;;;;;50309:15:0;;;;;49983:353;50348:21;50372:6;-1:-1:-1;;;;;50372:28:0;;50409:5;50416:1;50419:4;50425:9;50436:15;50372:80;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50372:80:0;;;;;;;;;;;;:::i;:::-;50348:104;;50470:7;50495:1;50478:7;:14;:18;;;;:::i;:::-;50470:27;;;;;;;;:::i;:::-;;;;;;;50463:34;;;;;49751:754;;;;;;:::o;17939:530::-;18066:12;18124:5;18099:21;:30;;18091:81;;;;-1:-1:-1;;;18091:81:0;;10855:2:1;18091:81:0;;;10837:21:1;10894:2;10874:18;;;10867:30;10933:34;10913:18;;;10906:62;-1:-1:-1;;;10984:18:1;;;10977:36;11030:19;;18091:81:0;10653:402:1;18091:81:0;14336:20;;18183:60;;;;-1:-1:-1;;;18183:60:0;;11966:2:1;18183:60:0;;;11948:21:1;12005:2;11985:18;;;11978:30;12044:31;12024:18;;;12017:59;12093:18;;18183:60:0;11764:353:1;18183:60:0;18317:12;18331:23;18358:6;-1:-1:-1;;;;;18358:11:0;18378:5;18386:4;18358:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18316:75;;;;18409:52;18427:7;18436:10;18448:12;18409:17;:52::i;:::-;18402:59;17939:530;-1:-1:-1;;;;;;;17939:530:0:o;20479:742::-;20594:12;20623:7;20619:595;;;-1:-1:-1;20654:10:0;20647:17;;20619:595;20768:17;;:21;20764:439;;21031:10;21025:17;21092:15;21079:10;21075:2;21071:19;21064:44;20764:439;21174:12;21167:20;;-1:-1:-1;;;21167:20:0;;;;;;;;:::i;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:529::-;599:6;607;615;668:2;656:9;647:7;643:23;639:32;636:52;;;684:1;681;674:12;636:52;723:9;710:23;742:31;767:5;742:31;:::i;:::-;792:5;-1:-1:-1;849:2:1;834:18;;821:32;862:33;821:32;862:33;:::i;:::-;914:7;-1:-1:-1;973:2:1;958:18;;945:32;986:33;945:32;986:33;:::i;:::-;1038:7;1028:17;;;522:529;;;;;:::o;1056:598::-;1142:6;1150;1158;1166;1219:3;1207:9;1198:7;1194:23;1190:33;1187:53;;;1236:1;1233;1226:12;1187:53;1275:9;1262:23;1294:31;1319:5;1294:31;:::i;:::-;1344:5;-1:-1:-1;1401:2:1;1386:18;;1373:32;1414:33;1373:32;1414:33;:::i;:::-;1466:7;-1:-1:-1;1525:2:1;1510:18;;1497:32;1538:33;1497:32;1538:33;:::i;:::-;1056:598;;;;-1:-1:-1;1590:7:1;;1644:2;1629:18;1616:32;;-1:-1:-1;;1056:598:1:o;1659:::-;1745:6;1753;1761;1769;1822:3;1810:9;1801:7;1797:23;1793:33;1790:53;;;1839:1;1836;1829:12;1790:53;1878:9;1865:23;1897:31;1922:5;1897:31;:::i;:::-;1947:5;-1:-1:-1;1999:2:1;1984:18;;1971:32;;-1:-1:-1;2055:2:1;2040:18;;2027:32;2068:33;2027:32;2068:33;:::i;:::-;2120:7;-1:-1:-1;2179:2:1;2164:18;;2151:32;2192:33;2151:32;2192:33;:::i;:::-;1659:598;;;;-1:-1:-1;1659:598:1;;-1:-1:-1;;1659:598:1:o;2262:740::-;2357:6;2365;2373;2381;2389;2442:3;2430:9;2421:7;2417:23;2413:33;2410:53;;;2459:1;2456;2449:12;2410:53;2498:9;2485:23;2517:31;2542:5;2517:31;:::i;:::-;2567:5;-1:-1:-1;2619:2:1;2604:18;;2591:32;;-1:-1:-1;2675:2:1;2660:18;;2647:32;2688:33;2647:32;2688:33;:::i;:::-;2740:7;-1:-1:-1;2799:2:1;2784:18;;2771:32;2812:33;2771:32;2812:33;:::i;:::-;2864:7;-1:-1:-1;2923:3:1;2908:19;;2895:33;2937;2895;2937;:::i;:::-;2989:7;2979:17;;;2262:740;;;;;;;;:::o;3007:1116::-;3102:6;3133:2;3176;3164:9;3155:7;3151:23;3147:32;3144:52;;;3192:1;3189;3182:12;3144:52;3225:9;3219:16;3254:18;3295:2;3287:6;3284:14;3281:34;;;3311:1;3308;3301:12;3281:34;3349:6;3338:9;3334:22;3324:32;;3394:7;3387:4;3383:2;3379:13;3375:27;3365:55;;3416:1;3413;3406:12;3365:55;3445:2;3439:9;3467:2;3463;3460:10;3457:36;;;3473:18;;:::i;:::-;3519:2;3516:1;3512:10;3551:2;3545:9;3614:2;3610:7;3605:2;3601;3597:11;3593:25;3585:6;3581:38;3669:6;3657:10;3654:22;3649:2;3637:10;3634:18;3631:46;3628:72;;;3680:18;;:::i;:::-;3716:2;3709:22;3766:18;;;3800:15;;;;-1:-1:-1;3835:11:1;;;3865;;;3861:20;;3858:33;-1:-1:-1;3855:53:1;;;3904:1;3901;3894:12;3855:53;3926:1;3917:10;;3936:156;3950:2;3947:1;3944:9;3936:156;;;4007:10;;3995:23;;3968:1;3961:9;;;;;4038:12;;;;4070;;3936:156;;;-1:-1:-1;4111:6:1;3007:1116;-1:-1:-1;;;;;;;;3007:1116:1:o;4128:277::-;4195:6;4248:2;4236:9;4227:7;4223:23;4219:32;4216:52;;;4264:1;4261;4254:12;4216:52;4296:9;4290:16;4349:5;4342:13;4335:21;4328:5;4325:32;4315:60;;4371:1;4368;4361:12;4410:184;4480:6;4533:2;4521:9;4512:7;4508:23;4504:32;4501:52;;;4549:1;4546;4539:12;4501:52;-1:-1:-1;4572:16:1;;4410:184;-1:-1:-1;4410:184:1:o;4599:245::-;4678:6;4686;4739:2;4727:9;4718:7;4714:23;4710:32;4707:52;;;4755:1;4752;4745:12;4707:52;-1:-1:-1;;4778:16:1;;4834:2;4819:18;;;4813:25;4778:16;;4813:25;;-1:-1:-1;4599:245:1:o;4849:306::-;4937:6;4945;4953;5006:2;4994:9;4985:7;4981:23;4977:32;4974:52;;;5022:1;5019;5012:12;4974:52;5051:9;5045:16;5035:26;;5101:2;5090:9;5086:18;5080:25;5070:35;;5145:2;5134:9;5130:18;5124:25;5114:35;;4849:306;;;;;:::o;5160:461::-;5213:3;5251:5;5245:12;5278:6;5273:3;5266:19;5304:4;5333:2;5328:3;5324:12;5317:19;;5370:2;5363:5;5359:14;5391:1;5401:195;5415:6;5412:1;5409:13;5401:195;;;5480:13;;-1:-1:-1;;;;;5476:39:1;5464:52;;5536:12;;;;5571:15;;;;5512:1;5430:9;5401:195;;;-1:-1:-1;5612:3:1;;5160:461;-1:-1:-1;;;;;5160:461:1:o;5626:274::-;5755:3;5793:6;5787:13;5809:53;5855:6;5850:3;5843:4;5835:6;5831:17;5809:53;:::i;:::-;5878:16;;;;;5626:274;-1:-1:-1;;5626:274:1:o;6802:688::-;-1:-1:-1;;;;;7189:15:1;;;7171:34;;7241:15;;;7236:2;7221:18;;7214:43;7288:2;7273:18;;7266:34;;;;7331:2;7316:18;;7309:34;;;;7374:3;7359:19;;7352:35;7424:15;;;7151:3;7403:19;;7396:44;7471:3;7456:19;;7449:35;;;;7120:3;7105:19;;6802:688::o;7495:760::-;-1:-1:-1;;;;;7910:15:1;;;7892:34;;7962:15;;;7957:2;7942:18;;7935:43;8009:2;7994:18;;7987:34;;;;8052:2;8037:18;;8030:34;;;;8095:3;8080:19;;8073:35;;;;7872:3;8124:19;;8117:35;8189:15;;;8183:3;8168:19;;8161:44;8236:3;8221:19;;8214:35;;;;7841:3;7826:19;;7495:760::o;8539:607::-;-1:-1:-1;;;;;8898:15:1;;;8880:34;;8945:2;8930:18;;8923:34;;;;8988:2;8973:18;;8966:34;;;;9031:2;9016:18;;9009:34;;;;9080:15;;;9074:3;9059:19;;9052:44;8860:3;9112:19;;9105:35;;;;8829:3;8814:19;;8539:607::o;9343:510::-;9614:6;9603:9;9596:25;9657:3;9652:2;9641:9;9637:18;9630:31;9577:4;9678:57;9730:3;9719:9;9715:19;9707:6;9678:57;:::i;:::-;-1:-1:-1;;;;;9771:32:1;;;;9766:2;9751:18;;9744:60;-1:-1:-1;9835:2:1;9820:18;9813:34;9670:65;9343:510;-1:-1:-1;;9343:510:1:o;9858:383::-;10007:2;9996:9;9989:21;9970:4;10039:6;10033:13;10082:6;10077:2;10066:9;10062:18;10055:34;10098:66;10157:6;10152:2;10141:9;10137:18;10132:2;10124:6;10120:15;10098:66;:::i;:::-;10225:2;10204:15;-1:-1:-1;;10200:29:1;10185:45;;;;10232:2;10181:54;;9858:383;-1:-1:-1;;9858:383:1:o;11060:338::-;11262:2;11244:21;;;11301:2;11281:18;;;11274:30;-1:-1:-1;;;11335:2:1;11320:18;;11313:44;11389:2;11374:18;;11060:338::o;11403:356::-;11605:2;11587:21;;;11624:18;;;11617:30;11683:34;11678:2;11663:18;;11656:62;11750:2;11735:18;;11403:356::o;13360:332::-;13567:6;13556:9;13549:25;13610:2;13605;13594:9;13590:18;13583:30;13530:4;13630:56;13682:2;13671:9;13667:18;13659:6;13630:56;:::i;13697:582::-;13996:6;13985:9;13978:25;14039:6;14034:2;14023:9;14019:18;14012:34;14082:3;14077:2;14066:9;14062:18;14055:31;13959:4;14103:57;14155:3;14144:9;14140:19;14132:6;14103:57;:::i;:::-;-1:-1:-1;;;;;14196:32:1;;;;14191:2;14176:18;;14169:60;-1:-1:-1;14260:3:1;14245:19;14238:35;14095:65;13697:582;-1:-1:-1;;;13697:582:1:o;14537:128::-;14577:3;14608:1;14604:6;14601:1;14598:13;14595:39;;;14614:18;;:::i;:::-;-1:-1:-1;14650:9:1;;14537:128::o;14670:217::-;14710:1;14736;14726:132;;14780:10;14775:3;14771:20;14768:1;14761:31;14815:4;14812:1;14805:15;14843:4;14840:1;14833:15;14726:132;-1:-1:-1;14872:9:1;;14670:217::o;14892:125::-;14932:4;14960:1;14957;14954:8;14951:34;;;14965:18;;:::i;:::-;-1:-1:-1;15002:9:1;;14892:125::o;15022:258::-;15094:1;15104:113;15118:6;15115:1;15112:13;15104:113;;;15194:11;;;15188:18;15175:11;;;15168:39;15140:2;15133:10;15104:113;;;15235:6;15232:1;15229:13;15226:48;;;-1:-1:-1;;15270:1:1;15252:16;;15245:27;15022:258::o;15285:127::-;15346:10;15341:3;15337:20;15334:1;15327:31;15377:4;15374:1;15367:15;15401:4;15398:1;15391:15;15417:127;15478:10;15473:3;15469:20;15466:1;15459:31;15509:4;15506:1;15499:15;15533:4;15530:1;15523:15;15549:127;15610:10;15605:3;15601:20;15598:1;15591:31;15641:4;15638:1;15631:15;15665:4;15662:1;15655:15;15681:131;-1:-1:-1;;;;;15756:31:1;;15746:42;;15736:70;;15802:1;15799;15792:12
Swarm Source
ipfs://0c8c505330f2b3115287de2bba91f896bf8d89c8a9ed6abeb5d44b4a799b8b77
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.