Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Farming
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at moonriver.moonscan.io on 2022-02-23 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/libraries/AdminUpgradeable.sol pragma solidity >=0.8.0; abstract contract AdminUpgradeable { address public admin; address public adminCandidate; function _initializeAdmin(address _admin) internal { require(admin == address(0), "admin already set"); admin = _admin; } function candidateConfirm() external { require(msg.sender == adminCandidate, "not Candidate"); emit AdminChanged(admin, adminCandidate); admin = adminCandidate; adminCandidate = address(0); } function setAdminCandidate(address _candidate) external onlyAdmin { adminCandidate = _candidate; emit Candidate(_candidate); } modifier onlyAdmin { require(msg.sender == admin, "not admin"); _; } event Candidate(address indexed newAdmin); event AdminChanged(address indexed oldAdmin, address indexed newAdmin); } // File: contracts/core/interfaces/IFactory.sol pragma solidity >=0.8.0; interface IFactory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); event PairCreateLocked( address indexed caller ); event PairCreateUnlocked( address indexed caller ); event BootstrapSetted( address indexed tokenA, address indexed tokenB, address indexed bootstrap ); event FeetoUpdated( address indexed feeto ); event FeeBasePointUpdated( uint8 basePoint ); function feeto() external view returns (address); function feeBasePoint() external view returns (uint8); function lockForPairCreate() external view returns (bool); function getPair(address tokenA, address tokenB) external view returns (address pair); function getBootstrap(address tokenA, address tokenB) external view returns (address bootstrap); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); } // File: contracts/core/interfaces/IPair.sol pragma solidity >=0.8.0; interface IPair { event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to ) external; function initialize(address, address) external; } // File: contracts/libraries/Math.sol pragma solidity >=0.8.0; // a library for performing various math operations library Math { function min(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x, "ds-math-add-overflow"); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "ds-math-sub-underflow"); } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } } // File: contracts/libraries/Helper.sol pragma solidity >=0.8.0; library Helper { using Math for uint256; function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, "Helper: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "Helper: ZERO_ADDRESS"); } function pairFor( address factory, address tokenA, address tokenB ) internal view returns (address pair) { return IFactory(factory).getPair(tokenA, tokenB); } function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) internal pure returns (uint256 amountB) { require(amountA > 0, "INSUFFICIENT_AMOUNT"); require(reserveA > 0 && reserveB > 0, "INSUFFICIENT_LIQUIDITY"); amountB = amountA.mul(reserveB) / reserveA; } function getReserves( address factory, address tokenA, address tokenB ) internal view returns (uint256 reserveA, uint256 reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1) = IPair( pairFor(factory, tokenA, tokenB) ).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(0x23b872dd, from, to, value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::transferFrom: transferFrom failed" ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(0xa9059cbb, to, value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::safeTransfer: transfer failed" ); } function safeTransferNativeCurrency(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require( success, "TransferHelper::safeTransferNativeCurrency: NativeCurrency transfer failed" ); } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountOut) { require(amountIn > 0, "Helper: INSUFFICIENT_INPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "Helper: INSUFFICIENT_LIQUIDITY" ); uint256 amountInWithFee = amountIn.mul(997); uint256 numerator = amountInWithFee.mul(reserveOut); uint256 denominator = reserveIn.mul(1000).add(amountInWithFee); amountOut = numerator / denominator; } // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountIn) { require(amountOut > 0, "Helper: INSUFFICIENT_OUTPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "Helper: INSUFFICIENT_LIQUIDITY" ); uint256 numerator = reserveIn.mul(amountOut).mul(1000); uint256 denominator = reserveOut.sub(amountOut).mul(997); amountIn = (numerator / denominator).add(1); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address factory, uint256 amountIn, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "Helper: INVALID_PATH"); amounts = new uint256[](path.length); amounts[0] = amountIn; for (uint256 i; i < path.length - 1; i++) { (uint256 reserveIn, uint256 reserveOut) = getReserves( factory, path[i], path[i + 1] ); amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut); } } function getAmountsIn( address factory, uint256 amountOut, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "Helper: INVALID_PATH"); amounts = new uint256[](path.length); amounts[amounts.length - 1] = amountOut; for (uint256 i = path.length - 1; i > 0; i--) { (uint256 reserveIn, uint256 reserveOut) = getReserves( factory, path[i - 1], path[i] ); amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut); } } } // File: contracts/periphery/Farming.sol pragma solidity >=0.8.0; contract Farming is AdminUpgradeable { using Math for uint256; // Info of each user. struct UserInfo { uint256 amount; // How many farming tokens that user has provided. uint256[] rewardDebt; // Reward debt. See explanation below. // pending reward = (user.amount * pool.accRewardPerShare) - user.rewardDebt // Whenever a user stakes or redeems farming tokens to a pool. Here's what happens: // 1. The pool's `accRewardPerShare` (and `lastRewardBlock`) gets updated. // 2. User add pending reward to his/her info. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. uint256[] pending; // Pending rewards. uint256 nextClaimableBlock; // Next Block user can claim rewards. } // Info of each pool. struct PoolInfo { address farmingToken; // Address of farming token contract. address[] rewardTokens; // Reward tokens. uint256[] rewardPerBlock; // Reward tokens created per block. uint256[] accRewardPerShare; // Accumulated rewards per share, times 1e12. uint256[] remainingRewards; // remaining rewards in the pool. uint256 amount; // amount of farming token. uint256 lastRewardBlock; // Last block number that pools updated. uint256 startBlock; // Start block of pools. uint256 claimableInterval; // How many blocks of rewards can be claimed. } // Info of each pool. PoolInfo[] private poolInfo; // Info of each user that stakes farming tokens. mapping(uint256 => mapping(address => UserInfo)) private userInfo; event PoolAdded(address indexed farmingToken); event Charged(uint256 indexed pid, address[] rewards, uint256[] amounts); event WithdrawRewards(uint256 indexed pid, address[] rewards, uint256[] amounts); event Stake(address indexed user, uint256 indexed pid, uint256 amount); event Redeem(address indexed user, uint256 indexed pid, uint256 amount); event Claim( address indexed user, uint256 indexed pid, address[] rewards, uint256[] amounts ); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); constructor() { _initializeAdmin(msg.sender); } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new farming token to the pool. Can only be called by the admin. // XXX DO NOT add the same farming token more than once. Rewards will be messed up if you do. function add( address _farmingToken, address[] memory _rewardTokens, uint256[] memory _rewardPerBlock, uint256 _startBlock, uint256 _claimableInterval ) external onlyAdmin { require(_rewardTokens.length == _rewardPerBlock.length, 'INVALID_REWARDS'); uint256 lastRewardBlock = block.number > _startBlock ? block.number : _startBlock; uint256[] memory accRewardPerShare = new uint256[](_rewardTokens.length); uint256[] memory remainingRewards = new uint256[](_rewardTokens.length); poolInfo.push( PoolInfo({ farmingToken: _farmingToken, rewardTokens: _rewardTokens, rewardPerBlock: _rewardPerBlock, accRewardPerShare: accRewardPerShare, remainingRewards: remainingRewards, amount: 0, lastRewardBlock: lastRewardBlock, startBlock: _startBlock, claimableInterval: _claimableInterval }) ); emit PoolAdded(_farmingToken); } // Update the given pool's rewardPerBlock. Can only be called by the admin. function set( uint256 _pid, uint256[] memory _rewardPerBlock, bool _withUpdate ) external onlyAdmin { if (_withUpdate) { updatePool(_pid); } PoolInfo storage pool = poolInfo[_pid]; require(_rewardPerBlock.length == pool.rewardPerBlock.length, 'INVALID_REWARDS'); pool.rewardPerBlock = _rewardPerBlock; } // Charge the given pool's rewards. Can only be called by the admin. function charge( uint256 _pid, uint256[] memory _amounts ) external onlyAdmin { PoolInfo storage pool = poolInfo[_pid]; require(_amounts.length == pool.rewardTokens.length, 'INVALID_AMOUNTS'); for (uint256 i = 0; i < _amounts.length; i++) { if (_amounts[i] > 0) { Helper.safeTransferFrom( pool.rewardTokens[i], msg.sender, address(this), _amounts[i] ); pool.remainingRewards[i] = pool.remainingRewards[i].add(_amounts[i]); } } emit Charged(_pid, pool.rewardTokens, _amounts); } // Withdraw the given pool's rewards. Can only be called by the admin. function withdrawRewards( uint256 _pid, uint256[] memory _amounts ) external onlyAdmin { PoolInfo storage pool = poolInfo[_pid]; require(_amounts.length == pool.rewardTokens.length, 'INVALID_AMOUNTS'); for (uint256 i = 0; i < _amounts.length; i++) { require(_amounts[i] <= pool.remainingRewards[i], 'INVALID_AMOUNT'); if (_amounts[i] > 0) { Helper.safeTransfer( pool.rewardTokens[i], msg.sender, _amounts[i] ); pool.remainingRewards[i] = pool.remainingRewards[i].sub(_amounts[i]); } } emit WithdrawRewards(_pid, pool.rewardTokens, _amounts); } // View function to see the given pool's info. function getPoolInfo(uint256 _pid) external view returns( address farmingToken, uint256 amount, address[] memory rewardTokens, uint256[] memory rewardPerBlock, uint256[] memory accRewardPerShare, uint256 lastRewardBlock, uint256 startBlock, uint256 claimableInterval ) { PoolInfo memory pool = poolInfo[_pid]; farmingToken = pool.farmingToken; amount = pool.amount; rewardTokens = pool.rewardTokens; rewardPerBlock = pool.rewardPerBlock; accRewardPerShare = pool.accRewardPerShare; lastRewardBlock = pool.lastRewardBlock; startBlock = pool.startBlock; claimableInterval = pool.claimableInterval; } // View function to see the remaing rewards of the given pool. function getRemaingRewards(uint256 _pid) external view returns(uint256[] memory remainingRewards) { PoolInfo memory pool = poolInfo[_pid]; remainingRewards = pool.remainingRewards; } // View function to see the given pool's info of user. function getUserInfo(uint256 _pid, address _user) external view returns( uint256 amount, uint256[] memory pending, uint256[] memory rewardDebt, uint256 nextClaimableBlock ) { UserInfo memory user = userInfo[_pid][_user]; amount = user.amount; pending = user.pending; rewardDebt= user.rewardDebt; nextClaimableBlock = user.nextClaimableBlock; } // View function to see pending rewards. function pendingRewards(uint256 _pid, address _user) public view returns(uint256[] memory rewards, uint256 nextClaimableBlock) { PoolInfo memory pool = poolInfo[_pid]; UserInfo memory user = userInfo[_pid][_user]; uint256 farmingTokenSupply = pool.amount; rewards = user.pending; if (block.number >= pool.lastRewardBlock && user.pending.length > 0 && farmingTokenSupply != 0) { for (uint256 i = 0; i < pool.accRewardPerShare.length; i++) { uint256 reward = pool.rewardPerBlock[i].mul( block.number.sub(pool.lastRewardBlock) ); uint256 accRewardPerShare = pool.accRewardPerShare[i].add( reward.mul(1e12) / farmingTokenSupply ); rewards[i] = user.pending[i].add( (user.amount.mul(accRewardPerShare) / 1e12).sub(user.rewardDebt[i]) ); } } nextClaimableBlock = user.nextClaimableBlock; } // View function to see current periods. function getPeriodsSinceStart(uint256 _pid) public view returns(uint256 periods) { PoolInfo memory pool = poolInfo[_pid]; if (block.number <= pool.startBlock) return 0; uint256 blocksSinceStart = block.number.sub(pool.startBlock); periods = (blocksSinceStart / pool.claimableInterval).add(1); if (blocksSinceStart % pool.claimableInterval == 0) { periods = periods - 1; } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 farmingTokenSupply = pool.amount; if (farmingTokenSupply == 0) { pool.lastRewardBlock = block.number; return; } for (uint256 i = 0; i < pool.accRewardPerShare.length; i++) { uint256 reward = pool.rewardPerBlock[i].mul( block.number.sub(pool.lastRewardBlock) ); if (pool.remainingRewards[i] >= reward) { pool.remainingRewards[i] = pool.remainingRewards[i].sub(reward); } else { pool.remainingRewards[i] = 0; } pool.accRewardPerShare[i] = pool.accRewardPerShare[i].add( reward.mul(1e12) / farmingTokenSupply ); } pool.lastRewardBlock = block.number; } // Stake farming tokens to the given pool. function stake( uint256 _pid, address _farmingToken, uint256 _amount ) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(pool.farmingToken == _farmingToken, 'FARMING_TOKEN_SAFETY_CHECK'); updatePool(_pid); if (user.amount > 0) { for (uint256 i = 0; i < pool.accRewardPerShare.length; i++) { uint256 pending = ( user.amount.mul(pool.accRewardPerShare[i]) / 1e12 ).sub(user.rewardDebt[i]); user.pending[i] = user.pending[i].add(pending); } } if (user.nextClaimableBlock == 0 && user.amount == 0) { if (block.number <= pool.startBlock) { user.nextClaimableBlock = pool.startBlock.add(pool.claimableInterval); } else { uint256 periods = getPeriodsSinceStart(_pid); user.nextClaimableBlock = pool.startBlock.add( periods.mul(pool.claimableInterval) ); } user.rewardDebt = new uint256[](pool.rewardTokens.length); user.pending = new uint256[](pool.rewardTokens.length); } Helper.safeTransferFrom( pool.farmingToken, msg.sender, address(this), _amount ); user.amount = user.amount.add(_amount); pool.amount = pool.amount.add(_amount); for (uint256 i = 0; i < pool.accRewardPerShare.length; i++) { user.rewardDebt[i] = user.amount.mul(pool.accRewardPerShare[i]) / 1e12; } emit Stake(msg.sender, _pid, _amount); } // Redeem farming tokens from the given pool. function redeem( uint256 _pid, address _farmingToken, uint256 _amount ) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(pool.farmingToken == _farmingToken, 'FARMING_TOKEN_SAFETY_CHECK'); require(user.amount >= _amount, 'INSUFFICIENT_AMOUNT'); updatePool(_pid); for (uint256 i = 0; i < pool.accRewardPerShare.length; i++) { uint256 pending = ( user.amount.mul(pool.accRewardPerShare[i]) / 1e12 ).sub(user.rewardDebt[i]); user.pending[i] = user.pending[i].add(pending); user.rewardDebt[i] = user.amount.sub(_amount).mul(pool.accRewardPerShare[i]) / 1e12; } Helper.safeTransfer(pool.farmingToken, msg.sender, _amount); user.amount = user.amount.sub(_amount); pool.amount = pool.amount.sub(_amount); emit Redeem(msg.sender, _pid, _amount); } // Claim rewards when block number larger than user's nextClaimableBlock. function claim(uint256 _pid) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(block.number > user.nextClaimableBlock, 'NOT_CLAIMABLE'); (uint256[] memory rewards, ) = pendingRewards(_pid, msg.sender); updatePool(_pid); for (uint256 i = 0; i < pool.accRewardPerShare.length; i++) { user.pending[i] = 0; user.rewardDebt[i] = user.amount.mul(pool.accRewardPerShare[i]) / 1e12; if (rewards[i] > 0) { Helper.safeTransfer(pool.rewardTokens[i], msg.sender, rewards[i]); } } uint256 periods = getPeriodsSinceStart(_pid); user.nextClaimableBlock = pool.startBlock.add( periods.mul(pool.claimableInterval) ); emit Claim(msg.sender, _pid, pool.rewardTokens, rewards); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; Helper.safeTransfer(pool.farmingToken, msg.sender, user.amount); emit EmergencyWithdraw(msg.sender, _pid, user.amount); pool.amount = pool.amount.sub(user.amount); user.amount = 0; user.pending = new uint256[](pool.accRewardPerShare.length); user.rewardDebt = new uint256[](pool.accRewardPerShare.length); user.nextClaimableBlock = 0; } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"Candidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"rewards","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"Charged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"rewards","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"farmingToken","type":"address"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"rewards","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"WithdrawRewards","type":"event"},{"inputs":[{"internalType":"address","name":"_farmingToken","type":"address"},{"internalType":"address[]","name":"_rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"_rewardPerBlock","type":"uint256[]"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_claimableInterval","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminCandidate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"candidateConfirm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"charge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPeriodsSinceStart","outputs":[{"internalType":"uint256","name":"periods","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolInfo","outputs":[{"internalType":"address","name":"farmingToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"rewardPerBlock","type":"uint256[]"},{"internalType":"uint256[]","name":"accRewardPerShare","type":"uint256[]"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"claimableInterval","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getRemaingRewards","outputs":[{"internalType":"uint256[]","name":"remainingRewards","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"pending","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardDebt","type":"uint256[]"},{"internalType":"uint256","name":"nextClaimableBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256[]","name":"rewards","type":"uint256[]"},{"internalType":"uint256","name":"nextClaimableBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_farmingToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"_rewardPerBlock","type":"uint256[]"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"setAdminCandidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_farmingToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"withdrawRewards","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200001d3362000023565b62000097565b6000546001600160a01b031615620000755760405162461bcd60e51b815260206004820152601160248201527018591b5a5b88185b1c9958591e481cd95d607a1b604482015260640160405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b612cfa80620000a76000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806351eb05a6116100ad578063a0b1f5dd11610071578063a0b1f5dd14610274578063d18df53c14610287578063d8780161146102a8578063f674fc50146102bb578063f851a440146102ce57600080fd5b806351eb05a6146102085780635312ea8e1461021b5780636e9c931c1461022e57806374ffcc1a1461024157806396de7aa01461026157600080fd5b8063379607f5116100f4578063379607f51461019c5780633accfa6c146101af5780633f023230146101da578063432daf3d146101e25780634dd1a1b7146101f557600080fd5b8063081e3eda146101265780631069f3b51461013d57806313df2cb5146101605780632f380b3514610175575b600080fd5b6002545b6040519081526020015b60405180910390f35b61015061014b36600461285f565b6102e1565b6040516101349493929190612b38565b61017361016e36600461273e565b6103f3565b005b610188610183366004612846565b6106a1565b6040516101349897969594939291906129d8565b6101736101aa366004612846565b6108c4565b6001546101c2906001600160a01b031681565b6040516001600160a01b039091168152602001610134565b610173610afb565b6101736101f03660046128c0565b610ba9565b610173610203366004612907565b610d88565b610173610216366004612846565b610e4b565b610173610229366004612846565b611003565b61017361023c36600461288b565b611175565b61025461024f366004612846565b611507565b6040516101349190612ae0565b61017361026f36600461271c565b6116e3565b6101736102823660046128c0565b611757565b61029a61029536600461285f565b61197b565b604051610134929190612af3565b6101736102b636600461288b565b611dd6565b61012a6102c9366004612846565b61200f565b6000546101c2906001600160a01b031681565b60008281526003602090815260408083206001600160a01b038516845282528083208151608081018352815481526001820180548451818702810187019095528085526060958695889586959490938584019383018282801561036357602002820191906000526020600020905b81548152602001906001019080831161034f575b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156103bb57602002820191906000526020600020905b8154815260200190600101908083116103a7575b5050509183525050600391909101546020918201528151604083015191830151606090930151909a9199509197509095509350505050565b6000546001600160a01b031633146104265760405162461bcd60e51b815260040161041d90612b15565b60405180910390fd5b82518451146104695760405162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f5245574152445360881b604482015260640161041d565b6000824311610478578261047a565b435b90506000855167ffffffffffffffff81111561049857610498612c9d565b6040519080825280602002602001820160405280156104c1578160200160208202803683370190505b5090506000865167ffffffffffffffff8111156104e0576104e0612c9d565b604051908082528060200260200182016040528015610509578160200160208202803683370190505b5060408051610120810182526001600160a01b038b8116825260208083018c81529383018b90526060830187905260808301859052600060a0840181905260c0840189905260e084018b905261010084018a905260028054600181018255915283517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600990920291820180546001600160a01b0319169190941617835593518051959650929491936105e3937f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909101929101906125d9565b50604082015180516105ff91600284019160209091019061263e565b506060820151805161061b91600384019160209091019061263e565b506080820151805161063791600484019160209091019061263e565b5060a0820151600582015560c0820151600682015560e08201516007820155610100909101516008909101556040516001600160a01b038916907f73cca62ab1b520c9715bf4e6c71e3e518c754e7148f65102f43289a7df0efea690600090a25050505050505050565b600080606080606060008060008060028a815481106106c2576106c2612c87565b60009182526020918290206040805161012081018252600990930290910180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561074457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610726575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561079c57602002820191906000526020600020905b815481526020019060010190808311610788575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156107f457602002820191906000526020600020905b8154815260200190600101908083116107e0575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561084c57602002820191906000526020600020905b815481526020019060010190808311610838575b505050505081526020016005820154815260200160068201548152602001600782015481526020016008820154815250509050806000015198508060a0015197508060200151965080604001519550806060015194508060c0015193508060e001519250806101000151915050919395975091939597565b6000600282815481106108d9576108d9612c87565b600091825260208083208584526003808352604080862033875290935291909320908101546009909202909201925043116109465760405162461bcd60e51b815260206004820152600d60248201526c4e4f545f434c41494d41424c4560981b604482015260640161041d565b6000610952843361197b565b50905061095e84610e4b565b60005b6003840154811015610a7b57600083600201828154811061098457610984612c87565b906000526020600020018190555064e8d4a510006109c48560030183815481106109b0576109b0612c87565b600091825260209091200154855490612259565b6109ce9190612be2565b8360010182815481106109e3576109e3612c87565b90600052602060002001819055506000828281518110610a0557610a05612c87565b60200260200101511115610a6957610a69846001018281548110610a2b57610a2b612c87565b9060005260206000200160009054906101000a90046001600160a01b031633848481518110610a5c57610a5c612c87565b60200260200101516122c6565b80610a7381612c2c565b915050610961565b506000610a878561200f565b9050610aae610aa385600801548361225990919063ffffffff16565b6007860154906123f0565b6003840155604051859033907f29efd1570858633f7fcf640ecc43b3edc6515af5b29e8e92d9dcad5209f5cd0d90610aec9060018901908790612a78565b60405180910390a35050505050565b6001546001600160a01b03163314610b455760405162461bcd60e51b815260206004820152600d60248201526c6e6f742043616e64696461746560981b604482015260640161041d565b600154600080546040516001600160a01b0393841693909116917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f91a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b03163314610bd35760405162461bcd60e51b815260040161041d90612b15565b600060028381548110610be857610be8612c87565b906000526020600020906009020190508060010180549050825114610c415760405162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f414d4f554e545360881b604482015260640161041d565b60005b8251811015610d45576000838281518110610c6157610c61612c87565b60200260200101511115610d3357610cc6826001018281548110610c8757610c87612c87565b9060005260206000200160009054906101000a90046001600160a01b03163330868581518110610cb957610cb9612c87565b6020026020010151612445565b610d11838281518110610cdb57610cdb612c87565b6020026020010151836004018381548110610cf857610cf8612c87565b90600052602060002001546123f090919063ffffffff16565b826004018281548110610d2657610d26612c87565b6000918252602090912001555b80610d3d81612c2c565b915050610c44565b50827fa145d60156a87e91a4a98486a8d187f4e4b78f756ff02d42b63b4b2f97207d4d8260010184604051610d7b929190612a78565b60405180910390a2505050565b6000546001600160a01b03163314610db25760405162461bcd60e51b815260040161041d90612b15565b8015610dc157610dc183610e4b565b600060028481548110610dd657610dd6612c87565b906000526020600020906009020190508060020180549050835114610e2f5760405162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f5245574152445360881b604482015260640161041d565b8251610e44906002830190602086019061263e565b5050505050565b600060028281548110610e6057610e60612c87565b9060005260206000209060090201905080600601544311610e7f575050565b600581015480610e9457504360069091015550565b60005b6003830154811015610ff7576000610eed610ebf85600601544361258390919063ffffffff16565b856002018481548110610ed457610ed4612c87565b906000526020600020015461225990919063ffffffff16565b905080846004018381548110610f0557610f05612c87565b906000526020600020015410610f6d57610f4781856004018481548110610f2e57610f2e612c87565b906000526020600020015461258390919063ffffffff16565b846004018381548110610f5c57610f5c612c87565b600091825260209091200155610f91565b6000846004018381548110610f8457610f84612c87565b6000918252602090912001555b610fc383610fa48364e8d4a51000612259565b610fae9190612be2565b856003018481548110610cf857610cf8612c87565b846003018381548110610fd857610fd8612c87565b6000918252602090912001555080610fef81612c2c565b915050610e97565b50504360069091015550565b60006002828154811061101857611018612c87565b60009182526020808320858452600382526040808520338087529352909320600990920290920180548254919450919261105b926001600160a01b0316916122c6565b8054604051908152839033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a3805460058301546110a491612583565b600583015560008155600382015467ffffffffffffffff8111156110ca576110ca612c9d565b6040519080825280602002602001820160405280156110f3578160200160208202803683370190505b50805161110a91600284019160209091019061263e565b50600382015467ffffffffffffffff81111561112857611128612c9d565b604051908082528060200260200182016040528015611151578160200160208202803683370190505b50805161116891600184019160209091019061263e565b5060006003909101555050565b60006002848154811061118a5761118a612c87565b600091825260208083208784526003825260408085203386529092529220600990910290910180549092506001600160a01b03908116908516146112105760405162461bcd60e51b815260206004820152601a60248201527f4641524d494e475f544f4b454e5f5341464554595f434845434b000000000000604482015260640161041d565b61121985610e4b565b8054156112e75760005b60038301548110156112e557600061129683600101838154811061124957611249612c87565b906000526020600020015464e8d4a5100061128687600301868154811061127257611272612c87565b600091825260209091200154875490612259565b6112909190612be2565b90612583565b90506112b181846002018481548110610cf857610cf8612c87565b8360020183815481106112c6576112c6612c87565b60009182526020909120015550806112dd81612c2c565b915050611223565b505b60038101541580156112f857508054155b1561141b5781600701544311611325576008820154600783015461131b916123f0565b600382015561135e565b60006113308661200f565b905061135761134c84600801548361225990919063ffffffff16565b6007850154906123f0565b6003830155505b600182015467ffffffffffffffff81111561137b5761137b612c9d565b6040519080825280602002602001820160405280156113a4578160200160208202803683370190505b5080516113bb91600184019160209091019061263e565b50600182015467ffffffffffffffff8111156113d9576113d9612c9d565b604051908082528060200260200182016040528015611402578160200160208202803683370190505b50805161141991600284019160209091019061263e565b505b8154611432906001600160a01b0316333086612445565b805461143e90846123f0565b8155600582015461144f90846123f0565b600583015560005b60038301548110156114d25764e8d4a5100061149584600301838154811061148157611481612c87565b600091825260209091200154845490612259565b61149f9190612be2565b8260010182815481106114b4576114b4612c87565b600091825260209091200155806114ca81612c2c565b915050611457565b50604051838152859033907f5af417134f72a9d41143ace85b0a26dce6f550f894f2cbc1eeee8810603d91b690602001610aec565b606060006002838154811061151e5761151e612c87565b60009182526020918290206040805161012081018252600990930290910180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156115a057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611582575b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156115f857602002820191906000526020600020905b8154815260200190600101908083116115e4575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561165057602002820191906000526020600020905b81548152602001906001019080831161163c575b50505050508152602001600482018054806020026020016040519081016040528092919081815260200182805480156116a857602002820191906000526020600020905b815481526020019060010190808311611694575b505050918352505060058201546020820152600682015460408201526007820154606082015260089091015460809182015201519392505050565b6000546001600160a01b0316331461170d5760405162461bcd60e51b815260040161041d90612b15565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f8cc40b9abca4a505a92028908f9d913d621d18112c69412806506f02333f26b490600090a250565b6000546001600160a01b031633146117815760405162461bcd60e51b815260040161041d90612b15565b60006002838154811061179657611796612c87565b9060005260206000209060090201905080600101805490508251146117ef5760405162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f414d4f554e545360881b604482015260640161041d565b60005b82518110156119455781600401818154811061181057611810612c87565b906000526020600020015483828151811061182d5761182d612c87565b602002602001015111156118745760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d05353d5539560921b604482015260640161041d565b600083828151811061188857611888612c87565b60200260200101511115611933576118df8260010182815481106118ae576118ae612c87565b9060005260206000200160009054906101000a90046001600160a01b031633858481518110610a5c57610a5c612c87565b6119118382815181106118f4576118f4612c87565b6020026020010151836004018381548110610f2e57610f2e612c87565b82600401828154811061192657611926612c87565b6000918252602090912001555b8061193d81612c2c565b9150506117f2565b50827f8a63d6747886a8cc1166e78fdd0df86a7a77fe1ee60ac1d042e6ff56c234fcc58260010184604051610d7b929190612a78565b60606000806002858154811061199357611993612c87565b60009182526020918290206040805161012081018252600990930290910180546001600160a01b03168352600181018054835181870281018701909452808452939491938583019392830182828015611a1557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116119f7575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611a6d57602002820191906000526020600020905b815481526020019060010190808311611a59575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611ac557602002820191906000526020600020905b815481526020019060010190808311611ab1575b5050505050815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b1d57602002820191906000526020600020905b815481526020019060010190808311611b09575b5050505050815260200160058201548152602001600682015481526020016007820154815260200160088201548152505090506000600360008781526020019081526020016000206000866001600160a01b03166001600160a01b031681526020019081526020016000206040518060800160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020018280548015611bec57602002820191906000526020600020905b815481526020019060010190808311611bd8575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611c4457602002820191906000526020600020905b815481526020019060010190808311611c30575b50505050508152602001600382015481525050905060008260a001519050816040015194508260c001514310158015611c8257506000826040015151115b8015611c8d57508015155b15611dc55760005b836060015151811015611dc3576000611cea611cbe8660c001514361258390919063ffffffff16565b86604001518481518110611cd457611cd4612c87565b602002602001015161225990919063ffffffff16565b90506000611d3784611d018464e8d4a51000612259565b611d0b9190612be2565b87606001518581518110611d2157611d21612c87565b60200260200101516123f090919063ffffffff16565b9050611d90611d7a86602001518581518110611d5557611d55612c87565b602002602001015164e8d4a51000611286858a6000015161225990919063ffffffff16565b86604001518581518110611d2157611d21612c87565b888481518110611da257611da2612c87565b60200260200101818152505050508080611dbb90612c2c565b915050611c95565b505b816060015193505050509250929050565b600060028481548110611deb57611deb612c87565b600091825260208083208784526003825260408085203386529092529220600990910290910180549092506001600160a01b0390811690851614611e715760405162461bcd60e51b815260206004820152601a60248201527f4641524d494e475f544f4b454e5f5341464554595f434845434b000000000000604482015260640161041d565b8054831115611eb85760405162461bcd60e51b8152602060048201526013602482015272125394d551919250d251539517d05353d55395606a1b604482015260640161041d565b611ec185610e4b565b60005b6003830154811015611fa2576000611eea83600101838154811061124957611249612c87565b9050611f0581846002018481548110610cf857610cf8612c87565b836002018381548110611f1a57611f1a612c87565b906000526020600020018190555064e8d4a51000611f64856003018481548110611f4657611f46612c87565b6000918252602090912001548554611f5e9089612583565b90612259565b611f6e9190612be2565b836001018381548110611f8357611f83612c87565b6000918252602090912001555080611f9a81612c2c565b915050611ec4565b508154611fb9906001600160a01b031633856122c6565b8054611fc59084612583565b81556005820154611fd69084612583565b6005830155604051838152859033907fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a92990602001610aec565b6000806002838154811061202557612025612c87565b60009182526020918290206040805161012081018252600990930290910180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156120a757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612089575b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156120ff57602002820191906000526020600020905b8154815260200190600101908083116120eb575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561215757602002820191906000526020600020905b815481526020019060010190808311612143575b50505050508152602001600482018054806020026020016040519081016040528092919081815260200182805480156121af57602002820191906000526020600020905b81548152602001906001019080831161219b575b5050505050815260200160058201548152602001600682015481526020016007820154815260200160088201548152505090508060e0015143116121f65750600092915050565b600061220f8260e001514361258390919063ffffffff16565b905061222d6001836101000151836122279190612be2565b906123f0565b9250816101000151816122409190612c47565b6122525761224f600184612c15565b92505b5050919050565b600081158061227d5750828261226f8183612bf6565b925061227b9083612be2565b145b6122c05760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161041d565b92915050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612322919061299d565b6000604051808303816000865af19150503d806000811461235f576040519150601f19603f3d011682016040523d82523d6000602084013e612364565b606091505b509150915081801561238e57508051158061238e57508080602001905181019061238e9190612829565b610e445760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b606482015260840161041d565b6000826123fd8382612bca565b91508110156122c05760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015260640161041d565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916124a9919061299d565b6000604051808303816000865af19150503d80600081146124e6576040519150601f19603f3d011682016040523d82523d6000602084013e6124eb565b606091505b50915091508180156125155750805115806125155750808060200190518101906125159190612829565b61257b5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b606482015260840161041d565b505050505050565b6000826125908382612c15565b91508111156122c05760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161041d565b82805482825590600052602060002090810192821561262e579160200282015b8281111561262e57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906125f9565b5061263a929150612679565b5090565b82805482825590600052602060002090810192821561262e579160200282015b8281111561262e57825182559160200191906001019061265e565b5b8082111561263a576000815560010161267a565b80356001600160a01b03811681146126a557600080fd5b919050565b600082601f8301126126bb57600080fd5b813560206126d06126cb83612ba6565b612b75565b80838252828201915082860187848660051b89010111156126f057600080fd5b60005b8581101561270f578135845292840192908401906001016126f3565b5090979650505050505050565b60006020828403121561272e57600080fd5b6127378261268e565b9392505050565b600080600080600060a0868803121561275657600080fd5b61275f8661268e565b945060208087013567ffffffffffffffff8082111561277d57600080fd5b818901915089601f83011261279157600080fd5b813561279f6126cb82612ba6565b8082825285820191508585018d878560051b88010111156127bf57600080fd5b600095505b838610156127e9576127d58161268e565b8352600195909501949186019186016127c4565b5098505050604089013592508083111561280257600080fd5b5050612810888289016126aa565b9598949750949560608101359550608001359392505050565b60006020828403121561283b57600080fd5b815161273781612cb3565b60006020828403121561285857600080fd5b5035919050565b6000806040838503121561287257600080fd5b823591506128826020840161268e565b90509250929050565b6000806000606084860312156128a057600080fd5b833592506128b06020850161268e565b9150604084013590509250925092565b600080604083850312156128d357600080fd5b82359150602083013567ffffffffffffffff8111156128f157600080fd5b6128fd858286016126aa565b9150509250929050565b60008060006060848603121561291c57600080fd5b83359250602084013567ffffffffffffffff81111561293a57600080fd5b612946868287016126aa565b925050604084013561295781612cb3565b809150509250925092565b600081518084526020808501945080840160005b8381101561299257815187529582019590820190600101612976565b509495945050505050565b6000825160005b818110156129be57602081860181015185830152016129a4565b818111156129cd576000828501525b509190910192915050565b6001600160a01b03898116825260208083018a90526101006040840181905289519084018190526000926101208501928b810192855b81811015612a2c578451841686529482019493820193600101612a0e565b50505050508281036060840152612a438189612962565b90508281036080840152612a578188612962565b60a0840196909652505060c081019290925260e09091015295945050505050565b6000604082016040835280855480835260608501915086600052602092508260002060005b82811015612ac25781546001600160a01b031684529284019260019182019101612a9d565b50505083810382850152612ad68186612962565b9695505050505050565b6020815260006127376020830184612962565b604081526000612b066040830185612962565b90508260208301529392505050565b6020808252600990820152683737ba1030b236b4b760b91b604082015260600190565b848152608060208201526000612b516080830186612962565b8281036040840152612b638186612962565b91505082606083015295945050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612b9e57612b9e612c9d565b604052919050565b600067ffffffffffffffff821115612bc057612bc0612c9d565b5060051b60200190565b60008219821115612bdd57612bdd612c5b565b500190565b600082612bf157612bf1612c71565b500490565b6000816000190483118215151615612c1057612c10612c5b565b500290565b600082821015612c2757612c27612c5b565b500390565b6000600019821415612c4057612c40612c5b565b5060010190565b600082612c5657612c56612c71565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114612cc157600080fd5b5056fea2646970667358221220ca28770dcffaadee76633b02610b4229fe312af8e96aed21881a303bb252b0c964736f6c63430008070033
Deployed ByteCode Sourcemap
13243:14924:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15630:95;15702:8;:15;15630:95;;;13858:25:1;;;13846:2;13831:18;15630:95:0;;;;;;;;20447:487;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;15910:1127::-;;;;;;:::i;:::-;;:::i;:::-;;19235:830;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;26621:906::-;;;;;;:::i;:::-;;:::i;2991:29::-;;;;;-1:-1:-1;;;;;2991:29:0;;;;;;-1:-1:-1;;;;;5460:32:1;;;5442:51;;5430:2;5415:18;2991:29:0;5296:203:1;3183:234:0;;;:::i;17606:714::-;;;;;;:::i;:::-;;:::i;17126:398::-;;;;;;:::i;:::-;;:::i;22676:978::-;;;;;;:::i;:::-;;:::i;27598:566::-;;;;;;:::i;:::-;;:::i;23710:1758::-;;;;;;:::i;:::-;;:::i;20141:238::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3425:149::-;;;;;;:::i;:::-;;:::i;18404:771::-;;;;;;:::i;:::-;;:::i;20988:1077::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;25527:1007::-;;;;;;:::i;:::-;;:::i;22119:481::-;;;;;;:::i;:::-;;:::i;2964:20::-;;;;;-1:-1:-1;;;;;2964:20:0;;;20447:487;20561:14;20748;;;:8;:14;;;;;;;;-1:-1:-1;;;;;20748:21:0;;;;;;;;;20725:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20590:24;;;;20561:14;;;;20725:44;20748:21;;20725:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20725:44:0;;;-1:-1:-1;;20725:44:0;;;;;;;;;;;20789:11;;20821:12;;;;20856:15;;;;20903:23;;;;;20789:11;;20821:12;;-1:-1:-1;20856:15:0;;-1:-1:-1;20903:23:0;;-1:-1:-1;20447:487:0;-1:-1:-1;;;;20447:487:0:o;15910:1127::-;3634:5;;-1:-1:-1;;;;;3634:5:0;3620:10;:19;3612:41;;;;-1:-1:-1;;;3612:41:0;;;;;;;:::i;:::-;;;;;;;;;16175:15:::1;:22;16151:13;:20;:46;16143:74;;;::::0;-1:-1:-1;;;16143:74:0;;12542:2:1;16143:74:0::1;::::0;::::1;12524:21:1::0;12581:2;12561:18;;;12554:30;-1:-1:-1;;;12600:18:1;;;12593:45;12655:18;;16143:74:0::1;12340:339:1::0;16143:74:0::1;16228:23;16282:11;16267:12;:26;:55;;16311:11;16267:55;;;16296:12;16267:55;16228:94;;16333:34;16384:13;:20;16370:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;16370:35:0::1;;16333:72;;16416:33;16466:13;:20;16452:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;16452:35:0::1;-1:-1:-1::0;16526:452:0::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;16526:452:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16526:452:0;;;;;;;;;;;;;;;;;;;;;;;;16498:8:::1;:491:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;16498:491:0::1;::::0;;;::::1;;::::0;;;;;;16526:452;;-1:-1:-1;16526:452:0;;16498:491;;::::1;::::0;;;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;16498:491:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;16498:491:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;16498:491:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;16498:491:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;17005:24:::1;::::0;-1:-1:-1;;;;;17005:24:0;::::1;::::0;::::1;::::0;-1:-1:-1;;17005:24:0::1;16132:905;;;15910:1127:::0;;;;;:::o;19235:830::-;19335:20;19370:14;19399:29;19443:31;19489:34;19538:23;19576:18;19609:25;19662:20;19685:8;19694:4;19685:14;;;;;;;;:::i;:::-;;;;;;;;;;19662:37;;;;;;;;19685:14;;;;;;;19662:37;;-1:-1:-1;;;;;19662:37:0;;;;;;;;;;;;;;;;;;;;;;;;;19685:14;;19662:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19662:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19725:4;:17;;;19710:32;;19762:4;:11;;;19753:20;;19799:4;:17;;;19784:32;;19844:4;:19;;;19827:36;;19894:4;:22;;;19874:42;;19945:4;:20;;;19927:38;;19989:4;:15;;;19976:28;;20035:4;:22;;;20015:42;;19651:414;19235:830;;;;;;;;;:::o;26621:906::-;26670:21;26694:8;26703:4;26694:14;;;;;;;;:::i;:::-;;;;;;;;;26743;;;:8;:14;;;;;;;26758:10;26743:26;;;;;;;;;26803:23;;;;26694:14;;;;;;;;-1:-1:-1;26788:12:0;:38;26780:64;;;;-1:-1:-1;;;26780:64:0;;10745:2:1;26780:64:0;;;10727:21:1;10784:2;10764:18;;;10757:30;-1:-1:-1;;;10803:18:1;;;10796:43;10856:18;;26780:64:0;10543:337:1;26780:64:0;26856:24;26886:32;26901:4;26907:10;26886:14;:32::i;:::-;26855:63;;;26929:16;26940:4;26929:10;:16::i;:::-;26961:9;26956:325;26980:22;;;:29;26976:33;;26956:325;;;27049:1;27031:4;:12;;27044:1;27031:15;;;;;;;;:::i;:::-;;;;;;;;:19;;;;27131:4;27086:42;27102:4;:22;;27125:1;27102:25;;;;;;;;:::i;:::-;;;;;;;;;;;27086:11;;;:15;:42::i;:::-;:49;;;;:::i;:::-;27065:4;:15;;27081:1;27065:18;;;;;;;;:::i;:::-;;;;;;;;:70;;;;27167:1;27154:7;27162:1;27154:10;;;;;;;;:::i;:::-;;;;;;;:14;27150:120;;;27189:65;27209:4;:17;;27227:1;27209:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27209:20:0;27231:10;27243:7;27251:1;27243:10;;;;;;;;:::i;:::-;;;;;;;27189:19;:65::i;:::-;27011:3;;;;:::i;:::-;;;;26956:325;;;;27291:15;27309:26;27330:4;27309:20;:26::i;:::-;27291:44;;27372:80;27406:35;27418:4;:22;;;27406:7;:11;;:35;;;;:::i;:::-;27372:15;;;;;:19;:80::i;:::-;27346:23;;;:106;27468:51;;27486:4;;27474:10;;27468:51;;;;27492:17;;;;27511:7;;27468:51;:::i;:::-;;;;;;;;26659:868;;;;26621:906;:::o;3183:234::-;3253:14;;-1:-1:-1;;;;;3253:14:0;3239:10;:28;3231:54;;;;-1:-1:-1;;;3231:54:0;;11786:2:1;3231:54:0;;;11768:21:1;11825:2;11805:18;;;11798:30;-1:-1:-1;;;11844:18:1;;;11837:43;11897:18;;3231:54:0;11584:337:1;3231:54:0;3321:14;;;3314:5;;3301:35;;-1:-1:-1;;;;;3321:14:0;;;;3314:5;;;;3301:35;;;3357:14;;;;3349:22;;-1:-1:-1;;;;;;3349:22:0;;;-1:-1:-1;;;;;3357:14:0;;3349:22;;;;3382:27;;;3183:234::o;17606:714::-;3634:5;;-1:-1:-1;;;;;3634:5:0;3620:10;:19;3612:41;;;;-1:-1:-1;;;3612:41:0;;;;;;;:::i;:::-;17718:21:::1;17742:8;17751:4;17742:14;;;;;;;;:::i;:::-;;;;;;;;;;;17718:38;;17794:4;:17;;:24;;;;17775:8;:15;:43;17767:71;;;::::0;-1:-1:-1;;;17767:71:0;;11087:2:1;17767:71:0::1;::::0;::::1;11069:21:1::0;11126:2;11106:18;;;11099:30;-1:-1:-1;;;11145:18:1;;;11138:45;11200:18;;17767:71:0::1;10885:339:1::0;17767:71:0::1;17854:9;17849:406;17873:8;:15;17869:1;:19;17849:406;;;17928:1;17914:8;17923:1;17914:11;;;;;;;;:::i;:::-;;;;;;;:15;17910:334;;;17950:191;17996:4;:17;;18014:1;17996:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;17996:20:0::1;18040:10;18082:4;18111:8;18120:1;18111:11;;;;;;;;:::i;:::-;;;;;;;17950:23;:191::i;:::-;18187:41;18216:8;18225:1;18216:11;;;;;;;;:::i;:::-;;;;;;;18187:4;:21;;18209:1;18187:24;;;;;;;;:::i;:::-;;;;;;;;;:28;;:41;;;;:::i;:::-;18160:4;:21;;18182:1;18160:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:68:::0;17910:334:::1;17890:3:::0;::::1;::::0;::::1;:::i;:::-;;;;17849:406;;;;18278:4;18270:42;18284:4;:17;;18303:8;18270:42;;;;;;;:::i;:::-;;;;;;;;17707:613;17606:714:::0;;:::o;17126:398::-;3634:5;;-1:-1:-1;;;;;3634:5:0;3620:10;:19;3612:41;;;;-1:-1:-1;;;3612:41:0;;;;;;;:::i;:::-;17273:11:::1;17269:60;;;17301:16;17312:4;17301:10;:16::i;:::-;17339:21;17363:8;17372:4;17363:14;;;;;;;;:::i;:::-;;;;;;;;;;;17339:38;;17422:4;:19;;:26;;;;17396:15;:22;:52;17388:80;;;::::0;-1:-1:-1;;;17388:80:0;;12542:2:1;17388:80:0::1;::::0;::::1;12524:21:1::0;12581:2;12561:18;;;12554:30;-1:-1:-1;;;12600:18:1;;;12593:45;12655:18;;17388:80:0::1;12340:339:1::0;17388:80:0::1;17479:37:::0;;::::1;::::0;:19:::1;::::0;::::1;::::0;:37:::1;::::0;::::1;::::0;::::1;:::i;:::-;;17258:266;17126:398:::0;;;:::o;22676:978::-;22728:21;22752:8;22761:4;22752:14;;;;;;;;:::i;:::-;;;;;;;;;;;22728:38;;22797:4;:20;;;22781:12;:36;22777:75;;22834:7;22676:978;:::o;22777:75::-;22891:11;;;;22917:23;22913:112;;-1:-1:-1;22980:12:0;22957:20;;;;:35;-1:-1:-1;22676:978:0:o;22913:112::-;23040:9;23035:566;23059:22;;;:29;23055:33;;23035:566;;;23110:14;23127:98;23172:38;23189:4;:20;;;23172:12;:16;;:38;;;;:::i;:::-;23127:4;:19;;23147:1;23127:22;;;;;;;;:::i;:::-;;;;;;;;;:26;;:98;;;;:::i;:::-;23110:115;;23272:6;23244:4;:21;;23266:1;23244:24;;;;;;;;:::i;:::-;;;;;;;;;:34;23240:207;;23326:36;23355:6;23326:4;:21;;23348:1;23326:24;;;;;;;;:::i;:::-;;;;;;;;;:28;;:36;;;;:::i;:::-;23299:4;:21;;23321:1;23299:24;;;;;;;;:::i;:::-;;;;;;;;;;:63;23240:207;;;23430:1;23403:4;:21;;23425:1;23403:24;;;;;;;;:::i;:::-;;;;;;;;;;:28;23240:207;23489:100;23556:18;23537:16;:6;23548:4;23537:10;:16::i;:::-;:37;;;;:::i;:::-;23489:4;:22;;23512:1;23489:25;;;;;;;;:::i;:100::-;23461:4;:22;;23484:1;23461:25;;;;;;;;:::i;:::-;;;;;;;;;;:128;-1:-1:-1;23090:3:0;;;;:::i;:::-;;;;23035:566;;;-1:-1:-1;;23634:12:0;23611:20;;;;:35;-1:-1:-1;22676:978:0:o;27598:566::-;27659:21;27683:8;27692:4;27683:14;;;;;;;;:::i;:::-;;;;;;;;;27732;;;:8;:14;;;;;;27747:10;27732:26;;;;;;;;27683:14;;;;;;;27789:17;;27820:11;;27683:14;;-1:-1:-1;27732:26:0;;27769:63;;-1:-1:-1;;;;;27789:17:0;;27769:19;:63::i;:::-;27884:11;;27848:48;;13858:25:1;;;27878:4:0;;27866:10;;27848:48;;13846:2:1;13831:18;27848:48:0;;;;;;;27937:11;;27921;;;;:28;;:15;:28::i;:::-;27907:11;;;:42;27974:1;27960:15;;28015:22;;;:29;28001:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28001:44:0;-1:-1:-1;27986:59:0;;;;:12;;;;:59;;;;;;:::i;:::-;-1:-1:-1;28088:22:0;;;:29;28074:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28074:44:0;-1:-1:-1;28056:62:0;;;;:15;;;;:62;;;;;;:::i;:::-;-1:-1:-1;28155:1:0;28129:23;;;;:27;-1:-1:-1;;27598:566:0:o;23710:1758::-;23834:21;23858:8;23867:4;23858:14;;;;;;;;:::i;:::-;;;;;;;;;23907;;;:8;:14;;;;;;23922:10;23907:26;;;;;;;23858:14;;;;;;;23952:17;;23858:14;;-1:-1:-1;;;;;;23952:17:0;;;:34;;;;23944:73;;;;-1:-1:-1;;;23944:73:0;;11431:2:1;23944:73:0;;;11413:21:1;11470:2;11450:18;;;11443:30;11509:28;11489:18;;;11482:56;11555:18;;23944:73:0;11229:350:1;23944:73:0;24028:16;24039:4;24028:10;:16::i;:::-;24059:11;;:15;24055:340;;24096:9;24091:293;24115:22;;;:29;24111:33;;24091:293;;;24170:15;24188:115;24284:4;:15;;24300:1;24284:18;;;;;;;;:::i;:::-;;;;;;;;;24256:4;24211:42;24227:4;:22;;24250:1;24227:25;;;;;;;;:::i;:::-;;;;;;;;;;;24211:11;;;:15;:42::i;:::-;:49;;;;:::i;:::-;24188:95;;:115::i;:::-;24170:133;;24340:28;24360:7;24340:4;:12;;24353:1;24340:15;;;;;;;;:::i;:28::-;24322:4;:12;;24335:1;24322:15;;;;;;;;:::i;:::-;;;;;;;;;;:46;-1:-1:-1;24146:3:0;;;;:::i;:::-;;;;24091:293;;;;24055:340;24409:23;;;;:28;:48;;;;-1:-1:-1;24441:11:0;;:16;24409:48;24405:588;;;24494:4;:15;;;24478:12;:31;24474:367;;24576:22;;;;24556:15;;;;:43;;:19;:43::i;:::-;24530:23;;;:69;24474:367;;;24640:15;24658:26;24679:4;24658:20;:26::i;:::-;24640:44;;24729:96;24771:35;24783:4;:22;;;24771:7;:11;;:35;;;;:::i;:::-;24729:15;;;;;:19;:96::i;:::-;24703:23;;;:122;-1:-1:-1;24474:367:0;24887:17;;;:24;24873:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24873:39:0;-1:-1:-1;24855:57:0;;;;:15;;;;:57;;;;;;:::i;:::-;-1:-1:-1;24956:17:0;;;:24;24942:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24942:39:0;-1:-1:-1;24927:54:0;;;;:12;;;;:54;;;;;;:::i;:::-;;24405:588;25041:17;;25003:144;;-1:-1:-1;;;;;25041:17:0;25074:10;25108:4;25129:7;25003:23;:144::i;:::-;25172:11;;:24;;25188:7;25172:15;:24::i;:::-;25158:38;;25221:11;;;;:24;;25237:7;25221:15;:24::i;:::-;25207:11;;;:38;25261:9;25256:157;25280:22;;;:29;25276:33;;25256:157;;;25397:4;25352:42;25368:4;:22;;25391:1;25368:25;;;;;;;;:::i;:::-;;;;;;;;;;;25352:11;;;:15;:42::i;:::-;:49;;;;:::i;:::-;25331:4;:15;;25347:1;25331:18;;;;;;;;:::i;:::-;;;;;;;;;;:70;25311:3;;;;:::i;:::-;;;;25256:157;;;-1:-1:-1;25428:32:0;;13858:25:1;;;25446:4:0;;25434:10;;25428:32;;13846:2:1;13831:18;25428:32:0;13712:177:1;20141:238:0;20232:33;20283:20;20306:8;20315:4;20306:14;;;;;;;;:::i;:::-;;;;;;;;;;20283:37;;;;;;;;20306:14;;;;;;;20283:37;;-1:-1:-1;;;;;20283:37:0;;;;;;;;;;;;;;;;;;;;;;;;;20306:14;;20283:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20283:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20283:37:0;;;-1:-1:-1;;20283:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20350:21;;;20141:238;-1:-1:-1;;;20141:238:0:o;3425:149::-;3634:5;;-1:-1:-1;;;;;3634:5:0;3620:10;:19;3612:41;;;;-1:-1:-1;;;3612:41:0;;;;;;;:::i;:::-;3502:14:::1;:27:::0;;-1:-1:-1;;;;;;3502:27:0::1;-1:-1:-1::0;;;;;3502:27:0;::::1;::::0;;::::1;::::0;;;3545:21:::1;::::0;::::1;::::0;-1:-1:-1;;3545:21:0::1;3425:149:::0;:::o;18404:771::-;3634:5;;-1:-1:-1;;;;;3634:5:0;3620:10;:19;3612:41;;;;-1:-1:-1;;;3612:41:0;;;;;;;:::i;:::-;18525:21:::1;18549:8;18558:4;18549:14;;;;;;;;:::i;:::-;;;;;;;;;;;18525:38;;18601:4;:17;;:24;;;;18582:8;:15;:43;18574:71;;;::::0;-1:-1:-1;;;18574:71:0;;11087:2:1;18574:71:0::1;::::0;::::1;11069:21:1::0;11126:2;11106:18;;;11099:30;-1:-1:-1;;;11145:18:1;;;11138:45;11200:18;;18574:71:0::1;10885:339:1::0;18574:71:0::1;18661:9;18656:446;18680:8;:15;18676:1;:19;18656:446;;;18740:4;:21;;18762:1;18740:24;;;;;;;;:::i;:::-;;;;;;;;;18725:8;18734:1;18725:11;;;;;;;;:::i;:::-;;;;;;;:39;;18717:66;;;::::0;-1:-1:-1;;;18717:66:0;;13571:2:1;18717:66:0::1;::::0;::::1;13553:21:1::0;13610:2;13590:18;;;13583:30;-1:-1:-1;;;13629:18:1;;;13622:44;13683:18;;18717:66:0::1;13369:338:1::0;18717:66:0::1;18816:1;18802:8;18811:1;18802:11;;;;;;;;:::i;:::-;;;;;;;:15;18798:293;;;18838:150;18880:4;:17;;18898:1;18880:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;18880:20:0::1;18924:10;18958:8;18967:1;18958:11;;;;;;;;:::i;18838:150::-;19034:41;19063:8;19072:1;19063:11;;;;;;;;:::i;:::-;;;;;;;19034:4;:21;;19056:1;19034:24;;;;;;;;:::i;:41::-;19007:4;:21;;19029:1;19007:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:68:::0;18798:293:::1;18697:3:::0;::::1;::::0;::::1;:::i;:::-;;;;18656:446;;;;19133:4;19117:50;19139:4;:17;;19158:8;19117:50;;;;;;;:::i;20988:1077::-:0;21091:24;21117:26;21161:20;21184:8;21193:4;21184:14;;;;;;;;:::i;:::-;;;;;;;;;;21161:37;;;;;;;;21184:14;;;;;;;21161:37;;-1:-1:-1;;;;;21161:37:0;;;;;;;;;;;;;;;;;;;;;;;;;21184:14;;21161:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21161:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21209:20;21232:8;:14;21241:4;21232:14;;;;;;;;;;;:21;21247:5;-1:-1:-1;;;;;21232:21:0;-1:-1:-1;;;;;21232:21:0;;;;;;;;;;;;21209:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21264:26;21293:4;:11;;;21264:40;;21325:4;:12;;;21315:22;;21368:4;:20;;;21352:12;:36;;:63;;;;;21414:1;21392:4;:12;;;:19;:23;21352:63;:90;;;;-1:-1:-1;21419:23:0;;;21352:90;21348:655;;;21464:9;21459:533;21483:4;:22;;;:29;21479:1;:33;21459:533;;;21538:14;21555:106;21604:38;21621:4;:20;;;21604:12;:16;;:38;;;;:::i;:::-;21555:4;:19;;;21575:1;21555:22;;;;;;;;:::i;:::-;;;;;;;:26;;:106;;;;:::i;:::-;21538:123;-1:-1:-1;21680:25:0;21708:108;21779:18;21760:16;21538:123;21771:4;21760:10;:16::i;:::-;:37;;;;:::i;:::-;21708:4;:22;;;21731:1;21708:25;;;;;;;;:::i;:::-;;;;;;;:29;;:108;;;;:::i;:::-;21680:136;;21848:128;21890:67;21938:4;:15;;;21954:1;21938:18;;;;;;;;:::i;:::-;;;;;;;21928:4;21891:34;21907:17;21891:4;:11;;;:15;;:34;;;;:::i;21890:67::-;21848:4;:12;;;21861:1;21848:15;;;;;;;;:::i;:128::-;21835:7;21843:1;21835:10;;;;;;;;:::i;:::-;;;;;;:141;;;;;21519:473;;21514:3;;;;;:::i;:::-;;;;21459:533;;;;21348:655;22034:4;:23;;;22013:44;;21150:915;;;20988:1077;;;;;:::o;25527:1007::-;25653:21;25677:8;25686:4;25677:14;;;;;;;;:::i;:::-;;;;;;;;;25726;;;:8;:14;;;;;;25741:10;25726:26;;;;;;;25677:14;;;;;;;25771:17;;25677:14;;-1:-1:-1;;;;;;25771:17:0;;;:34;;;;25763:73;;;;-1:-1:-1;;;25763:73:0;;11431:2:1;25763:73:0;;;11413:21:1;11470:2;11450:18;;;11443:30;11509:28;11489:18;;;11482:56;11555:18;;25763:73:0;11229:350:1;25763:73:0;25855:11;;:22;-1:-1:-1;25855:22:0;25847:54;;;;-1:-1:-1;;;25847:54:0;;13223:2:1;25847:54:0;;;13205:21:1;13262:2;13242:18;;;13235:30;-1:-1:-1;;;13281:18:1;;;13274:49;13340:18;;25847:54:0;13021:343:1;25847:54:0;25912:16;25923:4;25912:10;:16::i;:::-;25944:9;25939:371;25963:22;;;:29;25959:33;;25939:371;;;26014:15;26032:107;26120:4;:15;;26136:1;26120:18;;;;;;;;:::i;26032:107::-;26014:125;;26172:28;26192:7;26172:4;:12;;26185:1;26172:15;;;;;;;;:::i;:28::-;26154:4;:12;;26167:1;26154:15;;;;;;;;:::i;:::-;;;;;;;;:46;;;;26294:4;26236:55;26265:4;:22;;26288:1;26265:25;;;;;;;;:::i;:::-;;;;;;;;;;;26236:11;;:24;;26252:7;26236:15;:24::i;:::-;:28;;:55::i;:::-;:62;;;;:::i;:::-;26215:4;:15;;26231:1;26215:18;;;;;;;;:::i;:::-;;;;;;;;;;:83;-1:-1:-1;25994:3:0;;;;:::i;:::-;;;;25939:371;;;-1:-1:-1;26340:17:0;;26320:59;;-1:-1:-1;;;;;26340:17:0;26359:10;26371:7;26320:19;:59::i;:::-;26404:11;;:24;;26420:7;26404:15;:24::i;:::-;26390:38;;26453:11;;;;:24;;26469:7;26453:15;:24::i;:::-;26439:11;;;:38;26493:33;;13858:25:1;;;26512:4:0;;26500:10;;26493:33;;13846:2:1;13831:18;26493:33:0;13712:177:1;22119:481:0;22213:15;22247:20;22270:8;22279:4;22270:14;;;;;;;;:::i;:::-;;;;;;;;;;22247:37;;;;;;;;22270:14;;;;;;;22247:37;;-1:-1:-1;;;;;22247:37:0;;;;;;;;;;;;;;;;;;;;;;;;;22270:14;;22247:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22247:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22315:4;:15;;;22299:12;:31;22295:45;;-1:-1:-1;22339:1:0;;22119:481;-1:-1:-1;;22119:481:0:o;22295:45::-;22351:24;22378:33;22395:4;:15;;;22378:12;:16;;:33;;;;:::i;:::-;22351:60;;22432:50;22480:1;22452:4;:22;;;22433:16;:41;;;;:::i;:::-;22432:47;;:50::i;:::-;22422:60;;22516:4;:22;;;22497:16;:41;;;;:::i;:::-;22493:100;;22570:11;22580:1;22570:7;:11;:::i;:::-;22560:21;;22493:100;22236:364;;22119:481;;;:::o;7410:151::-;7468:9;7498:6;;;:30;;-1:-1:-1;7527:1:0;7522;7513:5;7522:1;7527;7513:5;:::i;:::-;7509:9;-1:-1:-1;7508:15:0;;7509:9;7508:15;:::i;:::-;:20;7498:30;7490:63;;;;-1:-1:-1;;;7490:63:0;;9629:2:1;7490:63:0;;;9611:21:1;9668:2;9648:18;;;9641:30;-1:-1:-1;;;9687:18:1;;;9680:50;9747:18;;7490:63:0;9427:344:1;7490:63:0;7410:151;;;;:::o;9664:473::-;9910:45;;;-1:-1:-1;;;;;6076:32:1;;;9910:45:0;;;6058:51:1;6125:18;;;;6118:34;;;9910:45:0;;;;;;;;;;6031:18:1;;;;9910:45:0;;;;;;;-1:-1:-1;;;;;9910:45:0;-1:-1:-1;;;9910:45:0;;;9885:81;;-1:-1:-1;;;;9885:10:0;;;;:81;;9910:45;9885:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9849:117;;;;9999:7;:57;;;;-1:-1:-1;10011:11:0;;:16;;:44;;;10042:4;10031:24;;;;;;;;;;;;:::i;:::-;9977:152;;;;-1:-1:-1;;;9977:152:0;;12128:2:1;9977:152:0;;;12110:21:1;12167:2;12147:18;;;12140:30;12206:34;12186:18;;;12179:62;-1:-1:-1;;;12257:18:1;;;12250:43;12310:19;;9977:152:0;11926:409:1;7119:137:0;7177:9;7222:1;7212:5;7216:1;7222;7212:5;:::i;:::-;7208:9;;;7207:16;;7199:49;;;;-1:-1:-1;;;7199:49:0;;9978:2:1;7199:49:0;;;9960:21:1;10017:2;9997:18;;;9990:30;-1:-1:-1;;;10036:18:1;;;10029:50;10096:18;;7199:49:0;9776:344:1;9134:522:0;9419:51;;;-1:-1:-1;;;;;5762:15:1;;;9419:51:0;;;5744:34:1;5814:15;;;5794:18;;;5787:43;5846:18;;;;5839:34;;;9419:51:0;;;;;;;;;;5679:18:1;;;;9419:51:0;;;;;;;-1:-1:-1;;;;;9419:51:0;-1:-1:-1;;;9419:51:0;;;9394:87;;-1:-1:-1;;;;9394:10:0;;;;:87;;9419:51;9394:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9358:123;;;;9514:7;:57;;;;-1:-1:-1;9526:11:0;;:16;;:44;;;9557:4;9546:24;;;;;;;;;;;;:::i;:::-;9492:156;;;;-1:-1:-1;;;9492:156:0;;10327:2:1;9492:156:0;;;10309:21:1;10366:2;10346:18;;;10339:30;10405:34;10385:18;;;10378:62;-1:-1:-1;;;10456:18:1;;;10449:47;10513:19;;9492:156:0;10125:413:1;9492:156:0;9268:388;;9134:522;;;;:::o;7264:138::-;7322:9;7367:1;7357:5;7361:1;7367;7357:5;:::i;:::-;7353:9;;;7352:16;;7344:50;;;;-1:-1:-1;;;7344:50:0;;9279:2:1;7344:50:0;;;9261:21:1;9318:2;9298:18;;;9291:30;-1:-1:-1;;;9337:18:1;;;9330:51;9398:18;;7344:50:0;9077:345:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:673::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;403:60;419:43;459:2;419:43;:::i;:::-;403:60;:::i;:::-;485:3;509:2;504:3;497:15;537:2;532:3;528:12;521:19;;572:2;564:6;560:15;624:3;619:2;613;610:1;606:10;598:6;594:23;590:32;587:41;584:61;;;641:1;638;631:12;584:61;663:1;673:163;687:2;684:1;681:9;673:163;;;744:17;;732:30;;782:12;;;;814;;;;705:1;698:9;673:163;;;-1:-1:-1;854:5:1;;192:673;-1:-1:-1;;;;;;;192:673:1:o;870:186::-;929:6;982:2;970:9;961:7;957:23;953:32;950:52;;;998:1;995;988:12;950:52;1021:29;1040:9;1021:29;:::i;:::-;1011:39;870:186;-1:-1:-1;;;870:186:1:o;1061:1367::-;1206:6;1214;1222;1230;1238;1291:3;1279:9;1270:7;1266:23;1262:33;1259:53;;;1308:1;1305;1298:12;1259:53;1331:29;1350:9;1331:29;:::i;:::-;1321:39;;1379:2;1432;1421:9;1417:18;1404:32;1455:18;1496:2;1488:6;1485:14;1482:34;;;1512:1;1509;1502:12;1482:34;1550:6;1539:9;1535:22;1525:32;;1595:7;1588:4;1584:2;1580:13;1576:27;1566:55;;1617:1;1614;1607:12;1566:55;1653:2;1640:16;1676:60;1692:43;1732:2;1692:43;:::i;1676:60::-;1758:3;1782:2;1777:3;1770:15;1810:2;1805:3;1801:12;1794:19;;1841:2;1837;1833:11;1889:7;1884:2;1878;1875:1;1871:10;1867:2;1863:19;1859:28;1856:41;1853:61;;;1910:1;1907;1900:12;1853:61;1932:1;1923:10;;1942:169;1956:2;1953:1;1950:9;1942:169;;;2013:23;2032:3;2013:23;:::i;:::-;2001:36;;1974:1;1967:9;;;;;2057:12;;;;2089;;1942:169;;;-1:-1:-1;2130:5:1;-1:-1:-1;;;2188:2:1;2173:18;;2160:32;;-1:-1:-1;2204:16:1;;;2201:36;;;2233:1;2230;2223:12;2201:36;;;2256:63;2311:7;2300:8;2289:9;2285:24;2256:63;:::i;:::-;1061:1367;;;;-1:-1:-1;2246:73:1;;2366:2;2351:18;;2338:32;;-1:-1:-1;2417:3:1;2402:19;2389:33;;1061:1367;-1:-1:-1;;;1061:1367:1:o;2433:245::-;2500:6;2553:2;2541:9;2532:7;2528:23;2524:32;2521:52;;;2569:1;2566;2559:12;2521:52;2601:9;2595:16;2620:28;2642:5;2620:28;:::i;2683:180::-;2742:6;2795:2;2783:9;2774:7;2770:23;2766:32;2763:52;;;2811:1;2808;2801:12;2763:52;-1:-1:-1;2834:23:1;;2683:180;-1:-1:-1;2683:180:1:o;2868:254::-;2936:6;2944;2997:2;2985:9;2976:7;2972:23;2968:32;2965:52;;;3013:1;3010;3003:12;2965:52;3049:9;3036:23;3026:33;;3078:38;3112:2;3101:9;3097:18;3078:38;:::i;:::-;3068:48;;2868:254;;;;;:::o;3127:322::-;3204:6;3212;3220;3273:2;3261:9;3252:7;3248:23;3244:32;3241:52;;;3289:1;3286;3279:12;3241:52;3325:9;3312:23;3302:33;;3354:38;3388:2;3377:9;3373:18;3354:38;:::i;:::-;3344:48;;3439:2;3428:9;3424:18;3411:32;3401:42;;3127:322;;;;;:::o;3454:416::-;3547:6;3555;3608:2;3596:9;3587:7;3583:23;3579:32;3576:52;;;3624:1;3621;3614:12;3576:52;3660:9;3647:23;3637:33;;3721:2;3710:9;3706:18;3693:32;3748:18;3740:6;3737:30;3734:50;;;3780:1;3777;3770:12;3734:50;3803:61;3856:7;3847:6;3836:9;3832:22;3803:61;:::i;:::-;3793:71;;;3454:416;;;;;:::o;3875:545::-;3974:6;3982;3990;4043:2;4031:9;4022:7;4018:23;4014:32;4011:52;;;4059:1;4056;4049:12;4011:52;4095:9;4082:23;4072:33;;4156:2;4145:9;4141:18;4128:32;4183:18;4175:6;4172:30;4169:50;;;4215:1;4212;4205:12;4169:50;4238:61;4291:7;4282:6;4271:9;4267:22;4238:61;:::i;:::-;4228:71;;;4349:2;4338:9;4334:18;4321:32;4362:28;4384:5;4362:28;:::i;:::-;4409:5;4399:15;;;3875:545;;;;;:::o;4425:435::-;4478:3;4516:5;4510:12;4543:6;4538:3;4531:19;4569:4;4598:2;4593:3;4589:12;4582:19;;4635:2;4628:5;4624:14;4656:1;4666:169;4680:6;4677:1;4674:13;4666:169;;;4741:13;;4729:26;;4775:12;;;;4810:15;;;;4702:1;4695:9;4666:169;;;-1:-1:-1;4851:3:1;;4425:435;-1:-1:-1;;;;;4425:435:1:o;4865:426::-;4994:3;5032:6;5026:13;5057:1;5067:129;5081:6;5078:1;5075:13;5067:129;;;5179:4;5163:14;;;5159:25;;5153:32;5140:11;;;5133:53;5096:12;5067:129;;;5214:6;5211:1;5208:13;5205:48;;;5249:1;5240:6;5235:3;5231:16;5224:27;5205:48;-1:-1:-1;5269:16:1;;;;;4865:426;-1:-1:-1;;4865:426:1:o;6163:1446::-;-1:-1:-1;;;;;6739:15:1;;;6721:34;;6774:2;6792:18;;;6785:34;;;6630:3;6850:2;6835:18;;6828:30;;;6907:13;;6656:18;;;6929:22;;;6601:4;;6982:3;6967:19;;;7009:15;;;;6601:4;7052:178;7066:6;7063:1;7060:13;7052:178;;;7131:13;;7127:22;;7115:35;;7170:12;;;;7205:15;;;;7088:1;7081:9;7052:178;;;7056:3;;;;;7275:9;7270:3;7266:19;7261:2;7250:9;7246:18;7239:47;7309:41;7346:3;7338:6;7309:41;:::i;:::-;7295:55;;7399:9;7391:6;7387:22;7381:3;7370:9;7366:19;7359:51;7427:44;7464:6;7456;7427:44;:::i;:::-;7502:3;7487:19;;7480:35;;;;-1:-1:-1;;7546:3:1;7531:19;;7524:35;;;;7590:3;7575:19;;;7568:35;7419:52;6163:1446;-1:-1:-1;;;;;6163:1446:1:o;7614:855::-;7831:4;7879:2;7868:9;7864:18;7909:2;7898:9;7891:21;7932:6;7967;7961:13;7998:6;7990;7983:22;8036:2;8025:9;8021:18;8014:25;;8058:6;8055:1;8048:17;8084:4;8074:14;;8124:2;8121:1;8111:16;8145:1;8155:194;8169:6;8166:1;8163:13;8155:194;;;8234:13;;-1:-1:-1;;;;;8230:39:1;8218:52;;8290:12;;;;8266:1;8325:14;;;;8184:9;8155:194;;;8159:3;;;8394:9;8389:3;8385:19;8380:2;8369:9;8365:18;8358:47;8422:41;8459:3;8451:6;8422:41;:::i;:::-;8414:49;7614:855;-1:-1:-1;;;;;;7614:855:1:o;8474:261::-;8653:2;8642:9;8635:21;8616:4;8673:56;8725:2;8714:9;8710:18;8702:6;8673:56;:::i;8740:332::-;8947:2;8936:9;8929:21;8910:4;8967:56;9019:2;9008:9;9004:18;8996:6;8967:56;:::i;:::-;8959:64;;9059:6;9054:2;9043:9;9039:18;9032:34;8740:332;;;;;:::o;12684:::-;12886:2;12868:21;;;12925:1;12905:18;;;12898:29;-1:-1:-1;;;12958:2:1;12943:18;;12936:39;13007:2;12992:18;;12684:332::o;13894:609::-;14207:6;14196:9;14189:25;14250:3;14245:2;14234:9;14230:18;14223:31;14170:4;14277:57;14329:3;14318:9;14314:19;14306:6;14277:57;:::i;:::-;14382:9;14374:6;14370:22;14365:2;14354:9;14350:18;14343:50;14410:44;14447:6;14439;14410:44;:::i;:::-;14402:52;;;14490:6;14485:2;14474:9;14470:18;14463:34;13894:609;;;;;;;:::o;14508:275::-;14579:2;14573:9;14644:2;14625:13;;-1:-1:-1;;14621:27:1;14609:40;;14679:18;14664:34;;14700:22;;;14661:62;14658:88;;;14726:18;;:::i;:::-;14762:2;14755:22;14508:275;;-1:-1:-1;14508:275:1:o;14788:183::-;14848:4;14881:18;14873:6;14870:30;14867:56;;;14903:18;;:::i;:::-;-1:-1:-1;14948:1:1;14944:14;14960:4;14940:25;;14788:183::o;14976:128::-;15016:3;15047:1;15043:6;15040:1;15037:13;15034:39;;;15053:18;;:::i;:::-;-1:-1:-1;15089:9:1;;14976:128::o;15109:120::-;15149:1;15175;15165:35;;15180:18;;:::i;:::-;-1:-1:-1;15214:9:1;;15109:120::o;15234:168::-;15274:7;15340:1;15336;15332:6;15328:14;15325:1;15322:21;15317:1;15310:9;15303:17;15299:45;15296:71;;;15347:18;;:::i;:::-;-1:-1:-1;15387:9:1;;15234:168::o;15407:125::-;15447:4;15475:1;15472;15469:8;15466:34;;;15480:18;;:::i;:::-;-1:-1:-1;15517:9:1;;15407:125::o;15537:135::-;15576:3;-1:-1:-1;;15597:17:1;;15594:43;;;15617:18;;:::i;:::-;-1:-1:-1;15664:1:1;15653:13;;15537:135::o;15677:112::-;15709:1;15735;15725:35;;15740:18;;:::i;:::-;-1:-1:-1;15774:9:1;;15677:112::o;15794:127::-;15855:10;15850:3;15846:20;15843:1;15836:31;15886:4;15883:1;15876:15;15910:4;15907:1;15900:15;15926:127;15987:10;15982:3;15978:20;15975:1;15968:31;16018:4;16015:1;16008:15;16042:4;16039:1;16032:15;16058:127;16119:10;16114:3;16110:20;16107:1;16100:31;16150:4;16147:1;16140:15;16174:4;16171:1;16164:15;16190:127;16251:10;16246:3;16242:20;16239:1;16232:31;16282:4;16279:1;16272:15;16306:4;16303:1;16296:15;16322:118;16408:5;16401:13;16394:21;16387:5;16384:32;16374:60;;16430:1;16427;16420:12;16374:60;16322:118;:::o
Swarm Source
ipfs://ca28770dcffaadee76633b02610b4229fe312af8e96aed21881a303bb252b0c9
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.