Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 842 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Zap In Simple | 19703012 | 242 days ago | IN | 0.048 ETH | 0.00202015 | ||||
Zap In Simple | 19217346 | 310 days ago | IN | 0.095 ETH | 0.00660916 | ||||
Zap In Simple | 18878295 | 358 days ago | IN | 0.1 ETH | 0.01155532 | ||||
Zap In Simple | 18874255 | 359 days ago | IN | 0.1 ETH | 0.00407192 | ||||
Zap In Simple | 17306448 | 578 days ago | IN | 0.118 ETH | 0.00911033 | ||||
Zap In Simple | 16945733 | 629 days ago | IN | 0.001 ETH | 0.00856907 | ||||
Zap In Simple | 16945471 | 629 days ago | IN | 0.0001 ETH | 0.00680358 | ||||
Zap In Simple | 16945469 | 629 days ago | IN | 0.0001 ETH | 0.00709939 | ||||
Zap In Simple | 16945466 | 629 days ago | IN | 0.0001 ETH | 0.00675683 | ||||
Zap In Simple | 16945463 | 629 days ago | IN | 0.0001 ETH | 0.00796171 | ||||
Zap In Simple | 16941074 | 630 days ago | IN | 0.25 ETH | 0.01067871 | ||||
Zap In Simple | 16607241 | 677 days ago | IN | 0.21 ETH | 0.00493753 | ||||
Zap In Simple | 16455975 | 698 days ago | IN | 0.406 ETH | 0.00447813 | ||||
Zap In Simple | 16262134 | 725 days ago | IN | 0.66 ETH | 0.00389482 | ||||
Zap In Simple | 15965624 | 767 days ago | IN | 0.545 ETH | 0.00365428 | ||||
Zap In Simple | 15858024 | 782 days ago | IN | 0.65 ETH | 0.0017361 | ||||
Zap In Simple | 15599332 | 818 days ago | IN | 0.05 ETH | 0.00130963 | ||||
Zap In Simple | 15544637 | 825 days ago | IN | 2 ETH | 0.00136458 | ||||
Zap In Simple | 15544119 | 826 days ago | IN | 0.3 ETH | 0.00122237 | ||||
Zap In Simple | 15501370 | 832 days ago | IN | 0.11 ETH | 0.00473293 | ||||
Zap In Simple | 15501370 | 832 days ago | IN | 0.11 ETH | 0.00509521 | ||||
Zap In Simple | 15406728 | 848 days ago | IN | 0.15 ETH | 0.00215224 | ||||
Zap In Simple | 15366510 | 854 days ago | IN | 0.2 ETH | 0.00667925 | ||||
Zap In Simple | 15333690 | 859 days ago | IN | 0.8 ETH | 0.00265063 | ||||
Zap In Simple | 15327506 | 860 days ago | IN | 0.6 ETH | 0.00854801 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
19703012 | 242 days ago | 0.048 ETH | ||||
19217346 | 310 days ago | 0.095 ETH | ||||
18878295 | 358 days ago | 0.1 ETH | ||||
18874255 | 359 days ago | 0.1 ETH | ||||
17306448 | 578 days ago | 0.118 ETH | ||||
16945733 | 629 days ago | 0.001 ETH | ||||
16945471 | 629 days ago | 0.0001 ETH | ||||
16945469 | 629 days ago | 0.0001 ETH | ||||
16945466 | 629 days ago | 0.0001 ETH | ||||
16945463 | 629 days ago | 0.0001 ETH | ||||
16941074 | 630 days ago | 0.25 ETH | ||||
16607241 | 677 days ago | 0.21 ETH | ||||
16455975 | 698 days ago | 0.406 ETH | ||||
16262134 | 725 days ago | 0.66 ETH | ||||
15965624 | 767 days ago | 0.545 ETH | ||||
15858024 | 782 days ago | 0.65 ETH | ||||
15599332 | 818 days ago | 0.05 ETH | ||||
15544637 | 825 days ago | 2 ETH | ||||
15544119 | 826 days ago | 0.3 ETH | ||||
15501370 | 832 days ago | 0.11 ETH | ||||
15501370 | 832 days ago | 0.11 ETH | ||||
15406728 | 848 days ago | 0.15 ETH | ||||
15366510 | 854 days ago | 0.2 ETH | ||||
15333690 | 859 days ago | 0.8 ETH | ||||
15327506 | 860 days ago | 0.6 ETH |
Loading...
Loading
Contract Name:
ZapInModified
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-01 */ // Modified for use with SYNC, modifications not made by Zapper // Copyright (C) 2020 zapper, nodar, suhail, seb, sumit, apoorv // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // ///@author Zapper ///@notice This contract adds liquidity to Uniswap V2 pools using ETH or any ERC20 Token. // SPDX-License-Identifier: GPLv2 pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require( success, "Address: unable to send value, recipient may have reverted" ); } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add( value ); callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, "SafeERC20: decreased allowance below zero" ); callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * _Since v2.5.0:_ this module is now much more gas efficient, given net gas * metering changes introduced in the Istanbul hardfork. */ contract ReentrancyGuard { bool private _notEntered; constructor() internal { // Storing an initial non-zero value makes deployment a bit more // expensive, but in exchange the refund on every call to nonReentrant // will be lower in amount. Since refunds are capped to a percetange of // the total transaction's gas, it is best to keep them low in cases // like this one, to increase the likelihood of the full refund coming // into effect. _notEntered = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() internal {} // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @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. * * 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. */ contract Ownable is Context { address payable public _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() internal { address payable msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _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 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 payable newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address payable newOwner) internal { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // import "@uniswap/lib/contracts/libraries/Babylonian.sol"; library Babylonian { function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } // else z = 0 } } interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; } interface IUniswapV2Factory { function getPair(address tokenA, address tokenB) external view returns (address); } interface IUniswapV2Router02 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IUniswapV2Pair { function token0() external pure returns (address); function token1() external pure returns (address); function getReserves() external view returns ( uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast ); } contract ZapInModified is ReentrancyGuard, Ownable { using SafeMath for uint256; using Address for address; using SafeERC20 for IERC20; bool public stopped = false; IUniswapV2Router02 private constant uniswapRouter = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); IUniswapV2Factory private constant UniSwapV2FactoryAddress = IUniswapV2Factory( 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f ); address private wethTokenAddress; uint256 private constant deadline = 0xf000000000000000000000000000000000000000000000000000000000000000; constructor() public { wethTokenAddress=uniswapRouter.WETH(); } // circuit breaker modifiers modifier stopInEmergency { if (stopped) { revert("Temporarily Paused"); } else { _; } } /** @notice This function is used to invest in given Uniswap V2 pair through ETH/ERC20 Tokens @param _FromTokenContractAddress The ERC20 token used for investment (address(0x00) if ether) @param _ToUnipoolToken0 The Uniswap V2 pair token0 address @param _ToUnipoolToken1 The Uniswap V2 pair token1 address @param _amount The amount of fromToken to invest @param _minPoolTokens Reverts if less tokens received than this @return Amount of LP bought */ function ZapIn( address _toWhomToIssue, address _FromTokenContractAddress, address _ToUnipoolToken0, address _ToUnipoolToken1, uint256 _amount, uint256 _minPoolTokens ) public payable nonReentrant stopInEmergency returns (uint256) { uint256 toInvest; if (_FromTokenContractAddress == address(0)) { require(msg.value > 0, "Error: ETH not sent"); toInvest = msg.value; } else { require(msg.value == 0, "Error: ETH sent"); require(_amount > 0, "Error: Invalid ERC amount"); IERC20(_FromTokenContractAddress).safeTransferFrom( msg.sender, address(this), _amount ); toInvest = _amount; } uint256 LPBought = _performZapIn( _toWhomToIssue, _FromTokenContractAddress, _ToUnipoolToken0, _ToUnipoolToken1, toInvest ); require(LPBought >= _minPoolTokens, "ERR: High Slippage"); //get pair address address _ToUniPoolAddress = UniSwapV2FactoryAddress.getPair( _ToUnipoolToken0, _ToUnipoolToken1 ); IERC20(_ToUniPoolAddress).safeTransfer( _toWhomToIssue, LPBought ); return LPBought; } event DebugZap(uint256 ethToTrade,uint256 tokens0,uint256 tokens1,uint256 liquidityObtained); function _performZapIn( address _toWhomToIssue, address _FromTokenContractAddress, address _ToUnipoolToken0, address _ToUnipoolToken1, uint256 _amount ) internal returns (uint256) { address intermediate = _getIntermediate( _FromTokenContractAddress, _amount, _ToUnipoolToken0, _ToUnipoolToken1 ); // swap to intermediate uint256 interAmt = _token2Token( _FromTokenContractAddress, intermediate, _amount ); // divide to swap in amounts uint256 token0Bought; uint256 token1Bought; IUniswapV2Pair pair = IUniswapV2Pair( UniSwapV2FactoryAddress.getPair(_ToUnipoolToken0, _ToUnipoolToken1) ); (uint256 res0, uint256 res1, ) = pair.getReserves(); uint256 amountToSwap; if (intermediate == _ToUnipoolToken0) { amountToSwap = calculateSwapInAmount(res0, interAmt); //if no reserve or a new pair is created if (amountToSwap <= 0) amountToSwap = interAmt.div(2); token1Bought = _token2Token( intermediate, _ToUnipoolToken1, amountToSwap ); token0Bought = interAmt.sub(amountToSwap); } else { amountToSwap = calculateSwapInAmount(res1, interAmt); //if no reserve or a new pair is created if (amountToSwap <= 0) amountToSwap = interAmt.div(2); token0Bought = _token2Token( intermediate, _ToUnipoolToken0, amountToSwap ); token1Bought = interAmt.sub(amountToSwap); } uint256 lobt=_uniDeposit( _toWhomToIssue, _ToUnipoolToken0, _ToUnipoolToken1, token0Bought, token1Bought ); emit DebugZap(amountToSwap,token0Bought,token1Bought,lobt); return lobt; } function _uniDeposit( address _toWhomToIssue, address _ToUnipoolToken0, address _ToUnipoolToken1, uint256 token0Bought, uint256 token1Bought ) internal returns (uint256) { IERC20(_ToUnipoolToken0).safeApprove( address(uniswapRouter), token0Bought ); IERC20(_ToUnipoolToken1).safeApprove( address(uniswapRouter), token1Bought ); (uint256 amountA, uint256 amountB, uint256 LP) = uniswapRouter .addLiquidity( _ToUnipoolToken0, _ToUnipoolToken1, token0Bought, token1Bought, 1, 1, address(this), deadline ); IERC20(_ToUnipoolToken0).safeApprove( address(uniswapRouter), 0 ); IERC20(_ToUnipoolToken1).safeApprove( address(uniswapRouter), 0 ); //Returning Residue in token0, if any. if (token0Bought.sub(amountA) > 0) { IERC20(_ToUnipoolToken0).safeTransfer( _toWhomToIssue, token0Bought.sub(amountA) ); } //Returning Residue in token1, if any if (token1Bought.sub(amountB) > 0) { IERC20(_ToUnipoolToken1).safeTransfer( _toWhomToIssue, token1Bought.sub(amountB) ); } return LP; } function _getIntermediate( address _FromTokenContractAddress, uint256 _amount, address _ToUnipoolToken0, address _ToUnipoolToken1 ) internal view returns (address) { // set from to weth for eth input if (_FromTokenContractAddress == address(0)) { _FromTokenContractAddress = wethTokenAddress; } if (_FromTokenContractAddress == _ToUnipoolToken0) { return _ToUnipoolToken0; } else if (_FromTokenContractAddress == _ToUnipoolToken1) { return _ToUnipoolToken1; } else if(_ToUnipoolToken0 == wethTokenAddress || _ToUnipoolToken1 == wethTokenAddress) { return wethTokenAddress; } else { IUniswapV2Pair pair = IUniswapV2Pair( UniSwapV2FactoryAddress.getPair( _ToUnipoolToken0, _ToUnipoolToken1 ) ); (uint256 res0, uint256 res1, ) = pair.getReserves(); uint256 ratio; bool isToken0Numerator; if (res0 >= res1) { ratio = res0 / res1; isToken0Numerator = true; } else { ratio = res1 / res0; } //find outputs on swap uint256 output0 = _calculateSwapOutput( _FromTokenContractAddress, _amount, _ToUnipoolToken0 ); uint256 output1 = _calculateSwapOutput( _FromTokenContractAddress, _amount, _ToUnipoolToken1 ); if (isToken0Numerator) { if (output1 * ratio >= output0) return _ToUnipoolToken1; else return _ToUnipoolToken0; } else { if (output0 * ratio >= output1) return _ToUnipoolToken0; else return _ToUnipoolToken1; } } } function _calculateSwapOutput( address _from, uint256 _amt, address _to ) internal view returns (uint256) { // check output via tokenA -> tokenB address pairA = UniSwapV2FactoryAddress.getPair(_from, _to); uint256 amtA; if (pairA != address(0)) { address[] memory pathA = new address[](2); pathA[0] = _from; pathA[1] = _to; amtA = uniswapRouter.getAmountsOut(_amt, pathA)[1]; } uint256 amtB; // check output via tokenA -> weth -> tokenB if ((_from != wethTokenAddress) && _to != wethTokenAddress) { address[] memory pathB = new address[](3); pathB[0] = _from; pathB[1] = wethTokenAddress; pathB[2] = _to; amtB = uniswapRouter.getAmountsOut(_amt, pathB)[2]; } if (amtA >= amtB) { return amtA; } else { return amtB; } } /* */ function zapInSimple( address _lptaddress, uint256 _minPoolTokens ) public payable{ IUniswapV2Pair pair = IUniswapV2Pair(_lptaddress); ZapIn( msg.sender, address(0), pair.token0(), pair.token1(), 0, _minPoolTokens ); } /* Calculates the value to put in for minpooltokens. Should not be used in the same transaction as zapIn. Slippage as a fraction of 10000 (1% -> 100, 15% -> 1500, etc.). */ function calculateMinPoolTokens( address _pair, uint256 _amount, uint256 _slippage) external view returns(uint256){ uint256 numTokens=getResultingTokens(_pair,_amount); return numTokens.sub(numTokens.mul(_slippage).div(10000)); } function getResultingTokens( address _pair, uint256 _amount) public view returns(uint256){ IUniswapV2Pair pair = IUniswapV2Pair( _pair//UniSwapV2FactoryAddress.getPair(_ToUnipoolToken0, _ToUnipoolToken1) ); address intermediate = _getIntermediate( address(0), _amount, pair.token0(), pair.token1() ); uint256 interAmount=_amount; if(intermediate != wethTokenAddress){ IUniswapV2Pair pairUpstream = IUniswapV2Pair( UniSwapV2FactoryAddress.getPair(wethTokenAddress, intermediate) ); (uint256 resu0, uint256 resu1, ) = pairUpstream.getReserves(); interAmount=uniswapRouter.getAmountOut( _amount, pairUpstream.token0()==wethTokenAddress ? resu0 : resu1, pairUpstream.token0()==wethTokenAddress ? resu1 : resu0 ); } (uint256 res0, uint256 res1, ) = pair.getReserves(); if(pair.token0()==intermediate){ uint256 toSwapAmount=calculateSwapInAmount(res0, interAmount); return getTokensAcquired(res0,IERC20(address(pair)).totalSupply(),interAmount.sub(toSwapAmount)); } else{ uint256 toSwapAmount=calculateSwapInAmount(res1, interAmount); return getTokensAcquired(res1,IERC20(address(pair)).totalSupply(),interAmount.sub(toSwapAmount)); } } function getTokensAcquired(uint256 reserve,uint256 totalSupply,uint256 amount) public view returns(uint256){ return totalSupply.mul(amount).div(reserve.add(amount)); } function calculateSwapInAmount(uint256 reserveIn, uint256 userIn) public pure returns (uint256) { return Babylonian .sqrt( reserveIn.mul(userIn.mul(3988000) + reserveIn.mul(3988009)) ) .sub(reserveIn.mul(1997)) / 1994; } event DebugTokenSwap(address from, address to,uint256 totrade,uint256 bought); /** @notice This function is used to swap ETH/ERC20 <> ETH/ERC20 @param _FromTokenContractAddress The token address to swap from. (0x00 for ETH) @param _ToTokenContractAddress The token address to swap to. (0x00 for ETH) @param tokens2Trade The amount of tokens to swap @return tokenBought The quantity of tokens bought */ function _token2Token( address _FromTokenContractAddress, address _ToTokenContractAddress, uint256 tokens2Trade ) internal returns (uint256 tokenBought) { if (_FromTokenContractAddress == _ToTokenContractAddress) { return tokens2Trade; } if (_FromTokenContractAddress == address(0)) { if (_ToTokenContractAddress == wethTokenAddress) { IWETH(wethTokenAddress).deposit.value(tokens2Trade)(); return tokens2Trade; } address[] memory path = new address[](2); path[0] = wethTokenAddress; path[1] = _ToTokenContractAddress; tokenBought = uniswapRouter.swapExactETHForTokens.value( tokens2Trade )(1, path, address(this), deadline)[path.length - 1]; } else if (_ToTokenContractAddress == address(0)) { if (_FromTokenContractAddress == wethTokenAddress) { IWETH(wethTokenAddress).withdraw(tokens2Trade); return tokens2Trade; } IERC20(_FromTokenContractAddress).safeApprove( address(uniswapRouter), tokens2Trade ); address[] memory path = new address[](2); path[0] = _FromTokenContractAddress; path[1] = wethTokenAddress; tokenBought = uniswapRouter.swapExactTokensForETH( tokens2Trade, 1, path, address(this), deadline )[path.length - 1]; } else { IERC20(_FromTokenContractAddress).safeApprove( address(uniswapRouter), tokens2Trade ); if (_FromTokenContractAddress != wethTokenAddress) { if (_ToTokenContractAddress != wethTokenAddress) { // check output via tokenA -> tokenB address pairA = UniSwapV2FactoryAddress.getPair( _FromTokenContractAddress, _ToTokenContractAddress ); address[] memory pathA = new address[](2); pathA[0] = _FromTokenContractAddress; pathA[1] = _ToTokenContractAddress; uint256 amtA; if (pairA != address(0)) { amtA = uniswapRouter.getAmountsOut( tokens2Trade, pathA )[1]; } // check output via tokenA -> weth -> tokenB address[] memory pathB = new address[](3); pathB[0] = _FromTokenContractAddress; pathB[1] = wethTokenAddress; pathB[2] = _ToTokenContractAddress; uint256 amtB = uniswapRouter.getAmountsOut( tokens2Trade, pathB )[2]; if (amtA >= amtB) { tokenBought = uniswapRouter.swapExactTokensForTokens( tokens2Trade, 1, pathA, address(this), deadline )[pathA.length - 1]; } else { tokenBought = uniswapRouter.swapExactTokensForTokens( tokens2Trade, 1, pathB, address(this), deadline )[pathB.length - 1]; } } else { address[] memory path = new address[](2); path[0] = _FromTokenContractAddress; path[1] = wethTokenAddress; tokenBought = uniswapRouter.swapExactTokensForTokens( tokens2Trade, 1, path, address(this), deadline )[path.length - 1]; } } else { address[] memory path = new address[](2); path[0] = wethTokenAddress; path[1] = _ToTokenContractAddress; tokenBought = uniswapRouter.swapExactTokensForTokens( tokens2Trade, 1, path, address(this), deadline )[path.length - 1]; } } require(tokenBought > 0, "Error Swapping Tokens"); emit DebugTokenSwap(_FromTokenContractAddress, _ToTokenContractAddress,tokens2Trade,tokenBought); } function inCaseTokengetsStuck(IERC20 _TokenAddress) public onlyOwner { uint256 qty = _TokenAddress.balanceOf(address(this)); _TokenAddress.safeTransfer(owner(), qty); } // - to Pause the contract function toggleContractActive() public onlyOwner { stopped = !stopped; } // - to withdraw any ETH balance sitting in the contract function withdraw() public onlyOwner { uint256 contractBalance = address(this).balance; address payable _to = owner().toPayable(); _to.transfer(contractBalance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"totrade","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bought","type":"uint256"}],"name":"DebugTokenSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ethToTrade","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokens0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokens1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidityObtained","type":"uint256"}],"name":"DebugZap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"_toWhomToIssue","type":"address"},{"internalType":"address","name":"_FromTokenContractAddress","type":"address"},{"internalType":"address","name":"_ToUnipoolToken0","type":"address"},{"internalType":"address","name":"_ToUnipoolToken1","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minPoolTokens","type":"uint256"}],"name":"ZapIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_slippage","type":"uint256"}],"name":"calculateMinPoolTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"userIn","type":"uint256"}],"name":"calculateSwapInAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getResultingTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reserve","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getTokensAcquired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_TokenAddress","type":"address"}],"name":"inCaseTokengetsStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isOwner","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":[],"name":"stopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleContractActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lptaddress","type":"address"},{"internalType":"uint256","name":"_minPoolTokens","type":"uint256"}],"name":"zapInSimple","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526000805460ff60a81b191690553480156200001e57600080fd5b506000805460ff191660011781556200003662000129565b60008054610100600160a81b0319166101006001600160a01b038416908102919091178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620000d657600080fd5b505afa158015620000eb573d6000803e3d6000fd5b505050506040513d60208110156200010257600080fd5b5051600180546001600160a01b0319166001600160a01b039092169190911790556200012d565b3390565b613537806200013d6000396000f3fe6080604052600436106100e85760003560e01c806386ebfd531161008a578063b2bdfa7b11610059578063b2bdfa7b146102c0578063ba6b2c38146102d5578063edd9741014610314578063f2fde38b1461034d576100e8565b806386ebfd531461021e5780638d7e41a81461024a5780638da5cb5b1461027a5780638f32d59b146102ab576100e8565b80633ccfd60b116100c65780633ccfd60b14610198578063551196d5146101ad578063715018a6146101e057806375f12b21146101f5576100e8565b80631385d24c146100ed5780631d5723201461010457806334b5ef6514610162575b600080fd5b3480156100f957600080fd5b50610102610380565b005b610150600480360360c081101561011a57600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a001356103e8565b60408051918252519081900360200190f35b34801561016e57600080fd5b506101506004803603606081101561018557600080fd5b50803590602081013590604001356106cf565b3480156101a457600080fd5b506101026106f8565b3480156101b957600080fd5b50610102600480360360208110156101d057600080fd5b50356001600160a01b0316610799565b3480156101ec57600080fd5b5061010261087d565b34801561020157600080fd5b5061020a610913565b604080519115158252519081900360200190f35b6101026004803603604081101561023457600080fd5b506001600160a01b038135169060200135610923565b34801561025657600080fd5b506101506004803603604081101561026d57600080fd5b5080359060200135610a0d565b34801561028657600080fd5b5061028f610a65565b604080516001600160a01b039092168252519081900360200190f35b3480156102b757600080fd5b5061020a610a79565b3480156102cc57600080fd5b5061028f610aa2565b3480156102e157600080fd5b50610150600480360360608110156102f857600080fd5b506001600160a01b038135169060208101359060400135610ab6565b34801561032057600080fd5b506101506004803603604081101561033757600080fd5b506001600160a01b038135169060200135610ae8565b34801561035957600080fd5b506101026004803603602081101561037057600080fd5b50356001600160a01b0316611080565b610388610a79565b6103c7576040805162461bcd60e51b81526020600482018190526024820152600080516020613482833981519152604482015290519081900360640190fd5b6000805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6000805460ff16610440576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff191690819055600160a81b900460ff161561049d576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b60006001600160a01b0387166104ff57600034116104f8576040805162461bcd60e51b8152602060048201526013602482015272115c9c9bdc8e88115512081b9bdd081cd95b9d606a1b604482015290519081900360640190fd5b50346105b1565b3415610544576040805162461bcd60e51b815260206004820152600f60248201526e115c9c9bdc8e88115512081cd95b9d608a1b604482015290519081900360640190fd5b60008411610599576040805162461bcd60e51b815260206004820152601960248201527f4572726f723a20496e76616c69642045524320616d6f756e7400000000000000604482015290519081900360640190fd5b6105ae6001600160a01b0388163330876110d3565b50825b60006105c0898989898661112d565b90508381101561060c576040805162461bcd60e51b81526020600482015260126024820152714552523a204869676820536c69707061676560701b604482015290519081900360640190fd5b6040805163e6a4390560e01b81526001600160a01b038981166004830152881660248201529051600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b15801561067257600080fd5b505afa158015610686573d6000803e3d6000fd5b505050506040513d602081101561069c57600080fd5b505190506106b46001600160a01b0382168b8461137a565b509150506000805460ff191660011790559695505050505050565b60006106ee6106de85846113cc565b6106e88585611426565b9061147f565b90505b9392505050565b610700610a79565b61073f576040805162461bcd60e51b81526020600482018190526024820152600080516020613482833981519152604482015290519081900360640190fd5b47600061075b61074d610a65565b6001600160a01b03166114c1565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610794573d6000803e3d6000fd5b505050565b6107a1610a79565b6107e0576040805162461bcd60e51b81526020600482018190526024820152600080516020613482833981519152604482015290519081900360640190fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561082f57600080fd5b505afa158015610843573d6000803e3d6000fd5b505050506040513d602081101561085957600080fd5b50519050610879610868610a65565b6001600160a01b038416908361137a565b5050565b610885610a79565b6108c4576040805162461bcd60e51b81526020600482018190526024820152600080516020613482833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b600054600160a81b900460ff1681565b6000829050610a07336000836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561096757600080fd5b505afa15801561097b573d6000803e3d6000fd5b505050506040513d602081101561099157600080fd5b50516040805163d21220a760e01b815290516001600160a01b0387169163d21220a7916004808301926020929190829003018186803b1580156109d357600080fd5b505afa1580156109e7573d6000803e3d6000fd5b505050506040513d60208110156109fd57600080fd5b50516000876103e8565b50505050565b60006107ca610a54610a21856107cd611426565b610a4e610a49610a3488623cda29611426565b610a4188623cda20611426565b899101611426565b6114c8565b90611519565b81610a5b57fe5b0490505b92915050565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b0316610a9361155b565b6001600160a01b031614905090565b60005461010090046001600160a01b031681565b600080610ac38585610ae8565b9050610adf610ad86127106106e88487611426565b8290611519565b95945050505050565b6000808390506000610bcc600085846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610b2f57600080fd5b505afa158015610b43573d6000803e3d6000fd5b505050506040513d6020811015610b5957600080fd5b50516040805163d21220a760e01b815290516001600160a01b0388169163d21220a7916004808301926020929190829003018186803b158015610b9b57600080fd5b505afa158015610baf573d6000803e3d6000fd5b505050506040513d6020811015610bc557600080fd5b505161155f565b60015490915084906001600160a01b03808416911614610ea3576001546040805163e6a4390560e01b81526001600160a01b039283166004820152918416602483015251600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b158015610c4f57600080fd5b505afa158015610c63573d6000803e3d6000fd5b505050506040513d6020811015610c7957600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b158015610cc457600080fd5b505afa158015610cd8573d6000803e3d6000fd5b505050506040513d6060811015610cee57600080fd5b50805160209182015160015460408051630dfe168160e01b815290516001600160701b0394851697509390921694506000805160206134418339815191529363054d50d4938d936001600160a01b03938416938a1692630dfe168192600480840193829003018186803b158015610d6457600080fd5b505afa158015610d78573d6000803e3d6000fd5b505050506040513d6020811015610d8e57600080fd5b50516001600160a01b031614610da45783610da6565b845b60015460408051630dfe168160e01b815290516001600160a01b03928316928a1691630dfe1681916004808301926020929190829003018186803b158015610ded57600080fd5b505afa158015610e01573d6000803e3d6000fd5b505050506040513d6020811015610e1757600080fd5b50516001600160a01b031614610e2d5785610e2f565b845b6040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015610e7157600080fd5b505afa158015610e85573d6000803e3d6000fd5b505050506040513d6020811015610e9b57600080fd5b505193505050505b600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610edf57600080fd5b505afa158015610ef3573d6000803e3d6000fd5b505050506040513d6060811015610f0957600080fd5b50805160209182015160408051630dfe168160e01b815290516001600160701b0393841696509290911693506001600160a01b038088169390891692630dfe1681926004808201939291829003018186803b158015610f6757600080fd5b505afa158015610f7b573d6000803e3d6000fd5b505050506040513d6020811015610f9157600080fd5b50516001600160a01b03161415611035576000610fae8385610a0d565b905061102883876001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fed57600080fd5b505afa158015611001573d6000803e3d6000fd5b505050506040513d602081101561101757600080fd5b50516110238785611519565b6106cf565b9650505050505050610a5f565b60006110418285610a0d565b905061102882876001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fed57600080fd5b611088610a79565b6110c7576040805162461bcd60e51b81526020600482018190526024820152600080516020613482833981519152604482015290519081900360640190fd5b6110d0816117c0565b50565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610a0790859061186b565b60008061113c8684878761155f565b9050600061114b878386611a23565b90506000806000735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f6001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156111c457600080fd5b505afa1580156111d8573d6000803e3d6000fd5b505050506040513d60208110156111ee57600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b15801561123957600080fd5b505afa15801561124d573d6000803e3d6000fd5b505050506040513d606081101561126357600080fd5b5080516020909101516001600160701b03918216935016905060006001600160a01b03888116908d1614156112d25761129c8388610a0d565b9050600081116112b4576112b187600261147f565b90505b6112bf888c83611a23565b94506112cb8782611519565b955061130e565b6112dc8288610a0d565b9050600081116112f4576112f187600261147f565b90505b6112ff888d83611a23565b955061130b8782611519565b94505b600061131d8f8e8e8a8a612b24565b60408051848152602081018a90528082018990526060810183905290519192507fb4d83dfeaedf5e8a56e75d022fb891aa25bfb861360f0e0db4106ec4e9910088919081900360800190a19e9d5050505050505050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261079490849061186b565b6000828201838110156106f1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261143557506000610a5f565b8282028284828161144257fe5b04146106f15760405162461bcd60e51b81526004018080602001828103825260218152602001806134616021913960400191505060405180910390fd5b60006106f183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612cef565b805b919050565b6000600382111561150b575080600160028204015b81811015611505578091506002818285816114f457fe5b0401816114fd57fe5b0490506114dd565b506114c3565b81156114c357506001919050565b60006106f183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612d91565b3390565b60006001600160a01b03851661157e576001546001600160a01b031694505b826001600160a01b0316856001600160a01b0316141561159f5750816117b8565b816001600160a01b0316856001600160a01b031614156115c05750806117b8565b6001546001600160a01b03848116911614806115e957506001546001600160a01b038381169116145b1561160057506001546001600160a01b03166117b8565b6040805163e6a4390560e01b81526001600160a01b038581166004830152841660248201529051600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b15801561166657600080fd5b505afa15801561167a573d6000803e3d6000fd5b505050506040513d602081101561169057600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b1580156116db57600080fd5b505afa1580156116ef573d6000803e3d6000fd5b505050506040513d606081101561170557600080fd5b5080516020909101516001600160701b03918216935016905060008082841061173d5782848161173157fe5b0491506001905061174a565b83838161174657fe5b0491505b60006117578b8b8b612deb565b905060006117668c8c8b612deb565b9050821561179557818482021061178657889750505050505050506117b8565b899750505050505050506117b8565b80848302106117ad57899750505050505050506117b8565b889750505050505050505b949350505050565b6001600160a01b0381166118055760405162461bcd60e51b815260040180806020018281038252602681526020018061341b6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b61187d826001600160a01b03166132ce565b6118ce576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061190c5780518252601f1990920191602091820191016118ed565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461196e576040519150601f19603f3d011682016040523d82523d6000602084013e611973565b606091505b5091509150816119ca576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610a07578080602001905160208110156119e657600080fd5b5051610a075760405162461bcd60e51b815260040180806020018281038252602a8152602001806134a2602a913960400191505060405180910390fd5b6000826001600160a01b0316846001600160a01b03161415611a465750806106f1565b6001600160a01b038416611d02576001546001600160a01b0384811691161415611adb57600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611aba57600080fd5b505af1158015611ace573d6000803e3d6000fd5b50505050508190506106f1565b6040805160028082526060808301845292602083019080368337505060015482519293506001600160a01b031691839150600090611b1557fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508381600181518110611b4357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000805160206134418339815191526001600160a01b0316637ff36ab58460018430600f60fc1b6040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611bf4578181015183820152602001611bdc565b50505050905001955050505050506000604051808303818588803b158015611c1b57600080fd5b505af1158015611c2f573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526020811015611c5957600080fd5b8101908080516040519392919084600160201b821115611c7857600080fd5b908301906020820185811115611c8d57600080fd5b82518660208202830111600160201b82111715611ca957600080fd5b82525081516020918201928201910280838360005b83811015611cd6578181015183820152602001611cbe565b50505050905001604052505050600182510381518110611cf257fe5b6020026020010151915050612a7f565b6001600160a01b038316611f2a576001546001600160a01b0385811691161415611d935760015460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015611d7357600080fd5b505af1158015611d87573d6000803e3d6000fd5b505050508190506106f1565b611db56001600160a01b03851660008051602061344183398151915284613307565b60408051600280825260608083018452926020830190803683370190505090508481600081518110611de357fe5b6001600160a01b0392831660209182029290920101526001805483519216918391908110611e0d57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000805160206134418339815191526001600160a01b03166318cbafe58460018430600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611ec4578181015183820152602001611eac565b505050509050019650505050505050600060405180830381600087803b158015611eed57600080fd5b505af1158015611f01573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611c5957600080fd5b611f4c6001600160a01b03851660008051602061344183398151915284613307565b6001546001600160a01b03858116911614612855576001546001600160a01b03848116911614612758576040805163e6a4390560e01b81526001600160a01b038681166004830152851660248201529051600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b158015611fdc57600080fd5b505afa158015611ff0573d6000803e3d6000fd5b505050506040513d602081101561200657600080fd5b5051604080516002808252606080830184529394509091602083019080368337019050509050858160008151811061203a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848160018151811061206857fe5b6001600160a01b0392831660209182029290920101526000908316156121f5576040805163d06ca61f60e01b815260048101878152602482019283528451604483015284516000805160206134418339815191529363d06ca61f938a938893909291606401906020808601910280838360005b838110156120f35781810151838201526020016120db565b50505050905001935050505060006040518083038186803b15801561211757600080fd5b505afa15801561212b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561215457600080fd5b8101908080516040519392919084600160201b82111561217357600080fd5b90830190602082018581111561218857600080fd5b82518660208202830111600160201b821117156121a457600080fd5b82525081516020918201928201910280838360005b838110156121d15781810151838201526020016121b9565b505050509050016040525050506001815181106121ea57fe5b602002602001015190505b60408051600380825260808201909252606091602082018380368337019050509050878160008151811061222557fe5b6001600160a01b039283166020918202929092010152600180548351921691839190811061224f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050868160028151811061227d57fe5b6001600160a01b039092166020928302919091018201526040805163d06ca61f60e01b815260048101898152602482019283528451604483015284516000946000805160206134418339815191529463d06ca61f948d948994909360649092019185810191028083838c5b838110156123005781810151838201526020016122e8565b50505050905001935050505060006040518083038186803b15801561232457600080fd5b505afa158015612338573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561236157600080fd5b8101908080516040519392919084600160201b82111561238057600080fd5b90830190602082018581111561239557600080fd5b82518660208202830111600160201b821117156123b157600080fd5b82525081516020918201928201910280838360005b838110156123de5781810151838201526020016123c6565b505050509050016040525050506002815181106123f757fe5b602002602001015190508083106125ad576000805160206134418339815191526001600160a01b03166338ed17398860018730600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561249f578181015183820152602001612487565b505050509050019650505050505050600060405180830381600087803b1580156124c857600080fd5b505af11580156124dc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561250557600080fd5b8101908080516040519392919084600160201b82111561252457600080fd5b90830190602082018581111561253957600080fd5b82518660208202830111600160201b8211171561255557600080fd5b82525081516020918201928201910280838360005b8381101561258257818101518382015260200161256a565b5050505090500160405250505060018551038151811061259e57fe5b6020026020010151955061274e565b6000805160206134418339815191526001600160a01b03166338ed17398860018530600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561264457818101518382015260200161262c565b505050509050019650505050505050600060405180830381600087803b15801561266d57600080fd5b505af1158015612681573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156126aa57600080fd5b8101908080516040519392919084600160201b8211156126c957600080fd5b9083019060208201858111156126de57600080fd5b82518660208202830111600160201b821117156126fa57600080fd5b82525081516020918201928201910280838360005b8381101561272757818101518382015260200161270f565b5050505090500160405250505060018351038151811061274357fe5b602002602001015195505b5050505050612850565b6040805160028082526060808301845292602083019080368337019050509050848160008151811061278657fe5b6001600160a01b03928316602091820292909201015260018054835192169183919081106127b057fe5b6001600160a01b039092166020928302919091018201526040516338ed173960e01b8152600481018581526001602483018190523060648401819052600f60fc1b6084850181905260a060448601908152875160a48701528751600080516020613441833981519152976338ed1739978c978b9695949093909260c490920191878101910280838360008315611ec4578181015183820152602001611eac565b612a7f565b6040805160028082526060808301845292602083019080368337505060015482519293506001600160a01b03169183915060009061288f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083816001815181106128bd57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000805160206134418339815191526001600160a01b03166338ed17398460018430600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561297457818101518382015260200161295c565b505050509050019650505050505050600060405180830381600087803b15801561299d57600080fd5b505af11580156129b1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156129da57600080fd5b8101908080516040519392919084600160201b8211156129f957600080fd5b908301906020820185811115612a0e57600080fd5b82518660208202830111600160201b82111715612a2a57600080fd5b82525081516020918201928201910280838360005b83811015612a57578181015183820152602001612a3f565b50505050905001604052505050600182510381518110612a7357fe5b60200260200101519150505b60008111612acc576040805162461bcd60e51b81526020600482015260156024820152744572726f72205377617070696e6720546f6b656e7360581b604482015290519081900360640190fd5b604080516001600160a01b038087168252851660208201528082018490526060810183905290517f0725a9530cc4b8e0087f91c12a04e2704c611d3604d8bab898d006e4adff79699181900360800190a19392505050565b6000612b486001600160a01b03861660008051602061344183398151915285613307565b612b6a6001600160a01b03851660008051602061344183398151915284613307565b6040805162e8e33760e81b81526001600160a01b03878116600483015286166024820152604481018590526064810184905260016084820181905260a48201523060c4820152600f60fc1b60e48201529051600091829182916000805160206134418339815191529163e8e33700916101048082019260609290919082900301818787803b158015612bfb57600080fd5b505af1158015612c0f573d6000803e3d6000fd5b505050506040513d6060811015612c2557600080fd5b50805160208201516040909201519094509092509050612c5e6001600160a01b0389166000805160206134418339815191526000613307565b612c816001600160a01b0388166000805160206134418339815191526000613307565b6000612c8d8785611519565b1115612cb257612cb289612ca18886611519565b6001600160a01b038b16919061137a565b6000612cbe8684611519565b1115612ce357612ce389612cd28785611519565b6001600160a01b038a16919061137a565b98975050505050505050565b60008183612d7b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d40578181015183820152602001612d28565b50505050905090810190601f168015612d6d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612d8757fe5b0495945050505050565b60008184841115612de35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612d40578181015183820152602001612d28565b505050900390565b6040805163e6a4390560e01b81526001600160a01b0385811660048301528316602482015290516000918291735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a43905916044808301926020929190829003018186803b158015612e5257600080fd5b505afa158015612e66573d6000803e3d6000fd5b505050506040513d6020811015612e7c57600080fd5b5051905060006001600160a01b038216156130725760408051600280825260608083018452926020830190803683370190505090508681600081518110612ebf57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508481600181518110612eed57fe5b6001600160a01b039092166020928302919091018201526040805163d06ca61f60e01b815260048101898152602482019283528451604483015284516000805160206134418339815191529463d06ca61f948c948894939192606490910191858201910280838360005b83811015612f6f578181015183820152602001612f57565b50505050905001935050505060006040518083038186803b158015612f9357600080fd5b505afa158015612fa7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612fd057600080fd5b8101908080516040519392919084600160201b821115612fef57600080fd5b90830190602082018581111561300457600080fd5b82518660208202830111600160201b8211171561302057600080fd5b82525081516020918201928201910280838360005b8381101561304d578181015183820152602001613035565b5050505090500160405250505060018151811061306657fe5b60200260200101519150505b6001546000906001600160a01b038881169116148015906130a157506001546001600160a01b03868116911614155b156132b3576040805160038082526080820190925260609160208201838036833701905050905087816000815181106130d657fe5b6001600160a01b039283166020918202929092010152600180548351921691839190811061310057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858160028151811061312e57fe5b6001600160a01b039092166020928302919091018201526040805163d06ca61f60e01b8152600481018a8152602482019283528451604483015284516000805160206134418339815191529463d06ca61f948d948894939192606490910191858201910280838360005b838110156131b0578181015183820152602001613198565b50505050905001935050505060006040518083038186803b1580156131d457600080fd5b505afa1580156131e8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561321157600080fd5b8101908080516040519392919084600160201b82111561323057600080fd5b90830190602082018581111561324557600080fd5b82518660208202830111600160201b8211171561326157600080fd5b82525081516020918201928201910280838360005b8381101561328e578181015183820152602001613276565b505050509050016040525050506002815181106132a757fe5b60200260200101519150505b8082106132c4575091506106f19050565b92506106f1915050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906117b8575050151592915050565b80158061338d575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561335f57600080fd5b505afa158015613373573d6000803e3d6000fd5b505050506040513d602081101561338957600080fd5b5051155b6133c85760405162461bcd60e51b81526004018080602001828103825260368152602001806134cc6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261079490849061186b56fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573730000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220631c8f4343265e1efed4521286cb5403ecb28cf7b39d44e7479c0665d03ef81d64736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106100e85760003560e01c806386ebfd531161008a578063b2bdfa7b11610059578063b2bdfa7b146102c0578063ba6b2c38146102d5578063edd9741014610314578063f2fde38b1461034d576100e8565b806386ebfd531461021e5780638d7e41a81461024a5780638da5cb5b1461027a5780638f32d59b146102ab576100e8565b80633ccfd60b116100c65780633ccfd60b14610198578063551196d5146101ad578063715018a6146101e057806375f12b21146101f5576100e8565b80631385d24c146100ed5780631d5723201461010457806334b5ef6514610162575b600080fd5b3480156100f957600080fd5b50610102610380565b005b610150600480360360c081101561011a57600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a001356103e8565b60408051918252519081900360200190f35b34801561016e57600080fd5b506101506004803603606081101561018557600080fd5b50803590602081013590604001356106cf565b3480156101a457600080fd5b506101026106f8565b3480156101b957600080fd5b50610102600480360360208110156101d057600080fd5b50356001600160a01b0316610799565b3480156101ec57600080fd5b5061010261087d565b34801561020157600080fd5b5061020a610913565b604080519115158252519081900360200190f35b6101026004803603604081101561023457600080fd5b506001600160a01b038135169060200135610923565b34801561025657600080fd5b506101506004803603604081101561026d57600080fd5b5080359060200135610a0d565b34801561028657600080fd5b5061028f610a65565b604080516001600160a01b039092168252519081900360200190f35b3480156102b757600080fd5b5061020a610a79565b3480156102cc57600080fd5b5061028f610aa2565b3480156102e157600080fd5b50610150600480360360608110156102f857600080fd5b506001600160a01b038135169060208101359060400135610ab6565b34801561032057600080fd5b506101506004803603604081101561033757600080fd5b506001600160a01b038135169060200135610ae8565b34801561035957600080fd5b506101026004803603602081101561037057600080fd5b50356001600160a01b0316611080565b610388610a79565b6103c7576040805162461bcd60e51b81526020600482018190526024820152600080516020613482833981519152604482015290519081900360640190fd5b6000805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6000805460ff16610440576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff191690819055600160a81b900460ff161561049d576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b60006001600160a01b0387166104ff57600034116104f8576040805162461bcd60e51b8152602060048201526013602482015272115c9c9bdc8e88115512081b9bdd081cd95b9d606a1b604482015290519081900360640190fd5b50346105b1565b3415610544576040805162461bcd60e51b815260206004820152600f60248201526e115c9c9bdc8e88115512081cd95b9d608a1b604482015290519081900360640190fd5b60008411610599576040805162461bcd60e51b815260206004820152601960248201527f4572726f723a20496e76616c69642045524320616d6f756e7400000000000000604482015290519081900360640190fd5b6105ae6001600160a01b0388163330876110d3565b50825b60006105c0898989898661112d565b90508381101561060c576040805162461bcd60e51b81526020600482015260126024820152714552523a204869676820536c69707061676560701b604482015290519081900360640190fd5b6040805163e6a4390560e01b81526001600160a01b038981166004830152881660248201529051600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b15801561067257600080fd5b505afa158015610686573d6000803e3d6000fd5b505050506040513d602081101561069c57600080fd5b505190506106b46001600160a01b0382168b8461137a565b509150506000805460ff191660011790559695505050505050565b60006106ee6106de85846113cc565b6106e88585611426565b9061147f565b90505b9392505050565b610700610a79565b61073f576040805162461bcd60e51b81526020600482018190526024820152600080516020613482833981519152604482015290519081900360640190fd5b47600061075b61074d610a65565b6001600160a01b03166114c1565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610794573d6000803e3d6000fd5b505050565b6107a1610a79565b6107e0576040805162461bcd60e51b81526020600482018190526024820152600080516020613482833981519152604482015290519081900360640190fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561082f57600080fd5b505afa158015610843573d6000803e3d6000fd5b505050506040513d602081101561085957600080fd5b50519050610879610868610a65565b6001600160a01b038416908361137a565b5050565b610885610a79565b6108c4576040805162461bcd60e51b81526020600482018190526024820152600080516020613482833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b600054600160a81b900460ff1681565b6000829050610a07336000836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561096757600080fd5b505afa15801561097b573d6000803e3d6000fd5b505050506040513d602081101561099157600080fd5b50516040805163d21220a760e01b815290516001600160a01b0387169163d21220a7916004808301926020929190829003018186803b1580156109d357600080fd5b505afa1580156109e7573d6000803e3d6000fd5b505050506040513d60208110156109fd57600080fd5b50516000876103e8565b50505050565b60006107ca610a54610a21856107cd611426565b610a4e610a49610a3488623cda29611426565b610a4188623cda20611426565b899101611426565b6114c8565b90611519565b81610a5b57fe5b0490505b92915050565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b0316610a9361155b565b6001600160a01b031614905090565b60005461010090046001600160a01b031681565b600080610ac38585610ae8565b9050610adf610ad86127106106e88487611426565b8290611519565b95945050505050565b6000808390506000610bcc600085846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610b2f57600080fd5b505afa158015610b43573d6000803e3d6000fd5b505050506040513d6020811015610b5957600080fd5b50516040805163d21220a760e01b815290516001600160a01b0388169163d21220a7916004808301926020929190829003018186803b158015610b9b57600080fd5b505afa158015610baf573d6000803e3d6000fd5b505050506040513d6020811015610bc557600080fd5b505161155f565b60015490915084906001600160a01b03808416911614610ea3576001546040805163e6a4390560e01b81526001600160a01b039283166004820152918416602483015251600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b158015610c4f57600080fd5b505afa158015610c63573d6000803e3d6000fd5b505050506040513d6020811015610c7957600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b158015610cc457600080fd5b505afa158015610cd8573d6000803e3d6000fd5b505050506040513d6060811015610cee57600080fd5b50805160209182015160015460408051630dfe168160e01b815290516001600160701b0394851697509390921694506000805160206134418339815191529363054d50d4938d936001600160a01b03938416938a1692630dfe168192600480840193829003018186803b158015610d6457600080fd5b505afa158015610d78573d6000803e3d6000fd5b505050506040513d6020811015610d8e57600080fd5b50516001600160a01b031614610da45783610da6565b845b60015460408051630dfe168160e01b815290516001600160a01b03928316928a1691630dfe1681916004808301926020929190829003018186803b158015610ded57600080fd5b505afa158015610e01573d6000803e3d6000fd5b505050506040513d6020811015610e1757600080fd5b50516001600160a01b031614610e2d5785610e2f565b845b6040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015610e7157600080fd5b505afa158015610e85573d6000803e3d6000fd5b505050506040513d6020811015610e9b57600080fd5b505193505050505b600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610edf57600080fd5b505afa158015610ef3573d6000803e3d6000fd5b505050506040513d6060811015610f0957600080fd5b50805160209182015160408051630dfe168160e01b815290516001600160701b0393841696509290911693506001600160a01b038088169390891692630dfe1681926004808201939291829003018186803b158015610f6757600080fd5b505afa158015610f7b573d6000803e3d6000fd5b505050506040513d6020811015610f9157600080fd5b50516001600160a01b03161415611035576000610fae8385610a0d565b905061102883876001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fed57600080fd5b505afa158015611001573d6000803e3d6000fd5b505050506040513d602081101561101757600080fd5b50516110238785611519565b6106cf565b9650505050505050610a5f565b60006110418285610a0d565b905061102882876001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fed57600080fd5b611088610a79565b6110c7576040805162461bcd60e51b81526020600482018190526024820152600080516020613482833981519152604482015290519081900360640190fd5b6110d0816117c0565b50565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610a0790859061186b565b60008061113c8684878761155f565b9050600061114b878386611a23565b90506000806000735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f6001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156111c457600080fd5b505afa1580156111d8573d6000803e3d6000fd5b505050506040513d60208110156111ee57600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b15801561123957600080fd5b505afa15801561124d573d6000803e3d6000fd5b505050506040513d606081101561126357600080fd5b5080516020909101516001600160701b03918216935016905060006001600160a01b03888116908d1614156112d25761129c8388610a0d565b9050600081116112b4576112b187600261147f565b90505b6112bf888c83611a23565b94506112cb8782611519565b955061130e565b6112dc8288610a0d565b9050600081116112f4576112f187600261147f565b90505b6112ff888d83611a23565b955061130b8782611519565b94505b600061131d8f8e8e8a8a612b24565b60408051848152602081018a90528082018990526060810183905290519192507fb4d83dfeaedf5e8a56e75d022fb891aa25bfb861360f0e0db4106ec4e9910088919081900360800190a19e9d5050505050505050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261079490849061186b565b6000828201838110156106f1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261143557506000610a5f565b8282028284828161144257fe5b04146106f15760405162461bcd60e51b81526004018080602001828103825260218152602001806134616021913960400191505060405180910390fd5b60006106f183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612cef565b805b919050565b6000600382111561150b575080600160028204015b81811015611505578091506002818285816114f457fe5b0401816114fd57fe5b0490506114dd565b506114c3565b81156114c357506001919050565b60006106f183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612d91565b3390565b60006001600160a01b03851661157e576001546001600160a01b031694505b826001600160a01b0316856001600160a01b0316141561159f5750816117b8565b816001600160a01b0316856001600160a01b031614156115c05750806117b8565b6001546001600160a01b03848116911614806115e957506001546001600160a01b038381169116145b1561160057506001546001600160a01b03166117b8565b6040805163e6a4390560e01b81526001600160a01b038581166004830152841660248201529051600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b15801561166657600080fd5b505afa15801561167a573d6000803e3d6000fd5b505050506040513d602081101561169057600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b1580156116db57600080fd5b505afa1580156116ef573d6000803e3d6000fd5b505050506040513d606081101561170557600080fd5b5080516020909101516001600160701b03918216935016905060008082841061173d5782848161173157fe5b0491506001905061174a565b83838161174657fe5b0491505b60006117578b8b8b612deb565b905060006117668c8c8b612deb565b9050821561179557818482021061178657889750505050505050506117b8565b899750505050505050506117b8565b80848302106117ad57899750505050505050506117b8565b889750505050505050505b949350505050565b6001600160a01b0381166118055760405162461bcd60e51b815260040180806020018281038252602681526020018061341b6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b61187d826001600160a01b03166132ce565b6118ce576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061190c5780518252601f1990920191602091820191016118ed565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461196e576040519150601f19603f3d011682016040523d82523d6000602084013e611973565b606091505b5091509150816119ca576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610a07578080602001905160208110156119e657600080fd5b5051610a075760405162461bcd60e51b815260040180806020018281038252602a8152602001806134a2602a913960400191505060405180910390fd5b6000826001600160a01b0316846001600160a01b03161415611a465750806106f1565b6001600160a01b038416611d02576001546001600160a01b0384811691161415611adb57600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611aba57600080fd5b505af1158015611ace573d6000803e3d6000fd5b50505050508190506106f1565b6040805160028082526060808301845292602083019080368337505060015482519293506001600160a01b031691839150600090611b1557fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508381600181518110611b4357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000805160206134418339815191526001600160a01b0316637ff36ab58460018430600f60fc1b6040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611bf4578181015183820152602001611bdc565b50505050905001955050505050506000604051808303818588803b158015611c1b57600080fd5b505af1158015611c2f573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526020811015611c5957600080fd5b8101908080516040519392919084600160201b821115611c7857600080fd5b908301906020820185811115611c8d57600080fd5b82518660208202830111600160201b82111715611ca957600080fd5b82525081516020918201928201910280838360005b83811015611cd6578181015183820152602001611cbe565b50505050905001604052505050600182510381518110611cf257fe5b6020026020010151915050612a7f565b6001600160a01b038316611f2a576001546001600160a01b0385811691161415611d935760015460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015611d7357600080fd5b505af1158015611d87573d6000803e3d6000fd5b505050508190506106f1565b611db56001600160a01b03851660008051602061344183398151915284613307565b60408051600280825260608083018452926020830190803683370190505090508481600081518110611de357fe5b6001600160a01b0392831660209182029290920101526001805483519216918391908110611e0d57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000805160206134418339815191526001600160a01b03166318cbafe58460018430600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611ec4578181015183820152602001611eac565b505050509050019650505050505050600060405180830381600087803b158015611eed57600080fd5b505af1158015611f01573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611c5957600080fd5b611f4c6001600160a01b03851660008051602061344183398151915284613307565b6001546001600160a01b03858116911614612855576001546001600160a01b03848116911614612758576040805163e6a4390560e01b81526001600160a01b038681166004830152851660248201529051600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b158015611fdc57600080fd5b505afa158015611ff0573d6000803e3d6000fd5b505050506040513d602081101561200657600080fd5b5051604080516002808252606080830184529394509091602083019080368337019050509050858160008151811061203a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848160018151811061206857fe5b6001600160a01b0392831660209182029290920101526000908316156121f5576040805163d06ca61f60e01b815260048101878152602482019283528451604483015284516000805160206134418339815191529363d06ca61f938a938893909291606401906020808601910280838360005b838110156120f35781810151838201526020016120db565b50505050905001935050505060006040518083038186803b15801561211757600080fd5b505afa15801561212b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561215457600080fd5b8101908080516040519392919084600160201b82111561217357600080fd5b90830190602082018581111561218857600080fd5b82518660208202830111600160201b821117156121a457600080fd5b82525081516020918201928201910280838360005b838110156121d15781810151838201526020016121b9565b505050509050016040525050506001815181106121ea57fe5b602002602001015190505b60408051600380825260808201909252606091602082018380368337019050509050878160008151811061222557fe5b6001600160a01b039283166020918202929092010152600180548351921691839190811061224f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050868160028151811061227d57fe5b6001600160a01b039092166020928302919091018201526040805163d06ca61f60e01b815260048101898152602482019283528451604483015284516000946000805160206134418339815191529463d06ca61f948d948994909360649092019185810191028083838c5b838110156123005781810151838201526020016122e8565b50505050905001935050505060006040518083038186803b15801561232457600080fd5b505afa158015612338573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561236157600080fd5b8101908080516040519392919084600160201b82111561238057600080fd5b90830190602082018581111561239557600080fd5b82518660208202830111600160201b821117156123b157600080fd5b82525081516020918201928201910280838360005b838110156123de5781810151838201526020016123c6565b505050509050016040525050506002815181106123f757fe5b602002602001015190508083106125ad576000805160206134418339815191526001600160a01b03166338ed17398860018730600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561249f578181015183820152602001612487565b505050509050019650505050505050600060405180830381600087803b1580156124c857600080fd5b505af11580156124dc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561250557600080fd5b8101908080516040519392919084600160201b82111561252457600080fd5b90830190602082018581111561253957600080fd5b82518660208202830111600160201b8211171561255557600080fd5b82525081516020918201928201910280838360005b8381101561258257818101518382015260200161256a565b5050505090500160405250505060018551038151811061259e57fe5b6020026020010151955061274e565b6000805160206134418339815191526001600160a01b03166338ed17398860018530600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561264457818101518382015260200161262c565b505050509050019650505050505050600060405180830381600087803b15801561266d57600080fd5b505af1158015612681573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156126aa57600080fd5b8101908080516040519392919084600160201b8211156126c957600080fd5b9083019060208201858111156126de57600080fd5b82518660208202830111600160201b821117156126fa57600080fd5b82525081516020918201928201910280838360005b8381101561272757818101518382015260200161270f565b5050505090500160405250505060018351038151811061274357fe5b602002602001015195505b5050505050612850565b6040805160028082526060808301845292602083019080368337019050509050848160008151811061278657fe5b6001600160a01b03928316602091820292909201015260018054835192169183919081106127b057fe5b6001600160a01b039092166020928302919091018201526040516338ed173960e01b8152600481018581526001602483018190523060648401819052600f60fc1b6084850181905260a060448601908152875160a48701528751600080516020613441833981519152976338ed1739978c978b9695949093909260c490920191878101910280838360008315611ec4578181015183820152602001611eac565b612a7f565b6040805160028082526060808301845292602083019080368337505060015482519293506001600160a01b03169183915060009061288f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083816001815181106128bd57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000805160206134418339815191526001600160a01b03166338ed17398460018430600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561297457818101518382015260200161295c565b505050509050019650505050505050600060405180830381600087803b15801561299d57600080fd5b505af11580156129b1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156129da57600080fd5b8101908080516040519392919084600160201b8211156129f957600080fd5b908301906020820185811115612a0e57600080fd5b82518660208202830111600160201b82111715612a2a57600080fd5b82525081516020918201928201910280838360005b83811015612a57578181015183820152602001612a3f565b50505050905001604052505050600182510381518110612a7357fe5b60200260200101519150505b60008111612acc576040805162461bcd60e51b81526020600482015260156024820152744572726f72205377617070696e6720546f6b656e7360581b604482015290519081900360640190fd5b604080516001600160a01b038087168252851660208201528082018490526060810183905290517f0725a9530cc4b8e0087f91c12a04e2704c611d3604d8bab898d006e4adff79699181900360800190a19392505050565b6000612b486001600160a01b03861660008051602061344183398151915285613307565b612b6a6001600160a01b03851660008051602061344183398151915284613307565b6040805162e8e33760e81b81526001600160a01b03878116600483015286166024820152604481018590526064810184905260016084820181905260a48201523060c4820152600f60fc1b60e48201529051600091829182916000805160206134418339815191529163e8e33700916101048082019260609290919082900301818787803b158015612bfb57600080fd5b505af1158015612c0f573d6000803e3d6000fd5b505050506040513d6060811015612c2557600080fd5b50805160208201516040909201519094509092509050612c5e6001600160a01b0389166000805160206134418339815191526000613307565b612c816001600160a01b0388166000805160206134418339815191526000613307565b6000612c8d8785611519565b1115612cb257612cb289612ca18886611519565b6001600160a01b038b16919061137a565b6000612cbe8684611519565b1115612ce357612ce389612cd28785611519565b6001600160a01b038a16919061137a565b98975050505050505050565b60008183612d7b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d40578181015183820152602001612d28565b50505050905090810190601f168015612d6d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612d8757fe5b0495945050505050565b60008184841115612de35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612d40578181015183820152602001612d28565b505050900390565b6040805163e6a4390560e01b81526001600160a01b0385811660048301528316602482015290516000918291735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a43905916044808301926020929190829003018186803b158015612e5257600080fd5b505afa158015612e66573d6000803e3d6000fd5b505050506040513d6020811015612e7c57600080fd5b5051905060006001600160a01b038216156130725760408051600280825260608083018452926020830190803683370190505090508681600081518110612ebf57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508481600181518110612eed57fe5b6001600160a01b039092166020928302919091018201526040805163d06ca61f60e01b815260048101898152602482019283528451604483015284516000805160206134418339815191529463d06ca61f948c948894939192606490910191858201910280838360005b83811015612f6f578181015183820152602001612f57565b50505050905001935050505060006040518083038186803b158015612f9357600080fd5b505afa158015612fa7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612fd057600080fd5b8101908080516040519392919084600160201b821115612fef57600080fd5b90830190602082018581111561300457600080fd5b82518660208202830111600160201b8211171561302057600080fd5b82525081516020918201928201910280838360005b8381101561304d578181015183820152602001613035565b5050505090500160405250505060018151811061306657fe5b60200260200101519150505b6001546000906001600160a01b038881169116148015906130a157506001546001600160a01b03868116911614155b156132b3576040805160038082526080820190925260609160208201838036833701905050905087816000815181106130d657fe5b6001600160a01b039283166020918202929092010152600180548351921691839190811061310057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858160028151811061312e57fe5b6001600160a01b039092166020928302919091018201526040805163d06ca61f60e01b8152600481018a8152602482019283528451604483015284516000805160206134418339815191529463d06ca61f948d948894939192606490910191858201910280838360005b838110156131b0578181015183820152602001613198565b50505050905001935050505060006040518083038186803b1580156131d457600080fd5b505afa1580156131e8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561321157600080fd5b8101908080516040519392919084600160201b82111561323057600080fd5b90830190602082018581111561324557600080fd5b82518660208202830111600160201b8211171561326157600080fd5b82525081516020918201928201910280838360005b8381101561328e578181015183820152602001613276565b505050509050016040525050506002815181106132a757fe5b60200260200101519150505b8082106132c4575091506106f19050565b92506106f1915050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906117b8575050151592915050565b80158061338d575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561335f57600080fd5b505afa158015613373573d6000803e3d6000fd5b505050506040513d602081101561338957600080fd5b5051155b6133c85760405162461bcd60e51b81526004018080602001828103825260368152602001806134cc6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261079490849061186b56fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573730000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220631c8f4343265e1efed4521286cb5403ecb28cf7b39d44e7479c0665d03ef81d64736f6c634300060c0033
Deployed Bytecode Sourcemap
29193:18428:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47265:86;;;;;;;;;;;;;:::i;:::-;;30620:1417;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30620:1417:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;41066:179;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41066:179:0;;;;;;;;;;;;:::i;47421:195::-;;;;;;;;;;;;;:::i;47034:191::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47034:191:0;-1:-1:-1;;;;;47034:191:0;;:::i;21674:140::-;;;;;;;;;;;;;:::i;29351:27::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;38841:329;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38841:329:0;;;;;;;;:::i;41253:343::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41253:343:0;;;;;;;:::i;20863:79::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;20863:79:0;;;;;;;;;;;;;;21229:94;;;;;;;;;;;;;:::i;20358:29::-;;;;;;;;;;;;;:::i;39368:263::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39368:263:0;;;;;;;;;;;;;:::i;39639:1419::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39639:1419:0;;;;;;;;:::i;21969:117::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21969:117:0;-1:-1:-1;;;;;21969:117:0;;:::i;47265:86::-;21075:9;:7;:9::i;:::-;21067:54;;;;;-1:-1:-1;;;21067:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21067:54:0;;;;;;;;;;;;;;;47336:7:::1;::::0;;-1:-1:-1;;;;47325:18:0;::::1;-1:-1:-1::0;;;47336:7:0;;;::::1;;;47335:8;47325:18:::0;;::::1;;::::0;;47265:86::o;30620:1417::-;30901:7;18498:11;;;;18490:55;;;;;-1:-1:-1;;;18490:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18637:5;18623:19;;-1:-1:-1;;18623:19:0;;;;;-1:-1:-1;;;30011:7:0;::::1;18623:19:::0;30011:7:::1;30007:102;;;30035:28;::::0;;-1:-1:-1;;;30035:28:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30035:28:0;;;;;;;;;;;;;::::1;30007:102;30921:16:::2;-1:-1:-1::0;;;;;30952:39:0;::::2;30948:491;;31028:1;31016:9;:13;31008:45;;;::::0;;-1:-1:-1;;;31008:45:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;31008:45:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;31079:9:0::2;30948:491;;;31129:9;:14:::0;31121:42:::2;;;::::0;;-1:-1:-1;;;31121:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;31121:42:0;;;;;;;;;;;;;::::2;;31196:1;31186:7;:11;31178:49;;;::::0;;-1:-1:-1;;;31178:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;31242:152;-1:-1:-1::0;;;;;31242:50:0;::::2;31311:10;31348:4;31372:7:::0;31242:50:::2;:152::i;:::-;-1:-1:-1::0;31420:7:0;30948:491:::2;31451:16;31470:178;31498:14;31527:25;31567:16;31598;31629:8;31470:13;:178::i;:::-;31451:197;;31679:14;31667:8;:26;;31659:57;;;::::0;;-1:-1:-1;;;31659:57:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;31659:57:0;;;;;;;;;;;;;::::2;;31785:104;::::0;;-1:-1:-1;;;31785:104:0;;-1:-1:-1;;;;;31785:104:0;;::::2;;::::0;::::2;::::0;;::::2;::::0;;;;;;31757:25:::2;::::0;29624:42:::2;::::0;31785:31:::2;::::0;:104;;;;;::::2;::::0;;;;;;;;;29624:42;31785:104;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;31785:104:0;;-1:-1:-1;31902:101:0::2;-1:-1:-1::0;;;;;31902:38:0;::::2;31955:14:::0;31984:8;31902:38:::2;:101::i;:::-;-1:-1:-1::0;32021:8:0;-1:-1:-1;;18803:11:0;:18;;-1:-1:-1;;18803:18:0;18817:4;18803:18;;;30620:1417;;-1:-1:-1;;;;;;30620:1417:0:o;41066:179::-;41165:7;41189:48;41217:19;:7;41229:6;41217:11;:19::i;:::-;41189:23;:11;41205:6;41189:15;:23::i;:::-;:27;;:48::i;:::-;41182:55;;41066:179;;;;;;:::o;47421:195::-;21075:9;:7;:9::i;:::-;21067:54;;;;;-1:-1:-1;;;21067:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21067:54:0;;;;;;;;;;;;;;;47495:21:::1;47469:23;47549:19;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;47549:17:0::1;;:19::i;:::-;47579:29;::::0;47527:41;;-1:-1:-1;;;;;;47579:12:0;::::1;::::0;:29;::::1;;;::::0;47592:15;;47579:29:::1;::::0;;;47592:15;47579:12;:29;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;21132:1;;47421:195::o:0;47034:191::-;21075:9;:7;:9::i;:::-;21067:54;;;;;-1:-1:-1;;;21067:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21067:54:0;;;;;;;;;;;;;;;47114:11:::1;47128:13;-1:-1:-1::0;;;;;47128:23:0::1;;47160:4;47128:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;47128:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47128:38:0;;-1:-1:-1;47177:40:0::1;47204:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;47177:26:0;::::1;::::0;47213:3;47177:26:::1;:40::i;:::-;21132:1;47034:191:::0;:::o;21674:140::-;21075:9;:7;:9::i;:::-;21067:54;;;;;-1:-1:-1;;;21067:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21067:54:0;;;;;;;;;;;;;;;21773:1:::1;21757:6:::0;;21736:40:::1;::::0;21757:6:::1;::::0;;::::1;-1:-1:-1::0;;;;;21757:6:0::1;::::0;21736:40:::1;::::0;21773:1;;21736:40:::1;21804:1;21787:19:::0;;-1:-1:-1;;;;;;21787:19:0::1;::::0;;21674:140::o;29351:27::-;;;-1:-1:-1;;;29351:27:0;;;;;:::o;38841:329::-;38951:19;38988:11;38951:49;;39009:153;39027:10;39058:1;39073:4;-1:-1:-1;;;;;39073:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39073:13:0;39099;;;-1:-1:-1;;;39099:13:0;;;;-1:-1:-1;;;;;39099:11:0;;;;;:13;;;;;39073;;39099;;;;;;;:11;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39099:13:0;39125:1;39139:14;39009:5;:153::i;:::-;;38841:329;;;:::o;41253:343::-;41367:7;41584:4;41412:169;41561:19;:9;41575:4;41561:13;:19::i;:::-;41412:126;41464:59;41500:22;:9;41514:7;41500:13;:22::i;:::-;41478:19;:6;41489:7;41478:10;:19::i;:::-;41464:9;;41478:44;41464:13;:59::i;:::-;41412:33;:126::i;:::-;:148;;:169::i;:::-;:176;;;;;;41392:196;;41253:343;;;;;:::o;20863:79::-;20901:7;20928:6;;;;-1:-1:-1;;;;;20928:6:0;;20863:79::o;21229:94::-;21269:4;21309:6;;;;;-1:-1:-1;;;;;21309:6:0;21293:12;:10;:12::i;:::-;-1:-1:-1;;;;;21293:22:0;;21286:29;;21229:94;:::o;20358:29::-;;;;;;-1:-1:-1;;;;;20358:29:0;;:::o;39368:263::-;39489:7;39506:17;39524:33;39543:5;39549:7;39524:18;:33::i;:::-;39506:51;-1:-1:-1;39573:50:0;39587:35;39616:5;39587:24;39506:51;39601:9;39587:13;:24::i;:35::-;39573:9;;:13;:50::i;:::-;39566:57;39368:263;-1:-1:-1;;;;;39368:263:0:o;39639:1419::-;39730:7;39747:19;39796:5;39747:132;;39890:20;39913:120;39950:1;39965:7;39985:4;-1:-1:-1;;;;;39985:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39985:13:0;40011;;;-1:-1:-1;;;40011:13:0;;;;-1:-1:-1;;;;;40011:11:0;;;;;:13;;;;;39985;;40011;;;;;;;:11;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40011:13:0;39913:16;:120::i;:::-;40099:16;;39890:143;;-1:-1:-1;40064:7:0;;-1:-1:-1;;;;;40083:32:0;;;40099:16;;40083:32;40080:478;;40218:16;;40186:63;;;-1:-1:-1;;;40186:63:0;;-1:-1:-1;;;;;40218:16:0;;;40186:63;;;;;;;;;;;;40127:27;;29624:42;;40186:31;;:63;;;;;;;;;;;;;;;29624:42;40186:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40186:63:0;40306:26;;;-1:-1:-1;;;40306:26:0;;;;40186:63;;-1:-1:-1;40272:13:0;;;;-1:-1:-1;;;;;40306:24:0;;;;;:26;;;;;;;;;;;;;;;:24;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40306:26:0;;;;;;;40437:16;;40306:26;40414:21;;-1:-1:-1;;;40414:21:0;;;;-1:-1:-1;;;;;40271:61:0;;;;-1:-1:-1;40271:61:0;;;;;-1:-1:-1;;;;;;;;;;;;29468:42:0;40355:26;;40394:7;;-1:-1:-1;;;;;40437:16:0;;;;40414:19;;;;;:21;;;;;;;;;;:19;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40414:21:0;-1:-1:-1;;;;;40414:39:0;;:55;;40464:5;40414:55;;;40456:5;40414:55;40505:16;;40482:21;;;-1:-1:-1;;;40482:21:0;;;;-1:-1:-1;;;;;40505:16:0;;;;40482:19;;;;;:21;;;;;;;;;;;;;;:19;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40482:21:0;-1:-1:-1;;;;;40482:39:0;;:55;;40532:5;40482:55;;;40524:5;40482:55;40355:193;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40355:193:0;;-1:-1:-1;;;;40080:478:0;40569:12;40583;40601:4;-1:-1:-1;;;;;40601:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40601:18:0;;;;;;;;40633:13;;-1:-1:-1;;;40633:13:0;;;;-1:-1:-1;;;;;40568:51:0;;;;-1:-1:-1;40568:51:0;;;;;-1:-1:-1;;;;;;40633:27:0;;;;:11;;;;;;:13;;;;;40601:18;40633:13;;;;;;:11;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40633:13:0;-1:-1:-1;;;;;40633:27:0;;40630:421;;;40672:20;40693:40;40715:4;40721:11;40693:21;:40::i;:::-;40672:61;;40751:89;40769:4;40789;-1:-1:-1;;;;;40774:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40774:35:0;40810:29;:11;40826:12;40810:15;:29::i;:::-;40751:17;:89::i;:::-;40744:96;;;;;;;;;;40630:421;40873:20;40894:40;40916:4;40922:11;40894:21;:40::i;:::-;40873:61;;40952:89;40970:4;40990;-1:-1:-1;;;;;40975:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21969:117;21075:9;:7;:9::i;:::-;21067:54;;;;;-1:-1:-1;;;21067:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21067:54:0;;;;;;;;;;;;;;;22050:28:::1;22069:8;22050:18;:28::i;:::-;21969:117:::0;:::o;13234:284::-;13431:68;;;-1:-1:-1;;;;;13431:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13431:68:0;-1:-1:-1;;;13431:68:0;;;13378:132;;13411:5;;13378:18;:132::i;32142:2110::-;32363:7;32383:20;32406:151;32437:25;32477:7;32499:16;32530;32406;:151::i;:::-;32383:174;;32603:16;32622:112;32649:25;32689:12;32716:7;32622:12;:112::i;:::-;32603:131;;32785:20;32816;32849:19;29624:42;-1:-1:-1;;;;;32900:31:0;;32932:16;32950;32900:67;;;;;;;;;;;;;-1:-1:-1;;;;;32900:67:0;;;;;;-1:-1:-1;;;;;32900:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32900:67:0;33022:18;;;-1:-1:-1;;;33022:18:0;;;;32900:67;;-1:-1:-1;32990:12:0;;;;-1:-1:-1;;;;;33022:16:0;;;;;:18;;;;;;;;;;;;;;;:16;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33022:18:0;;;;;;;-1:-1:-1;;;;;32989:51:0;;;;-1:-1:-1;32989:51:0;;-1:-1:-1;33051:20:0;-1:-1:-1;;;;;33086:32:0;;;;;;;33082:866;;;33150:37;33172:4;33178:8;33150:21;:37::i;:::-;33135:52;;33276:1;33260:12;:17;33256:53;;33294:15;:8;33307:1;33294:12;:15::i;:::-;33279:30;;33256:53;33339:124;33370:12;33401:16;33436:12;33339;:124::i;:::-;33324:139;-1:-1:-1;33493:26:0;:8;33506:12;33493;:26::i;:::-;33478:41;;33082:866;;;33567:37;33589:4;33595:8;33567:21;:37::i;:::-;33552:52;;33693:1;33677:12;:17;33673:53;;33711:15;:8;33724:1;33711:12;:15::i;:::-;33696:30;;33673:53;33756:124;33787:12;33818:16;33853:12;33756;:124::i;:::-;33741:139;-1:-1:-1;33910:26:0;:8;33923:12;33910;:26::i;:::-;33895:41;;33082:866;33960:12;33973:167;33999:14;34028:16;34059;34090:12;34117;33973:11;:167::i;:::-;34156:53;;;;;;;;;;;;;;;;;;;;;;;;;;33960:180;;-1:-1:-1;34156:53:0;;;;;;;;;;34240:4;32142:2110;-1:-1:-1;;;;;;;;;;;;;;32142:2110:0:o;12979:247::-;13149:58;;;-1:-1:-1;;;;;13149:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13149:58:0;-1:-1:-1;;;13149:58:0;;;13096:122;;13129:5;;13096:18;:122::i;4577:181::-;4635:7;4667:5;;;4691:6;;;;4683:46;;;;;-1:-1:-1;;;4683:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5983:471;6041:7;6286:6;6282:47;;-1:-1:-1;6316:1:0;6309:8;;6282:47;6353:5;;;6357:1;6353;:5;:1;6377:5;;;;;:10;6369:56;;;;-1:-1:-1;;;6369:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6922:132;6980:7;7007:39;7011:1;7014;7007:39;;;;;;;;;;;;;;;;;:3;:39::i;10833:159::-;10975:7;10833:159;;;;:::o;22561:335::-;22609:9;22639:1;22635;:5;22631:235;;;-1:-1:-1;22661:1:0;22697;22693;22689:5;;:9;22713:92;22724:1;22720;:5;22713:92;;;22750:1;22746:5;;22788:1;22783;22779;22775;:5;;;;;;:9;22774:15;;;;;;22770:19;;22713:92;;;22631:235;;;;22826:6;;22822:44;;-1:-1:-1;22853:1:0;22561:335;;;:::o;5033:136::-;5091:7;5118:43;5122:1;5125;5118:43;;;;;;;;;;;;;;;;;:3;:43::i;19615:98::-;19695:10;19615:98;:::o;35799:1995::-;35995:7;-1:-1:-1;;;;;36062:39:0;;36058:116;;36146:16;;-1:-1:-1;;;;;36146:16:0;;-1:-1:-1;36058:116:0;36219:16;-1:-1:-1;;;;;36190:45:0;:25;-1:-1:-1;;;;;36190:45:0;;36186:1601;;;-1:-1:-1;36259:16:0;36252:23;;36186:1601;36326:16;-1:-1:-1;;;;;36297:45:0;:25;-1:-1:-1;;;;;36297:45:0;;36293:1494;;;-1:-1:-1;36366:16:0;36359:23;;36293:1494;36423:16;;-1:-1:-1;;;;;36403:36:0;;;36423:16;;36403:36;;:76;;-1:-1:-1;36463:16:0;;-1:-1:-1;;;;;36443:36:0;;;36463:16;;36443:36;36403:76;36400:1387;;;-1:-1:-1;36503:16:0;;-1:-1:-1;;;;;36503:16:0;36496:23;;36400:1387;36607:128;;;-1:-1:-1;;;36607:128:0;;-1:-1:-1;;;;;36607:128:0;;;;;;;;;;;;;;;36552:19;;29624:42;;36607:31;;:128;;;;;;;;;;;;;;;29624:42;36607:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36607:128:0;36798:18;;;-1:-1:-1;;;36798:18:0;;;;36607:128;;-1:-1:-1;36766:12:0;;;;-1:-1:-1;;;;;36798:16:0;;;;;:18;;;;;;;;;;;;;;;:16;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36798:18:0;;;;;;;-1:-1:-1;;;;;36765:51:0;;;;-1:-1:-1;36765:51:0;;-1:-1:-1;36833:13:0;;36902:12;;;36898:175;;36950:4;36943;:11;;;;;;36935:19;;36993:4;36973:24;;36898:175;;;37053:4;37046;:11;;;;;;37038:19;;36898:175;37125:15;37143:140;37182:25;37226:7;37252:16;37143:20;:140::i;:::-;37125:158;;37298:15;37316:140;37355:25;37399:7;37425:16;37316:20;:140::i;:::-;37298:158;;37477:17;37473:303;;;37538:7;37529:5;37519:7;:15;:26;37515:102;;37554:16;37547:23;;;;;;;;;;;37515:102;37601:16;37594:23;;;;;;;;;;;37473:303;37681:7;37672:5;37662:7;:15;:26;37658:102;;37697:16;37690:23;;;;;;;;;;;37658:102;37744:16;37737:23;;;;;;;;;36400:1387;35799:1995;;;;;;:::o;22192:274::-;-1:-1:-1;;;;;22288:22:0;;22266:110;;;;-1:-1:-1;;;22266:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22413:6;;;22392:38;;-1:-1:-1;;;;;22392:38:0;;;;22413:6;;;;;;22392:38;;;22441:6;:17;;-1:-1:-1;;;;;22441:17:0;;;;;-1:-1:-1;;;;;;22441:17:0;;;;;;;;;22192:274::o;15589:1176::-;16193:27;16201:5;-1:-1:-1;;;;;16193:25:0;;:27::i;:::-;16185:71;;;;;-1:-1:-1;;;16185:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16330:12;16344:23;16379:5;-1:-1:-1;;;;;16371:19:0;16391:4;16371:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16371:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16329:67;;;;16415:7;16407:52;;;;;-1:-1:-1;;;16407:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16476:17;;:21;16472:286;;16649:10;16638:30;;;;;;;;;;;;;;;-1:-1:-1;16638:30:0;16612:134;;;;-1:-1:-1;;;16612:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42046:4980;42210:19;42275:23;-1:-1:-1;;;;;42246:52:0;:25;-1:-1:-1;;;;;42246:52:0;;42242:104;;;-1:-1:-1;42322:12:0;42315:19;;42242:104;-1:-1:-1;;;;;42362:39:0;;42358:4492;;42449:16;;-1:-1:-1;;;;;42422:43:0;;;42449:16;;42422:43;42418:175;;;42492:16;;;;;;;;;-1:-1:-1;;;;;42492:16:0;-1:-1:-1;;;;;42486:31:0;;42524:12;42486:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42565:12;42558:19;;;;42418:175;42633:16;;;42647:1;42633:16;;;42609:21;42633:16;;;;;42609:21;42633:16;;;;;;;;-1:-1:-1;;42674:16:0;;42664:7;;;;-1:-1:-1;;;;;;42674:16:0;;42664:7;;-1:-1:-1;42674:16:0;;42664:7;;;;;;;;;:26;-1:-1:-1;;;;;42664:26:0;;;-1:-1:-1;;;;;42664:26:0;;;;;42715:23;42705:4;42710:1;42705:7;;;;;;;;;;;;;:33;-1:-1:-1;;;;;42705:33:0;;;-1:-1:-1;;;;;42705:33:0;;;;;-1:-1:-1;;;;;;;;;;;;;;;;42767:35:0;;42827:12;42855:1;42858:4;42872;-1:-1:-1;;;42767:121:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42767:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42767:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42767:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42767:121:0;;;;;;;;;;;;-1:-1:-1;42767:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42903:1;42889:4;:11;:15;42767:138;;;;;;;;;;;;;;42753:152;;42358:4492;;;;-1:-1:-1;;;;;42927:37:0;;42923:3927;;43014:16;;-1:-1:-1;;;;;42985:45:0;;;43014:16;;42985:45;42981:170;;;43057:16;;43051:46;;;-1:-1:-1;;;43051:46:0;;;;;;;;;;-1:-1:-1;;;;;43057:16:0;;;;43051:32;;:46;;;;;43057:16;;43051:46;;;;;;;;43057:16;;43051:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43123:12;43116:19;;;;42981:170;43167:132;-1:-1:-1;;;;;43167:45:0;;-1:-1:-1;;;;;;;;;;;43272:12:0;43167:45;:132::i;:::-;43340:16;;;43354:1;43340:16;;;43316:21;43340:16;;;;;43316:21;43340:16;;;;;;;;;;-1:-1:-1;43340:16:0;43316:40;;43381:25;43371:4;43376:1;43371:7;;;;;;;;-1:-1:-1;;;;;43371:35:0;;;:7;;;;;;;;;:35;43431:16;;;43421:7;;43431:16;;;43421:4;;43431:16;43421:7;;;;;;;;;;;:26;-1:-1:-1;;;;;43421:26:0;;;-1:-1:-1;;;;;43421:26:0;;;;;-1:-1:-1;;;;;;;;;;;;;;;;43476:35:0;;43530:12;43561:1;43581:4;43612;-1:-1:-1;;;43476:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43476:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43476:183:0;;;;;;;;;;;;;;42923:3927;43709:132;-1:-1:-1;;;;;43709:45:0;;-1:-1:-1;;;;;;;;;;;43814:12:0;43709:45;:132::i;:::-;43891:16;;-1:-1:-1;;;;;43862:45:0;;;43891:16;;43862:45;43858:2981;;43959:16;;-1:-1:-1;;;;;43932:43:0;;;43959:16;;43932:43;43928:2458;;44074:156;;;-1:-1:-1;;;44074:156:0;;-1:-1:-1;;;;;44074:156:0;;;;;;;;;;;;;;;44058:13;;29624:42;;44074:31;;:156;;;;;;;;;;;;;;;29624:42;44074:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44074:156:0;44278:16;;;44292:1;44278:16;;;44253:22;44278:16;;;;;44074:156;;-1:-1:-1;44278:16:0;;;;;;;;;;;;-1:-1:-1;44278:16:0;44253:41;;44328:25;44317:5;44323:1;44317:8;;;;;;;;;;;;;:36;-1:-1:-1;;;;;44317:36:0;;;-1:-1:-1;;;;;44317:36:0;;;;;44387:23;44376:5;44382:1;44376:8;;;;;;;;-1:-1:-1;;;;;44376:34:0;;;:8;;;;;;;;;:34;44433:12;;44472:19;;;44468:219;;44527:133;;;-1:-1:-1;;;44527:133:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;29468:42:0;44527:27;;44585:12;;44628:5;;44527:133;;;;;;;;;;;;;;;-1:-1:-1;44527:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44527:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44527:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44527:133:0;;;;;;;;;;;;-1:-1:-1;44527:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44661:1;44527:136;;;;;;;;;;;;;;44520:143;;44468:219;44802:16;;;44816:1;44802:16;;;;;;;;;44777:22;;44802:16;;;44777:22;;44802:16;;;;;-1:-1:-1;44802:16:0;44777:41;;44852:25;44841:5;44847:1;44841:8;;;;;;;;-1:-1:-1;;;;;44841:36:0;;;:8;;;;;;;;;:36;44911:16;;;44900:8;;44911:16;;;44900:5;;44911:16;44900:8;;;;;;;;;;;:27;-1:-1:-1;;;;;44900:27:0;;;-1:-1:-1;;;;;44900:27:0;;;;;44961:23;44950:5;44956:1;44950:8;;;;;;;;-1:-1:-1;;;;;44950:34:0;;;:8;;;;;;;;;;:34;45024:121;;;-1:-1:-1;;;45024:121:0;;;;;;;;;;;;;;;;;;;;;;45009:12;;-1:-1:-1;;;;;;;;;;;29468:42:0;45024:27;;45078:12;;45117:5;;45024:121;;;;;;;;;;;;;;;45009:12;45024:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45024:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45024:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45024:121:0;;;;;;;;;;;;-1:-1:-1;45024:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45146:1;45024:124;;;;;;;;;;;;;;45009:139;;45185:4;45177;:12;45173:708;;-1:-1:-1;;;;;;;;;;;;;;;;45232:38:0;;45301:12;45344:1;45376:5;45420:4;-1:-1:-1;;;45232:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45232:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45232:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45232:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45232:259:0;;;;;;;;;;;;-1:-1:-1;45232:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45507:1;45492:5;:12;:16;45232:277;;;;;;;;;;;;;;45218:291;;45173:708;;;-1:-1:-1;;;;;;;;;;;;;;;;45580:38:0;;45649:12;45692:1;45724:5;45768:4;-1:-1:-1;;;45580:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45580:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45580:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45580:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45580:259:0;;;;;;;;;;;;-1:-1:-1;45580:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45855:1;45840:5;:12;:16;45580:277;;;;;;;;;;;;;;45566:291;;45173:708;43928:2458;;;;;;;;45953:16;;;45967:1;45953:16;;;45929:21;45953:16;;;;;45929:21;45953:16;;;;;;;;;;-1:-1:-1;45953:16:0;45929:40;;46002:25;45992:4;45997:1;45992:7;;;;;;;;-1:-1:-1;;;;;45992:35:0;;;:7;;;;;;;;;:35;46060:16;;;46050:7;;46060:16;;;46050:4;;46060:16;46050:7;;;;;;-1:-1:-1;;;;;46050:26:0;;;:7;;;;;;;;;;:26;46115:234;;-1:-1:-1;;;46115:234:0;;;;;;;;46219:1;46115:234;;;;;;46286:4;46115:234;;;;;;-1:-1:-1;;;46115:234:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;29468:42:0;46115:38;;46180:12;;46247:4;;46286;29777:66;46115:234;;;;;;;;;;;;;;;;;-1:-1:-1;46115:234:0;;;;;;;;;;;;;;;;43928:2458;43858:2981;;;46450:16;;;46464:1;46450:16;;;46426:21;46450:16;;;;;46426:21;46450:16;;;;;;;;-1:-1:-1;;46495:16:0;;46485:7;;;;-1:-1:-1;;;;;;46495:16:0;;46485:7;;-1:-1:-1;46495:16:0;;46485:7;;;;;;;;;:26;-1:-1:-1;;;;;46485:26:0;;;-1:-1:-1;;;;;46485:26:0;;;;;46540:23;46530:4;46535:1;46530:7;;;;;;;;;;;;;:33;-1:-1:-1;;;;;46530:33:0;;;-1:-1:-1;;;;;46530:33:0;;;;;-1:-1:-1;;;;;;;;;;;;;;;;46596:38:0;;46657:12;46692:1;46716:4;46751;-1:-1:-1;;;46596:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46596:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46596:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46596:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46596:210:0;;;;;;;;;;;;-1:-1:-1;46596:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46821:1;46807:4;:11;:15;46596:227;;;;;;;;;;;;;;46582:241;;43858:2981;;46882:1;46868:11;:15;46860:49;;;;;-1:-1:-1;;;46860:49:0;;;;;;;;;;;;-1:-1:-1;;;46860:49:0;;;;;;;;;;;;;;;46927:91;;;-1:-1:-1;;;;;46927:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42046:4980;;;;;:::o;34260:1531::-;34471:7;34491:111;-1:-1:-1;;;;;34491:36:0;;-1:-1:-1;;;;;;;;;;;34579:12:0;34491:36;:111::i;:::-;34613;-1:-1:-1;;;;;34613:36:0;;-1:-1:-1;;;;;;;;;;;34701:12:0;34613:36;:111::i;:::-;34786:250;;;-1:-1:-1;;;34786:250:0;;-1:-1:-1;;;;;34786:250:0;;;;;;;;;;;;;;;;;;;;;;;;;34957:1;34786:250;;;;;;;;;;34997:4;34786:250;;;;-1:-1:-1;;;34786:250:0;;;;;;34738:15;;;;;;-1:-1:-1;;;;;;;;;;;29468:42:0;34786:40;;:250;;;;;;;;;;;;;;;34738:15;29468:42;34786:250;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34786:250:0;;;;;;;;;;;;;-1:-1:-1;34786:250:0;;-1:-1:-1;34786:250:0;-1:-1:-1;35049:100:0;-1:-1:-1;;;;;35049:36:0;;-1:-1:-1;;;;;;;;;;;35137:1:0;35049:36;:100::i;:::-;35160;-1:-1:-1;;;;;35160:36:0;;-1:-1:-1;;;;;;;;;;;35248:1:0;35160:36;:100::i;:::-;35353:1;35325:25;:12;35342:7;35325:16;:25::i;:::-;:29;35321:191;;;35371:129;35427:14;35460:25;:12;35477:7;35460:16;:25::i;:::-;-1:-1:-1;;;;;35371:37:0;;;:129;:37;:129::i;:::-;35603:1;35575:25;:12;35592:7;35575:16;:25::i;:::-;:29;35571:191;;;35621:129;35677:14;35710:25;:12;35727:7;35710:16;:25::i;:::-;-1:-1:-1;;;;;35621:37:0;;;:129;:37;:129::i;:::-;35781:2;34260:1531;-1:-1:-1;;;;;;;;34260:1531:0:o;7584:379::-;7704:7;7806:12;7799:5;7791:28;;;;-1:-1:-1;;;7791:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7830:9;7846:1;7842;:5;;;;;;;7584:379;-1:-1:-1;;;;;7584:379:0:o;5506:226::-;5626:7;5662:12;5654:6;;;;5646:29;;;;-1:-1:-1;;;5646:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5698:5:0;;;5506:226::o;37802:1015::-;38013:43;;;-1:-1:-1;;;38013:43:0;;-1:-1:-1;;;;;38013:43:0;;;;;;;;;;;;;;;37931:7;;;;29624:42;;38013:31;;:43;;;;;;;;;;;;;;29624:42;38013:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38013:43:0;;-1:-1:-1;38069:12:0;-1:-1:-1;;;;;38096:19:0;;;38092:220;;38157:16;;;38171:1;38157:16;;;38132:22;38157:16;;;;;38132:22;38157:16;;;;;;;;;;-1:-1:-1;38157:16:0;38132:41;;38199:5;38188;38194:1;38188:8;;;;;;;;;;;;;:16;-1:-1:-1;;;;;38188:16:0;;;-1:-1:-1;;;;;38188:16:0;;;;;38230:3;38219:5;38225:1;38219:8;;;;;;;;-1:-1:-1;;;;;38219:14:0;;;:8;;;;;;;;;;:14;38257:40;;;-1:-1:-1;;;38257:40:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;29468:42:0;38257:27;;38285:4;;38291:5;;38257:40;;;;;;;;;;;;;;;;-1:-1:-1;38257:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38257:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38257:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38257:40:0;;;;;;;;;;;;-1:-1:-1;38257:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38298:1;38257:43;;;;;;;;;;;;;;38250:50;;38092:220;;38415:16;;38324:12;;-1:-1:-1;;;;;38406:25:0;;;38415:16;;38406:25;;;;38405:54;;-1:-1:-1;38443:16:0;;-1:-1:-1;;;;;38436:23:0;;;38443:16;;38436:23;;38405:54;38401:297;;;38501:16;;;38515:1;38501:16;;;;;;;;;38476:22;;38501:16;;;38476:22;;38501:16;;;;;-1:-1:-1;38501:16:0;38476:41;;38543:5;38532;38538:1;38532:8;;;;;;;;-1:-1:-1;;;;;38532:16:0;;;:8;;;;;;;;;:16;38574;;;38563:8;;38574:16;;;38563:5;;38574:16;38563:8;;;;;;;;;;;:27;-1:-1:-1;;;;;38563:27:0;;;-1:-1:-1;;;;;38563:27:0;;;;;38616:3;38605:5;38611:1;38605:8;;;;;;;;-1:-1:-1;;;;;38605:14:0;;;:8;;;;;;;;;;:14;38643:40;;;-1:-1:-1;;;38643:40:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;29468:42:0;38643:27;;38671:4;;38677:5;;38643:40;;;;;;;;;;;;;;;;-1:-1:-1;38643:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38643:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38643:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38643:40:0;;;;;;;;;;;;-1:-1:-1;38643:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38684:1;38643:43;;;;;;;;;;;;;;38636:50;;38401:297;;38722:4;38714;:12;38710:100;;-1:-1:-1;38750:4:0;-1:-1:-1;38743:11:0;;-1:-1:-1;38743:11:0;38710:100;38794:4;-1:-1:-1;38787:11:0;;-1:-1:-1;;38787:11:0;9957:659;10017:4;10516:20;;10346:66;10565:23;;;;;;:42;;-1:-1:-1;;10592:15:0;;;10557:51;-1:-1:-1;;9957:659:0:o;13526:706::-;13944:10;;;13943:62;;-1:-1:-1;13960:39:0;;;-1:-1:-1;;;13960:39:0;;13984:4;13960:39;;;;-1:-1:-1;;;;;13960:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13960:39:0;:44;13943:62;13921:166;;;;-1:-1:-1;;;13921:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14151:62;;;-1:-1:-1;;;;;14151:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14151:62:0;-1:-1:-1;;;14151:62:0;;;14098:126;;14131:5;;14098:18;:126::i
Swarm Source
ipfs://631c8f4343265e1efed4521286cb5403ecb28cf7b39d44e7479c0665d03ef81d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.