Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,816 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 12858084 | 1223 days ago | IN | 0 ETH | 0.00129537 | ||||
Toggle Contract ... | 11457387 | 1439 days ago | IN | 0 ETH | 0.0041303 | ||||
Transfer | 11341961 | 1457 days ago | IN | 0 ETH | 0.00064264 | ||||
Transfer | 11341514 | 1457 days ago | IN | 0 ETH | 0.001108 | ||||
Multi Exchange S... | 11282884 | 1466 days ago | IN | 0.34 ETH | 0.01061389 | ||||
Multi Exchange S... | 11215618 | 1476 days ago | IN | 0 ETH | 0.00440001 | ||||
Multi Exchange S... | 11204965 | 1478 days ago | IN | 0.4 ETH | 0.0166232 | ||||
Multi Exchange S... | 11202016 | 1478 days ago | IN | 0 ETH | 0.00972648 | ||||
Multi Exchange S... | 11202010 | 1478 days ago | IN | 0 ETH | 0.01351668 | ||||
Multi Exchange S... | 11201685 | 1478 days ago | IN | 0 ETH | 0.01577051 | ||||
Multi Exchange S... | 11201631 | 1478 days ago | IN | 0 ETH | 0.01278022 | ||||
Multi Exchange S... | 11201320 | 1478 days ago | IN | 2 ETH | 0.01751162 | ||||
Multi Exchange S... | 11201304 | 1478 days ago | IN | 0 ETH | 0.019709 | ||||
Multi Exchange S... | 11201026 | 1478 days ago | IN | 2 ETH | 0.00799866 | ||||
Multi Exchange S... | 11200587 | 1478 days ago | IN | 0 ETH | 0.00779265 | ||||
Multi Exchange S... | 11200478 | 1478 days ago | IN | 0 ETH | 0.00395967 | ||||
Multi Exchange S... | 11200376 | 1478 days ago | IN | 0 ETH | 0.00660894 | ||||
Multi Exchange S... | 11200345 | 1478 days ago | IN | 0 ETH | 0.00383797 | ||||
Multi Exchange S... | 11200278 | 1478 days ago | IN | 0.41 ETH | 0.00763713 | ||||
Multi Exchange S... | 11200217 | 1478 days ago | IN | 6.8296 ETH | 0.00331512 | ||||
Multi Exchange S... | 11200153 | 1478 days ago | IN | 0 ETH | 0.00582732 | ||||
Multi Exchange S... | 11199980 | 1478 days ago | IN | 0 ETH | 0.00537507 | ||||
Multi Exchange S... | 11199791 | 1478 days ago | IN | 16.69521 ETH | 0.00335495 | ||||
Multi Exchange S... | 11199769 | 1478 days ago | IN | 0 ETH | 0.00405309 | ||||
Multi Exchange S... | 11199766 | 1478 days ago | IN | 0 ETH | 0.00533254 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
11282884 | 1466 days ago | 0.34 ETH | ||||
11204965 | 1478 days ago | 0.4 ETH | ||||
11202016 | 1478 days ago | 0.40060897 ETH | ||||
11202016 | 1478 days ago | 0.40060897 ETH | ||||
11202010 | 1478 days ago | 0.42158753 ETH | ||||
11202010 | 1478 days ago | 0.42158753 ETH | ||||
11201685 | 1478 days ago | 0.52362813 ETH | ||||
11201685 | 1478 days ago | 0.52362813 ETH | ||||
11201631 | 1478 days ago | 1.52461057 ETH | ||||
11201631 | 1478 days ago | 1.52461057 ETH | ||||
11201320 | 1478 days ago | 2 ETH | ||||
11201304 | 1478 days ago | 3.21324706 ETH | ||||
11201304 | 1478 days ago | 3.21324706 ETH | ||||
11201026 | 1478 days ago | 2 ETH | ||||
11200478 | 1478 days ago | 2.19078 ETH | ||||
11200478 | 1478 days ago | 2.19078 ETH | ||||
11200345 | 1478 days ago | 1.97194548 ETH | ||||
11200345 | 1478 days ago | 1.97194548 ETH | ||||
11200278 | 1478 days ago | 0.41 ETH | ||||
11200217 | 1478 days ago | 6.8296 ETH | ||||
11199791 | 1478 days ago | 16.69521 ETH | ||||
11199769 | 1478 days ago | 0.79725457 ETH | ||||
11199769 | 1478 days ago | 0.79725457 ETH | ||||
11199710 | 1478 days ago | 1.03338125 ETH | ||||
11199710 | 1478 days ago | 1.03338125 ETH |
Loading...
Loading
Contract Name:
Zapper_Swap_General_V1_3
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-09-27 */ // ███████╗░█████╗░██████╗░██████╗░███████╗██████╗░░░░███████╗██╗ // ╚════██║██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔══██╗░░░██╔════╝██║ // ░░███╔═╝███████║██████╔╝██████╔╝█████╗░░██████╔╝░░░█████╗░░██║ // ██╔══╝░░██╔══██║██╔═══╝░██╔═══╝░██╔══╝░░██╔══██╗░░░██╔══╝░░██║ // ███████╗██║░░██║██║░░░░░██║░░░░░███████╗██║░░██║██╗██║░░░░░██║ // ╚══════╝╚═╝░░╚═╝╚═╝░░░░░╚═╝░░░░░╚══════╝╚═╝░░╚═╝╚═╝╚═╝░░░░░╚═╝ // 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 swaps between two assets utilizing various liquidity pools. // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require( success, "Address: unable to send value, recipient may have reverted" ); } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() internal {} // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * 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 private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view 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 newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol pragma solidity ^0.5.0; /** * @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. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. * * _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; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add( value ); callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, "SafeERC20: decreased allowance below zero" ); callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } interface IBFactory { function isBPool(address b) external view returns (bool); } interface IBpool { function isPublicSwap() external view returns (bool); function isBound(address t) external view returns (bool); function swapExactAmountIn( address tokenIn, uint256 tokenAmountIn, address tokenOut, uint256 minAmountOut, uint256 maxPrice ) external returns (uint256 tokenAmountOut, uint256 spotPriceAfter); function swapExactAmountOut( address tokenIn, uint256 maxAmountIn, address tokenOut, uint256 tokenAmountOut, uint256 maxPrice ) external returns (uint256 tokenAmountIn, uint256 spotPriceAfter); function getSpotPrice(address tokenIn, address tokenOut) external view returns (uint256 spotPrice); } interface IUniswapRouter02 { //get estimated amountOut 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); //token 2 token 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); //eth 2 token function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); //token 2 eth 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); } interface ICurve { function underlying_coins(int128 index) external view returns (address); function coins(int128 index) external view returns (address); function get_dy_underlying( int128 i, int128 j, uint256 dx ) external view returns (uint256 dy); function exchange_underlying( int128 i, int128 j, uint256 dx, uint256 minDy ) external; function exchange( int128 i, int128 j, uint256 dx, uint256 minDy ) external; } interface IWETH { function deposit() external payable; function withdraw(uint256 amount) external; } interface ICompound { function markets(address cToken) external view returns (bool isListed, uint256 collateralFactorMantissa); function underlying() external returns (address); } interface ICompoundToken { function underlying() external view returns (address); function exchangeRateStored() external view returns (uint256); function mint(uint256 mintAmount) external returns (uint256); function redeem(uint256 redeemTokens) external returns (uint256); } interface ICompoundEther { function mint() external payable; function redeem(uint256 redeemTokens) external returns (uint256); } interface IIearn { function token() external view returns (address); function calcPoolValueInToken() external view returns (uint256); function deposit(uint256 _amount) external; function withdraw(uint256 _shares) external; } interface IAToken { function redeem(uint256 _amount) external; function underlyingAssetAddress() external returns (address); } interface IAaveLendingPoolAddressesProvider { function getLendingPool() external view returns (address); function getLendingPoolCore() external view returns (address payable); } interface IAaveLendingPool { function deposit( address _reserve, uint256 _amount, uint16 _referralCode ) external payable; } contract Zapper_Swap_General_V1_3 is ReentrancyGuard, Ownable { using SafeMath for uint256; using Address for address; using SafeERC20 for IERC20; IUniswapRouter02 private constant uniswapRouter = IUniswapRouter02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); IAaveLendingPoolAddressesProvider private constant lendingPoolAddressProvider = IAaveLendingPoolAddressesProvider( 0x24a42fD28C976A61Df5D00D0599C34c4f90748c8 ); IBFactory private constant BalancerFactory = IBFactory( 0x9424B1412450D0f8Fc2255FAf6046b98213B76Bd ); address private constant renBTCCurveSwapContract = address( 0x93054188d876f558f4a66B2EF1d97d16eDf0895B ); address private constant sBTCCurveSwapContract = address( 0x7fC77b5c7614E1533320Ea6DDc2Eb61fa00A9714 ); IWETH private constant wethContract = IWETH( 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 ); address private constant ETHAddress = address( 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ); uint256 private constant deadline = 0xf000000000000000000000000000000000000000000000000000000000000000; mapping(address => address) public cToken; mapping(address => address) public yToken; mapping(address => address) public aToken; bool public stopped = false; constructor() public { //mapping for cETH cToken[address( 0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5 )] = ETHAddress; } /** @notice This function adds c token addresses to a mapping @dev For cETH token, mapping is already added in constructor @param _cToken token address of c-token for given underlying asset */ function addCToken(address[] memory _cToken) public onlyOwner { for (uint256 i = 0; i < _cToken.length; i++) { cToken[_cToken[i]] = ICompound(_cToken[i]).underlying(); } } /** @notice This function adds y token addresses to a mapping @param _yToken token address of y-token */ function addYToken(address[] memory _yToken) public onlyOwner { for (uint256 i = 0; i < _yToken.length; i++) { yToken[_yToken[i]] = IIearn(_yToken[i]).token(); } } /** @notice This function adds a token addresses to a mapping @param _aToken token address of a-token for given underlying asset */ function addAToken(address[] memory _aToken) public onlyOwner { for (uint256 i = 0; i < _aToken.length; i++) { aToken[_aToken[i]] = IAToken(_aToken[i]).underlyingAssetAddress(); } } /** @notice This function is used swap tokens using multiple exchanges @param toWhomToIssue address to which tokens should be sent after swap @param path token addresses indicating the conversion path @param amountIn amount of tokens to swap @param minTokenOut min amount of expected tokens @param withPool indicates the exchange and its sequence we want to swap from @param poolData pool or token addresses needed for swapping tokens according to the exchange @param starts indicates the index of path array for each swap @return amount of tokens received after swap */ function MultiExchangeSwap( address payable toWhomToIssue, address[] calldata path, uint256 amountIn, uint256 minTokenOut, uint8[] calldata starts, uint8[] calldata withPool, address[] calldata poolData ) external payable nonReentrant stopInEmergency returns (uint256 tokensBought) { require(toWhomToIssue != address(0), "Invalid receiver address"); require(path[0] != path[path.length - 1], "Cannot swap same tokens"); tokensBought = _swap( path, _getTokens(path[0], amountIn), starts, withPool, poolData ); require(tokensBought >= minTokenOut, "High Slippage"); _sendTokens(toWhomToIssue, path[path.length - 1], tokensBought); } //swap function function _swap( address[] memory path, uint256 tokensToSwap, uint8[] memory starts, uint8[] memory withPool, address[] memory poolData ) internal returns (uint256) { address _to; uint8 poolIndex = 0; address[] memory _poolData; address _from = path[starts[0]]; for (uint256 index = 0; index < withPool.length; index++) { uint256 endIndex = index == withPool.length.sub(1) ? path.length - 1 : starts[index + 1]; _to = path[endIndex]; { if (withPool[index] == 2) { _poolData = _getPath(path, starts[index], endIndex + 1); } else { _poolData = new address[](1); _poolData[0] = poolData[poolIndex++]; } } tokensToSwap = _swapFromPool( _from, _to, tokensToSwap, withPool[index], _poolData ); _from = _to; } return tokensToSwap; } /** @notice This function is used swap tokens using multiple exchanges @param fromToken token addresses to swap from @param toToken token addresses to swap into @param amountIn amount of tokens to swap @param withPool indicates the exchange we want to swap from @param poolData pool or token addresses needed for swapping tokens according to the exchange @return amount of tokens received after swap */ function _swapFromPool( address fromToken, address toToken, uint256 amountIn, uint256 withPool, address[] memory poolData ) internal returns (uint256) { require(fromToken != toToken, "Cannot swap same tokens"); require(withPool <= 3, "Invalid Exchange"); if (withPool == 1) { return _swapWithBalancer(poolData[0], fromToken, toToken, amountIn, 1); } else if (withPool == 2) { return _swapWithUniswapV2(fromToken, toToken, poolData, amountIn, 1); } else if (withPool == 3) { return _swapWithCurve(poolData[0], fromToken, toToken, amountIn, 1); } } /** @notice This function returns part of the given array @param addresses address array to copy from @param _start start index @param _end end index @return addressArray copied from given array */ function _getPath( address[] memory addresses, uint256 _start, uint256 _end ) internal pure returns (address[] memory addressArray) { uint256 len = _end.sub(_start); require(len > 1, "ERR_UNIV2_PATH"); addressArray = new address[](len); for (uint256 i = 0; i < len; i++) { if ( addresses[_start + i] == address(0) || addresses[_start + i] == ETHAddress ) { addressArray[i] = address(wethContract); } else { addressArray[i] = addresses[_start + i]; } } } function _sendTokens( address payable toWhomToIssue, address token, uint256 amount ) internal { if (token == ETHAddress || token == address(0)) { toWhomToIssue.transfer(amount); } else { IERC20(token).safeTransfer(toWhomToIssue, amount); } } function _swapWithBalancer( address bpoolAddress, address fromToken, address toToken, uint256 amountIn, uint256 minTokenOut ) internal returns (uint256 tokenBought) { require(BalancerFactory.isBPool(bpoolAddress), "Invalid balancer pool"); IBpool bpool = IBpool(bpoolAddress); require(bpool.isPublicSwap(), "Swap not allowed for this pool"); address _to = toToken; if (fromToken == address(0)) { wethContract.deposit.value(amountIn)(); fromToken = address(wethContract); } else if (toToken == address(0)) { _to = address(wethContract); } require(bpool.isBound(fromToken), "From Token not bound"); require(bpool.isBound(_to), "To Token not bound"); //approve it to exchange address IERC20(fromToken).safeApprove(bpoolAddress, amountIn); //swap tokens (tokenBought, ) = bpool.swapExactAmountIn( fromToken, amountIn, _to, minTokenOut, uint256(-1) ); if (toToken == address(0)) { wethContract.withdraw(tokenBought); } } function _swapWithUniswapV2( address fromToken, address toToken, address[] memory path, uint256 amountIn, uint256 minTokenOut ) internal returns (uint256 tokenBought) { //unwrap & approve it to router contract uint256 tokensUnwrapped = amountIn; address _fromToken = fromToken; if (fromToken != address(0)) { (tokensUnwrapped, _fromToken) = _unwrap(fromToken, amountIn); IERC20(_fromToken).safeApprove( address(uniswapRouter), tokensUnwrapped ); } //swap and transfer tokens if (fromToken == address(0)) { tokenBought = uniswapRouter.swapExactETHForTokens.value( tokensUnwrapped )(minTokenOut, path, address(this), deadline)[path.length - 1]; } else if (toToken == address(0)) { tokenBought = uniswapRouter.swapExactTokensForETH( tokensUnwrapped, minTokenOut, path, address(this), deadline )[path.length - 1]; } else { tokenBought = uniswapRouter.swapExactTokensForTokens( tokensUnwrapped, minTokenOut, path, address(this), deadline )[path.length - 1]; } } function _swapWithCurve( address curveExchangeAddress, address fromToken, address toToken, uint256 amountIn, uint256 minTokenOut ) internal returns (uint256 tokenBought) { require( curveExchangeAddress != address(0), "ERR_Invaid_curve_exchange" ); ICurve curveExchange = ICurve(curveExchangeAddress); (uint256 tokensUnwrapped, address _fromToken) = _unwrap( fromToken, amountIn ); //approve it to exchange address IERC20(_fromToken).safeApprove(curveExchangeAddress, tokensUnwrapped); int128 i; int128 j; //swap tokens if ( curveExchangeAddress == renBTCCurveSwapContract || curveExchangeAddress == sBTCCurveSwapContract ) { int128 length = (curveExchangeAddress == renBTCCurveSwapContract) ? 2 : 3; for (int128 index = 0; index < length; index++) { if (curveExchange.coins(index) == _fromToken) { i = index; } else if (curveExchange.coins(index) == toToken) { j = index; } } curveExchange.exchange(i, j, tokensUnwrapped, minTokenOut); } else { address compCurveSwapContract = address( 0xA2B47E3D5c44877cca798226B7B8118F9BFb7A56 ); address usdtCurveSwapContract = address( 0x52EA46506B9CC5Ef470C5bf89f17Dc28bB35D85C ); int128 length = 4; if (curveExchangeAddress == compCurveSwapContract) { length = 2; } else if (curveExchangeAddress == usdtCurveSwapContract) { length = 3; } for (int128 index = 0; index < length; index++) { if (curveExchange.underlying_coins(index) == _fromToken) { i = index; } else if (curveExchange.underlying_coins(index) == toToken) { j = index; } } curveExchange.exchange_underlying( i, j, tokensUnwrapped, minTokenOut ); } if (toToken == ETHAddress || toToken == address(0)) { tokenBought = address(this).balance; } else { tokenBought = IERC20(toToken).balanceOf(address(this)); } } function unwrapWeth( address payable _toWhomToIssue, address _FromTokenContractAddress, uint256 tokens2Trade, uint256 minTokens ) public stopInEmergency returns (uint256 tokensUnwrapped, address toToken) { require(_toWhomToIssue != address(0), "Invalid receiver address"); require( _FromTokenContractAddress == address(wethContract), "Only unwraps WETH, use unwrap() for other tokens" ); uint256 initialEthbalance = address(this).balance; uint256 tokensToSwap = _getTokens( _FromTokenContractAddress, tokens2Trade ); wethContract.withdraw(tokensToSwap); tokensUnwrapped = address(this).balance.sub(initialEthbalance); toToken = address(0); require(tokensUnwrapped >= minTokens, "High Slippage"); //transfer _sendTokens(_toWhomToIssue, toToken, tokensUnwrapped); } function unwrap( address payable _toWhomToIssue, address _FromTokenContractAddress, uint256 tokens2Trade, uint256 minTokens ) public stopInEmergency returns (uint256 tokensUnwrapped, address toToken) { require(_toWhomToIssue != address(0), "Invalid receiver address"); uint256 tokensToSwap = _getTokens( _FromTokenContractAddress, tokens2Trade ); (tokensUnwrapped, toToken) = _unwrap( _FromTokenContractAddress, tokensToSwap ); require(tokensUnwrapped >= minTokens, "High Slippage"); //transfer _sendTokens(_toWhomToIssue, toToken, tokensUnwrapped); } function _unwrap(address _FromTokenContractAddress, uint256 tokens2Trade) internal returns (uint256 tokensUnwrapped, address toToken) { uint256 initialEthbalance = address(this).balance; if (cToken[_FromTokenContractAddress] != address(0)) { require( ICompoundToken(_FromTokenContractAddress).redeem( tokens2Trade ) == 0, "Error in unwrapping" ); toToken = cToken[_FromTokenContractAddress]; if (toToken == ETHAddress) { tokensUnwrapped = address(this).balance; tokensUnwrapped = tokensUnwrapped.sub(initialEthbalance); } else { tokensUnwrapped = IERC20(toToken).balanceOf(address(this)); } } else if (yToken[_FromTokenContractAddress] != address(0)) { IIearn(_FromTokenContractAddress).withdraw(tokens2Trade); toToken = IIearn(_FromTokenContractAddress).token(); tokensUnwrapped = IERC20(toToken).balanceOf(address(this)); } else if (aToken[_FromTokenContractAddress] != address(0)) { IAToken(_FromTokenContractAddress).redeem(tokens2Trade); toToken = IAToken(_FromTokenContractAddress) .underlyingAssetAddress(); if (toToken == ETHAddress) { tokensUnwrapped = address(this).balance; tokensUnwrapped = tokensUnwrapped.sub(initialEthbalance); } else { tokensUnwrapped = IERC20(toToken).balanceOf(address(this)); } } else { toToken = _FromTokenContractAddress; tokensUnwrapped = tokens2Trade; } } function wrap( address payable _toWhomToIssue, address _FromTokenContractAddress, address _ToTokenContractAddress, uint256 tokens2Trade, uint256 minTokens, uint256 _wrapInto ) public payable stopInEmergency returns (uint256 tokensWrapped) { require(_toWhomToIssue != address(0), "Invalid receiver address"); require(_wrapInto <= 3, "Invalid to Token"); uint256 tokensToSwap = _getTokens( _FromTokenContractAddress, tokens2Trade ); tokensWrapped = _wrap( _FromTokenContractAddress, _ToTokenContractAddress, tokensToSwap, _wrapInto ); require(tokensWrapped >= minTokens, "High Slippage"); //transfer tokens _sendTokens(_toWhomToIssue, _ToTokenContractAddress, tokensWrapped); } function _wrap( address _FromTokenContractAddress, address _ToTokenContractAddress, uint256 tokens2Trade, uint256 _wrapInto ) internal returns (uint256 tokensWrapped) { //weth if (_wrapInto == 0) { require( _FromTokenContractAddress == address(0), "Cannot wrap into WETH" ); require( _ToTokenContractAddress == address(wethContract), "Invalid toToken" ); wethContract.deposit.value(tokens2Trade)(); return tokens2Trade; } else if (_wrapInto == 1) { //Compound if (_FromTokenContractAddress == address(0)) { ICompoundEther(_ToTokenContractAddress).mint.value( tokens2Trade )(); } else { IERC20(_FromTokenContractAddress).safeApprove( address(_ToTokenContractAddress), tokens2Trade ); ICompoundToken(_ToTokenContractAddress).mint(tokens2Trade); } } else if (_wrapInto == 2) { //IEarn IERC20(_FromTokenContractAddress).safeApprove( address(_ToTokenContractAddress), tokens2Trade ); IIearn(_ToTokenContractAddress).deposit(tokens2Trade); } else { // Aave if (_FromTokenContractAddress == address(0)) { IAaveLendingPool(lendingPoolAddressProvider.getLendingPool()) .deposit .value(tokens2Trade)(ETHAddress, tokens2Trade, 0); } else { //approve lending pool core IERC20(_FromTokenContractAddress).safeApprove( address(lendingPoolAddressProvider.getLendingPoolCore()), tokens2Trade ); //get lending pool and call deposit IAaveLendingPool(lendingPoolAddressProvider.getLendingPool()) .deposit(_FromTokenContractAddress, tokens2Trade, 0); } } tokensWrapped = IERC20(_ToTokenContractAddress).balanceOf( address(this) ); } function _getTokens(address token, uint256 amount) internal returns (uint256) { if (token == address(0)) { require(msg.value > 0, "No eth sent"); return msg.value; } require(amount > 0, "Invalid token amount"); require(msg.value == 0, "Eth sent with token"); //transfer token IERC20(token).safeTransferFrom(msg.sender, address(this), amount); return amount; } 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; } // circuit breaker modifiers modifier stopInEmergency { if (stopped) { revert("Temporarily Paused"); } else { _; } } function() external payable { require(msg.sender != tx.origin, "Do not send ETH directly"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address payable","name":"toWhomToIssue","type":"address"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minTokenOut","type":"uint256"},{"internalType":"uint8[]","name":"starts","type":"uint8[]"},{"internalType":"uint8[]","name":"withPool","type":"uint8[]"},{"internalType":"address[]","name":"poolData","type":"address[]"}],"name":"MultiExchangeSwap","outputs":[{"internalType":"uint256","name":"tokensBought","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"aToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_aToken","type":"address[]"}],"name":"addAToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_cToken","type":"address[]"}],"name":"addCToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_yToken","type":"address[]"}],"name":"addYToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"_TokenAddress","type":"address"}],"name":"inCaseTokengetsStuck","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"toggleContractActive","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_toWhomToIssue","type":"address"},{"internalType":"address","name":"_FromTokenContractAddress","type":"address"},{"internalType":"uint256","name":"tokens2Trade","type":"uint256"},{"internalType":"uint256","name":"minTokens","type":"uint256"}],"name":"unwrap","outputs":[{"internalType":"uint256","name":"tokensUnwrapped","type":"uint256"},{"internalType":"address","name":"toToken","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_toWhomToIssue","type":"address"},{"internalType":"address","name":"_FromTokenContractAddress","type":"address"},{"internalType":"uint256","name":"tokens2Trade","type":"uint256"},{"internalType":"uint256","name":"minTokens","type":"uint256"}],"name":"unwrapWeth","outputs":[{"internalType":"uint256","name":"tokensUnwrapped","type":"uint256"},{"internalType":"address","name":"toToken","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_toWhomToIssue","type":"address"},{"internalType":"address","name":"_FromTokenContractAddress","type":"address"},{"internalType":"address","name":"_ToTokenContractAddress","type":"address"},{"internalType":"uint256","name":"tokens2Trade","type":"uint256"},{"internalType":"uint256","name":"minTokens","type":"uint256"},{"internalType":"uint256","name":"_wrapInto","type":"uint256"}],"name":"wrap","outputs":[{"internalType":"uint256","name":"tokensWrapped","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"yToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526004805460ff191690553480156200001b57600080fd5b506000805460ff191660011781556200003c6001600160e01b03620000f616565b60008054610100600160a81b0319166101006001600160a01b038416908102919091178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350734ddc2d193948926d02f9b1fe9e1daa0718270ed560005260016020527f6c8ad9409b802c0693dd52ba88ebdde11e203fa82eb1565344f45c462809262d80546001600160a01b03191673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee179055620000fa565b3390565b613adb806200010a6000396000f3fe6080604052600436106100fe5760003560e01c806375f12b2111610095578063ace8a50911610064578063ace8a50914610573578063dcf48ca914610621578063e689eb9714610654578063ef4658ef14610702578063f2fde38b1461074b576100fe565b806375f12b21146103a65780638da5cb5b146103cf5780638f32d59b146103e45780639e4b38c0146103f9576100fe565b80633615fe4e116100d15780633615fe4e1461027d578063551196d5146102b0578063661f799d146102e3578063715018a614610391576100fe565b8063108d79fb146101555780631385d24c146101a457806317ba3a31146101b95780632b0417e814610223575b33321415610153576040805162461bcd60e51b815260206004820152601860248201527f446f206e6f742073656e6420455448206469726563746c790000000000000000604482015290519081900360640190fd5b005b34801561016157600080fd5b506101886004803603602081101561017857600080fd5b50356001600160a01b031661077e565b604080516001600160a01b039092168252519081900360200190f35b3480156101b057600080fd5b50610153610799565b3480156101c557600080fd5b50610202600480360360808110156101dc57600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356107f4565b604080519283526001600160a01b0390911660208301528051918290030190f35b61026b600480360360c081101561023957600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a00135610913565b60408051918252519081900360200190f35b34801561028957600080fd5b50610188600480360360208110156102a057600080fd5b50356001600160a01b0316610a79565b3480156102bc57600080fd5b50610153600480360360208110156102d357600080fd5b50356001600160a01b0316610a94565b3480156102ef57600080fd5b506101536004803603602081101561030657600080fd5b810190602081018135600160201b81111561032057600080fd5b82018360208201111561033257600080fd5b803590602001918460208302840111600160201b8311171561035357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610b79945050505050565b34801561039d57600080fd5b50610153610c9e565b3480156103b257600080fd5b506103bb610d34565b604080519115158252519081900360200190f35b3480156103db57600080fd5b50610188610d3d565b3480156103f057600080fd5b506103bb610d51565b61026b600480360360e081101561040f57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561043957600080fd5b82018360208201111561044b57600080fd5b803590602001918460208302840111600160201b8311171561046c57600080fd5b919390928235926020810135929190606081019060400135600160201b81111561049557600080fd5b8201836020820111156104a757600080fd5b803590602001918460208302840111600160201b831117156104c857600080fd5b919390929091602081019035600160201b8111156104e557600080fd5b8201836020820111156104f757600080fd5b803590602001918460208302840111600160201b8311171561051857600080fd5b919390929091602081019035600160201b81111561053557600080fd5b82018360208201111561054757600080fd5b803590602001918460208302840111600160201b8311171561056857600080fd5b509092509050610d7a565b34801561057f57600080fd5b506101536004803603602081101561059657600080fd5b810190602081018135600160201b8111156105b057600080fd5b8201836020820111156105c257600080fd5b803590602001918460208302840111600160201b831117156105e357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110ae945050505050565b34801561062d57600080fd5b506101886004803603602081101561064457600080fd5b50356001600160a01b03166111d3565b34801561066057600080fd5b506101536004803603602081101561067757600080fd5b810190602081018135600160201b81111561069157600080fd5b8201836020820111156106a357600080fd5b803590602001918460208302840111600160201b831117156106c457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506111ee945050505050565b34801561070e57600080fd5b506102026004803603608081101561072557600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611311565b34801561075757600080fd5b506101536004803603602081101561076e57600080fd5b50356001600160a01b0316611509565b6001602052600090815260409020546001600160a01b031681565b6107a1610d51565b6107e0576040805162461bcd60e51b81526020600482018190526024820152600080516020613a27833981519152604482015290519081900360640190fd5b6004805460ff19811660ff90911615179055565b600454600090819060ff1615610846576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6001600160a01b03861661089c576040805162461bcd60e51b8152602060048201526018602482015277496e76616c6964207265636569766572206164647265737360401b604482015290519081900360640190fd5b60006108a8868661155c565b90506108b4868261166f565b9093509150838310156108fe576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b610909878385611a77565b5094509492505050565b60045460009060ff1615610963576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6001600160a01b0387166109b9576040805162461bcd60e51b8152602060048201526018602482015277496e76616c6964207265636569766572206164647265737360401b604482015290519081900360640190fd5b6003821115610a02576040805162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103a37902a37b5b2b760811b604482015290519081900360640190fd5b6000610a0e878661155c565b9050610a1c87878386611b09565b915083821015610a63576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b610a6e888784611a77565b509695505050505050565b6003602052600090815260409020546001600160a01b031681565b610a9c610d51565b610adb576040805162461bcd60e51b81526020600482018190526024820152600080516020613a27833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015610b2557600080fd5b505afa158015610b39573d6000803e3d6000fd5b505050506040513d6020811015610b4f57600080fd5b50519050610b75610b5e610d3d565b6001600160a01b038416908363ffffffff6120c716565b5050565b610b81610d51565b610bc0576040805162461bcd60e51b81526020600482018190526024820152600080516020613a27833981519152604482015290519081900360640190fd5b60005b8151811015610b7557818181518110610bd857fe5b60200260200101516001600160a01b03166389d1a0fc6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610c1a57600080fd5b505af1158015610c2e573d6000803e3d6000fd5b505050506040513d6020811015610c4457600080fd5b50518251600390600090859085908110610c5a57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b03191692909116919091179055600101610bc3565b610ca6610d51565b610ce5576040805162461bcd60e51b81526020600482018190526024820152600080516020613a27833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b60045460ff1681565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b0316610d6b612119565b6001600160a01b031614905090565b6000805460ff16610dd2576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff1916905560045460ff1615610e29576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6001600160a01b038c16610e7f576040805162461bcd60e51b8152602060048201526018602482015277496e76616c6964207265636569766572206164647265737360401b604482015290519081900360640190fd5b8a8a6000198101818110610e8f57fe5b905060200201356001600160a01b03166001600160a01b03168b8b6000818110610eb557fe5b905060200201356001600160a01b03166001600160a01b03161415610f1b576040805162461bcd60e51b815260206004820152601760248201527643616e6e6f7420737761702073616d6520746f6b656e7360481b604482015290519081900360640190fd5b6110218b8b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050610f868d8d6000818110610f7057fe5b905060200201356001600160a01b03168c61155c565b89898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525061211d92505050565b905087811015611068576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b6110928c8c8c600019810181811061107c57fe5b905060200201356001600160a01b031683611a77565b6000805460ff191660011790559b9a5050505050505050505050565b6110b6610d51565b6110f5576040805162461bcd60e51b81526020600482018190526024820152600080516020613a27833981519152604482015290519081900360640190fd5b60005b8151811015610b755781818151811061110d57fe5b60200260200101516001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561114f57600080fd5b505af1158015611163573d6000803e3d6000fd5b505050506040513d602081101561117957600080fd5b5051825160019060009085908590811061118f57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b031916929091169190911790556001016110f8565b6002602052600090815260409020546001600160a01b031681565b6111f6610d51565b611235576040805162461bcd60e51b81526020600482018190526024820152600080516020613a27833981519152604482015290519081900360640190fd5b60005b8151811015610b755781818151811061124d57fe5b60200260200101516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561128d57600080fd5b505afa1580156112a1573d6000803e3d6000fd5b505050506040513d60208110156112b757600080fd5b505182516002906000908590859081106112cd57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b03191692909116919091179055600101611238565b600454600090819060ff1615611363576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6001600160a01b0386166113b9576040805162461bcd60e51b8152602060048201526018602482015277496e76616c6964207265636569766572206164647265737360401b604482015290519081900360640190fd5b6001600160a01b03851673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2146114145760405162461bcd60e51b81526004018080602001828103825260308152602001806139f76030913960400191505060405180910390fd5b476000611421878761155c565b905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561147d57600080fd5b505af1158015611491573d6000803e3d6000fd5b505050506114a882476122b690919063ffffffff16565b935060009250848410156114f3576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b6114fe888486611a77565b505094509492505050565b611511610d51565b611550576040805162461bcd60e51b81526020600482018190526024820152600080516020613a27833981519152604482015290519081900360640190fd5b611559816122ff565b50565b60006001600160a01b0383166115b657600034116115af576040805162461bcd60e51b815260206004820152600b60248201526a139bc8195d1a081cd95b9d60aa1b604482015290519081900360640190fd5b5034611669565b60008211611602576040805162461bcd60e51b8152602060048201526014602482015273125b9d985b1a59081d1bdad95b88185b5bdd5b9d60621b604482015290519081900360640190fd5b341561164b576040805162461bcd60e51b815260206004820152601360248201527222ba341039b2b73a103bb4ba34103a37b5b2b760691b604482015290519081900360640190fd5b6116666001600160a01b03841633308563ffffffff6123aa16565b50805b92915050565b6001600160a01b03828116600090815260016020526040812054909182914791161561181c57846001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156116db57600080fd5b505af11580156116ef573d6000803e3d6000fd5b505050506040513d602081101561170557600080fd5b50511561174f576040805162461bcd60e51b81526020600482015260136024820152724572726f7220696e20756e7772617070696e6760681b604482015290519081900360640190fd5b6001600160a01b0380861660009081526001602052604090205416915073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8214156117a25747925061179b838263ffffffff6122b616565b9250611817565b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156117e857600080fd5b505afa1580156117fc573d6000803e3d6000fd5b505050506040513d602081101561181257600080fd5b505192505b611a6f565b6001600160a01b03858116600090815260026020526040902054161561194957846001600160a01b0316632e1a7d4d856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561188257600080fd5b505af1158015611896573d6000803e3d6000fd5b50505050846001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156118d357600080fd5b505afa1580156118e7573d6000803e3d6000fd5b505050506040513d60208110156118fd57600080fd5b5051604080516370a0823160e01b815230600482015290519193506001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156117e857600080fd5b6001600160a01b038581166000908152600360205260409020541615611a6857846001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156119af57600080fd5b505af11580156119c3573d6000803e3d6000fd5b50505050846001600160a01b03166389d1a0fc6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611a0257600080fd5b505af1158015611a16573d6000803e3d6000fd5b505050506040513d6020811015611a2c57600080fd5b505191506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156117a25747925061179b838263ffffffff6122b616565b8491508392505b509250929050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1480611aa957506001600160a01b038216155b15611aea576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015611ae4573d6000803e3d6000fd5b50611b04565b611b046001600160a01b038316848363ffffffff6120c716565b505050565b600081611c37576001600160a01b03851615611b64576040805162461bcd60e51b8152602060048201526015602482015274086c2dcdcdee840eee4c2e040d2dce8de40ae8aa89605b1b604482015290519081900360640190fd5b6001600160a01b03841673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214611bc7576040805162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103a37aa37b5b2b760891b604482015290519081900360640190fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c1657600080fd5b505af1158015611c2a573d6000803e3d6000fd5b50505050508290506120bf565b8160011415611d39576001600160a01b038516611ca757836001600160a01b0316631249c58b846040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c8957600080fd5b505af1158015611c9d573d6000803e3d6000fd5b5050505050611d34565b611cc16001600160a01b038616858563ffffffff61240a16565b836001600160a01b031663a0712d68846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015611d0757600080fd5b505af1158015611d1b573d6000803e3d6000fd5b505050506040513d6020811015611d3157600080fd5b50505b61204a565b8160021415611dbf57611d5c6001600160a01b038616858563ffffffff61240a16565b836001600160a01b031663b6b55f25846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611da257600080fd5b505af1158015611db6573d6000803e3d6000fd5b5050505061204a565b6001600160a01b038516611ece577324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1a57600080fd5b505afa158015611e2e573d6000803e3d6000fd5b505050506040513d6020811015611e4457600080fd5b505160408051636968703360e11b815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60048201526024810186905260006044820181905291516001600160a01b039093169263d2d0e0669287926064808201939182900301818588803b158015611eb057600080fd5b505af1158015611ec4573d6000803e3d6000fd5b505050505061204a565b611f617324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015611f1e57600080fd5b505afa158015611f32573d6000803e3d6000fd5b505050506040513d6020811015611f4857600080fd5b50516001600160a01b038716908563ffffffff61240a16565b7324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611fae57600080fd5b505afa158015611fc2573d6000803e3d6000fd5b505050506040513d6020811015611fd857600080fd5b505160408051636968703360e11b81526001600160a01b03888116600483015260248201879052600060448301819052925193169263d2d0e0669260648084019391929182900301818387803b15801561203157600080fd5b505af1158015612045573d6000803e3d6000fd5b505050505b604080516370a0823160e01b815230600482015290516001600160a01b038616916370a08231916024808301926020929190829003018186803b15801561209057600080fd5b505afa1580156120a4573d6000803e3d6000fd5b505050506040513d60208110156120ba57600080fd5b505190505b949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611b04908490612519565b3390565b600080600080905060606000898860008151811061213757fe5b602002602001015160ff168151811061214c57fe5b6020026020010151905060008090505b87518110156122a457875160009061217b90600163ffffffff6122b616565b82146121a05789826001018151811061219057fe5b602002602001015160ff166121a6565b60018c51035b90508b81815181106121b457fe5b602002602001015195508882815181106121ca57fe5b602002602001015160ff1660021415612208576122018c8b84815181106121ed57fe5b602002602001015160ff16836001016126d1565b9350612273565b6040805160018082528183019092529060208083019080388339019050509350878580600101965060ff168151811061223d57fe5b60200260200101518460008151811061225257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b61229683878d8c868151811061228557fe5b602002602001015160ff1688612874565b9a508592505060010161215c565b50889450505050505b95945050505050565b60006122f883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612994565b9392505050565b6001600160a01b0381166123445760405162461bcd60e51b81526004018080602001828103825260268152602001806139d16026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612404908590612519565b50505050565b801580612490575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561246257600080fd5b505afa158015612476573d6000803e3d6000fd5b505050506040513d602081101561248c57600080fd5b5051155b6124cb5760405162461bcd60e51b8152600401808060200182810382526036815260200180613a716036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611b049084905b61252b826001600160a01b0316612a2b565b61257c576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106125ba5780518252601f19909201916020918201910161259b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461261c576040519150601f19603f3d011682016040523d82523d6000602084013e612621565b606091505b509150915081612678576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156124045780806020019051602081101561269457600080fd5b50516124045760405162461bcd60e51b815260040180806020018281038252602a815260200180613a47602a913960400191505060405180910390fd5b606060006126e5838563ffffffff6122b616565b90506001811161272d576040805162461bcd60e51b815260206004820152600e60248201526d08aa4a4beaa9c92ac64bea082a8960931b604482015290519081900360640190fd5b80604051908082528060200260200182016040528015612757578160200160208202803883390190505b50915060005b8181101561286b5760006001600160a01b0316868287018151811061277e57fe5b60200260200101516001600160a01b031614806127d5575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b031686828701815181106127c257fe5b60200260200101516001600160a01b0316145b156128205773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28382815181106127fb57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050612863565b858186018151811061282e57fe5b602002602001015183828151811061284257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b60010161275d565b50509392505050565b6000846001600160a01b0316866001600160a01b031614156128d7576040805162461bcd60e51b815260206004820152601760248201527643616e6e6f7420737761702073616d6520746f6b656e7360481b604482015290519081900360640190fd5b6003831115612920576040805162461bcd60e51b815260206004820152601060248201526f496e76616c69642045786368616e676560801b604482015290519081900360640190fd5b82600114156129525761294b8260008151811061293957fe5b60200260200101518787876001612a64565b90506122ad565b82600214156129695761294b868684876001612f75565b82600314156122ad5761294b8260008151811061298257fe5b60200260200101518787876001613411565b60008184841115612a235760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129e85781810151838201526020016129d0565b50505050905090810190601f168015612a155780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906120bf575050151592915050565b6040805163615db6e160e11b81526001600160a01b03871660048201529051600091739424b1412450d0f8fc2255faf6046b98213b76bd9163c2bb6dc291602480820192602092909190829003018186803b158015612ac257600080fd5b505afa158015612ad6573d6000803e3d6000fd5b505050506040513d6020811015612aec57600080fd5b5051612b37576040805162461bcd60e51b8152602060048201526015602482015274125b9d985b1a590818985b185b98d95c881c1bdbdb605a1b604482015290519081900360640190fd5b6000869050806001600160a01b031663fde924f76040518163ffffffff1660e01b815260040160206040518083038186803b158015612b7557600080fd5b505afa158015612b89573d6000803e3d6000fd5b505050506040513d6020811015612b9f57600080fd5b5051612bf2576040805162461bcd60e51b815260206004820152601e60248201527f53776170206e6f7420616c6c6f77656420666f72207468697320706f6f6c0000604482015290519081900360640190fd5b846001600160a01b038716612c855773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c5057600080fd5b505af1158015612c64573d6000803e3d6000fd5b505050505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29650612caa565b6001600160a01b038616612caa575073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b816001600160a01b0316632f37b624886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612d0057600080fd5b505afa158015612d14573d6000803e3d6000fd5b505050506040513d6020811015612d2a57600080fd5b5051612d74576040805162461bcd60e51b8152602060048201526014602482015273119c9bdb48151bdad95b881b9bdd08189bdd5b9960621b604482015290519081900360640190fd5b816001600160a01b0316632f37b624826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612dca57600080fd5b505afa158015612dde573d6000803e3d6000fd5b505050506040513d6020811015612df457600080fd5b5051612e3c576040805162461bcd60e51b8152602060048201526012602482015271151bc8151bdad95b881b9bdd08189bdd5b9960721b604482015290519081900360640190fd5b612e566001600160a01b038816898763ffffffff61240a16565b60408051638201aa3f60e01b81526001600160a01b038981166004830152602482018890528381166044830152606482018790526000196084830152825190851692638201aa3f9260a480820193918290030181600087803b158015612ebb57600080fd5b505af1158015612ecf573d6000803e3d6000fd5b505050506040513d6040811015612ee557600080fd5b505192506001600160a01b038616612f6a5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612f5157600080fd5b505af1158015612f65573d6000803e3d6000fd5b505050505b505095945050505050565b600082866001600160a01b03811615612fc557612f92888661166f565b9092509050612fc56001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d8463ffffffff61240a16565b6001600160a01b03881661316957604051637ff36ab560e01b8152600481018581523060448301819052600f60fc1b606484018190526080602485019081528a5160848601528a51737a250d5630b4cf539739df2c5dacb4c659f2488d95637ff36ab59589958c958f959194909360a401906020808801910280838360005b8381101561305c578181015183820152602001613044565b50505050905001955050505050506000604051808303818588803b15801561308357600080fd5b505af1158015613097573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405260208110156130c157600080fd5b8101908080516040519392919084600160201b8211156130e057600080fd5b9083019060208201858111156130f557600080fd5b82518660208202830111600160201b8211171561311157600080fd5b82525081516020918201928201910280838360005b8381101561313e578181015183820152602001613126565b5050505090500160405250505060018751038151811061315a57fe5b60200260200101519250612f6a565b6001600160a01b03871661326d576040516318cbafe560e01b815260048101838152602482018690523060648301819052600f60fc1b6084840181905260a0604485019081528a5160a48601528a51737a250d5630b4cf539739df2c5dacb4c659f2488d956318cbafe59589958c958f959194909360c401906020808801910280838360005b838110156132075781810151838201526020016131ef565b505050509050019650505050505050600060405180830381600087803b15801561323057600080fd5b505af1158015613244573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156130c157600080fd5b6040516338ed173960e01b815260048101838152602482018690523060648301819052600f60fc1b6084840181905260a0604485019081528a5160a48601528a51737a250d5630b4cf539739df2c5dacb4c659f2488d956338ed17399589958c958f959194909360c401906020808801910280838360005b838110156132fd5781810151838201526020016132e5565b505050509050019650505050505050600060405180830381600087803b15801561332657600080fd5b505af115801561333a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561336357600080fd5b8101908080516040519392919084600160201b82111561338257600080fd5b90830190602082018581111561339757600080fd5b82518660208202830111600160201b821117156133b357600080fd5b82525081516020918201928201910280838360005b838110156133e05781810151838201526020016133c8565b505050509050016040525050506001875103815181106133fc57fe5b60200260200101519250505095945050505050565b60006001600160a01b03861661346e576040805162461bcd60e51b815260206004820152601960248201527f4552525f496e766169645f63757276655f65786368616e676500000000000000604482015290519081900360640190fd5b8560008061347c888761166f565b909250905061349b6001600160a01b0382168a8463ffffffff61240a16565b6000806001600160a01b038b167393054188d876f558f4a66b2ef1d97d16edf0895b14806134e557506001600160a01b038b16737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b156136e65760006001600160a01b038c167393054188d876f558f4a66b2ef1d97d16edf0895b1461351757600361351a565b60025b60ff16905060005b81600f0b81600f0b121561366257846001600160a01b0316876001600160a01b03166323746eb8836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561358457600080fd5b505afa158015613598573d6000803e3d6000fd5b505050506040513d60208110156135ae57600080fd5b50516001600160a01b031614156135c75780935061365a565b8a6001600160a01b0316876001600160a01b03166323746eb8836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561361b57600080fd5b505afa15801561362f573d6000803e3d6000fd5b505050506040513d602081101561364557600080fd5b50516001600160a01b0316141561365a578092505b600101613522565b5060408051630f7c084960e21b8152600f85810b810b600483015284810b900b602482015260448101879052606481018a905290516001600160a01b03881691633df0212491608480830192600092919082900301818387803b1580156136c857600080fd5b505af11580156136dc573d6000803e3d6000fd5b505050505061390e565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a567352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60046001600160a01b038e1683141561372b57506002613749565b816001600160a01b03168e6001600160a01b03161415613749575060035b60005b81600f0b81600f0b121561388c57866001600160a01b0316896001600160a01b031663b739953e836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b1580156137ae57600080fd5b505afa1580156137c2573d6000803e3d6000fd5b505050506040513d60208110156137d857600080fd5b50516001600160a01b031614156137f157809550613884565b8c6001600160a01b0316896001600160a01b031663b739953e836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561384557600080fd5b505afa158015613859573d6000803e3d6000fd5b505050506040513d602081101561386f57600080fd5b50516001600160a01b03161415613884578094505b60010161374c565b5060408051635320bf6b60e11b8152600f87810b810b600483015286810b900b602482015260448101899052606481018c905290516001600160a01b038a169163a6417ed691608480830192600092919082900301818387803b1580156138f257600080fd5b505af1158015613906573d6000803e3d6000fd5b505050505050505b6001600160a01b03891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148061394057506001600160a01b038916155b1561394d574795506139c2565b604080516370a0823160e01b815230600482015290516001600160a01b038b16916370a08231916024808301926020929190829003018186803b15801561399357600080fd5b505afa1580156139a7573d6000803e3d6000fd5b505050506040513d60208110156139bd57600080fd5b505195505b50505050509594505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f6e6c7920756e777261707320574554482c2075736520756e77726170282920666f72206f7468657220746f6b656e734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820bf8059556f649b915b797cbbcd86ed406eae09723a3e21105c3886b7f0aee50a64736f6c63430005110032
Deployed Bytecode
0x6080604052600436106100fe5760003560e01c806375f12b2111610095578063ace8a50911610064578063ace8a50914610573578063dcf48ca914610621578063e689eb9714610654578063ef4658ef14610702578063f2fde38b1461074b576100fe565b806375f12b21146103a65780638da5cb5b146103cf5780638f32d59b146103e45780639e4b38c0146103f9576100fe565b80633615fe4e116100d15780633615fe4e1461027d578063551196d5146102b0578063661f799d146102e3578063715018a614610391576100fe565b8063108d79fb146101555780631385d24c146101a457806317ba3a31146101b95780632b0417e814610223575b33321415610153576040805162461bcd60e51b815260206004820152601860248201527f446f206e6f742073656e6420455448206469726563746c790000000000000000604482015290519081900360640190fd5b005b34801561016157600080fd5b506101886004803603602081101561017857600080fd5b50356001600160a01b031661077e565b604080516001600160a01b039092168252519081900360200190f35b3480156101b057600080fd5b50610153610799565b3480156101c557600080fd5b50610202600480360360808110156101dc57600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356107f4565b604080519283526001600160a01b0390911660208301528051918290030190f35b61026b600480360360c081101561023957600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a00135610913565b60408051918252519081900360200190f35b34801561028957600080fd5b50610188600480360360208110156102a057600080fd5b50356001600160a01b0316610a79565b3480156102bc57600080fd5b50610153600480360360208110156102d357600080fd5b50356001600160a01b0316610a94565b3480156102ef57600080fd5b506101536004803603602081101561030657600080fd5b810190602081018135600160201b81111561032057600080fd5b82018360208201111561033257600080fd5b803590602001918460208302840111600160201b8311171561035357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610b79945050505050565b34801561039d57600080fd5b50610153610c9e565b3480156103b257600080fd5b506103bb610d34565b604080519115158252519081900360200190f35b3480156103db57600080fd5b50610188610d3d565b3480156103f057600080fd5b506103bb610d51565b61026b600480360360e081101561040f57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561043957600080fd5b82018360208201111561044b57600080fd5b803590602001918460208302840111600160201b8311171561046c57600080fd5b919390928235926020810135929190606081019060400135600160201b81111561049557600080fd5b8201836020820111156104a757600080fd5b803590602001918460208302840111600160201b831117156104c857600080fd5b919390929091602081019035600160201b8111156104e557600080fd5b8201836020820111156104f757600080fd5b803590602001918460208302840111600160201b8311171561051857600080fd5b919390929091602081019035600160201b81111561053557600080fd5b82018360208201111561054757600080fd5b803590602001918460208302840111600160201b8311171561056857600080fd5b509092509050610d7a565b34801561057f57600080fd5b506101536004803603602081101561059657600080fd5b810190602081018135600160201b8111156105b057600080fd5b8201836020820111156105c257600080fd5b803590602001918460208302840111600160201b831117156105e357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110ae945050505050565b34801561062d57600080fd5b506101886004803603602081101561064457600080fd5b50356001600160a01b03166111d3565b34801561066057600080fd5b506101536004803603602081101561067757600080fd5b810190602081018135600160201b81111561069157600080fd5b8201836020820111156106a357600080fd5b803590602001918460208302840111600160201b831117156106c457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506111ee945050505050565b34801561070e57600080fd5b506102026004803603608081101561072557600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611311565b34801561075757600080fd5b506101536004803603602081101561076e57600080fd5b50356001600160a01b0316611509565b6001602052600090815260409020546001600160a01b031681565b6107a1610d51565b6107e0576040805162461bcd60e51b81526020600482018190526024820152600080516020613a27833981519152604482015290519081900360640190fd5b6004805460ff19811660ff90911615179055565b600454600090819060ff1615610846576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6001600160a01b03861661089c576040805162461bcd60e51b8152602060048201526018602482015277496e76616c6964207265636569766572206164647265737360401b604482015290519081900360640190fd5b60006108a8868661155c565b90506108b4868261166f565b9093509150838310156108fe576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b610909878385611a77565b5094509492505050565b60045460009060ff1615610963576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6001600160a01b0387166109b9576040805162461bcd60e51b8152602060048201526018602482015277496e76616c6964207265636569766572206164647265737360401b604482015290519081900360640190fd5b6003821115610a02576040805162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103a37902a37b5b2b760811b604482015290519081900360640190fd5b6000610a0e878661155c565b9050610a1c87878386611b09565b915083821015610a63576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b610a6e888784611a77565b509695505050505050565b6003602052600090815260409020546001600160a01b031681565b610a9c610d51565b610adb576040805162461bcd60e51b81526020600482018190526024820152600080516020613a27833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015610b2557600080fd5b505afa158015610b39573d6000803e3d6000fd5b505050506040513d6020811015610b4f57600080fd5b50519050610b75610b5e610d3d565b6001600160a01b038416908363ffffffff6120c716565b5050565b610b81610d51565b610bc0576040805162461bcd60e51b81526020600482018190526024820152600080516020613a27833981519152604482015290519081900360640190fd5b60005b8151811015610b7557818181518110610bd857fe5b60200260200101516001600160a01b03166389d1a0fc6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610c1a57600080fd5b505af1158015610c2e573d6000803e3d6000fd5b505050506040513d6020811015610c4457600080fd5b50518251600390600090859085908110610c5a57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b03191692909116919091179055600101610bc3565b610ca6610d51565b610ce5576040805162461bcd60e51b81526020600482018190526024820152600080516020613a27833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b60045460ff1681565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b0316610d6b612119565b6001600160a01b031614905090565b6000805460ff16610dd2576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff1916905560045460ff1615610e29576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6001600160a01b038c16610e7f576040805162461bcd60e51b8152602060048201526018602482015277496e76616c6964207265636569766572206164647265737360401b604482015290519081900360640190fd5b8a8a6000198101818110610e8f57fe5b905060200201356001600160a01b03166001600160a01b03168b8b6000818110610eb557fe5b905060200201356001600160a01b03166001600160a01b03161415610f1b576040805162461bcd60e51b815260206004820152601760248201527643616e6e6f7420737761702073616d6520746f6b656e7360481b604482015290519081900360640190fd5b6110218b8b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050610f868d8d6000818110610f7057fe5b905060200201356001600160a01b03168c61155c565b89898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525061211d92505050565b905087811015611068576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b6110928c8c8c600019810181811061107c57fe5b905060200201356001600160a01b031683611a77565b6000805460ff191660011790559b9a5050505050505050505050565b6110b6610d51565b6110f5576040805162461bcd60e51b81526020600482018190526024820152600080516020613a27833981519152604482015290519081900360640190fd5b60005b8151811015610b755781818151811061110d57fe5b60200260200101516001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561114f57600080fd5b505af1158015611163573d6000803e3d6000fd5b505050506040513d602081101561117957600080fd5b5051825160019060009085908590811061118f57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b031916929091169190911790556001016110f8565b6002602052600090815260409020546001600160a01b031681565b6111f6610d51565b611235576040805162461bcd60e51b81526020600482018190526024820152600080516020613a27833981519152604482015290519081900360640190fd5b60005b8151811015610b755781818151811061124d57fe5b60200260200101516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561128d57600080fd5b505afa1580156112a1573d6000803e3d6000fd5b505050506040513d60208110156112b757600080fd5b505182516002906000908590859081106112cd57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b03191692909116919091179055600101611238565b600454600090819060ff1615611363576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6001600160a01b0386166113b9576040805162461bcd60e51b8152602060048201526018602482015277496e76616c6964207265636569766572206164647265737360401b604482015290519081900360640190fd5b6001600160a01b03851673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2146114145760405162461bcd60e51b81526004018080602001828103825260308152602001806139f76030913960400191505060405180910390fd5b476000611421878761155c565b905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561147d57600080fd5b505af1158015611491573d6000803e3d6000fd5b505050506114a882476122b690919063ffffffff16565b935060009250848410156114f3576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b6114fe888486611a77565b505094509492505050565b611511610d51565b611550576040805162461bcd60e51b81526020600482018190526024820152600080516020613a27833981519152604482015290519081900360640190fd5b611559816122ff565b50565b60006001600160a01b0383166115b657600034116115af576040805162461bcd60e51b815260206004820152600b60248201526a139bc8195d1a081cd95b9d60aa1b604482015290519081900360640190fd5b5034611669565b60008211611602576040805162461bcd60e51b8152602060048201526014602482015273125b9d985b1a59081d1bdad95b88185b5bdd5b9d60621b604482015290519081900360640190fd5b341561164b576040805162461bcd60e51b815260206004820152601360248201527222ba341039b2b73a103bb4ba34103a37b5b2b760691b604482015290519081900360640190fd5b6116666001600160a01b03841633308563ffffffff6123aa16565b50805b92915050565b6001600160a01b03828116600090815260016020526040812054909182914791161561181c57846001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156116db57600080fd5b505af11580156116ef573d6000803e3d6000fd5b505050506040513d602081101561170557600080fd5b50511561174f576040805162461bcd60e51b81526020600482015260136024820152724572726f7220696e20756e7772617070696e6760681b604482015290519081900360640190fd5b6001600160a01b0380861660009081526001602052604090205416915073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8214156117a25747925061179b838263ffffffff6122b616565b9250611817565b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156117e857600080fd5b505afa1580156117fc573d6000803e3d6000fd5b505050506040513d602081101561181257600080fd5b505192505b611a6f565b6001600160a01b03858116600090815260026020526040902054161561194957846001600160a01b0316632e1a7d4d856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561188257600080fd5b505af1158015611896573d6000803e3d6000fd5b50505050846001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156118d357600080fd5b505afa1580156118e7573d6000803e3d6000fd5b505050506040513d60208110156118fd57600080fd5b5051604080516370a0823160e01b815230600482015290519193506001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156117e857600080fd5b6001600160a01b038581166000908152600360205260409020541615611a6857846001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156119af57600080fd5b505af11580156119c3573d6000803e3d6000fd5b50505050846001600160a01b03166389d1a0fc6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611a0257600080fd5b505af1158015611a16573d6000803e3d6000fd5b505050506040513d6020811015611a2c57600080fd5b505191506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156117a25747925061179b838263ffffffff6122b616565b8491508392505b509250929050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1480611aa957506001600160a01b038216155b15611aea576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015611ae4573d6000803e3d6000fd5b50611b04565b611b046001600160a01b038316848363ffffffff6120c716565b505050565b600081611c37576001600160a01b03851615611b64576040805162461bcd60e51b8152602060048201526015602482015274086c2dcdcdee840eee4c2e040d2dce8de40ae8aa89605b1b604482015290519081900360640190fd5b6001600160a01b03841673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214611bc7576040805162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103a37aa37b5b2b760891b604482015290519081900360640190fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c1657600080fd5b505af1158015611c2a573d6000803e3d6000fd5b50505050508290506120bf565b8160011415611d39576001600160a01b038516611ca757836001600160a01b0316631249c58b846040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c8957600080fd5b505af1158015611c9d573d6000803e3d6000fd5b5050505050611d34565b611cc16001600160a01b038616858563ffffffff61240a16565b836001600160a01b031663a0712d68846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015611d0757600080fd5b505af1158015611d1b573d6000803e3d6000fd5b505050506040513d6020811015611d3157600080fd5b50505b61204a565b8160021415611dbf57611d5c6001600160a01b038616858563ffffffff61240a16565b836001600160a01b031663b6b55f25846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611da257600080fd5b505af1158015611db6573d6000803e3d6000fd5b5050505061204a565b6001600160a01b038516611ece577324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1a57600080fd5b505afa158015611e2e573d6000803e3d6000fd5b505050506040513d6020811015611e4457600080fd5b505160408051636968703360e11b815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60048201526024810186905260006044820181905291516001600160a01b039093169263d2d0e0669287926064808201939182900301818588803b158015611eb057600080fd5b505af1158015611ec4573d6000803e3d6000fd5b505050505061204a565b611f617324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015611f1e57600080fd5b505afa158015611f32573d6000803e3d6000fd5b505050506040513d6020811015611f4857600080fd5b50516001600160a01b038716908563ffffffff61240a16565b7324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611fae57600080fd5b505afa158015611fc2573d6000803e3d6000fd5b505050506040513d6020811015611fd857600080fd5b505160408051636968703360e11b81526001600160a01b03888116600483015260248201879052600060448301819052925193169263d2d0e0669260648084019391929182900301818387803b15801561203157600080fd5b505af1158015612045573d6000803e3d6000fd5b505050505b604080516370a0823160e01b815230600482015290516001600160a01b038616916370a08231916024808301926020929190829003018186803b15801561209057600080fd5b505afa1580156120a4573d6000803e3d6000fd5b505050506040513d60208110156120ba57600080fd5b505190505b949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611b04908490612519565b3390565b600080600080905060606000898860008151811061213757fe5b602002602001015160ff168151811061214c57fe5b6020026020010151905060008090505b87518110156122a457875160009061217b90600163ffffffff6122b616565b82146121a05789826001018151811061219057fe5b602002602001015160ff166121a6565b60018c51035b90508b81815181106121b457fe5b602002602001015195508882815181106121ca57fe5b602002602001015160ff1660021415612208576122018c8b84815181106121ed57fe5b602002602001015160ff16836001016126d1565b9350612273565b6040805160018082528183019092529060208083019080388339019050509350878580600101965060ff168151811061223d57fe5b60200260200101518460008151811061225257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b61229683878d8c868151811061228557fe5b602002602001015160ff1688612874565b9a508592505060010161215c565b50889450505050505b95945050505050565b60006122f883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612994565b9392505050565b6001600160a01b0381166123445760405162461bcd60e51b81526004018080602001828103825260268152602001806139d16026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612404908590612519565b50505050565b801580612490575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561246257600080fd5b505afa158015612476573d6000803e3d6000fd5b505050506040513d602081101561248c57600080fd5b5051155b6124cb5760405162461bcd60e51b8152600401808060200182810382526036815260200180613a716036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611b049084905b61252b826001600160a01b0316612a2b565b61257c576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106125ba5780518252601f19909201916020918201910161259b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461261c576040519150601f19603f3d011682016040523d82523d6000602084013e612621565b606091505b509150915081612678576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156124045780806020019051602081101561269457600080fd5b50516124045760405162461bcd60e51b815260040180806020018281038252602a815260200180613a47602a913960400191505060405180910390fd5b606060006126e5838563ffffffff6122b616565b90506001811161272d576040805162461bcd60e51b815260206004820152600e60248201526d08aa4a4beaa9c92ac64bea082a8960931b604482015290519081900360640190fd5b80604051908082528060200260200182016040528015612757578160200160208202803883390190505b50915060005b8181101561286b5760006001600160a01b0316868287018151811061277e57fe5b60200260200101516001600160a01b031614806127d5575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b031686828701815181106127c257fe5b60200260200101516001600160a01b0316145b156128205773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28382815181106127fb57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050612863565b858186018151811061282e57fe5b602002602001015183828151811061284257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b60010161275d565b50509392505050565b6000846001600160a01b0316866001600160a01b031614156128d7576040805162461bcd60e51b815260206004820152601760248201527643616e6e6f7420737761702073616d6520746f6b656e7360481b604482015290519081900360640190fd5b6003831115612920576040805162461bcd60e51b815260206004820152601060248201526f496e76616c69642045786368616e676560801b604482015290519081900360640190fd5b82600114156129525761294b8260008151811061293957fe5b60200260200101518787876001612a64565b90506122ad565b82600214156129695761294b868684876001612f75565b82600314156122ad5761294b8260008151811061298257fe5b60200260200101518787876001613411565b60008184841115612a235760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129e85781810151838201526020016129d0565b50505050905090810190601f168015612a155780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906120bf575050151592915050565b6040805163615db6e160e11b81526001600160a01b03871660048201529051600091739424b1412450d0f8fc2255faf6046b98213b76bd9163c2bb6dc291602480820192602092909190829003018186803b158015612ac257600080fd5b505afa158015612ad6573d6000803e3d6000fd5b505050506040513d6020811015612aec57600080fd5b5051612b37576040805162461bcd60e51b8152602060048201526015602482015274125b9d985b1a590818985b185b98d95c881c1bdbdb605a1b604482015290519081900360640190fd5b6000869050806001600160a01b031663fde924f76040518163ffffffff1660e01b815260040160206040518083038186803b158015612b7557600080fd5b505afa158015612b89573d6000803e3d6000fd5b505050506040513d6020811015612b9f57600080fd5b5051612bf2576040805162461bcd60e51b815260206004820152601e60248201527f53776170206e6f7420616c6c6f77656420666f72207468697320706f6f6c0000604482015290519081900360640190fd5b846001600160a01b038716612c855773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c5057600080fd5b505af1158015612c64573d6000803e3d6000fd5b505050505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29650612caa565b6001600160a01b038616612caa575073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b816001600160a01b0316632f37b624886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612d0057600080fd5b505afa158015612d14573d6000803e3d6000fd5b505050506040513d6020811015612d2a57600080fd5b5051612d74576040805162461bcd60e51b8152602060048201526014602482015273119c9bdb48151bdad95b881b9bdd08189bdd5b9960621b604482015290519081900360640190fd5b816001600160a01b0316632f37b624826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612dca57600080fd5b505afa158015612dde573d6000803e3d6000fd5b505050506040513d6020811015612df457600080fd5b5051612e3c576040805162461bcd60e51b8152602060048201526012602482015271151bc8151bdad95b881b9bdd08189bdd5b9960721b604482015290519081900360640190fd5b612e566001600160a01b038816898763ffffffff61240a16565b60408051638201aa3f60e01b81526001600160a01b038981166004830152602482018890528381166044830152606482018790526000196084830152825190851692638201aa3f9260a480820193918290030181600087803b158015612ebb57600080fd5b505af1158015612ecf573d6000803e3d6000fd5b505050506040513d6040811015612ee557600080fd5b505192506001600160a01b038616612f6a5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612f5157600080fd5b505af1158015612f65573d6000803e3d6000fd5b505050505b505095945050505050565b600082866001600160a01b03811615612fc557612f92888661166f565b9092509050612fc56001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d8463ffffffff61240a16565b6001600160a01b03881661316957604051637ff36ab560e01b8152600481018581523060448301819052600f60fc1b606484018190526080602485019081528a5160848601528a51737a250d5630b4cf539739df2c5dacb4c659f2488d95637ff36ab59589958c958f959194909360a401906020808801910280838360005b8381101561305c578181015183820152602001613044565b50505050905001955050505050506000604051808303818588803b15801561308357600080fd5b505af1158015613097573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405260208110156130c157600080fd5b8101908080516040519392919084600160201b8211156130e057600080fd5b9083019060208201858111156130f557600080fd5b82518660208202830111600160201b8211171561311157600080fd5b82525081516020918201928201910280838360005b8381101561313e578181015183820152602001613126565b5050505090500160405250505060018751038151811061315a57fe5b60200260200101519250612f6a565b6001600160a01b03871661326d576040516318cbafe560e01b815260048101838152602482018690523060648301819052600f60fc1b6084840181905260a0604485019081528a5160a48601528a51737a250d5630b4cf539739df2c5dacb4c659f2488d956318cbafe59589958c958f959194909360c401906020808801910280838360005b838110156132075781810151838201526020016131ef565b505050509050019650505050505050600060405180830381600087803b15801561323057600080fd5b505af1158015613244573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156130c157600080fd5b6040516338ed173960e01b815260048101838152602482018690523060648301819052600f60fc1b6084840181905260a0604485019081528a5160a48601528a51737a250d5630b4cf539739df2c5dacb4c659f2488d956338ed17399589958c958f959194909360c401906020808801910280838360005b838110156132fd5781810151838201526020016132e5565b505050509050019650505050505050600060405180830381600087803b15801561332657600080fd5b505af115801561333a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561336357600080fd5b8101908080516040519392919084600160201b82111561338257600080fd5b90830190602082018581111561339757600080fd5b82518660208202830111600160201b821117156133b357600080fd5b82525081516020918201928201910280838360005b838110156133e05781810151838201526020016133c8565b505050509050016040525050506001875103815181106133fc57fe5b60200260200101519250505095945050505050565b60006001600160a01b03861661346e576040805162461bcd60e51b815260206004820152601960248201527f4552525f496e766169645f63757276655f65786368616e676500000000000000604482015290519081900360640190fd5b8560008061347c888761166f565b909250905061349b6001600160a01b0382168a8463ffffffff61240a16565b6000806001600160a01b038b167393054188d876f558f4a66b2ef1d97d16edf0895b14806134e557506001600160a01b038b16737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b156136e65760006001600160a01b038c167393054188d876f558f4a66b2ef1d97d16edf0895b1461351757600361351a565b60025b60ff16905060005b81600f0b81600f0b121561366257846001600160a01b0316876001600160a01b03166323746eb8836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561358457600080fd5b505afa158015613598573d6000803e3d6000fd5b505050506040513d60208110156135ae57600080fd5b50516001600160a01b031614156135c75780935061365a565b8a6001600160a01b0316876001600160a01b03166323746eb8836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561361b57600080fd5b505afa15801561362f573d6000803e3d6000fd5b505050506040513d602081101561364557600080fd5b50516001600160a01b0316141561365a578092505b600101613522565b5060408051630f7c084960e21b8152600f85810b810b600483015284810b900b602482015260448101879052606481018a905290516001600160a01b03881691633df0212491608480830192600092919082900301818387803b1580156136c857600080fd5b505af11580156136dc573d6000803e3d6000fd5b505050505061390e565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a567352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60046001600160a01b038e1683141561372b57506002613749565b816001600160a01b03168e6001600160a01b03161415613749575060035b60005b81600f0b81600f0b121561388c57866001600160a01b0316896001600160a01b031663b739953e836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b1580156137ae57600080fd5b505afa1580156137c2573d6000803e3d6000fd5b505050506040513d60208110156137d857600080fd5b50516001600160a01b031614156137f157809550613884565b8c6001600160a01b0316896001600160a01b031663b739953e836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561384557600080fd5b505afa158015613859573d6000803e3d6000fd5b505050506040513d602081101561386f57600080fd5b50516001600160a01b03161415613884578094505b60010161374c565b5060408051635320bf6b60e11b8152600f87810b810b600483015286810b900b602482015260448101899052606481018c905290516001600160a01b038a169163a6417ed691608480830192600092919082900301818387803b1580156138f257600080fd5b505af1158015613906573d6000803e3d6000fd5b505050505050505b6001600160a01b03891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148061394057506001600160a01b038916155b1561394d574795506139c2565b604080516370a0823160e01b815230600482015290516001600160a01b038b16916370a08231916024808301926020929190829003018186803b15801561399357600080fd5b505afa1580156139a7573d6000803e3d6000fd5b505050506040513d60208110156139bd57600080fd5b505195505b50505050509594505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f6e6c7920756e777261707320574554482c2075736520756e77726170282920666f72206f7468657220746f6b656e734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820bf8059556f649b915b797cbbcd86ed406eae09723a3e21105c3886b7f0aee50a64736f6c63430005110032
Deployed Bytecode Sourcemap
29028:21057:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50022:10;50036:9;50022:23;;50014:60;;;;;-1:-1:-1;;;50014:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29028:21057;30244:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30244:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30244:41:0;-1:-1:-1;;;;;30244:41:0;;:::i;:::-;;;;-1:-1:-1;;;;;30244:41:0;;;;;;;;;;;;;;49694:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49694:86:0;;;:::i;43167:759::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43167:759:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;43167:759:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;43167:759:0;;;;;;;;;;;;;;;;45720:904;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;45720:904:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30340:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30340:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30340:41:0;-1:-1:-1;;;;;30340:41:0;;:::i;49463:191::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49463:191:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49463:191:0;-1:-1:-1;;;;;49463:191:0;;:::i;31499:217::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31499:217:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31499:217:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;31499:217:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31499:217:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31499:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;31499:217:0;;-1:-1:-1;31499:217:0;;-1:-1:-1;;;;;31499:217:0:i;8063:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8063:140:0;;;:::i;30390:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30390:27:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;7252:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7252:79:0;;;:::i;7618:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7618:94:0;;;:::i;32342:876::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;32342:876:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;32342:876:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32342:876:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32342:876:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;32342:876:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32342:876:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32342:876:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;32342:876:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32342:876:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32342:876:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;32342:876:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32342:876:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;32342:876:0;;-1:-1:-1;32342:876:0;-1:-1:-1;32342:876:0;:::i;30809:207::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30809:207:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30809:207:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;30809:207:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30809:207:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30809:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;30809:207:0;;-1:-1:-1;30809:207:0;;-1:-1:-1;;;;;30809:207:0:i;30292:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30292:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30292:41:0;-1:-1:-1;;;;;30292:41:0;;:::i;31144:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31144:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31144:199:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;31144:199:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31144:199:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31144:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;31144:199:0;;-1:-1:-1;31144:199:0;;-1:-1:-1;;;;;31144:199:0:i;42148:1011::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42148:1011:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;42148:1011:0;;;;;;;;;;;;;;;;;;;;;;:::i;8358:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8358:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8358:109:0;-1:-1:-1;;;;;8358:109:0;;:::i;30244:41::-;;;;;;;;;;;;-1:-1:-1;;;;;30244:41:0;;:::o;49694:86::-;7464:9;:7;:9::i;:::-;7456:54;;;;;-1:-1:-1;;;7456:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7456:54:0;;;;;;;;;;;;;;;49765:7;;;-1:-1:-1;;49754:18:0;;49765:7;;;;49764:8;49754:18;;;49694:86::o;43167:759::-;49862:7;;43393:23;;;;49862:7;;49858:102;;;49886:28;;;-1:-1:-1;;;49886:28:0;;;;;;;;;;;;-1:-1:-1;;;49886:28:0;;;;;;;;;;;;;;49858:102;-1:-1:-1;;;;;43459:28:0;;43451:65;;;;;-1:-1:-1;;;43451:65:0;;;;;;;;;;;;-1:-1:-1;;;43451:65:0;;;;;;;;;;;;;;;43527:20;43550:88;43575:25;43615:12;43550:10;:88::i;:::-;43527:111;;43680:85;43702:25;43742:12;43680:7;:85::i;:::-;43651:114;;-1:-1:-1;43651:114:0;-1:-1:-1;43786:28:0;;;;43778:54;;;;;-1:-1:-1;;;43778:54:0;;;;;;;;;;;;-1:-1:-1;;;43778:54:0;;;;;;;;;;;;;;;43865:53;43877:14;43893:7;43902:15;43865:11;:53::i;:::-;49947:1;43167:759;;;;;;;:::o;45720:904::-;49862:7;;45995:21;;49862:7;;49858:102;;;49886:28;;;-1:-1:-1;;;49886:28:0;;;;;;;;;;;;-1:-1:-1;;;49886:28:0;;;;;;;;;;;;;;49858:102;-1:-1:-1;;;;;46037:28:0;;46029:65;;;;;-1:-1:-1;;;46029:65:0;;;;;;;;;;;;-1:-1:-1;;;46029:65:0;;;;;;;;;;;;;;;46126:1;46113:9;:14;;46105:43;;;;;-1:-1:-1;;;46105:43:0;;;;;;;;;;;;-1:-1:-1;;;46105:43:0;;;;;;;;;;;;;;;46159:20;46182:88;46207:25;46247:12;46182:10;:88::i;:::-;46159:111;;46299:145;46319:25;46359:23;46397:12;46424:9;46299:5;:145::i;:::-;46283:161;;46482:9;46465:13;:26;;46457:52;;;;;-1:-1:-1;;;46457:52:0;;;;;;;;;;;;-1:-1:-1;;;46457:52:0;;;;;;;;;;;;;;;46549:67;46561:14;46577:23;46602:13;46549:11;:67::i;:::-;49947:1;45720:904;;;;;;;;:::o;30340:41::-;;;;;;;;;;;;-1:-1:-1;;;;;30340:41:0;;:::o;49463:191::-;7464:9;:7;:9::i;:::-;7456:54;;;;;-1:-1:-1;;;7456:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7456:54:0;;;;;;;;;;;;;;;49557:38;;;-1:-1:-1;;;49557:38:0;;49589:4;49557:38;;;;;;49543:11;;-1:-1:-1;;;;;49557:23:0;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;49557:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49557:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49557:38:0;;-1:-1:-1;49606:40:0;49633:7;:5;:7::i;:::-;-1:-1:-1;;;;;49606:26:0;;;49642:3;49606:40;:26;:40;:::i;:::-;7521:1;49463:191;:::o;31499:217::-;7464:9;:7;:9::i;:::-;7456:54;;;;;-1:-1:-1;;;7456:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7456:54:0;;;;;;;;;;;;;;;31577:9;31572:137;31596:7;:14;31592:1;:18;31572:137;;;31661:7;31669:1;31661:10;;;;;;;;;;;;;;-1:-1:-1;;;;;31653:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31653:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31653:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31653:44:0;31639:10;;31632:6;;:18;;31639:7;;31647:1;;31639:10;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31632:18:0;;;;;;;;;;;;;;-1:-1:-1;31632:18:0;:65;;-1:-1:-1;;;;;;31632:65:0;;;;;;;;;;;-1:-1:-1;31612:3:0;31572:137;;8063:140;7464:9;:7;:9::i;:::-;7456:54;;;;;-1:-1:-1;;;7456:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7456:54:0;;;;;;;;;;;;;;;8162:1;8146:6;;8125:40;;8146:6;;;;-1:-1:-1;;;;;8146:6:0;;8125:40;;8162:1;;8125:40;8193:1;8176:19;;-1:-1:-1;;;;;;8176:19:0;;;8063:140::o;30390:27::-;;;;;;:::o;7252:79::-;7290:7;7317:6;;;;-1:-1:-1;;;;;7317:6:0;;7252:79::o;7618:94::-;7658:4;7698:6;;;;;-1:-1:-1;;;;;7698:6:0;7682:12;:10;:12::i;:::-;-1:-1:-1;;;;;7682:22:0;;7675:29;;7618:94;:::o;32342:876::-;32715:20;10884:11;;;;10876:55;;;;;-1:-1:-1;;;10876:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11023:5;11009:19;;-1:-1:-1;;11009:19:0;;;49862:7;;11009:19;49862:7;49858:102;;;49886:28;;;-1:-1:-1;;;49886:28:0;;;;;;;;;;;;-1:-1:-1;;;49886:28:0;;;;;;;;;;;;;;49858:102;-1:-1:-1;;;;;32761:27:0;;32753:64;;;;;-1:-1:-1;;;32753:64:0;;;;;;;;;;;;-1:-1:-1;;;32753:64:0;;;;;;;;;;;;;;;32847:4;;-1:-1:-1;;32852:15:0;;32847:21;;;;;;;;;;;;;-1:-1:-1;;;;;32847:21:0;-1:-1:-1;;;;;32836:32:0;:4;;32841:1;32836:7;;;;;;;;;;;;;-1:-1:-1;;;;;32836:7:0;-1:-1:-1;;;;;32836:32:0;;;32828:68;;;;;-1:-1:-1;;;32828:68:0;;;;;;;;;;;;-1:-1:-1;;;32828:68:0;;;;;;;;;;;;;;;32924:146;32944:4;;32924:146;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;32924:146:0;;;;;;32963:29;32974:4;;32979:1;32974:7;;;;;;;;;;;;;-1:-1:-1;;;;;32974:7:0;32983:8;32963:10;:29::i;:::-;33007:6;;32924:146;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;32924:146:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33028:8:0;;-1:-1:-1;33028:8:0;;;;32924:146;;;33028:8;;32924:146;33028:8;32924:146;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;;32924:146:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33051:8:0;;-1:-1:-1;33051:8:0;;;;32924:146;;;33051:8;;32924:146;33051:8;32924:146;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;32924:5:0;;-1:-1:-1;;;32924:146:0:i;:::-;32909:161;;33107:11;33091:12;:27;;33083:53;;;;;-1:-1:-1;;;33083:53:0;;;;;;;;;;;;-1:-1:-1;;;33083:53:0;;;;;;;;;;;;;;;33147:63;33159:13;33174:4;;-1:-1:-1;;33179:15:0;;33174:21;;;;;;;;;;;;;-1:-1:-1;;;;;33174:21:0;33197:12;33147:11;:63::i;:::-;11189:11;:18;;-1:-1:-1;;11189:18:0;11203:4;11189:18;;;32342:876;;-1:-1:-1;;;;;;;;;;;32342:876:0:o;30809:207::-;7464:9;:7;:9::i;:::-;7456:54;;;;;-1:-1:-1;;;7456:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7456:54:0;;;;;;;;;;;;;;;30887:9;30882:127;30906:7;:14;30902:1;:18;30882:127;;;30973:7;30981:1;30973:10;;;;;;;;;;;;;;-1:-1:-1;;;;;30963:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30963:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30963:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30963:34:0;30949:10;;30942:6;;:18;;30949:7;;30957:1;;30949:10;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30942:18:0;;;;;;;;;;;;;;-1:-1:-1;30942:18:0;:55;;-1:-1:-1;;;;;;30942:55:0;;;;;;;;;;;-1:-1:-1;30922:3:0;30882:127;;30292:41;;;;;;;;;;;;-1:-1:-1;;;;;30292:41:0;;:::o;31144:199::-;7464:9;:7;:9::i;:::-;7456:54;;;;;-1:-1:-1;;;7456:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7456:54:0;;;;;;;;;;;;;;;31222:9;31217:119;31241:7;:14;31237:1;:18;31217:119;;;31305:7;31313:1;31305:10;;;;;;;;;;;;;;-1:-1:-1;;;;;31298:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31298:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31298:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31298:26:0;31284:10;;31277:6;;:18;;31284:7;;31292:1;;31284:10;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31277:18:0;;;;;;;;;;;;;;-1:-1:-1;31277:18:0;:47;;-1:-1:-1;;;;;;31277:47:0;;;;;;;;;;;-1:-1:-1;31257:3:0;31217:119;;42148:1011;49862:7;;42378:23;;;;49862:7;;49858:102;;;49886:28;;;-1:-1:-1;;;49886:28:0;;;;;;;;;;;;-1:-1:-1;;;49886:28:0;;;;;;;;;;;;;;49858:102;-1:-1:-1;;;;;42444:28:0;;42436:65;;;;;-1:-1:-1;;;42436:65:0;;;;;;;;;;;;-1:-1:-1;;;42436:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42534:50:0;;29952:42;42534:50;42512:148;;;;-1:-1:-1;;;42512:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42701:21;42673:25;42758:88;42783:25;42823:12;42758:10;:88::i;:::-;42735:111;;29952:42;-1:-1:-1;;;;;42859:21:0;;42881:12;42859:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42859:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42859:35:0;;;;42923:44;42949:17;42923:21;:25;;:44;;;;:::i;:::-;42905:62;;42996:1;42978:20;;43038:9;43019:15;:28;;43011:54;;;;;-1:-1:-1;;;43011:54:0;;;;;;;;;;;;-1:-1:-1;;;43011:54:0;;;;;;;;;;;;;;;43098:53;43110:14;43126:7;43135:15;43098:11;:53::i;:::-;49947:1;;42148:1011;;;;;;;:::o;8358:109::-;7464:9;:7;:9::i;:::-;7456:54;;;;;-1:-1:-1;;;7456:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7456:54:0;;;;;;;;;;;;;;;8431:28;8450:8;8431:18;:28::i;:::-;8358:109;:::o;48977:478::-;49064:7;-1:-1:-1;;;;;49093:19:0;;49089:120;;49149:1;49137:9;:13;49129:37;;;;;-1:-1:-1;;;49129:37:0;;;;;;;;;;;;-1:-1:-1;;;49129:37:0;;;;;;;;;;;;;;;-1:-1:-1;49188:9:0;49181:16;;49089:120;49236:1;49227:6;:10;49219:43;;;;;-1:-1:-1;;;49219:43:0;;;;;;;;;;;;-1:-1:-1;;;49219:43:0;;;;;;;;;;;;;;;49281:9;:14;49273:46;;;;;-1:-1:-1;;;49273:46:0;;;;;;;;;;;;-1:-1:-1;;;49273:46:0;;;;;;;;;;;;;;;49358:65;-1:-1:-1;;;;;49358:30:0;;49389:10;49409:4;49416:6;49358:65;:30;:65;:::i;:::-;-1:-1:-1;49441:6:0;48977:478;;;;;:::o;43934:1778::-;-1:-1:-1;;;;;44168:33:0;;;44044:23;44168:33;;;:6;:33;;;;;;44044:23;;;;44130:21;;44168:33;:47;44164:1541;;44273:25;-1:-1:-1;;;;;44258:48:0;;44329:12;44258:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44258:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44258:102:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44258:102:0;:107;44232:188;;;;;-1:-1:-1;;;44232:188:0;;;;;;;;;;;;-1:-1:-1;;;44232:188:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44445:33:0;;;;;;;:6;:33;;;;;;;;-1:-1:-1;30066:42:0;44497:21;;44493:275;;;44557:21;;-1:-1:-1;44615:38:0;44557:21;44635:17;44615:38;:19;:38;:::i;:::-;44597:56;;44493:275;;;44712:40;;;-1:-1:-1;;;44712:40:0;;44746:4;44712:40;;;;;;-1:-1:-1;;;;;44712:25:0;;;;;:40;;;;;;;;;;;;;;:25;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;44712:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44712:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44712:40:0;;-1:-1:-1;44493:275:0;44164:1541;;;-1:-1:-1;;;;;44789:33:0;;;44834:1;44789:33;;;:6;:33;;;;;;;:47;44785:920;;44860:25;-1:-1:-1;;;;;44853:42:0;;44896:12;44853:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44853:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44853:56:0;;;;44941:25;-1:-1:-1;;;;;44934:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44934:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44934:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44934:41:0;45008:40;;;-1:-1:-1;;;45008:40:0;;45042:4;45008:40;;;;;;44934:41;;-1:-1:-1;;;;;;45008:25:0;;;;;:40;;;;;44934:41;;45008:40;;;;;;;;:25;:40;;;5:2:-1;;;;30:1;27;20:12;44785:920:0;-1:-1:-1;;;;;45070:33:0;;;45115:1;45070:33;;;:6;:33;;;;;;;:47;45066:639;;45142:25;-1:-1:-1;;;;;45134:41:0;;45176:12;45134:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45134:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45134:55:0;;;;45222:25;-1:-1:-1;;;;;45214:75:0;;:77;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45214:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45214:77:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45214:77:0;;-1:-1:-1;;;;;;45310:21:0;;30066:42;45310:21;45306:275;;;45370:21;;-1:-1:-1;45428:38:0;45370:21;45448:17;45428:38;:19;:38;:::i;45066:639::-;45623:25;45613:35;;45681:12;45663:30;;45066:639;43934:1778;;;;;;:::o;36498:331::-;-1:-1:-1;;;;;36639:19:0;;30066:42;36639:19;;:42;;-1:-1:-1;;;;;;36662:19:0;;;36639:42;36635:187;;;36698:30;;-1:-1:-1;;;;;36698:22:0;;;:30;;;;;36721:6;;36698:30;;;;36721:6;36698:22;:30;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36698:30:0;36635:187;;;36761:49;-1:-1:-1;;;;;36761:26:0;;36788:13;36803:6;36761:49;:26;:49;:::i;:::-;36498:331;;;:::o;46632:2337::-;46817:21;46871:14;46867:1988;;-1:-1:-1;;;;;46928:39:0;;;46902:122;;;;;-1:-1:-1;;;46902:122:0;;;;;;;;;;;;-1:-1:-1;;;46902:122:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47065:48:0;;29952:42;47065:48;47039:125;;;;;-1:-1:-1;;;47039:125:0;;;;;;;;;;;;-1:-1:-1;;;47039:125:0;;;;;;;;;;;;;;;29952:42;-1:-1:-1;;;;;47181:20:0;;47208:12;47181:42;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47181:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47181:42:0;;;;;47245:12;47238:19;;;;46867:1988;47279:9;47292:1;47279:14;47275:1580;;;-1:-1:-1;;;;;47338:39:0;;47334:458;;47413:23;-1:-1:-1;;;;;47398:44:0;;47471:12;47398:106;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47398:106:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47398:106:0;;;;;47334:458;;;47545:154;-1:-1:-1;;;;;47545:45:0;;47621:23;47668:12;47545:154;:45;:154;:::i;:::-;47733:23;-1:-1:-1;;;;;47718:44:0;;47763:12;47718:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47718:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47718:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;47334:458:0;47275:1580;;;47813:9;47826:1;47813:14;47809:1046;;;47865:142;-1:-1:-1;;;;;47865:45:0;;47937:23;47980:12;47865:142;:45;:142;:::i;:::-;48029:23;-1:-1:-1;;;;;48022:39:0;;48062:12;48022:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48022:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48022:53:0;;;;47809:1046;;;-1:-1:-1;;;;;48133:39:0;;48129:715;;29465:42;-1:-1:-1;;;;;48210:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48210:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48210:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48210:43:0;48193:162;;;-1:-1:-1;;;48193:162:0;;30066:42;48193:162;;;;;;;;;;48353:1;48193:162;;;;;;;;-1:-1:-1;;;;;48193:91:0;;;;;;48313:12;;48193:162;;;;;;;;;;;48313:12;48193:91;:162;;;5:2:-1;;;;30:1;27;20:12;5:2;48193:162:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48193:162:0;;;;;48129:715;;;48441:178;29465:42;-1:-1:-1;;;;;48517:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48517:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48517:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48517:47:0;-1:-1:-1;;;;;48441:45:0;;;48588:12;48441:178;:45;:178;:::i;:::-;29465:42;-1:-1:-1;;;;;48710:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48710:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48710:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48710:43:0;48693:135;;;-1:-1:-1;;;48693:135:0;;-1:-1:-1;;;;;48693:135:0;;;;;;;;;;;;;48826:1;48693:135;;;;;;;;:91;;;;;:135;;;;;48826:1;;48693:135;;;;;;48826:1;48693:91;:135;;;5:2:-1;;;;30:1;27;20:12;5:2;48693:135:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48693:135:0;;;;48129:715;48881:80;;;-1:-1:-1;;;48881:80:0;;48945:4;48881:80;;;;;;-1:-1:-1;;;;;48881:41:0;;;;;:80;;;;;;;;;;;;;;:41;:80;;;5:2:-1;;;;30:1;27;20:12;5:2;48881:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48881:80:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48881:80:0;;-1:-1:-1;46632:2337:0;;;;;;;:::o;20474:247::-;20644:58;;;-1:-1:-1;;;;;20644:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20644:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20591:122:0;;20624:5;;20591:18;:122::i;5934:98::-;6014:10;5934:98;:::o;33247:1176::-;33452:7;33472:11;33494:15;33512:1;33494:19;;33524:26;33561:13;33577:4;33582:6;33589:1;33582:9;;;;;;;;;;;;;;33577:15;;;;;;;;;;;;;;;;33561:31;;33610:13;33626:1;33610:17;;33605:781;33637:8;:15;33629:5;:23;33605:781;;;33706:15;;33678:16;;33706:22;;33726:1;33706:22;:19;:22;:::i;:::-;33697:5;:31;:103;;33783:6;33790:5;33798:1;33790:9;33783:17;;;;;;;;;;;;;;33697:103;;;;;33762:1;33748:4;:11;:15;33697:103;33678:122;;33823:4;33828:8;33823:14;;;;;;;;;;;;;;33817:20;;33877:8;33886:5;33877:15;;;;;;;;;;;;;;:20;;33896:1;33877:20;33873:260;;;33934:43;33943:4;33949:6;33956:5;33949:13;;;;;;;;;;;;;;33934:43;;33964:8;33975:1;33964:12;33934:8;:43::i;:::-;33922:55;;33873:260;;;34038:16;;;34052:1;34038:16;;;;;;;;;;;;;;;;105:10:-1;34038:16:0;88:34:-1;136:17;;-1:-1;34038:16:0;34026:28;;34092:8;34101:11;;;;;;34092:21;;;;;;;;;;;;;;;;34077:9;34087:1;34077:12;;;;;;;;;;;;;:36;-1:-1:-1;;;;;34077:36:0;;;-1:-1:-1;;;;;34077:36:0;;;;;33873:260;34179:167;34211:5;34235:3;34257:12;34288:8;34297:5;34288:15;;;;;;;;;;;;;;34179:167;;34322:9;34179:13;:167::i;:::-;34164:182;-1:-1:-1;34371:3:0;;-1:-1:-1;;33654:7:0;;33605:781;;;;34403:12;34396:19;;;;;;33247:1176;;;;;;;;:::o;12591:136::-;12649:7;12676:43;12680:1;12683;12676:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;12669:50;12591:136;-1:-1:-1;;;12591:136:0:o;8573:266::-;-1:-1:-1;;;;;8661:22:0;;8639:110;;;;-1:-1:-1;;;8639:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8786:6;;;8765:38;;-1:-1:-1;;;;;8765:38:0;;;;8786:6;;;;;;8765:38;;;8814:6;:17;;-1:-1:-1;;;;;8814:17:0;;;;;-1:-1:-1;;;;;;8814:17:0;;;;;;;;;8573:266::o;20729:284::-;20926:68;;;-1:-1:-1;;;;;20926:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20926:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20873:132:0;;20906:5;;20873:18;:132::i;:::-;20729:284;;;;:::o;21021:706::-;21439:10;;;21438:62;;-1:-1:-1;21455:39:0;;;-1:-1:-1;;;21455:39:0;;21479:4;21455:39;;;;-1:-1:-1;;;;;21455:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;21455:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21455:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21455:39:0;:44;21438:62;21416:166;;;;-1:-1:-1;;;21416:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21646:62;;;-1:-1:-1;;;;;21646:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;21646:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;21593:126:0;;21626:5;;23084:1176;23688:27;23696:5;-1:-1:-1;;;;;23688:25:0;;:27::i;:::-;23680:71;;;;;-1:-1:-1;;;23680:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23825:12;23839:23;23874:5;-1:-1:-1;;;;;23866:19:0;23886:4;23866:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;23866:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;23824:67:0;;;;23910:7;23902:52;;;;;-1:-1:-1;;;23902:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23971:17;;:21;23967:286;;24144:10;24133:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24133:30:0;24107:134;;;;-1:-1:-1;;;24107:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35833:657;35966:29;36008:11;36022:16;:4;36031:6;36022:16;:8;:16;:::i;:::-;36008:30;;36063:1;36057:3;:7;36049:34;;;;;-1:-1:-1;;;36049:34:0;;;;;;;;;;;;-1:-1:-1;;;36049:34:0;;;;;;;;;;;;;;;36123:3;36109:18;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;36109:18:0;-1:-1:-1;36094:33:0;-1:-1:-1;36145:9:0;36140:343;36164:3;36160:1;:7;36140:343;;;36244:1;-1:-1:-1;;;;;36211:35:0;:9;36230:1;36221:6;:10;36211:21;;;;;;;;;;;;;;-1:-1:-1;;;;;36211:35:0;;:91;;;;30066:42;-1:-1:-1;;;;;36267:35:0;:9;36286:1;36277:6;:10;36267:21;;;;;;;;;;;;;;-1:-1:-1;;;;;36267:35:0;;36211:91;36189:283;;;29952:42;36337:12;36350:1;36337:15;;;;;;;;;;;;;:39;-1:-1:-1;;;;;36337:39:0;;;-1:-1:-1;;;;;36337:39:0;;;;;36189:283;;;36435:9;36454:1;36445:6;:10;36435:21;;;;;;;;;;;;;;36417:12;36430:1;36417:15;;;;;;;;;;;;;:39;-1:-1:-1;;;;;36417:39:0;;;-1:-1:-1;;;;;36417:39:0;;;;;36189:283;36169:3;;36140:343;;;;35833:657;;;;;;:::o;34871:730::-;35063:7;35104;-1:-1:-1;;;;;35091:20:0;:9;-1:-1:-1;;;;;35091:20:0;;;35083:56;;;;;-1:-1:-1;;;35083:56:0;;;;;;;;;;;;-1:-1:-1;;;35083:56:0;;;;;;;;;;;;;;;35170:1;35158:8;:13;;35150:42;;;;;-1:-1:-1;;;35150:42:0;;;;;;;;;;;;-1:-1:-1;;;35150:42:0;;;;;;;;;;;;;;;35209:8;35221:1;35209:13;35205:389;;;35263:63;35281:8;35290:1;35281:11;;;;;;;;;;;;;;35294:9;35305:7;35314:8;35324:1;35263:17;:63::i;:::-;35239:87;;;;35205:389;35348:8;35360:1;35348:13;35344:250;;;35402:61;35421:9;35432:7;35441:8;35451;35461:1;35402:18;:61::i;35344:250::-;35485:8;35497:1;35485:13;35481:113;;;35522:60;35537:8;35546:1;35537:11;;;;;;;;;;;;;;35550:9;35561:7;35570:8;35580:1;35522:14;:60::i;13064:226::-;13184:7;13220:12;13212:6;;;;13204:29;;;;-1:-1:-1;;;13204:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13204:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13256:5:0;;;13064:226::o;2612:659::-;2672:4;3171:20;;3001:66;3220:23;;;;;;:42;;-1:-1:-1;;3247:15:0;;;3212:51;-1:-1:-1;;2612:659:0:o;36837:1241::-;37071:37;;;-1:-1:-1;;;37071:37:0;;-1:-1:-1;;;;;37071:37:0;;;;;;;;37031:19;;29588:42;;37071:23;;:37;;;;;;;;;;;;;;;29588:42;37071:37;;;5:2:-1;;;;30:1;27;20:12;5:2;37071:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37071:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37071:37:0;37063:71;;;;;-1:-1:-1;;;37063:71:0;;;;;;;;;;;;-1:-1:-1;;;37063:71:0;;;;;;;;;;;;;;;37147:12;37169;37147:35;;37201:5;-1:-1:-1;;;;;37201:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37201:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37201:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37201:20:0;37193:63;;;;;-1:-1:-1;;;37193:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37283:7;-1:-1:-1;;;;;37305:23:0;;37301:229;;29952:42;-1:-1:-1;;;;;37345:20:0;;37372:8;37345:38;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37345:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37345:38:0;;;;;29952:42;37398:33;;37301:229;;;-1:-1:-1;;;;;37453:21:0;;37449:81;;-1:-1:-1;29952:42:0;37449:81;37548:5;-1:-1:-1;;;;;37548:13:0;;37562:9;37548:24;;;;;;;;;;;;;-1:-1:-1;;;;;37548:24:0;-1:-1:-1;;;;;37548:24:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37548:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37548:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37548:24:0;37540:57;;;;;-1:-1:-1;;;37540:57:0;;;;;;;;;;;;-1:-1:-1;;;37540:57:0;;;;;;;;;;;;;;;37616:5;-1:-1:-1;;;;;37616:13:0;;37630:3;37616:18;;;;;;;;;;;;;-1:-1:-1;;;;;37616:18:0;-1:-1:-1;;;;;37616:18:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37616:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37616:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37616:18:0;37608:49;;;;;-1:-1:-1;;;37608:49:0;;;;;;;;;;;;-1:-1:-1;;;37608:49:0;;;;;;;;;;;;;;;37712:53;-1:-1:-1;;;;;37712:29:0;;37742:12;37756:8;37712:53;:29;:53;:::i;:::-;37819:151;;;-1:-1:-1;;;37819:151:0;;-1:-1:-1;;;;;37819:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37819:151:0;;;;;;:23;;;;;;:151;;;;;;;;;;;-1:-1:-1;37819:23:0;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;37819:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37819:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37819:151:0;;-1:-1:-1;;;;;;37987:21:0;;37983:88;;29952:42;-1:-1:-1;;;;;38025:21:0;;38047:11;38025:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38025:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38025:34:0;;;;37983:88;36837:1241;;;;;;;;;:::o;38086:1441::-;38282:19;38390:8;38430:9;-1:-1:-1;;;;;38454:23:0;;;38450:251;;38526:28;38534:9;38545:8;38526:7;:28::i;:::-;38494:60;;-1:-1:-1;38494:60:0;-1:-1:-1;38569:120:0;-1:-1:-1;;;;;38569:30:0;;29274:42;38494:60;38569:120;:30;:120;:::i;:::-;-1:-1:-1;;;;;38753:23:0;;38749:771;;38807:134;;-1:-1:-1;;;38807:134:0;;;;;;;;38925:4;38807:134;;;;;;-1:-1:-1;;;38807:134:0;;;;;;;;;;;;;;;;;;;;;29274:42;;38807:35;;38867:15;;38898:11;;38911:4;;38925;;30169:66;;38807:134;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38807:134:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38807:134:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38807:134:0;;;;;;;39:16:-1;36:1;17:17;2:54;101:4;38807:134:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;38807:134:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;38807:134:0;;421:4:-1;412:14;;;;38807:134:0;;;;;412:14:-1;38807:134:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38807:134:0;;;;;;;;;;;38956:1;38942:4;:11;:15;38807:151;;;;;;;;;;;;;;38793:165;;38749:771;;;-1:-1:-1;;;;;38980:21:0;;38976:544;;39032:196;;-1:-1:-1;;;39032:196:0;;;;;;;;;;;;;;39181:4;39032:196;;;;;;-1:-1:-1;;;39032:196:0;;;;;;;;;;;;;;;;;;;;;29274:42;;39032:35;;39086:15;;39120:11;;39150:4;;39181;;30169:66;;39032:196;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39032:196:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39032:196:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39032:196:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;39032:196:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;38976:544:0;39292:199;;-1:-1:-1;;;39292:199:0;;;;;;;;;;;;;;39444:4;39292:199;;;;;;-1:-1:-1;;;39292:199:0;;;;;;;;;;;;;;;;;;;;;29274:42;;39292:38;;39349:15;;39383:11;;39413:4;;39444;;30169:66;;39292:199;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39292:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39292:199:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39292:199:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;39292:199:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;39292:199:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;39292:199:0;;421:4:-1;412:14;;;;39292:199:0;;;;;412:14:-1;39292:199:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39292:199:0;;;;;;;;;;;39506:1;39492:4;:11;:15;39292:216;;;;;;;;;;;;;;39278:230;;38086:1441;;;;;;;;;:::o;39535:2605::-;39734:19;-1:-1:-1;;;;;39788:34:0;;39766:109;;;;;-1:-1:-1;;;39766:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39916:20;39886;;39998:65;40020:9;40044:8;39998:7;:65::i;:::-;39950:113;;-1:-1:-1;39950:113:0;-1:-1:-1;40118:69:0;-1:-1:-1;;;;;40118:30:0;;40149:20;39950:113;40118:69;:30;:69;:::i;:::-;40200:8;;-1:-1:-1;;;;;40281:47:0;;29715:42;40281:47;;:109;;-1:-1:-1;;;;;;40345:45:0;;29840:42;40345:45;40281:109;40263:1657;;;40417:13;-1:-1:-1;;;;;40434:47:0;;29715:42;40434:47;40433:91;;40523:1;40433:91;;;40502:1;40433:91;40417:107;;;-1:-1:-1;40546:12:0;40541:281;40572:6;40564:14;;:5;:14;;;40541:281;;;40642:10;-1:-1:-1;;;;;40612:40:0;:13;-1:-1:-1;;;;;40612:19:0;;40632:5;40612:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40612:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40612:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40612:26:0;-1:-1:-1;;;;;40612:40:0;;40608:199;;;40681:5;40677:9;;40608:199;;;40746:7;-1:-1:-1;;;;;40716:37:0;:13;-1:-1:-1;;;;;40716:19:0;;40736:5;40716:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40716:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40716:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40716:26:0;-1:-1:-1;;;;;40716:37:0;;40712:95;;;40782:5;40778:9;;40712:95;40580:7;;40541:281;;;-1:-1:-1;40838:58:0;;;-1:-1:-1;;;40838:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40838:22:0;;;;;:58;;;;;-1:-1:-1;;40838:58:0;;;;;;;-1:-1:-1;40838:22:0;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;40838:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40838:58:0;;;;40263:1657;;;;40987:42;41117;41207:1;-1:-1:-1;;;;;41227:45:0;;;;41223:198;;;-1:-1:-1;41302:1:0;41223:198;;;41353:21;-1:-1:-1;;;;;41329:45:0;:20;-1:-1:-1;;;;;41329:45:0;;41325:96;;;-1:-1:-1;41404:1:0;41325:96;41442:12;41437:303;41468:6;41460:14;;:5;:14;;;41437:303;;;41549:10;-1:-1:-1;;;;;41508:51:0;:13;-1:-1:-1;;;;;41508:30:0;;41539:5;41508:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41508:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41508:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41508:37:0;-1:-1:-1;;;;;41508:51:0;;41504:221;;;41588:5;41584:9;;41504:221;;;41664:7;-1:-1:-1;;;;;41623:48:0;:13;-1:-1:-1;;;;;41623:30:0;;41654:5;41623:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41623:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41623:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41623:37:0;-1:-1:-1;;;;;41623:48:0;;41619:106;;;41700:5;41696:9;;41619:106;41476:7;;41437:303;;;-1:-1:-1;41756:152:0;;;-1:-1:-1;;;41756:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41756:33:0;;;;;:152;;;;;-1:-1:-1;;41756:152:0;;;;;;;-1:-1:-1;41756:33:0;:152;;;5:2:-1;;;;30:1;27;20:12;5:2;41756:152:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41756:152:0;;;;40263:1657;;;;-1:-1:-1;;;;;41936:21:0;;30066:42;41936:21;;:46;;-1:-1:-1;;;;;;41961:21:0;;;41936:46;41932:201;;;42013:21;41999:35;;41932:201;;;42081:40;;;-1:-1:-1;;;42081:40:0;;42115:4;42081:40;;;;;;-1:-1:-1;;;;;42081:25:0;;;;;:40;;;;;;;;;;;;;;:25;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;42081:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42081:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42081:40:0;;-1:-1:-1;41932:201:0;39535:2605;;;;;;;;;;;;:::o
Swarm Source
bzzr://bf8059556f649b915b797cbbcd86ed406eae09723a3e21105c3886b7f0aee50a
Loading...
Loading
Loading...
Loading
OVERVIEW
Swap assets on Uniswap, Balancer, CurveMultichain 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.