Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0.001656 ETH
Eth Value
$4.02 (@ $2,426.68/ETH)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 127 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Pool Router | 16483317 | 649 days ago | IN | 0 ETH | 0.00054176 | ||||
Set Pool Router | 16483315 | 649 days ago | IN | 0 ETH | 0.00051349 | ||||
Set Pool Router | 16483312 | 649 days ago | IN | 0 ETH | 0.00045284 | ||||
Set Pool Router | 16483310 | 649 days ago | IN | 0 ETH | 0.00048983 | ||||
Set Pool Router | 16483307 | 649 days ago | IN | 0 ETH | 0.00048722 | ||||
Set Pool Router | 16483304 | 649 days ago | IN | 0 ETH | 0.00051153 | ||||
Set Pool Router | 16483300 | 649 days ago | IN | 0 ETH | 0.00048132 | ||||
Set Pool Router | 16483283 | 649 days ago | IN | 0 ETH | 0.00050833 | ||||
Withdraw Protoco... | 16481991 | 649 days ago | IN | 0 ETH | 0.00044763 | ||||
Stake NFT | 16474957 | 650 days ago | IN | 0 ETH | 0.00905468 | ||||
Set Collection A... | 16474151 | 651 days ago | IN | 0 ETH | 0.00076544 | ||||
Set Collection A... | 16449381 | 654 days ago | IN | 0 ETH | 0.00306015 | ||||
Withdraw NFT | 16449349 | 654 days ago | IN | 0 ETH | 0.00296939 | ||||
Swap F Tfor NFT | 16423378 | 658 days ago | IN | 0.095 ETH | 0.00314703 | ||||
Swap NF Tfor FT | 16423330 | 658 days ago | IN | 0 ETH | 0.00589344 | ||||
Set Factory Appr... | 16412519 | 659 days ago | IN | 0 ETH | 0.00077793 | ||||
Set Factory Appr... | 16412519 | 659 days ago | IN | 0 ETH | 0.00045777 | ||||
Set Factory Appr... | 16412497 | 659 days ago | IN | 0 ETH | 0.00045987 | ||||
Set Factory Appr... | 16412488 | 659 days ago | IN | 0 ETH | 0.00070435 | ||||
Stake NFT | 16403322 | 660 days ago | IN | 0 ETH | 0.009734 | ||||
Withdraw NFT | 16403292 | 660 days ago | IN | 0 ETH | 0.00448703 | ||||
Stake NFT | 16396778 | 661 days ago | IN | 0 ETH | 0.00456181 | ||||
Swap NF Tfor FT | 16395522 | 662 days ago | IN | 0 ETH | 0.00317604 | ||||
Withdraw FT | 16392009 | 662 days ago | IN | 0 ETH | 0.00140312 | ||||
Stake FT | 16392002 | 662 days ago | IN | 0.029 ETH | 0.00208354 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16481991 | 649 days ago | 0.003864 ETH | ||||
16423378 | 658 days ago | 0.095 ETH | ||||
16423330 | 658 days ago | 0.00342 ETH | ||||
16395522 | 662 days ago | 0.00018 ETH | ||||
16392002 | 662 days ago | 0.029 ETH | ||||
16391645 | 662 days ago | 0.009 ETH | ||||
16390567 | 662 days ago | 0.025 ETH | ||||
16387178 | 663 days ago | 0.328 ETH | ||||
16386553 | 663 days ago | 0.072 ETH | ||||
16373101 | 665 days ago | 0.068 ETH | ||||
16371632 | 665 days ago | 0.18 ETH | ||||
16353629 | 667 days ago | 0.00112 ETH | ||||
16353611 | 667 days ago | 0.108 ETH | ||||
16353347 | 667 days ago | 0.048 ETH | ||||
16352814 | 668 days ago | 0.048 ETH | ||||
16352810 | 668 days ago | 0.047 ETH | ||||
16352810 | 668 days ago | 0.047 ETH | ||||
16352810 | 668 days ago | 0.047 ETH | ||||
16352647 | 668 days ago | 0.046 ETH | ||||
16352565 | 668 days ago | 0.045 ETH | ||||
16351999 | 668 days ago | 0.044 ETH | ||||
16348042 | 668 days ago | 0.16 ETH | ||||
16346053 | 668 days ago | 0.049 ETH | ||||
16346033 | 668 days ago | 0.045 ETH | ||||
16339905 | 669 days ago | 0.04 ETH |
Loading...
Loading
Contract Name:
Router
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-25 */ // File: yomiswap/lib/FixedPointMathLib.sol pragma solidity =0.8.17; library FixedPointMathLib { uint256 internal constant WAD = 1e18; function fmul( uint256 x, uint256 y, uint256 baseUnit ) internal pure returns (uint256 z) { assembly { // Store x * y in z for now. z := mul(x, y) // Equivalent to require(x == 0 || (x * y) / x == y) if iszero(or(iszero(x), eq(div(z, x), y))) { revert(0, 0) } // If baseUnit is zero this will return zero instead of reverting. z := div(z, baseUnit) } } function fdiv( uint256 x, uint256 y, uint256 baseUnit ) internal pure returns (uint256 z) { assembly { // Store x * baseUnit in z for now. z := mul(x, baseUnit) if or( // Revert if y is zero to ensure we don't divide by zero below. iszero(y), // Equivalent to require(x == 0 || (x * baseUnit) / x == baseUnit) iszero(or(iszero(x), eq(div(z, x), baseUnit))) ) { revert(0, 0) } // We ensure y is not zero above, so there is never division by zero here. z := div(z, y) } } function fpow( uint256 x, uint256 n, uint256 baseUnit ) internal pure returns (uint256 z) { assembly { switch x case 0 { switch n case 0 { z := baseUnit } default { z := 0 } } default { switch mod(n, 2) case 0 { z := baseUnit } default { z := x } let half := div(baseUnit, 2) for { n := div(n, 2) } n { n := div(n, 2) } { let xx := mul(x, x) if iszero(eq(div(xx, x), x)) { revert(0, 0) } let xxRound := add(xx, half) if lt(xxRound, xx) { revert(0, 0) } x := div(xxRound, baseUnit) if mod(n, 2) { let zx := mul(z, x) if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) { revert(0, 0) } let zxRound := add(zx, half) if lt(zxRound, zx) { revert(0, 0) } z := div(zxRound, baseUnit) } } } } } } // File: yomiswap/interfaces/IPool.sol pragma solidity =0.8.17; interface IPool { //VARIANT function collection() external returns (address); function bondingCurve() external returns (address); function router() external returns (address); function paymentToken() external returns (address); function protocolFeeRatio() external returns (uint256); function buyEventNum() external returns (uint256); function sellEventNum() external returns (uint256); function stakeNFTprice() external returns (uint256); function stakeFTprice() external returns (uint256); function totalFTfee() external returns (uint256); function totalNFTfee() external returns (uint256); function isOtherStake() external returns (bool); function isPair() external returns (bool); struct UserInfo { uint256 initBuyNum; uint256 initSellNum; uint256 initSellAmount; uint256 totalNFTpoint; uint256 totalFTpoint; } struct PoolInfo { uint256 spotPrice; uint256 delta; uint256 spread; uint256 buyNum; uint256 sellNum; } function stake(uint256[] calldata tokenIds, address user) external payable; function withdraw(uint256[] memory tokenIds, address user) external payable returns(uint256 totalFee); function swapFTforNFT(uint256[] memory tokenIds, address user) external payable returns (uint256 protocolFee); function swapNFTforFT( uint256[] memory tokenIds, uint256 minExpectFee, address user ) external payable returns (uint256 protocolFee); function stakeFT(uint256 itemNum, address user) external payable; function stakeNFT(uint256[] calldata tokenIds, address user) external; function withdrawNFT(uint256[] memory tokenIds, address user) external payable returns(uint256 totalFee); function withdrawFT( uint256 userSellNum, uint256[] memory tokenIds, address user ) external payable returns(uint256 totalFee); //@notice Only Single NonOtherStake function withdrawNFTpart(uint256[] calldata tokenIds, address user) external; //@notice Only Single NonOtherStake function withdrawFTpart(uint256 userSellNum, address user) external; //@notice Only Pair NonOtherStake function withdrawPart(uint256[] calldata tokenIds, address user) external; //@notice Only All function withdrawFee(address user) external payable; //GET //@notice Only All function getCalcBuyInfo(uint256 itemNum, uint256 spotPrice) external view returns (uint256); //@notice All function getCalcSellInfo(uint256 itemNum, uint256 spotPrice) external view returns (uint256); //@notice Only OtherStake function getUserStakeNFTfee(address user) external view returns (uint256 userFee); //@notice Only OtherStake function getUserStakeFTfee(address user) external view returns (uint256 userFee); //@notice Only Single NonOtherStake function getUserStakeNFTfee() external view returns (uint256 userFee); //@notice Only Single NonOtherStake function getUserStakeFTfee() external view returns (uint256 userFee); //@notice All function getPoolInfo() external view returns (PoolInfo memory); //@notice All function getAllHoldIds() external view returns (uint256[] memory); //@notice Only Pair NonOtherStake function getUserStakeFee() external view returns (uint256); //@notice Only Pair OtherStake function getUserStakeFee(address user) external view returns (uint256); //@notice Only OtherStake function getUserInfo(address user) external view returns (UserInfo memory); //@notice Only Non OtherStake function getUserInfo() external view returns (UserInfo memory); //SET //@notice All function setRouter(address newRouter) external; //@notice All function setProtocolFeeRatio(uint256 newProtocolFeeRatio) external; } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: yomiswap/Router.sol pragma solidity =0.8.17; contract Router is Ownable { using FixedPointMathLib for uint256; //@param supporterFeeRatio: ratio of supporter uint256 private supporterFeeRatio = 0.3e18; //@param isCollectionApprove: isApprove of Collection mapping(address => bool) public isCollectionApprove; //@param isBondingCurve: isApprove of BondingCurve mapping(address => bool) public isBondingCurveApprove; //@param isPaymentToken: isApprove of PaymentToken mapping(address => bool) public isPaymentTokenApprove; //@param isFactoryApprove: isApprove of Facotory mapping(address => bool) public isFactoryApprove; //@param isSupporterApprove: isApprove of Supporter mapping(address => bool) public isSupporterApprove; //@param totalProtocolFee: total protocol fee per paymentToken mapping(address => uint256) private totalProtocolFee; //@param supporterFee: per supporter and per paymentToken mapping(address => mapping(address => uint256)) private supporterFee; //STRUCT struct input { uint256[] tokenIds; } //@notice only factory address modifier onlyFactory() { require(isFactoryApprove[msg.sender] == true, "onlyFactory"); _; } //EVENT event StakeNFT( address indexed user, address indexed pool, uint256[] tokenIds ); event StakeFT( address indexed user, address indexed pool, uint256 userNum, uint256 userAmount ); event Stake( address indexed user, address indexed pool, uint256[] tokenIds, uint256 userNum, uint256 userAmount ); event SwapNFTforFT( address indexed user, address indexed pool, uint256[] tokenIds, uint256 totalFee, address supporter ); event SwapFTforNFT( address indexed user, address indexed pool, uint256[] tokenIds, uint256 totalFee, address supporter ); event WithdrawNFT( address indexed user, address indexed pool, uint256[] tokenIds, uint256 userAmount ); event WithdrawFT( address indexed user, address indexed pool, uint256[] tokenIds, uint256 userNum, uint256 userAmount ); event WithdrawNFTpart( address indexed user, address indexed pool, uint256[] tokenIds ); event WithdrawFTpart( address indexed user, address indexed pool, uint256 userNum ); event Withdraw( address indexed user, address indexed pool, uint256[] tokenIds, uint256 userNum, uint256 userAmount ); event WithdrawPart( address indexed user, address indexed pool, uint256[] tokenIds ); event WithdrawFee( address indexed user, address indexed pool, uint256 userFee ); event Received(address, uint256); event UpdateBondingCurve(address indexed bondingCurve, bool approve); event UpdateCollection(address indexed collection, bool approve); event UpdatePool(address indexed pool, bool approve); event UpdatePaymentToken(address indexed paymentToken, bool approve); event UpdateFactory(address indexed factory, bool approve); event UpdateSupporter(address indexed supporter, bool approve); //MAIN function stakeNFT(address _pool, uint256[] calldata _tokenIds) external { IPool(_pool).stakeNFT(_tokenIds, msg.sender); emit StakeNFT(msg.sender, _pool, _tokenIds); } function batchStakeNFT( address[] calldata _poolList, input[] calldata InputArray ) external { for (uint256 i = 0; i < _poolList.length; ) { IPool(_poolList[i]).stakeNFT(InputArray[i].tokenIds, msg.sender); emit StakeNFT(msg.sender, _poolList[i], InputArray[i].tokenIds); unchecked { ++i; } } } //@notice stake of ft function stakeFT(address _pool, uint256 _userSellNum) external payable { uint256 _stakeFTprice = IPool(_pool).stakeFTprice(); uint256 _totalFee = IPool(_pool).getCalcSellInfo( _userSellNum, _stakeFTprice ); IPool(_pool).stakeFT{value: msg.value}(_userSellNum, msg.sender); emit StakeFT(msg.sender, _pool, _userSellNum, _totalFee); } //@notice batch stake ft function batchStakeFT( address[] calldata _poolList, uint256[] calldata _userSellNumList ) external payable { uint256 _remainFee = msg.value; for (uint256 i = 0; i < _poolList.length; ) { uint256 _stakeFTprice = IPool(_poolList[i]).stakeFTprice(); address _paymentToken = IPool(_poolList[i]).paymentToken(); uint256 _totalFee = IPool(_poolList[i]).getCalcSellInfo( _userSellNumList[i], _stakeFTprice ); if (_paymentToken == address(0)) { require(_remainFee >= _totalFee, "not enogh value"); _remainFee -= _totalFee; IPool(_poolList[i]).stakeFT{value: _totalFee}( _userSellNumList[i], msg.sender ); } else { IPool(_poolList[i]).stakeFT(_userSellNumList[i], msg.sender); } emit StakeFT( msg.sender, _poolList[i], _userSellNumList[i], _totalFee ); unchecked { ++i; } } if (_remainFee > 0) { payable(msg.sender).transfer(_remainFee); } } //@notice stake for isPair=true function stake(address _pool, uint256[] calldata _tokenIds) external payable { uint256 _stakeFTprice = IPool(_pool).stakeFTprice(); uint256 _totalFee = IPool(_pool).getCalcSellInfo( _tokenIds.length, _stakeFTprice ); IPool(_pool).stake{value: msg.value}(_tokenIds, msg.sender); emit Stake(msg.sender, _pool, _tokenIds, _tokenIds.length, _totalFee); } //@notice swap NFT → FT function swapNFTforFT( address _pool, uint256[] calldata _tokenIds, uint256 _minExpectFee, address _supporter ) external { require(_tokenIds.length > 0, "Not 0"); IPool.PoolInfo memory _poolInfo = IPool(_pool).getPoolInfo(); address _paymentToken = IPool(_pool).paymentToken(); uint256 _totalFee = IPool(_pool).getCalcSellInfo( _tokenIds.length, _poolInfo.spotPrice ); uint256 _profitAmount = IPool(_pool).swapNFTforFT( _tokenIds, _minExpectFee, msg.sender ); _updateFee(_supporter, _paymentToken, _profitAmount); emit SwapNFTforFT(msg.sender, _pool, _tokenIds, _totalFee, _supporter); } //@notice batchSwapNFTforFT function batchSwapNFTforFT( address[] calldata _poolList, input[] calldata InputArray, uint256[] calldata _minExpects, address _supporter ) external payable { for (uint256 i = 0; i < _poolList.length; ) { require(InputArray[i].tokenIds.length > 0, "Not 0"); IPool.PoolInfo memory _poolInfo = IPool(_poolList[i]).getPoolInfo(); address _paymentToken = IPool(_poolList[i]).paymentToken(); uint256 _totalFee = IPool(_poolList[i]).getCalcSellInfo( InputArray[i].tokenIds.length, _poolInfo.spotPrice ); uint256 _profitAmount = IPool(_poolList[i]).swapNFTforFT( InputArray[i].tokenIds, _minExpects[i], msg.sender ); _updateFee(_supporter, _paymentToken, _profitAmount); emit SwapNFTforFT( msg.sender, _poolList[i], InputArray[i].tokenIds, _totalFee, _supporter ); unchecked { ++i; } } } //@notice swap FT → NFT function swapFTforNFT( address _pool, uint256[] calldata _tokenIds, address _supporter ) external payable { require(_tokenIds.length > 0, "Not 0"); IPool.PoolInfo memory _poolInfo = IPool(_pool).getPoolInfo(); address _paymentToken = IPool(_pool).paymentToken(); uint256 _totalFee = IPool(_pool).getCalcBuyInfo( _tokenIds.length, _poolInfo.spotPrice ); uint256 _profitAmount = IPool(_pool).swapFTforNFT{value: msg.value}( _tokenIds, msg.sender ); _updateFee(_supporter, _paymentToken, _profitAmount); emit SwapFTforNFT(msg.sender, _pool, _tokenIds, _totalFee, _supporter); } //@notice batchSwapFTforNFT function batchSwapFTforNFT( address[] calldata _poolList, input[] calldata InputArray, address _supporter ) external payable { uint256 _remainFee = msg.value; for (uint256 i = 0; i < _poolList.length; ) { require(InputArray[i].tokenIds.length > 0, "Not 0"); IPool.PoolInfo memory _poolInfo = IPool(_poolList[i]).getPoolInfo(); address _paymentToken = IPool(_poolList[i]).paymentToken(); uint256 _totalFee = IPool(_poolList[i]).getCalcBuyInfo( InputArray[i].tokenIds.length, _poolInfo.spotPrice ); uint256 _profitAmount; if (_paymentToken == address(0)) { require(_remainFee >= _totalFee, "not enogh value"); _remainFee -= _totalFee; _profitAmount = IPool(_poolList[i]).swapFTforNFT{ value: _totalFee }(InputArray[i].tokenIds, msg.sender); } else { _profitAmount = IPool(_poolList[i]).swapFTforNFT( InputArray[i].tokenIds, msg.sender ); } _updateFee(_supporter, _paymentToken, _profitAmount); emit SwapFTforNFT( msg.sender, _poolList[i], InputArray[i].tokenIds, _totalFee, _supporter ); unchecked { ++i; } } if (_remainFee > 0) { payable(msg.sender).transfer(_remainFee); } } //@notice withdraw NFT and Fee function withdrawNFT(address _pool, uint256[] calldata _tokenIds) external { uint256 _totalFee = IPool(_pool).withdrawNFT(_tokenIds, msg.sender); emit WithdrawNFT(msg.sender, _pool, _tokenIds, _totalFee); } //@notice withdraw FT and Fee function withdrawFT( address _pool, uint256 _userSellNum, uint256[] calldata _tokenIds ) external { uint256 _totalFee = IPool(_pool).withdrawFT(_userSellNum, _tokenIds, msg.sender); emit WithdrawFT(msg.sender, _pool, _tokenIds, _userSellNum, _totalFee); } //@notice withdraw FT and Fee function withdraw( address _pool, uint256 _userSellNum, uint256[] calldata _tokenIds ) external { uint256 _totalFee = IPool(_pool).withdraw(_tokenIds, msg.sender); emit Withdraw(msg.sender, _pool, _tokenIds, _userSellNum, _totalFee); } //@notice withdraw part NFT function withdrawNFTpart(address _pool, uint256[] calldata _tokenIds) external { IPool(_pool).withdrawNFTpart(_tokenIds, msg.sender); emit WithdrawNFTpart(msg.sender, _pool, _tokenIds); } //@notice withdraw part FT function withdrawFTpart(address _pool, uint256 _userSellNum) external payable { IPool(_pool).withdrawFTpart(_userSellNum, msg.sender); emit WithdrawFTpart(msg.sender, _pool, _userSellNum); } function withdrawPart(address _pool, uint256[] calldata _tokenIds) external payable { IPool(_pool).withdrawPart(_tokenIds, msg.sender); emit WithdrawPart(msg.sender, _pool, _tokenIds); } //@notice withdraw protocol fee function withdrawProtocolFee(address _paymentToken) external payable onlyOwner { uint256 _totalFee = totalProtocolFee[_paymentToken]; //check require(_totalFee > 0, "Not Fee"); //effect totalProtocolFee[_paymentToken] = 0; //intaraction if (_paymentToken == address(0)) { payable(msg.sender).transfer(_totalFee); } else { IERC20(_paymentToken).transfer(msg.sender, _totalFee); } } function withdrawFee(address _pool) external payable { IPool(_pool).withdrawFee(msg.sender); } //@notice withdraw support fee function withdrawSupportFee(address _paymentToken) external payable { uint256 _totalFee = supporterFee[msg.sender][_paymentToken]; //check require(_totalFee > 0, "Not Fee"); //effect supporterFee[msg.sender][_paymentToken] = 0; //intaraction if (_paymentToken == address(0)) { payable(msg.sender).transfer(_totalFee); } else { IERC20(_paymentToken).transfer(msg.sender, _totalFee); } } //GET //@notice get approve of collection function getIsCollectionApprove(address _collection) external view returns (bool) { return isCollectionApprove[_collection]; } //@notice get approve of bonding curve function getIsBondingCurveApprove(address _bondingCurve) external view returns (bool) { return isBondingCurveApprove[_bondingCurve]; } //@notice get approve of bonding curve function getIsPaymentTokenApprove(address _paymentToken) external view returns (bool) { return isPaymentTokenApprove[_paymentToken]; } //@notice get approve of bonding curve function getIsFactoryApprove(address _factory) external view returns (bool) { return isFactoryApprove[_factory]; } //@notice get approve of bonding curve function getIsSupporterApprove(address _supporter) external view returns (bool) { return isSupporterApprove[_supporter]; } //@notice get fee of protocol function getTotalProtocolFee(address _paymentToken) external view returns(uint256){ return totalProtocolFee[_paymentToken]; } //@notice get fee of supporter function getSupporterFee(address _supporter, address _paymentToken)external view returns(uint256){ return supporterFee[_supporter][_paymentToken]; } //SET //@notice approve for bonding curve function setCollectionApprove(address _collection, bool _approve) external onlyOwner { isCollectionApprove[_collection] = _approve; emit UpdateCollection(_collection, _approve); } //@notice approve for bonding curve function setBondingCurveApprove(address _bondingCurve, bool _approve) external onlyOwner { isBondingCurveApprove[_bondingCurve] = _approve; emit UpdateBondingCurve(_bondingCurve, _approve); } //@notice approve for bonding curve function setPaymentTokenApprove(address _paymentToken, bool _approve) external onlyOwner { isPaymentTokenApprove[_paymentToken] = _approve; emit UpdatePaymentToken(_paymentToken, _approve); } //@notice set approve for factory function setFactoryApprove(address _factory, bool _approve) external onlyOwner { isFactoryApprove[_factory] = _approve; emit UpdateFactory(_factory, _approve); } //@notice set approve for supporter function setSupporterApprove(address _supporter, bool _approve) external onlyOwner { isSupporterApprove[_supporter] = _approve; emit UpdateSupporter(_supporter, _approve); } //@notice set protocolFeeRatio for pool function setPoolProtocolFeeRatio( address _pool, uint256 _newProtocolFeeRatio ) external onlyOwner { IPool(_pool).setProtocolFeeRatio(_newProtocolFeeRatio); } //@notice set protocolFeeRatio function setPoolRouter(address _pool, address _newRouter) external onlyOwner { IPool(_pool).setRouter(_newRouter); } //@notice set pool function setPool(address _pool, bool _approve) external onlyFactory { emit UpdatePool(_pool, _approve); } //INTERNAL //@notice calc update fee function _updateFee( address _supporter, address _paymentToken, uint256 _profitAmount ) internal { if (_supporter != address(0)) { uint256 _supporterFee = _profitAmount.fmul( supporterFeeRatio, FixedPointMathLib.WAD ); uint256 _protocolFee = _profitAmount - _supporterFee; totalProtocolFee[_paymentToken] += _protocolFee; supporterFee[_supporter][_paymentToken] += _supporterFee; } else if (_supporter == address(0)) { totalProtocolFee[_paymentToken] += _profitAmount; } } receive() external payable { emit Received(msg.sender, msg.value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"userNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userAmount","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"userNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userAmount","type":"uint256"}],"name":"StakeFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"StakeNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"totalFee","type":"uint256"},{"indexed":false,"internalType":"address","name":"supporter","type":"address"}],"name":"SwapFTforNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"totalFee","type":"uint256"},{"indexed":false,"internalType":"address","name":"supporter","type":"address"}],"name":"SwapNFTforFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bondingCurve","type":"address"},{"indexed":false,"internalType":"bool","name":"approve","type":"bool"}],"name":"UpdateBondingCurve","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"bool","name":"approve","type":"bool"}],"name":"UpdateCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"factory","type":"address"},{"indexed":false,"internalType":"bool","name":"approve","type":"bool"}],"name":"UpdateFactory","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"paymentToken","type":"address"},{"indexed":false,"internalType":"bool","name":"approve","type":"bool"}],"name":"UpdatePaymentToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"bool","name":"approve","type":"bool"}],"name":"UpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"supporter","type":"address"},{"indexed":false,"internalType":"bool","name":"approve","type":"bool"}],"name":"UpdateSupporter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"userNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userAmount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"userNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userAmount","type":"uint256"}],"name":"WithdrawFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"userNum","type":"uint256"}],"name":"WithdrawFTpart","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"userFee","type":"uint256"}],"name":"WithdrawFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"userAmount","type":"uint256"}],"name":"WithdrawNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"WithdrawNFTpart","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"WithdrawPart","type":"event"},{"inputs":[{"internalType":"address[]","name":"_poolList","type":"address[]"},{"internalType":"uint256[]","name":"_userSellNumList","type":"uint256[]"}],"name":"batchStakeFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_poolList","type":"address[]"},{"components":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"internalType":"struct Router.input[]","name":"InputArray","type":"tuple[]"}],"name":"batchStakeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_poolList","type":"address[]"},{"components":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"internalType":"struct Router.input[]","name":"InputArray","type":"tuple[]"},{"internalType":"address","name":"_supporter","type":"address"}],"name":"batchSwapFTforNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_poolList","type":"address[]"},{"components":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"internalType":"struct Router.input[]","name":"InputArray","type":"tuple[]"},{"internalType":"uint256[]","name":"_minExpects","type":"uint256[]"},{"internalType":"address","name":"_supporter","type":"address"}],"name":"batchSwapNFTforFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_bondingCurve","type":"address"}],"name":"getIsBondingCurveApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"}],"name":"getIsCollectionApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"getIsFactoryApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentToken","type":"address"}],"name":"getIsPaymentTokenApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_supporter","type":"address"}],"name":"getIsSupporterApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_supporter","type":"address"},{"internalType":"address","name":"_paymentToken","type":"address"}],"name":"getSupporterFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentToken","type":"address"}],"name":"getTotalProtocolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBondingCurveApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isCollectionApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFactoryApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPaymentTokenApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSupporterApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bondingCurve","type":"address"},{"internalType":"bool","name":"_approve","type":"bool"}],"name":"setBondingCurveApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"bool","name":"_approve","type":"bool"}],"name":"setCollectionApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"bool","name":"_approve","type":"bool"}],"name":"setFactoryApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentToken","type":"address"},{"internalType":"bool","name":"_approve","type":"bool"}],"name":"setPaymentTokenApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"bool","name":"_approve","type":"bool"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256","name":"_newProtocolFeeRatio","type":"uint256"}],"name":"setPoolProtocolFeeRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"address","name":"_newRouter","type":"address"}],"name":"setPoolRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_supporter","type":"address"},{"internalType":"bool","name":"_approve","type":"bool"}],"name":"setSupporterApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256","name":"_userSellNum","type":"uint256"}],"name":"stakeFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"stakeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"address","name":"_supporter","type":"address"}],"name":"swapFTforNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"_minExpectFee","type":"uint256"},{"internalType":"address","name":"_supporter","type":"address"}],"name":"swapNFTforFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256","name":"_userSellNum","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256","name":"_userSellNum","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"withdrawFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256","name":"_userSellNum","type":"uint256"}],"name":"withdrawFTpart","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"withdrawFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"withdrawNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"withdrawNFTpart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"withdrawPart","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentToken","type":"address"}],"name":"withdrawProtocolFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentToken","type":"address"}],"name":"withdrawSupportFee","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052670429d069189e00006001553480156200001d57600080fd5b506200003e620000326200004460201b60201c565b6200004c60201b60201c565b62000110565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b614b5680620001206000396000f3fe60806040526004361061024a5760003560e01c80639175a58811610139578063d46b29ab116100b6578063f2fde38b1161007a578063f2fde38b14610860578063fb1fc62c14610889578063fb8c5ef0146108c6578063fc5a0df5146108ef578063fc9d16cd1461092c578063fd7bb9b5146109555761028a565b8063d46b29ab14610764578063dd4b533f146107a1578063e1549300146107ca578063e70b1bc7146107e6578063ec217ea6146108235761028a565b8063b693febb116100fd578063b693febb14610696578063c9a3911e146106b2578063cab5c30e146106ce578063ce9061fa146106ea578063d1b2bda8146107275761028a565b80639175a588146105c25780639bdedea5146105eb5780639c9206d214610614578063a81a85811461063d578063b65bfbf0146106595761028a565b80633d9b66a8116101c7578063715018a61161018b578063715018a614610505578063779f15831461051c57806386b99ec1146105455780638d3b6eb31461056e5780638da5cb5b146105975761028a565b80633d9b66a8146103f55780633fbce551146104325780635617811d1461046f578063668fb6dc146104ac5780636a64d3d2146104c85761028a565b806320bec12c1161020e57806320bec12c1461033557806327b956f81461035e5780632e091d531461037a57806330d6d64d146103a357806338e8a1d1146103cc5761028a565b80630f4c21921461028f5780631296a426146102b85780631824d439146102d457806318892c5d146102fd5780631ac3ddeb146103195761028a565b3661028a577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f885258743334604051610280929190613b81565b60405180910390a1005b600080fd5b34801561029b57600080fd5b506102b660048036038101906102b19190613c16565b610971565b005b6102d260048036038101906102cd9190613d11565b6109e8565b005b3480156102e057600080fd5b506102fb60048036038101906102f69190613d92565b610ee7565b005b61031760048036038101906103129190613e28565b610f5e565b005b610333600480360381019061032e9190613ef1565b6113da565b005b34801561034157600080fd5b5061035c60048036038101906103579190613f56565b611448565b005b61037860048036038101906103739190613c16565b61152d565b005b34801561038657600080fd5b506103a1600480360381019061039c9190613f96565b611603565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190614017565b6117ab565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613f56565b611886565b005b34801561040157600080fd5b5061041c60048036038101906104179190613d92565b611937565b6040516104299190614077565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190613ef1565b6119be565b60405161046691906140a1565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190613ef1565b6119de565b6040516104a39190614077565b60405180910390f35b6104c660048036038101906104c19190613ef1565b611a27565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190613ef1565b611bff565b6040516104fc91906140a1565b60405180910390f35b34801561051157600080fd5b5061051a611c55565b005b34801561052857600080fd5b50610543600480360381019061053e91906140bc565b611c69565b005b34801561055157600080fd5b5061056c60048036038101906105679190613f56565b611d61565b005b34801561057a57600080fd5b5061059560048036038101906105909190613f56565b611e12565b005b3480156105a357600080fd5b506105ac611ec3565b6040516105b99190614130565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e49190614017565b611eec565b005b3480156105f757600080fd5b50610612600480360381019061060d9190614017565b611fc7565b005b34801561062057600080fd5b5061063b60048036038101906106369190613f56565b6120ba565b005b61065760048036038101906106529190614017565b61216b565b005b34801561066557600080fd5b50610680600480360381019061067b9190613ef1565b612246565b60405161068d91906140a1565b60405180910390f35b6106b060048036038101906106ab9190613c16565b61229c565b005b6106cc60048036038101906106c79190614017565b61246c565b005b6106e860048036038101906106e3919061414b565b612649565b005b3480156106f657600080fd5b50610711600480360381019061070c9190613ef1565b612903565b60405161071e91906140a1565b60405180910390f35b34801561073357600080fd5b5061074e60048036038101906107499190613ef1565b612959565b60405161075b91906140a1565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190613ef1565b612979565b60405161079891906140a1565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c391906141bf565b612999565b005b6107e460048036038101906107df9190613ef1565b612c55565b005b3480156107f257600080fd5b5061080d60048036038101906108089190613ef1565b612e9f565b60405161081a91906140a1565b60405180910390f35b34801561082f57600080fd5b5061084a60048036038101906108459190613ef1565b612ebf565b60405161085791906140a1565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190613ef1565b612f15565b005b34801561089557600080fd5b506108b060048036038101906108ab9190613ef1565b612f98565b6040516108bd91906140a1565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e891906140bc565b612fb8565b005b3480156108fb57600080fd5b5061091660048036038101906109119190613ef1565b6130ae565b60405161092391906140a1565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e9190613f56565b613104565b005b61096f600480360381019061096a9190614247565b6131b5565b005b6109796137d1565b8173ffffffffffffffffffffffffffffffffffffffff166341ede57e826040518263ffffffff1660e01b81526004016109b29190614077565b600060405180830381600087803b1580156109cc57600080fd5b505af11580156109e0573d6000803e3d6000fd5b505050505050565b600034905060005b85859050811015610e8e576000868683818110610a1057610a0f6142dc565b5b9050602002016020810190610a259190613ef1565b73ffffffffffffffffffffffffffffffffffffffff16637b6880ca6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a959190614320565b90506000878784818110610aac57610aab6142dc565b5b9050602002016020810190610ac19190613ef1565b73ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b319190614362565b90506000888885818110610b4857610b476142dc565b5b9050602002016020810190610b5d9190613ef1565b73ffffffffffffffffffffffffffffffffffffffff166388e5cd1f888887818110610b8b57610b8a6142dc565b5b90506020020135856040518363ffffffff1660e01b8152600401610bb092919061438f565b602060405180830381865afa158015610bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf19190614320565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d2b5780851015610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6190614415565b60405180910390fd5b8085610c769190614464565b9450888885818110610c8b57610c8a6142dc565b5b9050602002016020810190610ca09190613ef1565b73ffffffffffffffffffffffffffffffffffffffff1663a09bf8c282898988818110610ccf57610cce6142dc565b5b90506020020135336040518463ffffffff1660e01b8152600401610cf4929190614498565b6000604051808303818588803b158015610d0d57600080fd5b505af1158015610d21573d6000803e3d6000fd5b5050505050610dd9565b888885818110610d3e57610d3d6142dc565b5b9050602002016020810190610d539190613ef1565b73ffffffffffffffffffffffffffffffffffffffff1663a09bf8c2888887818110610d8157610d806142dc565b5b90506020020135336040518363ffffffff1660e01b8152600401610da6929190614498565b600060405180830381600087803b158015610dc057600080fd5b505af1158015610dd4573d6000803e3d6000fd5b505050505b888885818110610dec57610deb6142dc565b5b9050602002016020810190610e019190613ef1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f39feb2a23d1a328f05ec9c6c1814935f849cc7d514d36093ee78f6083b6a39bc898988818110610e6257610e616142dc565b5b9050602002013584604051610e7892919061438f565b60405180910390a38360010193505050506109f0565b506000811115610ee0573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ede573d6000803e3d6000fd5b505b5050505050565b610eef6137d1565b8173ffffffffffffffffffffffffffffffffffffffff1663c0d78655826040518263ffffffff1660e01b8152600401610f289190614130565b600060405180830381600087803b158015610f4257600080fd5b505af1158015610f56573d6000803e3d6000fd5b505050505050565b60005b878790508110156113d0576000868683818110610f8157610f806142dc565b5b9050602002810190610f9391906144d0565b8060000190610fa291906144f8565b905011610fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdb906145a7565b60405180910390fd5b6000888883818110610ff957610ff86142dc565b5b905060200201602081019061100e9190613ef1565b73ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c91906146e4565b90506000898984818110611093576110926142dc565b5b90506020020160208101906110a89190613ef1565b73ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af11580156110f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111189190614362565b905060008a8a8581811061112f5761112e6142dc565b5b90506020020160208101906111449190613ef1565b73ffffffffffffffffffffffffffffffffffffffff166388e5cd1f8a8a87818110611172576111716142dc565b5b905060200281019061118491906144d0565b806000019061119391906144f8565b905085600001516040518363ffffffff1660e01b81526004016111b792919061438f565b602060405180830381865afa1580156111d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f89190614320565b905060008b8b8681811061120f5761120e6142dc565b5b90506020020160208101906112249190613ef1565b73ffffffffffffffffffffffffffffffffffffffff1663244117b48b8b88818110611252576112516142dc565b5b905060200281019061126491906144d0565b806000019061127391906144f8565b8b8b8a818110611286576112856142dc565b5b90506020020135336040518563ffffffff1660e01b81526004016112ad949392919061478c565b6020604051808303816000875af11580156112cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f09190614320565b90506112fd86848361384f565b8b8b868181106113105761130f6142dc565b5b90506020020160208101906113259190613ef1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8f3673bd023cc34f252b9e7d0a0dd6496592b87006673a974d1d621b5a93e15e8c8c89818110611386576113856142dc565b5b905060200281019061139891906144d0565b80600001906113a791906144f8565b868b6040516113b9949392919061478c565b60405180910390a384600101945050505050610f61565b5050505050505050565b8073ffffffffffffffffffffffffffffffffffffffff16631ac3ddeb336040518263ffffffff1660e01b81526004016114139190614130565b600060405180830381600087803b15801561142d57600080fd5b505af1158015611441573d6000803e3d6000fd5b5050505050565b60011515600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d290614818565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f16f5dd05aa4fb9d233806a07de5cc48d6893f315e214cce8974b6e951b655c6b8260405161152191906140a1565b60405180910390a25050565b8173ffffffffffffffffffffffffffffffffffffffff1663079cd7ce82336040518363ffffffff1660e01b8152600401611568929190614498565b600060405180830381600087803b15801561158257600080fd5b505af1158015611596573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f6658cf82172891acb8d9a94509af9869d46f4d637dd19af56bcd5a64157fa1da836040516115f79190614077565b60405180910390a35050565b60005b848490508110156117a457848482818110611624576116236142dc565b5b90506020020160208101906116399190613ef1565b73ffffffffffffffffffffffffffffffffffffffff16632f7e0b2e848484818110611667576116666142dc565b5b905060200281019061167991906144d0565b806000019061168891906144f8565b336040518463ffffffff1660e01b81526004016116a793929190614838565b600060405180830381600087803b1580156116c157600080fd5b505af11580156116d5573d6000803e3d6000fd5b505050508484828181106116ec576116eb6142dc565b5b90506020020160208101906117019190613ef1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7c0a46ce3acb6a46fffede953868812e9045bc3e16fb727004e10272ddfad74e858585818110611762576117616142dc565b5b905060200281019061177491906144d0565b806000019061178391906144f8565b60405161179192919061486a565b60405180910390a3806001019050611606565b5050505050565b8273ffffffffffffffffffffffffffffffffffffffff1663f968f33b8383336040518463ffffffff1660e01b81526004016117e893929190614838565b600060405180830381600087803b15801561180257600080fd5b505af1158015611816573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff4a476d3c8307c48588449bd904be8e33979939dd8cddeca9a78f6d336311576848460405161187992919061486a565b60405180910390a3505050565b61188e6137d1565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fc01b4a3b37bda477d1b60e1d10e03272f94fbe6d08b3c72f8a4a7e35bcd93b028260405161192b91906140a1565b60405180910390a25050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60046020528060005260406000206000915054906101000a900460ff1681565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a2f6137d1565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad906148da565b60405180910390fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b7b573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611b75573d6000803e3d6000fd5b50611bfb565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611bb6929190613b81565b6020604051808303816000875af1158015611bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf9919061490f565b505b5050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611c5d6137d1565b611c676000613a37565b565b60008473ffffffffffffffffffffffffffffffffffffffff166350902c17858585336040518563ffffffff1660e01b8152600401611caa949392919061493c565b6020604051808303816000875af1158015611cc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ced9190614320565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb36051b66c70f704c9e7f4b622d6e32b469df645be1b49212e18704d59aab85985858886604051611d52949392919061497c565b60405180910390a35050505050565b611d696137d1565b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f11b4c2b6450da8949b70f94de747d396f0a4fcedf7ffefe7332d323dd210258a82604051611e0691906140a1565b60405180910390a25050565b611e1a6137d1565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fa5863f03ddba3042b23731d7fba300e6f264d1c0cabf85630064d6ecbd01853b82604051611eb791906140a1565b60405180910390a25050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8273ffffffffffffffffffffffffffffffffffffffff16632f7e0b2e8383336040518463ffffffff1660e01b8152600401611f2993929190614838565b600060405180830381600087803b158015611f4357600080fd5b505af1158015611f57573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7c0a46ce3acb6a46fffede953868812e9045bc3e16fb727004e10272ddfad74e8484604051611fba92919061486a565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff16632c7e49158484336040518463ffffffff1660e01b815260040161200693929190614838565b6020604051808303816000875af1158015612025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120499190614320565b90508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcd715c6f851d1dc11755804a0c2e5da8792da275e44c1ee713771d7479bce8fd8585856040516120ac939291906149bc565b60405180910390a350505050565b6120c26137d1565b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f1c3c313576907bc91320c98e637bcadb2f200b2af1b9ba3036662819961ae0d48260405161215f91906140a1565b60405180910390a25050565b8273ffffffffffffffffffffffffffffffffffffffff1663ea2bfa698383336040518463ffffffff1660e01b81526004016121a893929190614838565b600060405180830381600087803b1580156121c257600080fd5b505af11580156121d6573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f13969024d11631e5bd24be9b69a2e4ca10b7b5c028eb86e51e83fc0a33ae2414848460405161223992919061486a565b60405180910390a3505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008273ffffffffffffffffffffffffffffffffffffffff16637b6880ca6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156122eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230f9190614320565b905060008373ffffffffffffffffffffffffffffffffffffffff166388e5cd1f84846040518363ffffffff1660e01b815260040161234e92919061438f565b602060405180830381865afa15801561236b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238f9190614320565b90508373ffffffffffffffffffffffffffffffffffffffff1663a09bf8c23485336040518463ffffffff1660e01b81526004016123cd929190614498565b6000604051808303818588803b1580156123e657600080fd5b505af11580156123fa573d6000803e3d6000fd5b50505050508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f39feb2a23d1a328f05ec9c6c1814935f849cc7d514d36093ee78f6083b6a39bc858460405161245e92919061438f565b60405180910390a350505050565b60008373ffffffffffffffffffffffffffffffffffffffff16637b6880ca6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156124bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124df9190614320565b905060008473ffffffffffffffffffffffffffffffffffffffff166388e5cd1f85859050846040518363ffffffff1660e01b815260040161252192919061438f565b602060405180830381865afa15801561253e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125629190614320565b90508473ffffffffffffffffffffffffffffffffffffffff16631ad30cf8348686336040518563ffffffff1660e01b81526004016125a293929190614838565b6000604051808303818588803b1580156125bb57600080fd5b505af11580156125cf573d6000803e3d6000fd5b50505050508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f32112d490671aaefcf995d4fa6526582a02c11a479dffb45b19b4d10e44f9c4e8686888890508660405161263a949392919061497c565b60405180910390a35050505050565b6000838390501161268f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612686906145a7565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa1580156126dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270091906146e4565b905060008573ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612751573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127759190614362565b905060008673ffffffffffffffffffffffffffffffffffffffff166365b962318787905085600001516040518363ffffffff1660e01b81526004016127bb92919061438f565b602060405180830381865afa1580156127d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fc9190614320565b905060008773ffffffffffffffffffffffffffffffffffffffff16634c4cbac4348989336040518563ffffffff1660e01b815260040161283e93929190614838565b60206040518083038185885af115801561285c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128819190614320565b905061288e85848361384f565b8773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2611defd53a4a87419d2078554db30aeaddd9ddfdc5990da2bbdc8d589f5e4d68989868a6040516128f1949392919061478c565b60405180910390a35050505050505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60056020528060005260406000206000915054906101000a900460ff1681565b60026020528060005260406000206000915054906101000a900460ff1681565b600084849050116129df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d6906145a7565b60405180910390fd5b60008573ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa158015612a2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5091906146e4565b905060008673ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac59190614362565b905060008773ffffffffffffffffffffffffffffffffffffffff166388e5cd1f8888905085600001516040518363ffffffff1660e01b8152600401612b0b92919061438f565b602060405180830381865afa158015612b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4c9190614320565b905060008873ffffffffffffffffffffffffffffffffffffffff1663244117b4898989336040518563ffffffff1660e01b8152600401612b8f949392919061478c565b6020604051808303816000875af1158015612bae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd29190614320565b9050612bdf85848361384f565b8873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8f3673bd023cc34f252b9e7d0a0dd6496592b87006673a974d1d621b5a93e15e8a8a868a604051612c42949392919061478c565b60405180910390a3505050505050505050565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111612d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d10906148da565b60405180910390fd5b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e1b573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612e15573d6000803e3d6000fd5b50612e9b565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612e56929190613b81565b6020604051808303816000875af1158015612e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e99919061490f565b505b5050565b60036020528060005260406000206000915054906101000a900460ff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612f1d6137d1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8390614a60565b60405180910390fd5b612f9581613a37565b50565b60066020528060005260406000206000915054906101000a900460ff1681565b60008473ffffffffffffffffffffffffffffffffffffffff1663b8f4bd7b8484336040518463ffffffff1660e01b8152600401612ff793929190614838565b6020604051808303816000875af1158015613016573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303a9190614320565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f340be5e2b666ac1549a2ea4c8e2cd4b09ce5dbf37615091ae092d89630a92f7d8585888660405161309f949392919061497c565b60405180910390a35050505050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61310c6137d1565b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167ff1a7d235323609d0e57be8421b6b457060a5778dce9db39be3d530b141a3c709826040516131a991906140a1565b60405180910390a25050565b600034905060005b868690508110156137775760008585838181106131dd576131dc6142dc565b5b90506020028101906131ef91906144d0565b80600001906131fe91906144f8565b905011613240576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613237906145a7565b60405180910390fd5b6000878783818110613255576132546142dc565b5b905060200201602081019061326a9190613ef1565b73ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa1580156132b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d891906146e4565b905060008888848181106132ef576132ee6142dc565b5b90506020020160208101906133049190613ef1565b73ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af1158015613350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133749190614362565b9050600089898581811061338b5761338a6142dc565b5b90506020020160208101906133a09190613ef1565b73ffffffffffffffffffffffffffffffffffffffff166365b962318989878181106133ce576133cd6142dc565b5b90506020028101906133e091906144d0565b80600001906133ef91906144f8565b905085600001516040518363ffffffff1660e01b815260040161341392919061438f565b602060405180830381865afa158015613430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134549190614320565b905060008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036135bd57818610156134ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c590614415565b60405180910390fd5b81866134da9190614464565b95508a8a868181106134ef576134ee6142dc565b5b90506020020160208101906135049190613ef1565b73ffffffffffffffffffffffffffffffffffffffff16634c4cbac4838b8b89818110613533576135326142dc565b5b905060200281019061354591906144d0565b806000019061355491906144f8565b336040518563ffffffff1660e01b815260040161357393929190614838565b60206040518083038185885af1158015613591573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906135b69190614320565b9050613699565b8a8a868181106135d0576135cf6142dc565b5b90506020020160208101906135e59190613ef1565b73ffffffffffffffffffffffffffffffffffffffff16634c4cbac48a8a88818110613613576136126142dc565b5b905060200281019061362591906144d0565b806000019061363491906144f8565b336040518463ffffffff1660e01b815260040161365393929190614838565b6020604051808303816000875af1158015613672573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136969190614320565b90505b6136a487848361384f565b8a8a868181106136b7576136b66142dc565b5b90506020020160208101906136cc9190613ef1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2611defd53a4a87419d2078554db30aeaddd9ddfdc5990da2bbdc8d589f5e4d68b8b8981811061372d5761372c6142dc565b5b905060200281019061373f91906144d0565b806000019061374e91906144f8565b868c604051613760949392919061478c565b60405180910390a3846001019450505050506131bd565b5060008111156137c9573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156137c7573d6000803e3d6000fd5b505b505050505050565b6137d9613afb565b73ffffffffffffffffffffffffffffffffffffffff166137f7611ec3565b73ffffffffffffffffffffffffffffffffffffffff161461384d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384490614acc565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146139a65760006138a4600154670de0b6b3a764000084613b039092919063ffffffff16565b9050600081836138b49190614464565b905080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139059190614aec565b9250508190555081600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139989190614aec565b925050819055505050613a32565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613a315780600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a299190614aec565b925050819055505b5b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600082840290508284820414841517613b1b57600080fd5b81810490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b5282613b27565b9050919050565b613b6281613b47565b82525050565b6000819050919050565b613b7b81613b68565b82525050565b6000604082019050613b966000830185613b59565b613ba36020830184613b72565b9392505050565b6000604051905090565b600080fd5b600080fd5b613bc781613b47565b8114613bd257600080fd5b50565b600081359050613be481613bbe565b92915050565b613bf381613b68565b8114613bfe57600080fd5b50565b600081359050613c1081613bea565b92915050565b60008060408385031215613c2d57613c2c613bb4565b5b6000613c3b85828601613bd5565b9250506020613c4c85828601613c01565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c7b57613c7a613c56565b5b8235905067ffffffffffffffff811115613c9857613c97613c5b565b5b602083019150836020820283011115613cb457613cb3613c60565b5b9250929050565b60008083601f840112613cd157613cd0613c56565b5b8235905067ffffffffffffffff811115613cee57613ced613c5b565b5b602083019150836020820283011115613d0a57613d09613c60565b5b9250929050565b60008060008060408587031215613d2b57613d2a613bb4565b5b600085013567ffffffffffffffff811115613d4957613d48613bb9565b5b613d5587828801613c65565b9450945050602085013567ffffffffffffffff811115613d7857613d77613bb9565b5b613d8487828801613cbb565b925092505092959194509250565b60008060408385031215613da957613da8613bb4565b5b6000613db785828601613bd5565b9250506020613dc885828601613bd5565b9150509250929050565b60008083601f840112613de857613de7613c56565b5b8235905067ffffffffffffffff811115613e0557613e04613c5b565b5b602083019150836020820283011115613e2157613e20613c60565b5b9250929050565b60008060008060008060006080888a031215613e4757613e46613bb4565b5b600088013567ffffffffffffffff811115613e6557613e64613bb9565b5b613e718a828b01613c65565b9750975050602088013567ffffffffffffffff811115613e9457613e93613bb9565b5b613ea08a828b01613dd2565b9550955050604088013567ffffffffffffffff811115613ec357613ec2613bb9565b5b613ecf8a828b01613cbb565b93509350506060613ee28a828b01613bd5565b91505092959891949750929550565b600060208284031215613f0757613f06613bb4565b5b6000613f1584828501613bd5565b91505092915050565b60008115159050919050565b613f3381613f1e565b8114613f3e57600080fd5b50565b600081359050613f5081613f2a565b92915050565b60008060408385031215613f6d57613f6c613bb4565b5b6000613f7b85828601613bd5565b9250506020613f8c85828601613f41565b9150509250929050565b60008060008060408587031215613fb057613faf613bb4565b5b600085013567ffffffffffffffff811115613fce57613fcd613bb9565b5b613fda87828801613c65565b9450945050602085013567ffffffffffffffff811115613ffd57613ffc613bb9565b5b61400987828801613dd2565b925092505092959194509250565b6000806000604084860312156140305761402f613bb4565b5b600061403e86828701613bd5565b935050602084013567ffffffffffffffff81111561405f5761405e613bb9565b5b61406b86828701613cbb565b92509250509250925092565b600060208201905061408c6000830184613b72565b92915050565b61409b81613f1e565b82525050565b60006020820190506140b66000830184614092565b92915050565b600080600080606085870312156140d6576140d5613bb4565b5b60006140e487828801613bd5565b94505060206140f587828801613c01565b935050604085013567ffffffffffffffff81111561411657614115613bb9565b5b61412287828801613cbb565b925092505092959194509250565b60006020820190506141456000830184613b59565b92915050565b6000806000806060858703121561416557614164613bb4565b5b600061417387828801613bd5565b945050602085013567ffffffffffffffff81111561419457614193613bb9565b5b6141a087828801613cbb565b935093505060406141b387828801613bd5565b91505092959194509250565b6000806000806000608086880312156141db576141da613bb4565b5b60006141e988828901613bd5565b955050602086013567ffffffffffffffff81111561420a57614209613bb9565b5b61421688828901613cbb565b9450945050604061422988828901613c01565b925050606061423a88828901613bd5565b9150509295509295909350565b60008060008060006060868803121561426357614262613bb4565b5b600086013567ffffffffffffffff81111561428157614280613bb9565b5b61428d88828901613c65565b9550955050602086013567ffffffffffffffff8111156142b0576142af613bb9565b5b6142bc88828901613dd2565b935093505060406142cf88828901613bd5565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061431a81613bea565b92915050565b60006020828403121561433657614335613bb4565b5b60006143448482850161430b565b91505092915050565b60008151905061435c81613bbe565b92915050565b60006020828403121561437857614377613bb4565b5b60006143868482850161434d565b91505092915050565b60006040820190506143a46000830185613b72565b6143b16020830184613b72565b9392505050565b600082825260208201905092915050565b7f6e6f7420656e6f67682076616c75650000000000000000000000000000000000600082015250565b60006143ff600f836143b8565b915061440a826143c9565b602082019050919050565b6000602082019050818103600083015261442e816143f2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061446f82613b68565b915061447a83613b68565b925082820390508181111561449257614491614435565b5b92915050565b60006040820190506144ad6000830185613b72565b6144ba6020830184613b59565b9392505050565b600080fd5b600080fd5b600080fd5b6000823560016020038336030381126144ec576144eb6144c1565b5b80830191505092915050565b60008083356001602003843603038112614515576145146144c1565b5b80840192508235915067ffffffffffffffff821115614537576145366144c6565b5b602083019250602082023603831315614553576145526144cb565b5b509250929050565b7f4e6f742030000000000000000000000000000000000000000000000000000000600082015250565b60006145916005836143b8565b915061459c8261455b565b602082019050919050565b600060208201905081810360008301526145c081614584565b9050919050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614615826145cc565b810181811067ffffffffffffffff82111715614634576146336145dd565b5b80604052505050565b6000614647613baa565b9050614653828261460c565b919050565b600060a0828403121561466e5761466d6145c7565b5b61467860a061463d565b905060006146888482850161430b565b600083015250602061469c8482850161430b565b60208301525060406146b08482850161430b565b60408301525060606146c48482850161430b565b60608301525060806146d88482850161430b565b60808301525092915050565b600060a082840312156146fa576146f9613bb4565b5b600061470884828501614658565b91505092915050565b600082825260208201905092915050565b600080fd5b82818337505050565b600061473c8385614711565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561476f5761476e614722565b5b602083029250614780838584614727565b82840190509392505050565b600060608201905081810360008301526147a7818688614730565b90506147b66020830185613b72565b6147c36040830184613b59565b95945050505050565b7f6f6e6c79466163746f7279000000000000000000000000000000000000000000600082015250565b6000614802600b836143b8565b915061480d826147cc565b602082019050919050565b60006020820190508181036000830152614831816147f5565b9050919050565b60006040820190508181036000830152614853818587614730565b90506148626020830184613b59565b949350505050565b60006020820190508181036000830152614885818486614730565b90509392505050565b7f4e6f742046656500000000000000000000000000000000000000000000000000600082015250565b60006148c46007836143b8565b91506148cf8261488e565b602082019050919050565b600060208201905081810360008301526148f3816148b7565b9050919050565b60008151905061490981613f2a565b92915050565b60006020828403121561492557614924613bb4565b5b6000614933848285016148fa565b91505092915050565b60006060820190506149516000830187613b72565b8181036020830152614964818587614730565b90506149736040830184613b59565b95945050505050565b60006060820190508181036000830152614997818688614730565b90506149a66020830185613b72565b6149b36040830184613b72565b95945050505050565b600060408201905081810360008301526149d7818587614730565b90506149e66020830184613b72565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a4a6026836143b8565b9150614a55826149ee565b604082019050919050565b60006020820190508181036000830152614a7981614a3d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614ab66020836143b8565b9150614ac182614a80565b602082019050919050565b60006020820190508181036000830152614ae581614aa9565b9050919050565b6000614af782613b68565b9150614b0283613b68565b9250828201905080821115614b1a57614b19614435565b5b9291505056fea26469706673582212201b41439a426a5ce7027ca46ecb584a6358589ab6eeb3c423de3e9ea990c773d164736f6c63430008110033
Deployed Bytecode
0x60806040526004361061024a5760003560e01c80639175a58811610139578063d46b29ab116100b6578063f2fde38b1161007a578063f2fde38b14610860578063fb1fc62c14610889578063fb8c5ef0146108c6578063fc5a0df5146108ef578063fc9d16cd1461092c578063fd7bb9b5146109555761028a565b8063d46b29ab14610764578063dd4b533f146107a1578063e1549300146107ca578063e70b1bc7146107e6578063ec217ea6146108235761028a565b8063b693febb116100fd578063b693febb14610696578063c9a3911e146106b2578063cab5c30e146106ce578063ce9061fa146106ea578063d1b2bda8146107275761028a565b80639175a588146105c25780639bdedea5146105eb5780639c9206d214610614578063a81a85811461063d578063b65bfbf0146106595761028a565b80633d9b66a8116101c7578063715018a61161018b578063715018a614610505578063779f15831461051c57806386b99ec1146105455780638d3b6eb31461056e5780638da5cb5b146105975761028a565b80633d9b66a8146103f55780633fbce551146104325780635617811d1461046f578063668fb6dc146104ac5780636a64d3d2146104c85761028a565b806320bec12c1161020e57806320bec12c1461033557806327b956f81461035e5780632e091d531461037a57806330d6d64d146103a357806338e8a1d1146103cc5761028a565b80630f4c21921461028f5780631296a426146102b85780631824d439146102d457806318892c5d146102fd5780631ac3ddeb146103195761028a565b3661028a577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f885258743334604051610280929190613b81565b60405180910390a1005b600080fd5b34801561029b57600080fd5b506102b660048036038101906102b19190613c16565b610971565b005b6102d260048036038101906102cd9190613d11565b6109e8565b005b3480156102e057600080fd5b506102fb60048036038101906102f69190613d92565b610ee7565b005b61031760048036038101906103129190613e28565b610f5e565b005b610333600480360381019061032e9190613ef1565b6113da565b005b34801561034157600080fd5b5061035c60048036038101906103579190613f56565b611448565b005b61037860048036038101906103739190613c16565b61152d565b005b34801561038657600080fd5b506103a1600480360381019061039c9190613f96565b611603565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190614017565b6117ab565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613f56565b611886565b005b34801561040157600080fd5b5061041c60048036038101906104179190613d92565b611937565b6040516104299190614077565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190613ef1565b6119be565b60405161046691906140a1565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190613ef1565b6119de565b6040516104a39190614077565b60405180910390f35b6104c660048036038101906104c19190613ef1565b611a27565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190613ef1565b611bff565b6040516104fc91906140a1565b60405180910390f35b34801561051157600080fd5b5061051a611c55565b005b34801561052857600080fd5b50610543600480360381019061053e91906140bc565b611c69565b005b34801561055157600080fd5b5061056c60048036038101906105679190613f56565b611d61565b005b34801561057a57600080fd5b5061059560048036038101906105909190613f56565b611e12565b005b3480156105a357600080fd5b506105ac611ec3565b6040516105b99190614130565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e49190614017565b611eec565b005b3480156105f757600080fd5b50610612600480360381019061060d9190614017565b611fc7565b005b34801561062057600080fd5b5061063b60048036038101906106369190613f56565b6120ba565b005b61065760048036038101906106529190614017565b61216b565b005b34801561066557600080fd5b50610680600480360381019061067b9190613ef1565b612246565b60405161068d91906140a1565b60405180910390f35b6106b060048036038101906106ab9190613c16565b61229c565b005b6106cc60048036038101906106c79190614017565b61246c565b005b6106e860048036038101906106e3919061414b565b612649565b005b3480156106f657600080fd5b50610711600480360381019061070c9190613ef1565b612903565b60405161071e91906140a1565b60405180910390f35b34801561073357600080fd5b5061074e60048036038101906107499190613ef1565b612959565b60405161075b91906140a1565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190613ef1565b612979565b60405161079891906140a1565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c391906141bf565b612999565b005b6107e460048036038101906107df9190613ef1565b612c55565b005b3480156107f257600080fd5b5061080d60048036038101906108089190613ef1565b612e9f565b60405161081a91906140a1565b60405180910390f35b34801561082f57600080fd5b5061084a60048036038101906108459190613ef1565b612ebf565b60405161085791906140a1565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190613ef1565b612f15565b005b34801561089557600080fd5b506108b060048036038101906108ab9190613ef1565b612f98565b6040516108bd91906140a1565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e891906140bc565b612fb8565b005b3480156108fb57600080fd5b5061091660048036038101906109119190613ef1565b6130ae565b60405161092391906140a1565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e9190613f56565b613104565b005b61096f600480360381019061096a9190614247565b6131b5565b005b6109796137d1565b8173ffffffffffffffffffffffffffffffffffffffff166341ede57e826040518263ffffffff1660e01b81526004016109b29190614077565b600060405180830381600087803b1580156109cc57600080fd5b505af11580156109e0573d6000803e3d6000fd5b505050505050565b600034905060005b85859050811015610e8e576000868683818110610a1057610a0f6142dc565b5b9050602002016020810190610a259190613ef1565b73ffffffffffffffffffffffffffffffffffffffff16637b6880ca6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a959190614320565b90506000878784818110610aac57610aab6142dc565b5b9050602002016020810190610ac19190613ef1565b73ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b319190614362565b90506000888885818110610b4857610b476142dc565b5b9050602002016020810190610b5d9190613ef1565b73ffffffffffffffffffffffffffffffffffffffff166388e5cd1f888887818110610b8b57610b8a6142dc565b5b90506020020135856040518363ffffffff1660e01b8152600401610bb092919061438f565b602060405180830381865afa158015610bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf19190614320565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d2b5780851015610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6190614415565b60405180910390fd5b8085610c769190614464565b9450888885818110610c8b57610c8a6142dc565b5b9050602002016020810190610ca09190613ef1565b73ffffffffffffffffffffffffffffffffffffffff1663a09bf8c282898988818110610ccf57610cce6142dc565b5b90506020020135336040518463ffffffff1660e01b8152600401610cf4929190614498565b6000604051808303818588803b158015610d0d57600080fd5b505af1158015610d21573d6000803e3d6000fd5b5050505050610dd9565b888885818110610d3e57610d3d6142dc565b5b9050602002016020810190610d539190613ef1565b73ffffffffffffffffffffffffffffffffffffffff1663a09bf8c2888887818110610d8157610d806142dc565b5b90506020020135336040518363ffffffff1660e01b8152600401610da6929190614498565b600060405180830381600087803b158015610dc057600080fd5b505af1158015610dd4573d6000803e3d6000fd5b505050505b888885818110610dec57610deb6142dc565b5b9050602002016020810190610e019190613ef1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f39feb2a23d1a328f05ec9c6c1814935f849cc7d514d36093ee78f6083b6a39bc898988818110610e6257610e616142dc565b5b9050602002013584604051610e7892919061438f565b60405180910390a38360010193505050506109f0565b506000811115610ee0573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ede573d6000803e3d6000fd5b505b5050505050565b610eef6137d1565b8173ffffffffffffffffffffffffffffffffffffffff1663c0d78655826040518263ffffffff1660e01b8152600401610f289190614130565b600060405180830381600087803b158015610f4257600080fd5b505af1158015610f56573d6000803e3d6000fd5b505050505050565b60005b878790508110156113d0576000868683818110610f8157610f806142dc565b5b9050602002810190610f9391906144d0565b8060000190610fa291906144f8565b905011610fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdb906145a7565b60405180910390fd5b6000888883818110610ff957610ff86142dc565b5b905060200201602081019061100e9190613ef1565b73ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c91906146e4565b90506000898984818110611093576110926142dc565b5b90506020020160208101906110a89190613ef1565b73ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af11580156110f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111189190614362565b905060008a8a8581811061112f5761112e6142dc565b5b90506020020160208101906111449190613ef1565b73ffffffffffffffffffffffffffffffffffffffff166388e5cd1f8a8a87818110611172576111716142dc565b5b905060200281019061118491906144d0565b806000019061119391906144f8565b905085600001516040518363ffffffff1660e01b81526004016111b792919061438f565b602060405180830381865afa1580156111d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f89190614320565b905060008b8b8681811061120f5761120e6142dc565b5b90506020020160208101906112249190613ef1565b73ffffffffffffffffffffffffffffffffffffffff1663244117b48b8b88818110611252576112516142dc565b5b905060200281019061126491906144d0565b806000019061127391906144f8565b8b8b8a818110611286576112856142dc565b5b90506020020135336040518563ffffffff1660e01b81526004016112ad949392919061478c565b6020604051808303816000875af11580156112cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f09190614320565b90506112fd86848361384f565b8b8b868181106113105761130f6142dc565b5b90506020020160208101906113259190613ef1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8f3673bd023cc34f252b9e7d0a0dd6496592b87006673a974d1d621b5a93e15e8c8c89818110611386576113856142dc565b5b905060200281019061139891906144d0565b80600001906113a791906144f8565b868b6040516113b9949392919061478c565b60405180910390a384600101945050505050610f61565b5050505050505050565b8073ffffffffffffffffffffffffffffffffffffffff16631ac3ddeb336040518263ffffffff1660e01b81526004016114139190614130565b600060405180830381600087803b15801561142d57600080fd5b505af1158015611441573d6000803e3d6000fd5b5050505050565b60011515600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d290614818565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f16f5dd05aa4fb9d233806a07de5cc48d6893f315e214cce8974b6e951b655c6b8260405161152191906140a1565b60405180910390a25050565b8173ffffffffffffffffffffffffffffffffffffffff1663079cd7ce82336040518363ffffffff1660e01b8152600401611568929190614498565b600060405180830381600087803b15801561158257600080fd5b505af1158015611596573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f6658cf82172891acb8d9a94509af9869d46f4d637dd19af56bcd5a64157fa1da836040516115f79190614077565b60405180910390a35050565b60005b848490508110156117a457848482818110611624576116236142dc565b5b90506020020160208101906116399190613ef1565b73ffffffffffffffffffffffffffffffffffffffff16632f7e0b2e848484818110611667576116666142dc565b5b905060200281019061167991906144d0565b806000019061168891906144f8565b336040518463ffffffff1660e01b81526004016116a793929190614838565b600060405180830381600087803b1580156116c157600080fd5b505af11580156116d5573d6000803e3d6000fd5b505050508484828181106116ec576116eb6142dc565b5b90506020020160208101906117019190613ef1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7c0a46ce3acb6a46fffede953868812e9045bc3e16fb727004e10272ddfad74e858585818110611762576117616142dc565b5b905060200281019061177491906144d0565b806000019061178391906144f8565b60405161179192919061486a565b60405180910390a3806001019050611606565b5050505050565b8273ffffffffffffffffffffffffffffffffffffffff1663f968f33b8383336040518463ffffffff1660e01b81526004016117e893929190614838565b600060405180830381600087803b15801561180257600080fd5b505af1158015611816573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff4a476d3c8307c48588449bd904be8e33979939dd8cddeca9a78f6d336311576848460405161187992919061486a565b60405180910390a3505050565b61188e6137d1565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fc01b4a3b37bda477d1b60e1d10e03272f94fbe6d08b3c72f8a4a7e35bcd93b028260405161192b91906140a1565b60405180910390a25050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60046020528060005260406000206000915054906101000a900460ff1681565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a2f6137d1565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad906148da565b60405180910390fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b7b573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611b75573d6000803e3d6000fd5b50611bfb565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611bb6929190613b81565b6020604051808303816000875af1158015611bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf9919061490f565b505b5050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611c5d6137d1565b611c676000613a37565b565b60008473ffffffffffffffffffffffffffffffffffffffff166350902c17858585336040518563ffffffff1660e01b8152600401611caa949392919061493c565b6020604051808303816000875af1158015611cc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ced9190614320565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb36051b66c70f704c9e7f4b622d6e32b469df645be1b49212e18704d59aab85985858886604051611d52949392919061497c565b60405180910390a35050505050565b611d696137d1565b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f11b4c2b6450da8949b70f94de747d396f0a4fcedf7ffefe7332d323dd210258a82604051611e0691906140a1565b60405180910390a25050565b611e1a6137d1565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fa5863f03ddba3042b23731d7fba300e6f264d1c0cabf85630064d6ecbd01853b82604051611eb791906140a1565b60405180910390a25050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8273ffffffffffffffffffffffffffffffffffffffff16632f7e0b2e8383336040518463ffffffff1660e01b8152600401611f2993929190614838565b600060405180830381600087803b158015611f4357600080fd5b505af1158015611f57573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7c0a46ce3acb6a46fffede953868812e9045bc3e16fb727004e10272ddfad74e8484604051611fba92919061486a565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff16632c7e49158484336040518463ffffffff1660e01b815260040161200693929190614838565b6020604051808303816000875af1158015612025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120499190614320565b90508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcd715c6f851d1dc11755804a0c2e5da8792da275e44c1ee713771d7479bce8fd8585856040516120ac939291906149bc565b60405180910390a350505050565b6120c26137d1565b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f1c3c313576907bc91320c98e637bcadb2f200b2af1b9ba3036662819961ae0d48260405161215f91906140a1565b60405180910390a25050565b8273ffffffffffffffffffffffffffffffffffffffff1663ea2bfa698383336040518463ffffffff1660e01b81526004016121a893929190614838565b600060405180830381600087803b1580156121c257600080fd5b505af11580156121d6573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f13969024d11631e5bd24be9b69a2e4ca10b7b5c028eb86e51e83fc0a33ae2414848460405161223992919061486a565b60405180910390a3505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008273ffffffffffffffffffffffffffffffffffffffff16637b6880ca6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156122eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230f9190614320565b905060008373ffffffffffffffffffffffffffffffffffffffff166388e5cd1f84846040518363ffffffff1660e01b815260040161234e92919061438f565b602060405180830381865afa15801561236b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238f9190614320565b90508373ffffffffffffffffffffffffffffffffffffffff1663a09bf8c23485336040518463ffffffff1660e01b81526004016123cd929190614498565b6000604051808303818588803b1580156123e657600080fd5b505af11580156123fa573d6000803e3d6000fd5b50505050508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f39feb2a23d1a328f05ec9c6c1814935f849cc7d514d36093ee78f6083b6a39bc858460405161245e92919061438f565b60405180910390a350505050565b60008373ffffffffffffffffffffffffffffffffffffffff16637b6880ca6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156124bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124df9190614320565b905060008473ffffffffffffffffffffffffffffffffffffffff166388e5cd1f85859050846040518363ffffffff1660e01b815260040161252192919061438f565b602060405180830381865afa15801561253e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125629190614320565b90508473ffffffffffffffffffffffffffffffffffffffff16631ad30cf8348686336040518563ffffffff1660e01b81526004016125a293929190614838565b6000604051808303818588803b1580156125bb57600080fd5b505af11580156125cf573d6000803e3d6000fd5b50505050508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f32112d490671aaefcf995d4fa6526582a02c11a479dffb45b19b4d10e44f9c4e8686888890508660405161263a949392919061497c565b60405180910390a35050505050565b6000838390501161268f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612686906145a7565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa1580156126dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270091906146e4565b905060008573ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612751573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127759190614362565b905060008673ffffffffffffffffffffffffffffffffffffffff166365b962318787905085600001516040518363ffffffff1660e01b81526004016127bb92919061438f565b602060405180830381865afa1580156127d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fc9190614320565b905060008773ffffffffffffffffffffffffffffffffffffffff16634c4cbac4348989336040518563ffffffff1660e01b815260040161283e93929190614838565b60206040518083038185885af115801561285c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128819190614320565b905061288e85848361384f565b8773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2611defd53a4a87419d2078554db30aeaddd9ddfdc5990da2bbdc8d589f5e4d68989868a6040516128f1949392919061478c565b60405180910390a35050505050505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60056020528060005260406000206000915054906101000a900460ff1681565b60026020528060005260406000206000915054906101000a900460ff1681565b600084849050116129df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d6906145a7565b60405180910390fd5b60008573ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa158015612a2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5091906146e4565b905060008673ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac59190614362565b905060008773ffffffffffffffffffffffffffffffffffffffff166388e5cd1f8888905085600001516040518363ffffffff1660e01b8152600401612b0b92919061438f565b602060405180830381865afa158015612b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4c9190614320565b905060008873ffffffffffffffffffffffffffffffffffffffff1663244117b4898989336040518563ffffffff1660e01b8152600401612b8f949392919061478c565b6020604051808303816000875af1158015612bae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd29190614320565b9050612bdf85848361384f565b8873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8f3673bd023cc34f252b9e7d0a0dd6496592b87006673a974d1d621b5a93e15e8a8a868a604051612c42949392919061478c565b60405180910390a3505050505050505050565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111612d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d10906148da565b60405180910390fd5b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e1b573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612e15573d6000803e3d6000fd5b50612e9b565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612e56929190613b81565b6020604051808303816000875af1158015612e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e99919061490f565b505b5050565b60036020528060005260406000206000915054906101000a900460ff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612f1d6137d1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8390614a60565b60405180910390fd5b612f9581613a37565b50565b60066020528060005260406000206000915054906101000a900460ff1681565b60008473ffffffffffffffffffffffffffffffffffffffff1663b8f4bd7b8484336040518463ffffffff1660e01b8152600401612ff793929190614838565b6020604051808303816000875af1158015613016573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303a9190614320565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f340be5e2b666ac1549a2ea4c8e2cd4b09ce5dbf37615091ae092d89630a92f7d8585888660405161309f949392919061497c565b60405180910390a35050505050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61310c6137d1565b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167ff1a7d235323609d0e57be8421b6b457060a5778dce9db39be3d530b141a3c709826040516131a991906140a1565b60405180910390a25050565b600034905060005b868690508110156137775760008585838181106131dd576131dc6142dc565b5b90506020028101906131ef91906144d0565b80600001906131fe91906144f8565b905011613240576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613237906145a7565b60405180910390fd5b6000878783818110613255576132546142dc565b5b905060200201602081019061326a9190613ef1565b73ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa1580156132b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d891906146e4565b905060008888848181106132ef576132ee6142dc565b5b90506020020160208101906133049190613ef1565b73ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af1158015613350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133749190614362565b9050600089898581811061338b5761338a6142dc565b5b90506020020160208101906133a09190613ef1565b73ffffffffffffffffffffffffffffffffffffffff166365b962318989878181106133ce576133cd6142dc565b5b90506020028101906133e091906144d0565b80600001906133ef91906144f8565b905085600001516040518363ffffffff1660e01b815260040161341392919061438f565b602060405180830381865afa158015613430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134549190614320565b905060008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036135bd57818610156134ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c590614415565b60405180910390fd5b81866134da9190614464565b95508a8a868181106134ef576134ee6142dc565b5b90506020020160208101906135049190613ef1565b73ffffffffffffffffffffffffffffffffffffffff16634c4cbac4838b8b89818110613533576135326142dc565b5b905060200281019061354591906144d0565b806000019061355491906144f8565b336040518563ffffffff1660e01b815260040161357393929190614838565b60206040518083038185885af1158015613591573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906135b69190614320565b9050613699565b8a8a868181106135d0576135cf6142dc565b5b90506020020160208101906135e59190613ef1565b73ffffffffffffffffffffffffffffffffffffffff16634c4cbac48a8a88818110613613576136126142dc565b5b905060200281019061362591906144d0565b806000019061363491906144f8565b336040518463ffffffff1660e01b815260040161365393929190614838565b6020604051808303816000875af1158015613672573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136969190614320565b90505b6136a487848361384f565b8a8a868181106136b7576136b66142dc565b5b90506020020160208101906136cc9190613ef1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2611defd53a4a87419d2078554db30aeaddd9ddfdc5990da2bbdc8d589f5e4d68b8b8981811061372d5761372c6142dc565b5b905060200281019061373f91906144d0565b806000019061374e91906144f8565b868c604051613760949392919061478c565b60405180910390a3846001019450505050506131bd565b5060008111156137c9573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156137c7573d6000803e3d6000fd5b505b505050505050565b6137d9613afb565b73ffffffffffffffffffffffffffffffffffffffff166137f7611ec3565b73ffffffffffffffffffffffffffffffffffffffff161461384d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384490614acc565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146139a65760006138a4600154670de0b6b3a764000084613b039092919063ffffffff16565b9050600081836138b49190614464565b905080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139059190614aec565b9250508190555081600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139989190614aec565b925050819055505050613a32565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613a315780600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a299190614aec565b925050819055505b5b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600082840290508284820414841517613b1b57600080fd5b81810490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b5282613b27565b9050919050565b613b6281613b47565b82525050565b6000819050919050565b613b7b81613b68565b82525050565b6000604082019050613b966000830185613b59565b613ba36020830184613b72565b9392505050565b6000604051905090565b600080fd5b600080fd5b613bc781613b47565b8114613bd257600080fd5b50565b600081359050613be481613bbe565b92915050565b613bf381613b68565b8114613bfe57600080fd5b50565b600081359050613c1081613bea565b92915050565b60008060408385031215613c2d57613c2c613bb4565b5b6000613c3b85828601613bd5565b9250506020613c4c85828601613c01565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c7b57613c7a613c56565b5b8235905067ffffffffffffffff811115613c9857613c97613c5b565b5b602083019150836020820283011115613cb457613cb3613c60565b5b9250929050565b60008083601f840112613cd157613cd0613c56565b5b8235905067ffffffffffffffff811115613cee57613ced613c5b565b5b602083019150836020820283011115613d0a57613d09613c60565b5b9250929050565b60008060008060408587031215613d2b57613d2a613bb4565b5b600085013567ffffffffffffffff811115613d4957613d48613bb9565b5b613d5587828801613c65565b9450945050602085013567ffffffffffffffff811115613d7857613d77613bb9565b5b613d8487828801613cbb565b925092505092959194509250565b60008060408385031215613da957613da8613bb4565b5b6000613db785828601613bd5565b9250506020613dc885828601613bd5565b9150509250929050565b60008083601f840112613de857613de7613c56565b5b8235905067ffffffffffffffff811115613e0557613e04613c5b565b5b602083019150836020820283011115613e2157613e20613c60565b5b9250929050565b60008060008060008060006080888a031215613e4757613e46613bb4565b5b600088013567ffffffffffffffff811115613e6557613e64613bb9565b5b613e718a828b01613c65565b9750975050602088013567ffffffffffffffff811115613e9457613e93613bb9565b5b613ea08a828b01613dd2565b9550955050604088013567ffffffffffffffff811115613ec357613ec2613bb9565b5b613ecf8a828b01613cbb565b93509350506060613ee28a828b01613bd5565b91505092959891949750929550565b600060208284031215613f0757613f06613bb4565b5b6000613f1584828501613bd5565b91505092915050565b60008115159050919050565b613f3381613f1e565b8114613f3e57600080fd5b50565b600081359050613f5081613f2a565b92915050565b60008060408385031215613f6d57613f6c613bb4565b5b6000613f7b85828601613bd5565b9250506020613f8c85828601613f41565b9150509250929050565b60008060008060408587031215613fb057613faf613bb4565b5b600085013567ffffffffffffffff811115613fce57613fcd613bb9565b5b613fda87828801613c65565b9450945050602085013567ffffffffffffffff811115613ffd57613ffc613bb9565b5b61400987828801613dd2565b925092505092959194509250565b6000806000604084860312156140305761402f613bb4565b5b600061403e86828701613bd5565b935050602084013567ffffffffffffffff81111561405f5761405e613bb9565b5b61406b86828701613cbb565b92509250509250925092565b600060208201905061408c6000830184613b72565b92915050565b61409b81613f1e565b82525050565b60006020820190506140b66000830184614092565b92915050565b600080600080606085870312156140d6576140d5613bb4565b5b60006140e487828801613bd5565b94505060206140f587828801613c01565b935050604085013567ffffffffffffffff81111561411657614115613bb9565b5b61412287828801613cbb565b925092505092959194509250565b60006020820190506141456000830184613b59565b92915050565b6000806000806060858703121561416557614164613bb4565b5b600061417387828801613bd5565b945050602085013567ffffffffffffffff81111561419457614193613bb9565b5b6141a087828801613cbb565b935093505060406141b387828801613bd5565b91505092959194509250565b6000806000806000608086880312156141db576141da613bb4565b5b60006141e988828901613bd5565b955050602086013567ffffffffffffffff81111561420a57614209613bb9565b5b61421688828901613cbb565b9450945050604061422988828901613c01565b925050606061423a88828901613bd5565b9150509295509295909350565b60008060008060006060868803121561426357614262613bb4565b5b600086013567ffffffffffffffff81111561428157614280613bb9565b5b61428d88828901613c65565b9550955050602086013567ffffffffffffffff8111156142b0576142af613bb9565b5b6142bc88828901613dd2565b935093505060406142cf88828901613bd5565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061431a81613bea565b92915050565b60006020828403121561433657614335613bb4565b5b60006143448482850161430b565b91505092915050565b60008151905061435c81613bbe565b92915050565b60006020828403121561437857614377613bb4565b5b60006143868482850161434d565b91505092915050565b60006040820190506143a46000830185613b72565b6143b16020830184613b72565b9392505050565b600082825260208201905092915050565b7f6e6f7420656e6f67682076616c75650000000000000000000000000000000000600082015250565b60006143ff600f836143b8565b915061440a826143c9565b602082019050919050565b6000602082019050818103600083015261442e816143f2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061446f82613b68565b915061447a83613b68565b925082820390508181111561449257614491614435565b5b92915050565b60006040820190506144ad6000830185613b72565b6144ba6020830184613b59565b9392505050565b600080fd5b600080fd5b600080fd5b6000823560016020038336030381126144ec576144eb6144c1565b5b80830191505092915050565b60008083356001602003843603038112614515576145146144c1565b5b80840192508235915067ffffffffffffffff821115614537576145366144c6565b5b602083019250602082023603831315614553576145526144cb565b5b509250929050565b7f4e6f742030000000000000000000000000000000000000000000000000000000600082015250565b60006145916005836143b8565b915061459c8261455b565b602082019050919050565b600060208201905081810360008301526145c081614584565b9050919050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614615826145cc565b810181811067ffffffffffffffff82111715614634576146336145dd565b5b80604052505050565b6000614647613baa565b9050614653828261460c565b919050565b600060a0828403121561466e5761466d6145c7565b5b61467860a061463d565b905060006146888482850161430b565b600083015250602061469c8482850161430b565b60208301525060406146b08482850161430b565b60408301525060606146c48482850161430b565b60608301525060806146d88482850161430b565b60808301525092915050565b600060a082840312156146fa576146f9613bb4565b5b600061470884828501614658565b91505092915050565b600082825260208201905092915050565b600080fd5b82818337505050565b600061473c8385614711565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561476f5761476e614722565b5b602083029250614780838584614727565b82840190509392505050565b600060608201905081810360008301526147a7818688614730565b90506147b66020830185613b72565b6147c36040830184613b59565b95945050505050565b7f6f6e6c79466163746f7279000000000000000000000000000000000000000000600082015250565b6000614802600b836143b8565b915061480d826147cc565b602082019050919050565b60006020820190508181036000830152614831816147f5565b9050919050565b60006040820190508181036000830152614853818587614730565b90506148626020830184613b59565b949350505050565b60006020820190508181036000830152614885818486614730565b90509392505050565b7f4e6f742046656500000000000000000000000000000000000000000000000000600082015250565b60006148c46007836143b8565b91506148cf8261488e565b602082019050919050565b600060208201905081810360008301526148f3816148b7565b9050919050565b60008151905061490981613f2a565b92915050565b60006020828403121561492557614924613bb4565b5b6000614933848285016148fa565b91505092915050565b60006060820190506149516000830187613b72565b8181036020830152614964818587614730565b90506149736040830184613b59565b95945050505050565b60006060820190508181036000830152614997818688614730565b90506149a66020830185613b72565b6149b36040830184613b72565b95945050505050565b600060408201905081810360008301526149d7818587614730565b90506149e66020830184613b72565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a4a6026836143b8565b9150614a55826149ee565b604082019050919050565b60006020820190508181036000830152614a7981614a3d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614ab66020836143b8565b9150614ac182614a80565b602082019050919050565b60006020820190508181036000830152614ae581614aa9565b9050919050565b6000614af782613b68565b9150614b0283613b68565b9250828201905080821115614b1a57614b19614435565b5b9291505056fea26469706673582212201b41439a426a5ce7027ca46ecb584a6358589ab6eeb3c423de3e9ea990c773d164736f6c63430008110033
Deployed Bytecode Sourcemap
13861:18145:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31964:31;31973:10;31985:9;31964:31;;;;;;;:::i;:::-;;;;;;;;13861:18145;;;;;30667:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18475:1312;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30906:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21142:1193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27070:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31091:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26065:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17583:409;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25819:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30395:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29075:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14333:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28894:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26532:530;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28683:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12974:103;;;;;;;;;;;;;:::i;:::-;;25135:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29855:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29569;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12326:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17386:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24863:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30139:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26282:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28007:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18027:410;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19832:449;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22374:746;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28239:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14449:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14099:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20320:781;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27220:503;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14215:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28471:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13232:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14563:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25488:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27783:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29295:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23161:1658;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30667:195;12212:13;:11;:13::i;:::-;30806:5:::1;30800:32;;;30833:20;30800:54;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30667:195:::0;;:::o;18475:1312::-;18617:18;18638:9;18617:30;;18663:9;18658:1025;18682:9;;:16;;18678:1;:20;18658:1025;;;18717:21;18747:9;;18757:1;18747:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;18741:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18717:58;;18790:21;18820:9;;18830:1;18820:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;18814:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18790:58;;18863:17;18889:9;;18899:1;18889:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;18883:35;;;18937:16;;18954:1;18937:19;;;;;;;:::i;:::-;;;;;;;;18975:13;18883:120;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18863:140;;19049:1;19024:27;;:13;:27;;;19020:420;;19094:9;19080:10;:23;;19072:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;19156:9;19142:23;;;;;:::i;:::-;;;19190:9;;19200:1;19190:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;19184:27;;;19219:9;19252:16;;19269:1;19252:19;;;;;;;:::i;:::-;;;;;;;;19294:10;19184:139;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19020:420;;;19370:9;;19380:1;19370:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;19364:27;;;19392:16;;19409:1;19392:19;;;;;;;:::i;:::-;;;;;;;;19413:10;19364:60;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19020:420;19516:9;;19526:1;19516:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;19461:148;;19487:10;19461:148;;;19547:16;;19564:1;19547:19;;;;;;;:::i;:::-;;;;;;;;19585:9;19461:148;;;;;;;:::i;:::-;;;;;;;;19653:3;;;;;18702:981;;;18658:1025;;;;19710:1;19697:10;:14;19693:87;;;19736:10;19728:28;;:40;19757:10;19728:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19693:87;18606:1181;18475:1312;;;;:::o;30906:153::-;12212:13;:11;:13::i;:::-;31023:5:::1;31017:22;;;31040:10;31017:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30906:153:::0;;:::o;21142:1193::-;21356:9;21351:977;21375:9;;:16;;21371:1;:20;21351:977;;;21450:1;21418:10;;21429:1;21418:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;:29;;:33;21410:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;21476:31;21516:9;;21526:1;21516:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21510:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21476:67;;21558:21;21588:9;;21598:1;21588:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21582:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21558:58;;21631:17;21657:9;;21667:1;21657:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21651:35;;;21705:10;;21716:1;21705:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;:29;;21753:9;:19;;;21651:136;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21631:156;;21804:21;21834:9;;21844:1;21834:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21828:32;;;21879:10;;21890:1;21879:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;21920:11;;21932:1;21920:14;;;;;;;:::i;:::-;;;;;;;;21953:10;21828:150;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21804:174;;21995:52;22006:10;22018:13;22033;21995:10;:52::i;:::-;22129:9;;22139:1;22129:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22069:185;;22100:10;22069:185;;;22160:10;;22171:1;22160:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;22201:9;22229:10;22069:185;;;;;;;;;:::i;:::-;;;;;;;;22298:3;;;;;21395:933;;;;21351:977;;;;21142:1193;;;;;;;:::o;27070:106::-;27138:5;27132:24;;;27157:10;27132:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27070:106;:::o;31091:119::-;15073:4;15041:36;;:16;:28;15058:10;15041:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;15033:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;31186:5:::1;31175:27;;;31193:8;31175:27;;;;;;:::i;:::-;;;;;;;;31091:119:::0;;:::o;26065:209::-;26158:5;26152:27;;;26180:12;26194:10;26152:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26246:5;26219:47;;26234:10;26219:47;;;26253:12;26219:47;;;;;;:::i;:::-;;;;;;;;26065:209;;:::o;17583:409::-;17715:9;17710:275;17734:9;;:16;;17730:1;:20;17710:275;;;17775:9;;17785:1;17775:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;17769:28;;;17798:10;;17809:1;17798:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;17822:10;17769:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17874:9;;17884:1;17874:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;17853:58;;17862:10;17853:58;;;17888:10;;17899:1;17888:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;17853:58;;;;;;;:::i;:::-;;;;;;;;17955:3;;;;;17710:275;;;;17583:409;;;;:::o;25819:206::-;25913:5;25907:28;;;25936:9;;25947:10;25907:51;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26000:5;25972:45;;25988:10;25972:45;;;26007:9;;25972:45;;;;;;;:::i;:::-;;;;;;;;25819:206;;;:::o;30395:219::-;12212:13;:11;:13::i;:::-;30545:8:::1;30512:18;:30;30531:10;30512:30;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;30585:10;30569:37;;;30597:8;30569:37;;;;;;:::i;:::-;;;;;;;;30395:219:::0;;:::o;29075:160::-;29164:7;29188:12;:24;29201:10;29188:24;;;;;;;;;;;;;;;:39;29213:13;29188:39;;;;;;;;;;;;;;;;29181:46;;29075:160;;;;:::o;14333:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;28894:137::-;28968:7;28992:16;:31;29009:13;28992:31;;;;;;;;;;;;;;;;28985:38;;28894:137;;;:::o;26532:530::-;12212:13;:11;:13::i;:::-;26654:17:::1;26674:16;:31;26691:13;26674:31;;;;;;;;;;;;;;;;26654:51;;26755:1;26743:9;:13;26735:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;26833:1;26799:16;:31;26816:13;26799:31;;;;;;;;;;;;;;;:35;;;;26899:1;26874:27;;:13;:27;;::::0;26870:185:::1;;26926:10;26918:28;;:39;26947:9;26918:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;26870:185;;;26997:13;26990:30;;;27021:10;27033:9;26990:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26870:185;26643:419;26532:530:::0;:::o;28683:168::-;28784:4;28813:18;:30;28832:10;28813:30;;;;;;;;;;;;;;;;;;;;;;;;;28806:37;;28683:168;;;:::o;12974:103::-;12212:13;:11;:13::i;:::-;13039:30:::1;13066:1;13039:18;:30::i;:::-;12974:103::o:0;25135:310::-;25276:17;25302:5;25296:23;;;25320:12;25334:9;;25345:10;25296:60;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25276:80;;25395:5;25372:65;;25383:10;25372:65;;;25402:9;;25413:12;25427:9;25372:65;;;;;;;;;:::i;:::-;;;;;;;;25265:180;25135:310;;;;:::o;29855:237::-;12212:13;:11;:13::i;:::-;30017:8:::1;29978:21;:36;30000:13;29978:36;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;30060:13;30041:43;;;30075:8;30041:43;;;;;;:::i;:::-;;;;;;;;29855:237:::0;;:::o;29569:::-;12212:13;:11;:13::i;:::-;29731:8:::1;29692:21;:36;29714:13;29692:36;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;29774:13;29755:43;;;29789:8;29755:43;;;;;;:::i;:::-;;;;;;;;29569:237:::0;;:::o;12326:87::-;12372:7;12399:6;;;;;;;;;;;12392:13;;12326:87;:::o;17386:189::-;17475:5;17469:21;;;17491:9;;17502:10;17469:44;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17550:5;17529:38;;17538:10;17529:38;;;17557:9;;17529:38;;;;;;;:::i;:::-;;;;;;;;17386:189;;;:::o;24863:229::-;24949:17;24975:5;24969:24;;;24994:9;;25005:10;24969:47;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24949:67;;25056:5;25032:52;;25044:10;25032:52;;;25063:9;;25074;25032:52;;;;;;;;:::i;:::-;;;;;;;;24938:154;24863:229;;;:::o;30139:207::-;12212:13;:11;:13::i;:::-;30281:8:::1;30252:16;:26;30269:8;30252:26;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;30319:8;30305:33;;;30329:8;30305:33;;;;;;:::i;:::-;;;;;;;;30139:207:::0;;:::o;26282:205::-;26381:5;26375:25;;;26401:9;;26412:10;26375:48;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26462:5;26437:42;;26450:10;26437:42;;;26469:9;;26437:42;;;;;;;:::i;:::-;;;;;;;;26282:205;;;:::o;28007:180::-;28114:4;28143:21;:36;28165:13;28143:36;;;;;;;;;;;;;;;;;;;;;;;;;28136:43;;28007:180;;;:::o;18027:410::-;18109:21;18139:5;18133:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18109:51;;18171:17;18197:5;18191:28;;;18234:12;18261:13;18191:94;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18171:114;;18304:5;18298:20;;;18326:9;18337:12;18351:10;18298:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18398:5;18378:51;;18386:10;18378:51;;;18405:12;18419:9;18378:51;;;;;;;:::i;:::-;;;;;;;;18098:339;;18027:410;;:::o;19832:449::-;19943:21;19973:5;19967:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19943:51;;20005:17;20031:5;20025:28;;;20068:9;;:16;;20099:13;20025:98;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20005:118;;20140:5;20134:18;;;20160:9;20171;;20182:10;20134:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20227:5;20209:64;;20215:10;20209:64;;;20234:9;;20245;;:16;;20263:9;20209:64;;;;;;;;;:::i;:::-;;;;;;;;19932:349;;19832:449;;;:::o;22374:746::-;22550:1;22531:9;;:16;;:20;22523:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;22572:31;22612:5;22606:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22572:60;;22643:21;22673:5;22667:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22643:51;;22705:17;22731:5;22725:27;;;22767:9;;:16;;22798:9;:19;;;22725:103;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22705:123;;22841:21;22871:5;22865:25;;;22898:9;22923;;22947:10;22865:103;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22841:127;;22979:52;22990:10;23002:13;23017;22979:10;:52::i;:::-;23072:5;23047:65;;23060:10;23047:65;;;23079:9;;23090;23101:10;23047:65;;;;;;;;;:::i;:::-;;;;;;;;22512:608;;;;22374:746;;;;:::o;28239:180::-;28346:4;28375:21;:36;28397:13;28375:36;;;;;;;;;;;;;;;;;;;;;;;;;28368:43;;28239:180;;;:::o;14449:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;14099:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;20320:781::-;20520:1;20501:9;;:16;;:20;20493:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;20542:31;20582:5;20576:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20542:60;;20613:21;20643:5;20637:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20613:51;;20675:17;20701:5;20695:28;;;20738:9;;:16;;20769:9;:19;;;20695:104;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20675:124;;20812:21;20842:5;20836:25;;;20876:9;;20900:13;20928:10;20836:113;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20812:137;;20960:52;20971:10;20983:13;20998;20960:10;:52::i;:::-;21053:5;21028:65;;21041:10;21028:65;;;21060:9;;21071;21082:10;21028:65;;;;;;;;;:::i;:::-;;;;;;;;20482:619;;;;20320:781;;;;;:::o;27220:503::-;27299:17;27319:12;:24;27332:10;27319:24;;;;;;;;;;;;;;;:39;27344:13;27319:39;;;;;;;;;;;;;;;;27299:59;;27408:1;27396:9;:13;27388:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;27494:1;27452:12;:24;27465:10;27452:24;;;;;;;;;;;;;;;:39;27477:13;27452:39;;;;;;;;;;;;;;;:43;;;;27560:1;27535:27;;:13;:27;;;27531:185;;27587:10;27579:28;;:39;27608:9;27579:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27531:185;;;27658:13;27651:30;;;27682:10;27694:9;27651:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27531:185;27288:435;27220:503;:::o;14215:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;28471:160::-;28568:4;28597:16;:26;28614:8;28597:26;;;;;;;;;;;;;;;;;;;;;;;;;28590:33;;28471:160;;;:::o;13232:201::-;12212:13;:11;:13::i;:::-;13341:1:::1;13321:22;;:8;:22;;::::0;13313:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;13397:28;13416:8;13397:18;:28::i;:::-;13232:201:::0;:::o;14563:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;25488:290::-;25627:17;25653:5;25647:21;;;25669:9;;25680:10;25647:44;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25627:64;;25728:5;25707:63;;25716:10;25707:63;;;25735:9;;25746:12;25760:9;25707:63;;;;;;;;;:::i;:::-;;;;;;;;25616:162;25488:290;;;;:::o;27783:172::-;27886:4;27915:19;:32;27935:11;27915:32;;;;;;;;;;;;;;;;;;;;;;;;;27908:39;;27783:172;;;:::o;29295:225::-;12212:13;:11;:13::i;:::-;29449:8:::1;29414:19;:32;29434:11;29414:32;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;29490:11;29473:39;;;29503:8;29473:39;;;;;;:::i;:::-;;;;;;;;29295:225:::0;;:::o;23161:1658::-;23329:18;23350:9;23329:30;;23375:9;23370:1345;23394:9;;:16;;23390:1;:20;23370:1345;;;23469:1;23437:10;;23448:1;23437:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;:29;;:33;23429:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;23495:31;23535:9;;23545:1;23535:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;23529:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23495:67;;23577:21;23607:9;;23617:1;23607:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;23601:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23577:58;;23650:17;23676:9;;23686:1;23676:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;23670:34;;;23723:10;;23734:1;23723:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;:29;;23771:9;:19;;;23670:135;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23650:155;;23822:21;23887:1;23862:27;;:13;:27;;;23858:510;;23932:9;23918:10;:23;;23910:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;23994:9;23980:23;;;;;:::i;:::-;;;24046:9;;24056:1;24046:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;24040:32;;;24102:9;24131:10;;24142:1;24131:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;24155:10;24040:126;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24024:142;;23858:510;;;24229:9;;24239:1;24229:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;24223:32;;;24278:10;;24289:1;24278:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;24323:10;24223:129;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24207:145;;23858:510;24384:52;24395:10;24407:13;24422;24384:10;:52::i;:::-;24516:9;;24526:1;24516:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;24456:185;;24487:10;24456:185;;;24547:10;;24558:1;24547:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;24588:9;24616:10;24456:185;;;;;;;;;:::i;:::-;;;;;;;;24685:3;;;;;23414:1301;;;;23370:1345;;;;24742:1;24729:10;:14;24725:87;;;24768:10;24760:28;;:40;24789:10;24760:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24725:87;23318:1501;23161:1658;;;;;:::o;12491:132::-;12566:12;:10;:12::i;:::-;12555:23;;:7;:5;:7::i;:::-;:23;;;12547:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12491:132::o;31265:648::-;31431:1;31409:24;;:10;:24;;;31405:501;;31450:21;31474:109;31511:17;;142:4;31474:13;:18;;:109;;;;;:::i;:::-;31450:133;;31598:20;31637:13;31621;:29;;;;:::i;:::-;31598:52;;31700:12;31665:16;:31;31682:13;31665:31;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;31770:13;31727:12;:24;31740:10;31727:24;;;;;;;;;;;;;;;:39;31752:13;31727:39;;;;;;;;;;;;;;;;:56;;;;;;;:::i;:::-;;;;;;;;31435:360;;31405:501;;;31827:1;31805:24;;:10;:24;;;31801:105;;31881:13;31846:16;:31;31863:13;31846:31;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;31801:105;31405:501;31265:648;;;:::o;13593:191::-;13667:16;13686:6;;;;;;;;;;;13667:25;;13712:8;13703:6;;:17;;;;;;;;;;;;;;;;;;13767:8;13736:40;;13757:8;13736:40;;;;;;;;;;;;13656:128;13593:191;:::o;10877:98::-;10930:7;10957:10;10950:17;;10877:98;:::o;155:519::-;266:9;366:1;363;359:9;354:14;;488:1;484;481;477:9;474:16;470:1;463:9;460:31;450:89;;522:1;519;512:12;450:89;647:8;644:1;640:16;635:21;;155:519;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;910:75::-;943:6;976:2;970:9;960:19;;910:75;:::o;991:117::-;1100:1;1097;1090:12;1114:117;1223:1;1220;1213:12;1237:122;1310:24;1328:5;1310:24;:::i;:::-;1303:5;1300:35;1290:63;;1349:1;1346;1339:12;1290:63;1237:122;:::o;1365:139::-;1411:5;1449:6;1436:20;1427:29;;1465:33;1492:5;1465:33;:::i;:::-;1365:139;;;;:::o;1510:122::-;1583:24;1601:5;1583:24;:::i;:::-;1576:5;1573:35;1563:63;;1622:1;1619;1612:12;1563:63;1510:122;:::o;1638:139::-;1684:5;1722:6;1709:20;1700:29;;1738:33;1765:5;1738:33;:::i;:::-;1638:139;;;;:::o;1783:474::-;1851:6;1859;1908:2;1896:9;1887:7;1883:23;1879:32;1876:119;;;1914:79;;:::i;:::-;1876:119;2034:1;2059:53;2104:7;2095:6;2084:9;2080:22;2059:53;:::i;:::-;2049:63;;2005:117;2161:2;2187:53;2232:7;2223:6;2212:9;2208:22;2187:53;:::i;:::-;2177:63;;2132:118;1783:474;;;;;:::o;2263:117::-;2372:1;2369;2362:12;2386:117;2495:1;2492;2485:12;2509:117;2618:1;2615;2608:12;2649:568;2722:8;2732:6;2782:3;2775:4;2767:6;2763:17;2759:27;2749:122;;2790:79;;:::i;:::-;2749:122;2903:6;2890:20;2880:30;;2933:18;2925:6;2922:30;2919:117;;;2955:79;;:::i;:::-;2919:117;3069:4;3061:6;3057:17;3045:29;;3123:3;3115:4;3107:6;3103:17;3093:8;3089:32;3086:41;3083:128;;;3130:79;;:::i;:::-;3083:128;2649:568;;;;;:::o;3240:::-;3313:8;3323:6;3373:3;3366:4;3358:6;3354:17;3350:27;3340:122;;3381:79;;:::i;:::-;3340:122;3494:6;3481:20;3471:30;;3524:18;3516:6;3513:30;3510:117;;;3546:79;;:::i;:::-;3510:117;3660:4;3652:6;3648:17;3636:29;;3714:3;3706:4;3698:6;3694:17;3684:8;3680:32;3677:41;3674:128;;;3721:79;;:::i;:::-;3674:128;3240:568;;;;;:::o;3814:934::-;3936:6;3944;3952;3960;4009:2;3997:9;3988:7;3984:23;3980:32;3977:119;;;4015:79;;:::i;:::-;3977:119;4163:1;4152:9;4148:17;4135:31;4193:18;4185:6;4182:30;4179:117;;;4215:79;;:::i;:::-;4179:117;4328:80;4400:7;4391:6;4380:9;4376:22;4328:80;:::i;:::-;4310:98;;;;4106:312;4485:2;4474:9;4470:18;4457:32;4516:18;4508:6;4505:30;4502:117;;;4538:79;;:::i;:::-;4502:117;4651:80;4723:7;4714:6;4703:9;4699:22;4651:80;:::i;:::-;4633:98;;;;4428:313;3814:934;;;;;;;:::o;4754:474::-;4822:6;4830;4879:2;4867:9;4858:7;4854:23;4850:32;4847:119;;;4885:79;;:::i;:::-;4847:119;5005:1;5030:53;5075:7;5066:6;5055:9;5051:22;5030:53;:::i;:::-;5020:63;;4976:117;5132:2;5158:53;5203:7;5194:6;5183:9;5179:22;5158:53;:::i;:::-;5148:63;;5103:118;4754:474;;;;;:::o;5263:592::-;5360:8;5370:6;5420:3;5413:4;5405:6;5401:17;5397:27;5387:122;;5428:79;;:::i;:::-;5387:122;5541:6;5528:20;5518:30;;5571:18;5563:6;5560:30;5557:117;;;5593:79;;:::i;:::-;5557:117;5707:4;5699:6;5695:17;5683:29;;5761:3;5753:4;5745:6;5741:17;5731:8;5727:32;5724:41;5721:128;;;5768:79;;:::i;:::-;5721:128;5263:592;;;;;:::o;5861:1503::-;6052:6;6060;6068;6076;6084;6092;6100;6149:3;6137:9;6128:7;6124:23;6120:33;6117:120;;;6156:79;;:::i;:::-;6117:120;6304:1;6293:9;6289:17;6276:31;6334:18;6326:6;6323:30;6320:117;;;6356:79;;:::i;:::-;6320:117;6469:80;6541:7;6532:6;6521:9;6517:22;6469:80;:::i;:::-;6451:98;;;;6247:312;6626:2;6615:9;6611:18;6598:32;6657:18;6649:6;6646:30;6643:117;;;6679:79;;:::i;:::-;6643:117;6792:104;6888:7;6879:6;6868:9;6864:22;6792:104;:::i;:::-;6774:122;;;;6569:337;6973:2;6962:9;6958:18;6945:32;7004:18;6996:6;6993:30;6990:117;;;7026:79;;:::i;:::-;6990:117;7139:80;7211:7;7202:6;7191:9;7187:22;7139:80;:::i;:::-;7121:98;;;;6916:313;7268:2;7294:53;7339:7;7330:6;7319:9;7315:22;7294:53;:::i;:::-;7284:63;;7239:118;5861:1503;;;;;;;;;;:::o;7370:329::-;7429:6;7478:2;7466:9;7457:7;7453:23;7449:32;7446:119;;;7484:79;;:::i;:::-;7446:119;7604:1;7629:53;7674:7;7665:6;7654:9;7650:22;7629:53;:::i;:::-;7619:63;;7575:117;7370:329;;;;:::o;7705:90::-;7739:7;7782:5;7775:13;7768:21;7757:32;;7705:90;;;:::o;7801:116::-;7871:21;7886:5;7871:21;:::i;:::-;7864:5;7861:32;7851:60;;7907:1;7904;7897:12;7851:60;7801:116;:::o;7923:133::-;7966:5;8004:6;7991:20;7982:29;;8020:30;8044:5;8020:30;:::i;:::-;7923:133;;;;:::o;8062:468::-;8127:6;8135;8184:2;8172:9;8163:7;8159:23;8155:32;8152:119;;;8190:79;;:::i;:::-;8152:119;8310:1;8335:53;8380:7;8371:6;8360:9;8356:22;8335:53;:::i;:::-;8325:63;;8281:117;8437:2;8463:50;8505:7;8496:6;8485:9;8481:22;8463:50;:::i;:::-;8453:60;;8408:115;8062:468;;;;;:::o;8536:982::-;8682:6;8690;8698;8706;8755:2;8743:9;8734:7;8730:23;8726:32;8723:119;;;8761:79;;:::i;:::-;8723:119;8909:1;8898:9;8894:17;8881:31;8939:18;8931:6;8928:30;8925:117;;;8961:79;;:::i;:::-;8925:117;9074:80;9146:7;9137:6;9126:9;9122:22;9074:80;:::i;:::-;9056:98;;;;8852:312;9231:2;9220:9;9216:18;9203:32;9262:18;9254:6;9251:30;9248:117;;;9284:79;;:::i;:::-;9248:117;9397:104;9493:7;9484:6;9473:9;9469:22;9397:104;:::i;:::-;9379:122;;;;9174:337;8536:982;;;;;;;:::o;9524:704::-;9619:6;9627;9635;9684:2;9672:9;9663:7;9659:23;9655:32;9652:119;;;9690:79;;:::i;:::-;9652:119;9810:1;9835:53;9880:7;9871:6;9860:9;9856:22;9835:53;:::i;:::-;9825:63;;9781:117;9965:2;9954:9;9950:18;9937:32;9996:18;9988:6;9985:30;9982:117;;;10018:79;;:::i;:::-;9982:117;10131:80;10203:7;10194:6;10183:9;10179:22;10131:80;:::i;:::-;10113:98;;;;9908:313;9524:704;;;;;:::o;10234:222::-;10327:4;10365:2;10354:9;10350:18;10342:26;;10378:71;10446:1;10435:9;10431:17;10422:6;10378:71;:::i;:::-;10234:222;;;;:::o;10462:109::-;10543:21;10558:5;10543:21;:::i;:::-;10538:3;10531:34;10462:109;;:::o;10577:210::-;10664:4;10702:2;10691:9;10687:18;10679:26;;10715:65;10777:1;10766:9;10762:17;10753:6;10715:65;:::i;:::-;10577:210;;;;:::o;10793:849::-;10897:6;10905;10913;10921;10970:2;10958:9;10949:7;10945:23;10941:32;10938:119;;;10976:79;;:::i;:::-;10938:119;11096:1;11121:53;11166:7;11157:6;11146:9;11142:22;11121:53;:::i;:::-;11111:63;;11067:117;11223:2;11249:53;11294:7;11285:6;11274:9;11270:22;11249:53;:::i;:::-;11239:63;;11194:118;11379:2;11368:9;11364:18;11351:32;11410:18;11402:6;11399:30;11396:117;;;11432:79;;:::i;:::-;11396:117;11545:80;11617:7;11608:6;11597:9;11593:22;11545:80;:::i;:::-;11527:98;;;;11322:313;10793:849;;;;;;;:::o;11648:222::-;11741:4;11779:2;11768:9;11764:18;11756:26;;11792:71;11860:1;11849:9;11845:17;11836:6;11792:71;:::i;:::-;11648:222;;;;:::o;11876:849::-;11980:6;11988;11996;12004;12053:2;12041:9;12032:7;12028:23;12024:32;12021:119;;;12059:79;;:::i;:::-;12021:119;12179:1;12204:53;12249:7;12240:6;12229:9;12225:22;12204:53;:::i;:::-;12194:63;;12150:117;12334:2;12323:9;12319:18;12306:32;12365:18;12357:6;12354:30;12351:117;;;12387:79;;:::i;:::-;12351:117;12500:80;12572:7;12563:6;12552:9;12548:22;12500:80;:::i;:::-;12482:98;;;;12277:313;12629:2;12655:53;12700:7;12691:6;12680:9;12676:22;12655:53;:::i;:::-;12645:63;;12600:118;11876:849;;;;;;;:::o;12731:995::-;12844:6;12852;12860;12868;12876;12925:3;12913:9;12904:7;12900:23;12896:33;12893:120;;;12932:79;;:::i;:::-;12893:120;13052:1;13077:53;13122:7;13113:6;13102:9;13098:22;13077:53;:::i;:::-;13067:63;;13023:117;13207:2;13196:9;13192:18;13179:32;13238:18;13230:6;13227:30;13224:117;;;13260:79;;:::i;:::-;13224:117;13373:80;13445:7;13436:6;13425:9;13421:22;13373:80;:::i;:::-;13355:98;;;;13150:313;13502:2;13528:53;13573:7;13564:6;13553:9;13549:22;13528:53;:::i;:::-;13518:63;;13473:118;13630:2;13656:53;13701:7;13692:6;13681:9;13677:22;13656:53;:::i;:::-;13646:63;;13601:118;12731:995;;;;;;;;:::o;13732:1127::-;13887:6;13895;13903;13911;13919;13968:2;13956:9;13947:7;13943:23;13939:32;13936:119;;;13974:79;;:::i;:::-;13936:119;14122:1;14111:9;14107:17;14094:31;14152:18;14144:6;14141:30;14138:117;;;14174:79;;:::i;:::-;14138:117;14287:80;14359:7;14350:6;14339:9;14335:22;14287:80;:::i;:::-;14269:98;;;;14065:312;14444:2;14433:9;14429:18;14416:32;14475:18;14467:6;14464:30;14461:117;;;14497:79;;:::i;:::-;14461:117;14610:104;14706:7;14697:6;14686:9;14682:22;14610:104;:::i;:::-;14592:122;;;;14387:337;14763:2;14789:53;14834:7;14825:6;14814:9;14810:22;14789:53;:::i;:::-;14779:63;;14734:118;13732:1127;;;;;;;;:::o;14865:180::-;14913:77;14910:1;14903:88;15010:4;15007:1;15000:15;15034:4;15031:1;15024:15;15051:143;15108:5;15139:6;15133:13;15124:22;;15155:33;15182:5;15155:33;:::i;:::-;15051:143;;;;:::o;15200:351::-;15270:6;15319:2;15307:9;15298:7;15294:23;15290:32;15287:119;;;15325:79;;:::i;:::-;15287:119;15445:1;15470:64;15526:7;15517:6;15506:9;15502:22;15470:64;:::i;:::-;15460:74;;15416:128;15200:351;;;;:::o;15557:143::-;15614:5;15645:6;15639:13;15630:22;;15661:33;15688:5;15661:33;:::i;:::-;15557:143;;;;:::o;15706:351::-;15776:6;15825:2;15813:9;15804:7;15800:23;15796:32;15793:119;;;15831:79;;:::i;:::-;15793:119;15951:1;15976:64;16032:7;16023:6;16012:9;16008:22;15976:64;:::i;:::-;15966:74;;15922:128;15706:351;;;;:::o;16063:332::-;16184:4;16222:2;16211:9;16207:18;16199:26;;16235:71;16303:1;16292:9;16288:17;16279:6;16235:71;:::i;:::-;16316:72;16384:2;16373:9;16369:18;16360:6;16316:72;:::i;:::-;16063:332;;;;;:::o;16401:169::-;16485:11;16519:6;16514:3;16507:19;16559:4;16554:3;16550:14;16535:29;;16401:169;;;;:::o;16576:165::-;16716:17;16712:1;16704:6;16700:14;16693:41;16576:165;:::o;16747:366::-;16889:3;16910:67;16974:2;16969:3;16910:67;:::i;:::-;16903:74;;16986:93;17075:3;16986:93;:::i;:::-;17104:2;17099:3;17095:12;17088:19;;16747:366;;;:::o;17119:419::-;17285:4;17323:2;17312:9;17308:18;17300:26;;17372:9;17366:4;17362:20;17358:1;17347:9;17343:17;17336:47;17400:131;17526:4;17400:131;:::i;:::-;17392:139;;17119:419;;;:::o;17544:180::-;17592:77;17589:1;17582:88;17689:4;17686:1;17679:15;17713:4;17710:1;17703:15;17730:194;17770:4;17790:20;17808:1;17790:20;:::i;:::-;17785:25;;17824:20;17842:1;17824:20;:::i;:::-;17819:25;;17868:1;17865;17861:9;17853:17;;17892:1;17886:4;17883:11;17880:37;;;17897:18;;:::i;:::-;17880:37;17730:194;;;;:::o;17930:332::-;18051:4;18089:2;18078:9;18074:18;18066:26;;18102:71;18170:1;18159:9;18155:17;18146:6;18102:71;:::i;:::-;18183:72;18251:2;18240:9;18236:18;18227:6;18183:72;:::i;:::-;17930:332;;;;;:::o;18268:117::-;18377:1;18374;18367:12;18391:117;18500:1;18497;18490:12;18514:117;18623:1;18620;18613:12;18637:390;18727:4;18781:11;18768:25;18881:1;18875:4;18871:12;18860:8;18844:14;18840:29;18836:48;18816:18;18812:73;18802:168;;18889:79;;:::i;:::-;18802:168;19001:18;18991:8;18987:33;18979:41;;18732:295;18637:390;;;;:::o;19033:740::-;19126:4;19132:6;19188:11;19175:25;19288:1;19282:4;19278:12;19267:8;19251:14;19247:29;19243:48;19223:18;19219:73;19209:168;;19296:79;;:::i;:::-;19209:168;19408:18;19398:8;19394:33;19386:41;;19460:4;19447:18;19437:28;;19488:18;19480:6;19477:30;19474:117;;;19510:79;;:::i;:::-;19474:117;19618:2;19612:4;19608:13;19600:21;;19675:4;19667:6;19663:17;19647:14;19643:38;19637:4;19633:49;19630:136;;;19685:79;;:::i;:::-;19630:136;19139:634;19033:740;;;;;:::o;19779:155::-;19919:7;19915:1;19907:6;19903:14;19896:31;19779:155;:::o;19940:365::-;20082:3;20103:66;20167:1;20162:3;20103:66;:::i;:::-;20096:73;;20178:93;20267:3;20178:93;:::i;:::-;20296:2;20291:3;20287:12;20280:19;;19940:365;;;:::o;20311:419::-;20477:4;20515:2;20504:9;20500:18;20492:26;;20564:9;20558:4;20554:20;20550:1;20539:9;20535:17;20528:47;20592:131;20718:4;20592:131;:::i;:::-;20584:139;;20311:419;;;:::o;20736:117::-;20845:1;20842;20835:12;20859:102;20900:6;20951:2;20947:7;20942:2;20935:5;20931:14;20927:28;20917:38;;20859:102;;;:::o;20967:180::-;21015:77;21012:1;21005:88;21112:4;21109:1;21102:15;21136:4;21133:1;21126:15;21153:281;21236:27;21258:4;21236:27;:::i;:::-;21228:6;21224:40;21366:6;21354:10;21351:22;21330:18;21318:10;21315:34;21312:62;21309:88;;;21377:18;;:::i;:::-;21309:88;21417:10;21413:2;21406:22;21196:238;21153:281;;:::o;21440:129::-;21474:6;21501:20;;:::i;:::-;21491:30;;21530:33;21558:4;21550:6;21530:33;:::i;:::-;21440:129;;;:::o;21727:1137::-;21812:5;21856:4;21844:9;21839:3;21835:19;21831:30;21828:117;;;21864:79;;:::i;:::-;21828:117;21963:21;21979:4;21963:21;:::i;:::-;21954:30;;22048:1;22088:60;22144:3;22135:6;22124:9;22120:22;22088:60;:::i;:::-;22081:4;22074:5;22070:16;22063:86;21994:166;22220:2;22261:60;22317:3;22308:6;22297:9;22293:22;22261:60;:::i;:::-;22254:4;22247:5;22243:16;22236:86;22170:163;22394:2;22435:60;22491:3;22482:6;22471:9;22467:22;22435:60;:::i;:::-;22428:4;22421:5;22417:16;22410:86;22343:164;22568:2;22609:60;22665:3;22656:6;22645:9;22641:22;22609:60;:::i;:::-;22602:4;22595:5;22591:16;22584:86;22517:164;22743:3;22785:60;22841:3;22832:6;22821:9;22817:22;22785:60;:::i;:::-;22778:4;22771:5;22767:16;22760:86;22691:166;21727:1137;;;;:::o;22870:402::-;22965:6;23014:3;23002:9;22993:7;22989:23;22985:33;22982:120;;;23021:79;;:::i;:::-;22982:120;23141:1;23166:89;23247:7;23238:6;23227:9;23223:22;23166:89;:::i;:::-;23156:99;;23112:153;22870:402;;;;:::o;23278:184::-;23377:11;23411:6;23406:3;23399:19;23451:4;23446:3;23442:14;23427:29;;23278:184;;;;:::o;23468:117::-;23577:1;23574;23567:12;23591:98;23675:6;23670:3;23665;23652:30;23591:98;;;:::o;23725:537::-;23853:3;23874:86;23953:6;23948:3;23874:86;:::i;:::-;23867:93;;23984:66;23976:6;23973:78;23970:165;;;24054:79;;:::i;:::-;23970:165;24166:4;24158:6;24154:17;24144:27;;24181:43;24217:6;24212:3;24205:5;24181:43;:::i;:::-;24249:6;24244:3;24240:16;24233:23;;23725:537;;;;;:::o;24268:613::-;24477:4;24515:2;24504:9;24500:18;24492:26;;24564:9;24558:4;24554:20;24550:1;24539:9;24535:17;24528:47;24592:118;24705:4;24696:6;24688;24592:118;:::i;:::-;24584:126;;24720:72;24788:2;24777:9;24773:18;24764:6;24720:72;:::i;:::-;24802;24870:2;24859:9;24855:18;24846:6;24802:72;:::i;:::-;24268:613;;;;;;;:::o;24887:161::-;25027:13;25023:1;25015:6;25011:14;25004:37;24887:161;:::o;25054:366::-;25196:3;25217:67;25281:2;25276:3;25217:67;:::i;:::-;25210:74;;25293:93;25382:3;25293:93;:::i;:::-;25411:2;25406:3;25402:12;25395:19;;25054:366;;;:::o;25426:419::-;25592:4;25630:2;25619:9;25615:18;25607:26;;25679:9;25673:4;25669:20;25665:1;25654:9;25650:17;25643:47;25707:131;25833:4;25707:131;:::i;:::-;25699:139;;25426:419;;;:::o;25851:503::-;26032:4;26070:2;26059:9;26055:18;26047:26;;26119:9;26113:4;26109:20;26105:1;26094:9;26090:17;26083:47;26147:118;26260:4;26251:6;26243;26147:118;:::i;:::-;26139:126;;26275:72;26343:2;26332:9;26328:18;26319:6;26275:72;:::i;:::-;25851:503;;;;;;:::o;26360:393::-;26513:4;26551:2;26540:9;26536:18;26528:26;;26600:9;26594:4;26590:20;26586:1;26575:9;26571:17;26564:47;26628:118;26741:4;26732:6;26724;26628:118;:::i;:::-;26620:126;;26360:393;;;;;:::o;26759:157::-;26899:9;26895:1;26887:6;26883:14;26876:33;26759:157;:::o;26922:365::-;27064:3;27085:66;27149:1;27144:3;27085:66;:::i;:::-;27078:73;;27160:93;27249:3;27160:93;:::i;:::-;27278:2;27273:3;27269:12;27262:19;;26922:365;;;:::o;27293:419::-;27459:4;27497:2;27486:9;27482:18;27474:26;;27546:9;27540:4;27536:20;27532:1;27521:9;27517:17;27510:47;27574:131;27700:4;27574:131;:::i;:::-;27566:139;;27293:419;;;:::o;27718:137::-;27772:5;27803:6;27797:13;27788:22;;27819:30;27843:5;27819:30;:::i;:::-;27718:137;;;;:::o;27861:345::-;27928:6;27977:2;27965:9;27956:7;27952:23;27948:32;27945:119;;;27983:79;;:::i;:::-;27945:119;28103:1;28128:61;28181:7;28172:6;28161:9;28157:22;28128:61;:::i;:::-;28118:71;;28074:125;27861:345;;;;:::o;28212:613::-;28421:4;28459:2;28448:9;28444:18;28436:26;;28472:71;28540:1;28529:9;28525:17;28516:6;28472:71;:::i;:::-;28590:9;28584:4;28580:20;28575:2;28564:9;28560:18;28553:48;28618:118;28731:4;28722:6;28714;28618:118;:::i;:::-;28610:126;;28746:72;28814:2;28803:9;28799:18;28790:6;28746:72;:::i;:::-;28212:613;;;;;;;:::o;28831:::-;29040:4;29078:2;29067:9;29063:18;29055:26;;29127:9;29121:4;29117:20;29113:1;29102:9;29098:17;29091:47;29155:118;29268:4;29259:6;29251;29155:118;:::i;:::-;29147:126;;29283:72;29351:2;29340:9;29336:18;29327:6;29283:72;:::i;:::-;29365;29433:2;29422:9;29418:18;29409:6;29365:72;:::i;:::-;28831:613;;;;;;;:::o;29450:503::-;29631:4;29669:2;29658:9;29654:18;29646:26;;29718:9;29712:4;29708:20;29704:1;29693:9;29689:17;29682:47;29746:118;29859:4;29850:6;29842;29746:118;:::i;:::-;29738:126;;29874:72;29942:2;29931:9;29927:18;29918:6;29874:72;:::i;:::-;29450:503;;;;;;:::o;29959:225::-;30099:34;30095:1;30087:6;30083:14;30076:58;30168:8;30163:2;30155:6;30151:15;30144:33;29959:225;:::o;30190:366::-;30332:3;30353:67;30417:2;30412:3;30353:67;:::i;:::-;30346:74;;30429:93;30518:3;30429:93;:::i;:::-;30547:2;30542:3;30538:12;30531:19;;30190:366;;;:::o;30562:419::-;30728:4;30766:2;30755:9;30751:18;30743:26;;30815:9;30809:4;30805:20;30801:1;30790:9;30786:17;30779:47;30843:131;30969:4;30843:131;:::i;:::-;30835:139;;30562:419;;;:::o;30987:182::-;31127:34;31123:1;31115:6;31111:14;31104:58;30987:182;:::o;31175:366::-;31317:3;31338:67;31402:2;31397:3;31338:67;:::i;:::-;31331:74;;31414:93;31503:3;31414:93;:::i;:::-;31532:2;31527:3;31523:12;31516:19;;31175:366;;;:::o;31547:419::-;31713:4;31751:2;31740:9;31736:18;31728:26;;31800:9;31794:4;31790:20;31786:1;31775:9;31771:17;31764:47;31828:131;31954:4;31828:131;:::i;:::-;31820:139;;31547:419;;;:::o;31972:191::-;32012:3;32031:20;32049:1;32031:20;:::i;:::-;32026:25;;32065:20;32083:1;32065:20;:::i;:::-;32060:25;;32108:1;32105;32101:9;32094:16;;32129:3;32126:1;32123:10;32120:36;;;32136:18;;:::i;:::-;32120:36;31972:191;;;;:::o
Swarm Source
ipfs://1b41439a426a5ce7027ca46ecb584a6358589ab6eeb3c423de3e9ea990c773d1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $2,426.47 | 0.001656 | $4.02 |
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.