Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
10880751 | 1580 days ago | 9 wei | ||||
10880751 | 1580 days ago | 9 wei | ||||
9638076 | 1772 days ago | 1 ETH | ||||
9638076 | 1772 days ago | 1 ETH | ||||
9638057 | 1772 days ago | 2 ETH | ||||
9638057 | 1772 days ago | 2 ETH | ||||
9636107 | 1773 days ago | 0.01971591 ETH | ||||
9636107 | 1773 days ago | 0.01971591 ETH | ||||
9636107 | 1773 days ago | 1.95365386 ETH | ||||
9636107 | 1773 days ago | 1.95365386 ETH | ||||
9636048 | 1773 days ago | 2 ETH | ||||
9636048 | 1773 days ago | 2 ETH | ||||
9635757 | 1773 days ago | 0.02040129 ETH | ||||
9635757 | 1773 days ago | 0.02040129 ETH | ||||
9635757 | 1773 days ago | 1.36913883 ETH | ||||
9635757 | 1773 days ago | 1.36913883 ETH | ||||
9635733 | 1773 days ago | 0.02050572 ETH | ||||
9635733 | 1773 days ago | 0.02050572 ETH | ||||
9635703 | 1773 days ago | 0.88644742 ETH | ||||
9635703 | 1773 days ago | 0.88644742 ETH | ||||
9631696 | 1773 days ago | 2 ETH | ||||
9631696 | 1773 days ago | 2 ETH | ||||
9631696 | 1773 days ago | 2 ETH | ||||
9631696 | 1773 days ago | 2 ETH | ||||
9631696 | 1773 days ago | 2 ETH |
Loading...
Loading
Contract Name:
OneSplit
Compiler Version
v0.5.13+commit.5b0b510c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-01-07 */ // 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/ERC20Detailed.sol pragma solidity ^0.5.0; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } } // File: contracts/interface/IUniswapExchange.sol pragma solidity ^0.5.0; interface IUniswapExchange { function getEthToTokenInputPrice(uint256 ethSold) external view returns(uint256 tokensBought); function getTokenToEthInputPrice(uint256 tokensSold) external view returns (uint256 ethBought); function ethToTokenSwapInput(uint256 minTokens, uint256 deadline) external payable returns (uint256 tokensBought); function tokenToEthSwapInput(uint256 tokensSold, uint256 minEth, uint256 deadline) external returns (uint256 ethBought); function tokenToTokenSwapInput(uint256 tokensSold, uint256 minTokensBought, uint256 minEthBought, uint256 deadline, address tokenAddr) external returns (uint256 tokensBought); } // File: contracts/interface/IUniswapFactory.sol pragma solidity ^0.5.0; interface IUniswapFactory { function getExchange(IERC20 token) external view returns(IUniswapExchange exchange); } // File: contracts/interface/IKyberNetworkContract.sol pragma solidity ^0.5.0; interface IKyberNetworkContract { function searchBestRate( IERC20 src, IERC20 dest, uint256 srcAmount, bool usePermissionless ) external view returns(address reserve, uint256 rate); } // File: contracts/interface/IKyberNetworkProxy.sol pragma solidity ^0.5.0; interface IKyberNetworkProxy { function getExpectedRate( IERC20 src, IERC20 dest, uint256 srcQty ) external view returns(uint256 expectedRate, uint256 slippageRate); function tradeWithHint( IERC20 src, uint256 srcAmount, IERC20 dest, address destAddress, uint256 maxDestAmount, uint256 minConversionRate, address walletId, bytes calldata hint ) external payable returns(uint256); function kyberNetworkContract() external view returns (IKyberNetworkContract); // TODO: Limit usage by tx.gasPrice // function maxGasPrice() external view returns (uint256); // TODO: Limit usage by user cap // function getUserCapInWei(address user) external view returns (uint256); // function getUserCapInTokenWei(address user, IERC20 token) external view returns (uint256); } // File: contracts/interface/IKyberUniswapReserve.sol pragma solidity ^0.5.0; interface IKyberUniswapReserve { function uniswapFactory() external view returns(address); } // File: contracts/interface/IKyberOasisReserve.sol pragma solidity ^0.5.0; interface IKyberOasisReserve { function otc() external view returns(address); } // File: contracts/interface/IKyberBancorReserve.sol pragma solidity ^0.5.0; contract IKyberBancorReserve { function bancorEth() public view returns(address); } // File: contracts/interface/IBancorNetwork.sol pragma solidity ^0.5.0; interface IBancorNetwork { function getReturnByPath( address[] calldata path, uint256 amount ) external view returns( uint256 returnAmount, uint256 conversionFee ); function claimAndConvert( address[] calldata path, uint256 amount, uint256 minReturn ) external returns(uint256); function convert( address[] calldata path, uint256 amount, uint256 minReturn ) external payable returns(uint256); } // File: contracts/interface/IBancorContractRegistry.sol pragma solidity ^0.5.0; contract IBancorContractRegistry { function addressOf(bytes32 contractName) external view returns (address); } // File: contracts/interface/IBancorNetworkPathFinder.sol pragma solidity ^0.5.0; interface IBancorNetworkPathFinder { function generatePath(IERC20 sourceToken, IERC20 targetToken) external view returns(address[] memory); } // File: contracts/interface/IBancorEtherToken.sol pragma solidity ^0.5.0; contract IBancorEtherToken is IERC20 { function deposit() external payable; function withdraw(uint256 amount) external; } // File: contracts/interface/IOasisExchange.sol pragma solidity ^0.5.0; interface IOasisExchange { function getBuyAmount(IERC20 buyGem, IERC20 payGem, uint256 payAmt) external view returns(uint256 fillAmt); function sellAllAmount(IERC20 payGem, uint payAmt, IERC20 buyGem, uint256 minFillAmount) external returns(uint256 fillAmt); } // File: contracts/interface/ICompound.sol pragma solidity ^0.5.0; contract ICompound { function markets(address cToken) external view returns(bool isListed, uint256 collateralFactorMantissa); } contract ICompoundToken is IERC20 { 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); } contract ICompoundEther is IERC20 { function mint() external payable; function redeem(uint256 redeemTokens) external returns(uint256); } // File: contracts/interface/IFulcrum.sol pragma solidity ^0.5.0; contract IFulcrumToken is IERC20 { function tokenPrice() external view returns(uint256); function loanTokenAddress() external view returns(address); function mintWithEther(address receiver) external payable returns (uint256 mintAmount); function mint(address receiver, uint256 depositAmount) external returns (uint256 mintAmount); function burnToEther(address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid); function burn(address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid); } // File: contracts/interface/IWETH.sol pragma solidity ^0.5.0; contract IWETH is IERC20 { function deposit() external payable; function withdraw(uint256 amount) external; } // 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. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing 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. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // 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 != 0x0 && codehash != accountHash); } /** * @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/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/UniversalERC20.sol pragma solidity ^0.5.0; library UniversalERC20 { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 private constant ZERO_ADDRESS = IERC20(0x0000000000000000000000000000000000000000); IERC20 private constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); function universalTransfer(IERC20 token, address to, uint256 amount) internal returns(bool) { if (amount == 0) { return true; } if (token == ZERO_ADDRESS || token == ETH_ADDRESS) { address(uint160(to)).transfer(amount); } else { token.safeTransfer(to, amount); return true; } } function universalTransferFrom(IERC20 token, address from, address to, uint256 amount) internal { if (amount == 0) { return; } if (token == ZERO_ADDRESS || token == ETH_ADDRESS) { require(from == msg.sender && msg.value >= amount, "msg.value is zero"); if (to != address(this)) { address(uint160(to)).transfer(amount); } if (msg.value > amount) { msg.sender.transfer(msg.value.sub(amount)); } } else { token.safeTransferFrom(from, to, amount); } } function universalApprove(IERC20 token, address to, uint256 amount) internal { if (token != ZERO_ADDRESS && token != ETH_ADDRESS) { token.safeApprove(to, amount); } } function universalBalanceOf(IERC20 token, address who) internal view returns (uint256) { if (token == ZERO_ADDRESS || token == ETH_ADDRESS) { return who.balance; } else { return token.balanceOf(who); } } function universalDecimals(IERC20 token) internal view returns (uint256) { if (token == ZERO_ADDRESS || token == ETH_ADDRESS) { return 18; } (bool success, bytes memory data) = address(token).staticcall.gas(5000)( abi.encodeWithSignature("decimals()") ); if (!success) { (success, data) = address(token).staticcall.gas(5000)( abi.encodeWithSignature("DECIMALS()") ); } return success ? abi.decode(data, (uint256)) : 18; } function isETH(IERC20 token) internal pure returns(bool) { return (address(token) == address(ZERO_ADDRESS) || address(token) == address(ETH_ADDRESS)); } } // File: contracts/OneSplit.sol pragma solidity ^0.5.0; library DisableFlags { function enabled(uint256 disableFlags, uint256 flag) internal pure returns(bool) { return (disableFlags & flag) == 0; } function disabled(uint256 disableFlags, uint256 flag) internal pure returns(bool) { return (disableFlags & flag) != 0; } } contract OneSplit { using SafeMath for uint256; using DisableFlags for uint256; using UniversalERC20 for IERC20; using UniversalERC20 for IWETH; using UniversalERC20 for IBancorEtherToken; // // disableFlags = FLAG_UNISWAP + FLAG_KYBER + ... // uint256 constant public FLAG_UNISWAP = 0x01; uint256 constant public FLAG_KYBER = 0x02; uint256 constant public FLAG_BANCOR = 0x04; uint256 constant public FLAG_OASIS = 0x08; uint256 constant public FLAG_COMPOUND = 0x10; uint256 constant public FLAG_FULCRUM = 0x20; IERC20 constant public ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); IWETH wethToken = IWETH(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); IBancorEtherToken bancorEtherToken = IBancorEtherToken(0xc0829421C1d260BD3cB3E0F06cfE2D52db2cE315); ICompound public compound = ICompound(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B); ICompoundEther public cETH = ICompoundEther(0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5); IKyberNetworkProxy public kyberNetworkProxy = IKyberNetworkProxy(0x818E6FECD516Ecc3849DAf6845e3EC868087B755); IUniswapFactory public uniswapFactory = IUniswapFactory(0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95); IBancorContractRegistry public bancorContractRegistry = IBancorContractRegistry(0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4); IBancorNetworkPathFinder bancorNetworkPathFinder = IBancorNetworkPathFinder(0x6F0cD8C4f6F06eAB664C7E3031909452b4B72861); IOasisExchange public oasisExchange = IOasisExchange(0x39755357759cE0d7f32dC8dC45414CCa409AE24e); function() external payable { require(msg.sender != tx.origin); } function log(uint256) external view { } function getAllRatesForDEX( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns(uint256[] memory results) { results = new uint256[](parts); for (uint i = 0; i < parts; i++) { (results[i],) = getExpectedReturn( fromToken, toToken, amount.mul(i + 1).div(parts), 1, disableFlags ); } } function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum ) public view returns( uint256 returnAmount, uint256[] memory distribution // [Uniswap, Kyber, Bancor, Oasis] ) { distribution = new uint256[](4); if (fromToken == toToken) { returnAmount = amount; return (returnAmount, distribution); } if (disableFlags.enabled(FLAG_COMPOUND) && _isCompoundToken(fromToken)) { IERC20 underlying = _compoundUnderlyingAsset(fromToken); uint256 compoundRate = ICompoundToken(address(fromToken)).exchangeRateStored(); return getExpectedReturn( underlying, toToken, amount.mul(compoundRate).div(1e18), parts, disableFlags ); } if (disableFlags.enabled(FLAG_COMPOUND) && _isCompoundToken(toToken)) { IERC20 underlying = _compoundUnderlyingAsset(toToken); uint256 compoundRate = ICompoundToken(address(toToken)).exchangeRateStored(); (returnAmount, distribution) = getExpectedReturn( fromToken, underlying, amount, parts, disableFlags ); returnAmount = returnAmount.mul(1e18).div(compoundRate); return (returnAmount, distribution); } if (disableFlags.enabled(FLAG_FULCRUM)) { IERC20 underlying = _isFulcrumToken(fromToken); if (underlying != IERC20(-1)) { uint256 fulcrumRate = IFulcrumToken(address(fromToken)).tokenPrice(); return getExpectedReturn( underlying, toToken, amount.mul(fulcrumRate).div(1e18), parts, disableFlags ); } } if (disableFlags.enabled(FLAG_FULCRUM)) { IERC20 underlying = _isFulcrumToken(toToken); if (underlying != IERC20(-1)) { uint256 fulcrumRate = IFulcrumToken(address(toToken)).tokenPrice(); (returnAmount, distribution) = getExpectedReturn( fromToken, underlying, amount, parts, disableFlags ); returnAmount = returnAmount.mul(1e18).div(fulcrumRate); return (returnAmount, distribution); } } function(IERC20,IERC20,uint256) view returns(uint256)[4] memory reserves = [ disableFlags.disabled(FLAG_UNISWAP) ? _calculateNoReturn : calculateUniswapReturn, disableFlags.disabled(FLAG_KYBER) ? _calculateNoReturn : calculateKyberReturn, disableFlags.disabled(FLAG_BANCOR) ? _calculateNoReturn : calculateBancorReturn, disableFlags.disabled(FLAG_OASIS) ? _calculateNoReturn : calculateOasisReturn ]; uint256[4] memory rates; uint256[4] memory fullRates; for (uint i = 0; i < rates.length; i++) { rates[i] = reserves[i](fromToken, toToken, amount.div(parts)); this.log(rates[i]); fullRates[i] = rates[i]; } for (uint j = 0; j < parts; j++) { // Find best part uint256 bestIndex = 0; for (uint i = 1; i < rates.length; i++) { if (rates[i] > rates[bestIndex]) { bestIndex = i; } } // Add best part returnAmount = returnAmount.add(rates[bestIndex]); distribution[bestIndex]++; // Avoid CompilerError: Stack too deep uint256 srcAmount = amount; // Recalc part if needed if (j + 1 < parts) { uint256 newRate = reserves[bestIndex]( fromToken, toToken, srcAmount.mul(distribution[bestIndex] + 1).div(parts) ); rates[bestIndex] = newRate.sub(fullRates[bestIndex]); this.log(rates[bestIndex]); fullRates[bestIndex] = newRate; } } } function swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 minReturn, uint256[] memory distribution, // [Uniswap, Kyber, Bancor, Oasis] uint256 disableFlags // 16 - Compound, 32 - Fulcrum ) public payable { fromToken.universalTransferFrom(msg.sender, address(this), amount); _swap(fromToken, toToken, amount, distribution, disableFlags); uint256 returnAmount = toToken.universalBalanceOf(address(this)); require(returnAmount >= minReturn, "OneSplit: actual return amount is less than minReturn"); toToken.universalTransfer(msg.sender, returnAmount); fromToken.universalTransfer(msg.sender, fromToken.universalBalanceOf(address(this))); } function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, // [Uniswap, Kyber, Bancor, Oasis] uint256 disableFlags // 16 - Compound ) internal { if (fromToken == toToken) { return; } if (disableFlags.enabled(FLAG_COMPOUND) && _isCompoundToken(fromToken)) { IERC20 underlying = _compoundUnderlyingAsset(fromToken); ICompoundToken(address(fromToken)).redeem(amount); uint256 underlyingAmount = underlying.universalBalanceOf(address(this)); return _swap( underlying, toToken, underlyingAmount, distribution, disableFlags ); } if (disableFlags.enabled(FLAG_COMPOUND) && _isCompoundToken(toToken)) { IERC20 underlying = _compoundUnderlyingAsset(toToken); _swap( fromToken, underlying, amount, distribution, disableFlags ); uint256 underlyingAmount = underlying.universalBalanceOf(address(this)); if (underlying.isETH()) { cETH.mint.value(underlyingAmount)(); } else { _infiniteApproveIfNeeded(underlying, address(toToken)); ICompoundToken(address(toToken)).mint(underlyingAmount); } return; } if (disableFlags.enabled(FLAG_FULCRUM)) { IERC20 underlying = _isFulcrumToken(fromToken); if (underlying != IERC20(-1)) { if (underlying.isETH()) { IFulcrumToken(address(fromToken)).burnToEther(address(this), amount); } else { IFulcrumToken(address(fromToken)).burn(address(this), amount); } uint256 underlyingAmount = underlying.universalBalanceOf(address(this)); return _swap( underlying, toToken, underlyingAmount, distribution, disableFlags ); } } if (disableFlags.enabled(FLAG_FULCRUM)) { IERC20 underlying = _isFulcrumToken(toToken); if (underlying != IERC20(-1)) { _swap( fromToken, underlying, amount, distribution, disableFlags ); uint256 underlyingAmount = underlying.universalBalanceOf(address(this)); if (underlying.isETH()) { IFulcrumToken(address(toToken)).mintWithEther.value(underlyingAmount)(address(this)); } else { _infiniteApproveIfNeeded(underlying, address(toToken)); IFulcrumToken(address(toToken)).mint(address(this), underlyingAmount); } return; } } function(IERC20,IERC20,uint256) returns(uint256)[4] memory reserves = [ _swapOnUniswap, _swapOnKyber, _swapOnBancor, _swapOnOasis ]; uint256 parts = 0; uint256 lastNonZeroIndex = 0; for (uint i = 0; i < reserves.length; i++) { if (distribution[i] > 0) { parts = parts.add(distribution[i]); lastNonZeroIndex = i; } } require(parts > 0, "OneSplit: distribution should contain non-zeros"); uint256 remainingAmount = amount; for (uint i = 0; i < reserves.length; i++) { if (distribution[i] == 0) { continue; } uint256 swapAmount = amount.mul(distribution[i]).div(parts); if (i == lastNonZeroIndex) { swapAmount = remainingAmount; } remainingAmount -= swapAmount; reserves[i](fromToken, toToken, swapAmount); } } function goodSwap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 minReturn, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum ) public payable { (, uint256[] memory distribution) = getExpectedReturn(fromToken, toToken, amount, parts, disableFlags); swap( fromToken, toToken, amount, minReturn, distribution, disableFlags ); } // View Helpers function calculateUniswapReturn( IERC20 fromToken, IERC20 toToken, uint256 amount ) public view returns(uint256) { uint256 returnAmount = amount; if (!fromToken.isETH()) { IUniswapExchange fromExchange = uniswapFactory.getExchange(fromToken); if (fromExchange != IUniswapExchange(0)) { (bool success, bytes memory data) = address(fromExchange).staticcall.gas(200000)( abi.encodeWithSelector( fromExchange.getTokenToEthInputPrice.selector, returnAmount ) ); if (success) { returnAmount = abi.decode(data, (uint256)); } else { returnAmount = 0; } } } if (!toToken.isETH()) { IUniswapExchange toExchange = uniswapFactory.getExchange(toToken); if (toExchange != IUniswapExchange(0)) { (bool success, bytes memory data) = address(toExchange).staticcall.gas(200000)( abi.encodeWithSelector( toExchange.getEthToTokenInputPrice.selector, returnAmount ) ); if (success) { returnAmount = abi.decode(data, (uint256)); } else { returnAmount = 0; } } } return returnAmount; } function calculateKyberReturn( IERC20 fromToken, IERC20 toToken, uint256 amount ) public view returns(uint256) { (bool success, bytes memory data) = address(kyberNetworkProxy).staticcall.gas(2300)(abi.encodeWithSelector( kyberNetworkProxy.kyberNetworkContract.selector )); if (!success) { return 0; } IKyberNetworkContract kyberNetworkContract = IKyberNetworkContract(abi.decode(data, (address))); if (fromToken.isETH() || toToken.isETH()) { return _calculateKyberReturnWithEth(kyberNetworkContract, fromToken, toToken, amount); } uint256 value = _calculateKyberReturnWithEth(kyberNetworkContract, fromToken, ETH_ADDRESS, amount); if (value == 0) { return 0; } return _calculateKyberReturnWithEth(kyberNetworkContract, ETH_ADDRESS, toToken, value); } function _calculateKyberReturnWithEth( IKyberNetworkContract kyberNetworkContract, IERC20 fromToken, IERC20 toToken, uint256 amount ) public view returns(uint256) { (bool success, bytes memory data) = address(kyberNetworkContract).staticcall.gas(200000)(abi.encodeWithSelector( kyberNetworkContract.searchBestRate.selector, fromToken.isETH() ? ETH_ADDRESS : fromToken, toToken.isETH() ? ETH_ADDRESS : toToken, amount, true )); if (!success) { return 0; } (address reserve, uint256 rate) = abi.decode(data, (address,uint256)); if (reserve == 0x54A4a1167B004b004520c605E3f01906f683413d || // Uniswap reserve == 0xCf1394C5e2e879969fdB1f464cE1487147863dCb || // Oasis reserve == 0x053AA84FCC676113a57e0EbB0bD1913839874bE4) // Bancor { return 0; } // Check for Uniswap reserve (success,) = reserve.staticcall.gas(2300)(abi.encodeWithSelector( IKyberUniswapReserve(reserve).uniswapFactory.selector )); if (success) { return 0; } // Check for Oasis reserve (success,) = reserve.staticcall.gas(2300)(abi.encodeWithSelector( IKyberOasisReserve(reserve).otc.selector )); if (success) { return 0; } // Check for Bancor reserve (success,) = reserve.staticcall.gas(2300)(abi.encodeWithSelector( IKyberBancorReserve(reserve).bancorEth.selector )); if (success) { return 0; } return rate.mul(amount) .mul(10 ** IERC20(toToken).universalDecimals()) .div(10 ** IERC20(fromToken).universalDecimals()) .div(1e18); } function calculateBancorReturn( IERC20 fromToken, IERC20 toToken, uint256 amount ) public view returns(uint256) { IBancorNetwork bancorNetwork = IBancorNetwork(bancorContractRegistry.addressOf("BancorNetwork")); address[] memory path = bancorNetworkPathFinder.generatePath( fromToken.isETH() ? bancorEtherToken : fromToken, toToken.isETH() ? bancorEtherToken : toToken ); (bool success, bytes memory data) = address(bancorNetwork).staticcall.gas(200000)( abi.encodeWithSelector( bancorNetwork.getReturnByPath.selector, path, amount ) ); if (!success) { return 0; } (uint256 returnAmount,) = abi.decode(data, (uint256,uint256)); return returnAmount; } function calculateOasisReturn( IERC20 fromToken, IERC20 toToken, uint256 amount ) public view returns(uint256) { (bool success, bytes memory data) = address(oasisExchange).staticcall.gas(500000)( abi.encodeWithSelector( oasisExchange.getBuyAmount.selector, toToken.isETH() ? wethToken : toToken, fromToken.isETH() ? wethToken : fromToken, amount ) ); if (!success) { return 0; } return abi.decode(data, (uint256)); } function _calculateNoReturn( IERC20 /*fromToken*/, IERC20 /*toToken*/, uint256 /*amount*/ ) internal view returns(uint256) { this; } // Swap Helpers function _swapOnUniswap( IERC20 fromToken, IERC20 toToken, uint256 amount ) internal returns(uint256) { uint256 returnAmount = amount; if (!fromToken.isETH()) { IUniswapExchange fromExchange = uniswapFactory.getExchange(fromToken); if (fromExchange != IUniswapExchange(0)) { _infiniteApproveIfNeeded(fromToken, address(fromExchange)); returnAmount = fromExchange.tokenToEthSwapInput(returnAmount, 1, now); } } if (!toToken.isETH()) { IUniswapExchange toExchange = uniswapFactory.getExchange(toToken); if (toExchange != IUniswapExchange(0)) { returnAmount = toExchange.ethToTokenSwapInput.value(returnAmount)(1, now); } } return returnAmount; } function _swapOnKyber( IERC20 fromToken, IERC20 toToken, uint256 amount ) internal returns(uint256) { _infiniteApproveIfNeeded(fromToken, address(kyberNetworkProxy)); return kyberNetworkProxy.tradeWithHint.value(fromToken.isETH() ? amount : 0)( fromToken.isETH() ? ETH_ADDRESS : fromToken, amount, toToken.isETH() ? ETH_ADDRESS : toToken, address(this), 1 << 255, 0, address(0), "" ); } function _swapOnBancor( IERC20 fromToken, IERC20 toToken, uint256 amount ) internal returns(uint256) { if (fromToken.isETH()) { bancorEtherToken.deposit.value(amount)(); } IBancorNetwork bancorNetwork = IBancorNetwork(bancorContractRegistry.addressOf("BancorNetwork")); address[] memory path = bancorNetworkPathFinder.generatePath( fromToken.isETH() ? bancorEtherToken : fromToken, toToken.isETH() ? bancorEtherToken : toToken ); _infiniteApproveIfNeeded(fromToken.isETH() ? bancorEtherToken : fromToken, address(bancorNetwork)); uint256 returnAmount = bancorNetwork.claimAndConvert(path, amount, 1); if (toToken.isETH()) { bancorEtherToken.withdraw(bancorEtherToken.balanceOf(address(this))); } return returnAmount; } function _swapOnOasis( IERC20 fromToken, IERC20 toToken, uint256 amount ) internal returns(uint256) { if (fromToken.isETH()) { wethToken.deposit.value(amount)(); } _infiniteApproveIfNeeded(fromToken.isETH() ? wethToken : fromToken, address(oasisExchange)); uint256 returnAmount = oasisExchange.sellAllAmount( fromToken.isETH() ? wethToken : fromToken, amount, toToken.isETH() ? wethToken : toToken, 1 ); if (toToken.isETH()) { wethToken.withdraw(wethToken.balanceOf(address(this))); } return returnAmount; } // Helpers function _infiniteApproveIfNeeded(IERC20 token, address to) internal { if (!token.isETH()) { if ((token.allowance(address(this), to) >> 255) == 0) { token.universalApprove(to, uint256(- 1)); } } } function _isCompoundToken(IERC20 token) internal view returns(bool) { if (token == cETH) { return true; } (bool isListed,) = compound.markets(address(token)); return isListed; } function _compoundUnderlyingAsset(IERC20 asset) internal view returns(IERC20) { if (asset == cETH) { return IERC20(address(0)); } return IERC20(ICompoundToken(address(asset)).underlying()); } function _isFulcrumToken(IERC20 token) public view returns(IERC20) { if (token.isETH()) { return IERC20(-1); } (bool success, bytes memory data) = address(token).staticcall.gas(5000)(abi.encodeWithSelector( ERC20Detailed(address(token)).name.selector )); if (!success) { return IERC20(-1); } bool foundBZX = false; for (uint i = 0; i < data.length - 7; i++) { if (data[i + 0] == "F" && data[i + 1] == "u" && data[i + 2] == "l" && data[i + 3] == "c" && data[i + 4] == "r" && data[i + 5] == "u" && data[i + 6] == "m") { foundBZX = true; break; } } if (!foundBZX) { return IERC20(-1); } (success, data) = address(token).staticcall.gas(5000)(abi.encodeWithSelector( IFulcrumToken(address(token)).loanTokenAddress.selector )); if (!success) { return IERC20(-1); } return abi.decode(data, (IERC20)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_BANCOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_COMPOUND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_FULCRUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_KYBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_OASIS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_UNISWAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IKyberNetworkContract","name":"kyberNetworkContract","type":"address"},{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"_calculateKyberReturnWithEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"_isFulcrumToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bancorContractRegistry","outputs":[{"internalType":"contract IBancorContractRegistry","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cETH","outputs":[{"internalType":"contract ICompoundEther","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateBancorReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateKyberReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateOasisReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateUniswapReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"compound","outputs":[{"internalType":"contract ICompound","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"parts","type":"uint256"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"getAllRatesForDEX","outputs":[{"internalType":"uint256[]","name":"results","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"parts","type":"uint256"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"getExpectedReturn","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256[]","name":"distribution","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturn","type":"uint256"},{"internalType":"uint256","name":"parts","type":"uint256"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"goodSwap","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"kyberNetworkProxy","outputs":[{"internalType":"contract IKyberNetworkProxy","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"log","outputs":[],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oasisExchange","outputs":[{"internalType":"contract IOasisExchange","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturn","type":"uint256"},{"internalType":"uint256[]","name":"distribution","type":"uint256[]"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"swap","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"contract IUniswapFactory","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600080546001600160a01b031990811673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790915560018054821673c0829421c1d260bd3cb3e0f06cfe2d52db2ce315179055600280548216733d9819210a31b4961b30ef54be2aed79b9c9cd3b179055600380548216734ddc2d193948926d02f9b1fe9e1daa0718270ed517905560048054821673818e6fecd516ecc3849daf6845e3ec868087b75517905560058054821673c0a47dfe034b400b47bdad5fecda2621de6c4d951790556006805482167352ae12abe5d8bd778bd5397f99ca900624cfadd4179055600780548216736f0cd8c4f6f06eab664c7e3031909452b4b72861179055600880549091167339755357759ce0d7f32dc8dc45414cca409ae24e17905534801561012a57600080fd5b506141a08061013a6000396000f3fe60806040526004361061014b5760003560e01c80638c6c11f2116100b6578063e2a7515e1161006f578063e2a7515e146104d4578063eb16df2a1461059e578063f484966b146105b3578063f64a9a4914610652578063f69e204614610667578063f82c50f11461067c5761014b565b80638c6c11f2146104225780639550394514610437578063a1b4d01114610480578063a734f06e14610495578063ceb54115146104aa578063d77366a4146104bf5761014b565b80635cfcee28116101085780635cfcee28146102e757806364456efa146102fc5780636b9589aa1461033f5780636f3a1053146103875780638a273858146103ca5780638bdb2afa1461040d5761014b565b8063085e2c5b1461015a57806312dea160146102045780631388b420146102355780633c1a62dc1461024a5780634037f967146102715780635372d548146102a4575b3332141561015857600080fd5b005b34801561016657600080fd5b506101a9600480360360a081101561017d57600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356106a6565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156101ef5781810151838201526020016101d7565b50505050905001935050505060405180910390f35b34801561021057600080fd5b50610219610cde565b604080516001600160a01b039092168252519081900360200190f35b34801561024157600080fd5b50610219610ced565b34801561025657600080fd5b5061025f610cfc565b60408051918252519081900360200190f35b34801561027d57600080fd5b506102196004803603602081101561029457600080fd5b50356001600160a01b0316610d01565b3480156102b057600080fd5b5061025f600480360360608110156102c757600080fd5b506001600160a01b03813581169160208101359091169060400135611079565b3480156102f357600080fd5b5061025f61121a565b34801561030857600080fd5b5061025f6004803603606081101561031f57600080fd5b506001600160a01b0381358116916020810135909116906040013561121f565b610158600480360360c081101561035557600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a0013561159a565b34801561039357600080fd5b5061025f600480360360608110156103aa57600080fd5b506001600160a01b038135811691602081013590911690604001356115c3565b3480156103d657600080fd5b5061025f600480360360608110156103ed57600080fd5b506001600160a01b03813581169160208101359091169060400135611961565b34801561041957600080fd5b50610219611af2565b34801561042e57600080fd5b5061025f611b01565b34801561044357600080fd5b5061025f6004803603608081101561045a57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135611b06565b34801561048c57600080fd5b5061021961202e565b3480156104a157600080fd5b5061021961203d565b3480156104b657600080fd5b5061025f61204f565b3480156104cb57600080fd5b50610219612054565b610158600480360360c08110156104ea57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561052a57600080fd5b82018360208201111561053c57600080fd5b8035906020019184602083028401116401000000008311171561055e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250612063915050565b3480156105aa57600080fd5b5061025f612140565b3480156105bf57600080fd5b50610602600480360360a08110156105d657600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135612145565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561063e578181015183820152602001610626565b505050509050019250505060405180910390f35b34801561065e57600080fd5b5061025f6121cd565b34801561067357600080fd5b506102196121d2565b34801561068857600080fd5b506101586004803603602081101561069f57600080fd5b50356121e1565b60408051600480825260a082019092526000916060919060208201608080388339019050509050856001600160a01b0316876001600160a01b031614156106ef57849150610cd4565b61070083601063ffffffff6121e416565b80156107105750610710876121ef565b156107ca5760006107208861228f565b90506000886001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561075d57600080fd5b505afa158015610771573d6000803e3d6000fd5b505050506040513d602081101561078757600080fd5b505190506107bf82896107b8670de0b6b3a76400006107ac8c8763ffffffff61231b16565b9063ffffffff61237416565b89896106a6565b935093505050610cd4565b6107db83601063ffffffff6121e416565b80156107eb57506107eb866121ef565b1561089e5760006107fb8761228f565b90506000876001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561083857600080fd5b505afa15801561084c573d6000803e3d6000fd5b505050506040513d602081101561086257600080fd5b5051905061087389838989896106a6565b9094509250610894816107ac86670de0b6b3a764000063ffffffff61231b16565b9350610cd4915050565b6108af83602063ffffffff6121e416565b1561090e5760006108bf88610d01565b90506001600160a01b038082161461090c576000886001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b15801561075d57600080fd5b505b61091f83602063ffffffff6121e416565b1561097e57600061092f87610d01565b90506001600160a01b038082161461097c576000876001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b15801561083857600080fd5b505b61098661401e565b6040805160808101909152806109a386600163ffffffff6123b616565b6109af5761121f6109b3565b6123bc5b67ffffffffffffffff1681526020016109d386600263ffffffff6123b616565b6109df576110796109e3565b6123bc5b67ffffffffffffffff168152602001610a0386600463ffffffff6123b616565b610a0f576115c3610a13565b6123bc5b67ffffffffffffffff168152602001610a3386600863ffffffff6123b616565b610a3f57611961610a43565b6123bc5b67ffffffffffffffff1690529050610a59614046565b610a61614046565b60005b6004811015610b3957610a9b8b8b610a828c8c63ffffffff61237416565b878560048110610a8e57fe5b602002015163ffffffff16565b838260048110610aa757fe5b60200201523063f82c50f1848360048110610abe57fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015610af757600080fd5b505afa158015610b0b573d6000803e3d6000fd5b50505050828160048110610b1b57fe5b6020020151828260048110610b2c57fe5b6020020152600101610a64565b5060005b87811015610ccf57600060015b6004811015610b8757848260048110610b5f57fe5b6020020151858260048110610b7057fe5b60200201511115610b7f578091505b600101610b4a565b50610ba9848260048110610b9757fe5b6020020151889063ffffffff6123c516565b9650858181518110610bb757fe5b6020026020010180518091906001018152505060008a905089836001011015610cc5576000610c1a8e8e610c0e8e6107ac8d8981518110610bf457fe5b60200260200101516001018861231b90919063ffffffff16565b8a8760048110610a8e57fe5b9050610c3d858460048110610c2b57fe5b6020020151829063ffffffff61241f16565b868460048110610c4957fe5b60200201523063f82c50f1878560048110610c6057fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015610c9957600080fd5b505afa158015610cad573d6000803e3d6000fd5b5050505080858460048110610cbe57fe5b6020020152505b5050600101610b3d565b505050505b9550959350505050565b6006546001600160a01b031681565b6008546001600160a01b031681565b602081565b6000610d15826001600160a01b0316612461565b15610d235750600019611074565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310610d8e5780518252601f199092019160209182019101610d6f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114610def576040519150601f19603f3d011682016040523d82523d6000602084013e610df4565b606091505b509150915081610e0a5760001992505050611074565b6000805b6007835103811015610f6357828160000181518110610e2957fe5b6020910101516001600160f81b031916602360f91b148015610e6c5750828160010181518110610e5557fe5b6020910101516001600160f81b031916607560f81b145b8015610e995750828160020181518110610e8257fe5b6020910101516001600160f81b031916601b60fa1b145b8015610ec65750828160030181518110610eaf57fe5b6020910101516001600160f81b031916606360f81b145b8015610ef35750828160040181518110610edc57fe5b6020910101516001600160f81b031916603960f91b145b8015610f205750828160050181518110610f0957fe5b6020910101516001600160f81b031916607560f81b145b8015610f4d5750828160060181518110610f3657fe5b6020910101516001600160f81b031916606d60f81b145b15610f5b5760019150610f63565b600101610e0e565b5080610f76576000199350505050611074565b60408051600481526024810182526020810180516001600160e01b031663797bf38560e01b178152915181516001600160a01b038916936113889392918291908083835b60208310610fd95780518252601f199092019160209182019101610fba565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461103a576040519150601f19603f3d011682016040523d82523d6000602084013e61103f565b606091505b50909350915082611057576000199350505050611074565b81806020019051602081101561106c57600080fd5b505193505050505b919050565b60048054604080519283526024830181526020830180516001600160e01b0316634f61ff8b60e01b1781529051835160009485946060946001600160a01b03909116936108fc93909182918083835b602083106110e75780518252601f1990920191602091820191016110c8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611148576040519150601f19603f3d011682016040523d82523d6000602084013e61114d565b606091505b50915091508161116257600092505050611213565b600081806020019051602081101561117957600080fd5b5051905061118f6001600160a01b038816612461565b806111a757506111a7866001600160a01b0316612461565b156111c2576111b881888888611b06565b9350505050611213565b60006111de82896000805160206140ec83398151915289611b06565b9050806111f2576000945050505050611213565b61120c826000805160206140ec8339815191528984611b06565b9450505050505b9392505050565b601081565b6000816112346001600160a01b038616612461565b6113da57600554604080516303795fb160e11b81526001600160a01b038881166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561128957600080fd5b505afa15801561129d573d6000803e3d6000fd5b505050506040513d60208110156112b357600080fd5b505190506001600160a01b038116156113d85760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b03166395b68fe760e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b602083106113415780518252601f199092019160209182019101611322565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146113a2576040519150601f19603f3d011682016040523d82523d6000602084013e6113a7565b606091505b509150915081156113d0578080602001905160208110156113c757600080fd5b505193506113d5565b600093505b50505b505b6113ec846001600160a01b0316612461565b61159257600554604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561144157600080fd5b505afa158015611455573d6000803e3d6000fd5b505050506040513d602081101561146b57600080fd5b505190506001600160a01b038116156115905760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663cd7724c360e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b602083106114f95780518252601f1990920191602091820191016114da565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461155a576040519150601f19603f3d011682016040523d82523d6000602084013e61155f565b606091505b509150915081156115885780806020019051602081101561157f57600080fd5b5051935061158d565b600093505b50505b505b949350505050565b60606115a987878786866106a6565b9150506115ba878787878587612063565b50505050505050565b60065460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b6004820152905160009283926001600160a01b039091169163bb34534c91602480820192602092909190829003018186803b15801561162357600080fd5b505afa158015611637573d6000803e3d6000fd5b505050506040513d602081101561164d57600080fd5b50516007549091506060906001600160a01b03908116906375e1cc8290611675908916612461565b61167f578761168c565b6001546001600160a01b03165b61169e886001600160a01b0316612461565b6116a857876116b5565b6001546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b15801561171457600080fd5b505afa158015611728573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561175157600080fd5b810190808051604051939291908464010000000082111561177157600080fd5b90830190602082018581111561178657600080fd5b82518660208202830111640100000000821117156117a357600080fd5b82525081516020918201928201910280838360005b838110156117d05781810151838201526020016117b8565b50505050905001604052505050905060006060836001600160a01b031662030d40856001600160a01b0316630c8496cc905060e01b85896040516024018080602001838152602001828103825284818151815260200191508051906020019060200280838360005b83811015611850578181015183820152602001611838565b505050509050019350505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518082805190602001908083835b602083106118be5780518252601f19909201916020918201910161189f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461191f576040519150601f19603f3d011682016040523d82523d6000602084013e611924565b606091505b50915091508161193b576000945050505050611213565b600081806020019051604081101561195257600080fd5b50519998505050505050505050565b60085460009081906060906001600160a01b03908116906207a12090630a2513a960e11b90611991908916612461565b61199b57876119a8565b6000546001600160a01b03165b6119ba8a6001600160a01b0316612461565b6119c457896119d1565b6000546001600160a01b03165b604080516001600160a01b03938416602482015291909216604482015260648082018a905282518083039091018152608490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b60208310611a565780518252601f199092019160209182019101611a37565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611ab7576040519150601f19603f3d011682016040523d82523d6000602084013e611abc565b606091505b509150915081611ad157600092505050611213565b808060200190516020811015611ae657600080fd5b50519695505050505050565b6005546001600160a01b031681565b600881565b60008060606001600160a01b038088169062030d4090630611aecb60e11b90611b30908a16612461565b611b3a5788611b4a565b6000805160206140ec8339815191525b611b5c896001600160a01b0316612461565b611b665788611b76565b6000805160206140ec8339815191525b604080516001600160a01b0393841660248201529190921660448201526064810189905260016084808301919091528251808303909101815260a490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b60208310611c055780518252601f199092019160209182019101611be6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611c66576040519150601f19603f3d011682016040523d82523d6000602084013e611c6b565b606091505b509150915081611c8057600092505050611592565b600080828060200190516040811015611c9857600080fd5b50805160209091015190925090507354a4a1167b004b004520c605e3f01906f683413d6001600160a01b0383161480611ced575073cf1394c5e2e879969fdb1f464ce1487147863dcb6001600160a01b038316145b80611d14575073053aa84fcc676113a57e0ebb0bd1913839874be46001600160a01b038316145b15611d26576000945050505050611592565b60408051600481526024810182526020810180516001600160e01b03166345ed957d60e11b178152915181516001600160a01b038616936108fc9392918291908083835b60208310611d895780518252601f199092019160209182019101611d6a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611dea576040519150601f19603f3d011682016040523d82523d6000602084013e611def565b606091505b50909450508315611e07576000945050505050611592565b60408051600481526024810182526020810180516001600160e01b0316630dad878f60e21b178152915181516001600160a01b038616936108fc9392918291908083835b60208310611e6a5780518252601f199092019160209182019101611e4b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611ecb576040519150601f19603f3d011682016040523d82523d6000602084013e611ed0565b606091505b50909450508315611ee8576000945050505050611592565b60408051600481526024810182526020810180516001600160e01b0316634d21dff760e01b178152915181516001600160a01b038616936108fc9392918291908083835b60208310611f4b5780518252601f199092019160209182019101611f2c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611fac576040519150601f19603f3d011682016040523d82523d6000602084013e611fb1565b606091505b50909450508315611fc9576000945050505050611592565b612021670de0b6b3a76400006107ac611fea8b6001600160a01b0316612494565b600a0a6107ac6120028c6001600160a01b0316612494565b600a0a612015878d63ffffffff61231b16565b9063ffffffff61231b16565b9998505050505050505050565b6003546001600160a01b031681565b6000805160206140ec83398151915281565b600281565b6004546001600160a01b031681565b61207e6001600160a01b03871633308763ffffffff6126a516565b61208b86868685856127f1565b60006120a66001600160a01b0387163063ffffffff612e3516565b9050838110156120e75760405162461bcd60e51b81526004018080602001828103825260358152602001806140676035913960400191505060405180910390fd5b6121016001600160a01b038716338363ffffffff612f0216565b506121363361211f6001600160a01b038a163063ffffffff612e3516565b6001600160a01b038a16919063ffffffff612f0216565b5050505050505050565b600181565b606082604051908082528060200260200182016040528015612171578160200160208202803883390190505b50905060005b838110156121c3576121a3878761219b876107ac8a6001880163ffffffff61231b16565b6001876106a6565b508282815181106121b057fe5b6020908102919091010152600101612177565b5095945050505050565b600481565b6002546001600160a01b031681565b50565b818116155b92915050565b6003546000906001600160a01b038381169116141561221057506001611074565b60025460408051638e8f294b60e01b81526001600160a01b03858116600483015282516000949190911692638e8f294b9260248082019391829003018186803b15801561225c57600080fd5b505afa158015612270573d6000803e3d6000fd5b505050506040513d604081101561228657600080fd5b50519392505050565b6003546000906001600160a01b03838116911614156122b057506000611074565b816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156122e957600080fd5b505afa1580156122fd573d6000803e3d6000fd5b505050506040513d602081101561231357600080fd5b505192915050565b60008261232a575060006121e9565b8282028284828161233757fe5b04146112135760405162461bcd60e51b81526004018080602001828103825260218152602001806140cb6021913960400191505060405180910390fd5b600061121383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612fa0565b16151590565b60009392505050565b600082820183811015611213576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061121383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613042565b60006001600160a01b03821615806121e957506001600160a01b0382166000805160206140ec8339815191521492915050565b60006001600160a01b03821615806124c257506001600160a01b0382166000805160206140ec833981519152145b156124cf57506012611074565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b6020831061253a5780518252601f19909201916020918201910161251b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461259b576040519150601f19603f3d011682016040523d82523d6000602084013e6125a0565b606091505b50915091508161267a5760408051600481526024810182526020810180516001600160e01b0316632e0f262560e01b178152915181516001600160a01b038816936113889392918291908083835b6020831061260d5780518252601f1990920191602091820191016125ee565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461266e576040519150601f19603f3d011682016040523d82523d6000602084013e612673565b606091505b5090925090505b81612686576012611592565b80806020019051602081101561269b57600080fd5b5051949350505050565b806126af576127eb565b6001600160a01b03841615806126db57506001600160a01b0384166000805160206140ec833981519152145b156127d0576001600160a01b038316331480156126f85750803410155b61273d576040805162461bcd60e51b81526020600482015260116024820152706d73672e76616c7565206973207a65726f60781b604482015290519081900360640190fd5b6001600160a01b0382163014612785576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612783573d6000803e3d6000fd5b505b803411156127cb57336108fc6127a1348463ffffffff61241f16565b6040518115909202916000818181858888f193505050501580156127c9573d6000803e3d6000fd5b505b6127eb565b6127eb6001600160a01b03851684848463ffffffff61309c16565b50505050565b836001600160a01b0316856001600160a01b0316141561281057612e2e565b61282181601063ffffffff6121e416565b80156128315750612831856121ef565b156128e75760006128418661228f565b9050856001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561288957600080fd5b505af115801561289d573d6000803e3d6000fd5b505050506040513d60208110156128b357600080fd5b50600090506128d16001600160a01b0383163063ffffffff612e3516565b90506128e082878387876127f1565b5050612e2e565b6128f881601063ffffffff6121e416565b80156129085750612908846121ef565b15612a4c5760006129188561228f565b905061292786828686866127f1565b60006129426001600160a01b0383163063ffffffff612e3516565b9050612956826001600160a01b0316612461565b156129c957600360009054906101000a90046001600160a01b03166001600160a01b0316631249c58b826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129ab57600080fd5b505af11580156129bf573d6000803e3d6000fd5b50505050506128e0565b6129d382876130f6565b856001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015612a1957600080fd5b505af1158015612a2d573d6000803e3d6000fd5b505050506040513d6020811015612a4357600080fd5b50505050612e2e565b612a5d81602063ffffffff6121e416565b15612b83576000612a6d86610d01565b90506001600160a01b0380821614612b8157612a91816001600160a01b0316612461565b15612b17576040805163081a6b2560e41b81523060048201526024810186905290516001600160a01b038816916381a6b2509160448083019260209291908290030181600087803b158015612ae557600080fd5b505af1158015612af9573d6000803e3d6000fd5b505050506040513d6020811015612b0f57600080fd5b50612b669050565b60408051632770a7eb60e21b81523060048201526024810186905290516001600160a01b03881691639dc29fac9160448083019260209291908290030181600087803b15801561288957600080fd5b60006128d16001600160a01b0383163063ffffffff612e3516565b505b612b9481602063ffffffff6121e416565b15612ccf576000612ba485610d01565b90506001600160a01b0380821614612ccd57612bc386828686866127f1565b6000612bde6001600160a01b0383163063ffffffff612e3516565b9050612bf2826001600160a01b0316612461565b15612c745760408051638f6ede1f60e01b815230600482015290516001600160a01b03881691638f6ede1f91849160248082019260209290919082900301818588803b158015612c4157600080fd5b505af1158015612c55573d6000803e3d6000fd5b50505050506040513d6020811015612c6c57600080fd5b506128e09050565b612c7e82876130f6565b604080516340c10f1960e01b81523060048201526024810183905290516001600160a01b038816916340c10f199160448083019260209291908290030181600087803b158015612a1957600080fd5b505b612cd761401e565b50604080516080810182526131af81526134056020820152613555918101919091526139dd6060820152600080805b6004811015612d5f576000868281518110612d1d57fe5b60200260200101511115612d5757612d51868281518110612d3a57fe5b6020026020010151846123c590919063ffffffff16565b92508091505b600101612d06565b5060008211612d9f5760405162461bcd60e51b815260040180806020018281038252602f81526020018061409c602f913960400191505060405180910390fd5b8560005b6004811015612e2857868181518110612db857fe5b602002602001015160001415612dcd57612e20565b6000612df9856107ac8a8581518110612de257fe5b60200260200101518c61231b90919063ffffffff16565b905083821415612e065750815b8083039250612e1d8b8b83898660048110610a8e57fe5b50505b600101612da3565b50505050505b5050505050565b60006001600160a01b0383161580612e6357506001600160a01b0383166000805160206140ec833981519152145b15612e7957506001600160a01b038116316121e9565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612ecf57600080fd5b505afa158015612ee3573d6000803e3d6000fd5b505050506040513d6020811015612ef957600080fd5b505190506121e9565b600081612f1157506001611213565b6001600160a01b0384161580612f3d57506001600160a01b0384166000805160206140ec833981519152145b15612f7e576040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015612f78573d6000803e3d6000fd5b50611213565b612f986001600160a01b038516848463ffffffff613c7716565b506001611213565b6000818361302c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ff1578181015183820152602001612fd9565b50505050905090810190601f16801561301e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161303857fe5b0495945050505050565b600081848411156130945760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612ff1578181015183820152602001612fd9565b505050900390565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526127eb908590613cce565b613108826001600160a01b0316612461565b6131ab5760408051636eb1769f60e11b81523060048201526001600160a01b038381166024830152915160ff9285169163dd62ed3e916044808301926020929190829003018186803b15801561315d57600080fd5b505afa158015613171573d6000803e3d6000fd5b505050506040513d602081101561318757600080fd5b5051901c6131ab576131ab6001600160a01b0383168260001963ffffffff613e8616565b5050565b6000816131c46001600160a01b038616612461565b6132e757600554604080516303795fb160e11b81526001600160a01b038881166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561321957600080fd5b505afa15801561322d573d6000803e3d6000fd5b505050506040513d602081101561324357600080fd5b505190506001600160a01b038116156132e55761326086826130f6565b604080516395e3c50b60e01b8152600481018490526001602482015242604482015290516001600160a01b038316916395e3c50b9160648083019260209291908290030181600087803b1580156132b657600080fd5b505af11580156132ca573d6000803e3d6000fd5b505050506040513d60208110156132e057600080fd5b505191505b505b6132f9846001600160a01b0316612461565b61159257600554604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561334e57600080fd5b505afa158015613362573d6000803e3d6000fd5b505050506040513d602081101561337857600080fd5b505190506001600160a01b0381161561159057806001600160a01b031663f39b5b9b836001426040518463ffffffff1660e01b815260040180838152602001828152602001925050506020604051808303818588803b1580156133da57600080fd5b505af11580156133ee573d6000803e3d6000fd5b50505050506040513d6020811015611ae657600080fd5b60045460009061341f9085906001600160a01b03166130f6565b6004546001600160a01b03908116906329589f619061343f908716612461565b61344a57600061344c565b835b61345e876001600160a01b0316612461565b6134685786613478565b6000805160206140ec8339815191525b8561348b886001600160a01b0316612461565b61349557876134a5565b6000805160206140ec8339815191525b604080516001600160e01b031960e088901b1681526001600160a01b039485166004820152602481019390935292166044820152306064820152600160ff1b6084820152600060a4820181905260c4820181905261010060e4830152610104820152905161014480830192602092919082900301818588803b15801561352a57600080fd5b505af115801561353e573d6000803e3d6000fd5b50505050506040513d602081101561269b57600080fd5b6000613569846001600160a01b0316612461565b156135d857600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156135be57600080fd5b505af11580156135d2573d6000803e3d6000fd5b50505050505b60065460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561363357600080fd5b505afa158015613647573d6000803e3d6000fd5b505050506040513d602081101561365d57600080fd5b50516007549091506060906001600160a01b03908116906375e1cc8290613685908916612461565b61368f578761369c565b6001546001600160a01b03165b6136ae886001600160a01b0316612461565b6136b857876136c5565b6001546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b15801561372457600080fd5b505afa158015613738573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561376157600080fd5b810190808051604051939291908464010000000082111561378157600080fd5b90830190602082018581111561379657600080fd5b82518660208202830111640100000000821117156137b357600080fd5b82525081516020918201928201910280838360005b838110156137e05781810151838201526020016137c8565b505050509050016040525050509050613821613804876001600160a01b0316612461565b61380e578661381b565b6001546001600160a01b03165b836130f6565b6000826001600160a01b031663c7ba24bc838760016040518463ffffffff1660e01b81526004018080602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613891578181015183820152602001613879565b50505050905001945050505050602060405180830381600087803b1580156138b857600080fd5b505af11580156138cc573d6000803e3d6000fd5b505050506040513d60208110156138e257600080fd5b505190506138f86001600160a01b038716612461565b156139d357600154604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b15801561395057600080fd5b505afa158015613964573d6000803e3d6000fd5b505050506040513d602081101561397a57600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b1580156139ba57600080fd5b505af11580156139ce573d6000803e3d6000fd5b505050505b9695505050505050565b60006139f1846001600160a01b0316612461565b15613a55576000805460408051630d0e30db60e41b815290516001600160a01b039092169263d0e30db0928692600480820193929182900301818588803b158015613a3b57600080fd5b505af1158015613a4f573d6000803e3d6000fd5b50505050505b613a92613a6a856001600160a01b0316612461565b613a745784613a81565b6000546001600160a01b03165b6008546001600160a01b03166130f6565b6008546000906001600160a01b0390811690630621b4f690613ab5908816612461565b613abf5786613acc565b6000546001600160a01b03165b85613adf886001600160a01b0316612461565b613ae95787613af6565b6000546001600160a01b03165b604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015260248101939093529216604482015260016064820152905160848083019260209291908290030181600087803b158015613b5457600080fd5b505af1158015613b68573d6000803e3d6000fd5b505050506040513d6020811015613b7e57600080fd5b50519050613b946001600160a01b038516612461565b1561159257600054604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b158015613bec57600080fd5b505afa158015613c00573d6000803e3d6000fd5b505050506040513d6020811015613c1657600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015613c5657600080fd5b505af1158015613c6a573d6000803e3d6000fd5b5050505090509392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613cc9908490613cce565b505050565b613ce0826001600160a01b0316613ed4565b613d31576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613d6f5780518252601f199092019160209182019101613d50565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613dd1576040519150601f19603f3d011682016040523d82523d6000602084013e613dd6565b606091505b509150915081613e2d576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156127eb57808060200190516020811015613e4957600080fd5b50516127eb5760405162461bcd60e51b815260040180806020018281038252602a81526020018061410c602a913960400191505060405180910390fd5b6001600160a01b03831615801590613eb557506001600160a01b0383166000805160206140ec83398151915214155b15613cc957613cc96001600160a01b038416838363ffffffff613f0b16565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906115925750141592915050565b801580613f91575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613f6357600080fd5b505afa158015613f77573d6000803e3d6000fd5b505050506040513d6020811015613f8d57600080fd5b5051155b613fcc5760405162461bcd60e51b81526004018080602001828103825260368152602001806141366036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052613cc9908490613cce565b60405180608001604052806004905b61406481526020019060019003908161402d5790505090565b60405180608001604052806004906020820280388339509192915050565bfefe4f6e6553706c69743a2061637475616c2072657475726e20616d6f756e74206973206c657373207468616e206d696e52657475726e4f6e6553706c69743a20646973747269627574696f6e2073686f756c6420636f6e7461696e206e6f6e2d7a65726f73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582095a939ead5d2c358b8fc2de33c4c7a6efb984e6b726dacfae8ac46abf112dba464736f6c634300050d0032
Deployed Bytecode
0x60806040526004361061014b5760003560e01c80638c6c11f2116100b6578063e2a7515e1161006f578063e2a7515e146104d4578063eb16df2a1461059e578063f484966b146105b3578063f64a9a4914610652578063f69e204614610667578063f82c50f11461067c5761014b565b80638c6c11f2146104225780639550394514610437578063a1b4d01114610480578063a734f06e14610495578063ceb54115146104aa578063d77366a4146104bf5761014b565b80635cfcee28116101085780635cfcee28146102e757806364456efa146102fc5780636b9589aa1461033f5780636f3a1053146103875780638a273858146103ca5780638bdb2afa1461040d5761014b565b8063085e2c5b1461015a57806312dea160146102045780631388b420146102355780633c1a62dc1461024a5780634037f967146102715780635372d548146102a4575b3332141561015857600080fd5b005b34801561016657600080fd5b506101a9600480360360a081101561017d57600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356106a6565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156101ef5781810151838201526020016101d7565b50505050905001935050505060405180910390f35b34801561021057600080fd5b50610219610cde565b604080516001600160a01b039092168252519081900360200190f35b34801561024157600080fd5b50610219610ced565b34801561025657600080fd5b5061025f610cfc565b60408051918252519081900360200190f35b34801561027d57600080fd5b506102196004803603602081101561029457600080fd5b50356001600160a01b0316610d01565b3480156102b057600080fd5b5061025f600480360360608110156102c757600080fd5b506001600160a01b03813581169160208101359091169060400135611079565b3480156102f357600080fd5b5061025f61121a565b34801561030857600080fd5b5061025f6004803603606081101561031f57600080fd5b506001600160a01b0381358116916020810135909116906040013561121f565b610158600480360360c081101561035557600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a0013561159a565b34801561039357600080fd5b5061025f600480360360608110156103aa57600080fd5b506001600160a01b038135811691602081013590911690604001356115c3565b3480156103d657600080fd5b5061025f600480360360608110156103ed57600080fd5b506001600160a01b03813581169160208101359091169060400135611961565b34801561041957600080fd5b50610219611af2565b34801561042e57600080fd5b5061025f611b01565b34801561044357600080fd5b5061025f6004803603608081101561045a57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135611b06565b34801561048c57600080fd5b5061021961202e565b3480156104a157600080fd5b5061021961203d565b3480156104b657600080fd5b5061025f61204f565b3480156104cb57600080fd5b50610219612054565b610158600480360360c08110156104ea57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561052a57600080fd5b82018360208201111561053c57600080fd5b8035906020019184602083028401116401000000008311171561055e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250612063915050565b3480156105aa57600080fd5b5061025f612140565b3480156105bf57600080fd5b50610602600480360360a08110156105d657600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135612145565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561063e578181015183820152602001610626565b505050509050019250505060405180910390f35b34801561065e57600080fd5b5061025f6121cd565b34801561067357600080fd5b506102196121d2565b34801561068857600080fd5b506101586004803603602081101561069f57600080fd5b50356121e1565b60408051600480825260a082019092526000916060919060208201608080388339019050509050856001600160a01b0316876001600160a01b031614156106ef57849150610cd4565b61070083601063ffffffff6121e416565b80156107105750610710876121ef565b156107ca5760006107208861228f565b90506000886001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561075d57600080fd5b505afa158015610771573d6000803e3d6000fd5b505050506040513d602081101561078757600080fd5b505190506107bf82896107b8670de0b6b3a76400006107ac8c8763ffffffff61231b16565b9063ffffffff61237416565b89896106a6565b935093505050610cd4565b6107db83601063ffffffff6121e416565b80156107eb57506107eb866121ef565b1561089e5760006107fb8761228f565b90506000876001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561083857600080fd5b505afa15801561084c573d6000803e3d6000fd5b505050506040513d602081101561086257600080fd5b5051905061087389838989896106a6565b9094509250610894816107ac86670de0b6b3a764000063ffffffff61231b16565b9350610cd4915050565b6108af83602063ffffffff6121e416565b1561090e5760006108bf88610d01565b90506001600160a01b038082161461090c576000886001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b15801561075d57600080fd5b505b61091f83602063ffffffff6121e416565b1561097e57600061092f87610d01565b90506001600160a01b038082161461097c576000876001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b15801561083857600080fd5b505b61098661401e565b6040805160808101909152806109a386600163ffffffff6123b616565b6109af5761121f6109b3565b6123bc5b67ffffffffffffffff1681526020016109d386600263ffffffff6123b616565b6109df576110796109e3565b6123bc5b67ffffffffffffffff168152602001610a0386600463ffffffff6123b616565b610a0f576115c3610a13565b6123bc5b67ffffffffffffffff168152602001610a3386600863ffffffff6123b616565b610a3f57611961610a43565b6123bc5b67ffffffffffffffff1690529050610a59614046565b610a61614046565b60005b6004811015610b3957610a9b8b8b610a828c8c63ffffffff61237416565b878560048110610a8e57fe5b602002015163ffffffff16565b838260048110610aa757fe5b60200201523063f82c50f1848360048110610abe57fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015610af757600080fd5b505afa158015610b0b573d6000803e3d6000fd5b50505050828160048110610b1b57fe5b6020020151828260048110610b2c57fe5b6020020152600101610a64565b5060005b87811015610ccf57600060015b6004811015610b8757848260048110610b5f57fe5b6020020151858260048110610b7057fe5b60200201511115610b7f578091505b600101610b4a565b50610ba9848260048110610b9757fe5b6020020151889063ffffffff6123c516565b9650858181518110610bb757fe5b6020026020010180518091906001018152505060008a905089836001011015610cc5576000610c1a8e8e610c0e8e6107ac8d8981518110610bf457fe5b60200260200101516001018861231b90919063ffffffff16565b8a8760048110610a8e57fe5b9050610c3d858460048110610c2b57fe5b6020020151829063ffffffff61241f16565b868460048110610c4957fe5b60200201523063f82c50f1878560048110610c6057fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015610c9957600080fd5b505afa158015610cad573d6000803e3d6000fd5b5050505080858460048110610cbe57fe5b6020020152505b5050600101610b3d565b505050505b9550959350505050565b6006546001600160a01b031681565b6008546001600160a01b031681565b602081565b6000610d15826001600160a01b0316612461565b15610d235750600019611074565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310610d8e5780518252601f199092019160209182019101610d6f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114610def576040519150601f19603f3d011682016040523d82523d6000602084013e610df4565b606091505b509150915081610e0a5760001992505050611074565b6000805b6007835103811015610f6357828160000181518110610e2957fe5b6020910101516001600160f81b031916602360f91b148015610e6c5750828160010181518110610e5557fe5b6020910101516001600160f81b031916607560f81b145b8015610e995750828160020181518110610e8257fe5b6020910101516001600160f81b031916601b60fa1b145b8015610ec65750828160030181518110610eaf57fe5b6020910101516001600160f81b031916606360f81b145b8015610ef35750828160040181518110610edc57fe5b6020910101516001600160f81b031916603960f91b145b8015610f205750828160050181518110610f0957fe5b6020910101516001600160f81b031916607560f81b145b8015610f4d5750828160060181518110610f3657fe5b6020910101516001600160f81b031916606d60f81b145b15610f5b5760019150610f63565b600101610e0e565b5080610f76576000199350505050611074565b60408051600481526024810182526020810180516001600160e01b031663797bf38560e01b178152915181516001600160a01b038916936113889392918291908083835b60208310610fd95780518252601f199092019160209182019101610fba565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461103a576040519150601f19603f3d011682016040523d82523d6000602084013e61103f565b606091505b50909350915082611057576000199350505050611074565b81806020019051602081101561106c57600080fd5b505193505050505b919050565b60048054604080519283526024830181526020830180516001600160e01b0316634f61ff8b60e01b1781529051835160009485946060946001600160a01b03909116936108fc93909182918083835b602083106110e75780518252601f1990920191602091820191016110c8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611148576040519150601f19603f3d011682016040523d82523d6000602084013e61114d565b606091505b50915091508161116257600092505050611213565b600081806020019051602081101561117957600080fd5b5051905061118f6001600160a01b038816612461565b806111a757506111a7866001600160a01b0316612461565b156111c2576111b881888888611b06565b9350505050611213565b60006111de82896000805160206140ec83398151915289611b06565b9050806111f2576000945050505050611213565b61120c826000805160206140ec8339815191528984611b06565b9450505050505b9392505050565b601081565b6000816112346001600160a01b038616612461565b6113da57600554604080516303795fb160e11b81526001600160a01b038881166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561128957600080fd5b505afa15801561129d573d6000803e3d6000fd5b505050506040513d60208110156112b357600080fd5b505190506001600160a01b038116156113d85760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b03166395b68fe760e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b602083106113415780518252601f199092019160209182019101611322565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146113a2576040519150601f19603f3d011682016040523d82523d6000602084013e6113a7565b606091505b509150915081156113d0578080602001905160208110156113c757600080fd5b505193506113d5565b600093505b50505b505b6113ec846001600160a01b0316612461565b61159257600554604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561144157600080fd5b505afa158015611455573d6000803e3d6000fd5b505050506040513d602081101561146b57600080fd5b505190506001600160a01b038116156115905760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663cd7724c360e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b602083106114f95780518252601f1990920191602091820191016114da565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461155a576040519150601f19603f3d011682016040523d82523d6000602084013e61155f565b606091505b509150915081156115885780806020019051602081101561157f57600080fd5b5051935061158d565b600093505b50505b505b949350505050565b60606115a987878786866106a6565b9150506115ba878787878587612063565b50505050505050565b60065460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b6004820152905160009283926001600160a01b039091169163bb34534c91602480820192602092909190829003018186803b15801561162357600080fd5b505afa158015611637573d6000803e3d6000fd5b505050506040513d602081101561164d57600080fd5b50516007549091506060906001600160a01b03908116906375e1cc8290611675908916612461565b61167f578761168c565b6001546001600160a01b03165b61169e886001600160a01b0316612461565b6116a857876116b5565b6001546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b15801561171457600080fd5b505afa158015611728573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561175157600080fd5b810190808051604051939291908464010000000082111561177157600080fd5b90830190602082018581111561178657600080fd5b82518660208202830111640100000000821117156117a357600080fd5b82525081516020918201928201910280838360005b838110156117d05781810151838201526020016117b8565b50505050905001604052505050905060006060836001600160a01b031662030d40856001600160a01b0316630c8496cc905060e01b85896040516024018080602001838152602001828103825284818151815260200191508051906020019060200280838360005b83811015611850578181015183820152602001611838565b505050509050019350505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518082805190602001908083835b602083106118be5780518252601f19909201916020918201910161189f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461191f576040519150601f19603f3d011682016040523d82523d6000602084013e611924565b606091505b50915091508161193b576000945050505050611213565b600081806020019051604081101561195257600080fd5b50519998505050505050505050565b60085460009081906060906001600160a01b03908116906207a12090630a2513a960e11b90611991908916612461565b61199b57876119a8565b6000546001600160a01b03165b6119ba8a6001600160a01b0316612461565b6119c457896119d1565b6000546001600160a01b03165b604080516001600160a01b03938416602482015291909216604482015260648082018a905282518083039091018152608490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b60208310611a565780518252601f199092019160209182019101611a37565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611ab7576040519150601f19603f3d011682016040523d82523d6000602084013e611abc565b606091505b509150915081611ad157600092505050611213565b808060200190516020811015611ae657600080fd5b50519695505050505050565b6005546001600160a01b031681565b600881565b60008060606001600160a01b038088169062030d4090630611aecb60e11b90611b30908a16612461565b611b3a5788611b4a565b6000805160206140ec8339815191525b611b5c896001600160a01b0316612461565b611b665788611b76565b6000805160206140ec8339815191525b604080516001600160a01b0393841660248201529190921660448201526064810189905260016084808301919091528251808303909101815260a490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b60208310611c055780518252601f199092019160209182019101611be6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611c66576040519150601f19603f3d011682016040523d82523d6000602084013e611c6b565b606091505b509150915081611c8057600092505050611592565b600080828060200190516040811015611c9857600080fd5b50805160209091015190925090507354a4a1167b004b004520c605e3f01906f683413d6001600160a01b0383161480611ced575073cf1394c5e2e879969fdb1f464ce1487147863dcb6001600160a01b038316145b80611d14575073053aa84fcc676113a57e0ebb0bd1913839874be46001600160a01b038316145b15611d26576000945050505050611592565b60408051600481526024810182526020810180516001600160e01b03166345ed957d60e11b178152915181516001600160a01b038616936108fc9392918291908083835b60208310611d895780518252601f199092019160209182019101611d6a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611dea576040519150601f19603f3d011682016040523d82523d6000602084013e611def565b606091505b50909450508315611e07576000945050505050611592565b60408051600481526024810182526020810180516001600160e01b0316630dad878f60e21b178152915181516001600160a01b038616936108fc9392918291908083835b60208310611e6a5780518252601f199092019160209182019101611e4b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611ecb576040519150601f19603f3d011682016040523d82523d6000602084013e611ed0565b606091505b50909450508315611ee8576000945050505050611592565b60408051600481526024810182526020810180516001600160e01b0316634d21dff760e01b178152915181516001600160a01b038616936108fc9392918291908083835b60208310611f4b5780518252601f199092019160209182019101611f2c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611fac576040519150601f19603f3d011682016040523d82523d6000602084013e611fb1565b606091505b50909450508315611fc9576000945050505050611592565b612021670de0b6b3a76400006107ac611fea8b6001600160a01b0316612494565b600a0a6107ac6120028c6001600160a01b0316612494565b600a0a612015878d63ffffffff61231b16565b9063ffffffff61231b16565b9998505050505050505050565b6003546001600160a01b031681565b6000805160206140ec83398151915281565b600281565b6004546001600160a01b031681565b61207e6001600160a01b03871633308763ffffffff6126a516565b61208b86868685856127f1565b60006120a66001600160a01b0387163063ffffffff612e3516565b9050838110156120e75760405162461bcd60e51b81526004018080602001828103825260358152602001806140676035913960400191505060405180910390fd5b6121016001600160a01b038716338363ffffffff612f0216565b506121363361211f6001600160a01b038a163063ffffffff612e3516565b6001600160a01b038a16919063ffffffff612f0216565b5050505050505050565b600181565b606082604051908082528060200260200182016040528015612171578160200160208202803883390190505b50905060005b838110156121c3576121a3878761219b876107ac8a6001880163ffffffff61231b16565b6001876106a6565b508282815181106121b057fe5b6020908102919091010152600101612177565b5095945050505050565b600481565b6002546001600160a01b031681565b50565b818116155b92915050565b6003546000906001600160a01b038381169116141561221057506001611074565b60025460408051638e8f294b60e01b81526001600160a01b03858116600483015282516000949190911692638e8f294b9260248082019391829003018186803b15801561225c57600080fd5b505afa158015612270573d6000803e3d6000fd5b505050506040513d604081101561228657600080fd5b50519392505050565b6003546000906001600160a01b03838116911614156122b057506000611074565b816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156122e957600080fd5b505afa1580156122fd573d6000803e3d6000fd5b505050506040513d602081101561231357600080fd5b505192915050565b60008261232a575060006121e9565b8282028284828161233757fe5b04146112135760405162461bcd60e51b81526004018080602001828103825260218152602001806140cb6021913960400191505060405180910390fd5b600061121383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612fa0565b16151590565b60009392505050565b600082820183811015611213576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061121383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613042565b60006001600160a01b03821615806121e957506001600160a01b0382166000805160206140ec8339815191521492915050565b60006001600160a01b03821615806124c257506001600160a01b0382166000805160206140ec833981519152145b156124cf57506012611074565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b6020831061253a5780518252601f19909201916020918201910161251b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461259b576040519150601f19603f3d011682016040523d82523d6000602084013e6125a0565b606091505b50915091508161267a5760408051600481526024810182526020810180516001600160e01b0316632e0f262560e01b178152915181516001600160a01b038816936113889392918291908083835b6020831061260d5780518252601f1990920191602091820191016125ee565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461266e576040519150601f19603f3d011682016040523d82523d6000602084013e612673565b606091505b5090925090505b81612686576012611592565b80806020019051602081101561269b57600080fd5b5051949350505050565b806126af576127eb565b6001600160a01b03841615806126db57506001600160a01b0384166000805160206140ec833981519152145b156127d0576001600160a01b038316331480156126f85750803410155b61273d576040805162461bcd60e51b81526020600482015260116024820152706d73672e76616c7565206973207a65726f60781b604482015290519081900360640190fd5b6001600160a01b0382163014612785576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612783573d6000803e3d6000fd5b505b803411156127cb57336108fc6127a1348463ffffffff61241f16565b6040518115909202916000818181858888f193505050501580156127c9573d6000803e3d6000fd5b505b6127eb565b6127eb6001600160a01b03851684848463ffffffff61309c16565b50505050565b836001600160a01b0316856001600160a01b0316141561281057612e2e565b61282181601063ffffffff6121e416565b80156128315750612831856121ef565b156128e75760006128418661228f565b9050856001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561288957600080fd5b505af115801561289d573d6000803e3d6000fd5b505050506040513d60208110156128b357600080fd5b50600090506128d16001600160a01b0383163063ffffffff612e3516565b90506128e082878387876127f1565b5050612e2e565b6128f881601063ffffffff6121e416565b80156129085750612908846121ef565b15612a4c5760006129188561228f565b905061292786828686866127f1565b60006129426001600160a01b0383163063ffffffff612e3516565b9050612956826001600160a01b0316612461565b156129c957600360009054906101000a90046001600160a01b03166001600160a01b0316631249c58b826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129ab57600080fd5b505af11580156129bf573d6000803e3d6000fd5b50505050506128e0565b6129d382876130f6565b856001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015612a1957600080fd5b505af1158015612a2d573d6000803e3d6000fd5b505050506040513d6020811015612a4357600080fd5b50505050612e2e565b612a5d81602063ffffffff6121e416565b15612b83576000612a6d86610d01565b90506001600160a01b0380821614612b8157612a91816001600160a01b0316612461565b15612b17576040805163081a6b2560e41b81523060048201526024810186905290516001600160a01b038816916381a6b2509160448083019260209291908290030181600087803b158015612ae557600080fd5b505af1158015612af9573d6000803e3d6000fd5b505050506040513d6020811015612b0f57600080fd5b50612b669050565b60408051632770a7eb60e21b81523060048201526024810186905290516001600160a01b03881691639dc29fac9160448083019260209291908290030181600087803b15801561288957600080fd5b60006128d16001600160a01b0383163063ffffffff612e3516565b505b612b9481602063ffffffff6121e416565b15612ccf576000612ba485610d01565b90506001600160a01b0380821614612ccd57612bc386828686866127f1565b6000612bde6001600160a01b0383163063ffffffff612e3516565b9050612bf2826001600160a01b0316612461565b15612c745760408051638f6ede1f60e01b815230600482015290516001600160a01b03881691638f6ede1f91849160248082019260209290919082900301818588803b158015612c4157600080fd5b505af1158015612c55573d6000803e3d6000fd5b50505050506040513d6020811015612c6c57600080fd5b506128e09050565b612c7e82876130f6565b604080516340c10f1960e01b81523060048201526024810183905290516001600160a01b038816916340c10f199160448083019260209291908290030181600087803b158015612a1957600080fd5b505b612cd761401e565b50604080516080810182526131af81526134056020820152613555918101919091526139dd6060820152600080805b6004811015612d5f576000868281518110612d1d57fe5b60200260200101511115612d5757612d51868281518110612d3a57fe5b6020026020010151846123c590919063ffffffff16565b92508091505b600101612d06565b5060008211612d9f5760405162461bcd60e51b815260040180806020018281038252602f81526020018061409c602f913960400191505060405180910390fd5b8560005b6004811015612e2857868181518110612db857fe5b602002602001015160001415612dcd57612e20565b6000612df9856107ac8a8581518110612de257fe5b60200260200101518c61231b90919063ffffffff16565b905083821415612e065750815b8083039250612e1d8b8b83898660048110610a8e57fe5b50505b600101612da3565b50505050505b5050505050565b60006001600160a01b0383161580612e6357506001600160a01b0383166000805160206140ec833981519152145b15612e7957506001600160a01b038116316121e9565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612ecf57600080fd5b505afa158015612ee3573d6000803e3d6000fd5b505050506040513d6020811015612ef957600080fd5b505190506121e9565b600081612f1157506001611213565b6001600160a01b0384161580612f3d57506001600160a01b0384166000805160206140ec833981519152145b15612f7e576040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015612f78573d6000803e3d6000fd5b50611213565b612f986001600160a01b038516848463ffffffff613c7716565b506001611213565b6000818361302c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ff1578181015183820152602001612fd9565b50505050905090810190601f16801561301e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161303857fe5b0495945050505050565b600081848411156130945760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612ff1578181015183820152602001612fd9565b505050900390565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526127eb908590613cce565b613108826001600160a01b0316612461565b6131ab5760408051636eb1769f60e11b81523060048201526001600160a01b038381166024830152915160ff9285169163dd62ed3e916044808301926020929190829003018186803b15801561315d57600080fd5b505afa158015613171573d6000803e3d6000fd5b505050506040513d602081101561318757600080fd5b5051901c6131ab576131ab6001600160a01b0383168260001963ffffffff613e8616565b5050565b6000816131c46001600160a01b038616612461565b6132e757600554604080516303795fb160e11b81526001600160a01b038881166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561321957600080fd5b505afa15801561322d573d6000803e3d6000fd5b505050506040513d602081101561324357600080fd5b505190506001600160a01b038116156132e55761326086826130f6565b604080516395e3c50b60e01b8152600481018490526001602482015242604482015290516001600160a01b038316916395e3c50b9160648083019260209291908290030181600087803b1580156132b657600080fd5b505af11580156132ca573d6000803e3d6000fd5b505050506040513d60208110156132e057600080fd5b505191505b505b6132f9846001600160a01b0316612461565b61159257600554604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561334e57600080fd5b505afa158015613362573d6000803e3d6000fd5b505050506040513d602081101561337857600080fd5b505190506001600160a01b0381161561159057806001600160a01b031663f39b5b9b836001426040518463ffffffff1660e01b815260040180838152602001828152602001925050506020604051808303818588803b1580156133da57600080fd5b505af11580156133ee573d6000803e3d6000fd5b50505050506040513d6020811015611ae657600080fd5b60045460009061341f9085906001600160a01b03166130f6565b6004546001600160a01b03908116906329589f619061343f908716612461565b61344a57600061344c565b835b61345e876001600160a01b0316612461565b6134685786613478565b6000805160206140ec8339815191525b8561348b886001600160a01b0316612461565b61349557876134a5565b6000805160206140ec8339815191525b604080516001600160e01b031960e088901b1681526001600160a01b039485166004820152602481019390935292166044820152306064820152600160ff1b6084820152600060a4820181905260c4820181905261010060e4830152610104820152905161014480830192602092919082900301818588803b15801561352a57600080fd5b505af115801561353e573d6000803e3d6000fd5b50505050506040513d602081101561269b57600080fd5b6000613569846001600160a01b0316612461565b156135d857600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156135be57600080fd5b505af11580156135d2573d6000803e3d6000fd5b50505050505b60065460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561363357600080fd5b505afa158015613647573d6000803e3d6000fd5b505050506040513d602081101561365d57600080fd5b50516007549091506060906001600160a01b03908116906375e1cc8290613685908916612461565b61368f578761369c565b6001546001600160a01b03165b6136ae886001600160a01b0316612461565b6136b857876136c5565b6001546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b15801561372457600080fd5b505afa158015613738573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561376157600080fd5b810190808051604051939291908464010000000082111561378157600080fd5b90830190602082018581111561379657600080fd5b82518660208202830111640100000000821117156137b357600080fd5b82525081516020918201928201910280838360005b838110156137e05781810151838201526020016137c8565b505050509050016040525050509050613821613804876001600160a01b0316612461565b61380e578661381b565b6001546001600160a01b03165b836130f6565b6000826001600160a01b031663c7ba24bc838760016040518463ffffffff1660e01b81526004018080602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613891578181015183820152602001613879565b50505050905001945050505050602060405180830381600087803b1580156138b857600080fd5b505af11580156138cc573d6000803e3d6000fd5b505050506040513d60208110156138e257600080fd5b505190506138f86001600160a01b038716612461565b156139d357600154604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b15801561395057600080fd5b505afa158015613964573d6000803e3d6000fd5b505050506040513d602081101561397a57600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b1580156139ba57600080fd5b505af11580156139ce573d6000803e3d6000fd5b505050505b9695505050505050565b60006139f1846001600160a01b0316612461565b15613a55576000805460408051630d0e30db60e41b815290516001600160a01b039092169263d0e30db0928692600480820193929182900301818588803b158015613a3b57600080fd5b505af1158015613a4f573d6000803e3d6000fd5b50505050505b613a92613a6a856001600160a01b0316612461565b613a745784613a81565b6000546001600160a01b03165b6008546001600160a01b03166130f6565b6008546000906001600160a01b0390811690630621b4f690613ab5908816612461565b613abf5786613acc565b6000546001600160a01b03165b85613adf886001600160a01b0316612461565b613ae95787613af6565b6000546001600160a01b03165b604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015260248101939093529216604482015260016064820152905160848083019260209291908290030181600087803b158015613b5457600080fd5b505af1158015613b68573d6000803e3d6000fd5b505050506040513d6020811015613b7e57600080fd5b50519050613b946001600160a01b038516612461565b1561159257600054604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b158015613bec57600080fd5b505afa158015613c00573d6000803e3d6000fd5b505050506040513d6020811015613c1657600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015613c5657600080fd5b505af1158015613c6a573d6000803e3d6000fd5b5050505090509392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613cc9908490613cce565b505050565b613ce0826001600160a01b0316613ed4565b613d31576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613d6f5780518252601f199092019160209182019101613d50565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613dd1576040519150601f19603f3d011682016040523d82523d6000602084013e613dd6565b606091505b509150915081613e2d576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156127eb57808060200190516020811015613e4957600080fd5b50516127eb5760405162461bcd60e51b815260040180806020018281038252602a81526020018061410c602a913960400191505060405180910390fd5b6001600160a01b03831615801590613eb557506001600160a01b0383166000805160206140ec83398151915214155b15613cc957613cc96001600160a01b038416838363ffffffff613f0b16565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906115925750141592915050565b801580613f91575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613f6357600080fd5b505afa158015613f77573d6000803e3d6000fd5b505050506040513d6020811015613f8d57600080fd5b5051155b613fcc5760405162461bcd60e51b81526004018080602001828103825260368152602001806141366036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052613cc9908490613cce565b60405180608001604052806004905b61406481526020019060019003908161402d5790505090565b60405180608001604052806004906020820280388339509192915050565bfefe4f6e6553706c69743a2061637475616c2072657475726e20616d6f756e74206973206c657373207468616e206d696e52657475726e4f6e6553706c69743a20646973747269627574696f6e2073686f756c6420636f6e7461696e206e6f6e2d7a65726f73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582095a939ead5d2c358b8fc2de33c4c7a6efb984e6b726dacfae8ac46abf112dba464736f6c634300050d0032
Deployed Bytecode Sourcemap
26222:23751:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27902:10;27916:9;27902:23;;27894:32;;;;;;26222:23751;28533:4597;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28533:4597:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;28533:4597:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;28533:4597:0;;;;;;;;;;;;;;;;;;27494:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27494:123:0;;;:::i;:::-;;;;-1:-1:-1;;;;;27494:123:0;;;;;;;;;;;;;;27750:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27750:96:0;;;:::i;26762:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26762:43:0;;;:::i;:::-;;;;;;;;;;;;;;;;48765:1205;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48765:1205:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48765:1205:0;-1:-1:-1;;;;;48765:1205:0;;:::i;40344:946::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40344:946:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;40344:946:0;;;;;;;;;;;;;;;;;:::i;26711:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26711:44:0;;;:::i;38761:1575::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38761:1575:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;38761:1575:0;;;;;;;;;;;;;;;;;:::i;38160:570::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;38160:570:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43212:888::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43212:888:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;43212:888:0;;;;;;;;;;;;;;;;;:::i;44108:607::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44108:607:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;44108:607:0;;;;;;;;;;;;;;;;;:::i;27388:99::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27388:99:0;;;:::i;26663:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26663:41:0;;;:::i;41298:1906::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41298:1906:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;41298:1906:0;;;;;;;;;;;;;;;;;;;;;;:::i;27177:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27177:87:0;;;:::i;26812:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26812:87:0;;;:::i;26566:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26566:41:0;;;:::i;27273:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27273:108:0;;;:::i;33138:773::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;33138:773:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;33138:773:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;33138:773:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33138:773:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33138:773:0;;-1:-1:-1;;33138:773:0;;;-1:-1:-1;33138:773:0;;-1:-1:-1;;33138:773:0:i;26516:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26516:43:0;;;:::i;27994:531::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27994:531:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;27994:531:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27994:531:0;;;;;;;;;;;;;;;;;26614:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26614:42:0;;;:::i;27089:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27089:81:0;;;:::i;27942:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27942:44:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27942:44:0;;:::i;28533:4597::-;28980:16;;;28994:1;28980:16;;;;;;;;;28838:20;;28873:29;;28980:16;;;;17:15:-1;;105:10;28980:16:0;88:34:-1;136:17;;-1:-1;28980:16:0;28965:31;;29026:7;-1:-1:-1;;;;;29013:20:0;:9;-1:-1:-1;;;;;29013:20:0;;29009:124;;;29065:6;;-1:-1:-1;29086:35:0;;29009:124;29149:35;:12;26751:4;29149:35;:20;:35;:::i;:::-;:66;;;;;29188:27;29205:9;29188:16;:27::i;:::-;29145:466;;;29232:17;29252:35;29277:9;29252:24;:35::i;:::-;29232:55;;29302:20;29348:9;-1:-1:-1;;;;;29325:53:0;;:55;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29325:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29325:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29325:55:0;;-1:-1:-1;29404:195:0;29440:10;29469:7;29495:34;29524:4;29495:24;:6;29325:55;29495:24;:10;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;29548:5;29572:12;29404:17;:195::i;:::-;29397:202;;;;;;;;29145:466;29627:35;:12;26751:4;29627:35;:20;:35;:::i;:::-;:64;;;;;29666:25;29683:7;29666:16;:25::i;:::-;29623:580;;;29708:17;29728:33;29753:7;29728:24;:33::i;:::-;29708:53;;29776:20;29822:7;-1:-1:-1;;;;;29799:51:0;;:53;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29799:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29799:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29799:53:0;;-1:-1:-1;29900:169:0;29936:9;29964:10;29993:6;30018:5;30042:12;29900:17;:169::i;:::-;29869:200;;-1:-1:-1;29869:200:0;-1:-1:-1;30101:40:0;30128:12;30101:22;29869:200;30118:4;30101:22;:16;:22;:::i;:40::-;30086:55;-1:-1:-1;30156:35:0;;-1:-1:-1;;30156:35:0;29623:580;30219:34;:12;26801:4;30219:34;:20;:34;:::i;:::-;30215:506;;;30270:17;30290:26;30306:9;30290:15;:26::i;:::-;30270:46;-1:-1:-1;;;;;;30335:24:0;;;;30331:379;;30380:19;30424:9;-1:-1:-1;;;;;30402:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;30331:379:0;30215:506;;30737:34;:12;26801:4;30737:34;:20;:34;:::i;:::-;30733:630;;;30788:17;30808:24;30824:7;30808:15;:24::i;:::-;30788:44;-1:-1:-1;;;;;;30851:24:0;;;;30847:505;;30896:19;30940:7;-1:-1:-1;;;;;30918:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;30847:505:0;30733:630;;31375:72;;:::i;:::-;:465;;;;;;;;;;31465:35;:12;26555:4;31465:35;:21;:35;:::i;:::-;:81;;31524:22;31465:81;;;31503:18;31465:81;31375:465;;;;;;31561:33;:12;26603:4;31561:33;:21;:33;:::i;:::-;:79;;31620:20;31561:79;;;31599:18;31561:79;31375:465;;;;;;31655:34;:12;26652:4;31655:34;:21;:34;:::i;:::-;:80;;31714:21;31655:80;;;31693:18;31655:80;31375:465;;;;;;31750:33;:12;26700:4;31750:33;:21;:33;:::i;:::-;:79;;31809:20;31750:79;;;31788:18;31750:79;31375:465;;;;;-1:-1:-1;31853:23:0;;:::i;:::-;31887:27;;:::i;:::-;31930:6;31925:199;31946:12;31942:1;:16;31925:199;;;31991:50;32003:9;32014:7;32023:17;:6;32034:5;32023:17;:10;:17;:::i;:::-;31991:8;32000:1;31991:11;;;;;;;;;;;:50;;:::i;:::-;31980:5;31986:1;31980:8;;;;;;;;;;:61;32056:4;:8;32065:5;32071:1;32065:8;;;;;;;;;;;32056:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32056:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32056:18:0;;;;32104:5;32110:1;32104:8;;;;;;;;;;;32089:9;32099:1;32089:12;;;;;;;;;;:23;31960:3;;31925:199;;;-1:-1:-1;32141:6:0;32136:987;32157:5;32153:1;:9;32136:987;;;32215:17;32265:1;32251:163;32272:12;32268:1;:16;32251:163;;;32325:5;32331:9;32325:16;;;;;;;;;;;32314:5;32320:1;32314:8;;;;;;;;;;;:27;32310:89;;;32378:1;32366:13;;32310:89;32286:3;;32251:163;;;;32475:34;32492:5;32498:9;32492:16;;;;;;;;;;;32475:12;;:34;:16;:34;:::i;:::-;32460:49;;32524:12;32537:9;32524:23;;;;;;;;;;;;;:25;;;;;;;;;;;32618:17;32638:6;32618:26;;32711:5;32703:1;32707;32703:5;:13;32699:413;;;32737:15;32755:176;32797:9;32829:7;32859:53;32906:5;32859:42;32873:12;32886:9;32873:23;;;;;;;;;;;;;;32899:1;32873:27;32859:9;:13;;:42;;;;:::i;:53::-;32755:8;32764:9;32755:19;;;;;;:176;32737:194;;32969:33;32981:9;32991;32981:20;;;;;;;;;;;32969:7;;:33;:11;:33;:::i;:::-;32950:5;32956:9;32950:16;;;;;;;;;;:52;33021:4;:8;33030:5;33036:9;33030:16;;;;;;;;;;;33021:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33021:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33021:26:0;;;;33089:7;33066:9;33076;33066:20;;;;;;;;;;:30;-1:-1:-1;32699:413:0;-1:-1:-1;;32164:3:0;;32136:987;;;;28533:4597;;;;;;;;;;;;:::o;27494:123::-;;;-1:-1:-1;;;;;27494:123:0;;:::o;27750:96::-;;;-1:-1:-1;;;;;27750:96:0;;:::o;26762:43::-;26801:4;26762:43;:::o;48765:1205::-;48824:6;48847:13;:5;-1:-1:-1;;;;;48847:11:0;;:13::i;:::-;48843:63;;;-1:-1:-1;;;48877:17:0;;48843:63;48990:91;;;22:32:-1;6:49;;48990:91:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;48954:128:0;;;;48919:12;;48933:17;;-1:-1:-1;;;;;48954:25:0;;;48984:4;;48990:91;;48954:128;;;;25:18:-1;48954:128:0;;25:18:-1;36:153;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;;;48954:128: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;;48918:164:0;;;;49098:7;49093:58;;-1:-1:-1;;49122:17:0;;;;;;49093:58;49163:13;;49195:414;49230:1;49216:4;:11;:15;49212:1;:19;49195:414;;;49257:4;49262:1;49266;49262:5;49257:11;;;;;;;;;;;;;-1:-1:-1;;;;;;49257:11:0;-1:-1:-1;;;49257:18:0;:57;;;;;49296:4;49301:1;49305;49301:5;49296:11;;;;;;;;;;;;;-1:-1:-1;;;;;;49296:11:0;-1:-1:-1;;;49296:18:0;49257:57;:96;;;;;49335:4;49340:1;49344;49340:5;49335:11;;;;;;;;;;;;;-1:-1:-1;;;;;;49335:11:0;-1:-1:-1;;;49335:18:0;49257:96;:135;;;;;49374:4;49379:1;49383;49379:5;49374:11;;;;;;;;;;;;;-1:-1:-1;;;;;;49374:11:0;-1:-1:-1;;;49374:18:0;49257:135;:174;;;;;49413:4;49418:1;49422;49418:5;49413:11;;;;;;;;;;;;;-1:-1:-1;;;;;;49413:11:0;-1:-1:-1;;;49413:18:0;49257:174;:213;;;;;49452:4;49457:1;49461;49457:5;49452:11;;;;;;;;;;;;;-1:-1:-1;;;;;;49452:11:0;-1:-1:-1;;;49452:18:0;49257:213;:252;;;;;49491:4;49496:1;49500;49496:5;49491:11;;;;;;;;;;;;;-1:-1:-1;;;;;;49491:11:0;-1:-1:-1;;;49491:18:0;49257:252;49253:345;;;49554:4;49543:15;;49577:5;;49253:345;49233:3;;49195:414;;;;49624:8;49619:59;;-1:-1:-1;;49649:17:0;;;;;;;49619:59;49744:103;;;22:32:-1;6:49;;49744:103:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;49708:140:0;;;;-1:-1:-1;;;;;49708:25:0;;;49738:4;;49744:103;49708:140;;;25:18:-1;49708:140:0;;25:18:-1;36:153;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;;;49708:140: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;-1:-1;49690:158:0;;-1:-1:-1;49690:158:0;-1:-1:-1;49690:158:0;49859:58;;-1:-1:-1;;49888:17:0;;;;;;;49859:58;49947:4;49936:26;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49936:26:0;;-1:-1:-1;;;;48765:1205:0;;;;:::o;40344:946::-;40542:17;;;40582:95;;;6:49:-1;;;40582:95:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;40534:144:0;;;;40478:7;;;;40513:17;;-1:-1:-1;;;;;40542:17:0;;;;40576:4;;40534:144;;;;;;25:18:-1;36:153;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;;;40534:144: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;;40498:180:0;;;;40694:7;40689:49;;40725:1;40718:8;;;;;;40689:49;40750:42;40828:4;40817:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40817:27:0;;-1:-1:-1;40862:17:0;-1:-1:-1;;;;;40862:15:0;;;:17::i;:::-;:36;;;;40883:15;:7;-1:-1:-1;;;;;40883:13:0;;:15::i;:::-;40858:154;;;40922:78;40951:20;40973:9;40984:7;40993:6;40922:28;:78::i;:::-;40915:85;;;;;;;40858:154;41024:13;41040:82;41069:20;41091:9;-1:-1:-1;;;;;;;;;;;41115:6:0;41040:28;:82::i;:::-;41024:98;-1:-1:-1;41137:10:0;41133:51;;41171:1;41164:8;;;;;;;;41133:51;41203:79;41232:20;-1:-1:-1;;;;;;;;;;;41267:7:0;41276:5;41203:28;:79::i;:::-;41196:86;;;;;;40344:946;;;;;;:::o;26711:44::-;26751:4;26711:44;:::o;38761:1575::-;38897:7;38940:6;38964:17;-1:-1:-1;;;;;38964:15:0;;;:17::i;:::-;38959:669;;39030:14;;:37;;;-1:-1:-1;;;39030:37:0;;-1:-1:-1;;;;;39030:37:0;;;;;;;;;38998:29;;39030:14;;;;;:26;;:37;;;;;;;;;;;;;;;:14;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;39030:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39030:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39030:37:0;;-1:-1:-1;;;;;;39086:35:0;;;39082:535;;39245:156;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;39245:156:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;39178:242:0;;;;39143:12;;39157:17;;-1:-1:-1;;;;;39178:32:0;;;39215:6;;39245:156;;39178:242;;;;25:18:-1;39178:242:0;;25:18:-1;36:153;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;;;39178:242: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;;39142:278:0;;;;39443:7;39439:163;;;39501:4;39490:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39490:27:0;;-1:-1:-1;39439:163:0;;;39581:1;39566:16;;39439:163;39082:535;;;38959:669;;39645:15;:7;-1:-1:-1;;;;;39645:13:0;;:15::i;:::-;39640:657;;39707:14;;:35;;;-1:-1:-1;;;39707:35:0;;-1:-1:-1;;;;;39707:35:0;;;;;;;;;39677:27;;39707:14;;;;;:26;;:35;;;;;;;;;;;;;;;:14;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;39707:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39707:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39707:35:0;;-1:-1:-1;;;;;;39761:33:0;;;39757:529;;39916:154;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;39916:154:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;39851:238:0;;;;39816:12;;39830:17;;-1:-1:-1;;;;;39851:30:0;;;39886:6;;39916:154;;39851:238;;;;25:18:-1;39851:238:0;;25:18:-1;36:153;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;;;39851:238: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;;39815:274:0;;;;40112:7;40108:163;;;40170:4;40159:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40159:27:0;;-1:-1:-1;40108:163:0;;;40250:1;40235:16;;40108:163;39757:529;;;39640:657;;40316:12;38761:1575;-1:-1:-1;;;;38761:1575:0:o;38160:570::-;38452:29;38485:66;38503:9;38514:7;38523:6;38531:5;38538:12;38485:17;:66::i;:::-;38449:102;;;38562:160;38581:9;38605:7;38627:6;38648:9;38672:12;38699;38562:4;:160::i;:::-;38160:570;;;;;;;:::o;43212:888::-;43413:22;;:49;;;-1:-1:-1;;;43413:49:0;;-1:-1:-1;;;43413:49:0;;;;;;43347:7;;;;-1:-1:-1;;;;;43413:22:0;;;;:32;;:49;;;;;;;;;;;;;;;:22;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;43413:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43413:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43413:49:0;43498:23;;43413:49;;-1:-1:-1;43474:21:0;;-1:-1:-1;;;;;43498:23:0;;;;:36;;43549:17;;:15;;;:17::i;:::-;:48;;43588:9;43549:48;;;43569:16;;-1:-1:-1;;;;;43569:16:0;43549:48;43612:15;:7;-1:-1:-1;;;;;43612:13:0;;:15::i;:::-;:44;;43649:7;43612:44;;;43630:16;;-1:-1:-1;;;;;43630:16:0;43612:44;43498:169;;;;;;;;;;;;;-1:-1:-1;;;;;43498:169:0;-1:-1:-1;;;;;43498:169:0;;;;;;-1:-1:-1;;;;;43498:169:0;-1:-1:-1;;;;;43498:169:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43498:169:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43498:169:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;43498:169: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;43498:169:0;;;;;;;;;;;;;19:11:-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;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;43498:169:0;;421:4:-1;412:14;;;;43498:169:0;;;;;412:14:-1;43498:169: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;43498:169:0;;;;;;;;;;;43474:193;;43681:12;43695:17;43724:13;-1:-1:-1;;;;;43716:33:0;43754:6;43817:13;-1:-1:-1;;;;;43817:29:0;;:38;;;;43874:4;43897:6;43776:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;43776:142:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;43776:142:0;;;;-1:-1:-1;;;;;43776:142:0;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;43776:142:0;43716:213;;;;;;;;;;;;;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;;;43716:213: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;;43680:249:0;;;;43945:7;43940:49;;43976:1;43969:8;;;;;;;;43940:49;44002:20;44038:4;44027:35;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44027:35:0;;43212:888;-1:-1:-1;;;;;;;;;43212:888:0:o;44108:607::-;44306:13;;44242:7;;;;44277:17;;-1:-1:-1;;;;;44306:13:0;;;;44336:6;;-1:-1:-1;;;44399:35:0;44453:15;;:13;;;:15::i;:::-;:37;;44483:7;44453:37;;;44471:9;;-1:-1:-1;;;;;44471:9:0;44453:37;44509:17;:9;-1:-1:-1;;;;;44509:15:0;;:17::i;:::-;:41;;44541:9;44509:41;;;44529:9;;-1:-1:-1;;;;;44529:9:0;44509:41;44358:232;;;-1:-1:-1;;;;;44358:232:0;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;44358:232:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;44358:232:0;;;179:29:-1;;;;160:49;;44298:303:0;;;;44358:232;;44298:303;;;;25:18:-1;44298:303:0;;25:18:-1;36:153;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;;;44298:303: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;;44262:339:0;;;;44617:7;44612:49;;44648:1;44641:8;;;;;;44612:49;44691:4;44680:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44680:27:0;;44108:607;-1:-1:-1;;;;;;44108:607:0:o;27388:99::-;;;-1:-1:-1;;;;;27388:99:0;;:::o;26663:41::-;26700:4;26663:41;:::o;41298:1906::-;41493:7;;41528:17;-1:-1:-1;;;;;41549:40:0;;;;41594:6;;-1:-1:-1;;;41639:44:0;41698:17;;:15;;;:17::i;:::-;:43;;41732:9;41698:43;;;-1:-1:-1;;;;;;;;;;;41698:43:0;41756:15;:7;-1:-1:-1;;;;;41756:13:0;;:15::i;:::-;:39;;41788:7;41756:39;;;-1:-1:-1;;;;;;;;;;;41756:39:0;41602:244;;;-1:-1:-1;;;;;41602:244:0;;;;;;;;;;;;;;;;;;;;;41831:4;41602:244;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;41602:244:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;41602:244:0;;;179:29:-1;;;;160:49;;41549:298:0;;;;41602:244;;41549:298;;;;25:18:-1;41549:298:0;;25:18:-1;36:153;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;;;41549:298: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;;41513:334:0;;;;41863:7;41858:49;;41894:1;41887:8;;;;;;41858:49;41920:15;41937:12;41964:4;41953:35;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41953:35:0;;;;;;;;;-1:-1:-1;41953:35:0;-1:-1:-1;42016:42:0;-1:-1:-1;;;;;42005:53:0;;;;:134;;-1:-1:-1;42097:42:0;-1:-1:-1;;;;;42086:53:0;;;42005:134;:213;;;-1:-1:-1;42176:42:0;-1:-1:-1;;;;;42165:53:0;;;42005:213;42001:275;;;42263:1;42256:8;;;;;;;;42001:275;42368:101;;;22:32:-1;6:49;;42368:101:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;42339:131:0;;;;-1:-1:-1;;;;;42339:18:0;;;42362:4;;42368:101;42339:131;;;25:18:-1;42339:131:0;;25:18:-1;36:153;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;;;42339:131: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;-1:-1;42326:144:0;;-1:-1:-1;;42481:48:0;;;;42516:1;42509:8;;;;;;;;42481:48;42619:88;;;22:32:-1;6:49;;42619:88:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;42590:118:0;;;;-1:-1:-1;;;;;42590:18:0;;;42613:4;;42619:88;42590:118;;;25:18:-1;42590:118:0;;25:18:-1;36:153;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;;;42590:118: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;-1:-1;42577:131:0;;-1:-1:-1;;42719:48:0;;;;42754:1;42747:8;;;;;;;;42719:48;42858:95;;;22:32:-1;6:49;;42858:95:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;42829:125:0;;;;-1:-1:-1;;;;;42829:18:0;;;42852:4;;42858:95;42829:125;;;25:18:-1;42829:125:0;;25:18:-1;36:153;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;;;42829:125: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;-1:-1;42816:138:0;;-1:-1:-1;;42965:48:0;;;;43000:1;42993:8;;;;;;;;42965:48;43032:164;43191:4;43032:140;43134:37;43141:9;-1:-1:-1;;;;;43134:35:0;;:37::i;:::-;43128:2;:43;43032:77;43073:35;43080:7;-1:-1:-1;;;;;43073:33:0;;:35::i;:::-;43067:2;:41;43032:16;:4;43041:6;43032:16;:8;:16;:::i;:::-;:34;:77;:34;:77;:::i;:164::-;43025:171;41298:1906;-1:-1:-1;;;;;;;;;41298:1906:0:o;27177:87::-;;;-1:-1:-1;;;;;27177:87:0;;:::o;26812:::-;-1:-1:-1;;;;;;;;;;;26812:87:0;:::o;26566:41::-;26603:4;26566:41;:::o;27273:108::-;;;-1:-1:-1;;;;;27273:108:0;;:::o;33138:773::-;33427:66;-1:-1:-1;;;;;33427:31:0;;33459:10;33479:4;33486:6;33427:66;:31;:66;:::i;:::-;33506:61;33512:9;33523:7;33532:6;33540:12;33554;33506:5;:61::i;:::-;33580:20;33603:41;-1:-1:-1;;;;;33603:26:0;;33638:4;33603:41;:26;:41;:::i;:::-;33580:64;;33679:9;33663:12;:25;;33655:91;;;;-1:-1:-1;;;33655:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33757:51;-1:-1:-1;;;;;33757:25:0;;33783:10;33795:12;33757:51;:25;:51;:::i;:::-;-1:-1:-1;33819:84:0;33847:10;33859:43;-1:-1:-1;;;;;33859:28:0;;33896:4;33859:43;:28;:43;:::i;:::-;-1:-1:-1;;;;;33819:27:0;;;:84;;:27;:84;:::i;:::-;;33138:773;;;;;;;:::o;26516:43::-;26555:4;26516:43;:::o;27994:531::-;28180:24;28241:5;28227:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;28227:20:0;-1:-1:-1;28217:30:0;-1:-1:-1;28263:6:0;28258:260;28279:5;28275:1;:9;28258:260;;;28322:184;28358:9;28386:7;28412:28;28434:5;28412:17;:6;28427:1;28423:5;;28412:17;:10;:17;:::i;:28::-;28459:1;28479:12;28322:17;:184::i;:::-;28306:200;28307:7;28315:1;28307:10;;;;;;;;;;;;;;;;;28306:200;28286:3;;28258:260;;;;27994:531;;;;;;;:::o;26614:42::-;26652:4;26614:42;:::o;27089:81::-;;;-1:-1:-1;;;;;27089:81:0;;:::o;27942:44::-;;:::o;25938:133::-;26038:19;;;26037:26;25938:133;;;;;:::o;48282:231::-;48374:4;;48344;;-1:-1:-1;;;;;48365:13:0;;;48374:4;;48365:13;48361:57;;;-1:-1:-1;48402:4:0;48395:11;;48361:57;48447:8;;:32;;;-1:-1:-1;;;48447:32:0;;-1:-1:-1;;;;;48447:32:0;;;;;;;;;48429:13;;48447:8;;;;;:16;;:32;;;;;;;;;;;:8;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;48447:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48447:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48447:32:0;;48282:231;-1:-1:-1;;;48282:231:0:o;48521:236::-;48623:4;;48591:6;;-1:-1:-1;;;;;48614:13:0;;;48623:4;;48614:13;48610:71;;;-1:-1:-1;48666:1:0;48644:25;;48610:71;48728:5;-1:-1:-1;;;;;48705:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48705:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48705:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48705:43:0;;48521:236;-1:-1:-1;;48521:236:0:o;2285:471::-;2343:7;2588:6;2584:47;;-1:-1:-1;2618:1:0;2611:8;;2584:47;2655:5;;;2659:1;2655;:5;:1;2679:5;;;;;:10;2671:56;;;;-1:-1:-1;;;2671:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3224:132;3282:7;3309:39;3313:1;3316;3309:39;;;;;;;;;;;;;;;;;:3;:39::i;26079:134::-;26180:19;26179:26;;;26079:134::o;44723:178::-;44869:7;44723:178;;;;;:::o;913:181::-;971:7;1003:5;;;1027:6;;;;1019:46;;;;;-1:-1:-1;;;1019:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1369:136;1427:7;1454:43;1458:1;1461;1454:43;;;;;;;;;;;;;;;;;:3;:43::i;25641:166::-;25692:4;-1:-1:-1;;;;;25717:39:0;;;;:81;;-1:-1:-1;;;;;;25760:38:0;;-1:-1:-1;;;;;;;;;;;25760:38:0;25709:90;25641:166;-1:-1:-1;;25641:166:0:o;25069:564::-;25133:7;-1:-1:-1;;;;;25159:21:0;;;;:45;;-1:-1:-1;;;;;;25184:20:0;;-1:-1:-1;;;;;;;;;;;25184:20:0;25159:45;25155:87;;;-1:-1:-1;25228:2:0;25221:9;;25155:87;25340:37;;;22:32:-1;6:49;;25340:37:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;25290:98:0;;;;25255:12;;25269:17;;-1:-1:-1;;;;;25290:25:0;;;25320:4;;25340:37;;25290:98;;;;25:18:-1;25290:98:0;;25:18:-1;36:153;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;;;25290:98: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;;25254:134:0;;;;25404:7;25399:165;;25500:37;;;22:32:-1;6:49;;25500:37:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;25446:106:0;;;;-1:-1:-1;;;;;25446:25:0;;;25476:4;;25500:37;25446:106;;;25:18:-1;25446:106:0;;25:18:-1;36:153;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;;;25446:106: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;-1:-1;25428:124:0;;-1:-1:-1;25428:124:0;-1:-1:-1;25399:165:0;25583:7;:42;;25623:2;25583:42;;;25604:4;25593:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25593:27:0;25576:49;25069:564;-1:-1:-1;;;;25069:564:0:o;23958:624::-;24069:11;24065:50;;24097:7;;24065:50;-1:-1:-1;;;;;24131:21:0;;;;:45;;-1:-1:-1;;;;;;24156:20:0;;-1:-1:-1;;;;;;;;;;;24156:20:0;24131:45;24127:448;;;-1:-1:-1;;;;;24201:18:0;;24209:10;24201:18;:41;;;;;24236:6;24223:9;:19;;24201:41;24193:71;;;;;-1:-1:-1;;;24193:71:0;;;;;;;;;;;;-1:-1:-1;;;24193:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24283:19:0;;24297:4;24283:19;24279:97;;24323:37;;-1:-1:-1;;;;;24323:29:0;;;:37;;;;;24353:6;;24323:37;;;;24353:6;24323:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24323:37:0;24279:97;24406:6;24394:9;:18;24390:101;;;24433:10;:42;24453:21;:9;24467:6;24453:21;:13;:21;:::i;:::-;24433:42;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24433:42:0;24390:101;24127:448;;;24523:40;-1:-1:-1;;;;;24523:22:0;;24546:4;24552:2;24556:6;24523:40;:22;:40;:::i;:::-;23958:624;;;;:::o;33919:4233::-;34178:7;-1:-1:-1;;;;;34165:20:0;:9;-1:-1:-1;;;;;34165:20:0;;34161:59;;;34202:7;;34161:59;34236:35;:12;26751:4;34236:35;:20;:35;:::i;:::-;:66;;;;;34275:27;34292:9;34275:16;:27::i;:::-;34232:502;;;34319:17;34339:35;34364:9;34339:24;:35::i;:::-;34319:55;;34414:9;-1:-1:-1;;;;;34391:41:0;;34433:6;34391:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34391:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34391:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34455:24:0;;-1:-1:-1;34482:44:0;-1:-1:-1;;;;;34482:29:0;;34520:4;34482:44;:29;:44;:::i;:::-;34455:71;;34550:172;34574:10;34603:7;34629:16;34664:12;34695;34550:5;:172::i;:::-;34543:179;;;;34232:502;34750:35;:12;26751:4;34750:35;:20;:35;:::i;:::-;:64;;;;;34789:25;34806:7;34789:16;:25::i;:::-;34746:719;;;34831:17;34851:33;34876:7;34851:24;:33::i;:::-;34831:53;;34901:164;34925:9;34953:10;34982:6;35007:12;35038;34901:5;:164::i;:::-;35082:24;35109:44;-1:-1:-1;;;;;35109:29:0;;35147:4;35109:44;:29;:44;:::i;:::-;35082:71;;35174:18;:10;-1:-1:-1;;;;;35174:16:0;;:18::i;:::-;35170:263;;;35213:4;;;;;;;;;-1:-1:-1;;;;;35213:4:0;-1:-1:-1;;;;;35213:9:0;;35229:16;35213:35;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35213:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35213:35:0;;;;;35170:263;;;35289:54;35314:10;35334:7;35289:24;:54::i;:::-;35385:7;-1:-1:-1;;;;;35362:37:0;;35400:16;35362:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35362:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35362:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;35447:7:0;;;;34746:719;35481:34;:12;26801:4;35481:34;:20;:34;:::i;:::-;35477:752;;;35532:17;35552:26;35568:9;35552:15;:26::i;:::-;35532:46;-1:-1:-1;;;;;;35597:24:0;;;;35593:625;;35646:18;:10;-1:-1:-1;;;;;35646:16:0;;:18::i;:::-;35642:245;;;35689:68;;;-1:-1:-1;;;35689:68:0;;35743:4;35689:68;;;;;;;;;;;;-1:-1:-1;;;;;35689:45:0;;;;;:68;;;;;;;;;;;;;;-1:-1:-1;35689:45:0;:68;;;5:2:-1;;;;30:1;27;20:12;5:2;35689:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35689:68:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35642:245:0;;-1:-1:-1;35642:245:0;;35806:61;;;-1:-1:-1;;;35806:61:0;;35853:4;35806:61;;;;;;;;;;;;-1:-1:-1;;;;;35806:38:0;;;;;:61;;;;;;;;;;;;;;-1:-1:-1;35806:38:0;:61;;;5:2:-1;;;;30:1;27;20:12;35642:245:0;35907:24;35934:44;-1:-1:-1;;;;;35934:29:0;;35972:4;35934:44;:29;:44;:::i;35593:625::-;35477:752;;36245:34;:12;26801:4;36245:34;:20;:34;:::i;:::-;36241:861;;;36296:17;36316:24;36332:7;36316:15;:24::i;:::-;36296:44;-1:-1:-1;;;;;;36359:24:0;;;;36355:736;;36404:188;36432:9;36464:10;36497:6;36526:12;36561;36404:5;:188::i;:::-;36613:24;36640:44;-1:-1:-1;;;;;36640:29:0;;36678:4;36640:44;:29;:44;:::i;:::-;36613:71;;36709:18;:10;-1:-1:-1;;;;;36709:16:0;;:18::i;:::-;36705:346;;;36752:84;;;-1:-1:-1;;;36752:84:0;;36830:4;36752:84;;;;;;-1:-1:-1;;;;;36752:45:0;;;;;36804:16;;36752:84;;;;;;;;;;;;;;;36804:16;36752:45;:84;;;5:2:-1;;;;30:1;27;20:12;5:2;36752:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36752:84:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36705:346:0;;-1:-1:-1;36705:346:0;;36885:54;36910:10;36930:7;36885:24;:54::i;:::-;36962:69;;;-1:-1:-1;;;36962:69:0;;37007:4;36962:69;;;;;;;;;;;;-1:-1:-1;;;;;36962:36:0;;;;;:69;;;;;;;;;;;;;;-1:-1:-1;36962:36:0;:69;;;5:2:-1;;;;30:1;27;20:12;36355:736:0;36241:861;;37114:67;;:::i;:::-;-1:-1:-1;37114:192:0;;;;;;;;37199:14;37114:192;;37228:12;37114:192;;;;37255:13;37114:192;;;;;;;37283:12;37114:192;;;;-1:-1:-1;;;37386:202:0;37407:15;37403:1;:19;37386:202;;;37466:1;37448:12;37461:1;37448:15;;;;;;;;;;;;;;:19;37444:133;;;37496:26;37506:12;37519:1;37506:15;;;;;;;;;;;;;;37496:5;:9;;:26;;;;:::i;:::-;37488:34;;37560:1;37541:20;;37444:133;37424:3;;37386:202;;;;37616:1;37608:5;:9;37600:69;;;;-1:-1:-1;;;37600:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37708:6;37682:23;37725:420;37746:15;37742:1;:19;37725:420;;;37787:12;37800:1;37787:15;;;;;;;;;;;;;;37806:1;37787:20;37783:69;;;37828:8;;37783:69;37868:18;37889:38;37921:5;37889:27;37900:12;37913:1;37900:15;;;;;;;;;;;;;;37889:6;:10;;:27;;;;:::i;:38::-;37868:59;;37951:16;37946:1;:21;37942:90;;;-1:-1:-1;38001:15:0;37942:90;38065:10;38046:29;;;;38090:43;38102:9;38113:7;38122:10;38090:8;38099:1;38090:11;;;;;;:43;;37725:420;;37763:3;;37725:420;;;;33919:4233;;;;;;;;;;:::o;24800:261::-;24878:7;-1:-1:-1;;;;;24902:21:0;;;;:45;;-1:-1:-1;;;;;;24927:20:0;;-1:-1:-1;;;;;;;;;;;24927:20:0;24902:45;24898:156;;;-1:-1:-1;;;;;;24971:11:0;;;24964:18;;24898:156;25022:5;-1:-1:-1;;;;;25022:15:0;;25038:3;25022:20;;;;;;;;;;;;;-1:-1:-1;;;;;25022:20:0;-1:-1:-1;;;;;25022:20:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25022:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25022:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25022:20:0;;-1:-1:-1;25015:27:0;;23569:381;23655:4;23676:11;23672:55;;-1:-1:-1;23711:4:0;23704:11;;23672:55;-1:-1:-1;;;;;23743:21:0;;;;:45;;-1:-1:-1;;;;;;23768:20:0;;-1:-1:-1;;;;;;;;;;;23768:20:0;23743:45;23739:204;;;23805:37;;-1:-1:-1;;;;;23805:29:0;;;:37;;;;;23835:6;;23805:37;;;;23835:6;23805:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23805:37:0;23739:204;;;23875:30;-1:-1:-1;;;;;23875:18:0;;23894:2;23898:6;23875:30;:18;:30;:::i;:::-;-1:-1:-1;23927:4:0;23920:11;;3886:345;3972:7;4074:12;4067:5;4059:28;;;;-1:-1:-1;;;4059:28: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;4059:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4098:9;4114:1;4110;:5;;;;;;;3886:345;-1:-1:-1;;;;;3886:345:0:o;1842:192::-;1928:7;1964:12;1956:6;;;;1948:29;;;;-1:-1:-1;;;1948:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1948:29:0;-1:-1:-1;;;2000:5:0;;;1842:192::o;20224:204::-;20351:68;;;-1:-1:-1;;;;;20351:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20351:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20325:95:0;;20344:5;;20325:18;:95::i;48012:262::-;48097:13;:5;-1:-1:-1;;;;;48097:11:0;;:13::i;:::-;48092:175;;48132:34;;;-1:-1:-1;;;48132:34:0;;48156:4;48132:34;;;;-1:-1:-1;;;;;48132:34:0;;;;;;;;;48170:3;;48132:15;;;;;:34;;;;;;;;;;;;;;:15;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;48132:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48132:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48132:34:0;:41;;48127:129;;48200:40;-1:-1:-1;;;;;48200:22:0;;48223:2;-1:-1:-1;;48200:40:0;:22;:40;:::i;:::-;48012:262;;:::o;44932:871::-;45057:7;45102:6;45126:17;-1:-1:-1;;;;;45126:15:0;;;:17::i;:::-;45121:356;;45192:14;;:37;;;-1:-1:-1;;;45192:37:0;;-1:-1:-1;;;;;45192:37:0;;;;;;;;;45160:29;;45192:14;;;;;:26;;:37;;;;;;;;;;;;;;;:14;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;45192:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45192:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45192:37:0;;-1:-1:-1;;;;;;45248:35:0;;;45244:222;;45304:58;45329:9;45348:12;45304:24;:58::i;:::-;45396:54;;;-1:-1:-1;;;45396:54:0;;;;;;;;45443:1;45396:54;;;;45446:3;45396:54;;;;;;-1:-1:-1;;;;;45396:32:0;;;;;:54;;;;;;;;;;;;;;-1:-1:-1;45396:32:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;45396:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45396:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45396:54:0;;-1:-1:-1;45244:222:0;45121:356;;45494:15;:7;-1:-1:-1;;;;;45494:13:0;;:15::i;:::-;45489:275;;45556:14;;:35;;;-1:-1:-1;;;45556:35:0;;-1:-1:-1;;;;;45556:35:0;;;;;;;;;45526:27;;45556:14;;;;;:26;;:35;;;;;;;;;;;;;;;:14;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;45556:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45556:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45556:35:0;;-1:-1:-1;;;;;;45610:33:0;;;45606:147;;45679:10;-1:-1:-1;;;;;45679:30:0;;45716:12;45730:1;45733:3;45679:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45679:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45679:58:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;45811:554:0;45998:17;;45934:7;;45954:63;;45979:9;;-1:-1:-1;;;;;45998:17:0;45954:24;:63::i;:::-;46035:17;;-1:-1:-1;;;;;46035:17:0;;;;:31;;46073:17;;:15;;;:17::i;:::-;:30;;46102:1;46073:30;;;46093:6;46073:30;46119:17;:9;-1:-1:-1;;;;;46119:15:0;;:17::i;:::-;:43;;46153:9;46119:43;;;-1:-1:-1;;;;;;;;;;;46119:43:0;46177:6;46198:15;:7;-1:-1:-1;;;;;46198:13:0;;:15::i;:::-;:39;;46230:7;46198:39;;;-1:-1:-1;;;;;;;;;;;46198:39:0;46035:322;;;-1:-1:-1;;;;;;46035:322:0;;;;;;;-1:-1:-1;;;;;46035:322:0;;;;;;;;;;;;;;;;;;;;46260:4;46035:322;;;;-1:-1:-1;;;46035:322:0;;;;46303:1;46035:322;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;46035:322:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46035:322:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;46373:905:0;46497:7;46521:17;:9;-1:-1:-1;;;;;46521:15:0;;:17::i;:::-;46517:90;;;46555:16;;;;;;;;;-1:-1:-1;;;;;46555:16:0;-1:-1:-1;;;;;46555:24:0;;46586:6;46555:40;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46555:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46555:40:0;;;;;46517:90;46665:22;;:49;;;-1:-1:-1;;;46665:49:0;;-1:-1:-1;;;46665:49:0;;;;;;46619:28;;-1:-1:-1;;;;;46665:22:0;;:32;;:49;;;;;;;;;;;;;;:22;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;46665:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46665:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46665:49:0;46750:23;;46665:49;;-1:-1:-1;46726:21:0;;-1:-1:-1;;;;;46750:23:0;;;;:36;;46801:17;;:15;;;:17::i;:::-;:48;;46840:9;46801:48;;;46821:16;;-1:-1:-1;;;;;46821:16:0;46801:48;46864:15;:7;-1:-1:-1;;;;;46864:13:0;;:15::i;:::-;:44;;46901:7;46864:44;;;46882:16;;-1:-1:-1;;;;;46882:16:0;46864:44;46750:169;;;;;;;;;;;;;-1:-1:-1;;;;;46750:169:0;-1:-1:-1;;;;;46750:169:0;;;;;;-1:-1:-1;;;;;46750:169:0;-1:-1:-1;;;;;46750:169:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46750:169:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46750:169:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;46750:169: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;46750:169:0;;;;;;;;;;;;;19:11:-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;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;46750:169:0;;421:4:-1;412:14;;;;46750:169:0;;;;;412:14:-1;46750:169: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;46750:169:0;;;;;;;;;;;46726:193;;46932:98;46957:17;:9;-1:-1:-1;;;;;46957:15:0;;:17::i;:::-;:48;;46996:9;46957:48;;;46977:16;;-1:-1:-1;;;;;46977:16:0;46957:48;47015:13;46932:24;:98::i;:::-;47041:20;47064:13;-1:-1:-1;;;;;47064:29:0;;47094:4;47100:6;47108:1;47064:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;47064:46:0;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47064:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47064:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47064:46:0;;-1:-1:-1;47127:15:0;-1:-1:-1;;;;;47127:13:0;;;:15::i;:::-;47123:116;;;47159:16;;47185:41;;;-1:-1:-1;;;47185:41:0;;47220:4;47185:41;;;;;;-1:-1:-1;;;;;47159:16:0;;;;:25;;:16;;47185:26;;:41;;;;;;;;;;;;;;;47159:16;47185:41;;;5:2:-1;;;;30:1;27;20:12;5:2;47185:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47185:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47185:41:0;47159:68;;;-1:-1:-1;;;;;;47159:68:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47159:68:0;;;;;;;-1:-1:-1;47159:68:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;47159:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47159:68:0;;;;47123:116;47258:12;46373:905;-1:-1:-1;;;;;;46373:905:0:o;47286:700::-;47409:7;47433:17;:9;-1:-1:-1;;;;;47433:15:0;;:17::i;:::-;47429:83;;;47467:9;;;:33;;;-1:-1:-1;;;47467:33:0;;;;-1:-1:-1;;;;;47467:9:0;;;;:17;;47491:6;;47467:33;;;;;:9;:33;;;;;;47491:6;47467:9;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;47467:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47467:33:0;;;;;47429:83;47524:91;47549:17;:9;-1:-1:-1;;;;;47549:15:0;;:17::i;:::-;:41;;47581:9;47549:41;;;47569:9;;-1:-1:-1;;;;;47569:9:0;47549:41;47600:13;;-1:-1:-1;;;;;47600:13:0;47524:24;:91::i;:::-;47649:13;;47626:20;;-1:-1:-1;;;;;47649:13:0;;;;:27;;47691:17;;:15;;;:17::i;:::-;:41;;47723:9;47691:41;;;47711:9;;-1:-1:-1;;;;;47711:9:0;47691:41;47747:6;47768:15;:7;-1:-1:-1;;;;;47768:13:0;;:15::i;:::-;:37;;47798:7;47768:37;;;47786:9;;-1:-1:-1;;;;;47786:9:0;47768:37;47649:183;;;-1:-1:-1;;;;;;47649:183:0;;;;;;;-1:-1:-1;;;;;47649:183:0;;;;;;;;;;;;;;;;;;;;47820:1;47649:183;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47649:183:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;47649:183:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47649:183:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47649:183:0;;-1:-1:-1;47849:15:0;-1:-1:-1;;;;;47849:13:0;;;:15::i;:::-;47845:102;;;47881:9;;47900:34;;;-1:-1:-1;;;47900:34:0;;47928:4;47900:34;;;;;;-1:-1:-1;;;;;47881:9:0;;;;:18;;:9;;47900:19;;:34;;;;;;;;;;;;;;;47881:9;47900:34;;;5:2:-1;;;;30:1;27;20:12;5:2;47900:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47900:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47900:34:0;47881:54;;;-1:-1:-1;;;;;;47881:54:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47881:54:0;;;;;;;-1:-1:-1;47881:54:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;47881:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47881:54:0;;;;47966:12;-1:-1:-1;47286:700:0;;;;;:::o;20040:176::-;20149:58;;;-1:-1:-1;;;;;20149:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20149:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20123:85:0;;20142:5;;20123:18;:85::i;:::-;20040:176;;;:::o;22079:1114::-;22683:27;22691:5;-1:-1:-1;;;;;22683:25:0;;:27::i;:::-;22675:71;;;;;-1:-1:-1;;;22675:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22820:12;22834:23;22869:5;-1:-1:-1;;;;;22861:19:0;22881:4;22861: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;;;22861: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;;22819:67:0;;;;22905:7;22897:52;;;;;-1:-1:-1;;;22897:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22966:17;;:21;22962:224;;23108:10;23097:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23097:30:0;23089:85;;;;-1:-1:-1;;;23089:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24590:202;-1:-1:-1;;;;;24682:21:0;;;;;;:45;;-1:-1:-1;;;;;;24707:20:0;;-1:-1:-1;;;;;;;;;;;24707:20:0;;24682:45;24678:107;;;24744:29;-1:-1:-1;;;;;24744:17:0;;24762:2;24766:6;24744:29;:17;:29;:::i;16878:810::-;16938:4;17597:20;;17440:66;17637:15;;;;;:42;;-1:-1:-1;17656:23:0;;;16878:810;-1:-1:-1;;16878:810:0:o;20436:621::-;20806:10;;;20805:62;;-1:-1:-1;20822:39:0;;;-1:-1:-1;;;20822:39:0;;20846:4;20822:39;;;;-1:-1:-1;;;;;20822:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;20822:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20822:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20822:39:0;:44;20805:62;20797:152;;;;-1:-1:-1;;;20797:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20986:62;;;-1:-1:-1;;;;;20986:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20986:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20960:89:0;;20979:5;;20960:18;:89::i;26222:23751::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;26222:23751:0;;;-1:-1:-1;;26222:23751:0:o;:::-;
Swarm Source
bzzr://95a939ead5d2c358b8fc2de33c4c7a6efb984e6b726dacfae8ac46abf112dba4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BSC | 100.00% | $4.3 | 1 | $4.3 |
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.