Contract
0x7780e1a8321bd58bbc76594db494c7bfe8e87040
2
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0xad2ddc18abd9c2a64b03c8d9d8b70281ad77d5d2d2f2d694bf14f7594e7ef7e3 | 32461624 | 456 days 13 hrs ago | Granary: Deployer | Contract Creation | 0 FTM |
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xf12839657cA3BF1C9F1E751A3eE38B42e9019F1c
Contract Name:
Rewarder
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; pragma experimental ABIEncoderV2; import {IERC20} from './IERC20.sol'; import {SafeERC20} from './SafeERC20.sol'; import {RewardsController} from './RewardsController.sol'; contract Rewarder is RewardsController { using SafeERC20 for IERC20; // reward => reward vault mapping(address => address) internal _rewardsVault; event RewardsVaultUpdated(address indexed vault); function setRewardsVault(address vault, address reward) external onlyOwner { _rewardsVault[reward] = vault; emit RewardsVaultUpdated(vault); } function getRewardsVault(address reward) external view returns (address) { return _rewardsVault[reward]; } function transferRewards(address to, address reward, uint256 amount) internal override returns (bool) { IERC20(reward).safeTransferFrom(_rewardsVault[reward], to, amount); return true; } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; /** * @dev Collection of functions related to the address type * From https://github.com/OpenZeppelin/openzeppelin-contracts */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, 'Address: insufficient balance'); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(''); require(success, 'Address: unable to send value, recipient may have reverted'); } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; pragma experimental ABIEncoderV2; library DistributionTypes { struct RewardsConfigInput { uint88 emissionPerSecond; uint256 totalSupply; uint32 distributionEnd; address asset; address reward; } struct UserAssetInput { address underlyingAsset; uint256 userBalance; uint256 totalSupply; } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; /** * @dev Interface of the ERC20 standard as defined in the EIP. * From https://github.com/OpenZeppelin/openzeppelin-contracts */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.7.5; import {IERC20} from './IERC20.sol'; interface IERC20Detailed is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; pragma experimental ABIEncoderV2; import {IRewardsDistributor} from './IRewardsDistributor.sol'; import {DistributionTypes} from './DistributionTypes.sol'; interface IRewardsController is IRewardsDistributor { event RewardsClaimed( address indexed user, address indexed reward, address indexed to, address claimer, uint256 amount ); event ClaimerSet(address indexed user, address indexed claimer); function setClaimer(address user, address claimer) external; function getClaimer(address user) external view returns (address); function configureAssets(DistributionTypes.RewardsConfigInput[] memory config) external; function handleAction( address asset, uint256 userBalance, uint256 totalSupply ) external; function claimRewards( address[] calldata assets, uint256 amount, address to, address reward ) external returns (uint256); function claimRewardsOnBehalf( address[] calldata assets, uint256 amount, address user, address to, address reward ) external returns (uint256); function claimRewardsToSelf( address[] calldata assets, uint256 amount, address reward ) external returns (uint256); function claimAllRewards(address[] calldata assets, address to) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); function claimAllRewardsOnBehalf( address[] calldata assets, address user, address to ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); function claimAllRewardsToSelf(address[] calldata assets) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; pragma experimental ABIEncoderV2; import {DistributionTypes} from './DistributionTypes.sol'; interface IRewardsDistributor { event AssetConfigUpdated( address indexed asset, address indexed reward, uint256 emission, uint256 distributionEnd ); event AssetIndexUpdated(address indexed asset, address indexed reward, uint256 index); event UserIndexUpdated( address indexed user, address indexed asset, address indexed reward, uint256 index ); event RewardsAccrued(address indexed user, address indexed reward, uint256 amount); function setDistributionEnd( address asset, address reward, uint32 distributionEnd ) external; function getDistributionEnd(address asset, address reward) external view returns (uint256); function getUserAssetData( address user, address asset, address reward ) external view returns (uint256); function getRewardsData(address asset, address reward) external view returns ( uint256, uint256, uint256, uint256 ); function getRewardsByAsset(address asset) external view returns (address[] memory); function getRewardTokens() external view returns (address[] memory); function getUserUnclaimedRewardsFromStorage(address user, address reward) external view returns (uint256); function getUserRewardsBalance( address[] calldata assets, address user, address reward ) external view returns (uint256); function getAllUserRewardsBalance(address[] calldata assets, address user) external view returns (address[] memory, uint256[] memory); function getAssetDecimals(address asset) external view returns (uint8); }
// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.7.5; interface IScaledBalanceToken { /** * @dev Returns the scaled balance of the user. The scaled balance is the sum of all the * updated stored balance divided by the reserve's liquidity index at the moment of the update * @param user The user whose balance is calculated * @return The scaled balance of the user **/ function scaledBalanceOf(address user) external view returns (uint256); /** * @dev Returns the scaled balance of the user and the scaled total supply. * @param user The address of the user * @return The scaled balance of the user * @return The scaled balance and the scaled total supply **/ function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); /** * @dev Returns the scaled total supply of the token. Represents sum(debt/index) * @return The scaled total supply **/ function scaledTotalSupply() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; import './Context.sol'; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), 'Ownable: caller is not the owner'); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), 'Ownable: new owner is the zero address'); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; pragma experimental ABIEncoderV2; import {IRewardsController} from './IRewardsController.sol'; import {RewardsDistributor} from './RewardsDistributor.sol'; import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; import {DistributionTypes} from './DistributionTypes.sol'; abstract contract RewardsController is RewardsDistributor, IRewardsController { // user => authorized claimer mapping(address => address) internal _authorizedClaimers; modifier onlyAuthorizedClaimers(address claimer, address user) { require(_authorizedClaimers[user] == claimer, 'CLAIMER_UNAUTHORIZED'); _; } function getClaimer(address user) external view override returns (address) { return _authorizedClaimers[user]; } function setClaimer(address user, address caller) external override onlyOwner { _authorizedClaimers[user] = caller; emit ClaimerSet(user, caller); } function configureAssets(DistributionTypes.RewardsConfigInput[] memory config) external override onlyOwner { for (uint256 i = 0; i < config.length; i++) { config[i].totalSupply = IScaledBalanceToken(config[i].asset).scaledTotalSupply(); } _configureAssets(config); } function handleAction( address user, uint256 totalSupply, uint256 userBalance ) external override { _updateUserRewardsPerAssetInternal(msg.sender, user, userBalance, totalSupply); } function claimRewards( address[] calldata assets, uint256 amount, address to, address reward ) external override returns (uint256) { require(to != address(0), 'INVALID_TO_ADDRESS'); return _claimRewards(assets, amount, msg.sender, msg.sender, to, reward); } function claimRewardsOnBehalf( address[] calldata assets, uint256 amount, address user, address to, address reward ) external override onlyAuthorizedClaimers(msg.sender, user) returns (uint256) { require(user != address(0), 'INVALID_USER_ADDRESS'); require(to != address(0), 'INVALID_TO_ADDRESS'); return _claimRewards(assets, amount, msg.sender, user, to, reward); } function claimRewardsToSelf( address[] calldata assets, uint256 amount, address reward ) external override returns (uint256) { return _claimRewards(assets, amount, msg.sender, msg.sender, msg.sender, reward); } function claimAllRewards(address[] calldata assets, address to) external override returns (address[] memory rewardTokens, uint256[] memory claimedAmounts) { require(to != address(0), 'INVALID_TO_ADDRESS'); return _claimAllRewards(assets, msg.sender, msg.sender, to); } function claimAllRewardsOnBehalf( address[] calldata assets, address user, address to ) external override onlyAuthorizedClaimers(msg.sender, user) returns (address[] memory rewardTokens, uint256[] memory claimedAmounts) { require(user != address(0), 'INVALID_USER_ADDRESS'); require(to != address(0), 'INVALID_TO_ADDRESS'); return _claimAllRewards(assets, msg.sender, user, to); } function claimAllRewardsToSelf(address[] calldata assets) external override returns (address[] memory rewardTokens, uint256[] memory claimedAmounts) { return _claimAllRewards(assets, msg.sender, msg.sender, msg.sender); } function _getUserStake(address[] calldata assets, address user) internal view override returns (DistributionTypes.UserAssetInput[] memory userState) { userState = new DistributionTypes.UserAssetInput[](assets.length); for (uint256 i = 0; i < assets.length; i++) { userState[i].underlyingAsset = assets[i]; (userState[i].userBalance, userState[i].totalSupply) = IScaledBalanceToken(assets[i]) .getScaledUserBalanceAndSupply(user); } return userState; } function _claimRewards( address[] calldata assets, uint256 amount, address claimer, address user, address to, address reward ) internal returns (uint256) { if (amount == 0) { return 0; } uint256 unclaimedRewards = _usersUnclaimedRewards[user][reward]; if (amount > unclaimedRewards) { _distributeRewards(user, _getUserStake(assets, user)); unclaimedRewards = _usersUnclaimedRewards[user][reward]; } if (unclaimedRewards == 0) { return 0; } uint256 amountToClaim = amount > unclaimedRewards ? unclaimedRewards : amount; _usersUnclaimedRewards[user][reward] = unclaimedRewards - amountToClaim; // Safe due to the previous line _transferRewards(to, reward, amountToClaim); emit RewardsClaimed(user, reward, to, claimer, amountToClaim); return amountToClaim; } function _claimAllRewards( address[] calldata assets, address claimer, address user, address to ) internal returns (address[] memory rewardTokens, uint256[] memory claimedAmounts) { _distributeRewards(user, _getUserStake(assets, user)); rewardTokens = new address[](_rewardTokens.length); claimedAmounts = new uint256[](_rewardTokens.length); for (uint256 i = 0; i < _rewardTokens.length; i++) { address reward = _rewardTokens[i]; uint256 rewardAmount = _usersUnclaimedRewards[user][reward]; rewardTokens[i] = reward; claimedAmounts[i] = rewardAmount; if (rewardAmount != 0) { _usersUnclaimedRewards[user][reward] = 0; _transferRewards(to, reward, rewardAmount); emit RewardsClaimed(user, reward, to, claimer, rewardAmount); } } return (rewardTokens, claimedAmounts); } function _transferRewards( address to, address reward, uint256 amount ) internal { bool success = transferRewards(to, reward, amount); require(success == true, 'TRANSFER_ERROR'); } function transferRewards(address to, address reward, uint256 amount) internal virtual returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; pragma experimental ABIEncoderV2; import {IRewardsDistributor} from './IRewardsDistributor.sol'; import {IERC20Detailed} from './IERC20Detailed.sol'; import {DistributionTypes} from './DistributionTypes.sol'; import {Ownable} from './Ownable.sol'; abstract contract RewardsDistributor is IRewardsDistributor, Ownable { struct RewardData { uint88 emissionPerSecond; uint104 index; uint32 lastUpdateTimestamp; uint32 distributionEnd; mapping(address => uint256) usersIndex; } struct AssetData { // reward => rewardData mapping(address => RewardData) rewards; address[] availableRewards; uint8 decimals; } // incentivized asset => AssetData mapping(address => AssetData) internal _assets; // user => reward => unclaimed rewards mapping(address => mapping(address => uint256)) internal _usersUnclaimedRewards; // reward => isEnabled mapping(address => bool) internal _isRewardEnabled; address[] internal _rewardTokens; function getRewardsData(address asset, address reward) public view override returns ( uint256, uint256, uint256, uint256 ) { return ( _assets[asset].rewards[reward].index, _assets[asset].rewards[reward].emissionPerSecond, _assets[asset].rewards[reward].lastUpdateTimestamp, _assets[asset].rewards[reward].distributionEnd ); } function getDistributionEnd(address asset, address reward) external view override returns (uint256) { return _assets[asset].rewards[reward].distributionEnd; } function getRewardsByAsset(address asset) external view override returns (address[] memory) { return _assets[asset].availableRewards; } function getRewardTokens() external view override returns (address[] memory) { return _rewardTokens; } function getUserAssetData( address user, address asset, address reward ) public view override returns (uint256) { return _assets[asset].rewards[reward].usersIndex[user]; } function getUserUnclaimedRewardsFromStorage(address user, address reward) external view override returns (uint256) { return _usersUnclaimedRewards[user][reward]; } function getUserRewardsBalance( address[] calldata assets, address user, address reward ) external view override returns (uint256) { return _getUserReward(user, reward, _getUserStake(assets, user)); } function getAllUserRewardsBalance(address[] calldata assets, address user) external view override returns (address[] memory rewardTokens, uint256[] memory unclaimedAmounts) { return _getAllUserRewards(user, _getUserStake(assets, user)); } function setDistributionEnd( address asset, address reward, uint32 distributionEnd ) external override onlyOwner { _assets[asset].rewards[reward].distributionEnd = distributionEnd; emit AssetConfigUpdated( asset, reward, _assets[asset].rewards[reward].emissionPerSecond, distributionEnd ); } function _configureAssets(DistributionTypes.RewardsConfigInput[] memory rewardsInput) internal { for (uint256 i = 0; i < rewardsInput.length; i++) { _assets[rewardsInput[i].asset].decimals = IERC20Detailed(rewardsInput[i].asset).decimals(); RewardData storage rewardConfig = _assets[rewardsInput[i].asset].rewards[ rewardsInput[i].reward ]; if (rewardConfig.lastUpdateTimestamp == 0) { _assets[rewardsInput[i].asset].availableRewards.push(rewardsInput[i].reward); } if (_isRewardEnabled[rewardsInput[i].reward] == false) { _isRewardEnabled[rewardsInput[i].reward] = true; _rewardTokens.push(rewardsInput[i].reward); } _updateAssetStateInternal( rewardsInput[i].asset, rewardsInput[i].reward, rewardConfig, rewardsInput[i].totalSupply, _assets[rewardsInput[i].asset].decimals ); rewardConfig.emissionPerSecond = rewardsInput[i].emissionPerSecond; rewardConfig.distributionEnd = rewardsInput[i].distributionEnd; emit AssetConfigUpdated( rewardsInput[i].asset, rewardsInput[i].reward, rewardsInput[i].emissionPerSecond, rewardsInput[i].distributionEnd ); } } function _updateAssetStateInternal( address asset, address reward, RewardData storage rewardConfig, uint256 totalSupply, uint8 decimals ) internal returns (uint256) { uint256 oldIndex = rewardConfig.index; if (block.timestamp == rewardConfig.lastUpdateTimestamp) { return oldIndex; } uint256 newIndex = _getAssetIndex( oldIndex, rewardConfig.emissionPerSecond, rewardConfig.lastUpdateTimestamp, rewardConfig.distributionEnd, totalSupply, decimals ); if (newIndex != oldIndex) { require(newIndex <= type(uint104).max, 'Index overflow'); rewardConfig.index = uint104(newIndex); rewardConfig.lastUpdateTimestamp = uint32(block.timestamp); emit AssetIndexUpdated(asset, reward, newIndex); } else { rewardConfig.lastUpdateTimestamp = uint32(block.timestamp); } return newIndex; } function _updateUserRewardsInternal( address user, address asset, address reward, uint256 userBalance, uint256 totalSupply ) internal returns (uint256) { RewardData storage rewardData = _assets[asset].rewards[reward]; uint256 userIndex = rewardData.usersIndex[user]; uint256 accruedRewards = 0; uint256 newIndex = _updateAssetStateInternal( asset, reward, rewardData, totalSupply, _assets[asset].decimals ); if (userIndex != newIndex) { if (userBalance != 0) { accruedRewards = _getRewards(userBalance, newIndex, userIndex, _assets[asset].decimals); } rewardData.usersIndex[user] = newIndex; emit UserIndexUpdated(user, asset, reward, newIndex); } return accruedRewards; } function _updateUserRewardsPerAssetInternal( address asset, address user, uint256 userBalance, uint256 totalSupply ) internal { for (uint256 r = 0; r < _assets[asset].availableRewards.length; r++) { address reward = _assets[asset].availableRewards[r]; uint256 accruedRewards = _updateUserRewardsInternal( user, asset, reward, userBalance, totalSupply ); if (accruedRewards != 0) { _usersUnclaimedRewards[user][reward] += accruedRewards; emit RewardsAccrued(user, reward, accruedRewards); } } } function _distributeRewards( address user, DistributionTypes.UserAssetInput[] memory userState ) internal { for (uint256 i = 0; i < userState.length; i++) { _updateUserRewardsPerAssetInternal( userState[i].underlyingAsset, user, userState[i].userBalance, userState[i].totalSupply ); } } function _getUserReward( address user, address reward, DistributionTypes.UserAssetInput[] memory userState ) internal view returns (uint256 unclaimedRewards) { // Add unrealized rewards for (uint256 i = 0; i < userState.length; i++) { if (userState[i].userBalance == 0) { continue; } unclaimedRewards += _getUnrealizedRewardsFromStake(user, reward, userState[i]); } return unclaimedRewards + _usersUnclaimedRewards[user][reward]; } function _getAllUserRewards( address user, DistributionTypes.UserAssetInput[] memory userState ) internal view returns (address[] memory rewardTokens, uint256[] memory unclaimedRewards) { rewardTokens = new address[](_rewardTokens.length); unclaimedRewards = new uint256[](rewardTokens.length); for (uint256 y = 0; y < rewardTokens.length; y++) { rewardTokens[y] = _rewardTokens[y]; unclaimedRewards[y] = _usersUnclaimedRewards[user][rewardTokens[y]]; } for (uint256 i = 0; i < userState.length; i++) { if (userState[i].userBalance == 0) { continue; } for (uint256 r = 0; r < rewardTokens.length; r++) { unclaimedRewards[r] += _getUnrealizedRewardsFromStake(user, rewardTokens[r], userState[i]); } } return (rewardTokens, unclaimedRewards); } function _getUnrealizedRewardsFromStake( address user, address reward, DistributionTypes.UserAssetInput memory stake ) internal view returns (uint256) { RewardData storage rewardData = _assets[stake.underlyingAsset].rewards[reward]; uint8 assetDecimals = _assets[stake.underlyingAsset].decimals; uint256 assetIndex = _getAssetIndex( rewardData.index, rewardData.emissionPerSecond, rewardData.lastUpdateTimestamp, rewardData.distributionEnd, stake.totalSupply, assetDecimals ); return _getRewards(stake.userBalance, assetIndex, rewardData.usersIndex[user], assetDecimals); } function _getRewards( uint256 principalUserBalance, uint256 reserveIndex, uint256 userIndex, uint8 decimals ) internal pure returns (uint256) { return (principalUserBalance * (reserveIndex - userIndex)) / 10**decimals; } function _getAssetIndex( uint256 currentIndex, uint256 emissionPerSecond, uint128 lastUpdateTimestamp, uint256 distributionEnd, uint256 totalBalance, uint8 decimals ) internal view returns (uint256) { if ( emissionPerSecond == 0 || totalBalance == 0 || lastUpdateTimestamp == block.timestamp || lastUpdateTimestamp >= distributionEnd ) { return currentIndex; } uint256 currentTimestamp = block.timestamp > distributionEnd ? distributionEnd : block.timestamp; uint256 timeDelta = currentTimestamp - lastUpdateTimestamp; return (emissionPerSecond * timeDelta * (10**decimals)) / totalBalance + currentIndex; } function _getUserStake(address[] calldata assets, address user) internal view virtual returns (DistributionTypes.UserAssetInput[] memory userState); function getAssetDecimals(address asset) external view override returns (uint8) { return _assets[asset].decimals; } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.5; import {IERC20} from './IERC20.sol'; import {SafeMath} from './SafeMath.sol'; import {Address} from './Address.sol'; /** * @title SafeERC20 * @dev From https://github.com/OpenZeppelin/openzeppelin-contracts * Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { require( (value == 0) || (token.allowance(address(this), spender) == 0), 'SafeERC20: approve from non-zero to non-zero allowance' ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function callOptionalReturn(IERC20 token, bytes memory data) private { require(address(token).isContract(), 'SafeERC20: call to non-contract'); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, 'SafeERC20: low-level call failed'); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed'); } } }
// SPDX-License-Identifier: agpl-3.0 pragma solidity ^0.7.5; /** * @dev From https://github.com/OpenZeppelin/openzeppelin-contracts * Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, 'SafeMath: addition overflow'); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, 'SafeMath: subtraction overflow'); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, 'SafeMath: multiplication overflow'); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, 'SafeMath: division by zero'); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, 'SafeMath: modulo by zero'); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"emission","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"distributionEnd","type":"uint256"}],"name":"AssetConfigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"AssetIndexUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"claimer","type":"address"}],"name":"ClaimerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsAccrued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"}],"name":"RewardsVaultUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"UserIndexUpdated","type":"event"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"claimAllRewards","outputs":[{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"claimedAmounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"claimAllRewardsOnBehalf","outputs":[{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"claimedAmounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"}],"name":"claimAllRewardsToSelf","outputs":[{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"claimedAmounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"claimRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"claimRewardsOnBehalf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"reward","type":"address"}],"name":"claimRewardsToSelf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint88","name":"emissionPerSecond","type":"uint88"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint32","name":"distributionEnd","type":"uint32"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"internalType":"struct DistributionTypes.RewardsConfigInput[]","name":"config","type":"tuple[]"}],"name":"configureAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"address","name":"user","type":"address"}],"name":"getAllUserRewardsBalance","outputs":[{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"unclaimedAmounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"getAssetDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getClaimer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"getDistributionEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"getRewardsByAsset","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"getRewardsData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reward","type":"address"}],"name":"getRewardsVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"getUserAssetData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"getUserRewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"getUserUnclaimedRewardsFromStorage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"userBalance","type":"uint256"}],"name":"handleAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"caller","type":"address"}],"name":"setClaimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint32","name":"distributionEnd","type":"uint32"}],"name":"setDistributionEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"setRewardsVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600061001b61006a565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b6128b78061007d6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80637eff4ba8116100de578063bb492bf511610097578063c5a7b53811610071578063c5a7b53814610343578063c664493a14610356578063f2fde38b14610369578063f5cf673b1461037c57610173565b8063bb492bf514610315578063bf90f63a14610328578063c4f59f9b1461033b57610173565b80637eff4ba814610283578063866bc096146102a65780638da5cb5b146102b95780639efd6f72146102c15780639ff55db9146102e1578063af15ec5a1461030257610173565b80635077215511610130578063507721551461020257806357b89883146102155780636657732f1461022857806367eabbc914610248578063715018a61461026857806374d945ec1461027057610173565b80630b0db655146101785780631b839c771461018d578063236300dc146101b657806331873e2e146101c957806333028b99146101dc57806344fd1400146101ef575b600080fd5b61018b6101863660046124e3565b61038f565b005b6101a061019b3660046121e7565b6104aa565b6040516101ad919061279d565b60405180910390f35b6101a06101c43660046123fe565b6104e2565b61018b6101d7366004612294565b61052e565b6101a06101ea366004612469565b61053f565b61018b6101fd3660046121e7565b6105e6565b6101a0610210366004612219565b610695565b6101a06102233660046123af565b6106cf565b61023b6102363660046121c6565b6106e0565b6040516101ad919061265c565b61025b6102563660046121c6565b61075a565b6040516101ad919061262f565b61018b610778565b61025b61027e3660046121c6565b61081a565b6102966102913660046121e7565b610838565b6040516101ad94939291906127a6565b6101a06102b43660046121e7565b610897565b61025b6108c2565b6102d46102cf3660046121c6565b6108d1565b6040516101ad91906127e0565b6102f46102ef36600461234d565b6108f2565b6040516101ad92919061266f565b6101a061031036600461234d565b61099c565b6102f4610323366004612305565b6109b3565b6102f46103363660046122c6565b6109f5565b61023b610a11565b61018b61035136600461225b565b610a73565b6102f4610364366004612305565b610b5a565b61018b6103773660046121c6565b610b71565b61018b61038a3660046121e7565b610c69565b610397610d18565b6000546001600160a01b039081169116146103e7576040805162461bcd60e51b81526020600482018190526024820152600080516020612838833981519152604482015290519081900360640190fd5b60005b815181101561049d578181815181106103ff57fe5b6020026020010151606001516001600160a01b031663b1bf962d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561044357600080fd5b505afa158015610457573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047b9190612590565b82828151811061048757fe5b60209081029190910181015101526001016103ea565b506104a781610d1c565b50565b6001600160a01b039182166000908152600160209081526040808320939094168252919091522054600160e01b900463ffffffff1690565b60006001600160a01b0383166105135760405162461bcd60e51b815260040161050a9061271b565b60405180910390fd5b610522868686333388886111b9565b90505b95945050505050565b61053a338483856112ef565b505050565b6001600160a01b0380841660009081526005602052604081205490913391869116821461057e5760405162461bcd60e51b815260040161050a9061276f565b6001600160a01b0386166105a45760405162461bcd60e51b815260040161050a906126c5565b6001600160a01b0385166105ca5760405162461bcd60e51b815260040161050a9061271b565b6105d9898989338a8a8a6111b9565b9998505050505050505050565b6105ee610d18565b6000546001600160a01b0390811691161461063e576040805162461bcd60e51b81526020600482018190526024820152600080516020612838833981519152604482015290519081900360640190fd5b6001600160a01b0381811660009081526006602052604080822080546001600160a01b0319169386169384179055517f28a48cbce43190d77247f342cf319b1607bff4ef716cf26b76cf7bb71baebaa59190a25050565b6001600160a01b03808316600090815260016020818152604080842086861685528252808420948816845293909101905220549392505050565b6000610525858585333333886111b9565b6001600160a01b03811660009081526001602081815260409283902090910180548351818402810184019094528084526060939283018282801561074d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161072f575b505050505090505b919050565b6001600160a01b039081166000908152600660205260409020541690565b610780610d18565b6000546001600160a01b039081169116146107d0576040805162461bcd60e51b81526020600482018190526024820152600080516020612838833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b039081166000908152600560205260409020541690565b6001600160a01b0391821660009081526001602090815260408083209390941682529190915220546001600160681b03600160581b820416916001600160581b0382169163ffffffff600160c01b8204811692600160e01b9092041690565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000546001600160a01b031690565b6001600160a01b031660009081526001602052604090206002015460ff1690565b6001600160a01b038083166000908152600560205260409020546060918291339186911682146109345760405162461bcd60e51b815260040161050a9061276f565b6001600160a01b03861661095a5760405162461bcd60e51b815260040161050a906126c5565b6001600160a01b0385166109805760405162461bcd60e51b815260040161050a9061271b565b61098d88883389896113e0565b93509350505094509492505050565b600061052583836109ae8888886115bc565b611742565b6060806001600160a01b0383166109dc5760405162461bcd60e51b815260040161050a9061271b565b6109e985853333876113e0565b91509150935093915050565b606080610a0584843333336113e0565b915091505b9250929050565b60606004805480602002602001604051908101604052809291908181526020018280548015610a6957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a4b575b5050505050905090565b610a7b610d18565b6000546001600160a01b03908116911614610acb576040805162461bcd60e51b81526020600482018190526024820152600080516020612838833981519152604482015290519081900360640190fd5b6001600160a01b038381166000818152600160209081526040808320948716808452949091529081902080546001600160e01b0316600160e01b63ffffffff871602179081905590517fec44514a2743afadd78647150195ef92fec31e96087fa5cbbcd72e8d131d9a1c91610b4d916001600160581b039091169086906127c1565b60405180910390a3505050565b6060806109e983610b6c8787876115bc565b6117ce565b610b79610d18565b6000546001600160a01b03908116911614610bc9576040805162461bcd60e51b81526020600482018190526024820152600080516020612838833981519152604482015290519081900360640190fd5b6001600160a01b038116610c0e5760405162461bcd60e51b81526004018080602001828103825260268152602001806128126026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b610c71610d18565b6000546001600160a01b03908116911614610cc1576040805162461bcd60e51b81526020600482018190526024820152600080516020612838833981519152604482015290519081900360640190fd5b6001600160a01b0382811660008181526005602052604080822080546001600160a01b0319169486169485179055517f4925eafc82d0c4d67889898eeed64b18488ab19811e61620f387026dec126a289190a35050565b3390565b60005b81518110156111b557818181518110610d3457fe5b6020026020010151606001516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7857600080fd5b505afa158015610d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db091906125cb565b60016000848481518110610dc057fe5b6020026020010151606001516001600160a01b03166001600160a01b0316815260200190815260200160002060020160006101000a81548160ff021916908360ff160217905550600060016000848481518110610e1957fe5b6020026020010151606001516001600160a01b03166001600160a01b031681526020019081526020016000206000016000848481518110610e5657fe5b602090810291909101810151608001516001600160a01b031682528101919091526040016000208054909150600160c01b900463ffffffff16610f1e5760016000848481518110610ea357fe5b6020026020010151606001516001600160a01b03166001600160a01b03168152602001908152602001600020600101838381518110610ede57fe5b6020908102919091018101516080015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b60036000848481518110610f2e57fe5b602090810291909101810151608001516001600160a01b031682528101919091526040016000205460ff1661100057600160036000858581518110610f6f57fe5b6020026020010151608001516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506004838381518110610fc057fe5b6020908102919091018101516080015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b61108f83838151811061100f57fe5b60200260200101516060015184848151811061102757fe5b6020026020010151608001518386868151811061104057fe5b6020026020010151602001516001600089898151811061105c57fe5b602090810291909101810151606001516001600160a01b031682528101919091526040016000206002015460ff166119d3565b5082828151811061109c57fe5b60209081029190910101515181546affffffffffffffffffffff19166001600160581b0390911617815582518390839081106110d457fe5b602090810291909101015160400151815463ffffffff909116600160e01b026001600160e01b03909116178155825183908390811061110f57fe5b6020026020010151608001516001600160a01b031683838151811061113057fe5b6020026020010151606001516001600160a01b03167fec44514a2743afadd78647150195ef92fec31e96087fa5cbbcd72e8d131d9a1c85858151811061117257fe5b60200260200101516000015186868151811061118a57fe5b6020026020010151604001516040516111a49291906127c1565b60405180910390a350600101610d1f565b5050565b6000856111c8575060006112e4565b6001600160a01b03808516600090815260026020908152604080832093861683529290522054808711156112325761120a856112058b8b896115bc565b611b1c565b506001600160a01b038085166000908152600260209081526040808320938616835292905220545b806112415760009150506112e4565b60008188116112505787611252565b815b6001600160a01b03808816600090815260026020908152604080832093891683529290522081840390559050611289858583611b81565b846001600160a01b0316846001600160a01b0316876001600160a01b03167fc052130bc4ef84580db505783484b067ea8b71b3bca78a7e12db7aea8658f0048a856040516112d8929190612643565b60405180910390a49150505b979650505050505050565b60005b6001600160a01b038516600090815260016020819052604090912001548110156113d9576001600160a01b038516600090815260016020819052604082200180548390811061133d57fe5b60009182526020822001546001600160a01b031691506113608688848888611bb8565b905080156113cf576001600160a01b0380871660008181526002602090815260408083209487168084529490915290819020805485019055517f68ac6b4d0eeedccf3df154188dfac62d18d2ac5eaac52ecd6e728e33ce75a1d4906113c690859061279d565b60405180910390a35b50506001016112f2565b5050505050565b6060806113f2846112058989886115bc565b6004546001600160401b038111801561140a57600080fd5b50604051908082528060200260200182016040528015611434578160200160208202803683370190505b506004549092506001600160401b038111801561145057600080fd5b5060405190808252806020026020018201604052801561147a578160200160208202803683370190505b50905060005b6004548110156115b15760006004828154811061149957fe5b60009182526020808320909101546001600160a01b0389811684526002835260408085209190921680855292529091205485519192509082908690859081106114de57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508084848151811061150b57fe5b602090810291909101015280156115a7576001600160a01b03808816600090815260026020908152604080832093861683529290529081205561154f868383611b81565b856001600160a01b0316826001600160a01b0316886001600160a01b03167fc052130bc4ef84580db505783484b067ea8b71b3bca78a7e12db7aea8658f0048b8560405161159e929190612643565b60405180910390a45b5050600101611480565b509550959350505050565b6060826001600160401b03811180156115d457600080fd5b5060405190808252806020026020018201604052801561160e57816020015b6115fb6120a0565b8152602001906001900390816115f35790505b50905060005b8381101561173a5784848281811061162857fe5b905060200201602081019061163d91906121c6565b82828151811061164957fe5b60209081029190910101516001600160a01b03909116905284848281811061166d57fe5b905060200201602081019061168291906121c6565b6001600160a01b0316630afbcdc9846040518263ffffffff1660e01b81526004016116ad919061262f565b604080518083038186803b1580156116c457600080fd5b505afa1580156116d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fc91906125a8565b83838151811061170857fe5b602002602001015160200184848151811061171f57fe5b60209081029190910101516040019190915252600101611614565b509392505050565b6000805b825181101561179f5782818151811061175b57fe5b6020026020010151602001516000141561177457611797565b611792858585848151811061178557fe5b6020026020010151611cbf565b820191505b600101611746565b506001600160a01b03808516600090815260026020908152604080832093871683529290522054019392505050565b60045460609081906001600160401b03811180156117eb57600080fd5b50604051908082528060200260200182016040528015611815578160200160208202803683370190505b50915081516001600160401b038111801561182f57600080fd5b50604051908082528060200260200182016040528015611859578160200160208202803683370190505b50905060005b825181101561193a576004818154811061187557fe5b9060005260206000200160009054906101000a90046001600160a01b031683828151811061189f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060026000866001600160a01b03166001600160a01b0316815260200190815260200160002060008483815181106118f257fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061192757fe5b602090810291909101015260010161185f565b5060005b83518110156119cb5783818151811061195357fe5b6020026020010151602001516000141561196c576119c3565b60005b83518110156119c15761199c8685838151811061198857fe5b602002602001015187858151811061178557fe5b8382815181106119a857fe5b602090810291909101018051909101905260010161196f565b505b60010161193e565b509250929050565b8254600090600160581b81046001600160681b031690600160c01b900463ffffffff16421415611a04579050610525565b8454600090611a389083906001600160581b0381169063ffffffff600160c01b8204811691600160e01b9004168989611d81565b9050818114611af5576001600160681b03811115611a685760405162461bcd60e51b815260040161050a90612747565b85546cffffffffffffffffffffffffff60581b1916600160581b6001600160681b038316021763ffffffff60c01b1916600160c01b4263ffffffff16021786556040516001600160a01b0388811691908a16907f7ecfb468c92138c74e6034d3e9d76f99150e483bd53bcc43524ce7056698751f90611ae890859061279d565b60405180910390a36112e4565b855463ffffffff60c01b1916600160c01b4263ffffffff1602178655979650505050505050565b60005b815181101561053a57611b79828281518110611b3757fe5b60200260200101516000015184848481518110611b5057fe5b602002602001015160200151858581518110611b6857fe5b6020026020010151604001516112ef565b600101611b1f565b6000611b8e848484611e05565b9050600181151514611bb25760405162461bcd60e51b815260040161050a906126f3565b50505050565b6001600160a01b0380851660008181526001602081815260408084208987168552808352818520968c168552868401835290842054948452919052600201549092919083908190611c13908a908a9087908a9060ff166119d3565b9050808314611cb2578615611c53576001600160a01b038916600090815260016020526040902060020154611c509088908390869060ff16611e38565b91505b6001600160a01b03808b16600081815260018701602052604090819020849055518a8316928c1691907ff5674975ec2736b27b8d52ea7cafb8bc2761685f31f109e028e1498aa2b2f3e590611ca990869061279d565b60405180910390a45b5098975050505050505050565b80516001600160a01b03908116600090815260016020818152604080842087861685528252808420865190951684529190528082206002015483549185015192939260ff909116918491611d48916001600160681b03600160581b820416916001600160581b0382169163ffffffff600160c01b8204811692600160e01b909204169087611d81565b90506112e48560200151828560010160008b6001600160a01b03166001600160a01b031681526020019081526020016000205485611e38565b6000851580611d8e575082155b80611da1575042856001600160801b0316145b80611db5575083856001600160801b031610155b15611dc1575085611dfb565b6000844211611dd05742611dd2565b845b90506001600160801b0386168103888589830260ff8716600a0a0281611df457fe5b0401925050505b9695505050505050565b6001600160a01b038083166000818152600660205260408120549092611e2e9291168685611e57565b5060019392505050565b60008160ff16600a0a838503860281611e4d57fe5b0495945050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611bb2908590611ebe826001600160a01b0316612064565b611f0f576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310611f4d5780518252601f199092019160209182019101611f2e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611faf576040519150601f19603f3d011682016040523d82523d6000602084013e611fb4565b606091505b50915091508161200b576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115611bb25780806020019051602081101561202757600080fd5b5051611bb25760405162461bcd60e51b815260040180806020018281038252602a815260200180612858602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061209857508115155b949350505050565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b80356001600160a01b038116811461075557600080fd5b60008083601f8401126120f2578182fd5b5081356001600160401b03811115612108578182fd5b6020830191508360208083028501011115610a0a57600080fd5b600060a08284031215612133578081fd5b60405160a081018181106001600160401b038211171561214f57fe5b60405290508082356001600160581b038116811461216c57600080fd5b815260208381013590820152612184604084016121b2565b6040820152612195606084016120ca565b60608201526121a6608084016120ca565b60808201525092915050565b803563ffffffff8116811461075557600080fd5b6000602082840312156121d7578081fd5b6121e0826120ca565b9392505050565b600080604083850312156121f9578081fd5b612202836120ca565b9150612210602084016120ca565b90509250929050565b60008060006060848603121561222d578081fd5b612236846120ca565b9250612244602085016120ca565b9150612252604085016120ca565b90509250925092565b60008060006060848603121561226f578283fd5b612278846120ca565b9250612286602085016120ca565b9150612252604085016121b2565b6000806000606084860312156122a8578283fd5b6122b1846120ca565b95602085013595506040909401359392505050565b600080602083850312156122d8578182fd5b82356001600160401b038111156122ed578283fd5b6122f9858286016120e1565b90969095509350505050565b600080600060408486031215612319578283fd5b83356001600160401b0381111561232e578384fd5b61233a868287016120e1565b90945092506122529050602085016120ca565b60008060008060608587031215612362578081fd5b84356001600160401b03811115612377578182fd5b612383878288016120e1565b90955093506123969050602086016120ca565b91506123a4604086016120ca565b905092959194509250565b600080600080606085870312156123c4578384fd5b84356001600160401b038111156123d9578485fd5b6123e5878288016120e1565b909550935050602085013591506123a4604086016120ca565b600080600080600060808688031215612415578081fd5b85356001600160401b0381111561242a578182fd5b612436888289016120e1565b9096509450506020860135925061244f604087016120ca565b915061245d606087016120ca565b90509295509295909350565b60008060008060008060a08789031215612481578384fd5b86356001600160401b03811115612496578485fd5b6124a289828a016120e1565b909750955050602087013593506124bb604088016120ca565b92506124c9606088016120ca565b91506124d7608088016120ca565b90509295509295509295565b600060208083850312156124f5578182fd5b82356001600160401b038082111561250b578384fd5b818501915085601f83011261251e578384fd5b81358181111561252a57fe5b61253784858302016127ee565b818152848101925083850160a0808402860187018a1015612556578788fd5b8795505b838610156125825761256c8a83612122565b855260019590950194938601939081019061255a565b509098975050505050505050565b6000602082840312156125a1578081fd5b5051919050565b600080604083850312156125ba578182fd5b505080516020909101519092909150565b6000602082840312156125dc578081fd5b815160ff811681146121e0578182fd5b6000815180845260208085019450808401835b838110156126245781516001600160a01b0316875295820195908201906001016125ff565b509495945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6000602082526121e060208301846125ec565b60006040825261268260408301856125ec565b828103602084810191909152845180835285820192820190845b818110156126b85784518352938301939183019160010161269c565b5090979650505050505050565b602080825260149082015273494e56414c49445f555345525f4144445245535360601b604082015260600190565b6020808252600e908201526d2a2920a729a322a92fa2a92927a960911b604082015260600190565b602080825260129082015271494e56414c49445f544f5f4144445245535360701b604082015260600190565b6020808252600e908201526d496e646578206f766572666c6f7760901b604082015260600190565b60208082526014908201527310d3105253515497d5539055551213d49256915160621b604082015260600190565b90815260200190565b93845260208401929092526040830152606082015260800190565b6001600160581b0392909216825263ffffffff16602082015260400190565b60ff91909116815260200190565b6040518181016001600160401b038111828210171561280957fe5b60405291905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220a69cb44741de9acd3fd0e3340945805e2f6f7c6f2823301d14c5fece170160c964736f6c63430007050033
Deployed ByteCode Sourcemap
230:677:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;946:300:10;;;;;;:::i;:::-;;:::i;:::-;;1418:182:11;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1454:285:10;;;;;;:::i;:::-;;:::i;1250:201::-;;;;;;:::i;:::-;;:::i;1743:403::-;;;;;;:::i;:::-;;:::i;440:150:9:-;;;;;;:::i;:::-;;:::i;1861:191:11:-;;;;;;:::i;:::-;;:::i;2150:230:10:-;;;;;;:::i;:::-;;:::i;1604:141:11:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;594:111:9:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1599:135:8:-;;;:::i;662:118:10:-;;;;;;:::i;:::-;;:::i;1009:405:11:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;2056:187::-;;;;;;:::i;:::-;;:::i;1016:71:8:-;;;:::i;10131:121:11:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2680:426:10:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2247:220:11:-;;;;;;:::i;:::-;;:::i;2384:292:10:-;;;;;;:::i;:::-;;:::i;3110:241::-;;;;;;:::i;:::-;;:::i;1749:108:11:-;;;:::i;2737:344::-;;;;;;:::i;:::-;;:::i;2471:262::-;;;;;;:::i;:::-;;:::i;1873:226:8:-;;;;;;:::i;:::-;;:::i;784:158:10:-;;;;;;:::i;:::-;;:::i;946:300::-;1212:12:8;:10;:12::i;:::-;1202:6;;-1:-1:-1;;;;;1202:6:8;;;:22;;;1194:67;;;;;-1:-1:-1;;;1194:67:8;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1194:67:8;;;;;;;;;;;;;;;1078:9:10::1;1073:139;1097:6;:13;1093:1;:17;1073:139;;;1169:6;1176:1;1169:9;;;;;;;;;;;;;;:15;;;-1:-1:-1::0;;;;;1149:54:10::1;;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1125:6;1132:1;1125:9;;;;;;;;;::::0;;::::1;::::0;;;;;;;:21:::1;:80:::0;1112:3:::1;;1073:139;;;;1217:24;1234:6;1217:16;:24::i;:::-;946:300:::0;:::o;1418:182:11:-;-1:-1:-1;;;;;1549:14:11;;;1525:7;1549:14;;;:7;:14;;;;;;;;:30;;;;;;;;;;;:46;-1:-1:-1;;;1549:46:11;;;;;1418:182::o;1454:285:10:-;1594:7;-1:-1:-1;;;;;1617:16:10;;1609:47;;;;-1:-1:-1;;;1609:47:10;;;;;;;:::i;:::-;;;;;;;;;1669:65;1683:6;;1691;1699:10;1711;1723:2;1727:6;1669:13;:65::i;:::-;1662:72;;1454:285;;;;;;;;:::o;1250:201::-;1368:78;1403:10;1415:4;1421:11;1434;1368:34;:78::i;:::-;1250:201;;;:::o;1743:403::-;-1:-1:-1;;;;;585:25:10;;;1950:7;585:25;;;:19;:25;;;;;;1950:7;;1923:10;;1935:4;;585:25;:36;;577:69;;;;-1:-1:-1;;;577:69:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;1973:18:10;::::1;1965:51;;;;-1:-1:-1::0;;;1965:51:10::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2030:16:10;::::1;2022:47;;;;-1:-1:-1::0;;;2022:47:10::1;;;;;;;:::i;:::-;2082:59;2096:6;;2104;2112:10;2124:4;2130:2;2134:6;2082:13;:59::i;:::-;2075:66:::0;1743:403;-1:-1:-1;;;;;;;;;1743:403:10:o;440:150:9:-;1212:12:8;:10;:12::i;:::-;1202:6;;-1:-1:-1;;;;;1202:6:8;;;:22;;;1194:67;;;;;-1:-1:-1;;;1194:67:8;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1194:67:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;520:21:9;;::::1;;::::0;;;:13:::1;:21;::::0;;;;;:29;;-1:-1:-1;;;;;;520:29:9::1;::::0;;::::1;::::0;;::::1;::::0;;559:26;::::1;::::0;520:21;559:26:::1;440:150:::0;;:::o;1861:191:11:-;-1:-1:-1;;;;;2000:14:11;;;1978:7;2000:14;;;:7;:14;;;;;;;;:30;;;;;;;;;;:47;;;;;:41;;;;:47;;;;1861:191;;;;;:::o;2150:230:10:-;2280:7;2302:73;2316:6;;2324;2332:10;2344;2356;2368:6;2302:13;:73::i;1604:141:11:-;-1:-1:-1;;;;;1709:14:11;;;;;;:7;:14;;;;;;;;;:31;;;1702:38;;;;;;;;;;;;;;;;;1678:16;;1702:38;;;1709:31;1702:38;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1702:38:11;;;;;;;;;;;;;;;;;;;;;;;1604:141;;;;:::o;594:111:9:-;-1:-1:-1;;;;;679:21:9;;;658:7;679:21;;;:13;:21;;;;;;;;594:111::o;1599:135:8:-;1212:12;:10;:12::i;:::-;1202:6;;-1:-1:-1;;;;;1202:6:8;;;:22;;;1194:67;;;;;-1:-1:-1;;;1194:67:8;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1194:67:8;;;;;;;;;;;;;;;1701:1:::1;1685:6:::0;;1664:40:::1;::::0;-1:-1:-1;;;;;1685:6:8;;::::1;::::0;1664:40:::1;::::0;1701:1;;1664:40:::1;1727:1;1710:19:::0;;-1:-1:-1;;;;;;1710:19:8::1;::::0;;1599:135::o;662:118:10:-;-1:-1:-1;;;;;750:25:10;;;728:7;750:25;;;:19;:25;;;;;;;;662:118::o;1009:405:11:-;-1:-1:-1;;;;;1199:14:11;;;1117:7;1199:14;;;:7;:14;;;;;;;;:30;;;;;;;;;;;:36;-1:-1:-1;;;;;;;;1199:36:11;;;;-1:-1:-1;;;;;1243:48:11;;;1299:50;-1:-1:-1;;;1299:50:11;;;;;-1:-1:-1;;;1357:46:11;;;;;1009:405::o;2056:187::-;-1:-1:-1;;;;;2202:28:11;;;2178:7;2202:28;;;:22;:28;;;;;;;;:36;;;;;;;;;;;;;2056:187::o;1016:71:8:-;1054:7;1076:6;-1:-1:-1;;;;;1076:6:8;1016:71;:::o;10131:121:11:-;-1:-1:-1;;;;;10224:14:11;10204:5;10224:14;;;:7;:14;;;;;:23;;;;;;10131:121::o;2680:426:10:-;-1:-1:-1;;;;;585:25:10;;;;;;;:19;:25;;;;;;2866:29;;;;2835:10;;2847:4;;585:25;:36;;577:69;;;;-1:-1:-1;;;577:69:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;2946:18:10;::::1;2938:51;;;;-1:-1:-1::0;;;2938:51:10::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;3003:16:10;::::1;2995:47;;;;-1:-1:-1::0;;;2995:47:10::1;;;;;;;:::i;:::-;3055:46;3072:6;;3080:10;3092:4;3098:2;3055:16;:46::i;:::-;3048:53;;;;2680:426:::0;;;;;;;;;:::o;2247:220:11:-;2383:7;2405:57;2420:4;2426:6;2434:27;2448:6;;2456:4;2434:13;:27::i;:::-;2405:14;:57::i;2384:292:10:-;2487:29;;-1:-1:-1;;;;;2567:16:10;;2559:47;;;;-1:-1:-1;;;2559:47:10;;;;;;;:::i;:::-;2619:52;2636:6;;2644:10;2656;2668:2;2619:16;:52::i;:::-;2612:59;;;;2384:292;;;;;;:::o;3110:241::-;3207:29;3238:31;3286:60;3303:6;;3311:10;3323;3335;3286:16;:60::i;:::-;3279:67;;;;3110:241;;;;;;:::o;1749:108:11:-;1808:16;1839:13;1832:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1832:20:11;;;;;;;;;;;;;;;;;;;;;;;1749:108;:::o;2737:344::-;1212:12:8;:10;:12::i;:::-;1202:6;;-1:-1:-1;;;;;1202:6:8;;;:22;;;1194:67;;;;;-1:-1:-1;;;1194:67:8;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1194:67:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;2870:14:11;;::::1;;::::0;;;:7:::1;:14;::::0;;;;;;;:30;;::::1;::::0;;;;;;;;;;;:64;;-1:-1:-1;;;;;2870:64:11::1;-1:-1:-1::0;;;2870:64:11::1;::::0;::::1;;;::::0;;;;2946:130;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;2999:48:11;;::::1;::::0;2870:64;;2946:130:::1;:::i;:::-;;;;;;;;2737:344:::0;;;:::o;2471:262::-;2594:29;2625:33;2675:53;2694:4;2700:27;2714:6;;2722:4;2700:13;:27::i;:::-;2675:18;:53::i;1873:226:8:-;1212:12;:10;:12::i;:::-;1202:6;;-1:-1:-1;;;;;1202:6:8;;;:22;;;1194:67;;;;;-1:-1:-1;;;1194:67:8;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1194:67:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;1957:22:8;::::1;1949:73;;;;-1:-1:-1::0;;;1949:73:8::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2054:6;::::0;;2033:38:::1;::::0;-1:-1:-1;;;;;2033:38:8;;::::1;::::0;2054:6;::::1;::::0;2033:38:::1;::::0;::::1;2077:6;:17:::0;;-1:-1:-1;;;;;;2077:17:8::1;-1:-1:-1::0;;;;;2077:17:8;;;::::1;::::0;;;::::1;::::0;;1873:226::o;784:158:10:-;1212:12:8;:10;:12::i;:::-;1202:6;;-1:-1:-1;;;;;1202:6:8;;;:22;;;1194:67;;;;;-1:-1:-1;;;1194:67:8;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1194:67:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;868:25:10;;::::1;;::::0;;;:19:::1;:25;::::0;;;;;:34;;-1:-1:-1;;;;;;868:34:10::1;::::0;;::::1;::::0;;::::1;::::0;;913:24;::::1;::::0;868:25;913:24:::1;784:158:::0;;:::o;586:98:1:-;669:10;586:98;:::o;3085:1259:11:-;3197:9;3192:1148;3216:12;:19;3212:1;:23;3192:1148;;;3307:12;3320:1;3307:15;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;3292:46:11;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3250:7;:30;3258:12;3271:1;3258:15;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;3250:30:11;-1:-1:-1;;;;;3250:30:11;;;;;;;;;;;;:39;;;:90;;;;;;;;;;;;;;;;;;3349:31;3383:7;:30;3391:12;3404:1;3391:15;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;3383:30:11;-1:-1:-1;;;;;3383:30:11;;;;;;;;;;;;:38;;:78;3431:12;3444:1;3431:15;;;;;;;;;;;;;;;;;;;:22;;;-1:-1:-1;;;;;3383:78:11;;;;;;;;;;;-1:-1:-1;3383:78:11;3474:32;;3383:78;;-1:-1:-1;;;;3474:32:11;;;;3470:138;;3523:7;:30;3531:12;3544:1;3531:15;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;3523:30:11;-1:-1:-1;;;;;3523:30:11;;;;;;;;;;;;:47;;3576:12;3589:1;3576:15;;;;;;;;;;;;;;;;;;;:22;;;3523:76;;;;;;;-1:-1:-1;3523:76:11;;;;;;;;;;-1:-1:-1;;;;;;3523:76:11;-1:-1:-1;;;;;3523:76:11;;;;;;;;;3470:138;3620:16;:40;3637:12;3650:1;3637:15;;;;;;;;;;;;;;;;;;;:22;;;-1:-1:-1;;;;;3620:40:11;;;;;;;;;;;-1:-1:-1;3620:40:11;;;;3616:173;;3724:4;3681:16;:40;3698:12;3711:1;3698:15;;;;;;;;;;;;;;:22;;;-1:-1:-1;;;;;3681:40:11;-1:-1:-1;;;;;3681:40:11;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;3738:13;3757:12;3770:1;3757:15;;;;;;;;;;;;;;;;;;;:22;;;3738:42;;;;;;;-1:-1:-1;3738:42:11;;;;;;;;;;-1:-1:-1;;;;;;3738:42:11;-1:-1:-1;;;;;3738:42:11;;;;;;;;;3616:173;3797:204;3832:12;3845:1;3832:15;;;;;;;;;;;;;;:21;;;3863:12;3876:1;3863:15;;;;;;;;;;;;;;:22;;;3895:12;3917;3930:1;3917:15;;;;;;;;;;;;;;:27;;;3954:7;:30;3962:12;3975:1;3962:15;;;;;;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;3954:30:11;;;;;;;;;;;-1:-1:-1;3954:30:11;:39;;;;;3797:25;:204::i;:::-;;4043:12;4056:1;4043:15;;;;;;;;;;;;;;;;;;:33;4010:66;;-1:-1:-1;;4010:66:11;-1:-1:-1;;;;;4010:66:11;;;;;;4115:15;;;;4128:1;;4115:15;;;;;;;;;;;;;;;;:31;;;4084:62;;;;;;-1:-1:-1;;;4084:62:11;-1:-1:-1;;;;;4084:62:11;;;;;;4219:15;;:12;;4232:1;;4219:15;;;;;;;;;;;;:22;;;-1:-1:-1;;;;;4160:173:11;4188:12;4201:1;4188:15;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;4160:173:11;;4251:12;4264:1;4251:15;;;;;;;;;;;;;;:33;;;4294:12;4307:1;4294:15;;;;;;;;;;;;;;:31;;;4160:173;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;3237:3:11;;3192:1148;;;;3085:1259;:::o;3866:861:10:-;4037:7;4056:11;4052:40;;-1:-1:-1;4084:1:10;4077:8;;4052:40;-1:-1:-1;;;;;4124:28:10;;;4097:24;4124:28;;;:22;:28;;;;;;;;:36;;;;;;;;;;4171:25;;;4167:162;;;4206:53;4225:4;4231:27;4245:6;;4253:4;4231:13;:27::i;:::-;4206:18;:53::i;:::-;-1:-1:-1;;;;;;4286:28:10;;;;;;;:22;:28;;;;;;;;:36;;;;;;;;;;4167:162;4339:21;4335:50;;4377:1;4370:8;;;;;4335:50;4391:21;4424:16;4415:6;:25;:53;;4462:6;4415:53;;;4443:16;4415:53;-1:-1:-1;;;;;4474:28:10;;;;;;;:22;:28;;;;;;;;:36;;;;;;;;;4513:32;;;4474:71;;4391:77;-1:-1:-1;4585:43:10;4602:2;4503:6;4391:77;4585:16;:43::i;:::-;4668:2;-1:-1:-1;;;;;4639:56:10;4660:6;-1:-1:-1;;;;;4639:56:10;4654:4;-1:-1:-1;;;;;4639:56:10;;4672:7;4681:13;4639:56;;;;;;;:::i;:::-;;;;;;;;4709:13;-1:-1:-1;;3866:861:10;;;;;;;;;;:::o;6060:608:11:-;6215:9;6210:454;-1:-1:-1;;;;;6234:14:11;;;;;;:7;:14;;;;;;;;:31;:38;6230:42;;6210:454;;;-1:-1:-1;;;;;6304:14:11;;6287;6304;;;:7;:14;;;;;;;:31;:34;;6336:1;;6304:34;;;;;;;;;;;;;;;-1:-1:-1;;;;;6304:34:11;;-1:-1:-1;6371:121:11;6407:4;6421:5;6304:34;6452:11;6473;6371:26;:121::i;:::-;6346:146;-1:-1:-1;6504:19:11;;6500:158;;-1:-1:-1;;;;;6535:28:11;;;;;;;:22;:28;;;;;;;;:36;;;;;;;;;;;;;;:54;;;;;;6605:44;;;;;6575:14;;6605:44;:::i;:::-;;;;;;;;6500:158;-1:-1:-1;;6274:3:11;;6210:454;;;;6060:608;;;;:::o;4731:877:10:-;4865:29;4896:31;4935:53;4954:4;4960:27;4974:6;;4982:4;4960:13;:27::i;4935:53::-;5024:13;:20;-1:-1:-1;;;;;5010:35:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5010:35:10;-1:-1:-1;5082:13:10;:20;4995:50;;-1:-1:-1;;;;;;5068:35:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5068:35:10;;5051:52;;5115:9;5110:451;5134:13;:20;5130:24;;5110:451;;;5169:14;5186:13;5200:1;5186:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5233:28:10;;;;;:22;:28;;;;;;5186:16;;;;5233:36;;;;;;;;;5278:15;;5186:16;;-1:-1:-1;5233:36:10;5186:16;;5278:12;;5291:1;;5278:15;;;;;;;;;;;:24;-1:-1:-1;;;;;5278:24:10;;;-1:-1:-1;;;;;5278:24:10;;;;;5330:12;5310:14;5325:1;5310:17;;;;;;;;;;;;;;;;;:32;5355:17;;5351:204;;-1:-1:-1;;;;;5384:28:10;;;5423:1;5384:28;;;:22;:28;;;;;;;;:36;;;;;;;;;;;:40;5434:42;5451:2;5413:6;5463:12;5434:16;:42::i;:::-;5520:2;-1:-1:-1;;;;;5491:55:10;5512:6;-1:-1:-1;;;;;5491:55:10;5506:4;-1:-1:-1;;;;;5491:55:10;;5524:7;5533:12;5491:55;;;;;;;:::i;:::-;;;;;;;;5351:204;-1:-1:-1;;5156:3:10;;5110:451;;;;4731:877;;;;;;;;:::o;3355:507::-;3467:51;3579:6;-1:-1:-1;;;;;3540:53:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3528:65;;3604:9;3599:237;3619:17;;;3599:237;;;3682:6;;3689:1;3682:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;3651;3661:1;3651:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3651:40:10;;;;;3774:6;;3781:1;3774:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3754:69:10;;3824:4;3754:75;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3700:9;3710:1;3700:12;;;;;;;;;;;;;;:24;;3726:9;3736:1;3726:12;;;;;;;;;;;;;;;;;;:24;;3699:130;;;;;3638:3;;3599:237;;;;3355:507;;;;;:::o;7026:490:11:-;7172:24;;7234:209;7258:9;:16;7254:1;:20;7234:209;;;7293:9;7303:1;7293:12;;;;;;;;;;;;;;:24;;;7321:1;7293:29;7289:62;;;7334:8;;7289:62;7378:58;7409:4;7415:6;7423:9;7433:1;7423:12;;;;;;;;;;;;;;7378:30;:58::i;:::-;7358:78;;;;7234:209;7276:3;;7234:209;;;-1:-1:-1;;;;;;7475:28:11;;;;;;;:22;:28;;;;;;;;:36;;;;;;;;;;7456:55;7026:490;;;;;:::o;7520:836::-;7751:13;:20;7650:29;;;;-1:-1:-1;;;;;7737:35:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7737:35:11;;7722:50;;7811:12;:19;-1:-1:-1;;;;;7797:34:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7797:34:11;;7778:53;;7843:9;7838:174;7862:12;:19;7858:1;:23;7838:174;;;7914:13;7928:1;7914:16;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7914:16:11;7896:12;7909:1;7896:15;;;;;;;;;;;;;:34;-1:-1:-1;;;;;7896:34:11;;;-1:-1:-1;;;;;7896:34:11;;;;;7960:22;:28;7983:4;-1:-1:-1;;;;;7960:28:11;-1:-1:-1;;;;;7960:28:11;;;;;;;;;;;;:45;7989:12;8002:1;7989:15;;;;;;;;;;;;;;-1:-1:-1;;;;;7960:45:11;-1:-1:-1;;;;;7960:45:11;;;;;;;;;;;;;7938:16;7955:1;7938:19;;;;;;;;;;;;;;;;;:67;7883:3;;7838:174;;;;8023:9;8018:289;8042:9;:16;8038:1;:20;8018:289;;;8077:9;8087:1;8077:12;;;;;;;;;;;;;;:24;;;8105:1;8077:29;8073:62;;;8118:8;;8073:62;8147:9;8142:159;8166:12;:19;8162:1;:23;8142:159;;;8225:67;8256:4;8262:12;8275:1;8262:15;;;;;;;;;;;;;;8279:9;8289:1;8279:12;;;;;;;8225:67;8202:16;8219:1;8202:19;;;;;;;;;;;;;;;;;:90;;;;;;;8187:3;;8142:159;;;;8018:289;8060:3;;8018:289;;;;7520:836;;;;;:::o;4348:910::-;4560:18;;4526:7;;-1:-1:-1;;;4560:18:11;;-1:-1:-1;;;;;4560:18:11;;-1:-1:-1;;;4608:32:11;;;;4589:15;:51;4585:87;;;4657:8;-1:-1:-1;4650:15:11;;4585:87;4735:30;;4678:16;;4697:185;;4719:8;;-1:-1:-1;;;;;4735:30:11;;;4773:32;-1:-1:-1;;;4773:32:11;;;;;-1:-1:-1;;;4813:28:11;;;4849:11;4868:8;4697:14;:185::i;:::-;4678:204;;4905:8;4893;:20;4889:343;;-1:-1:-1;;;;;4931:29:11;;;4923:56;;;;-1:-1:-1;;;4923:56:11;;;;;;;:::i;:::-;4987:38;;-1:-1:-1;;;;4987:38:11;-1:-1:-1;;;;;;;;4987:38:11;;;;-1:-1:-1;;;;5033:58:11;-1:-1:-1;;;5075:15:11;5033:58;;;;;;5104:42;;-1:-1:-1;;;;;5104:42:11;;;;;;;;;;;;4987:38;;5104:42;:::i;:::-;;;;;;;;4889:343;;;5167:58;;-1:-1:-1;;;;5167:58:11;-1:-1:-1;;;5209:15:11;5167:58;;;;;;5245:8;4348:910;-1:-1:-1;;;;;;;4348:910:11:o;6672:350::-;6799:9;6794:224;6818:9;:16;6814:1;:20;6794:224;;;6849:162;6893:9;6903:1;6893:12;;;;;;;;;;;;;;:28;;;6931:4;6945:9;6955:1;6945:12;;;;;;;;;;;;;;:24;;;6979:9;6989:1;6979:12;;;;;;;;;;;;;;:24;;;6849:34;:162::i;:::-;6836:3;;6794:224;;5612:204:10;5713:12;5728:35;5744:2;5748:6;5756;5728:15;:35::i;:::-;5713:50;-1:-1:-1;5788:4:10;5777:15;;;;5769:42;;;;-1:-1:-1;;;5769:42:10;;;;;;;:::i;:::-;5612:204;;;;:::o;5262:794:11:-;-1:-1:-1;;;;;5474:14:11;;;5427:7;5474:14;;;:7;:14;;;;;;;;:30;;;;;;;;;;;5530:27;;;;;:21;;;:27;;;;;;5712:14;;;;;;:23;;;5427:7;;5474:30;5530:27;5427:7;;;;5615:126;;5482:5;;5497:6;;5474:30;;5693:11;;5712:23;;5615:25;:126::i;:::-;5596:145;;5765:8;5752:9;:21;5748:276;;5787:16;;5783:128;;-1:-1:-1;;;;;5878:14:11;;;;;;:7;:14;;;;;:23;;;5832:70;;5844:11;;5857:8;;5867:9;;5878:23;;5832:11;:70::i;:::-;5815:87;;5783:128;-1:-1:-1;;;;;5919:27:11;;;;;;;:21;;;:27;;;;;;;:38;;;5970:47;;;;;;;;5919:27;5970:47;;;;5949:8;;5970:47;:::i;:::-;;;;;;;;5748:276;-1:-1:-1;6037:14:11;5262:794;-1:-1:-1;;;;;;;;5262:794:11:o;8360:646::-;8571:21;;-1:-1:-1;;;;;8563:30:11;;;8516:7;8563:30;;;:7;:30;;;;;;;;:46;;;;;;;;;;8645:21;;8637:30;;;;;;;;;;;:39;;;8725:16;;8857:17;;;;8516:7;;8563:46;8637:39;;;;;8516:7;;8703:198;;-1:-1:-1;;;;;;;;8725:16:11;;;;-1:-1:-1;;;;;8749:28:11;;;8785:30;-1:-1:-1;;;8785:30:11;;;;;-1:-1:-1;;;8823:26:11;;;;;8637:39;8703:14;:198::i;:::-;8682:219;;8915:86;8927:5;:17;;;8946:10;8958;:21;;:27;8980:4;-1:-1:-1;;;;;8958:27:11;-1:-1:-1;;;;;8958:27:11;;;;;;;;;;;;;8987:13;8915:11;:86::i;9257:702::-;9473:7;9499:22;;;:49;;-1:-1:-1;9531:17:11;;9499:49;:97;;;;9581:15;9558:19;-1:-1:-1;;;;;9558:38:11;;9499:97;:145;;;;9629:15;9606:19;-1:-1:-1;;;;;9606:38:11;;;9499:145;9488:197;;;-1:-1:-1;9666:12:11;9659:19;;9488:197;9691:24;9736:15;9718;:33;:81;;9784:15;9718:81;;;9760:15;9718:81;9691:108;-1:-1:-1;;;;;;9825:38:11;;;;9942:12;9927;9877:29;;;9910:12;;;:2;:12;9877:46;9927:12;9876:63;;;;;:78;9869:85;;;;9257:702;;;;;;;;;:::o;709:196:9:-;-1:-1:-1;;;;;849:21:9;;;805:4;849:21;;;:13;:21;;;;;;805:4;;817:66;;849:21;;872:2;876:6;817:31;:66::i;:::-;-1:-1:-1;896:4:9;709:196;;;;;:::o;9009:244:11:-;9160:7;9240:8;9236:12;;:2;:12;9222:9;9207:12;:24;9183:20;:49;9182:66;;;;;;;9009:244;-1:-1:-1;;;;;9009:244:11:o;965:216:12:-;1107:68;;;-1:-1:-1;;;;;1107:68:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1107:68:12;-1:-1:-1;;;1107:68:12;;;1081:95;;1100:5;;1617:27;1625:5;-1:-1:-1;;;;;1617:25:12;;:27::i;:::-;1609:71;;;;;-1:-1:-1;;;1609:71:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;1743:12;1757:23;1792:5;-1:-1:-1;;;;;1784:19:12;1804:4;1784:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1784:25:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1742:67;;;;1823:7;1815:52;;;;;-1:-1:-1;;;1815:52:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1878:17;;:21;1874:211;;2012:10;2001:30;;;;;;;;;;;;;;;-1:-1:-1;2001:30:12;1993:85;;;;-1:-1:-1;;;1993:85:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;743:586:0;803:4;1242:20;;1089:66;1281:23;;;;;;:42;;-1:-1:-1;1308:15:0;;;1281:42;1273:51;743:586;-1:-1:-1;;;;743:586:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:175:14:-;84:20;;-1:-1:-1;;;;;133:31:14;;123:42;;113:2;;179:1;176;169:12;194:404;;;327:3;320:4;312:6;308:17;304:27;294:2;;352:8;342;335:26;294:2;-1:-1:-1;382:20:14;;-1:-1:-1;;;;;414:30:14;;411:2;;;464:8;454;447:26;411:2;508:4;500:6;496:17;484:29;;571:3;564:4;556;548:6;544:17;536:6;532:30;528:41;525:50;522:2;;;588:1;585;578:12;603:827;;719:4;707:9;702:3;698:19;694:30;691:2;;;741:5;734;727:20;691:2;778;772:9;820:4;812:6;808:17;891:6;879:10;876:22;-1:-1:-1;;;;;843:10:14;840:34;837:62;834:2;;;902:9;834:2;929;922:22;962:6;-1:-1:-1;962:6:14;992:23;;-1:-1:-1;;;;;1046:38:14;;1034:51;;1024:2;;1099:1;1096;1089:12;1024:2;1112:23;;1196:2;1181:18;;;1168:32;1151:15;;;1144:57;1234:39;1269:2;1254:18;;1234:39;:::i;:::-;1229:2;1221:6;1217:15;1210:64;1307:40;1343:2;1332:9;1328:18;1307:40;:::i;:::-;1302:2;1294:6;1290:15;1283:65;1382:41;1418:3;1407:9;1403:19;1382:41;:::i;:::-;1376:3;1368:6;1364:16;1357:67;;681:749;;;;:::o;1435:165::-;1504:20;;1564:10;1553:22;;1543:33;;1533:2;;1590:1;1587;1580:12;1605:198;;1717:2;1705:9;1696:7;1692:23;1688:32;1685:2;;;1738:6;1730;1723:22;1685:2;1766:31;1787:9;1766:31;:::i;:::-;1756:41;1675:128;-1:-1:-1;;;1675:128:14:o;1808:274::-;;;1937:2;1925:9;1916:7;1912:23;1908:32;1905:2;;;1958:6;1950;1943:22;1905:2;1986:31;2007:9;1986:31;:::i;:::-;1976:41;;2036:40;2072:2;2061:9;2057:18;2036:40;:::i;:::-;2026:50;;1895:187;;;;;:::o;2087:350::-;;;;2233:2;2221:9;2212:7;2208:23;2204:32;2201:2;;;2254:6;2246;2239:22;2201:2;2282:31;2303:9;2282:31;:::i;:::-;2272:41;;2332:40;2368:2;2357:9;2353:18;2332:40;:::i;:::-;2322:50;;2391:40;2427:2;2416:9;2412:18;2391:40;:::i;:::-;2381:50;;2191:246;;;;;:::o;2442:348::-;;;;2587:2;2575:9;2566:7;2562:23;2558:32;2555:2;;;2608:6;2600;2593:22;2555:2;2636:31;2657:9;2636:31;:::i;:::-;2626:41;;2686:40;2722:2;2711:9;2707:18;2686:40;:::i;:::-;2676:50;;2745:39;2780:2;2769:9;2765:18;2745:39;:::i;2795:334::-;;;;2941:2;2929:9;2920:7;2916:23;2912:32;2909:2;;;2962:6;2954;2947:22;2909:2;2990:31;3011:9;2990:31;:::i;:::-;2980:41;3068:2;3053:18;;3040:32;;-1:-1:-1;3119:2:14;3104:18;;;3091:32;;2899:230;-1:-1:-1;;;2899:230:14:o;3134:463::-;;;3281:2;3269:9;3260:7;3256:23;3252:32;3249:2;;;3302:6;3294;3287:22;3249:2;3347:9;3334:23;-1:-1:-1;;;;;3372:6:14;3369:30;3366:2;;;3417:6;3409;3402:22;3366:2;3461:76;3529:7;3520:6;3509:9;3505:22;3461:76;:::i;:::-;3556:8;;3435:102;;-1:-1:-1;3239:358:14;-1:-1:-1;;;;3239:358:14:o;3602:539::-;;;;3766:2;3754:9;3745:7;3741:23;3737:32;3734:2;;;3787:6;3779;3772:22;3734:2;3832:9;3819:23;-1:-1:-1;;;;;3857:6:14;3854:30;3851:2;;;3902:6;3894;3887:22;3851:2;3946:76;4014:7;4005:6;3994:9;3990:22;3946:76;:::i;:::-;4041:8;;-1:-1:-1;3920:102:14;-1:-1:-1;4095:40:14;;-1:-1:-1;4131:2:14;4116:18;;4095:40;:::i;4146:615::-;;;;;4327:2;4315:9;4306:7;4302:23;4298:32;4295:2;;;4348:6;4340;4333:22;4295:2;4393:9;4380:23;-1:-1:-1;;;;;4418:6:14;4415:30;4412:2;;;4463:6;4455;4448:22;4412:2;4507:76;4575:7;4566:6;4555:9;4551:22;4507:76;:::i;:::-;4602:8;;-1:-1:-1;4481:102:14;-1:-1:-1;4656:40:14;;-1:-1:-1;4692:2:14;4677:18;;4656:40;:::i;:::-;4646:50;;4715:40;4751:2;4740:9;4736:18;4715:40;:::i;:::-;4705:50;;4285:476;;;;;;;:::o;4766:607::-;;;;;4947:2;4935:9;4926:7;4922:23;4918:32;4915:2;;;4968:6;4960;4953:22;4915:2;5013:9;5000:23;-1:-1:-1;;;;;5038:6:14;5035:30;5032:2;;;5083:6;5075;5068:22;5032:2;5127:76;5195:7;5186:6;5175:9;5171:22;5127:76;:::i;:::-;5222:8;;-1:-1:-1;5101:102:14;-1:-1:-1;;5304:2:14;5289:18;;5276:32;;-1:-1:-1;5327:40:14;5363:2;5348:18;;5327:40;:::i;5378:684::-;;;;;;5576:3;5564:9;5555:7;5551:23;5547:33;5544:2;;;5598:6;5590;5583:22;5544:2;5643:9;5630:23;-1:-1:-1;;;;;5668:6:14;5665:30;5662:2;;;5713:6;5705;5698:22;5662:2;5757:76;5825:7;5816:6;5805:9;5801:22;5757:76;:::i;:::-;5852:8;;-1:-1:-1;5731:102:14;-1:-1:-1;;5934:2:14;5919:18;;5906:32;;-1:-1:-1;5957:40:14;5993:2;5978:18;;5957:40;:::i;:::-;5947:50;;6016:40;6052:2;6041:9;6037:18;6016:40;:::i;:::-;6006:50;;5534:528;;;;;;;;:::o;6067:761::-;;;;;;;6282:3;6270:9;6261:7;6257:23;6253:33;6250:2;;;6304:6;6296;6289:22;6250:2;6349:9;6336:23;-1:-1:-1;;;;;6374:6:14;6371:30;6368:2;;;6419:6;6411;6404:22;6368:2;6463:76;6531:7;6522:6;6511:9;6507:22;6463:76;:::i;:::-;6558:8;;-1:-1:-1;6437:102:14;-1:-1:-1;;6640:2:14;6625:18;;6612:32;;-1:-1:-1;6663:40:14;6699:2;6684:18;;6663:40;:::i;:::-;6653:50;;6722:40;6758:2;6747:9;6743:18;6722:40;:::i;:::-;6712:50;;6781:41;6817:3;6806:9;6802:19;6781:41;:::i;:::-;6771:51;;6240:588;;;;;;;;:::o;6833:1099::-;;6983:2;7026;7014:9;7005:7;7001:23;6997:32;6994:2;;;7047:6;7039;7032:22;6994:2;7092:9;7079:23;-1:-1:-1;;;;;7162:2:14;7154:6;7151:14;7148:2;;;7183:6;7175;7168:22;7148:2;7226:6;7215:9;7211:22;7201:32;;7271:7;7264:4;7260:2;7256:13;7252:27;7242:2;;7298:6;7290;7283:22;7242:2;7343;7330:16;7369:2;7361:6;7358:14;7355:2;;;7375:9;7355:2;7406:40;7442:2;7437;7429:6;7425:15;7421:24;7406:40;:::i;:::-;7480:19;;;7515:12;;;;-1:-1:-1;7547:11:14;;;7577:4;7608:15;;;7600:24;;7596:33;;7593:46;-1:-1:-1;7590:2:14;;;7657:6;7649;7642:22;7590:2;7684:6;7675:15;;7699:203;7713:6;7710:1;7707:13;7699:203;;;7774:53;7819:7;7814:3;7774:53;:::i;:::-;7762:66;;7735:1;7728:9;;;;;7848:12;;;;7880;;;;7699:203;;;-1:-1:-1;7921:5:14;;6963:969;-1:-1:-1;;;;;;;;6963:969:14:o;7937:194::-;;8060:2;8048:9;8039:7;8035:23;8031:32;8028:2;;;8081:6;8073;8066:22;8028:2;-1:-1:-1;8109:16:14;;8018:113;-1:-1:-1;8018:113:14:o;8136:255::-;;;8276:2;8264:9;8255:7;8251:23;8247:32;8244:2;;;8297:6;8289;8282:22;8244:2;-1:-1:-1;;8325:16:14;;8381:2;8366:18;;;8360:25;8325:16;;8360:25;;-1:-1:-1;8234:157:14:o;8396:293::-;;8517:2;8505:9;8496:7;8492:23;8488:32;8485:2;;;8538:6;8530;8523:22;8485:2;8575:9;8569:16;8625:4;8618:5;8614:16;8607:5;8604:27;8594:2;;8650:6;8642;8635:22;8694:469;;8791:5;8785:12;8818:6;8813:3;8806:19;8844:4;8873:2;8868:3;8864:12;8857:19;;8910:2;8903:5;8899:14;8931:3;8943:195;8957:6;8954:1;8951:13;8943:195;;;9022:13;;-1:-1:-1;;;;;9018:39:14;9006:52;;9078:12;;;;9113:15;;;;9054:1;8972:9;8943:195;;;-1:-1:-1;9154:3:14;;8761:402;-1:-1:-1;;;;;8761:402:14:o;9168:203::-;-1:-1:-1;;;;;9332:32:14;;;;9314:51;;9302:2;9287:18;;9269:102::o;9376:274::-;-1:-1:-1;;;;;9568:32:14;;;;9550:51;;9632:2;9617:18;;9610:34;9538:2;9523:18;;9505:145::o;9655:267::-;;9834:2;9823:9;9816:21;9854:62;9912:2;9901:9;9897:18;9889:6;9854:62;:::i;9927:813::-;;10184:2;10173:9;10166:21;10210:62;10268:2;10257:9;10253:18;10245:6;10210:62;:::i;:::-;10329:22;;;10291:2;10309:18;;;10302:50;;;;10401:13;;10423:22;;;10499:15;;;;10461;;;10532:4;10545:169;10559:6;10556:1;10553:13;10545:169;;;10620:13;;10608:26;;10689:15;;;;10654:12;;;;10581:1;10574:9;10545:169;;;-1:-1:-1;10731:3:14;;10156:584;-1:-1:-1;;;;;;;10156:584:14:o;10745:344::-;10947:2;10929:21;;;10986:2;10966:18;;;10959:30;-1:-1:-1;;;11020:2:14;11005:18;;10998:50;11080:2;11065:18;;10919:170::o;11094:338::-;11296:2;11278:21;;;11335:2;11315:18;;;11308:30;-1:-1:-1;;;11369:2:14;11354:18;;11347:44;11423:2;11408:18;;11268:164::o;11437:342::-;11639:2;11621:21;;;11678:2;11658:18;;;11651:30;-1:-1:-1;;;11712:2:14;11697:18;;11690:48;11770:2;11755:18;;11611:168::o;11784:338::-;11986:2;11968:21;;;12025:2;12005:18;;;11998:30;-1:-1:-1;;;12059:2:14;12044:18;;12037:44;12113:2;12098:18;;11958:164::o;12127:344::-;12329:2;12311:21;;;12368:2;12348:18;;;12341:30;-1:-1:-1;;;12402:2:14;12387:18;;12380:50;12462:2;12447:18;;12301:170::o;12476:177::-;12622:25;;;12610:2;12595:18;;12577:76::o;12658:391::-;12889:25;;;12945:2;12930:18;;12923:34;;;;12988:2;12973:18;;12966:34;13031:2;13016:18;;13009:34;12876:3;12861:19;;12843:206::o;13054:294::-;-1:-1:-1;;;;;13244:37:14;;;;13226:56;;13330:10;13318:23;13313:2;13298:18;;13291:51;13214:2;13199:18;;13181:167::o;13353:184::-;13525:4;13513:17;;;;13495:36;;13483:2;13468:18;;13450:87::o;13542:242::-;13612:2;13606:9;13642:17;;;-1:-1:-1;;;;;13674:34:14;;13710:22;;;13671:62;13668:2;;;13736:9;13668:2;13763;13756:22;13586:198;;-1:-1:-1;13586:198:14:o
Swarm Source
ipfs://a69cb44741de9acd3fd0e3340945805e2f6f7c6f2823301d14c5fece170160c9
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.