Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 16572478 | 538 days ago | IN | 0 ETH | 0.14542377 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
GaugeV2
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.11; import "./ProxyPattern/SolidlyFactory.sol"; import "./ProxyPattern/SolidlyChildImplementation.sol"; library Math { function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } } interface erc20 { function totalSupply() external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function balanceOf(address) external view returns (uint256); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); function approve(address spender, uint256 value) external returns (bool); } interface IVeV2 { function token() external view returns (address); function balanceOfNFT(uint256) external view returns (uint256); function isApprovedOrOwner(address, uint256) external view returns (bool); function ownerOf(uint256) external view returns (address); function transferFrom( address, address, uint256 ) external; } interface IBaseV2Factory { function isPair(address) external view returns (bool); } interface IBaseV2Pair { function claimFees() external returns (uint256, uint256); function tokens() external returns (address, address); } interface IBribeV2 { function notifyRewardAmount(address token, uint256 amount) external; function left(address token) external view returns (uint256); } interface IVoterV2 { function attachTokenToGauge(uint256 _tokenId, address account) external; function detachTokenFromGauge(uint256 _tokenId, address account) external; function generalFees() external view returns (address); function emitDeposit( uint256 _tokenId, address account, uint256 amount ) external; function emitWithdraw( uint256 _tokenId, address account, uint256 amount ) external; function distribute(address _gauge) external; function feeDists(address _pool) external view returns (address _feeDist); } interface IFeeDistV2 { function claimFees() external; } interface IBaseV2GeneralFees { function notifyRewardAmount(address token, uint256 amount) external; } // Gauges are used to incentivize pools, they emit reward tokens over 7 days for staked LP tokens /** * @dev Changelog: * - Deprecate constructor with initialize() * - Deprecate checkpoint and indexing system, replaced with opt-in multirewards like system * - Uses RewardRatePerWeek instead of RewardRate for reward calculations (better precision) * - Adapt _claimFees() to support transfer tax tokens * - Immutable storage slots became mutable but made sure nothing changes them after initialize() * - No longer calls voter to emit deposit and withdrawal */ contract GaugeV2 is SolidlyChildImplementation { uint256 internal constant DURATION = 7 days; // rewards are released over 7 days uint256 internal constant PRECISION = 10**44; /** * @dev storage slots start here */ // simple re-entrancy check uint256 internal _unlocked = 1; address public stake; // the LP token that needs to be staked for rewards address public _ve; // the ve token used for gauges address public solid; address public bribe; address public voter; uint256 public derivedSupply; mapping(address => uint128) public derivedBalances; mapping(address => uint256) public tokenIds; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => bool)) public isOptIn; // userAddress => rewardAddress => bool mapping(address => address[]) public userOptIns; // array of rewards the user is opted into mapping(address => mapping(address => uint256)) public userOptInsIndex; // index of pools within userOptIns userAddress =>rewardAddress => index // default snx staking contract implementation mapping(address => RewardData) public rewardData; struct RewardData { uint128 rewardRatePerWeek; uint128 derivedSupply; uint256 rewardPerTokenStored; uint40 periodFinish; uint40 lastUpdateTime; } struct UserRewardData { uint256 userRewardPerTokenPaid; uint256 userEarnedStored; } mapping(address => mapping(address => UserRewardData)) public userRewardData; // userAddress => tokenAddress => userRewardData uint256 public totalSupply; address[] public rewards; mapping(address => bool) public isReward; uint256 public fees0; uint256 public fees1; event Deposit(address indexed from, uint256 tokenId, uint256 amount); event OptIn(address indexed from, address indexed reward); event OptOut(address indexed from, address indexed reward); event Withdraw(address indexed from, uint256 tokenId, uint256 amount); event NotifyReward( address indexed from, address indexed reward, uint256 amount ); event ClawbackRewards(address indexed reward, uint256 amount); event ClaimFees(address indexed from, uint256 claimed0, uint256 claimed1); event ClaimRewards( address indexed from, address indexed reward, uint256 amount ); // simple re-entrancy check modifier lock() { require(_unlocked == 1); _unlocked = 2; _; _unlocked = 1; } function initialize( address _stake, address _bribe, address __ve, address _voter ) external onlyFactory notInitialized { _unlocked = 1; stake = _stake; bribe = _bribe; _ve = __ve; voter = _voter; solid = IVeV2(_ve).token(); } /**************************************** View Methods ****************************************/ /** * @notice Returns the balance derived based on veToken staked. Used to determine ratio of rewards streamed * @param account User address */ function derivedBalance(address account) public view returns (uint256) { if (BaseV2GaugeFactory(factoryAddress()).isBoostPaused()) { return balanceOf[account]; } else { uint256 _tokenId = tokenIds[account]; uint256 _balance = balanceOf[account]; uint256 _derived = (_balance * 40) / 100; uint256 _adjusted = 0; uint256 _supply = erc20(_ve).totalSupply(); if (account == IVeV2(_ve).ownerOf(_tokenId) && _supply > 0) { _adjusted = IVeV2(_ve).balanceOfNFT(_tokenId); _adjusted = (((totalSupply * _adjusted) / _supply) * 60) / 100; } return Math.min((_derived + _adjusted), _balance); } } /** * @dev ATTENTION ordering is flipped to (token, account) instead of (account, token) for backwards compatibility */ function earned(address token, address account) external view returns (uint256) { RewardData memory _rewardData = rewardData[token]; UserRewardData memory _userRewardData = userRewardData[account][token]; uint256 _earned = _userRewardData.userEarnedStored; if (isOptIn[account][token]) { _earned += ((derivedBalances[account] * (_rewardPerToken(_rewardData) - _userRewardData.userRewardPerTokenPaid)) / PRECISION); } return _earned; } /** * @notice Internal view method does not call _rewardPerToken() since it's always updated just before this is called * @dev ATTENTION input orders are (account, token) to comform with RewardData structures */ function _earnedFromStored(address account, address token) internal view returns (uint256) { UserRewardData memory _userRewardData = userRewardData[account][token]; uint256 _earned = (_userRewardData.userEarnedStored) + ((derivedBalances[account] * (rewardData[token].rewardPerTokenStored - _userRewardData.userRewardPerTokenPaid)) / PRECISION); return _earned; } /** * @notice Returns the last time the reward was modified or periodFinish if the reward has ended */ function lastTimeRewardApplicable(address token) external view returns (uint256) { return Math.min(block.timestamp, rewardData[token].periodFinish); } /** * @notice View method for backwards compatibility * @dev Now part of RewardData struct * @param token Reward token */ function lastUpdateTime(address token) external view returns (uint256) { return rewardData[token].lastUpdateTime; } /** * @notice Returns the amount of rewards left in the reward period * @param token Reward token */ function left(address token) external view returns (uint256) { RewardData memory _rewardData = rewardData[token]; if (block.timestamp >= _rewardData.periodFinish) { return 0; } uint256 _remaining = _rewardData.periodFinish - block.timestamp; return (_remaining * _rewardData.rewardRatePerWeek) / DURATION; } /** * @notice View method for backwards compatibility * @dev Now part of RewardData struct * @param token Reward token */ function periodFinish(address token) external view returns (uint256) { return rewardData[token].periodFinish; } /** * @notice View method for backwards compatibility * @dev Now part of RewardData struct * @param token Reward token */ function rewardPerTokenStored(address token) external view returns (uint256) { return rewardData[token].rewardPerTokenStored; } /** * @notice View method for backwards compatibility * @dev rewardRate decprecated in favour of rewardRatePerWeek since DURATION is constant * @param token Reward token */ function rewardRate(address token) external view returns (uint256) { return rewardData[token].rewardRatePerWeek / DURATION; } /** * @notice Returns the rewardsList length */ function rewardsListLength() external view returns (uint256) { return rewards.length; } /** * @notice Backwards compatible wiew method for rewardPerToken * @param token Reward token */ function rewardPerToken(address token) external view returns (uint256) { RewardData memory _rewardData = rewardData[token]; return _rewardPerToken(_rewardData); } /** * @notice view method for rewardPerToken * @dev passing RewardData instead of tokenAddress to save gas on SLOAD * @param _rewardData RewardData struct for the reward token */ function _rewardPerToken(RewardData memory _rewardData) internal view returns (uint256) { if (_rewardData.derivedSupply == 0) { return _rewardData.rewardPerTokenStored; } uint256 timeElapsed = (Math.min( block.timestamp, _rewardData.periodFinish ) - Math.min(_rewardData.lastUpdateTime, _rewardData.periodFinish)); return _rewardData.rewardPerTokenStored + uint256( ((((PRECISION / DURATION) * _rewardData.rewardRatePerWeek) / _rewardData.derivedSupply) * timeElapsed) ); } /** * @notice Backwards compatible wiew method for userRewardPerTokenStored * @dev ATTENTION input ordering is (token, account) for backwards compatibility * @param token Reward token * @param account User address */ function userRewardPerTokenStored(address token, address account) external view returns (uint256) { return userRewardData[account][token].userRewardPerTokenPaid; } /**************************************** Protocol Interaction ****************************************/ /** * @notice Calls the feeDist to claimFees from the pair * @dev Kept for backwards compatibility */ function claimFees() external returns (uint256 claimed0, uint256 claimed1) { // Fetch addresses address _feeDist = IVoterV2(voter).feeDists(stake); address[] memory tokens = new address[](2); (tokens[0], tokens[1]) = IBaseV2Pair(stake).tokens(); // Fetch current status uint256[] memory balancesBefore = new uint256[](2); balancesBefore[0] = erc20(tokens[0]).balanceOf(_feeDist); balancesBefore[1] = erc20(tokens[1]).balanceOf(_feeDist); // Call feeDist to claim fees IFeeDistV2(_feeDist).claimFees(); // Compute claimed amounts claimed0 = erc20(tokens[0]).balanceOf(_feeDist) - balancesBefore[0]; claimed1 = erc20(tokens[1]).balanceOf(_feeDist) - balancesBefore[1]; return (claimed0, claimed1); } /**************************************** User Interaction ****************************************/ modifier updateReward(address account) { uint128 _derivedBalance = derivedBalances[account]; uint256 _balanceOf = balanceOf[account]; for (uint256 i; i < userOptIns[account].length; i++) { address token = userOptIns[account][i]; RewardData memory _rewardData = rewardData[token]; // gas savings _rewardData.rewardPerTokenStored = _rewardPerToken(_rewardData); _rewardData.lastUpdateTime = uint40( Math.min(block.timestamp, _rewardData.periodFinish) ); // reduce derivedBalance for opted in pools, readjust them later rewardData[token] = _rewardData; UserRewardData memory _userRewardData = userRewardData[account][ token ]; uint256 _earnedBefore = _userRewardData.userEarnedStored; uint256 _earnedAfter = _earnedFromStored(account, token); // only update userRewardPerTokenPaid if earned goes up, // but if derivedBalance changes, update regardless (code at the end of modifier) if (_earnedAfter > _earnedBefore) { userRewardData[account][token].userEarnedStored = _earnedAfter; userRewardData[account][token] .userRewardPerTokenPaid = rewardData[token] .rewardPerTokenStored; } } _; // update balance uint128 _derivedBalanceBefore = _derivedBalance; uint256 _derivedSupply = derivedSupply; _derivedSupply -= _derivedBalanceBefore; _derivedBalance = uint128(derivedBalance(account)); derivedBalances[account] = _derivedBalance; _derivedSupply += _derivedBalance; derivedSupply = _derivedSupply; // Update derivedBalances for the opted-in pools for (uint256 i; i < userOptIns[account].length; i++) { address token = userOptIns[account][i]; uint128 _derivedSupply = rewardData[token].derivedSupply; _derivedSupply -= _derivedBalanceBefore; _derivedSupply += _derivedBalance; rewardData[token].derivedSupply = _derivedSupply; } // update userRewardPerTokenPaid anyways if derivedBalance changes if (_derivedBalanceBefore != _derivedBalance) { for (uint256 i; i < userOptIns[account].length; i++) { address token = userOptIns[account][i]; userRewardData[account][token] .userRewardPerTokenPaid = rewardData[token] .rewardPerTokenStored; } } } /** * @notice Deposits all LP tokens into the gauge, opts into solid pool by default if not already opted-in * @param tokenId The veNFT tokenId to associate with the user */ function depositAll(uint256 tokenId) external { deposit(erc20(stake).balanceOf(msg.sender), tokenId); } /** * @notice Deposits LP tokens into the gauge, opts into solid pool by default if not already opted-in * @param amount Amount to deposit * @param tokenId The veNFT tokenId to associate with the user */ function deposit(uint256 amount, uint256 tokenId) public { address _solid = solid; // opt-in to solid and the 2 base tokens if not already opted into solid if (!isOptIn[msg.sender][_solid]) { address[] memory _optInPools = new address[](3); (address _token0, address _token1) = IBaseV2Pair(stake).tokens(); _optInPools[0] = _solid; _optInPools[1] = _token0; _optInPools[2] = _token1; depositAndOptIn(amount, tokenId, _optInPools); } else { depositAndOptIn(amount, tokenId, new address[](0)); } } /** * @notice Deposits LP tokens into the gauge, opts into pools specified if not already opted-in * @param amount Amount to deposit * @param tokenId The veNFT tokenId to associate with the user * @param optInPools The reward pools to opt-in to */ function depositAndOptIn( uint256 amount, uint256 tokenId, address[] memory optInPools ) public lock updateReward(msg.sender) { require(amount > 0, "Cannot deposit 0"); _safeTransferFrom(stake, msg.sender, address(this), amount); totalSupply += amount; balanceOf[msg.sender] += amount; if (tokenId > 0) { require(IVeV2(_ve).ownerOf(tokenId) == msg.sender, "tokenId auth"); if (tokenIds[msg.sender] == 0) { tokenIds[msg.sender] = tokenId; IVoterV2(voter).attachTokenToGauge(tokenId, msg.sender); } require( tokenIds[msg.sender] == tokenId, "Different tokenId already attached" ); } else { tokenId = tokenIds[msg.sender]; } for (uint256 i = 0; i < optInPools.length; i++) { if (!isOptIn[msg.sender][optInPools[i]]) { _optIn(optInPools[i]); } } emit Deposit(msg.sender, tokenId, amount); } /** * @notice Opt-in to the specified reward pools * @dev Updates reward pools before hand because this is like a balance change for the pool * @param tokens The reward pools to opt-in to */ function optIn(address[] calldata tokens) external lock updateReward(msg.sender) { for (uint256 i = 0; i < tokens.length; i++) { // Taking out checks for isReward allows people to opt-into pools before they start, // which might be benefitial if projects announce rewards in advance, // makes things fairer too. if (!isOptIn[msg.sender][tokens[i]]) { _optIn(tokens[i]); } } } /** * @notice Internal function for optIn() * @param token The reward pool to opt-in to */ function _optIn(address token) internal { RewardData memory _rewardData = rewardData[token]; _rewardData.derivedSupply += derivedBalances[msg.sender]; _rewardData.rewardPerTokenStored = _rewardPerToken(_rewardData); _rewardData.lastUpdateTime = uint40( Math.min(block.timestamp, _rewardData.periodFinish) ); rewardData[token] = _rewardData; UserRewardData memory _userRewardData = UserRewardData({ userRewardPerTokenPaid: _rewardData.rewardPerTokenStored, userEarnedStored: 0 }); userRewardData[msg.sender][token] = _userRewardData; isOptIn[msg.sender][token] = true; userOptInsIndex[msg.sender][token] = userOptIns[msg.sender].length; userOptIns[msg.sender].push(token); emit OptIn(msg.sender, token); } /** * @notice Opt-out of the specified reward pools * @dev This method updates the reward pools beforehand, storing all user earned amounts for later claiming * @param tokens The reward pools to opt-out of */ function optOut(address[] calldata tokens) external lock updateReward(msg.sender) { // Actually doesn't really matter if the user has unclaimed rewards // since it updates all rewards in the modifier and users can claim // stored rewards even after opting out for (uint256 i = 0; i < tokens.length; i++) { if (isOptIn[msg.sender][tokens[i]]) { _optOut(tokens[i]); } } } /** * @notice skips updateReward(). Forfeits all unstored accrued rewards for the selected pools. Only useful when a user enters too many pools */ function emergencyOptOut(address[] calldata tokens) external lock { for (uint256 i = 0; i < tokens.length; i++) { uint128 _derivedBalance = derivedBalances[msg.sender]; if (isOptIn[msg.sender][tokens[i]]) { rewardData[tokens[i]].derivedSupply -= _derivedBalance; _optOut(tokens[i]); } } } /** * @notice Internal function for optOut() and emergencyOptOut() * @param token The reward pool to opt-in to */ function _optOut(address token) internal { isOptIn[msg.sender][token] = false; uint256 index = userOptInsIndex[msg.sender][token]; delete userOptInsIndex[msg.sender][token]; // Delete index for tokenId // Fetch last opt-in in array address lastOptIn = userOptIns[msg.sender][ userOptIns[msg.sender].length - 1 ]; userOptIns[msg.sender][index] = lastOptIn; // Update userOptIns userOptInsIndex[msg.sender][lastOptIn] = index; // Update index by token ID userOptIns[msg.sender].pop(); // Remove last userOptIn emit OptOut(msg.sender, token); } function withdrawAll() external { withdraw(balanceOf[msg.sender]); } /** * @notice Withdraws LP tokens, and detaches veNFT from the gauge final balance becomes 0 * @param amount The amount of LP to withdraw */ function withdraw(uint256 amount) public { uint256 tokenId = 0; if (amount == balanceOf[msg.sender]) { tokenId = tokenIds[msg.sender]; } withdrawToken(amount, tokenId); } /** * @notice Withdraws LP tokens, and detaches veNFT from the gauge if specified * @param amount The amount of LP to withdraw * @param tokenId The veNFT to detach, input 0 to skip detachment */ function withdrawToken(uint256 amount, uint256 tokenId) public lock updateReward(msg.sender) { totalSupply -= amount; balanceOf[msg.sender] -= amount; _safeTransfer(stake, msg.sender, amount); if (tokenId > 0) { require(tokenId == tokenIds[msg.sender], "tokenId auth"); tokenIds[msg.sender] = 0; IVoterV2(voter).detachTokenFromGauge(tokenId, msg.sender); } else { tokenId = tokenIds[msg.sender]; } emit Withdraw(msg.sender, tokenId, amount); } function getReward(address account, address[] memory tokens) external lock updateReward(account) { require( msg.sender == account || msg.sender == voter, "msg.sender not account" ); _unlocked = 1; IVoterV2(voter).distribute(address(this)); _unlocked = 2; for (uint256 i = 0; i < tokens.length; i++) { uint256 _reward = userRewardData[account][tokens[i]] .userEarnedStored; if (_reward > 0) { // only need to look at stored amounts because updateReward() is called beforehand userRewardData[account][tokens[i]].userEarnedStored = 0; _safeTransfer(tokens[i], account, _reward); } emit ClaimRewards(msg.sender, tokens[i], _reward); } } function notifyRewardAmount(address token, uint256 amount) external lock { require(token != stake, "Invalid reward token"); require(amount > 0, "Cannot notify 0"); require(amount < type(uint128).max, "too much amount"); uint128 amount = uint128(amount); RewardData memory _rewardData = rewardData[token]; // gas savings // update pool first _rewardData.rewardPerTokenStored = _rewardPerToken(_rewardData); _rewardData.lastUpdateTime = uint40( Math.min(block.timestamp, _rewardData.periodFinish) ); // fetch current balance uint256 balanceBefore = erc20(token).balanceOf(address(this)); // transfer tokens, recalculate amount in case of transfer-tax _safeTransferFrom(token, msg.sender, address(this), amount); amount = uint128(erc20(token).balanceOf(address(this)) - balanceBefore); if (block.timestamp >= _rewardData.periodFinish) { _rewardData.rewardRatePerWeek = amount; } else { uint40 _remaining = _rewardData.periodFinish - uint40(block.timestamp); uint128 _left = uint128( (_remaining * _rewardData.rewardRatePerWeek) / DURATION ); require(amount > _left || msg.sender == voter, "amount < left"); _rewardData.rewardRatePerWeek = amount + _left; } require(_rewardData.rewardRatePerWeek > 0, "rewardRate too low"); uint256 balance = erc20(token).balanceOf(address(this)); require( _rewardData.rewardRatePerWeek <= balance, "Not enough tokens provided" ); _rewardData.periodFinish = uint40(block.timestamp + DURATION); _rewardData.lastUpdateTime = uint40(block.timestamp); rewardData[token] = _rewardData; if (!isReward[token]) { isReward[token] = true; rewards.push(token); } emit NotifyReward(msg.sender, token, amount); } // Be VERY CAREFUL when using this, gauge does not track how much reward // is supposed to be in the contract, since it'll take too much gas // to record balance changes on every interaction just for the next to // 0 possibility that this function is used // Off-chain calculations should be double-checked before using this function function clawbackRewards(address token, uint256 amount) external onlyGovernance { require(token != stake, "Cannot clawback LP"); require(amount > 0, "Cannot clawback 0"); address generalFeesAddress = IVoterV2(voter).generalFees(); // Approve amount and notifyReward for generalFees _safeApprove(token, generalFeesAddress, amount); IBaseV2GeneralFees(generalFeesAddress).notifyRewardAmount( token, amount ); emit ClawbackRewards(token, amount); } /**************************************** SafeERC20 ****************************************/ function _safeTransfer( address token, address to, uint256 value ) internal { require(token.code.length > 0, "!contract"); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(erc20.transfer.selector, to, value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "SafeERC20: safeTransfer low-level call failed" ); } function _safeTransferFrom( address token, address from, address to, uint256 value ) internal { require(token.code.length > 0, "!contract"); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(erc20.transferFrom.selector, from, to, value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "SafeERC20: safeTransferFrom low-level call failed" ); } function _safeApprove( address token, address spender, uint256 value ) internal { require(token.code.length > 0, "!contract"); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(erc20.approve.selector, spender, value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "SafeERC20: approve low-level call failed" ); } } /** * @dev Changelog: * - Deprecate createGaugeSingle() * - Deprecate last_gauge; * - Refactored createGauge(); */ contract BaseV2GaugeFactory is SolidlyFactory { bool public isBoostPaused; function createGauge( address _pool, address _bribe, address _ve ) external returns (address lastGauge) { lastGauge = _deployChildProxy(); GaugeV2(lastGauge).initialize(_pool, _bribe, _ve, msg.sender); return lastGauge; } function setBoostPaused(bool _state) external onlyGovernance { isBoostPaused = _state; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.11; import "./SolidlyImplementation.sol"; import "./interfaces/IFactory.sol"; contract SolidlyChildImplementation is SolidlyImplementation { bytes32 constant FACTORY_SLOT = 0x547b500e425d72fd0723933cceefc203cef652b4736fd04250c3369b3e1a0a72; // keccak256('FACTORY') - 1 modifier onlyFactory() { require(msg.sender == factoryAddress(), "only Factory"); _; } /**************************************** VIEW METHODS ****************************************/ /** * @notice Fetch current governance address from factory * @return _governanceAddress Returns current governance address */ function governanceAddress() public view override returns (address _governanceAddress) { return IFactory(factoryAddress()).governanceAddress(); } function factoryAddress() public view returns (address _factory) { assembly { _factory := sload(FACTORY_SLOT) } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.11; import "./SolidlyImplementation.sol"; import "./SolidlyChildProxy.sol"; contract SolidlyFactory is SolidlyImplementation { bytes32 constant CHILD_SUBIMPLEMENTATION_SLOT = 0xa7461aa7cde97eb2572f8234e341359c6baae47e1feeb3c235edffe5f0fc089d; // keccak256('CHILD_SUBIMPLEMENTATION') - 1 bytes32 constant CHILD_INTERFACE_SLOT = 0x23762bb6469fe7a7bd6609262f442817ed09ca1f07add24ef069610d59c90649; // keccak256('CHILD_INTERFACE') - 1 bytes32 constant SUBIMPLEMENTATION_SLOT = 0xa1056f3ed783ff191ada02861fcb19d9ae3a8f50b739813a127951ef5290458d; // keccak256('SUBIMPLEMENTATION') - 1 bytes32 constant INTERFACE_SLOT = 0x4a9bf2931aa5eae439c602abae4bd662e7919244decac463e2e35fc862c5fb98; // keccak256('INTERFACE') - 1 address public interfaceSourceAddress; function _deployChildProxy() internal returns (address) { address addr = address(new SolidlyChildProxy()); return addr; } function _deployChildProxyWithSalt(bytes32 salt) internal returns (address) { address addr = address(new SolidlyChildProxy{salt: salt}()); return addr; } function updateChildSubImplementationAddress( address _childSubImplementationAddress ) external onlyGovernance { assembly { sstore(CHILD_SUBIMPLEMENTATION_SLOT, _childSubImplementationAddress) } } function updateChildInterfaceAddress(address _childInterfaceAddress) external onlyGovernance { assembly { sstore(CHILD_INTERFACE_SLOT, _childInterfaceAddress) } } function childSubImplementationAddress() external view returns (address _childSubImplementation) { assembly { _childSubImplementation := sload(CHILD_SUBIMPLEMENTATION_SLOT) } } function childInterfaceAddress() external view returns (address _childInterface) { assembly { _childInterface := sload(CHILD_INTERFACE_SLOT) } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.11; import "./SolidlyProxy.sol"; import "./interfaces/IFactory.sol"; /** * @notice Child Proxy deployed by factories for pairs, fees, gauges, and bribes. Calls back to the factory to fetch proxy implementation. */ contract SolidlyChildProxy is SolidlyProxy { bytes32 constant FACTORY_SLOT = 0x547b500e425d72fd0723933cceefc203cef652b4736fd04250c3369b3e1a0a72; // keccak256('FACTORY') - 1 modifier onlyFactory() { require(msg.sender == factoryAddress(), "only Factory"); _; } /** * @notice Records factory address and current interface implementation */ constructor() { address _factory = msg.sender; address _interface = IFactory(msg.sender).childInterfaceAddress(); assembly { sstore(FACTORY_SLOT, _factory) sstore(IMPLEMENTATION_SLOT, _interface) // Storing the interface into EIP-1967's implementation slot so Etherscan picks up the interface } } /**************************************** SETTINGS ****************************************/ /** * @notice Governance callable method to update the Factory address */ function updateFactoryAddress(address _factory) external onlyGovernance { assembly { sstore(FACTORY_SLOT, _factory) } } /** * @notice Publically callable function to sync proxy interface with the one recorded in the factory */ function updateInterfaceAddress() external { address _newInterfaceAddress = IFactory(factoryAddress()) .childInterfaceAddress(); require( implementationAddress() != _newInterfaceAddress, "Nothing to update" ); assembly { sstore(IMPLEMENTATION_SLOT, _newInterfaceAddress) } } /**************************************** VIEW METHODS ****************************************/ /** * @notice Fetch current governance address from factory * @return _governanceAddress Returns current governance address */ function governanceAddress() public view override returns (address _governanceAddress) { return IFactory(factoryAddress()).governanceAddress(); } function factoryAddress() public view returns (address _factory) { assembly { _factory := sload(FACTORY_SLOT) } } /** *@notice Fetch address where actual contract logic is at */ function subImplementationAddress() public view returns (address _subimplementation) { return IFactory(factoryAddress()).childSubImplementationAddress(); } /** * @notice Fetch address where the interface for the contract is */ function interfaceAddress() public view override returns (address _interface) { assembly { _interface := sload(IMPLEMENTATION_SLOT) } } /**************************************** FALLBACK METHODS ****************************************/ /** * @notice Fallback function that delegatecalls the subimplementation instead of what's in the IMPLEMENTATION_SLOT */ function _delegateCallSubimplmentation() internal override { address contractLogic = IFactory(factoryAddress()) .childSubImplementationAddress(); assembly { calldatacopy(0x0, 0x0, calldatasize()) let success := delegatecall( gas(), contractLogic, 0x0, calldatasize(), 0, 0 ) let returnDataSize := returndatasize() returndatacopy(0, 0, returnDataSize) switch success case 0 { revert(0, returnDataSize) } default { return(0, returnDataSize) } } } fallback() external payable override { _delegateCallSubimplmentation(); } receive() external payable override { _delegateCallSubimplmentation(); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.11; /** * @title Solidly+ Implementation * @author Solidly+ * @notice Governable implementation that relies on governance slot to be set by the proxy */ contract SolidlyImplementation { bytes32 constant GOVERNANCE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; // keccak256('eip1967.proxy.admin') bytes32 constant INITIALIZED_SLOT = 0x834ce84547018237034401a09067277cdcbe7bbf7d7d30f6b382b0a102b7b4a3; // keccak256('eip1967.proxy.initialized') /** * @notice Reverts if msg.sender is not governance */ modifier onlyGovernance() { require(msg.sender == governanceAddress(), "Only governance"); _; } /** * @notice Reverts if contract is already initialized * @dev U4sed by implementations to ensure initialize() is only called once */ modifier notInitialized() { bool initialized; assembly { initialized := sload(INITIALIZED_SLOT) if eq(initialized, 1) { revert(0, 0) } sstore(INITIALIZED_SLOT, 1) } _; } /** * @notice Fetch current governance address * @return _governanceAddress Returns current governance address */ function governanceAddress() public view virtual returns (address _governanceAddress) { assembly { _governanceAddress := sload(GOVERNANCE_SLOT) } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; interface IFactory { function governanceAddress() external view returns (address); function childSubImplementationAddress() external view returns (address); function childInterfaceAddress() external view returns (address); }
// SPDX-License-Identifier: BUSL pragma solidity 0.8.11; /** * @title Solidly+ governance killable proxy * @author Solidly+ * @notice EIP-1967 upgradeable proxy with the ability to kill governance and render the contract immutable */ contract SolidlyProxy { bytes32 constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; // keccak256('eip1967.proxy.implementation'), actually used for interface so etherscan picks up the interface bytes32 constant LOGIC_SLOT = 0x5942be825425c77e56e4bce97986794ab0f100954e40fc1390ae0e003710a3ab; // keccak256('LOGIC') - 1, actual logic implementation bytes32 constant GOVERNANCE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; // keccak256('eip1967.proxy.admin') bytes32 constant INITIALIZED_SLOT = 0x834ce84547018237034401a09067277cdcbe7bbf7d7d30f6b382b0a102b7b4a3; // keccak256('eip1967.proxy.initialized') /** * @notice Reverts if msg.sender is not governance */ modifier onlyGovernance() { require(msg.sender == governanceAddress(), "Only governance"); _; } /** * @notice Reverts if contract is already initialized * @dev Used by implementations to ensure initialize() is only called once */ modifier notInitialized() { bool initialized; assembly { initialized := sload(INITIALIZED_SLOT) if eq(initialized, 1) { revert(0, 0) } sstore(INITIALIZED_SLOT, 1) } _; } /** * @notice Sets up deployer as a proxy governance */ constructor() { address _governanceAddress = msg.sender; assembly { sstore(GOVERNANCE_SLOT, _governanceAddress) } } /** * @notice Detect whether or not governance is killed * @return Return true if governance is killed, false if not * @dev If governance is killed this contract becomes immutable */ function governanceIsKilled() public view returns (bool) { return governanceAddress() == address(0); } /** * @notice Kill governance, making this contract immutable * @dev Only governance can kil governance */ function killGovernance() external onlyGovernance { updateGovernanceAddress(address(0)); } /** * @notice Update implementation address * @param _interfaceAddress Address of the new interface * @dev Only governance can update implementation */ function updateInterfaceAddress(address _interfaceAddress) external onlyGovernance { assembly { sstore(IMPLEMENTATION_SLOT, _interfaceAddress) } } /** * @notice Actually updates interface, kept for etherscan pattern recognition * @param _implementationAddress Address of the new implementation * @dev Only governance can update implementation */ function updateImplementationAddress(address _implementationAddress) external onlyGovernance { assembly { sstore(IMPLEMENTATION_SLOT, _implementationAddress) } } /** * @notice Update implementation address * @param _logicAddress Address of the new implementation * @dev Only governance can update implementation */ function updateLogicAddress(address _logicAddress) external onlyGovernance { assembly { sstore(LOGIC_SLOT, _logicAddress) } } /** * @notice Update governance address * @param _governanceAddress New governance address * @dev Only governance can update governance */ function updateGovernanceAddress(address _governanceAddress) public onlyGovernance { assembly { sstore(GOVERNANCE_SLOT, _governanceAddress) } } /** * @notice Fetch the current implementation address * @return _implementationAddress Returns the current implementation address */ function implementationAddress() public view returns (address _implementationAddress) { assembly { _implementationAddress := sload(IMPLEMENTATION_SLOT) } } /** * @notice Fetch the current implementation address * @return _interfaceAddress Returns the current implementation address */ function interfaceAddress() public view virtual returns (address _interfaceAddress) { assembly { _interfaceAddress := sload(IMPLEMENTATION_SLOT) } } /** * @notice Fetch the current implementation address * @return _logicAddress Returns the current implementation address */ function logicAddress() public view virtual returns (address _logicAddress) { assembly { _logicAddress := sload(LOGIC_SLOT) } } /** * @notice Fetch current governance address * @return _governanceAddress Returns current governance address */ function governanceAddress() public view virtual returns (address _governanceAddress) { assembly { _governanceAddress := sload(GOVERNANCE_SLOT) } } /** * @notice Fallback function that delegatecalls the subimplementation instead of what's in the IMPLEMENTATION_SLOT */ function _delegateCallSubimplmentation() internal virtual { assembly { let contractLogic := sload(LOGIC_SLOT) calldatacopy(0x0, 0x0, calldatasize()) let success := delegatecall( gas(), contractLogic, 0x0, calldatasize(), 0, 0 ) let returnDataSize := returndatasize() returndatacopy(0, 0, returnDataSize) switch success case 0 { revert(0, returnDataSize) } default { return(0, returnDataSize) } } } /** * @notice Delegatecall fallback proxy */ fallback() external payable virtual { _delegateCallSubimplmentation(); } receive() external payable virtual { _delegateCallSubimplmentation(); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "bytecodeHash": "none" } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimed0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claimed1","type":"uint256"}],"name":"ClaimFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClawbackRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NotifyReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"}],"name":"OptIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"}],"name":"OptOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"_ve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bribe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimFees","outputs":[{"internalType":"uint256","name":"claimed0","type":"uint256"},{"internalType":"uint256","name":"claimed1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"clawbackRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address[]","name":"optInPools","type":"address[]"}],"name":"depositAndOptIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"derivedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"derivedBalances","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"derivedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"emergencyOptOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factoryAddress","outputs":[{"internalType":"address","name":"_factory","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"governanceAddress","outputs":[{"internalType":"address","name":"_governanceAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stake","type":"address"},{"internalType":"address","name":"_bribe","type":"address"},{"internalType":"address","name":"__ve","type":"address"},{"internalType":"address","name":"_voter","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isOptIn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"left","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"optIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"optOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardData","outputs":[{"internalType":"uint128","name":"rewardRatePerWeek","type":"uint128"},{"internalType":"uint128","name":"derivedSupply","type":"uint128"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"},{"internalType":"uint40","name":"periodFinish","type":"uint40"},{"internalType":"uint40","name":"lastUpdateTime","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"solid","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stake","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userOptIns","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userOptInsIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userRewardData","outputs":[{"internalType":"uint256","name":"userRewardPerTokenPaid","type":"uint256"},{"internalType":"uint256","name":"userEarnedStored","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"userRewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600160005534801561001557600080fd5b50614bf6806100256000396000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c806393f1c4421161015c578063d35e2544116100ce578063e688639611610087578063e688639614610735578063f12297771461073d578063f301af4214610750578063f8c8765e14610763578063fc97a30314610776578063fdb483c71461079657600080fd5b8063d35e25441461068e578063d5894aca146106a1578063d700c18b146106b4578063d7da4bb0146106e6578063da09d19d146106ef578063e2bbb1581461072257600080fd5b8063a34020b911610120578063a34020b9146105fa578063aeaea0c81461060d578063b66503cf14610638578063c4afc5981461064b578063c6f678bd1461065e578063d294f0931461067157600080fd5b806393f1c4421461058a578063941cdc7314610593578063966dae0e146105a657806399bcc052146105bb5780639ce43f90146105ce57600080fd5b806348e5d9f81161020057806363fb415b116101b957806363fb415b146104f357806370a0823114610534578063795053d3146105545780637d962ec61461055c578063853828b61461056f5780638dd598fb1461057757600080fd5b806348e5d9f8146103d15780634a54223e146104635780634c02a21c146104a15780634d5ce038146104aa57806353a3f616146104cd578063638634ee146104e057600080fd5b806331279d3d1161025257806331279d3d146103205780633668db9f1461033357806337d0208c1461035e5780633a4b66f1146103715780633ca068b61461038457806346c96aac146103be57600080fd5b806318160ddd1461028f578063211dc32d146102ab578063221ca18c146102be5780632ce9aead146102d15780632e1a7d4d1461030b575b600080fd5b610298600f5481565b6040519081526020015b60405180910390f35b6102986102b936600461469c565b6107a9565b6102986102cc3660046146d5565b6108d2565b6102986102df3660046146d5565b6001600160a01b03166000908152600d6020526040902060020154600160281b900464ffffffffff1690565b61031e6103193660046146f2565b610908565b005b61031e61032e3660046147b8565b61093f565b610346610341366004614808565b610fe2565b6040516001600160a01b0390911681526020016102a2565b600454610346906001600160a01b031681565b600154610346906001600160a01b031681565b61029861039236600461469c565b6001600160a01b038082166000908152600e602090815260408083209386168352929052205492915050565b600554610346906001600160a01b031681565b6104266103df3660046146d5565b600d602052600090815260409020805460018201546002909201546001600160801b0380831693600160801b90930416919064ffffffffff80821691600160281b90041685565b604080516001600160801b0396871681529590941660208601529284019190915264ffffffffff908116606084015216608082015260a0016102a2565b61049161047136600461469c565b600a60209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102a2565b61029860135481565b6104916104b83660046146d5565b60116020526000908152604090205460ff1681565b600354610346906001600160a01b031681565b6102986104ee3660046146d5565b61101a565b61051c6105013660046146d5565b6007602052600090815260409020546001600160801b031681565b6040516001600160801b0390911681526020016102a2565b6102986105423660046146d5565b60096020526000908152604090205481565b610346611048565b61031e61056a366004614834565b6110c6565b61031e611229565b600254610346906001600160a01b031681565b61029860125481565b61031e6105a1366004614834565b611244565b600080516020614bca83398151915254610346565b6102986105c93660046146d5565b611736565b6102986105dc3660046146d5565b6001600160a01b03166000908152600d602052604090206001015490565b61031e6106083660046148a9565b6117fd565b61029861061b36600461469c565b600c60209081526000928352604080842090915290825290205481565b61031e610646366004614808565b611f83565b61031e610659366004614834565b61256e565b61031e61066c3660046146f2565b612a47565b610679612abe565b604080519283526020830191909152016102a2565b61029861069c3660046146d5565b612f3b565b61031e6106af366004614808565b6131e6565b6106796106c236600461469c565b600e6020908152600092835260408084209091529082529020805460019091015482565b61029860065481565b6102986106fd3660046146d5565b6001600160a01b03166000908152600d602052604090206002015464ffffffffff1690565b61031e6107303660046148f9565b6133fc565b601054610298565b61029861074b3660046146d5565b613592565b61034661075e3660046146f2565b613610565b61031e61077136600461491b565b61363a565b6102986107843660046146d5565b60086020526000908152604090205481565b61031e6107a43660046148f9565b6137c2565b6001600160a01b038083166000818152600d60209081526040808320815160a08101835281546001600160801b038082168352600160801b90910416818501526001808301548285015260029092015464ffffffffff8082166060840152600160281b909104166080820152958716808552600e845282852086865284528285208351808501855281548152920154828501819052908552600a845282852095855294909252822054919392909160ff16156108c95781516c47bf19673df52e37f2410011d1602c1b9061087c85613d7e565b610886919061498d565b6001600160a01b0387166000908152600760205260409020546108b291906001600160801b03166149a4565b6108bc91906149c3565b6108c690826149e5565b90505b95945050505050565b6001600160a01b0381166000908152600d60205260408120546109029062093a80906001600160801b03166149c3565b92915050565b336000908152600960205260408120548214156109315750336000908152600860205260409020545b61093b82826137c2565b5050565b60005460011461094e57600080fd5b600260009081556001600160a01b038316815260076020908152604080832054600990925282205484926001600160801b03909216915b6001600160a01b0384166000908152600b6020526040902054811015610b8c576001600160a01b0384166000908152600b602052604081208054839081106109cf576109cf6149fd565b60009182526020808320909101546001600160a01b0316808352600d8252604092839020835160a08101855281546001600160801b038082168352600160801b909104169381019390935260018101549383019390935260029092015464ffffffffff8082166060840152600160281b909104166080820152909150610a5481613d7e565b60408201526060810151610a7090429064ffffffffff16613e4a565b64ffffffffff908116608083019081526001600160a01b038085166000818152600d602090815260408083208851838a01516001600160801b03908116600160801b0291161781558189015160018083019190915560608a01516002909201805498518a16600160281b026001600160501b0319909916929099169190911796909617909655928b168152600e83528481209181529082528381208451808601909552805485529092015490830181905290610b2c8986613e60565b905081811115610b74576001600160a01b038981166000908152600e6020908152604080832093891683528382528083206001808201879055600d8452919093200154929052555b50505050508080610b8490614a13565b915050610985565b50336001600160a01b0386161480610bae57506005546001600160a01b031633145b610bf85760405162461bcd60e51b81526020600482015260166024820152751b5cd9cb9cd95b99195c881b9bdd081858d8dbdd5b9d60521b60448201526064015b60405180910390fd5b60016000556005546040516363453ae160e01b81523060048201526001600160a01b03909116906363453ae190602401600060405180830381600087803b158015610c4257600080fd5b505af1158015610c56573d6000803e3d6000fd5b5050600260009081559150505b8451811015610dcb576001600160a01b0386166000908152600e6020526040812086518290889085908110610c9a57610c9a6149fd565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206001015490506000811115610d52576001600160a01b0387166000908152600e6020526040812087518290899086908110610cff57610cff6149fd565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060010181905550610d52868381518110610d4357610d436149fd565b60200260200101518883613f12565b858281518110610d6457610d646149fd565b60200260200101516001600160a01b0316336001600160a01b03167f9aa05b3d70a9e3e2f004f039648839560576334fb45c81f91b6db03ad9e2efc983604051610db091815260200190565b60405180910390a35080610dc381614a13565b915050610c63565b506006548290610de46001600160801b0383168261498d565b9050610def85612f3b565b6001600160a01b038616600090815260076020526040902080546001600160801b0319166001600160801b038316908117909155909450610e3090826149e5565b6006819055905060005b6001600160a01b0386166000908152600b6020526040902054811015610f1b576001600160a01b0386166000908152600b60205260408120805483908110610e8457610e846149fd565b60009182526020808320909101546001600160a01b0316808352600d9091526040909120549091506001600160801b03600160801b90910416610ec78582614a2e565b9050610ed38782614a56565b6001600160a01b039092166000908152600d6020526040902080546001600160801b03938416600160801b029316929092179091555080610f1381614a13565b915050610e3a565b50836001600160801b0316826001600160801b031614610fd45760005b6001600160a01b0386166000908152600b6020526040902054811015610fd2576001600160a01b0386166000908152600b60205260408120805483908110610f8257610f826149fd565b60009182526020808320909101546001600160a01b03908116808452600d8352604080852060010154928c168552600e845280852091855292529120555080610fca81614a13565b915050610f38565b505b505060016000555050505050565b600b6020528160005260406000208181548110610ffe57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b0381166000908152600d602052604081206002015461090290429064ffffffffff16613e4a565b6000611060600080516020614bca8339815191525490565b6001600160a01b031663795053d36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561109d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c19190614a81565b905090565b6000546001146110d557600080fd5b600260009081555b8181101561121f5733600090815260076020908152604080832054600a90925282206001600160801b039091169185858581811061111d5761111d6149fd565b905060200201602081019061113291906146d5565b6001600160a01b0316815260208101919091526040016000205460ff161561120c5780600d600086868681811061116b5761116b6149fd565b905060200201602081019061118091906146d5565b6001600160a01b03168152602081019190915260400160002080546010906111b9908490600160801b90046001600160801b0316614a2e565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555061120c8484848181106111f2576111f26149fd565b905060200201602081019061120791906146d5565b61406d565b508061121781614a13565b9150506110dd565b5050600160005550565b3360009081526009602052604090205461124290610908565b565b60005460011461125357600080fd5b600260009081553380825260076020908152604080842054600990925283205491926001600160801b0390911691905b6001600160a01b0384166000908152600b602052604090205481101561148a576001600160a01b0384166000908152600b602052604081208054839081106112cd576112cd6149fd565b60009182526020808320909101546001600160a01b0316808352600d8252604092839020835160a08101855281546001600160801b038082168352600160801b909104169381019390935260018101549383019390935260029092015464ffffffffff8082166060840152600160281b90910416608082015290915061135281613d7e565b6040820152606081015161136e90429064ffffffffff16613e4a565b64ffffffffff908116608083019081526001600160a01b038085166000818152600d602090815260408083208851838a01516001600160801b03908116600160801b0291161781558189015160018083019190915560608a01516002909201805498518a16600160281b026001600160501b0319909916929099169190911796909617909655928b168152600e8352848120918152908252838120845180860190955280548552909201549083018190529061142a8986613e60565b905081811115611472576001600160a01b038981166000908152600e6020908152604080832093891683528382528083206001808201879055600d8452919093200154929052555b5050505050808061148290614a13565b915050611283565b5060005b8481101561152f57336000908152600a60205260408120908787848181106114b8576114b86149fd565b90506020020160208101906114cd91906146d5565b6001600160a01b0316815260208101919091526040016000205460ff1661151d5761151d868683818110611503576115036149fd565b905060200201602081019061151891906146d5565b6141cd565b8061152781614a13565b91505061148e565b5060065482906115486001600160801b0383168261498d565b905061155385612f3b565b6001600160a01b038616600090815260076020526040902080546001600160801b0319166001600160801b03831690811790915590945061159490826149e5565b6006819055905060005b6001600160a01b0386166000908152600b602052604090205481101561167f576001600160a01b0386166000908152600b602052604081208054839081106115e8576115e86149fd565b60009182526020808320909101546001600160a01b0316808352600d9091526040909120549091506001600160801b03600160801b9091041661162b8582614a2e565b90506116378782614a56565b6001600160a01b039092166000908152600d6020526040902080546001600160801b03938416600160801b02931692909217909155508061167781614a13565b91505061159e565b50836001600160801b0316826001600160801b031614610fd45760005b6001600160a01b0386166000908152600b6020526040902054811015610fd2576001600160a01b0386166000908152600b602052604081208054839081106116e6576116e66149fd565b60009182526020808320909101546001600160a01b03908116808452600d8352604080852060010154928c168552600e84528085209185529252912055508061172e81614a13565b91505061169c565b6001600160a01b0381166000908152600d60209081526040808320815160a08101835281546001600160801b038082168352600160801b90910416938101939093526001810154918301919091526002015464ffffffffff80821660608401819052600160281b90920416608083015242106117b55750600092915050565b600042826060015164ffffffffff166117ce919061498d565b825190915062093a80906117eb906001600160801b0316836149a4565b6117f591906149c3565b949350505050565b60005460011461180c57600080fd5b600260009081553380825260076020908152604080842054600990925283205491926001600160801b0390911691905b6001600160a01b0384166000908152600b6020526040902054811015611a43576001600160a01b0384166000908152600b60205260408120805483908110611886576118866149fd565b60009182526020808320909101546001600160a01b0316808352600d8252604092839020835160a08101855281546001600160801b038082168352600160801b909104169381019390935260018101549383019390935260029092015464ffffffffff8082166060840152600160281b90910416608082015290915061190b81613d7e565b6040820152606081015161192790429064ffffffffff16613e4a565b64ffffffffff908116608083019081526001600160a01b038085166000818152600d602090815260408083208851838a01516001600160801b03908116600160801b0291161781558189015160018083019190915560608a01516002909201805498518a16600160281b026001600160501b0319909916929099169190911796909617909655928b168152600e835284812091815290825283812084518086019095528054855290920154908301819052906119e38986613e60565b905081811115611a2b576001600160a01b038981166000908152600e6020908152604080832093891683528382528083206001808201879055600d8452919093200154929052555b50505050508080611a3b90614a13565b91505061183c565b5060008611611a875760405162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b6044820152606401610bef565b600154611a9f906001600160a01b03163330896143cd565b85600f6000828254611ab191906149e5565b90915550503360009081526009602052604081208054889290611ad59084906149e5565b90915550508415611c8c576002546040516331a9108f60e11b81526004810187905233916001600160a01b031690636352211e90602401602060405180830381865afa158015611b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4d9190614a81565b6001600160a01b031614611b925760405162461bcd60e51b815260206004820152600c60248201526b0e8ded6cadc92c840c2eae8d60a31b6044820152606401610bef565b33600090815260086020526040902054611c1e573360008181526008602052604090819020879055600554905163698473e360e01b81526004810188905260248101929092526001600160a01b03169063698473e390604401600060405180830381600087803b158015611c0557600080fd5b505af1158015611c19573d6000803e3d6000fd5b505050505b336000908152600860205260409020548514611c875760405162461bcd60e51b815260206004820152602260248201527f446966666572656e7420746f6b656e496420616c726561647920617474616368604482015261195960f21b6064820152608401610bef565b611c9f565b3360009081526008602052604090205494505b60005b8451811015611d3057336000908152600a602052604081208651909190879084908110611cd157611cd16149fd565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16611d1e57611d1e858281518110611d1157611d116149fd565b60200260200101516141cd565b80611d2881614a13565b915050611ca2565b50604080518681526020810188905233917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15910160405180910390a26006548290611d846001600160801b0383168261498d565b9050611d8f85612f3b565b6001600160a01b038616600090815260076020526040902080546001600160801b0319166001600160801b038316908117909155909450611dd090826149e5565b6006819055905060005b6001600160a01b0386166000908152600b6020526040902054811015611ebb576001600160a01b0386166000908152600b60205260408120805483908110611e2457611e246149fd565b60009182526020808320909101546001600160a01b0316808352600d9091526040909120549091506001600160801b03600160801b90910416611e678582614a2e565b9050611e738782614a56565b6001600160a01b039092166000908152600d6020526040902080546001600160801b03938416600160801b029316929092179091555080611eb381614a13565b915050611dda565b50836001600160801b0316826001600160801b031614611f745760005b6001600160a01b0386166000908152600b6020526040902054811015611f72576001600160a01b0386166000908152600b60205260408120805483908110611f2257611f226149fd565b60009182526020808320909101546001600160a01b03908116808452600d8352604080852060010154928c168552600e845280852091855292529120555080611f6a81614a13565b915050611ed8565b505b50506001600055505050505050565b600054600114611f9257600080fd5b60026000556001546001600160a01b0383811691161415611fec5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103932bbb0b932103a37b5b2b760611b6044820152606401610bef565b6000811161202e5760405162461bcd60e51b815260206004820152600f60248201526e043616e6e6f74206e6f74696679203608c1b6044820152606401610bef565b6001600160801b0381106120765760405162461bcd60e51b815260206004820152600f60248201526e1d1bdbc81b5d58da08185b5bdd5b9d608a1b6044820152606401610bef565b6001600160a01b0382166000908152600d6020908152604091829020825160a08101845281546001600160801b038082168352600160801b909104169281019290925260018101549282019290925260029091015464ffffffffff8082166060840152600160281b90910416608082015281906120f281613d7e565b6040820152606081015161210e90429064ffffffffff16613e4a565b64ffffffffff1660808201526040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa158015612161573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121859190614a9e565b905061219c853330866001600160801b03166143cd565b6040516370a0823160e01b815230600482015281906001600160a01b038716906370a0823190602401602060405180830381865afa1580156121e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122069190614a9e565b612210919061498d565b9250816060015164ffffffffff164210612235576001600160801b03831682526122f9565b60004283606001516122479190614ab7565b9050600062093a8084600001518364ffffffffff166122669190614ad5565b6001600160801b031661227991906149c3565b9050806001600160801b0316856001600160801b031611806122a557506005546001600160a01b031633145b6122e15760405162461bcd60e51b815260206004820152600d60248201526c185b5bdd5b9d080f081b19599d609a1b6044820152606401610bef565b6122eb8186614a56565b6001600160801b0316845250505b81516001600160801b03166123455760405162461bcd60e51b81526020600482015260126024820152717265776172645261746520746f6f206c6f7760701b6044820152606401610bef565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa15801561238c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b09190614a9e565b90508083600001516001600160801b0316111561240f5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f75676820746f6b656e732070726f76696465640000000000006044820152606401610bef565b61241c62093a80426149e5565b64ffffffffff90811660608501908152428216608086019081526001600160a01b0389166000908152600d602090815260408083208951838b01516001600160801b03908116600160801b029116178155818a0151600182015594516002909501805494518716600160281b026001600160501b03199095169590961694909417929092179093556011905290205460ff16612518576001600160a01b0386166000818152601160205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b03191690911790555b6040516001600160801b03851681526001600160a01b0387169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf508269060200160405180910390a35050600160005550505050565b60005460011461257d57600080fd5b600260009081553380825260076020908152604080842054600990925283205491926001600160801b0390911691905b6001600160a01b0384166000908152600b60205260409020548110156127b4576001600160a01b0384166000908152600b602052604081208054839081106125f7576125f76149fd565b60009182526020808320909101546001600160a01b0316808352600d8252604092839020835160a08101855281546001600160801b038082168352600160801b909104169381019390935260018101549383019390935260029092015464ffffffffff8082166060840152600160281b90910416608082015290915061267c81613d7e565b6040820152606081015161269890429064ffffffffff16613e4a565b64ffffffffff908116608083019081526001600160a01b038085166000818152600d602090815260408083208851838a01516001600160801b03908116600160801b0291161781558189015160018083019190915560608a01516002909201805498518a16600160281b026001600160501b0319909916929099169190911796909617909655928b168152600e835284812091815290825283812084518086019095528054855290920154908301819052906127548986613e60565b90508181111561279c576001600160a01b038981166000908152600e6020908152604080832093891683528382528083206001808201879055600d8452919093200154929052555b505050505080806127ac90614a13565b9150506125ad565b5060005b8481101561284057336000908152600a60205260408120908787848181106127e2576127e26149fd565b90506020020160208101906127f791906146d5565b6001600160a01b0316815260208101919091526040016000205460ff161561282e5761282e8686838181106111f2576111f26149fd565b8061283881614a13565b9150506127b8565b5060065482906128596001600160801b0383168261498d565b905061286485612f3b565b6001600160a01b038616600090815260076020526040902080546001600160801b0319166001600160801b0383169081179091559094506128a590826149e5565b6006819055905060005b6001600160a01b0386166000908152600b6020526040902054811015612990576001600160a01b0386166000908152600b602052604081208054839081106128f9576128f96149fd565b60009182526020808320909101546001600160a01b0316808352600d9091526040909120549091506001600160801b03600160801b9091041661293c8582614a2e565b90506129488782614a56565b6001600160a01b039092166000908152600d6020526040902080546001600160801b03938416600160801b02931692909217909155508061298881614a13565b9150506128af565b50836001600160801b0316826001600160801b031614610fd45760005b6001600160a01b0386166000908152600b6020526040902054811015610fd2576001600160a01b0386166000908152600b602052604081208054839081106129f7576129f76149fd565b60009182526020808320909101546001600160a01b03908116808452600d8352604080852060010154928c168552600e845280852091855292529120555080612a3f81614a13565b9150506129ad565b6001546040516370a0823160e01b8152336004820152612abb916001600160a01b0316906370a0823190602401602060405180830381865afa158015612a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab59190614a9e565b826133fc565b50565b60055460015460405163ebaced6760e01b81526001600160a01b0391821660048201526000928392839291169063ebaced6790602401602060405180830381865afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b359190614a81565b6040805160028082526060820183529293506000929091602083019080368337505060015460408051634eb1c24560e11b815281519495506001600160a01b0390921693639d63848a935060048084019382900301816000875af1158015612ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc59190614b04565b82600081518110612bd857612bd86149fd565b6020026020010183600181518110612bf257612bf26149fd565b6001600160a01b039384166020918202929092010152911690526040805160028082526060820190925260009181602001602082028036833701905050905081600081518110612c4457612c446149fd565b60209081029190910101516040516370a0823160e01b81526001600160a01b038581166004830152909116906370a0823190602401602060405180830381865afa158015612c96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cba9190614a9e565b81600081518110612ccd57612ccd6149fd565b60200260200101818152505081600181518110612cec57612cec6149fd565b60209081029190910101516040516370a0823160e01b81526001600160a01b038581166004830152909116906370a0823190602401602060405180830381865afa158015612d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d629190614a9e565b81600181518110612d7557612d756149fd565b602002602001018181525050826001600160a01b031663d294f0936040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b5050505080600081518110612de757612de76149fd565b602002602001015182600081518110612e0257612e026149fd565b60209081029190910101516040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa158015612e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e789190614a9e565b612e82919061498d565b945080600181518110612e9757612e976149fd565b602002602001015182600181518110612eb257612eb26149fd565b60209081029190910101516040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa158015612f04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f289190614a9e565b612f32919061498d565b93505050509091565b6000612f53600080516020614bca8339815191525490565b6001600160a01b031663713561ae6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb49190614b33565b15612fd557506001600160a01b031660009081526009602052604090205490565b6001600160a01b0382166000908152600860209081526040808320546009909252822054909160646130088360286149a4565b61301291906149c3565b9050600080600260009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561306a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061308e9190614a9e565b6002546040516331a9108f60e11b8152600481018890529192506001600160a01b031690636352211e90602401602060405180830381865afa1580156130d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130fc9190614a81565b6001600160a01b0316876001600160a01b031614801561311c5750600081115b156131c3576002546040516339f890b560e21b8152600481018790526001600160a01b039091169063e7e242d490602401602060405180830381865afa15801561316a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061318e9190614a9e565b915060648183600f546131a191906149a4565b6131ab91906149c3565b6131b690603c6149a4565b6131c091906149c3565b91505b6131d66131d083856149e5565b85613e4a565b979650505050505050565b919050565b6131ee611048565b6001600160a01b0316336001600160a01b0316146132405760405162461bcd60e51b815260206004820152600f60248201526e4f6e6c7920676f7665726e616e636560881b6044820152606401610bef565b6001546001600160a01b03838116911614156132935760405162461bcd60e51b8152602060048201526012602482015271043616e6e6f7420636c61776261636b204c560741b6044820152606401610bef565b600081116132d75760405162461bcd60e51b8152602060048201526011602482015270043616e6e6f7420636c61776261636b203607c1b6044820152606401610bef565b6005546040805163b724e7b160e01b815290516000926001600160a01b03169163b724e7b19160048083019260209291908290030181865afa158015613321573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133459190614a81565b905061335283828461452d565b60405163b66503cf60e01b81526001600160a01b0384811660048301526024820184905282169063b66503cf90604401600060405180830381600087803b15801561339c57600080fd5b505af11580156133b0573d6000803e3d6000fd5b50505050826001600160a01b03167f5ead1ccc35904976ea23bcb5ebbfbff286c396bea03c4e934e66146975a71a22836040516133ef91815260200190565b60405180910390a2505050565b600354336000908152600a602090815260408083206001600160a01b039094168084529390915290205460ff166135715760408051600380825260808201909252600091602082016060803683370190505060015460408051634eb1c24560e11b8152815193945060009384936001600160a01b031692639d63848a9260048082019391829003018187875af115801561349a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134be9190614b04565b9150915083836000815181106134d6576134d66149fd565b60200260200101906001600160a01b031690816001600160a01b031681525050818360018151811061350a5761350a6149fd565b60200260200101906001600160a01b031690816001600160a01b031681525050808360028151811061353e5761353e6149fd565b60200260200101906001600160a01b031690816001600160a01b0316815250506135698686856117fd565b505050505050565b60408051600081526020810190915261358d90849084906117fd565b505050565b6001600160a01b0381166000908152600d60209081526040808320815160a08101835281546001600160801b038082168352600160801b90910416938101939093526001810154918301919091526002015464ffffffffff8082166060840152600160281b90910416608082015261360981613d7e565b9392505050565b6010818154811061362057600080fd5b6000918252602090912001546001600160a01b0316905081565b600080516020614bca833981519152546001600160a01b0316336001600160a01b0316146136995760405162461bcd60e51b815260206004820152600c60248201526b6f6e6c7920466163746f727960a01b6044820152606401610bef565b7f834ce84547018237034401a09067277cdcbe7bbf7d7d30f6b382b0a102b7b4a35460018114156136c957600080fd5b60017f834ce84547018237034401a09067277cdcbe7bbf7d7d30f6b382b0a102b7b4a3819055600081905580546001600160a01b038088166001600160a01b0319928316179092556004805487841690831617815560028054878516908416811790915560058054948716949093169390931790915560408051637e062a3560e11b8152905163fc0c546a928281019260209291908290030181865afa158015613777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061379b9190614a81565b600380546001600160a01b0319166001600160a01b03929092169190911790555050505050565b6000546001146137d157600080fd5b600260009081553380825260076020908152604080842054600990925283205491926001600160801b0390911691905b6001600160a01b0384166000908152600b6020526040902054811015613a08576001600160a01b0384166000908152600b6020526040812080548390811061384b5761384b6149fd565b60009182526020808320909101546001600160a01b0316808352600d8252604092839020835160a08101855281546001600160801b038082168352600160801b909104169381019390935260018101549383019390935260029092015464ffffffffff8082166060840152600160281b9091041660808201529091506138d081613d7e565b604082015260608101516138ec90429064ffffffffff16613e4a565b64ffffffffff908116608083019081526001600160a01b038085166000818152600d602090815260408083208851838a01516001600160801b03908116600160801b0291161781558189015160018083019190915560608a01516002909201805498518a16600160281b026001600160501b0319909916929099169190911796909617909655928b168152600e835284812091815290825283812084518086019095528054855290920154908301819052906139a88986613e60565b9050818111156139f0576001600160a01b038981166000908152600e6020908152604080832093891683528382528083206001808201879055600d8452919093200154929052555b50505050508080613a0090614a13565b915050613801565b5084600f6000828254613a1b919061498d565b90915550503360009081526009602052604081208054879290613a3f90849061498d565b9091555050600154613a5b906001600160a01b03163387613f12565b8315613b2a57336000908152600860205260409020548414613aae5760405162461bcd60e51b815260206004820152600c60248201526b0e8ded6cadc92c840c2eae8d60a31b6044820152606401610bef565b3360008181526008602052604080822091909155600554905163411b1f7760e01b81526004810187905260248101929092526001600160a01b03169063411b1f7790604401600060405180830381600087803b158015613b0d57600080fd5b505af1158015613b21573d6000803e3d6000fd5b50505050613b3d565b3360009081526008602052604090205493505b604080518581526020810187905233917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568910160405180910390a26006548290613b906001600160801b0383168261498d565b9050613b9b85612f3b565b6001600160a01b038616600090815260076020526040902080546001600160801b0319166001600160801b038316908117909155909450613bdc90826149e5565b6006819055905060005b6001600160a01b0386166000908152600b6020526040902054811015613cc7576001600160a01b0386166000908152600b60205260408120805483908110613c3057613c306149fd565b60009182526020808320909101546001600160a01b0316808352600d9091526040909120549091506001600160801b03600160801b90910416613c738582614a2e565b9050613c7f8782614a56565b6001600160a01b039092166000908152600d6020526040902080546001600160801b03938416600160801b029316929092179091555080613cbf81614a13565b915050613be6565b50836001600160801b0316826001600160801b031614610fd45760005b6001600160a01b0386166000908152600b6020526040902054811015610fd2576001600160a01b0386166000908152600b60205260408120805483908110613d2e57613d2e6149fd565b60009182526020808320909101546001600160a01b03908116808452600d8352604080852060010154928c168552600e845280852091855292529120555080613d7681614a13565b915050613ce4565b600081602001516001600160801b031660001415613d9e57506040015190565b6000613dc0836080015164ffffffffff16846060015164ffffffffff16613e4a565b613dd542856060015164ffffffffff16613e4a565b613ddf919061498d565b90508083602001516001600160801b031684600001516001600160801b031662093a806c47bf19673df52e37f2410011d1602c1b613e1d91906149c3565b613e2791906149a4565b613e3191906149c3565b613e3b91906149a4565b836040015161360991906149e5565b6000818310613e595781613609565b5090919050565b6001600160a01b038083166000908152600e6020908152604080832093851680845293825280832081518083018352815480825260019283015482860152958552600d90935290832001549192909183916c47bf19673df52e37f2410011d1602c1b91613ecd919061498d565b6001600160a01b038716600090815260076020526040902054613ef991906001600160801b03166149a4565b613f0391906149c3565b82602001516108c991906149e5565b6000836001600160a01b03163b11613f3c5760405162461bcd60e51b8152600401610bef90614b55565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613f989190614b78565b6000604051808303816000865af19150503d8060008114613fd5576040519150601f19603f3d011682016040523d82523d6000602084013e613fda565b606091505b50915091508180156140045750805115806140045750808060200190518101906140049190614b33565b6140665760405162461bcd60e51b815260206004820152602d60248201527f5361666545524332303a20736166655472616e73666572206c6f772d6c65766560448201526c1b0818d85b1b0819985a5b1959609a1b6064820152608401610bef565b5050505050565b336000818152600a602090815260408083206001600160a01b038616808552908352818420805460ff19169055848452600c83528184209084528252808320805490849055938352600b909152812080546140ca9060019061498d565b815481106140da576140da6149fd565b6000918252602080832090910154338352600b909152604090912080546001600160a01b039092169250829184908110614116576141166149fd565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905533808352600c8252604080842094861684529382528383208690558252600b90522080548061416f5761416f614bb3565b600082815260208120820160001990810180546001600160a01b03191690559091019091556040516001600160a01b0385169133917f1629cd9ad365627cf8408d19c50224af8f3213c1a18ae48062d92e22bddf7de59190a3505050565b6001600160a01b0381166000908152600d60209081526040808320815160a08101835281546001600160801b038082168352600160801b909104811682860190815260018401548386015260029093015464ffffffffff8082166060850152600160281b90910416608083015233865260079094529190932054835191939216919061425a908390614a56565b6001600160801b031690525061426f81613d7e565b6040820152606081015161428b90429064ffffffffff16613e4a565b64ffffffffff908116608083019081526001600160a01b0384166000818152600d602090815260408083208751838901516001600160801b03908116600160801b029116178155818801805160018084019190915560608a01516002909301805498518a16600160281b026001600160501b0319909916939099169290921796909617909655805180820182529451855284820183815233808552600e8452828520868652845282852087518155915191880191909155808452600a83528184208585528352818420805460ff191688179055808452600b8084528285208054600c86528487208888528652848720819055918552978101885596845291832090950180546001600160a01b031916841790559351929391927f9b730d5b907ee509de729817a2bb37e404418ba569b3a50f36192372f973cb419190a3505050565b6000846001600160a01b03163b116143f75760405162461bcd60e51b8152600401610bef90614b55565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161445b9190614b78565b6000604051808303816000865af19150503d8060008114614498576040519150601f19603f3d011682016040523d82523d6000602084013e61449d565b606091505b50915091508180156144c75750805115806144c75750808060200190518101906144c79190614b33565b6135695760405162461bcd60e51b815260206004820152603160248201527f5361666545524332303a20736166655472616e7366657246726f6d206c6f772d6044820152701b195d995b0818d85b1b0819985a5b1959607a1b6064820152608401610bef565b6000836001600160a01b03163b116145575760405162461bcd60e51b8152600401610bef90614b55565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b17905291516000928392908716916145b39190614b78565b6000604051808303816000865af19150503d80600081146145f0576040519150601f19603f3d011682016040523d82523d6000602084013e6145f5565b606091505b509150915081801561461f57508051158061461f57508080602001905181019061461f9190614b33565b6140665760405162461bcd60e51b815260206004820152602860248201527f5361666545524332303a20617070726f7665206c6f772d6c6576656c2063616c6044820152671b0819985a5b195960c21b6064820152608401610bef565b6001600160a01b0381168114612abb57600080fd5b80356131e18161467c565b600080604083850312156146af57600080fd5b82356146ba8161467c565b915060208301356146ca8161467c565b809150509250929050565b6000602082840312156146e757600080fd5b81356136098161467c565b60006020828403121561470457600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261473257600080fd5b8135602067ffffffffffffffff8083111561474f5761474f61470b565b8260051b604051601f19603f830116810181811084821117156147745761477461470b565b60405293845285810183019383810192508785111561479257600080fd5b83870191505b848210156131d6576147a982614691565b83529183019190830190614798565b600080604083850312156147cb57600080fd5b82356147d68161467c565b9150602083013567ffffffffffffffff8111156147f257600080fd5b6147fe85828601614721565b9150509250929050565b6000806040838503121561481b57600080fd5b82356148268161467c565b946020939093013593505050565b6000806020838503121561484757600080fd5b823567ffffffffffffffff8082111561485f57600080fd5b818501915085601f83011261487357600080fd5b81358181111561488257600080fd5b8660208260051b850101111561489757600080fd5b60209290920196919550909350505050565b6000806000606084860312156148be57600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156148e357600080fd5b6148ef86828701614721565b9150509250925092565b6000806040838503121561490c57600080fd5b50508035926020909101359150565b6000806000806080858703121561493157600080fd5b843561493c8161467c565b9350602085013561494c8161467c565b9250604085013561495c8161467c565b9150606085013561496c8161467c565b939692955090935050565b634e487b7160e01b600052601160045260246000fd5b60008282101561499f5761499f614977565b500390565b60008160001904831182151516156149be576149be614977565b500290565b6000826149e057634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156149f8576149f8614977565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415614a2757614a27614977565b5060010190565b60006001600160801b0383811690831681811015614a4e57614a4e614977565b039392505050565b60006001600160801b03808316818516808303821115614a7857614a78614977565b01949350505050565b600060208284031215614a9357600080fd5b81516136098161467c565b600060208284031215614ab057600080fd5b5051919050565b600064ffffffffff83811690831681811015614a4e57614a4e614977565b60006001600160801b0380831681851681830481118215151615614afb57614afb614977565b02949350505050565b60008060408385031215614b1757600080fd5b8251614b228161467c565b60208401519092506146ca8161467c565b600060208284031215614b4557600080fd5b8151801515811461360957600080fd5b6020808252600990820152680858dbdb9d1c9858dd60ba1b604082015260600190565b6000825160005b81811015614b995760208186018101518583015201614b7f565b81811115614ba8576000828501525b509190910192915050565b634e487b7160e01b600052603160045260246000fdfe547b500e425d72fd0723933cceefc203cef652b4736fd04250c3369b3e1a0a72a164736f6c634300080b000a
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061028a5760003560e01c806393f1c4421161015c578063d35e2544116100ce578063e688639611610087578063e688639614610735578063f12297771461073d578063f301af4214610750578063f8c8765e14610763578063fc97a30314610776578063fdb483c71461079657600080fd5b8063d35e25441461068e578063d5894aca146106a1578063d700c18b146106b4578063d7da4bb0146106e6578063da09d19d146106ef578063e2bbb1581461072257600080fd5b8063a34020b911610120578063a34020b9146105fa578063aeaea0c81461060d578063b66503cf14610638578063c4afc5981461064b578063c6f678bd1461065e578063d294f0931461067157600080fd5b806393f1c4421461058a578063941cdc7314610593578063966dae0e146105a657806399bcc052146105bb5780639ce43f90146105ce57600080fd5b806348e5d9f81161020057806363fb415b116101b957806363fb415b146104f357806370a0823114610534578063795053d3146105545780637d962ec61461055c578063853828b61461056f5780638dd598fb1461057757600080fd5b806348e5d9f8146103d15780634a54223e146104635780634c02a21c146104a15780634d5ce038146104aa57806353a3f616146104cd578063638634ee146104e057600080fd5b806331279d3d1161025257806331279d3d146103205780633668db9f1461033357806337d0208c1461035e5780633a4b66f1146103715780633ca068b61461038457806346c96aac146103be57600080fd5b806318160ddd1461028f578063211dc32d146102ab578063221ca18c146102be5780632ce9aead146102d15780632e1a7d4d1461030b575b600080fd5b610298600f5481565b6040519081526020015b60405180910390f35b6102986102b936600461469c565b6107a9565b6102986102cc3660046146d5565b6108d2565b6102986102df3660046146d5565b6001600160a01b03166000908152600d6020526040902060020154600160281b900464ffffffffff1690565b61031e6103193660046146f2565b610908565b005b61031e61032e3660046147b8565b61093f565b610346610341366004614808565b610fe2565b6040516001600160a01b0390911681526020016102a2565b600454610346906001600160a01b031681565b600154610346906001600160a01b031681565b61029861039236600461469c565b6001600160a01b038082166000908152600e602090815260408083209386168352929052205492915050565b600554610346906001600160a01b031681565b6104266103df3660046146d5565b600d602052600090815260409020805460018201546002909201546001600160801b0380831693600160801b90930416919064ffffffffff80821691600160281b90041685565b604080516001600160801b0396871681529590941660208601529284019190915264ffffffffff908116606084015216608082015260a0016102a2565b61049161047136600461469c565b600a60209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102a2565b61029860135481565b6104916104b83660046146d5565b60116020526000908152604090205460ff1681565b600354610346906001600160a01b031681565b6102986104ee3660046146d5565b61101a565b61051c6105013660046146d5565b6007602052600090815260409020546001600160801b031681565b6040516001600160801b0390911681526020016102a2565b6102986105423660046146d5565b60096020526000908152604090205481565b610346611048565b61031e61056a366004614834565b6110c6565b61031e611229565b600254610346906001600160a01b031681565b61029860125481565b61031e6105a1366004614834565b611244565b600080516020614bca83398151915254610346565b6102986105c93660046146d5565b611736565b6102986105dc3660046146d5565b6001600160a01b03166000908152600d602052604090206001015490565b61031e6106083660046148a9565b6117fd565b61029861061b36600461469c565b600c60209081526000928352604080842090915290825290205481565b61031e610646366004614808565b611f83565b61031e610659366004614834565b61256e565b61031e61066c3660046146f2565b612a47565b610679612abe565b604080519283526020830191909152016102a2565b61029861069c3660046146d5565b612f3b565b61031e6106af366004614808565b6131e6565b6106796106c236600461469c565b600e6020908152600092835260408084209091529082529020805460019091015482565b61029860065481565b6102986106fd3660046146d5565b6001600160a01b03166000908152600d602052604090206002015464ffffffffff1690565b61031e6107303660046148f9565b6133fc565b601054610298565b61029861074b3660046146d5565b613592565b61034661075e3660046146f2565b613610565b61031e61077136600461491b565b61363a565b6102986107843660046146d5565b60086020526000908152604090205481565b61031e6107a43660046148f9565b6137c2565b6001600160a01b038083166000818152600d60209081526040808320815160a08101835281546001600160801b038082168352600160801b90910416818501526001808301548285015260029092015464ffffffffff8082166060840152600160281b909104166080820152958716808552600e845282852086865284528285208351808501855281548152920154828501819052908552600a845282852095855294909252822054919392909160ff16156108c95781516c47bf19673df52e37f2410011d1602c1b9061087c85613d7e565b610886919061498d565b6001600160a01b0387166000908152600760205260409020546108b291906001600160801b03166149a4565b6108bc91906149c3565b6108c690826149e5565b90505b95945050505050565b6001600160a01b0381166000908152600d60205260408120546109029062093a80906001600160801b03166149c3565b92915050565b336000908152600960205260408120548214156109315750336000908152600860205260409020545b61093b82826137c2565b5050565b60005460011461094e57600080fd5b600260009081556001600160a01b038316815260076020908152604080832054600990925282205484926001600160801b03909216915b6001600160a01b0384166000908152600b6020526040902054811015610b8c576001600160a01b0384166000908152600b602052604081208054839081106109cf576109cf6149fd565b60009182526020808320909101546001600160a01b0316808352600d8252604092839020835160a08101855281546001600160801b038082168352600160801b909104169381019390935260018101549383019390935260029092015464ffffffffff8082166060840152600160281b909104166080820152909150610a5481613d7e565b60408201526060810151610a7090429064ffffffffff16613e4a565b64ffffffffff908116608083019081526001600160a01b038085166000818152600d602090815260408083208851838a01516001600160801b03908116600160801b0291161781558189015160018083019190915560608a01516002909201805498518a16600160281b026001600160501b0319909916929099169190911796909617909655928b168152600e83528481209181529082528381208451808601909552805485529092015490830181905290610b2c8986613e60565b905081811115610b74576001600160a01b038981166000908152600e6020908152604080832093891683528382528083206001808201879055600d8452919093200154929052555b50505050508080610b8490614a13565b915050610985565b50336001600160a01b0386161480610bae57506005546001600160a01b031633145b610bf85760405162461bcd60e51b81526020600482015260166024820152751b5cd9cb9cd95b99195c881b9bdd081858d8dbdd5b9d60521b60448201526064015b60405180910390fd5b60016000556005546040516363453ae160e01b81523060048201526001600160a01b03909116906363453ae190602401600060405180830381600087803b158015610c4257600080fd5b505af1158015610c56573d6000803e3d6000fd5b5050600260009081559150505b8451811015610dcb576001600160a01b0386166000908152600e6020526040812086518290889085908110610c9a57610c9a6149fd565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206001015490506000811115610d52576001600160a01b0387166000908152600e6020526040812087518290899086908110610cff57610cff6149fd565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060010181905550610d52868381518110610d4357610d436149fd565b60200260200101518883613f12565b858281518110610d6457610d646149fd565b60200260200101516001600160a01b0316336001600160a01b03167f9aa05b3d70a9e3e2f004f039648839560576334fb45c81f91b6db03ad9e2efc983604051610db091815260200190565b60405180910390a35080610dc381614a13565b915050610c63565b506006548290610de46001600160801b0383168261498d565b9050610def85612f3b565b6001600160a01b038616600090815260076020526040902080546001600160801b0319166001600160801b038316908117909155909450610e3090826149e5565b6006819055905060005b6001600160a01b0386166000908152600b6020526040902054811015610f1b576001600160a01b0386166000908152600b60205260408120805483908110610e8457610e846149fd565b60009182526020808320909101546001600160a01b0316808352600d9091526040909120549091506001600160801b03600160801b90910416610ec78582614a2e565b9050610ed38782614a56565b6001600160a01b039092166000908152600d6020526040902080546001600160801b03938416600160801b029316929092179091555080610f1381614a13565b915050610e3a565b50836001600160801b0316826001600160801b031614610fd45760005b6001600160a01b0386166000908152600b6020526040902054811015610fd2576001600160a01b0386166000908152600b60205260408120805483908110610f8257610f826149fd565b60009182526020808320909101546001600160a01b03908116808452600d8352604080852060010154928c168552600e845280852091855292529120555080610fca81614a13565b915050610f38565b505b505060016000555050505050565b600b6020528160005260406000208181548110610ffe57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b0381166000908152600d602052604081206002015461090290429064ffffffffff16613e4a565b6000611060600080516020614bca8339815191525490565b6001600160a01b031663795053d36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561109d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c19190614a81565b905090565b6000546001146110d557600080fd5b600260009081555b8181101561121f5733600090815260076020908152604080832054600a90925282206001600160801b039091169185858581811061111d5761111d6149fd565b905060200201602081019061113291906146d5565b6001600160a01b0316815260208101919091526040016000205460ff161561120c5780600d600086868681811061116b5761116b6149fd565b905060200201602081019061118091906146d5565b6001600160a01b03168152602081019190915260400160002080546010906111b9908490600160801b90046001600160801b0316614a2e565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555061120c8484848181106111f2576111f26149fd565b905060200201602081019061120791906146d5565b61406d565b508061121781614a13565b9150506110dd565b5050600160005550565b3360009081526009602052604090205461124290610908565b565b60005460011461125357600080fd5b600260009081553380825260076020908152604080842054600990925283205491926001600160801b0390911691905b6001600160a01b0384166000908152600b602052604090205481101561148a576001600160a01b0384166000908152600b602052604081208054839081106112cd576112cd6149fd565b60009182526020808320909101546001600160a01b0316808352600d8252604092839020835160a08101855281546001600160801b038082168352600160801b909104169381019390935260018101549383019390935260029092015464ffffffffff8082166060840152600160281b90910416608082015290915061135281613d7e565b6040820152606081015161136e90429064ffffffffff16613e4a565b64ffffffffff908116608083019081526001600160a01b038085166000818152600d602090815260408083208851838a01516001600160801b03908116600160801b0291161781558189015160018083019190915560608a01516002909201805498518a16600160281b026001600160501b0319909916929099169190911796909617909655928b168152600e8352848120918152908252838120845180860190955280548552909201549083018190529061142a8986613e60565b905081811115611472576001600160a01b038981166000908152600e6020908152604080832093891683528382528083206001808201879055600d8452919093200154929052555b5050505050808061148290614a13565b915050611283565b5060005b8481101561152f57336000908152600a60205260408120908787848181106114b8576114b86149fd565b90506020020160208101906114cd91906146d5565b6001600160a01b0316815260208101919091526040016000205460ff1661151d5761151d868683818110611503576115036149fd565b905060200201602081019061151891906146d5565b6141cd565b8061152781614a13565b91505061148e565b5060065482906115486001600160801b0383168261498d565b905061155385612f3b565b6001600160a01b038616600090815260076020526040902080546001600160801b0319166001600160801b03831690811790915590945061159490826149e5565b6006819055905060005b6001600160a01b0386166000908152600b602052604090205481101561167f576001600160a01b0386166000908152600b602052604081208054839081106115e8576115e86149fd565b60009182526020808320909101546001600160a01b0316808352600d9091526040909120549091506001600160801b03600160801b9091041661162b8582614a2e565b90506116378782614a56565b6001600160a01b039092166000908152600d6020526040902080546001600160801b03938416600160801b02931692909217909155508061167781614a13565b91505061159e565b50836001600160801b0316826001600160801b031614610fd45760005b6001600160a01b0386166000908152600b6020526040902054811015610fd2576001600160a01b0386166000908152600b602052604081208054839081106116e6576116e66149fd565b60009182526020808320909101546001600160a01b03908116808452600d8352604080852060010154928c168552600e84528085209185529252912055508061172e81614a13565b91505061169c565b6001600160a01b0381166000908152600d60209081526040808320815160a08101835281546001600160801b038082168352600160801b90910416938101939093526001810154918301919091526002015464ffffffffff80821660608401819052600160281b90920416608083015242106117b55750600092915050565b600042826060015164ffffffffff166117ce919061498d565b825190915062093a80906117eb906001600160801b0316836149a4565b6117f591906149c3565b949350505050565b60005460011461180c57600080fd5b600260009081553380825260076020908152604080842054600990925283205491926001600160801b0390911691905b6001600160a01b0384166000908152600b6020526040902054811015611a43576001600160a01b0384166000908152600b60205260408120805483908110611886576118866149fd565b60009182526020808320909101546001600160a01b0316808352600d8252604092839020835160a08101855281546001600160801b038082168352600160801b909104169381019390935260018101549383019390935260029092015464ffffffffff8082166060840152600160281b90910416608082015290915061190b81613d7e565b6040820152606081015161192790429064ffffffffff16613e4a565b64ffffffffff908116608083019081526001600160a01b038085166000818152600d602090815260408083208851838a01516001600160801b03908116600160801b0291161781558189015160018083019190915560608a01516002909201805498518a16600160281b026001600160501b0319909916929099169190911796909617909655928b168152600e835284812091815290825283812084518086019095528054855290920154908301819052906119e38986613e60565b905081811115611a2b576001600160a01b038981166000908152600e6020908152604080832093891683528382528083206001808201879055600d8452919093200154929052555b50505050508080611a3b90614a13565b91505061183c565b5060008611611a875760405162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b6044820152606401610bef565b600154611a9f906001600160a01b03163330896143cd565b85600f6000828254611ab191906149e5565b90915550503360009081526009602052604081208054889290611ad59084906149e5565b90915550508415611c8c576002546040516331a9108f60e11b81526004810187905233916001600160a01b031690636352211e90602401602060405180830381865afa158015611b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4d9190614a81565b6001600160a01b031614611b925760405162461bcd60e51b815260206004820152600c60248201526b0e8ded6cadc92c840c2eae8d60a31b6044820152606401610bef565b33600090815260086020526040902054611c1e573360008181526008602052604090819020879055600554905163698473e360e01b81526004810188905260248101929092526001600160a01b03169063698473e390604401600060405180830381600087803b158015611c0557600080fd5b505af1158015611c19573d6000803e3d6000fd5b505050505b336000908152600860205260409020548514611c875760405162461bcd60e51b815260206004820152602260248201527f446966666572656e7420746f6b656e496420616c726561647920617474616368604482015261195960f21b6064820152608401610bef565b611c9f565b3360009081526008602052604090205494505b60005b8451811015611d3057336000908152600a602052604081208651909190879084908110611cd157611cd16149fd565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16611d1e57611d1e858281518110611d1157611d116149fd565b60200260200101516141cd565b80611d2881614a13565b915050611ca2565b50604080518681526020810188905233917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15910160405180910390a26006548290611d846001600160801b0383168261498d565b9050611d8f85612f3b565b6001600160a01b038616600090815260076020526040902080546001600160801b0319166001600160801b038316908117909155909450611dd090826149e5565b6006819055905060005b6001600160a01b0386166000908152600b6020526040902054811015611ebb576001600160a01b0386166000908152600b60205260408120805483908110611e2457611e246149fd565b60009182526020808320909101546001600160a01b0316808352600d9091526040909120549091506001600160801b03600160801b90910416611e678582614a2e565b9050611e738782614a56565b6001600160a01b039092166000908152600d6020526040902080546001600160801b03938416600160801b029316929092179091555080611eb381614a13565b915050611dda565b50836001600160801b0316826001600160801b031614611f745760005b6001600160a01b0386166000908152600b6020526040902054811015611f72576001600160a01b0386166000908152600b60205260408120805483908110611f2257611f226149fd565b60009182526020808320909101546001600160a01b03908116808452600d8352604080852060010154928c168552600e845280852091855292529120555080611f6a81614a13565b915050611ed8565b505b50506001600055505050505050565b600054600114611f9257600080fd5b60026000556001546001600160a01b0383811691161415611fec5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103932bbb0b932103a37b5b2b760611b6044820152606401610bef565b6000811161202e5760405162461bcd60e51b815260206004820152600f60248201526e043616e6e6f74206e6f74696679203608c1b6044820152606401610bef565b6001600160801b0381106120765760405162461bcd60e51b815260206004820152600f60248201526e1d1bdbc81b5d58da08185b5bdd5b9d608a1b6044820152606401610bef565b6001600160a01b0382166000908152600d6020908152604091829020825160a08101845281546001600160801b038082168352600160801b909104169281019290925260018101549282019290925260029091015464ffffffffff8082166060840152600160281b90910416608082015281906120f281613d7e565b6040820152606081015161210e90429064ffffffffff16613e4a565b64ffffffffff1660808201526040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa158015612161573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121859190614a9e565b905061219c853330866001600160801b03166143cd565b6040516370a0823160e01b815230600482015281906001600160a01b038716906370a0823190602401602060405180830381865afa1580156121e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122069190614a9e565b612210919061498d565b9250816060015164ffffffffff164210612235576001600160801b03831682526122f9565b60004283606001516122479190614ab7565b9050600062093a8084600001518364ffffffffff166122669190614ad5565b6001600160801b031661227991906149c3565b9050806001600160801b0316856001600160801b031611806122a557506005546001600160a01b031633145b6122e15760405162461bcd60e51b815260206004820152600d60248201526c185b5bdd5b9d080f081b19599d609a1b6044820152606401610bef565b6122eb8186614a56565b6001600160801b0316845250505b81516001600160801b03166123455760405162461bcd60e51b81526020600482015260126024820152717265776172645261746520746f6f206c6f7760701b6044820152606401610bef565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa15801561238c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b09190614a9e565b90508083600001516001600160801b0316111561240f5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f75676820746f6b656e732070726f76696465640000000000006044820152606401610bef565b61241c62093a80426149e5565b64ffffffffff90811660608501908152428216608086019081526001600160a01b0389166000908152600d602090815260408083208951838b01516001600160801b03908116600160801b029116178155818a0151600182015594516002909501805494518716600160281b026001600160501b03199095169590961694909417929092179093556011905290205460ff16612518576001600160a01b0386166000818152601160205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b03191690911790555b6040516001600160801b03851681526001600160a01b0387169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf508269060200160405180910390a35050600160005550505050565b60005460011461257d57600080fd5b600260009081553380825260076020908152604080842054600990925283205491926001600160801b0390911691905b6001600160a01b0384166000908152600b60205260409020548110156127b4576001600160a01b0384166000908152600b602052604081208054839081106125f7576125f76149fd565b60009182526020808320909101546001600160a01b0316808352600d8252604092839020835160a08101855281546001600160801b038082168352600160801b909104169381019390935260018101549383019390935260029092015464ffffffffff8082166060840152600160281b90910416608082015290915061267c81613d7e565b6040820152606081015161269890429064ffffffffff16613e4a565b64ffffffffff908116608083019081526001600160a01b038085166000818152600d602090815260408083208851838a01516001600160801b03908116600160801b0291161781558189015160018083019190915560608a01516002909201805498518a16600160281b026001600160501b0319909916929099169190911796909617909655928b168152600e835284812091815290825283812084518086019095528054855290920154908301819052906127548986613e60565b90508181111561279c576001600160a01b038981166000908152600e6020908152604080832093891683528382528083206001808201879055600d8452919093200154929052555b505050505080806127ac90614a13565b9150506125ad565b5060005b8481101561284057336000908152600a60205260408120908787848181106127e2576127e26149fd565b90506020020160208101906127f791906146d5565b6001600160a01b0316815260208101919091526040016000205460ff161561282e5761282e8686838181106111f2576111f26149fd565b8061283881614a13565b9150506127b8565b5060065482906128596001600160801b0383168261498d565b905061286485612f3b565b6001600160a01b038616600090815260076020526040902080546001600160801b0319166001600160801b0383169081179091559094506128a590826149e5565b6006819055905060005b6001600160a01b0386166000908152600b6020526040902054811015612990576001600160a01b0386166000908152600b602052604081208054839081106128f9576128f96149fd565b60009182526020808320909101546001600160a01b0316808352600d9091526040909120549091506001600160801b03600160801b9091041661293c8582614a2e565b90506129488782614a56565b6001600160a01b039092166000908152600d6020526040902080546001600160801b03938416600160801b02931692909217909155508061298881614a13565b9150506128af565b50836001600160801b0316826001600160801b031614610fd45760005b6001600160a01b0386166000908152600b6020526040902054811015610fd2576001600160a01b0386166000908152600b602052604081208054839081106129f7576129f76149fd565b60009182526020808320909101546001600160a01b03908116808452600d8352604080852060010154928c168552600e845280852091855292529120555080612a3f81614a13565b9150506129ad565b6001546040516370a0823160e01b8152336004820152612abb916001600160a01b0316906370a0823190602401602060405180830381865afa158015612a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab59190614a9e565b826133fc565b50565b60055460015460405163ebaced6760e01b81526001600160a01b0391821660048201526000928392839291169063ebaced6790602401602060405180830381865afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b359190614a81565b6040805160028082526060820183529293506000929091602083019080368337505060015460408051634eb1c24560e11b815281519495506001600160a01b0390921693639d63848a935060048084019382900301816000875af1158015612ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc59190614b04565b82600081518110612bd857612bd86149fd565b6020026020010183600181518110612bf257612bf26149fd565b6001600160a01b039384166020918202929092010152911690526040805160028082526060820190925260009181602001602082028036833701905050905081600081518110612c4457612c446149fd565b60209081029190910101516040516370a0823160e01b81526001600160a01b038581166004830152909116906370a0823190602401602060405180830381865afa158015612c96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cba9190614a9e565b81600081518110612ccd57612ccd6149fd565b60200260200101818152505081600181518110612cec57612cec6149fd565b60209081029190910101516040516370a0823160e01b81526001600160a01b038581166004830152909116906370a0823190602401602060405180830381865afa158015612d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d629190614a9e565b81600181518110612d7557612d756149fd565b602002602001018181525050826001600160a01b031663d294f0936040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b5050505080600081518110612de757612de76149fd565b602002602001015182600081518110612e0257612e026149fd565b60209081029190910101516040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa158015612e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e789190614a9e565b612e82919061498d565b945080600181518110612e9757612e976149fd565b602002602001015182600181518110612eb257612eb26149fd565b60209081029190910101516040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa158015612f04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f289190614a9e565b612f32919061498d565b93505050509091565b6000612f53600080516020614bca8339815191525490565b6001600160a01b031663713561ae6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb49190614b33565b15612fd557506001600160a01b031660009081526009602052604090205490565b6001600160a01b0382166000908152600860209081526040808320546009909252822054909160646130088360286149a4565b61301291906149c3565b9050600080600260009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561306a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061308e9190614a9e565b6002546040516331a9108f60e11b8152600481018890529192506001600160a01b031690636352211e90602401602060405180830381865afa1580156130d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130fc9190614a81565b6001600160a01b0316876001600160a01b031614801561311c5750600081115b156131c3576002546040516339f890b560e21b8152600481018790526001600160a01b039091169063e7e242d490602401602060405180830381865afa15801561316a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061318e9190614a9e565b915060648183600f546131a191906149a4565b6131ab91906149c3565b6131b690603c6149a4565b6131c091906149c3565b91505b6131d66131d083856149e5565b85613e4a565b979650505050505050565b919050565b6131ee611048565b6001600160a01b0316336001600160a01b0316146132405760405162461bcd60e51b815260206004820152600f60248201526e4f6e6c7920676f7665726e616e636560881b6044820152606401610bef565b6001546001600160a01b03838116911614156132935760405162461bcd60e51b8152602060048201526012602482015271043616e6e6f7420636c61776261636b204c560741b6044820152606401610bef565b600081116132d75760405162461bcd60e51b8152602060048201526011602482015270043616e6e6f7420636c61776261636b203607c1b6044820152606401610bef565b6005546040805163b724e7b160e01b815290516000926001600160a01b03169163b724e7b19160048083019260209291908290030181865afa158015613321573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133459190614a81565b905061335283828461452d565b60405163b66503cf60e01b81526001600160a01b0384811660048301526024820184905282169063b66503cf90604401600060405180830381600087803b15801561339c57600080fd5b505af11580156133b0573d6000803e3d6000fd5b50505050826001600160a01b03167f5ead1ccc35904976ea23bcb5ebbfbff286c396bea03c4e934e66146975a71a22836040516133ef91815260200190565b60405180910390a2505050565b600354336000908152600a602090815260408083206001600160a01b039094168084529390915290205460ff166135715760408051600380825260808201909252600091602082016060803683370190505060015460408051634eb1c24560e11b8152815193945060009384936001600160a01b031692639d63848a9260048082019391829003018187875af115801561349a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134be9190614b04565b9150915083836000815181106134d6576134d66149fd565b60200260200101906001600160a01b031690816001600160a01b031681525050818360018151811061350a5761350a6149fd565b60200260200101906001600160a01b031690816001600160a01b031681525050808360028151811061353e5761353e6149fd565b60200260200101906001600160a01b031690816001600160a01b0316815250506135698686856117fd565b505050505050565b60408051600081526020810190915261358d90849084906117fd565b505050565b6001600160a01b0381166000908152600d60209081526040808320815160a08101835281546001600160801b038082168352600160801b90910416938101939093526001810154918301919091526002015464ffffffffff8082166060840152600160281b90910416608082015261360981613d7e565b9392505050565b6010818154811061362057600080fd5b6000918252602090912001546001600160a01b0316905081565b600080516020614bca833981519152546001600160a01b0316336001600160a01b0316146136995760405162461bcd60e51b815260206004820152600c60248201526b6f6e6c7920466163746f727960a01b6044820152606401610bef565b7f834ce84547018237034401a09067277cdcbe7bbf7d7d30f6b382b0a102b7b4a35460018114156136c957600080fd5b60017f834ce84547018237034401a09067277cdcbe7bbf7d7d30f6b382b0a102b7b4a3819055600081905580546001600160a01b038088166001600160a01b0319928316179092556004805487841690831617815560028054878516908416811790915560058054948716949093169390931790915560408051637e062a3560e11b8152905163fc0c546a928281019260209291908290030181865afa158015613777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061379b9190614a81565b600380546001600160a01b0319166001600160a01b03929092169190911790555050505050565b6000546001146137d157600080fd5b600260009081553380825260076020908152604080842054600990925283205491926001600160801b0390911691905b6001600160a01b0384166000908152600b6020526040902054811015613a08576001600160a01b0384166000908152600b6020526040812080548390811061384b5761384b6149fd565b60009182526020808320909101546001600160a01b0316808352600d8252604092839020835160a08101855281546001600160801b038082168352600160801b909104169381019390935260018101549383019390935260029092015464ffffffffff8082166060840152600160281b9091041660808201529091506138d081613d7e565b604082015260608101516138ec90429064ffffffffff16613e4a565b64ffffffffff908116608083019081526001600160a01b038085166000818152600d602090815260408083208851838a01516001600160801b03908116600160801b0291161781558189015160018083019190915560608a01516002909201805498518a16600160281b026001600160501b0319909916929099169190911796909617909655928b168152600e835284812091815290825283812084518086019095528054855290920154908301819052906139a88986613e60565b9050818111156139f0576001600160a01b038981166000908152600e6020908152604080832093891683528382528083206001808201879055600d8452919093200154929052555b50505050508080613a0090614a13565b915050613801565b5084600f6000828254613a1b919061498d565b90915550503360009081526009602052604081208054879290613a3f90849061498d565b9091555050600154613a5b906001600160a01b03163387613f12565b8315613b2a57336000908152600860205260409020548414613aae5760405162461bcd60e51b815260206004820152600c60248201526b0e8ded6cadc92c840c2eae8d60a31b6044820152606401610bef565b3360008181526008602052604080822091909155600554905163411b1f7760e01b81526004810187905260248101929092526001600160a01b03169063411b1f7790604401600060405180830381600087803b158015613b0d57600080fd5b505af1158015613b21573d6000803e3d6000fd5b50505050613b3d565b3360009081526008602052604090205493505b604080518581526020810187905233917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568910160405180910390a26006548290613b906001600160801b0383168261498d565b9050613b9b85612f3b565b6001600160a01b038616600090815260076020526040902080546001600160801b0319166001600160801b038316908117909155909450613bdc90826149e5565b6006819055905060005b6001600160a01b0386166000908152600b6020526040902054811015613cc7576001600160a01b0386166000908152600b60205260408120805483908110613c3057613c306149fd565b60009182526020808320909101546001600160a01b0316808352600d9091526040909120549091506001600160801b03600160801b90910416613c738582614a2e565b9050613c7f8782614a56565b6001600160a01b039092166000908152600d6020526040902080546001600160801b03938416600160801b029316929092179091555080613cbf81614a13565b915050613be6565b50836001600160801b0316826001600160801b031614610fd45760005b6001600160a01b0386166000908152600b6020526040902054811015610fd2576001600160a01b0386166000908152600b60205260408120805483908110613d2e57613d2e6149fd565b60009182526020808320909101546001600160a01b03908116808452600d8352604080852060010154928c168552600e845280852091855292529120555080613d7681614a13565b915050613ce4565b600081602001516001600160801b031660001415613d9e57506040015190565b6000613dc0836080015164ffffffffff16846060015164ffffffffff16613e4a565b613dd542856060015164ffffffffff16613e4a565b613ddf919061498d565b90508083602001516001600160801b031684600001516001600160801b031662093a806c47bf19673df52e37f2410011d1602c1b613e1d91906149c3565b613e2791906149a4565b613e3191906149c3565b613e3b91906149a4565b836040015161360991906149e5565b6000818310613e595781613609565b5090919050565b6001600160a01b038083166000908152600e6020908152604080832093851680845293825280832081518083018352815480825260019283015482860152958552600d90935290832001549192909183916c47bf19673df52e37f2410011d1602c1b91613ecd919061498d565b6001600160a01b038716600090815260076020526040902054613ef991906001600160801b03166149a4565b613f0391906149c3565b82602001516108c991906149e5565b6000836001600160a01b03163b11613f3c5760405162461bcd60e51b8152600401610bef90614b55565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613f989190614b78565b6000604051808303816000865af19150503d8060008114613fd5576040519150601f19603f3d011682016040523d82523d6000602084013e613fda565b606091505b50915091508180156140045750805115806140045750808060200190518101906140049190614b33565b6140665760405162461bcd60e51b815260206004820152602d60248201527f5361666545524332303a20736166655472616e73666572206c6f772d6c65766560448201526c1b0818d85b1b0819985a5b1959609a1b6064820152608401610bef565b5050505050565b336000818152600a602090815260408083206001600160a01b038616808552908352818420805460ff19169055848452600c83528184209084528252808320805490849055938352600b909152812080546140ca9060019061498d565b815481106140da576140da6149fd565b6000918252602080832090910154338352600b909152604090912080546001600160a01b039092169250829184908110614116576141166149fd565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905533808352600c8252604080842094861684529382528383208690558252600b90522080548061416f5761416f614bb3565b600082815260208120820160001990810180546001600160a01b03191690559091019091556040516001600160a01b0385169133917f1629cd9ad365627cf8408d19c50224af8f3213c1a18ae48062d92e22bddf7de59190a3505050565b6001600160a01b0381166000908152600d60209081526040808320815160a08101835281546001600160801b038082168352600160801b909104811682860190815260018401548386015260029093015464ffffffffff8082166060850152600160281b90910416608083015233865260079094529190932054835191939216919061425a908390614a56565b6001600160801b031690525061426f81613d7e565b6040820152606081015161428b90429064ffffffffff16613e4a565b64ffffffffff908116608083019081526001600160a01b0384166000818152600d602090815260408083208751838901516001600160801b03908116600160801b029116178155818801805160018084019190915560608a01516002909301805498518a16600160281b026001600160501b0319909916939099169290921796909617909655805180820182529451855284820183815233808552600e8452828520868652845282852087518155915191880191909155808452600a83528184208585528352818420805460ff191688179055808452600b8084528285208054600c86528487208888528652848720819055918552978101885596845291832090950180546001600160a01b031916841790559351929391927f9b730d5b907ee509de729817a2bb37e404418ba569b3a50f36192372f973cb419190a3505050565b6000846001600160a01b03163b116143f75760405162461bcd60e51b8152600401610bef90614b55565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161445b9190614b78565b6000604051808303816000865af19150503d8060008114614498576040519150601f19603f3d011682016040523d82523d6000602084013e61449d565b606091505b50915091508180156144c75750805115806144c75750808060200190518101906144c79190614b33565b6135695760405162461bcd60e51b815260206004820152603160248201527f5361666545524332303a20736166655472616e7366657246726f6d206c6f772d6044820152701b195d995b0818d85b1b0819985a5b1959607a1b6064820152608401610bef565b6000836001600160a01b03163b116145575760405162461bcd60e51b8152600401610bef90614b55565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b17905291516000928392908716916145b39190614b78565b6000604051808303816000865af19150503d80600081146145f0576040519150601f19603f3d011682016040523d82523d6000602084013e6145f5565b606091505b509150915081801561461f57508051158061461f57508080602001905181019061461f9190614b33565b6140665760405162461bcd60e51b815260206004820152602860248201527f5361666545524332303a20617070726f7665206c6f772d6c6576656c2063616c6044820152671b0819985a5b195960c21b6064820152608401610bef565b6001600160a01b0381168114612abb57600080fd5b80356131e18161467c565b600080604083850312156146af57600080fd5b82356146ba8161467c565b915060208301356146ca8161467c565b809150509250929050565b6000602082840312156146e757600080fd5b81356136098161467c565b60006020828403121561470457600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261473257600080fd5b8135602067ffffffffffffffff8083111561474f5761474f61470b565b8260051b604051601f19603f830116810181811084821117156147745761477461470b565b60405293845285810183019383810192508785111561479257600080fd5b83870191505b848210156131d6576147a982614691565b83529183019190830190614798565b600080604083850312156147cb57600080fd5b82356147d68161467c565b9150602083013567ffffffffffffffff8111156147f257600080fd5b6147fe85828601614721565b9150509250929050565b6000806040838503121561481b57600080fd5b82356148268161467c565b946020939093013593505050565b6000806020838503121561484757600080fd5b823567ffffffffffffffff8082111561485f57600080fd5b818501915085601f83011261487357600080fd5b81358181111561488257600080fd5b8660208260051b850101111561489757600080fd5b60209290920196919550909350505050565b6000806000606084860312156148be57600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156148e357600080fd5b6148ef86828701614721565b9150509250925092565b6000806040838503121561490c57600080fd5b50508035926020909101359150565b6000806000806080858703121561493157600080fd5b843561493c8161467c565b9350602085013561494c8161467c565b9250604085013561495c8161467c565b9150606085013561496c8161467c565b939692955090935050565b634e487b7160e01b600052601160045260246000fd5b60008282101561499f5761499f614977565b500390565b60008160001904831182151516156149be576149be614977565b500290565b6000826149e057634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156149f8576149f8614977565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415614a2757614a27614977565b5060010190565b60006001600160801b0383811690831681811015614a4e57614a4e614977565b039392505050565b60006001600160801b03808316818516808303821115614a7857614a78614977565b01949350505050565b600060208284031215614a9357600080fd5b81516136098161467c565b600060208284031215614ab057600080fd5b5051919050565b600064ffffffffff83811690831681811015614a4e57614a4e614977565b60006001600160801b0380831681851681830481118215151615614afb57614afb614977565b02949350505050565b60008060408385031215614b1757600080fd5b8251614b228161467c565b60208401519092506146ca8161467c565b600060208284031215614b4557600080fd5b8151801515811461360957600080fd5b6020808252600990820152680858dbdb9d1c9858dd60ba1b604082015260600190565b6000825160005b81811015614b995760208186018101518583015201614b7f565b81811115614ba8576000828501525b509190910192915050565b634e487b7160e01b600052603160045260246000fdfe547b500e425d72fd0723933cceefc203cef652b4736fd04250c3369b3e1a0a72a164736f6c634300080b000a
Deployed Bytecode Sourcemap
3016:25922:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4629:26;;;;;;;;;160:25:7;;;148:2;133:18;4629:26:0;;;;;;;;7095:563;;;;;;:::i;:::-;;:::i;10241:137::-;;;;;;:::i;:::-;;:::i;8828:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;8916:17:0;8890:7;8916:17;;;:10;:17;;;;;:32;;;-1:-1:-1;;;8916:32:0;;;;;8828:127;22533:218;;;;;;:::i;:::-;;:::i;:::-;;23563:860;;;;;;:::i;:::-;;:::i;3834:47::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3318:32:7;;;3300:51;;3288:2;3273:18;3834:47:0;3154:203:7;3487:20:0;;;;;-1:-1:-1;;;;;3487:20:0;;;3327;;;;;-1:-1:-1;;;;;3327:20:0;;;11966:203;;;;;;:::i;:::-;-1:-1:-1;;;;;12109:23:0;;;12079:7;12109:23;;;:14;:23;;;;;;;;:30;;;;;;;;;:53;11966:203;;;;;3513:20;;;;;-1:-1:-1;;;;;3513:20:0;;;4131:48;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4131:48:0;;;;-1:-1:-1;;;4131:48:0;;;;;;;;;;;-1:-1:-1;;;4131:48:0;;;;;;;;;-1:-1:-1;;;;;3688:15:7;;;3670:34;;3740:15;;;;3735:2;3720:18;;3713:43;3772:18;;;3765:34;;;;3818:12;3866:15;;;3861:2;3846:18;;3839:43;3919:15;3913:3;3898:19;;3891:44;3604:3;3589:19;4131:48:0;3362:579:7;3729:59:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4111:14:7;;4104:22;4086:41;;4074:2;4059:18;3729:59:0;3946:187:7;4765:20:0;;;;;;4692:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3461:20;;;;;-1:-1:-1;;;;;3461:20:0;;;8486:190;;;;;;:::i;:::-;;:::i;3574:50::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3574:50:0;;;;;;-1:-1:-1;;;;;4302:47:7;;;4284:66;;4272:2;4257:18;3574:50:0;4138:218:7;3679:44:0;;;;;;:::i;:::-;;;;;;;;;;;;;;728:193:1;;;:::i;21126:376:0:-;;;;;;:::i;:::-;;:::i;22287:80::-;;;:::i;3405:18::-;;;;;-1:-1:-1;;;;;3405:18:0;;;4739:20;;;;;;18772:499;;;;;;:::i;:::-;;:::i;927:145:1:-;-1:-1:-1;;;;;;;;;;;1037:19:1;927:145;;9081:363:0;;;;;;:::i;:::-;;:::i;9871:167::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9993:17:0;9963:7;9993:17;;;:10;:17;;;;;:38;;;;9871:167;17473:1078;;;;;;:::i;:::-;;:::i;3930:70::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;24429:2019;;;;;;:::i;:::-;;:::i;20478:481::-;;;;;;:::i;:::-;;:::i;16217:115::-;;;;;;:::i;:::-;;:::i;12426:818::-;;;:::i;:::-;;;;5644:25:7;;;5700:2;5685:18;;5678:34;;;;5617:18;12426:818:0;5470:248:7;6203:752:0;;;;;;:::i;:::-;;:::i;26808:560::-;;;;;;:::i;:::-;;:::i;4489:84::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3540:28;;;;;;9596:123;;;;;;:::i;:::-;-1:-1:-1;;;;;9682:17:0;9656:7;9682:17;;;:10;:17;;;;;:30;;;;;;9596:123;16566:624;;;;;;:::i;:::-;;:::i;10446:99::-;10524:7;:14;10446:99;;10667:183;;;;;;:::i;:::-;;:::i;4662:24::-;;;;;;:::i;:::-;;:::i;5598:314::-;;;;;;:::i;:::-;;:::i;3630:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;22976:581;;;;;;:::i;:::-;;:::i;7095:563::-;-1:-1:-1;;;;;7245:17:0;;;7190:7;7245:17;;;:10;:17;;;;;;;;7213:49;;;;;;;;;-1:-1:-1;;;;;7213:49:0;;;;;-1:-1:-1;;;7213:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7213:49:0;;;;;;;;7312:23;;;;;;:14;:23;;;;;:30;;;;;;;;7272:70;;;;;;;;;;;;;;;;;;;;7417:16;;;:7;:16;;;;;:23;;;;;;;;;;7190:7;;7213:49;7272:70;;7417:23;;7413:215;;;7564:38;;-1:-1:-1;;;3192:6:0;7513:28;7529:11;7513:15;:28::i;:::-;:89;;;;:::i;:::-;-1:-1:-1;;;;;7469:24:0;;;;;;:15;:24;;;;;;:134;;;-1:-1:-1;;;;;7469:24:0;:134;:::i;:::-;7468:148;;;;:::i;:::-;7456:161;;;;:::i;:::-;;;7413:215;7644:7;7095:563;-1:-1:-1;;;;;7095:563:0:o;10241:137::-;-1:-1:-1;;;;;10325:17:0;;10299:7;10325:17;;;:10;:17;;;;;:35;:46;;3106:6;;-1:-1:-1;;;;;10325:35:0;:46;:::i;:::-;10318:53;10241:137;-1:-1:-1;;10241:137:0:o;22533:218::-;22637:10;22584:15;22627:21;;;:9;:21;;;;;;22617:31;;22613:92;;;-1:-1:-1;22683:10:0;22674:20;;;;:8;:20;;;;;;22613:92;22714:30;22728:6;22736:7;22714:13;:30::i;:::-;22574:177;22533:218;:::o;23563:860::-;5513:9;;5526:1;5513:14;5505:23;;;;;;5550:1;5538:9;:13;;;-1:-1:-1;;;;;13452:24:0;::::1;::::0;;:15:::1;:24;::::0;;;;;;;;13507:9:::1;:18:::0;;;;;;23675:7;;-1:-1:-1;;;;;13452:24:0;;::::1;::::0;13535:1241:::1;-1:-1:-1::0;;;;;13555:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;13551:30;::::1;13535:1241;;;-1:-1:-1::0;;;;;13618:19:0;::::1;13602:13;13618:19:::0;;;:10:::1;:19;::::0;;;;:22;;13638:1;;13618:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;13618:22:0::1;13686:17:::0;;;:10:::1;:17:::0;;;;;;;13654:49;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;13654:49:0;;::::1;::::0;;-1:-1:-1;;;13654:49:0;;::::1;;::::0;;::::1;::::0;;;;13618:22;13654:49;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;13654:49:0;;::::1;;::::0;;;;13618:22;;-1:-1:-1;13768:28:0::1;13654:49:::0;13768:15:::1;:28::i;:::-;13733:32;::::0;::::1;:63:::0;13889:24:::1;::::0;::::1;::::0;13863:51:::1;::::0;13872:15:::1;::::0;13863:51:::1;;:8;:51::i;:::-;13810:118;::::0;;::::1;:26;::::0;::::1;:118:::0;;;-1:-1:-1;;;;;14019:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:31;;;;::::1;::::0;-1:-1:-1;;;;;14019:31:0;;::::1;-1:-1:-1::0;;;14019:31:0::1;::::0;::::1;;::::0;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;-1:-1:-1::0;;;14019:31:0::1;-1:-1:-1::0;;;;;;14019:31:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;14105:23;;::::1;::::0;;:14:::1;:23:::0;;;;;:60;;;;;;;;;14065:100;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;;;14272:33:::1;14120:7:::0;14030:5;14272:17:::1;:33::i;:::-;14249:56;;14502:13;14487:12;:28;14483:283;;;-1:-1:-1::0;;;;;14535:23:0;;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;:30;;::::1;::::0;;;;;;;;:47:::1;::::0;;::::1;:62:::0;;;14692:10:::1;:17:::0;;;;;;:59:::1;::::0;14615:30;;;:136;14483:283:::1;13588:1188;;;;;13583:3;;;;;:::i;:::-;;;;13535:1241;;;-1:-1:-1::0;23719:10:0::2;-1:-1:-1::0;;;;;23719:21:0;::::2;;::::0;:44:::2;;-1:-1:-1::0;23758:5:0::2;::::0;-1:-1:-1;;;;;23758:5:0::2;23744:10;:19;23719:44;23698:113;;;::::0;-1:-1:-1;;;23698:113:0;;7916:2:7;23698:113:0::2;::::0;::::2;7898:21:7::0;7955:2;7935:18;;;7928:30;-1:-1:-1;;;7974:18:7;;;7967:52;8036:18;;23698:113:0::2;;;;;;;;;23833:1;23821:9;:13:::0;23853:5:::2;::::0;23844:41:::2;::::0;-1:-1:-1;;;23844:41:0;;23879:4:::2;23844:41;::::0;::::2;3300:51:7::0;-1:-1:-1;;;;;23853:5:0;;::::2;::::0;23844:26:::2;::::0;3273:18:7;;23844:41:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;23907:1:0::2;23895:9;:13:::0;;;:9;-1:-1:-1;;23919:498:0::2;23943:6;:13;23939:1;:17;23919:498;;;-1:-1:-1::0;;;;;23995:23:0;::::2;23977:15;23995:23:::0;;;:14:::2;:23;::::0;;;;24019:9;;23977:15;;24019:6;;24026:1;;24019:9;::::2;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;23995:34:0::2;-1:-1:-1::0;;;;;23995:34:0::2;;;;;;;;;;;;:68;;;23977:86;;24092:1;24082:7;:11;24078:265;;;-1:-1:-1::0;;;;;24212:23:0;::::2;24266:1;24212:23:::0;;;:14:::2;:23;::::0;;;;24236:9;;24266:1;;24236:6;;24243:1;;24236:9;::::2;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;24212:34:0::2;-1:-1:-1::0;;;;;24212:34:0::2;;;;;;;;;;;;:51;;:55;;;;24286:42;24300:6;24307:1;24300:9;;;;;;;;:::i;:::-;;;;;;;24311:7;24320;24286:13;:42::i;:::-;24387:6;24394:1;24387:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;24362:44:0::2;24375:10;-1:-1:-1::0;;;;;24362:44:0::2;;24398:7;24362:44;;;;160:25:7::0;;148:2;133:18;;14:177;24362:44:0::2;;;;;;;;-1:-1:-1::0;23958:3:0;::::2;::::0;::::2;:::i;:::-;;;;23919:498;;;-1:-1:-1::0;14906:13:0::1;::::0;14856:15;;14929:39:::1;-1:-1:-1::0;;;;;14929:39:0;::::1;14906:13:::0;14929:39:::1;:::i;:::-;;;15004:23;15019:7;15004:14;:23::i;:::-;-1:-1:-1::0;;;;;15038:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;:42;;-1:-1:-1;;;;;;15038:42:0::1;-1:-1:-1::0;;;;;15038:42:0;::::1;::::0;;::::1;::::0;;;;;-1:-1:-1;15090:33:0::1;::::0;;::::1;:::i;:::-;15133:13;:30:::0;;;15090:33;-1:-1:-1;15236:9:0::1;15231:348;-1:-1:-1::0;;;;;15251:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;15247:30;::::1;15231:348;;;-1:-1:-1::0;;;;;15314:19:0;::::1;15298:13;15314:19:::0;;;:10:::1;:19;::::0;;;;:22;;15334:1;;15314:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;15314:22:0::1;15375:17:::0;;;:10:::1;:17:::0;;;;;;;:31;15314:22;;-1:-1:-1;;;;;;;;;15375:31:0;;::::1;;15420:39;15438:21:::0;15375:31;15420:39:::1;:::i;:::-;::::0;-1:-1:-1;15473:33:0::1;15491:15:::0;15420:39;15473:33:::1;:::i;:::-;-1:-1:-1::0;;;;;15520:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:48;;-1:-1:-1;;;;;15520:48:0;;::::1;-1:-1:-1::0;;;15520:48:0::1;::::0;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;15279:3:0;::::1;::::0;::::1;:::i;:::-;;;;15231:348;;;;15693:15;-1:-1:-1::0;;;;;15668:40:0::1;:21;-1:-1:-1::0;;;;;15668:40:0::1;;15664:348;;15729:9;15724:278;-1:-1:-1::0;;;;;15744:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;15740:30;::::1;15724:278;;;-1:-1:-1::0;;;;;15811:19:0;::::1;15795:13;15811:19:::0;;;:10:::1;:19;::::0;;;;:22;;15831:1;;15811:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;15811:22:0;;::::1;15928:17:::0;;;:10:::1;:17:::0;;;;;;15811:22;15928:59:::1;::::0;15851:23;;::::1;::::0;;:14:::1;:23:::0;;;;;:30;;;;;;;:136;-1:-1:-1;15772:3:0;::::1;::::0;::::1;:::i;:::-;;;;15724:278;;;;15664:348;-1:-1:-1::0;;5584:1:0;5572:9;:13;-1:-1:-1;;;;;23563:860:0:o;3834:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3834:47:0;;-1:-1:-1;3834:47:0;;-1:-1:-1;3834:47:0:o;8486:190::-;-1:-1:-1;;;;;8638:17:0;;8582:7;8638:17;;;:10;:17;;;;;:30;;;8612:57;;8621:15;;8638:30;;8612:8;:57::i;728:193:1:-;819:26;877:16;-1:-1:-1;;;;;;;;;;;1037:19:1;;927:145;877:16;-1:-1:-1;;;;;868:44:1;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;861:53;;728:193;:::o;21126:376:0:-;5513:9;;5526:1;5513:14;5505:23;;;;;;5550:1;5538:9;:13;;;21202:294:::1;21222:17:::0;;::::1;21202:294;;;21302:10;21260:23;21286:27:::0;;;:15:::1;:27;::::0;;;;;;;;21331:7:::1;:19:::0;;;;;-1:-1:-1;;;;;21286:27:0;;::::1;::::0;21351:6;;21358:1;21351:9;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21331:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;21331:30:0;;::::1;;21327:159;;;21420:15;21381:10;:21;21392:6;;21399:1;21392:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21381:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;21381:21:0;:54;;:35:::1;::::0;:54:::1;::::0;;;-1:-1:-1;;;21381:54:0;::::1;-1:-1:-1::0;;;;;21381:54:0::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;21381:54:0::1;;;;;-1:-1:-1::0;;;;;21381:54:0::1;;;;;;21453:18;21461:6;;21468:1;21461:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;21453:7;:18::i;:::-;-1:-1:-1::0;21241:3:0;::::1;::::0;::::1;:::i;:::-;;;;21202:294;;;-1:-1:-1::0;;5584:1:0;5572:9;:13;-1:-1:-1;21126:376:0:o;22287:80::-;22348:10;22338:21;;;;:9;:21;;;;;;22329:31;;:8;:31::i;:::-;22287:80::o;18772:499::-;5513:9;;5526:1;5513:14;5505:23;;;;;;5550:1;5538:9;:13;;;18865:10:::1;13452:24:::0;;;:15:::1;:24;::::0;;;;;;;;13507:9:::1;:18:::0;;;;;;18865:10;;-1:-1:-1;;;;;13452:24:0;;::::1;::::0;13507:18;13535:1241:::1;-1:-1:-1::0;;;;;13555:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;13551:30;::::1;13535:1241;;;-1:-1:-1::0;;;;;13618:19:0;::::1;13602:13;13618:19:::0;;;:10:::1;:19;::::0;;;;:22;;13638:1;;13618:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;13618:22:0::1;13686:17:::0;;;:10:::1;:17:::0;;;;;;;13654:49;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;13654:49:0;;::::1;::::0;;-1:-1:-1;;;13654:49:0;;::::1;;::::0;;::::1;::::0;;;;13618:22;13654:49;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;13654:49:0;;::::1;;::::0;;;;13618:22;;-1:-1:-1;13768:28:0::1;13654:49:::0;13768:15:::1;:28::i;:::-;13733:32;::::0;::::1;:63:::0;13889:24:::1;::::0;::::1;::::0;13863:51:::1;::::0;13872:15:::1;::::0;13863:51:::1;;:8;:51::i;:::-;13810:118;::::0;;::::1;:26;::::0;::::1;:118:::0;;;-1:-1:-1;;;;;14019:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:31;;;;::::1;::::0;-1:-1:-1;;;;;14019:31:0;;::::1;-1:-1:-1::0;;;14019:31:0::1;::::0;::::1;;::::0;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;-1:-1:-1::0;;;14019:31:0::1;-1:-1:-1::0;;;;;;14019:31:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;14105:23;;::::1;::::0;;:14:::1;:23:::0;;;;;:60;;;;;;;;;14065:100;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;;;14272:33:::1;14120:7:::0;14030:5;14272:17:::1;:33::i;:::-;14249:56;;14502:13;14487:12;:28;14483:283;;;-1:-1:-1::0;;;;;14535:23:0;;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;:30;;::::1;::::0;;;;;;;;:47:::1;::::0;;::::1;:62:::0;;;14692:10:::1;:17:::0;;;;;;:59:::1;::::0;14615:30;;;:136;14483:283:::1;13588:1188;;;;;13583:3;;;;;:::i;:::-;;;;13535:1241;;;;18896:9:::2;18891:374;18911:17:::0;;::::2;18891:374;;;19181:10;19173:19;::::0;;;:7:::2;:19;::::0;;;;;19193:6;;19200:1;19193:9;;::::2;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19173:30:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;19173:30:0;;::::2;;19168:87;;19223:17;19230:6;;19237:1;19230:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;19223:6;:17::i;:::-;18930:3:::0;::::2;::::0;::::2;:::i;:::-;;;;18891:374;;;-1:-1:-1::0;14906:13:0::1;::::0;14856:15;;14929:39:::1;-1:-1:-1::0;;;;;14929:39:0;::::1;14906:13:::0;14929:39:::1;:::i;:::-;;;15004:23;15019:7;15004:14;:23::i;:::-;-1:-1:-1::0;;;;;15038:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;:42;;-1:-1:-1;;;;;;15038:42:0::1;-1:-1:-1::0;;;;;15038:42:0;::::1;::::0;;::::1;::::0;;;;;-1:-1:-1;15090:33:0::1;::::0;;::::1;:::i;:::-;15133:13;:30:::0;;;15090:33;-1:-1:-1;15236:9:0::1;15231:348;-1:-1:-1::0;;;;;15251:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;15247:30;::::1;15231:348;;;-1:-1:-1::0;;;;;15314:19:0;::::1;15298:13;15314:19:::0;;;:10:::1;:19;::::0;;;;:22;;15334:1;;15314:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;15314:22:0::1;15375:17:::0;;;:10:::1;:17:::0;;;;;;;:31;15314:22;;-1:-1:-1;;;;;;;;;15375:31:0;;::::1;;15420:39;15438:21:::0;15375:31;15420:39:::1;:::i;:::-;::::0;-1:-1:-1;15473:33:0::1;15491:15:::0;15420:39;15473:33:::1;:::i;:::-;-1:-1:-1::0;;;;;15520:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:48;;-1:-1:-1;;;;;15520:48:0;;::::1;-1:-1:-1::0;;;15520:48:0::1;::::0;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;15279:3:0;::::1;::::0;::::1;:::i;:::-;;;;15231:348;;;;15693:15;-1:-1:-1::0;;;;;15668:40:0::1;:21;-1:-1:-1::0;;;;;15668:40:0::1;;15664:348;;15729:9;15724:278;-1:-1:-1::0;;;;;15744:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;15740:30;::::1;15724:278;;;-1:-1:-1::0;;;;;15811:19:0;::::1;15795:13;15811:19:::0;;;:10:::1;:19;::::0;;;;:22;;15831:1;;15811:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;15811:22:0;;::::1;15928:17:::0;;;:10:::1;:17:::0;;;;;;15811:22;15928:59:::1;::::0;15851:23;;::::1;::::0;;:14:::1;:23:::0;;;;;:30;;;;;;;:136;-1:-1:-1;15772:3:0;::::1;::::0;::::1;:::i;:::-;;;;15724:278;;9081:363:::0;-1:-1:-1;;;;;9184:17:0;;9133:7;9184:17;;;:10;:17;;;;;;;;9152:49;;;;;;;;;-1:-1:-1;;;;;9152:49:0;;;;;-1:-1:-1;;;9152:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9152:49:0;;;;;;;;9215:15;:43;9211:82;;-1:-1:-1;9281:1:0;;9081:363;-1:-1:-1;;9081:363:0:o;9211:82::-;9302:18;9350:15;9323:11;:24;;;:42;;;;;;:::i;:::-;9396:29;;9302:63;;-1:-1:-1;3106:6:0;;9383:42;;-1:-1:-1;;;;;9383:42:0;9302:63;9383:42;:::i;:::-;9382:55;;;;:::i;:::-;9375:62;9081:363;-1:-1:-1;;;;9081:363:0:o;17473:1078::-;5513:9;;5526:1;5513:14;5505:23;;;;;;5550:1;5538:9;:13;;;17615:10:::1;13452:24:::0;;;:15:::1;:24;::::0;;;;;;;;13507:9:::1;:18:::0;;;;;;17615:10;;-1:-1:-1;;;;;13452:24:0;;::::1;::::0;13507:18;13535:1241:::1;-1:-1:-1::0;;;;;13555:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;13551:30;::::1;13535:1241;;;-1:-1:-1::0;;;;;13618:19:0;::::1;13602:13;13618:19:::0;;;:10:::1;:19;::::0;;;;:22;;13638:1;;13618:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;13618:22:0::1;13686:17:::0;;;:10:::1;:17:::0;;;;;;;13654:49;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;13654:49:0;;::::1;::::0;;-1:-1:-1;;;13654:49:0;;::::1;;::::0;;::::1;::::0;;;;13618:22;13654:49;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;13654:49:0;;::::1;;::::0;;;;13618:22;;-1:-1:-1;13768:28:0::1;13654:49:::0;13768:15:::1;:28::i;:::-;13733:32;::::0;::::1;:63:::0;13889:24:::1;::::0;::::1;::::0;13863:51:::1;::::0;13872:15:::1;::::0;13863:51:::1;;:8;:51::i;:::-;13810:118;::::0;;::::1;:26;::::0;::::1;:118:::0;;;-1:-1:-1;;;;;14019:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:31;;;;::::1;::::0;-1:-1:-1;;;;;14019:31:0;;::::1;-1:-1:-1::0;;;14019:31:0::1;::::0;::::1;;::::0;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;-1:-1:-1::0;;;14019:31:0::1;-1:-1:-1::0;;;;;;14019:31:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;14105:23;;::::1;::::0;;:14:::1;:23:::0;;;;;:60;;;;;;;;;14065:100;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;;;14272:33:::1;14120:7:::0;14030:5;14272:17:::1;:33::i;:::-;14249:56;;14502:13;14487:12;:28;14483:283;;;-1:-1:-1::0;;;;;14535:23:0;;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;:30;;::::1;::::0;;;;;;;;:47:::1;::::0;;::::1;:62:::0;;;14692:10:::1;:17:::0;;;;;;:59:::1;::::0;14615:30;;;:136;14483:283:::1;13588:1188;;;;;13583:3;;;;;:::i;:::-;;;;13535:1241;;;;17654:1:::2;17645:6;:10;17637:39;;;::::0;-1:-1:-1;;;17637:39:0;;9032:2:7;17637:39:0::2;::::0;::::2;9014:21:7::0;9071:2;9051:18;;;9044:30;-1:-1:-1;;;9090:18:7;;;9083:46;9146:18;;17637:39:0::2;8830:340:7::0;17637:39:0::2;17705:5;::::0;17687:59:::2;::::0;-1:-1:-1;;;;;17705:5:0::2;17712:10;17732:4;17739:6:::0;17687:17:::2;:59::i;:::-;17771:6;17756:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;17797:10:0::2;17787:21;::::0;;;:9:::2;:21;::::0;;;;:31;;17812:6;;17787:21;:31:::2;::::0;17812:6;;17787:31:::2;:::i;:::-;::::0;;;-1:-1:-1;;17833:11:0;;17829:487:::2;;17874:3;::::0;17868:27:::2;::::0;-1:-1:-1;;;17868:27:0;;::::2;::::0;::::2;160:25:7::0;;;17899:10:0::2;::::0;-1:-1:-1;;;;;17874:3:0::2;::::0;17868:18:::2;::::0;133::7;;17868:27:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;17868:41:0::2;;17860:66;;;::::0;-1:-1:-1;;;17860:66:0;;9377:2:7;17860:66:0::2;::::0;::::2;9359:21:7::0;9416:2;9396:18;;;9389:30;-1:-1:-1;;;9435:18:7;;;9428:42;9487:18;;17860:66:0::2;9175:336:7::0;17860:66:0::2;17953:10;17944:20;::::0;;;:8:::2;:20;::::0;;;;;17940:167:::2;;17998:10;17989:20;::::0;;;:8:::2;:20;::::0;;;;;;:30;;;18046:5:::2;::::0;18037:55;;-1:-1:-1;;;18037:55:0;;::::2;::::0;::::2;9690:25:7::0;;;9731:18;;;9724:60;;;;-1:-1:-1;;;;;18046:5:0::2;::::0;18037:34:::2;::::0;9663:18:7;;18037:55:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;17940:167;18154:10;18145:20;::::0;;;:8:::2;:20;::::0;;;;;:31;::::2;18120:124;;;::::0;-1:-1:-1;;;18120:124:0;;9997:2:7;18120:124:0::2;::::0;::::2;9979:21:7::0;10036:2;10016:18;;;10009:30;10075:34;10055:18;;;10048:62;-1:-1:-1;;;10126:18:7;;;10119:32;10168:19;;18120:124:0::2;9795:398:7::0;18120:124:0::2;17829:487;;;18294:10;18285:20;::::0;;;:8:::2;:20;::::0;;;;;;-1:-1:-1;17829:487:0::2;18331:9;18326:167;18350:10;:17;18346:1;:21;18326:167;;;18401:10;18393:19;::::0;;;:7:::2;:19;::::0;;;;18413:13;;18393:19;;;18413:10;;18424:1;;18413:13;::::2;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;-1:-1:-1;;;;;18393:34:0::2;::::0;;;::::2;::::0;;;;;;-1:-1:-1;18393:34:0;;::::2;;18388:95;;18447:21;18454:10;18465:1;18454:13;;;;;;;;:::i;:::-;;;;;;;18447:6;:21::i;:::-;18369:3:::0;::::2;::::0;::::2;:::i;:::-;;;;18326:167;;;-1:-1:-1::0;18508:36:0::2;::::0;;5644:25:7;;;5700:2;5685:18;;5678:34;;;18516:10:0::2;::::0;18508:36:::2;::::0;5617:18:7;18508:36:0::2;;;;;;;14906:13:::1;::::0;14856:15;;14929:39:::1;-1:-1:-1::0;;;;;14929:39:0;::::1;14906:13:::0;14929:39:::1;:::i;:::-;;;15004:23;15019:7;15004:14;:23::i;:::-;-1:-1:-1::0;;;;;15038:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;:42;;-1:-1:-1;;;;;;15038:42:0::1;-1:-1:-1::0;;;;;15038:42:0;::::1;::::0;;::::1;::::0;;;;;-1:-1:-1;15090:33:0::1;::::0;;::::1;:::i;:::-;15133:13;:30:::0;;;15090:33;-1:-1:-1;15236:9:0::1;15231:348;-1:-1:-1::0;;;;;15251:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;15247:30;::::1;15231:348;;;-1:-1:-1::0;;;;;15314:19:0;::::1;15298:13;15314:19:::0;;;:10:::1;:19;::::0;;;;:22;;15334:1;;15314:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;15314:22:0::1;15375:17:::0;;;:10:::1;:17:::0;;;;;;;:31;15314:22;;-1:-1:-1;;;;;;;;;15375:31:0;;::::1;;15420:39;15438:21:::0;15375:31;15420:39:::1;:::i;:::-;::::0;-1:-1:-1;15473:33:0::1;15491:15:::0;15420:39;15473:33:::1;:::i;:::-;-1:-1:-1::0;;;;;15520:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:48;;-1:-1:-1;;;;;15520:48:0;;::::1;-1:-1:-1::0;;;15520:48:0::1;::::0;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;15279:3:0;::::1;::::0;::::1;:::i;:::-;;;;15231:348;;;;15693:15;-1:-1:-1::0;;;;;15668:40:0::1;:21;-1:-1:-1::0;;;;;15668:40:0::1;;15664:348;;15729:9;15724:278;-1:-1:-1::0;;;;;15744:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;15740:30;::::1;15724:278;;;-1:-1:-1::0;;;;;15811:19:0;::::1;15795:13;15811:19:::0;;;:10:::1;:19;::::0;;;;:22;;15831:1;;15811:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;15811:22:0;;::::1;15928:17:::0;;;:10:::1;:17:::0;;;;;;15811:22;15928:59:::1;::::0;15851:23;;::::1;::::0;;:14:::1;:23:::0;;;;;:30;;;;;;;:136;-1:-1:-1;15772:3:0;::::1;::::0;::::1;:::i;:::-;;;;15724:278;;;;15664:348;-1:-1:-1::0;;5584:1:0;5572:9;:13;-1:-1:-1;;;;;;17473:1078:0:o;24429:2019::-;5513:9;;5526:1;5513:14;5505:23;;;;;;5550:1;5538:9;:13;24529:5:::1;::::0;-1:-1:-1;;;;;24520:14:0;;::::1;24529:5:::0;::::1;24520:14;;24512:47;;;::::0;-1:-1:-1;;;24512:47:0;;10400:2:7;24512:47:0::1;::::0;::::1;10382:21:7::0;10439:2;10419:18;;;10412:30;-1:-1:-1;;;10458:18:7;;;10451:50;10518:18;;24512:47:0::1;10198:344:7::0;24512:47:0::1;24586:1;24577:6;:10;24569:38;;;::::0;-1:-1:-1;;;24569:38:0;;10749:2:7;24569:38:0::1;::::0;::::1;10731:21:7::0;10788:2;10768:18;;;10761:30;-1:-1:-1;;;10807:18:7;;;10800:45;10862:18;;24569:38:0::1;10547:339:7::0;24569:38:0::1;-1:-1:-1::0;;;;;24625:26:0;::::1;24617:54;;;::::0;-1:-1:-1;;;24617:54:0;;11093:2:7;24617:54:0::1;::::0;::::1;11075:21:7::0;11132:2;11112:18;;;11105:30;-1:-1:-1;;;11151:18:7;;;11144:45;11206:18;;24617:54:0::1;10891:339:7::0;24617:54:0::1;-1:-1:-1::0;;;;;24756:17:0;::::1;24681:14;24756:17:::0;;;:10:::1;:17;::::0;;;;;;;;24724:49;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;24724:49:0;;::::1;::::0;;-1:-1:-1;;;24724:49:0;;::::1;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;24724:49:0;;::::1;;::::0;;;;24706:6;;24863:28:::1;24724:49:::0;24863:15:::1;:28::i;:::-;24828:32;::::0;::::1;:63:::0;24976:24:::1;::::0;::::1;::::0;24950:51:::1;::::0;24959:15:::1;::::0;24950:51:::1;;:8;:51::i;:::-;24901:110;;:26;::::0;::::1;:110:::0;25079:37:::1;::::0;-1:-1:-1;;;25079:37:0;;25110:4:::1;25079:37;::::0;::::1;3300:51:7::0;25055:21:0::1;::::0;-1:-1:-1;;;;;25079:22:0;::::1;::::0;::::1;::::0;3273:18:7;;25079:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25055:61;;25198:59;25216:5;25223:10;25243:4;25250:6;-1:-1:-1::0;;;;;25198:59:0::1;:17;:59::i;:::-;25284:37;::::0;-1:-1:-1;;;25284:37:0;;25315:4:::1;25284:37;::::0;::::1;3300:51:7::0;25324:13:0;;-1:-1:-1;;;;;25284:22:0;::::1;::::0;::::1;::::0;3273:18:7;;25284:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;25267:71;;25372:11;:24;;;25353:43;;:15;:43;25349:490;;-1:-1:-1::0;;;;;25412:38:0;::::1;::::0;;25349:490:::1;;;25481:17;25551:15;25501:11;:24;;;:66;;;;:::i;:::-;25481:86;;25581:13;3106:6;25636:11;:29;;;25623:10;:42;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25622:55:0::1;;;;;:::i;:::-;25581:110;;25722:5;-1:-1:-1::0;;;;;25713:14:0::1;:6;-1:-1:-1::0;;;;;25713:14:0::1;;:37;;;-1:-1:-1::0;25745:5:0::1;::::0;-1:-1:-1;;;;;25745:5:0::1;25731:10;:19;25713:37;25705:63;;;::::0;-1:-1:-1;;;25705:63:0;;12146:2:7;25705:63:0::1;::::0;::::1;12128:21:7::0;12185:2;12165:18;;;12158:30;-1:-1:-1;;;12204:18:7;;;12197:43;12257:18;;25705:63:0::1;11944:337:7::0;25705:63:0::1;25814:14;25823:5:::0;25814:6;:14:::1;:::i;:::-;-1:-1:-1::0;;;;;25782:46:0::1;::::0;;-1:-1:-1;;25349:490:0::1;25856:29:::0;;-1:-1:-1;;;;;25856:33:0::1;25848:64;;;::::0;-1:-1:-1;;;25848:64:0;;12488:2:7;25848:64:0::1;::::0;::::1;12470:21:7::0;12527:2;12507:18;;;12500:30;-1:-1:-1;;;12546:18:7;;;12539:48;12604:18;;25848:64:0::1;12286:342:7::0;25848:64:0::1;25940:37;::::0;-1:-1:-1;;;25940:37:0;;25971:4:::1;25940:37;::::0;::::1;3300:51:7::0;25922:15:0::1;::::0;-1:-1:-1;;;;;25940:22:0;::::1;::::0;::::1;::::0;3273:18:7;;25940:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25922:55;;26041:7;26008:11;:29;;;-1:-1:-1::0;;;;;26008:40:0::1;;;25987:113;;;::::0;-1:-1:-1;;;25987:113:0;;12835:2:7;25987:113:0::1;::::0;::::1;12817:21:7::0;12874:2;12854:18;;;12847:30;12913:28;12893:18;;;12886:56;12959:18;;25987:113:0::1;12633:350:7::0;25987:113:0::1;26144:26;3106:6;26144:15;:26;:::i;:::-;26110:61;::::0;;::::1;:24;::::0;::::1;:61:::0;;;26217:15:::1;26181:52:::0;::::1;:26;::::0;::::1;:52:::0;;;-1:-1:-1;;;;;26244:17:0;::::1;-1:-1:-1::0;26244:17:0;;;:10:::1;:17;::::0;;;;;;;:31;;;;::::1;::::0;-1:-1:-1;;;;;26244:31:0;;::::1;-1:-1:-1::0;;;26244:31:0::1;::::0;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;::::1;-1:-1:-1::0;;;26244:31:0::1;-1:-1:-1::0;;;;;;26244:31:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;26290:8:::1;:15:::0;;;;;::::1;;26285:102;;-1:-1:-1::0;;;;;26321:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:22;;-1:-1:-1;;26321:22:0::1;26339:4;26321:22:::0;;::::1;::::0;;;26357:7:::1;:19:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;26357:19:0::1;::::0;;::::1;::::0;;26285:102:::1;26402:39;::::0;-1:-1:-1;;;;;4302:47:7;;4284:66;;-1:-1:-1;;;;;26402:39:0;::::1;::::0;26415:10:::1;::::0;26402:39:::1;::::0;4272:2:7;4257:18;26402:39:0::1;;;;;;;-1:-1:-1::0;;5584:1:0;5572:9;:13;-1:-1:-1;;;;24429:2019:0:o;20478:481::-;5513:9;;5526:1;5513:14;5505:23;;;;;;5550:1;5538:9;:13;;;20572:10:::1;13452:24:::0;;;:15:::1;:24;::::0;;;;;;;;13507:9:::1;:18:::0;;;;;;20572:10;;-1:-1:-1;;;;;13452:24:0;;::::1;::::0;13507:18;13535:1241:::1;-1:-1:-1::0;;;;;13555:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;13551:30;::::1;13535:1241;;;-1:-1:-1::0;;;;;13618:19:0;::::1;13602:13;13618:19:::0;;;:10:::1;:19;::::0;;;;:22;;13638:1;;13618:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;13618:22:0::1;13686:17:::0;;;:10:::1;:17:::0;;;;;;;13654:49;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;13654:49:0;;::::1;::::0;;-1:-1:-1;;;13654:49:0;;::::1;;::::0;;::::1;::::0;;;;13618:22;13654:49;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;13654:49:0;;::::1;;::::0;;;;13618:22;;-1:-1:-1;13768:28:0::1;13654:49:::0;13768:15:::1;:28::i;:::-;13733:32;::::0;::::1;:63:::0;13889:24:::1;::::0;::::1;::::0;13863:51:::1;::::0;13872:15:::1;::::0;13863:51:::1;;:8;:51::i;:::-;13810:118;::::0;;::::1;:26;::::0;::::1;:118:::0;;;-1:-1:-1;;;;;14019:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:31;;;;::::1;::::0;-1:-1:-1;;;;;14019:31:0;;::::1;-1:-1:-1::0;;;14019:31:0::1;::::0;::::1;;::::0;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;-1:-1:-1::0;;;14019:31:0::1;-1:-1:-1::0;;;;;;14019:31:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;14105:23;;::::1;::::0;;:14:::1;:23:::0;;;;;:60;;;;;;;;;14065:100;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;;;14272:33:::1;14120:7:::0;14030:5;14272:17:::1;:33::i;:::-;14249:56;;14502:13;14487:12;:28;14483:283;;;-1:-1:-1::0;;;;;14535:23:0;;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;:30;;::::1;::::0;;;;;;;;:47:::1;::::0;;::::1;:62:::0;;;14692:10:::1;:17:::0;;;;;;:59:::1;::::0;14615:30;;;:136;14483:283:::1;13588:1188;;;;;13583:3;;;;;:::i;:::-;;;;13535:1241;;;;20803:9:::2;20798:155;20818:17:::0;;::::2;20798:155;;;20868:10;20860:19;::::0;;;:7:::2;:19;::::0;;;;;20880:6;;20887:1;20880:9;;::::2;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20860:30:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;20860:30:0;;::::2;;20856:87;;;20910:18;20918:6;;20925:1;20918:9;;;;;;;:::i;20910:18::-;20837:3:::0;::::2;::::0;::::2;:::i;:::-;;;;20798:155;;;-1:-1:-1::0;14906:13:0::1;::::0;14856:15;;14929:39:::1;-1:-1:-1::0;;;;;14929:39:0;::::1;14906:13:::0;14929:39:::1;:::i;:::-;;;15004:23;15019:7;15004:14;:23::i;:::-;-1:-1:-1::0;;;;;15038:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;:42;;-1:-1:-1;;;;;;15038:42:0::1;-1:-1:-1::0;;;;;15038:42:0;::::1;::::0;;::::1;::::0;;;;;-1:-1:-1;15090:33:0::1;::::0;;::::1;:::i;:::-;15133:13;:30:::0;;;15090:33;-1:-1:-1;15236:9:0::1;15231:348;-1:-1:-1::0;;;;;15251:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;15247:30;::::1;15231:348;;;-1:-1:-1::0;;;;;15314:19:0;::::1;15298:13;15314:19:::0;;;:10:::1;:19;::::0;;;;:22;;15334:1;;15314:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;15314:22:0::1;15375:17:::0;;;:10:::1;:17:::0;;;;;;;:31;15314:22;;-1:-1:-1;;;;;;;;;15375:31:0;;::::1;;15420:39;15438:21:::0;15375:31;15420:39:::1;:::i;:::-;::::0;-1:-1:-1;15473:33:0::1;15491:15:::0;15420:39;15473:33:::1;:::i;:::-;-1:-1:-1::0;;;;;15520:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:48;;-1:-1:-1;;;;;15520:48:0;;::::1;-1:-1:-1::0;;;15520:48:0::1;::::0;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;15279:3:0;::::1;::::0;::::1;:::i;:::-;;;;15231:348;;;;15693:15;-1:-1:-1::0;;;;;15668:40:0::1;:21;-1:-1:-1::0;;;;;15668:40:0::1;;15664:348;;15729:9;15724:278;-1:-1:-1::0;;;;;15744:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;15740:30;::::1;15724:278;;;-1:-1:-1::0;;;;;15811:19:0;::::1;15795:13;15811:19:::0;;;:10:::1;:19;::::0;;;;:22;;15831:1;;15811:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;15811:22:0;;::::1;15928:17:::0;;;:10:::1;:17:::0;;;;;;15811:22;15928:59:::1;::::0;15851:23;;::::1;::::0;;:14:::1;:23:::0;;;;;:30;;;;;;;:136;-1:-1:-1;15772:3:0;::::1;::::0;::::1;:::i;:::-;;;;15724:278;;16217:115:::0;16287:5;;16281:34;;-1:-1:-1;;;16281:34:0;;16304:10;16281:34;;;3300:51:7;16273:52:0;;-1:-1:-1;;;;;16287:5:0;;16281:22;;3273:18:7;;16281:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16317:7;16273;:52::i;:::-;16217:115;:::o;12426:818::-;12566:5;;;12582;12557:31;;-1:-1:-1;;;12557:31:0;;-1:-1:-1;;;;;12582:5:0;;;12557:31;;;3300:51:7;12465:16:0;;;;;;12566:5;;;12557:24;;3273:18:7;;12557:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12625:16;;;12639:1;12625:16;;;;;;;;12538:50;;-1:-1:-1;12599:23:0;;12625:16;;;;;;;;;;-1:-1:-1;;12688:5:0;;12676:27;;;-1:-1:-1;;;12676:27:0;;;;12599:42;;-1:-1:-1;;;;;;12688:5:0;;;;12676:25;;-1:-1:-1;12676:27:0;;;;;;;;;;12688:5;;12676:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12652:6;12659:1;12652:9;;;;;;;;:::i;:::-;;;;;;12663:6;12670:1;12663:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12651:52:0;;;12663:9;;;;;;;;;12651:52;;;;;12780:16;;;12794:1;12780:16;;;;;;;;;12746:31;;12780:16;;;;;;;;;;;;-1:-1:-1;12780:16:0;12746:50;;12832:6;12839:1;12832:9;;;;;;;;:::i;:::-;;;;;;;;;;;12826:36;;-1:-1:-1;;;12826:36:0;;-1:-1:-1;;;;;3318:32:7;;;12826:36:0;;;3300:51:7;12826:26:0;;;;;;3273:18:7;;12826:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12806:14;12821:1;12806:17;;;;;;;;:::i;:::-;;;;;;:56;;;;;12898:6;12905:1;12898:9;;;;;;;;:::i;:::-;;;;;;;;;;;12892:36;;-1:-1:-1;;;12892:36:0;;-1:-1:-1;;;;;3318:32:7;;;12892:36:0;;;3300:51:7;12892:26:0;;;;;;3273:18:7;;12892:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12872:14;12887:1;12872:17;;;;;;;;:::i;:::-;;;;;;:56;;;;;12988:8;-1:-1:-1;;;;;12977:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13105:14;13120:1;13105:17;;;;;;;;:::i;:::-;;;;;;;13072:6;13079:1;13072:9;;;;;;;;:::i;:::-;;;;;;;;;;;13066:36;;-1:-1:-1;;;13066:36:0;;-1:-1:-1;;;;;3318:32:7;;;13066:36:0;;;3300:51:7;13066:26:0;;;;;;3273:18:7;;13066:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;;:::i;:::-;13055:67;;13182:14;13197:1;13182:17;;;;;;;;:::i;:::-;;;;;;;13149:6;13156:1;13149:9;;;;;;;;:::i;:::-;;;;;;;;;;;13143:36;;-1:-1:-1;;;13143:36:0;;-1:-1:-1;;;;;3318:32:7;;;13143:36:0;;;3300:51:7;13143:26:0;;;;;;3273:18:7;;13143:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;;:::i;:::-;13132:67;;13210:27;;;12426:818;;:::o;6203:752::-;6265:7;6307:16;-1:-1:-1;;;;;;;;;;;1037:19:1;;927:145;6307:16:0;-1:-1:-1;;;;;6288:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6284:665;;;-1:-1:-1;;;;;;6363:18:0;;;;;:9;:18;;;;;;;6203:752::o;6284:665::-;-1:-1:-1;;;;;6431:17:0;;6412:16;6431:17;;;:8;:17;;;;;;;;;6481:9;:18;;;;;;6431:17;;6550:3;6533:13;6481:18;6544:2;6533:13;:::i;:::-;6532:21;;;;:::i;:::-;6513:40;;6567:17;6602:15;6626:3;;;;;;;;;-1:-1:-1;;;;;6626:3:0;-1:-1:-1;;;;;6620:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6679:3;;6673:28;;-1:-1:-1;;;6673:28:0;;;;;160:25:7;;;6602:42:0;;-1:-1:-1;;;;;;6679:3:0;;6673:18;;133::7;;6673:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6662:39:0;:7;-1:-1:-1;;;;;6662:39:0;;:54;;;;;6715:1;6705:7;:11;6662:54;6658:218;;;6754:3;;6748:33;;-1:-1:-1;;;6748:33:0;;;;;160:25:7;;;-1:-1:-1;;;;;6754:3:0;;;;6748:23;;133:18:7;;6748:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6736:45;;6858:3;6841:7;6828:9;6814:11;;:23;;;;:::i;:::-;6813:35;;;;:::i;:::-;6812:42;;6852:2;6812:42;:::i;:::-;6811:50;;;;:::i;:::-;6799:62;;6658:218;6896:42;6906:20;6917:9;6906:8;:20;:::i;:::-;6929:8;6896;:42::i;:::-;6889:49;6203:752;-1:-1:-1;;;;;;;6203:752:0:o;6284:665::-;6203:752;;;:::o;26808:560::-;691:19:4;:17;:19::i;:::-;-1:-1:-1;;;;;677:33:4;:10;-1:-1:-1;;;;;677:33:4;;669:61;;;;-1:-1:-1;;;669:61:4;;14085:2:7;669:61:4;;;14067:21:7;14124:2;14104:18;;;14097:30;-1:-1:-1;;;14143:18:7;;;14136:45;14198:18;;669:61:4;13883:339:7;669:61:4;26935:5:0::1;::::0;-1:-1:-1;;;;;26926:14:0;;::::1;26935:5:::0;::::1;26926:14;;26918:45;;;::::0;-1:-1:-1;;;26918:45:0;;14429:2:7;26918:45:0::1;::::0;::::1;14411:21:7::0;14468:2;14448:18;;;14441:30;-1:-1:-1;;;14487:18:7;;;14480:48;14545:18;;26918:45:0::1;14227:342:7::0;26918:45:0::1;26991:1;26982:6;:10;26974:40;;;::::0;-1:-1:-1;;;26974:40:0;;14776:2:7;26974:40:0::1;::::0;::::1;14758:21:7::0;14815:2;14795:18;;;14788:30;-1:-1:-1;;;14834:18:7;;;14827:47;14891:18;;26974:40:0::1;14574:341:7::0;26974:40:0::1;27062:5;::::0;27053:29:::1;::::0;;-1:-1:-1;;;27053:29:0;;;;27024:26:::1;::::0;-1:-1:-1;;;;;27062:5:0::1;::::0;27053:27:::1;::::0;:29:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;27062:5;27053:29:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27024:58;;27152:47;27165:5;27172:18;27192:6;27152:12;:47::i;:::-;27209:106;::::0;-1:-1:-1;;;27209:106:0;;-1:-1:-1;;;;;15112:32:7;;;27209:106:0::1;::::0;::::1;15094:51:7::0;15161:18;;;15154:34;;;27209:57:0;::::1;::::0;::::1;::::0;15067:18:7;;27209:106:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27347:5;-1:-1:-1::0;;;;;27331:30:0::1;;27354:6;27331:30;;;;160:25:7::0;;148:2;133:18;;14:177;27331:30:0::1;;;;;;;;26908:460;26808:560:::0;;:::o;16566:624::-;16650:5;;16760:10;16633:14;16752:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;16650:5:0;;;16752:27;;;;;;;;;;;;16747:437;;16826:16;;;16840:1;16826:16;;;;;;;;;16795:28;;16826:16;;;;;;;;;;-1:-1:-1;;16905:5:0;;16893:27;;;-1:-1:-1;;;16893:27:0;;;;16795:47;;-1:-1:-1;16857:15:0;;;;-1:-1:-1;;;;;16905:5:0;;16893:25;;:27;;;;;;;;;;;16857:15;16905:5;16893:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16856:64;;;;16951:6;16934:11;16946:1;16934:14;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;16934:23:0;;;-1:-1:-1;;;;;16934:23:0;;;;;16988:7;16971:11;16983:1;16971:14;;;;;;;;:::i;:::-;;;;;;:24;-1:-1:-1;;;;;16971:24:0;;;-1:-1:-1;;;;;16971:24:0;;;;;17026:7;17009:11;17021:1;17009:14;;;;;;;;:::i;:::-;;;;;;:24;-1:-1:-1;;;;;17009:24:0;;;-1:-1:-1;;;;;17009:24:0;;;;;17047:45;17063:6;17071:7;17080:11;17047:15;:45::i;:::-;16781:322;;;16623:567;16566:624;;:::o;16747:437::-;17156:16;;;17170:1;17156:16;;;;;;;;17123:50;;17139:6;;17147:7;;17123:15;:50::i;:::-;16623:567;16566:624;;:::o;10667:183::-;-1:-1:-1;;;;;10780:17:0;;10729:7;10780:17;;;:10;:17;;;;;;;;10748:49;;;;;;;;;-1:-1:-1;;;;;10748:49:0;;;;;-1:-1:-1;;;10748:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10748:49:0;;;;;;;;10815:28;10748:49;10815:15;:28::i;:::-;10808:35;10667:183;-1:-1:-1;;;10667:183:0:o;4662:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4662:24:0;;-1:-1:-1;4662:24:0;:::o;5598:314::-;-1:-1:-1;;;;;;;;;;;1037:19:1;-1:-1:-1;;;;;385:30:1;:10;-1:-1:-1;;;;;385:30:1;;377:55;;;;-1:-1:-1;;;377:55:1;;15401:2:7;377:55:1;;;15383:21:7;15440:2;15420:18;;;15413:30;-1:-1:-1;;;15459:18:7;;;15452:42;15511:18;;377:55:1;15199:336:7;377:55:1;1014:16:4::1;1008:23:::0;1063:1:::1;1047:18:::0;::::1;1044:66;;;1094:1;1091::::0;1084:12:::1;1044:66;1148:1;1130:16;1123:27:::0;;;5764:9:0::2;:13:::0;;;5787:14;;-1:-1:-1;;;;;5787:14:0;;::::2;-1:-1:-1::0;;;;;;5787:14:0;;::::2;;::::0;;;5811:5:::2;:14:::0;;;;::::2;::::0;;::::2;;::::0;;5835:3:::2;:10:::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;5855:5:::2;:14:::0;;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;;5887:18:::2;::::0;;-1:-1:-1;;;5887:18:0;;;;:16:::2;::::0;:18;;::::2;::::0;::::2;::::0;;;;;;;;5835:10;5887:18:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5879:5;:26:::0;;-1:-1:-1;;;;;;5879:26:0::2;-1:-1:-1::0;;;;;5879:26:0;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;;;5598:314:0:o;22976:581::-;5513:9;;5526:1;5513:14;5505:23;;;;;;5550:1;5538:9;:13;;;23081:10:::1;13452:24:::0;;;:15:::1;:24;::::0;;;;;;;;13507:9:::1;:18:::0;;;;;;23081:10;;-1:-1:-1;;;;;13452:24:0;;::::1;::::0;13507:18;13535:1241:::1;-1:-1:-1::0;;;;;13555:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;13551:30;::::1;13535:1241;;;-1:-1:-1::0;;;;;13618:19:0;::::1;13602:13;13618:19:::0;;;:10:::1;:19;::::0;;;;:22;;13638:1;;13618:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;13618:22:0::1;13686:17:::0;;;:10:::1;:17:::0;;;;;;;13654:49;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;13654:49:0;;::::1;::::0;;-1:-1:-1;;;13654:49:0;;::::1;;::::0;;::::1;::::0;;;;13618:22;13654:49;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;13654:49:0;;::::1;;::::0;;;;13618:22;;-1:-1:-1;13768:28:0::1;13654:49:::0;13768:15:::1;:28::i;:::-;13733:32;::::0;::::1;:63:::0;13889:24:::1;::::0;::::1;::::0;13863:51:::1;::::0;13872:15:::1;::::0;13863:51:::1;;:8;:51::i;:::-;13810:118;::::0;;::::1;:26;::::0;::::1;:118:::0;;;-1:-1:-1;;;;;14019:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:31;;;;::::1;::::0;-1:-1:-1;;;;;14019:31:0;;::::1;-1:-1:-1::0;;;14019:31:0::1;::::0;::::1;;::::0;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;-1:-1:-1::0;;;14019:31:0::1;-1:-1:-1::0;;;;;;14019:31:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;14105:23;;::::1;::::0;;:14:::1;:23:::0;;;;;:60;;;;;;;;;14065:100;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;;;14272:33:::1;14120:7:::0;14030:5;14272:17:::1;:33::i;:::-;14249:56;;14502:13;14487:12;:28;14483:283;;;-1:-1:-1::0;;;;;14535:23:0;;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;:30;;::::1;::::0;;;;;;;;:47:::1;::::0;;::::1;:62:::0;;;14692:10:::1;:17:::0;;;;;;:59:::1;::::0;14615:30;;;:136;14483:283:::1;13588:1188;;;;;13583:3;;;;;:::i;:::-;;;;13535:1241;;;;23122:6:::2;23107:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;23148:10:0::2;23138:21;::::0;;;:9:::2;:21;::::0;;;;:31;;23163:6;;23138:21;:31:::2;::::0;23163:6;;23138:31:::2;:::i;:::-;::::0;;;-1:-1:-1;;23193:5:0::2;::::0;23179:40:::2;::::0;-1:-1:-1;;;;;23193:5:0::2;23200:10;23212:6:::0;23179:13:::2;:40::i;:::-;23234:11:::0;;23230:268:::2;;23289:10;23280:20;::::0;;;:8:::2;:20;::::0;;;;;23269:31;::::2;23261:56;;;::::0;-1:-1:-1;;;23261:56:0;;9377:2:7;23261:56:0::2;::::0;::::2;9359:21:7::0;9416:2;9396:18;;;9389:30;-1:-1:-1;;;9435:18:7;;;9428:42;9487:18;;23261:56:0::2;9175:336:7::0;23261:56:0::2;23340:10;23354:1;23331:20:::0;;;:8:::2;:20;::::0;;;;;:24;;;;23378:5:::2;::::0;23369:57;;-1:-1:-1;;;23369:57:0;;::::2;::::0;::::2;9690:25:7::0;;;9731:18;;;9724:60;;;;-1:-1:-1;;;;;23378:5:0::2;::::0;23369:36:::2;::::0;9663:18:7;;23369:57:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;23230:268;;;23476:10;23467:20;::::0;;;:8:::2;:20;::::0;;;;;;-1:-1:-1;23230:268:0::2;23513:37;::::0;;5644:25:7;;;5700:2;5685:18;;5678:34;;;23522:10:0::2;::::0;23513:37:::2;::::0;5617:18:7;23513:37:0::2;;;;;;;14906:13:::1;::::0;14856:15;;14929:39:::1;-1:-1:-1::0;;;;;14929:39:0;::::1;14906:13:::0;14929:39:::1;:::i;:::-;;;15004:23;15019:7;15004:14;:23::i;:::-;-1:-1:-1::0;;;;;15038:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;:42;;-1:-1:-1;;;;;;15038:42:0::1;-1:-1:-1::0;;;;;15038:42:0;::::1;::::0;;::::1;::::0;;;;;-1:-1:-1;15090:33:0::1;::::0;;::::1;:::i;:::-;15133:13;:30:::0;;;15090:33;-1:-1:-1;15236:9:0::1;15231:348;-1:-1:-1::0;;;;;15251:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;15247:30;::::1;15231:348;;;-1:-1:-1::0;;;;;15314:19:0;::::1;15298:13;15314:19:::0;;;:10:::1;:19;::::0;;;;:22;;15334:1;;15314:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;15314:22:0::1;15375:17:::0;;;:10:::1;:17:::0;;;;;;;:31;15314:22;;-1:-1:-1;;;;;;;;;15375:31:0;;::::1;;15420:39;15438:21:::0;15375:31;15420:39:::1;:::i;:::-;::::0;-1:-1:-1;15473:33:0::1;15491:15:::0;15420:39;15473:33:::1;:::i;:::-;-1:-1:-1::0;;;;;15520:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:48;;-1:-1:-1;;;;;15520:48:0;;::::1;-1:-1:-1::0;;;15520:48:0::1;::::0;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;15279:3:0;::::1;::::0;::::1;:::i;:::-;;;;15231:348;;;;15693:15;-1:-1:-1::0;;;;;15668:40:0::1;:21;-1:-1:-1::0;;;;;15668:40:0::1;;15664:348;;15729:9;15724:278;-1:-1:-1::0;;;;;15744:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;15740:30;::::1;15724:278;;;-1:-1:-1::0;;;;;15811:19:0;::::1;15795:13;15811:19:::0;;;:10:::1;:19;::::0;;;;:22;;15831:1;;15811:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;15811:22:0;;::::1;15928:17:::0;;;:10:::1;:17:::0;;;;;;15811:22;15928:59:::1;::::0;15851:23;;::::1;::::0;;:14:::1;:23:::0;;;;;:30;;;;;;;:136;-1:-1:-1;15772:3:0;::::1;::::0;::::1;:::i;:::-;;;;15724:278;;11059:655:::0;11162:7;11189:11;:25;;;-1:-1:-1;;;;;11189:30:0;11218:1;11189:30;11185:100;;;-1:-1:-1;11242:32:0;;;;11059:655::o;11185:100::-;11295:19;11406:62;11415:11;:26;;;11406:62;;11443:11;:24;;;11406:62;;:8;:62::i;:::-;11318:85;11340:15;11369:11;:24;;;11318:85;;:8;:85::i;:::-;:150;;;;:::i;:::-;11295:174;;11681:11;11652;:25;;;-1:-1:-1;;;;;11573:104:0;11599:11;:29;;;-1:-1:-1;;;;;11574:54:0;3106:6;-1:-1:-1;;;11575:20:0;;;;:::i;:::-;11574:54;;;;:::i;:::-;11573:104;;;;:::i;:::-;11572:120;;;;:::i;:::-;11499:11;:32;;;:208;;;;:::i;293:104::-;351:7;381:1;377;:5;:13;;389:1;377:13;;;-1:-1:-1;385:1:0;;370:20;-1:-1:-1;293:104:0:o;7895:468::-;-1:-1:-1;;;;;8064:23:0;;;8001:7;8064:23;;;:14;:23;;;;;;;;:30;;;;;;;;;;;;8024:70;;;;;;;;;;;;;;;;;;;;;8217:17;;;:10;:17;;;;;;:38;;8001:7;;8024:70;;8001:7;;-1:-1:-1;;;3192:6:0;8217:99;;8024:70;8217:99;:::i;:::-;-1:-1:-1;;;;;8173:24:0;;;;;;:15;:24;;;;;;:144;;;-1:-1:-1;;;;;8173:24:0;:144;:::i;:::-;8172:158;;;;:::i;:::-;8123:15;:32;;;8122:209;;;;:::i;27498:461::-;27640:1;27620:5;-1:-1:-1;;;;;27620:17:0;;:21;27612:43;;;;-1:-1:-1;;;27612:43:0;;;;;;;:::i;:::-;27725:58;;;-1:-1:-1;;;;;15112:32:7;;;27725:58:0;;;15094:51:7;15161:18;;;;15154:34;;;27725:58:0;;;;;;;;;;15067:18:7;;;;27725:58:0;;;;;;;-1:-1:-1;;;;;27725:58:0;-1:-1:-1;;;27725:58:0;;;27701:92;;-1:-1:-1;;;;27701:10:0;;;;:92;;27725:58;27701:92;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27665:128;;;;27824:7;:57;;;;-1:-1:-1;27836:11:0;;:16;;:44;;;27867:4;27856:24;;;;;;;;;;;;:::i;:::-;27803:149;;;;-1:-1:-1;;;27803:149:0;;16510:2:7;27803:149:0;;;16492:21:7;16549:2;16529:18;;;16522:30;16588:34;16568:18;;;16561:62;-1:-1:-1;;;16639:18:7;;;16632:43;16692:19;;27803:149:0;16308:409:7;27803:149:0;27602:357;;27498:461;;;:::o;21641:640::-;21700:10;21721:5;21692:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;21692:26:0;;;;;;;;;;;:34;;-1:-1:-1;;21692:34:0;;;21752:27;;;:15;:27;;;;;:34;;;;;;;;;;21796:41;;;;21934:22;;;:10;:22;;;;;21970:29;;:33;;21692:34;;21970:33;:::i;:::-;21934:79;;;;;;;;:::i;:::-;;;;;;;;;;;;;22035:10;22024:22;;:10;:22;;;;;;;:29;;-1:-1:-1;;;;;21934:79:0;;;;-1:-1:-1;21934:79:0;;22047:5;;22024:29;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;-1:-1:-1;;;;;;22024:41:0;-1:-1:-1;;;;;22024:41:0;;;;;;22112:10;22096:27;;;:15;:27;;;;;;:38;;;;;;;;;;;:46;;;22180:22;;:10;:22;;;:28;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;22180:28:0;;;;;-1:-1:-1;;;;;;22180:28:0;;;;;;;;;22249:25;;-1:-1:-1;;;;;22249:25:0;;;22256:10;;22249:25;;22180:28;22249:25;21682:599;;21641:640;:::o;19387:852::-;-1:-1:-1;;;;;19469:17:0;;19437:29;19469:17;;;:10;:17;;;;;;;;19437:49;;;;;;;;;-1:-1:-1;;;;;19437:49:0;;;;;-1:-1:-1;;;19437:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19437:49:0;;;;;;;;19542:10;19526:27;;:15;:27;;;;;;;;19497:56;;19437:49;;19526:27;;;19437:49;19497:56;;19526:27;;19497:56;:::i;:::-;-1:-1:-1;;;;;19497:56:0;;;-1:-1:-1;19598:28:0;19614:11;19598:15;:28::i;:::-;19563:32;;;:63;19711:24;;;;19685:51;;19694:15;;19685:51;;:8;:51::i;:::-;19636:110;;;;:26;;;:110;;;-1:-1:-1;;;;;19756:17:0;;;;;;:10;:17;;;;;;;;:31;;;;;;-1:-1:-1;;;;;19756:31:0;;;-1:-1:-1;;;19756:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19756:31:0;-1:-1:-1;;;;;;19756:31:0;;;;;;;;;;;;;;;;;;19838:129;;;;;;;19891:32;;19838:129;;;;;;;;19992:10;19977:26;;;:14;:26;;;;;:33;;;;;;;;:51;;;;;;;;;;;;;20038:19;;;:7;:19;;;;;:26;;;;;;;;:33;;-1:-1:-1;;20038:33:0;;;;;20118:22;;;:10;:22;;;;;;:29;;20081:15;:27;;;;;:34;;;;;;;;:66;;;20158:22;;;:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20158:34:0;;;;;20208:24;;19838:129;;19756:17;;20208:24;;19756:17;20208:24;19427:812;;19387:852;:::o;27965:501::-;28133:1;28113:5;-1:-1:-1;;;;;28113:17:0;;:21;28105:43;;;;-1:-1:-1;;;28105:43:0;;;;;;;:::i;:::-;28218:68;;;-1:-1:-1;;;;;17112:15:7;;;28218:68:0;;;17094:34:7;17164:15;;;17144:18;;;17137:43;17196:18;;;;17189:34;;;28218:68:0;;;;;;;;;;17029:18:7;;;;28218:68:0;;;;;;;-1:-1:-1;;;;;28218:68:0;-1:-1:-1;;;28218:68:0;;;28194:102;;-1:-1:-1;;;;28194:10:0;;;;:102;;28218:68;28194:102;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28158:138;;;;28327:7;:57;;;;-1:-1:-1;28339:11:0;;:16;;:44;;;28370:4;28359:24;;;;;;;;;;;;:::i;:::-;28306:153;;;;-1:-1:-1;;;28306:153:0;;17436:2:7;28306:153:0;;;17418:21:7;17475:2;17455:18;;;17448:30;17514:34;17494:18;;;17487:62;-1:-1:-1;;;17565:18:7;;;17558:47;17622:19;;28306:153:0;17234:413:7;28472:464:0;28618:1;28598:5;-1:-1:-1;;;;;28598:17:0;;:21;28590:43;;;;-1:-1:-1;;;28590:43:0;;;;;;;:::i;:::-;28703:62;;;-1:-1:-1;;;;;15112:32:7;;;28703:62:0;;;15094:51:7;15161:18;;;;15154:34;;;28703:62:0;;;;;;;;;;15067:18:7;;;;28703:62:0;;;;;;;-1:-1:-1;;;;;28703:62:0;-1:-1:-1;;;28703:62:0;;;28679:96;;-1:-1:-1;;;;28679:10:0;;;;:96;;28703:62;28679:96;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28643:132;;;;28806:7;:57;;;;-1:-1:-1;28818:11:0;;:16;;:44;;;28849:4;28838:24;;;;;;;;;;;;:::i;:::-;28785:144;;;;-1:-1:-1;;;28785:144:0;;17854:2:7;28785:144:0;;;17836:21:7;17893:2;17873:18;;;17866:30;17932:34;17912:18;;;17905:62;-1:-1:-1;;;17983:18:7;;;17976:38;18031:19;;28785:144:0;17652:404:7;196:131;-1:-1:-1;;;;;271:31:7;;261:42;;251:70;;317:1;314;307:12;332:134;400:20;;429:31;400:20;429:31;:::i;471:388::-;539:6;547;600:2;588:9;579:7;575:23;571:32;568:52;;;616:1;613;606:12;568:52;655:9;642:23;674:31;699:5;674:31;:::i;:::-;724:5;-1:-1:-1;781:2:7;766:18;;753:32;794:33;753:32;794:33;:::i;:::-;846:7;836:17;;;471:388;;;;;:::o;864:247::-;923:6;976:2;964:9;955:7;951:23;947:32;944:52;;;992:1;989;982:12;944:52;1031:9;1018:23;1050:31;1075:5;1050:31;:::i;1116:180::-;1175:6;1228:2;1216:9;1207:7;1203:23;1199:32;1196:52;;;1244:1;1241;1234:12;1196:52;-1:-1:-1;1267:23:7;;1116:180;-1:-1:-1;1116:180:7:o;1301:127::-;1362:10;1357:3;1353:20;1350:1;1343:31;1393:4;1390:1;1383:15;1417:4;1414:1;1407:15;1433:908;1487:5;1540:3;1533:4;1525:6;1521:17;1517:27;1507:55;;1558:1;1555;1548:12;1507:55;1594:6;1581:20;1620:4;1643:18;1680:2;1676;1673:10;1670:36;;;1686:18;;:::i;:::-;1732:2;1729:1;1725:10;1764:2;1758:9;1827:2;1823:7;1818:2;1814;1810:11;1806:25;1798:6;1794:38;1882:6;1870:10;1867:22;1862:2;1850:10;1847:18;1844:46;1841:72;;;1893:18;;:::i;:::-;1929:2;1922:22;1979:18;;;2055:15;;;2051:24;;;2013:15;;;;-1:-1:-1;2087:15:7;;;2084:35;;;2115:1;2112;2105:12;2084:35;2151:2;2143:6;2139:15;2128:26;;2163:148;2179:6;2174:3;2171:15;2163:148;;;2245:23;2264:3;2245:23;:::i;:::-;2233:36;;2289:12;;;;2196;;;;2163:148;;2346:483;2439:6;2447;2500:2;2488:9;2479:7;2475:23;2471:32;2468:52;;;2516:1;2513;2506:12;2468:52;2555:9;2542:23;2574:31;2599:5;2574:31;:::i;:::-;2624:5;-1:-1:-1;2680:2:7;2665:18;;2652:32;2707:18;2696:30;;2693:50;;;2739:1;2736;2729:12;2693:50;2762:61;2815:7;2806:6;2795:9;2791:22;2762:61;:::i;:::-;2752:71;;;2346:483;;;;;:::o;2834:315::-;2902:6;2910;2963:2;2951:9;2942:7;2938:23;2934:32;2931:52;;;2979:1;2976;2969:12;2931:52;3018:9;3005:23;3037:31;3062:5;3037:31;:::i;:::-;3087:5;3139:2;3124:18;;;;3111:32;;-1:-1:-1;;;2834:315:7:o;4361:615::-;4447:6;4455;4508:2;4496:9;4487:7;4483:23;4479:32;4476:52;;;4524:1;4521;4514:12;4476:52;4564:9;4551:23;4593:18;4634:2;4626:6;4623:14;4620:34;;;4650:1;4647;4640:12;4620:34;4688:6;4677:9;4673:22;4663:32;;4733:7;4726:4;4722:2;4718:13;4714:27;4704:55;;4755:1;4752;4745:12;4704:55;4795:2;4782:16;4821:2;4813:6;4810:14;4807:34;;;4837:1;4834;4827:12;4807:34;4890:7;4885:2;4875:6;4872:1;4868:14;4864:2;4860:23;4856:32;4853:45;4850:65;;;4911:1;4908;4901:12;4850:65;4942:2;4934:11;;;;;4964:6;;-1:-1:-1;4361:615:7;;-1:-1:-1;;;;4361:615:7:o;4981:484::-;5083:6;5091;5099;5152:2;5140:9;5131:7;5127:23;5123:32;5120:52;;;5168:1;5165;5158:12;5120:52;5204:9;5191:23;5181:33;;5261:2;5250:9;5246:18;5233:32;5223:42;;5316:2;5305:9;5301:18;5288:32;5343:18;5335:6;5332:30;5329:50;;;5375:1;5372;5365:12;5329:50;5398:61;5451:7;5442:6;5431:9;5427:22;5398:61;:::i;:::-;5388:71;;;4981:484;;;;;:::o;5723:248::-;5791:6;5799;5852:2;5840:9;5831:7;5827:23;5823:32;5820:52;;;5868:1;5865;5858:12;5820:52;-1:-1:-1;;5891:23:7;;;5961:2;5946:18;;;5933:32;;-1:-1:-1;5723:248:7:o;5976:671::-;6062:6;6070;6078;6086;6139:3;6127:9;6118:7;6114:23;6110:33;6107:53;;;6156:1;6153;6146:12;6107:53;6195:9;6182:23;6214:31;6239:5;6214:31;:::i;:::-;6264:5;-1:-1:-1;6321:2:7;6306:18;;6293:32;6334:33;6293:32;6334:33;:::i;:::-;6386:7;-1:-1:-1;6445:2:7;6430:18;;6417:32;6458:33;6417:32;6458:33;:::i;:::-;6510:7;-1:-1:-1;6569:2:7;6554:18;;6541:32;6582:33;6541:32;6582:33;:::i;:::-;5976:671;;;;-1:-1:-1;5976:671:7;;-1:-1:-1;;5976:671:7:o;6652:127::-;6713:10;6708:3;6704:20;6701:1;6694:31;6744:4;6741:1;6734:15;6768:4;6765:1;6758:15;6784:125;6824:4;6852:1;6849;6846:8;6843:34;;;6857:18;;:::i;:::-;-1:-1:-1;6894:9:7;;6784:125::o;6914:168::-;6954:7;7020:1;7016;7012:6;7008:14;7005:1;7002:21;6997:1;6990:9;6983:17;6979:45;6976:71;;;7027:18;;:::i;:::-;-1:-1:-1;7067:9:7;;6914:168::o;7087:217::-;7127:1;7153;7143:132;;7197:10;7192:3;7188:20;7185:1;7178:31;7232:4;7229:1;7222:15;7260:4;7257:1;7250:15;7143:132;-1:-1:-1;7289:9:7;;7087:217::o;7309:128::-;7349:3;7380:1;7376:6;7373:1;7370:13;7367:39;;;7386:18;;:::i;:::-;-1:-1:-1;7422:9:7;;7309:128::o;7442:127::-;7503:10;7498:3;7494:20;7491:1;7484:31;7534:4;7531:1;7524:15;7558:4;7555:1;7548:15;7574:135;7613:3;-1:-1:-1;;7634:17:7;;7631:43;;;7654:18;;:::i;:::-;-1:-1:-1;7701:1:7;7690:13;;7574:135::o;8065:246::-;8105:4;-1:-1:-1;;;;;8218:10:7;;;;8188;;8240:12;;;8237:38;;;8255:18;;:::i;:::-;8292:13;;8065:246;-1:-1:-1;;;8065:246:7:o;8316:253::-;8356:3;-1:-1:-1;;;;;8445:2:7;8442:1;8438:10;8475:2;8472:1;8468:10;8506:3;8502:2;8498:12;8493:3;8490:21;8487:47;;;8514:18;;:::i;:::-;8550:13;;8316:253;-1:-1:-1;;;;8316:253:7:o;8574:251::-;8644:6;8697:2;8685:9;8676:7;8672:23;8668:32;8665:52;;;8713:1;8710;8703:12;8665:52;8745:9;8739:16;8764:31;8789:5;8764:31;:::i;11235:184::-;11305:6;11358:2;11346:9;11337:7;11333:23;11329:32;11326:52;;;11374:1;11371;11364:12;11326:52;-1:-1:-1;11397:16:7;;11235:184;-1:-1:-1;11235:184:7:o;11424:223::-;11463:4;11492:12;11554:10;;;;11524;;11576:12;;;11573:38;;;11591:18;;:::i;11652:287::-;11692:7;-1:-1:-1;;;;;11785:2:7;11782:1;11778:10;11815:2;11812:1;11808:10;11871:3;11867:2;11863:12;11858:3;11855:21;11848:3;11841:11;11834:19;11830:47;11827:73;;;11880:18;;:::i;:::-;11920:13;;11652:287;-1:-1:-1;;;;11652:287:7:o;13211:385::-;13290:6;13298;13351:2;13339:9;13330:7;13326:23;13322:32;13319:52;;;13367:1;13364;13357:12;13319:52;13399:9;13393:16;13418:31;13443:5;13418:31;:::i;:::-;13518:2;13503:18;;13497:25;13468:5;;-1:-1:-1;13531:33:7;13497:25;13531:33;:::i;13601:277::-;13668:6;13721:2;13709:9;13700:7;13696:23;13692:32;13689:52;;;13737:1;13734;13727:12;13689:52;13769:9;13763:16;13822:5;13815:13;13808:21;13801:5;13798:32;13788:60;;13844:1;13841;13834:12;15540:332;15742:2;15724:21;;;15781:1;15761:18;;;15754:29;-1:-1:-1;;;15814:2:7;15799:18;;15792:39;15863:2;15848:18;;15540:332::o;15877:426::-;16006:3;16044:6;16038:13;16069:1;16079:129;16093:6;16090:1;16087:13;16079:129;;;16191:4;16175:14;;;16171:25;;16165:32;16152:11;;;16145:53;16108:12;16079:129;;;16226:6;16223:1;16220:13;16217:48;;;16261:1;16252:6;16247:3;16243:16;16236:27;16217:48;-1:-1:-1;16281:16:7;;;;;15877:426;-1:-1:-1;;15877:426:7:o;16722:127::-;16783:10;16778:3;16774:20;16771:1;16764:31;16814:4;16811:1;16804:15;16838:4;16835:1;16828:15
Swarm Source
none
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.