More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,749 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 19744250 | 341 days ago | IN | 0 ETH | 0.00047621 | ||||
Withdraw | 19744238 | 341 days ago | IN | 0 ETH | 0.00082689 | ||||
Migrate User | 19620942 | 358 days ago | IN | 0 ETH | 0.00058462 | ||||
Migrate User | 19620939 | 358 days ago | IN | 0 ETH | 0.00225195 | ||||
Withdraw | 19539274 | 370 days ago | IN | 0 ETH | 0.00319553 | ||||
Withdraw | 19535312 | 370 days ago | IN | 0 ETH | 0.00318328 | ||||
Withdraw | 19446630 | 383 days ago | IN | 0 ETH | 0.00247374 | ||||
Claim | 19446618 | 383 days ago | IN | 0 ETH | 0.00493313 | ||||
Withdraw | 19398926 | 389 days ago | IN | 0 ETH | 0.01236573 | ||||
Migrate User | 19370567 | 393 days ago | IN | 0 ETH | 0.01082651 | ||||
Migrate User | 19342258 | 397 days ago | IN | 0 ETH | 0.00634679 | ||||
Claim | 19269010 | 408 days ago | IN | 0 ETH | 0.00600205 | ||||
Withdraw | 19269005 | 408 days ago | IN | 0 ETH | 0.00669711 | ||||
Migrate User | 19269001 | 408 days ago | IN | 0 ETH | 0.00424395 | ||||
Migrate User | 19244056 | 411 days ago | IN | 0 ETH | 0.00239273 | ||||
Claim | 19225022 | 414 days ago | IN | 0 ETH | 0.00284005 | ||||
Withdraw | 19225010 | 414 days ago | IN | 0 ETH | 0.00162616 | ||||
Emergency Withdr... | 19197867 | 418 days ago | IN | 0 ETH | 0.007887 | ||||
Claim | 19107602 | 430 days ago | IN | 0 ETH | 0.00134527 | ||||
Withdraw | 19086976 | 433 days ago | IN | 0 ETH | 0.00147819 | ||||
Withdraw | 19047794 | 439 days ago | IN | 0 ETH | 0.00114469 | ||||
Withdraw | 19029067 | 441 days ago | IN | 0 ETH | 0.00310589 | ||||
Claim | 19029064 | 441 days ago | IN | 0 ETH | 0.00552644 | ||||
Claim | 18965084 | 450 days ago | IN | 0 ETH | 0.00334882 | ||||
Claim | 18960111 | 451 days ago | IN | 0 ETH | 0.00466536 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LPTokenStaker
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.4; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; interface IVestable { function vest( bool vest, address _receiver, uint256 _amount ) external; } interface IPWRD { function factor() external view returns (uint256); function BASE() external view returns (uint256); } interface StakerStructs { /// @notice Info of each user. /// `amount` LP token amount the user has provided. /// `rewardDebt` The amount of GRO entitled to the user. struct UserInfo { uint256 amount; int256 rewardDebt; } /// @notice Info of each pool. /// `allocPoint` The amount of allocation points assigned to the pool. /// which will determine the share of GRO token rewards the pool will get struct PoolInfo { uint256 accGroPerShare; uint256 allocPoint; uint256 lastRewardBlock; IERC20 lpToken; } } interface IStaker is StakerStructs { function poolInfo(uint256 pid) external view returns (PoolInfo memory); function userInfo(uint256 pid, address account) external view returns (UserInfo memory); function migrateFrom(uint256[] calldata pids) external; } interface IStakerV1 is StakerStructs { function vesting() external view returns (address); function maxGroPerBlock() external view returns (uint256); function groPerBlock() external view returns (uint256); function totalAllocPoint() external view returns (uint256); function manager() external view returns (address); function poolLength() external view returns (uint256); function poolInfo(uint256 pid) external view returns (PoolInfo memory); function userInfo(uint256 pid, address account) external view returns (UserInfo memory); } contract LPTokenStaker is Ownable, StakerStructs { using SafeERC20 for IERC20; IVestable public vesting; /// @notice Info of each pool. PoolInfo[] public poolInfo; /// @notice Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; /// @dev Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; uint256 public maxGroPerBlock; uint256 public groPerBlock; address public manager; // here for testing purpose, should be constant address public constant PWRD = address(0xF0a93d4994B3d98Fb5e3A2F90dBc2d69073Cb86b); // the pid of pwrd uint256 public pPid = 999; mapping(address => bool) public activeLpTokens; uint256 private constant ACC_GRO_PRECISION = 1e12; // !Important!Time lock contract address public immutable TIME_LOCK; bool public paused = true; bool public initialized = false; event LogAddPool(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken); event LogSetPool(uint256 indexed pid, uint256 allocPoint); event LogUpdatePool(uint256 indexed pid, uint256 lastRewardBlock, uint256 lpSupply, uint256 accGroPerShare); event LogDeposit(address indexed user, uint256 indexed pid, uint256 amount); event LogWithdraw(address indexed user, uint256 indexed pid, uint256 amount); event LogMultiWithdraw(address indexed user, uint256[] pids, uint256[] amounts); event LogMultiClaim(address indexed user, bool vest, uint256[] pids, uint256 amount); event LogClaim(address indexed user, bool vest, uint256 indexed pid, uint256 amount); event LogLpTokenAdded(address token); event LogEmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); event LogNewManagment(address newManager); event LogMaxGroPerBlock(uint256 newMax); event LogGroPerBlock(uint256 newGro); event LogNewVester(address newVester); event LogSetTimelock(address timelock); event LogSetStatus(bool pause); event LogNewPwrdPid(uint256 pPid); modifier onlyTimelock() { require(msg.sender == TIME_LOCK, "msg.sender != timelock"); _; } constructor(address _timelock) { // Setting timelock to 0x prevents migrations TIME_LOCK = _timelock; emit LogSetTimelock(_timelock); } function setVesting(address _vesting) external onlyOwner { vesting = IVestable(_vesting); emit LogNewVester(_vesting); } function setManager(address _manager) external onlyOwner { manager = _manager; emit LogNewManagment(_manager); } /// @notice Set the pid of the pwrd token /// @param _pPid pid of pwrd function setPwrdPid(uint256 _pPid) external { pPid = _pPid; require(msg.sender == manager, "setPwrdPid: !manager"); emit LogNewPwrdPid(_pPid); } function setMaxGroPerBlock(uint256 _maxGroPerBlock) external onlyOwner { maxGroPerBlock = _maxGroPerBlock; emit LogMaxGroPerBlock(_maxGroPerBlock); } function setGroPerBlock(uint256 _groPerBlock) external { require(msg.sender == manager, "setGroPerBlock: !manager"); require(_groPerBlock <= maxGroPerBlock, "setGroPerBlock: > maxGroPerBlock"); groPerBlock = _groPerBlock; emit LogGroPerBlock(_groPerBlock); } function setStatus(bool pause) external onlyTimelock { paused = pause; emit LogSetStatus(pause); } function initialize() external onlyOwner { require(initialized == false, 'initialized: Contract already initialized'); paused = false; initialized = true; emit LogSetStatus(false); } /// @notice only for testing, remove before deployment // function setPwrd(address _pwrd) external onlyOwner { // PWRD = _pwrd; // } /// @notice Returns the number of pools. function poolLength() public view returns (uint256 pools) { pools = poolInfo.length; } /// @notice Add a new LP to the pool. Can only be called by the manager. /// DO NOT add the same LP token more than once. Rewards will be messed up if you do. /// @param allocPoint AP of the new pool. /// @param _lpToken Address of the LP ERC-20 token. function add(uint256 allocPoint, IERC20 _lpToken) external { require(msg.sender == manager, "add: !manager"); totalAllocPoint += allocPoint; require(!activeLpTokens[address(_lpToken)], "add: lpToken already added"); poolInfo.push( PoolInfo({allocPoint: allocPoint, lastRewardBlock: block.number, accGroPerShare: 0, lpToken: _lpToken}) ); activeLpTokens[address(_lpToken)] = true; emit LogLpTokenAdded(address(_lpToken)); emit LogAddPool(poolInfo.length - 1, allocPoint, _lpToken); } /// @notice Update the given pool's allocation point. Can only be called by the manager. /// @param _pid The index of the pool. See `poolInfo`. /// @param _allocPoint New AP of the pool. function set(uint256 _pid, uint256 _allocPoint) external { require(msg.sender == manager, "set: !manager"); totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint; poolInfo[_pid].allocPoint = _allocPoint; emit LogSetPool(_pid, _allocPoint); } /// @notice Update reward variables for all pools. Be careful of gas spending! /// @param pids Pool IDs of all to be updated. Make sure to update all active pools. function massUpdatePools(uint256[] calldata pids) external { uint256 len = pids.length; for (uint256 i = 0; i < len; ++i) { updatePool(pids[i]); } } /// @notice Update reward variables of the given pool. /// @param pid The index of the pool. See `poolInfo`. /// @return pool Returns the pool that was updated. function updatePool(uint256 pid) public returns (PoolInfo memory pool) { uint256 _totalAllocPoint = totalAllocPoint; require(_totalAllocPoint > 0, "updatePool: totalAllocPoint == 0"); pool = poolInfo[pid]; if (block.number > pool.lastRewardBlock) { uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (address(poolInfo[pid].lpToken) == PWRD) { lpSupply = _prepPwrdBased(lpSupply); } if (lpSupply > 0) { uint256 blocks = block.number - pool.lastRewardBlock; uint256 groReward = (blocks * groPerBlock * pool.allocPoint) / _totalAllocPoint; pool.accGroPerShare = pool.accGroPerShare + (groReward * ACC_GRO_PRECISION) / lpSupply; } pool.lastRewardBlock = block.number; poolInfo[pid] = pool; emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accGroPerShare); } } /// @notice View function to see claimable GRO on frontend. /// @param _pid The index of the pool. See `poolInfo`. /// @param _user Address of user. /// @return claimable GRO reward for a given user. function claimable(uint256 _pid, address _user) external view returns (uint256) { uint256 _totalAllocPoint = totalAllocPoint; if (_totalAllocPoint == 0) return 0; PoolInfo memory pool = poolInfo[_pid]; UserInfo memory user = userInfo[_pid][_user]; uint256 accPerShare = pool.accGroPerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (address(poolInfo[_pid].lpToken) == PWRD) { lpSupply = _prepPwrdBased(lpSupply); } if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 blocks = block.number - pool.lastRewardBlock; uint256 groReward = (blocks * groPerBlock * pool.allocPoint) / _totalAllocPoint; accPerShare = accPerShare + (groReward * ACC_GRO_PRECISION) / lpSupply; } return uint256(int256((user.amount * accPerShare) / ACC_GRO_PRECISION) - user.rewardDebt); } /// @notice calculates the rebased amount of pwrd tokens the user has based /// on their stored base position /// @param user address of user function getUserPwrd(address user) public view returns (uint256) { uint256 baseAmount = userInfo[pPid][user].amount; if (baseAmount == 0) { return 0; } else { return _prepPwrdRebased(baseAmount); } } /// @notice reverts pwrd amount to its base amount - the benefit of doing so is that /// when user ends up withdrawing assets from the lpTokenStaker they will not have /// lost any of their APY, as the current factor will be applied to the base amount /// the user deposited /// @param amount amount of pwrd tokens function _prepPwrdBased(uint256 amount) internal view returns (uint256) { IPWRD pwrd = IPWRD(PWRD); uint256 factor = pwrd.factor(); uint256 BASE = pwrd.BASE(); uint256 diff = (amount * factor) % BASE; uint256 result = (amount * factor) / BASE; if (diff >= 5E17) { result = result + 1; } return result; } /// @notice reverts pwrd base amount to its rebase amount /// @param amount base amount of pwrd tokens function _prepPwrdRebased(uint256 amount) internal view returns (uint256) { IPWRD pwrd = IPWRD(PWRD); uint256 factor = pwrd.factor(); uint256 BASE = pwrd.BASE(); uint256 diff = (amount * BASE) % factor; uint256 result = (amount * BASE) / factor; if (diff >= 5E17) { result = result + 1; } return result; } /// @notice handle potential dust acrual or rounding errors when withdrawing pwrd from staking contract /// @param withdrawAmount rebased amount user wants to withdraw /// @param userAmount base amount of pwrd the user holds function _checkPwrd(uint256 withdrawAmount, uint256 userAmount) internal view returns (uint256, uint256) { uint256 baseAmount = _prepPwrdBased(withdrawAmount); if (baseAmount - 1 == userAmount || baseAmount == userAmount) return (withdrawAmount, userAmount); else if (baseAmount > userAmount) return (_prepPwrdBased(userAmount), userAmount); else if ((baseAmount * 1E4) / userAmount >= 9995) return (_prepPwrdBased(userAmount), userAmount); else return (withdrawAmount, baseAmount); } /// @notice Deposit LP tokens for GRO reward. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to deposit. function deposit(uint256 pid, uint256 amount) public { require(!paused, "deposit: paused"); PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; // if token is pwrd, cast it to base amount uint256 uAmount = amount; if (address(poolInfo[pid].lpToken) == PWRD) { uAmount = _prepPwrdBased(amount); } user.amount = user.amount + uAmount; user.rewardDebt = user.rewardDebt + int256((uAmount * pool.accGroPerShare) / ACC_GRO_PRECISION); pool.lpToken.safeTransferFrom(msg.sender, address(this), amount); emit LogDeposit(msg.sender, pid, uAmount); } /// @notice Withdraw LP tokens. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to withdraw. function withdraw(uint256 pid, uint256 amount) public { require(!paused, "withdraw: paused"); PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; // if token is pwrd, cast it to base amount to calculate the amount the user wants to remove uint256 uAmount = amount; uint256 userAmount = user.amount; if (address(poolInfo[pid].lpToken) == PWRD) { (amount, uAmount) = _checkPwrd(amount, userAmount); } user.amount = userAmount - uAmount; user.rewardDebt = user.rewardDebt - int256((uAmount * pool.accGroPerShare) / ACC_GRO_PRECISION); pool.lpToken.safeTransfer(msg.sender, amount); emit LogWithdraw(msg.sender, pid, uAmount); } function multiWithdraw(uint256[] calldata pids, uint256[] calldata amounts) public { require(!paused, "multiWithdraw: paused"); uint256[] memory uAmounts = new uint256[](amounts.length); for (uint256 i = 0; i < pids.length; i++) { uint256 pid = pids[i]; uint256 amount = amounts[i]; PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; uint256 uAmount = amount; uint256 userAmount = user.amount; if (address(poolInfo[pid].lpToken) == PWRD) { (amount, uAmount) = _checkPwrd(amount, userAmount); } uAmounts[i] = uAmount; user.amount = userAmount - amount; user.rewardDebt = user.rewardDebt - int256((uAmount * pool.accGroPerShare) / ACC_GRO_PRECISION); pool.lpToken.safeTransfer(msg.sender, amount); } emit LogMultiWithdraw(msg.sender, pids, uAmounts); } /// @notice Claim proceeds for transaction sender. Can claim x% of the rewards imediatly, forfeiting /// the remainder to the bonus contract, or add 100% as a vesting position /// @param vest Add to vesting position (true) or claim immeidatly (false) /// @param pid The index of the pool. See `poolInfo`. function claim(bool vest, uint256 pid) public { require(!paused, "claim: paused"); PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; int256 accumulatedGro = int256((user.amount * pool.accGroPerShare) / ACC_GRO_PRECISION); uint256 pending = accumulatedGro >= user.rewardDebt ? uint256(accumulatedGro - user.rewardDebt) : 0; // Effects user.rewardDebt = accumulatedGro; // Interactions if (pending > 0) { vesting.vest(vest, msg.sender, pending); } emit LogClaim(msg.sender, vest, pid, pending); } function multiClaim(bool vest, uint256[] calldata pids) external { require(!paused, "multiClaim: paused"); uint256 pending; for (uint256 i = 0; i < pids.length; i++) { PoolInfo memory pool = updatePool(pids[i]); UserInfo storage user = userInfo[pids[i]][msg.sender]; int256 accumulatedGro = int256((user.amount * pool.accGroPerShare) / ACC_GRO_PRECISION); pending += accumulatedGro >= user.rewardDebt ? uint256(accumulatedGro - user.rewardDebt) : 0; user.rewardDebt = accumulatedGro; } if (pending > 0) { vesting.vest(vest, msg.sender, pending); } emit LogMultiClaim(msg.sender, vest, pids, pending); } /// @notice Withdraw LP tokens and claim proceeds for transaction sender. /// @param vest Add to vesting position (true) or claim immeidatly (false) /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to withdraw. function withdrawAndClaim( bool vest, uint256 pid, uint256 amount ) public { require(!paused, "withdrawAndClaim: paused"); PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; uint256 ua = user.amount; int256 accumulatedGro = int256((ua * pool.accGroPerShare) / ACC_GRO_PRECISION); uint256 pending = accumulatedGro >= user.rewardDebt ? uint256(accumulatedGro - user.rewardDebt) : 0; uint256 uAmount = amount; if (address(poolInfo[pid].lpToken) == PWRD) { (amount, uAmount) = _checkPwrd(amount, ua); } user.amount = ua - uAmount; user.rewardDebt = accumulatedGro - int256((uAmount * pool.accGroPerShare) / ACC_GRO_PRECISION); // Interactions if (pending > 0) { vesting.vest(vest, msg.sender, pending); } pool.lpToken.safeTransfer(msg.sender, amount); emit LogWithdraw(msg.sender, pid, uAmount); emit LogClaim(msg.sender, vest, pid, pending); } function multiWithdrawAndClaim( bool vest, uint256[] calldata pids, uint256[] calldata amounts ) public { require(!paused, "multiWithdrawAndClaim: paused"); uint256[] memory uAmounts = new uint256[](amounts.length); uint256 pending; for (uint256 i = 0; i < pids.length; i++) { uint256 pid = pids[i]; uint256 amount = amounts[i]; PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; uint256 ua = user.amount; int256 accumulatedGro = int256((ua * pool.accGroPerShare) / ACC_GRO_PRECISION); pending += accumulatedGro >= user.rewardDebt ? uint256(accumulatedGro - user.rewardDebt) : 0; uint256 uAmount = amount; if (address(poolInfo[pid].lpToken) == PWRD) { (amount, uAmount) = _checkPwrd(amount, ua); } uAmounts[i] = uAmount; user.amount = ua - uAmount; user.rewardDebt = accumulatedGro - int256((uAmount * pool.accGroPerShare) / ACC_GRO_PRECISION); pool.lpToken.safeTransfer(msg.sender, amount); } if (pending > 0) { vesting.vest(vest, msg.sender, pending); } emit LogMultiWithdraw(msg.sender, pids, uAmounts); emit LogMultiClaim(msg.sender, vest, pids, pending); } /// @notice Withdraw without caring about rewards. EMERGENCY ONLY. /// @param pid The index of the pool. See `poolInfo`. function emergencyWithdraw(uint256 pid) public { require(!paused, "emergencyWithdraw: paused"); PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; uint256 amount = user.amount; if (address(poolInfo[pid].lpToken) == PWRD) { IPWRD pwrd = IPWRD(PWRD); uint256 factor = pwrd.factor(); uint256 BASE = pwrd.BASE(); amount = (amount * BASE) / factor; } user.amount = 0; user.rewardDebt = 0; pool.lpToken.safeTransfer(msg.sender, amount); emit LogEmergencyWithdraw(msg.sender, pid, amount); } address public oldStaker; address public newStaker; mapping(address => mapping(uint256 => bool)) public userMigrated; event LogNewStaker(address staker); event LogOldStaker(address staker); event LogMigrate(uint256[] pids); event LogMigrateFrom(uint256[] pids); event LogMigrateUser(address indexed account, uint256[] pids); function setNewStaker(address staker) public onlyOwner { newStaker = staker; emit LogNewStaker(staker); } function setOldStaker(address staker) public onlyOwner { oldStaker = staker; emit LogOldStaker(staker); } function migrate(uint256[] calldata pids) external onlyTimelock { require(newStaker != address(0), "migrate: !newStaker"); for (uint256 i = 0; i < pids.length; i++) { PoolInfo memory pi = poolInfo[pids[i]]; uint256 amount = pi.lpToken.balanceOf(address(this)); pi.lpToken.approve(newStaker, amount); } IStaker(newStaker).migrateFrom(pids); emit LogMigrate(pids); } function migrateFrom(uint256[] calldata pids) external { require(msg.sender == oldStaker, "migrateFrom: !oldStaker"); uint256 _totalAllocPoint; IStaker staker = IStaker(oldStaker); for (uint256 i = 0; i < pids.length; i++) { PoolInfo memory pi = staker.poolInfo(pids[i]); require(!activeLpTokens[address(pi.lpToken)], "migrateFrom: lpToken already added"); poolInfo.push( PoolInfo({ allocPoint: pi.allocPoint, lastRewardBlock: pi.lastRewardBlock, accGroPerShare: pi.accGroPerShare, lpToken: pi.lpToken }) ); _totalAllocPoint += pi.allocPoint; uint256 amount = pi.lpToken.balanceOf(oldStaker); pi.lpToken.safeTransferFrom(oldStaker, address(this), amount); activeLpTokens[address(pi.lpToken)] = true; } totalAllocPoint += _totalAllocPoint; emit LogMigrateFrom(pids); } function migrateUser(address account, uint256[] calldata pids) external { require(!paused, "migrateUser: paused"); require(oldStaker != address(0), "migrateUser: !oldStaker"); IStaker staker = IStaker(oldStaker); for (uint256 i = 0; i < pids.length; i++) { uint256 pid = pids[i]; require(!userMigrated[account][pid], "migrateUser: pid already done"); UserInfo memory oldUI = staker.userInfo(pid, account); if (oldUI.amount > 0) { UserInfo storage ui = userInfo[pid][account]; if (address(poolInfo[pid].lpToken) == PWRD) { ui.amount += _prepPwrdBased(oldUI.amount); } else { ui.amount += oldUI.amount; } ui.rewardDebt += oldUI.rewardDebt; userMigrated[account][pid] = true; } } emit LogMigrateUser(account, pids); } bool public migratedFromV1; event LogMigrateFromV1(address staker); event LogUserMigrateFromV1(address indexed account, address staker); function migrateFromV1() external onlyOwner { require(!migratedFromV1, "migrateFromV1: already done"); require(oldStaker != address(0), "migrateUser: !oldStaker"); IStakerV1 staker = IStakerV1(oldStaker); manager = staker.manager(); maxGroPerBlock = staker.maxGroPerBlock(); uint256 len = staker.poolLength(); for (uint256 i = 0; i < len; i++) { PoolInfo memory pi = staker.poolInfo(i); poolInfo.push( PoolInfo({ allocPoint: 0, lastRewardBlock: pi.lastRewardBlock, accGroPerShare: pi.accGroPerShare, lpToken: pi.lpToken }) ); activeLpTokens[address(pi.lpToken)] = true; } migratedFromV1 = true; emit LogMigrateFromV1(oldStaker); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/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. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual 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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ 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) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @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"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
{ "metadata": { "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_timelock","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"lpToken","type":"address"}],"name":"LogAddPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"vest","type":"bool"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogClaim","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":"LogDeposit","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":"LogEmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newGro","type":"uint256"}],"name":"LogGroPerBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"LogLpTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"LogMaxGroPerBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"LogMigrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"LogMigrateFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"}],"name":"LogMigrateFromV1","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"LogMigrateUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"vest","type":"bool"},{"indexed":false,"internalType":"uint256[]","name":"pids","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogMultiClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"pids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"LogMultiWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newManager","type":"address"}],"name":"LogNewManagment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pPid","type":"uint256"}],"name":"LogNewPwrdPid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"}],"name":"LogNewStaker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newVester","type":"address"}],"name":"LogNewVester","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"}],"name":"LogOldStaker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"LogSetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"pause","type":"bool"}],"name":"LogSetStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"timelock","type":"address"}],"name":"LogSetTimelock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accGroPerShare","type":"uint256"}],"name":"LogUpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"staker","type":"address"}],"name":"LogUserMigrateFromV1","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":"LogWithdraw","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"},{"inputs":[],"name":"PWRD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_LOCK","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"activeLpTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"vest","type":"bool"},{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserPwrd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"groPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxGroPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"migrateFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrateFromV1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"migrateUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migratedFromV1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"vest","type":"bool"},{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"multiClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"multiWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"vest","type":"bool"},{"internalType":"uint256[]","name":"pids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"multiWithdrawAndClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"newStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pPid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"accGroPerShare","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"contract IERC20","name":"lpToken","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"pools","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_groPerBlock","type":"uint256"}],"name":"setGroPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxGroPerBlock","type":"uint256"}],"name":"setMaxGroPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"setNewStaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"setOldStaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pPid","type":"uint256"}],"name":"setPwrdPid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pause","type":"bool"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vesting","type":"address"}],"name":"setVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accGroPerShare","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"contract IERC20","name":"lpToken","type":"address"}],"internalType":"struct StakerStructs.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"int256","name":"rewardDebt","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userMigrated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vesting","outputs":[{"internalType":"contract IVestable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"vest","type":"bool"},{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAndClaim","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526103e7600855600a805461ffff191660011790553480156200002557600080fd5b5060405162004560380380620045608339810160408190526200004891620000f8565b6200005333620000a8565b606081901b6001600160601b0319166080526040516001600160a01b03821681527fa83fb9c2533a644e464adbf06a290c720d13ac18a7dbb3048c7f630de9dd13199060200160405180910390a15062000128565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156200010a578081fd5b81516001600160a01b038116811462000121578182fd5b9392505050565b60805160601c61440b620001556000396000818161069001528181611a28015261311b015261440b6000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c8063715018a611610167578063aea62e3f116100ce578063d505a36411610087578063d505a36414610665578063d93bf4fe14610678578063e0a09c681461068b578063e2bbb158146106b2578063e6435ccc146106c5578063f2fde38b146106d857600080fd5b8063aea62e3f146105fd578063b563b27f14610610578063c1d3ef2414610623578063cab1364f14610636578063cd2a52141461063f578063d0ebdbe71461065257600080fd5b806384e796611161012057806384e79661146105525780638da5cb5b1461058057806393f1a40b14610591578063a0c7f71c146105d8578063a2133665146105eb578063a571ba0f146105f457600080fd5b8063715018a6146104f957806379b9c399146105015780637c59a910146105095780637ce381b91461051c5780637d687cf3146105355780638129fc1c1461054a57600080fd5b8063441a3e701161020b57806357a5b58c116101c457806357a5b58c1461047d5780635c40f6f4146104905780635c975abb146104a3578063677e2af0146104b05780636f6ff3bc146104d35780637120d521146104e657600080fd5b8063441a3e70146103b757806344c63eec146103ca578063481c6a75146103f557806350e84a2c1461040857806351eb05a61461041b5780635312ea8e1461046a57600080fd5b806317caf6f11161025d57806317caf6f1146103555780631ab06ee51461035e5780631e014fcc1461037157806321fb8da6146103845780632b8bbbe81461039757806340bace48146103aa57600080fd5b80630239b3c4146102a5578063081e3eda146102ba5780630d320682146102d1578063119d3dae146102e45780631526fe27146102f7578063158ef93e14610333575b600080fd5b6102b86102b3366004613cdf565b6106eb565b005b6002545b6040519081526020015b60405180910390f35b6102b86102df366004613f32565b61077d565b6102b86102f2366004614037565b6109f3565b61030a610305366004614037565b610a79565b604080519485526020850193909352918301526001600160a01b031660608201526080016102c8565b600a5461034590610100900460ff1681565b60405190151581526020016102c8565b6102be60045481565b6102b861036c366004614096565b610abc565b6102b861037f366004614037565b610bcc565b6102b8610392366004614037565b610c2b565b6102b86103a5366004614067565b610d0c565b600d546103459060ff1681565b6102b86103c5366004614096565b610f61565b6001546103dd906001600160a01b031681565b6040516001600160a01b0390911681526020016102c8565b6007546103dd906001600160a01b031681565b6102b8610416366004613e95565b6110cf565b61042e610429366004614037565b61145f565b6040516102c891908151815260208083015190820152604080830151908201526060918201516001600160a01b03169181019190915260800190565b6102b8610478366004614037565b61177e565b6102b861048b366004613d95565b6119cb565b6102b861049e366004613e3e565b611a1d565b600a546103459060ff1681565b6103456104be366004613cdf565b60096020526000908152604090205460ff1681565b6102b86104e1366004613cdf565b611acf565b6102b86104f4366004613e76565b611b47565b6102b8611d35565b6102b8611d6b565b600b546103dd906001600160a01b031681565b600a546103dd906201000090046001600160a01b031681565b6103dd6000805160206143b683398151915281565b6102b86121e4565b610345610560366004613d6a565b600c60209081526000928352604080842090915290825290205460ff1681565b6000546001600160a01b03166103dd565b6105c361059f366004614067565b60036020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016102c8565b6102be6105e6366004614067565b6122bd565b6102be60065481565b6102be60085481565b6102b861060b366004613dd5565b612509565b6102b861061e366004613cdf565b612784565b6102b8610631366004613d95565b6127fc565b6102be60055481565b6102b861064d366004613d17565b612bee565b6102b8610660366004613cdf565b612f36565b6102b8610673366004613f15565b612fae565b6102b8610686366004613d95565b613110565b6103dd7f000000000000000000000000000000000000000000000000000000000000000081565b6102b86106c0366004614096565b613416565b6102be6106d3366004613cdf565b61357f565b6102b86106e6366004613cdf565b6135c3565b6000546001600160a01b0316331461071e5760405162461bcd60e51b8152600401610715906141f4565b60405180910390fd5b600a805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040519081527f7a587e6bf52664adf21ed4ef40c5a2d236ced93bca80ae4af80f604cd07ef949906020015b60405180910390a150565b600a5460ff16156107d05760405162461bcd60e51b815260206004820152601860248201527f7769746864726177416e64436c61696d3a2070617573656400000000000000006044820152606401610715565b60006107db8361145f565b6000848152600360209081526040808320338452909152812080548351939450909290919064e8d4a51000906108119084614296565b61081b9190614282565b905060008360010154821215610832576000610841565b600184015461084190836142b5565b905060008690506000805160206143b68339815191526001600160a01b03166002898154811061088157634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b031614156108b4576108ae878561365e565b90975090505b6108be81856142f4565b8555855164e8d4a51000906108d39083614296565b6108dd9190614282565b6108e790846142b5565b6001860155811561095957600154604051635ef09f2760e01b81526001600160a01b0390911690635ef09f2790610926908c9033908790600401614173565b600060405180830381600087803b15801561094057600080fd5b505af1158015610954573d6000803e3d6000fd5b505050505b6060860151610972906001600160a01b031633896136e7565b604051818152889033907fda9a10d7b992511ddadbfc7ff712c1424ce2058bbcdac8c9876d6f8de590d43f9060200160405180910390a3604080518a1515815260208101849052899133917ff09de34ff439ca359f3636a01deee70e1e982ce5fba2b22ffab7ef4715d848f3910160405180910390a3505050505050505050565b60088190556007546001600160a01b03163314610a495760405162461bcd60e51b815260206004820152601460248201527339b2ba283bb9322834b21d1010b6b0b730b3b2b960611b6044820152606401610715565b6040518181527f226b5421dbd6c8876b4610b3f4d2520fc6a32779fda58f740b773493b819ab6690602001610772565b60028181548110610a8957600080fd5b6000918252602090912060049091020180546001820154600283015460039093015491935091906001600160a01b031684565b6007546001600160a01b03163314610b065760405162461bcd60e51b815260206004820152600d60248201526c39b2ba1d1010b6b0b730b3b2b960991b6044820152606401610715565b8060028381548110610b2857634e487b7160e01b600052603260045260246000fd5b906000526020600020906004020160010154600454610b4791906142f4565b610b51919061426a565b6004819055508060028381548110610b7957634e487b7160e01b600052603260045260246000fd5b906000526020600020906004020160010181905550817f942cc7e17a17c164bd977f32ab8c54265d5b9d481e4e352bf874f1e568874e7c82604051610bc091815260200190565b60405180910390a25050565b6000546001600160a01b03163314610bf65760405162461bcd60e51b8152600401610715906141f4565b60058190556040518181527fef5cff0f07016d24d3b61ccdbbd8a5cd2b1c7cc12fe03dcf61258c4dc2afa76d90602001610772565b6007546001600160a01b03163314610c855760405162461bcd60e51b815260206004820152601860248201527f73657447726f506572426c6f636b3a20216d616e6167657200000000000000006044820152606401610715565b600554811115610cd75760405162461bcd60e51b815260206004820181905260248201527f73657447726f506572426c6f636b3a203e206d617847726f506572426c6f636b6044820152606401610715565b60068190556040518181527f1fa92eb48df781e7cc40c189fdd28e43db409a6014f5a9af156b623c761b386790602001610772565b6007546001600160a01b03163314610d565760405162461bcd60e51b815260206004820152600d60248201526c30b2321d1010b6b0b730b3b2b960991b6044820152606401610715565b8160046000828254610d68919061426a565b90915550506001600160a01b03811660009081526009602052604090205460ff1615610dd65760405162461bcd60e51b815260206004820152601a60248201527f6164643a206c70546f6b656e20616c72656164792061646465640000000000006044820152606401610715565b6040805160808101825260008082526020808301868152438486019081526001600160a01b0387811660608701818152600280546001808201835591895298517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace6004909a02998a015594517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf89015592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad088015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad190960180546001600160a01b03191696909116959095179094558383526009825291849020805460ff191690921790915591519081527f62f9ac45ee463803e8be25d4b152392732d8d82a35d71f88608df68df9fc46c8910160405180910390a16002546001600160a01b03821690610f2a906001906142f4565b6040518481527f80ced013fa6cac51587ad829f875c2dff69de70dddf137abbf704b91b7163b5d9060200160405180910390a35050565b600a5460ff1615610fa75760405162461bcd60e51b815260206004820152601060248201526f1dda5d1a191c985dce881c185d5cd95960821b6044820152606401610715565b6000610fb28361145f565b60008481526003602090815260408083203384529091529020805460028054939450919285926000805160206143b6833981519152918890811061100657634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b0316141561103957611033858261365e565b90955091505b61104382826142f4565b8355835164e8d4a51000906110589084614296565b6110629190614282565b836001015461107191906142b5565b6001840155606084015161108f906001600160a01b031633876136e7565b604051828152869033907fda9a10d7b992511ddadbfc7ff712c1424ce2058bbcdac8c9876d6f8de590d43f906020015b60405180910390a3505050505050565b600a5460ff16156111225760405162461bcd60e51b815260206004820152601d60248201527f6d756c74695769746864726177416e64436c61696d3a207061757365640000006044820152606401610715565b60008167ffffffffffffffff81111561114b57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611174578160200160208202803683370190505b5090506000805b8581101561135c5760008787838181106111a557634e487b7160e01b600052603260045260246000fd5b90506020020135905060008686848181106111d057634e487b7160e01b600052603260045260246000fd5b90506020020135905060006111e48361145f565b6000848152600360209081526040808320338452909152812080548351939450909290919064e8d4a510009061121a9084614296565b6112249190614282565b90508260010154811215611239576000611248565b600183015461124890826142b5565b611252908961426a565b975060008590506000805160206143b68339815191526001600160a01b03166002888154811061129257634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b031614156112c5576112bf868461365e565b90965090505b808a89815181106112e657634e487b7160e01b600052603260045260246000fd5b60209081029190910101526112fb81846142f4565b8455845164e8d4a51000906113109083614296565b61131a9190614282565b61132490836142b5565b60018501556060850151611342906001600160a01b031633886136e7565b50505050505050808061135490614337565b91505061117b565b5080156113ca57600154604051635ef09f2760e01b81526001600160a01b0390911690635ef09f2790611397908a9033908690600401614173565b600060405180830381600087803b1580156113b157600080fd5b505af11580156113c5573d6000803e3d6000fd5b505050505b336001600160a01b03167fa6b1db69b5daa95297de95867c9772ed569ce4cfb5412de6cb2c64bca2b1ed7e8787856040516114079392919061411b565b60405180910390a2336001600160a01b03167f31b47c5df8b5d578fcbc4cb58092fd5f39cc63f8de62bde2fb9c16b1f480e1b38888888560405161144e9493929190614194565b60405180910390a250505050505050565b611493604051806080016040528060008152602001600081526020016000815260200160006001600160a01b031681525090565b600454806114e35760405162461bcd60e51b815260206004820181905260248201527f757064617465506f6f6c3a20746f74616c416c6c6f63506f696e74203d3d20306044820152606401610715565b6002838154811061150457634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160808101825260049093029091018054835260018101549383019390935260028301549082018190526003909201546001600160a01b0316606082015292504311156117785760608201516040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561159f57600080fd5b505afa1580156115b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d7919061404f565b90506000805160206143b68339815191526001600160a01b03166002858154811061161257634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b031614156116415761163e8161374f565b90505b80156116b257600083604001514361165991906142f4565b90506000838560200151600654846116719190614296565b61167b9190614296565b6116859190614282565b90508261169764e8d4a5100083614296565b6116a19190614282565b85516116ad919061426a565b855250505b43604084015260028054849190869081106116dd57634e487b7160e01b600052603260045260246000fd5b60009182526020918290208351600492909202019081558282015160018201556040808401516002830155606093840151600390920180546001600160a01b0319166001600160a01b039093169290921790915585810151865182519182529281018590529081019190915285917fcb7325664a4a3b7c7223eefc492a97ca4fdf94d46884621e5a8fae5a04b2b9d2910160405180910390a2505b50919050565b600a5460ff16156117d15760405162461bcd60e51b815260206004820152601960248201527f656d657267656e637957697468647261773a20706175736564000000000000006044820152606401610715565b60006117dc8261145f565b60008381526003602090815260408083203384529091529020805460028054939450919290916000805160206143b6833981519152918690811061183057634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b0316141561196b5760006000805160206143b683398151915290506000816001600160a01b03166354f703f86040518163ffffffff1660e01b815260040160206040518083038186803b1580156118a157600080fd5b505afa1580156118b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d9919061404f565b90506000826001600160a01b031663ec342ad06040518163ffffffff1660e01b815260040160206040518083038186803b15801561191657600080fd5b505afa15801561192a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194e919061404f565b90508161195b8286614296565b6119659190614282565b93505050505b60008083556001830155606083015161198e906001600160a01b031633836136e7565b604051818152849033907fcb8e650a8088d4aa667da82206cb1273e93b40a8f1e718e3ab86e9577b7252499060200160405180910390a350505050565b8060005b81811015611a1757611a068484838181106119fa57634e487b7160e01b600052603260045260246000fd5b9050602002013561145f565b50611a1081614337565b90506119cf565b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a8e5760405162461bcd60e51b81526020600482015260166024820152756d73672e73656e64657220213d2074696d656c6f636b60501b6044820152606401610715565b600a805460ff19168215159081179091556040519081527f36f7db4c82c265132d7db2f7305a12af69020f4864a84ac204c1fa4497d2642090602001610772565b6000546001600160a01b03163314611af95760405162461bcd60e51b8152600401610715906141f4565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f021bc7f0c8f417c0bfd2953190e2bb164345161eec2bc776c10ac94f29d452df90602001610772565b600a5460ff1615611b8f5760405162461bcd60e51b81526020600482015260126024820152711b5d5b1d1a50db185a5b4e881c185d5cd95960721b6044820152606401610715565b6000805b82811015611c7a576000611bc08585848181106119fa57634e487b7160e01b600052603260045260246000fd5b9050600060036000878786818110611be857634e487b7160e01b600052603260045260246000fd5b60209081029290920135835250818101929092526040908101600090812033825290925281208351815491935064e8d4a5100091611c269190614296565b611c309190614282565b90508160010154811215611c45576000611c54565b6001820154611c5490826142b5565b611c5e908661426a565b6001909201559250819050611c7281614337565b915050611b93565b508015611ce857600154604051635ef09f2760e01b81526001600160a01b0390911690635ef09f2790611cb590879033908690600401614173565b600060405180830381600087803b158015611ccf57600080fd5b505af1158015611ce3573d6000803e3d6000fd5b505050505b336001600160a01b03167f31b47c5df8b5d578fcbc4cb58092fd5f39cc63f8de62bde2fb9c16b1f480e1b385858585604051611d279493929190614194565b60405180910390a250505050565b6000546001600160a01b03163314611d5f5760405162461bcd60e51b8152600401610715906141f4565b611d6960006138a6565b565b6000546001600160a01b03163314611d955760405162461bcd60e51b8152600401610715906141f4565b600d5460ff1615611de85760405162461bcd60e51b815260206004820152601b60248201527f6d69677261746546726f6d56313a20616c726561647920646f6e6500000000006044820152606401610715565b600a546201000090046001600160a01b0316611e405760405162461bcd60e51b815260206004820152601760248201527636b4b3b930ba32aab9b2b91d1010b7b63229ba30b5b2b960491b6044820152606401610715565b6000600a60029054906101000a90046001600160a01b03169050806001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b158015611e9357600080fd5b505afa158015611ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecb9190613cfb565b600760006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806001600160a01b031663cab1364f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f2a57600080fd5b505afa158015611f3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f62919061404f565b6005819055506000816001600160a01b031663081e3eda6040518163ffffffff1660e01b815260040160206040518083038186803b158015611fa357600080fd5b505afa158015611fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdb919061404f565b905060005b8181101561218a57604051631526fe2760e01b8152600481018290526000906001600160a01b03851690631526fe279060240160806040518083038186803b15801561202b57600080fd5b505afa15801561203f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120639190613f66565b60408051608081018252825181526000602080830182815285850151848601908152606096870180516001600160a01b03908116988701988952600280546001808201835591885297517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace60049099029889015593517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf88015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad087015596517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad190950180546001600160a01b0319169582169590951790945594519092168152600990915220805460ff19169091179055508061218281614337565b915050611fe0565b50600d8054600160ff19909116179055600a54604051620100009091046001600160a01b031681527f9d1bb9fe06dbac2065c9abc3e452d4bd32f15d7652e53ecd1202adde3b86d270906020015b60405180910390a15050565b6000546001600160a01b0316331461220e5760405162461bcd60e51b8152600401610715906141f4565b600a54610100900460ff16156122785760405162461bcd60e51b815260206004820152602960248201527f696e697469616c697a65643a20436f6e747261637420616c726561647920696e6044820152681a5d1a585b1a5e995960ba1b6064820152608401610715565b600a805461ffff1916610100179055604051600081527f36f7db4c82c265132d7db2f7305a12af69020f4864a84ac204c1fa4497d264209060200160405180910390a1565b600454600090806122d2576000915050612503565b6000600285815481106122f557634e487b7160e01b600052603260045260246000fd5b6000918252602080832060408051608081018252600494850290920180548352600180820154848601526002820154848401526003918201546001600160a01b03908116606086019081528d89529286528388208c8216895286528388208451808601865281548152920154958201959095528351915192516370a0823160e01b8152309681019690965292965091949193919216906370a082319060240160206040518083038186803b1580156123ac57600080fd5b505afa1580156123c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e4919061404f565b90506000805160206143b68339815191526001600160a01b03166002898154811061241f57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b0316141561244e5761244b8161374f565b90505b83604001514311801561246057508015155b156124ce57600084604001514361247791906142f4565b905060008686602001516006548461248f9190614296565b6124999190614296565b6124a39190614282565b9050826124b564e8d4a5100083614296565b6124bf9190614282565b6124c9908561426a565b935050505b6020830151835164e8d4a51000906124e7908590614296565b6124f19190614282565b6124fb91906142b5565b955050505050505b92915050565b600a5460ff16156125545760405162461bcd60e51b81526020600482015260156024820152741b5d5b1d1a55da5d1a191c985dce881c185d5cd959605a1b6044820152606401610715565b60008167ffffffffffffffff81111561257d57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156125a6578160200160208202803683370190505b50905060005b848110156127375760008686838181106125d657634e487b7160e01b600052603260045260246000fd5b905060200201359050600085858481811061260157634e487b7160e01b600052603260045260246000fd5b90506020020135905060006126158361145f565b60008481526003602090815260408083203384529091529020805460028054939450919285926000805160206143b6833981519152918890811061266957634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b0316141561269c57612696858261365e565b90955091505b818888815181106126bd57634e487b7160e01b600052603260045260246000fd5b60209081029190910101526126d285826142f4565b8355835164e8d4a51000906126e79084614296565b6126f19190614282565b836001015461270091906142b5565b6001840155606084015161271e906001600160a01b031633876136e7565b505050505050808061272f90614337565b9150506125ac565b50336001600160a01b03167fa6b1db69b5daa95297de95867c9772ed569ce4cfb5412de6cb2c64bca2b1ed7e8686846040516127759392919061411b565b60405180910390a25050505050565b6000546001600160a01b031633146127ae5760405162461bcd60e51b8152600401610715906141f4565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f902a51bc98a3ab870a6d330f876b13d7e1c3a6020f8003a2bcdf000927535f5590602001610772565b600a546201000090046001600160a01b0316331461285c5760405162461bcd60e51b815260206004820152601760248201527f6d69677261746546726f6d3a20216f6c645374616b65720000000000000000006044820152606401610715565b600a546000906201000090046001600160a01b0316815b83811015612b96576000826001600160a01b0316631526fe278787858181106128ac57634e487b7160e01b600052603260045260246000fd5b905060200201356040518263ffffffff1660e01b81526004016128d191815260200190565b60806040518083038186803b1580156128e957600080fd5b505afa1580156128fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129219190613f66565b60608101516001600160a01b031660009081526009602052604090205490915060ff161561299c5760405162461bcd60e51b815260206004820152602260248201527f6d69677261746546726f6d3a206c70546f6b656e20616c726561647920616464604482015261195960f21b6064820152608401610715565b604080516080810182528251815260208084018051918301918252848401519383019384526060808601516001600160a01b039081169185019182526002805460018101825560009190915294517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace60049096029586015592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf85015593517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad084015592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad190920180546001600160a01b0319169290911691909117905551612aa7908561426a565b6060820151600a546040516370a0823160e01b81526001600160a01b0362010000909204821660048201529296506000929116906370a082319060240160206040518083038186803b158015612afc57600080fd5b505afa158015612b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b34919061404f565b600a546060840151919250612b5d916001600160a01b03908116916201000090041630846138f6565b50606001516001600160a01b03166000908152600960205260409020805460ff1916600117905580612b8e81614337565b915050612873565b508160046000828254612ba9919061426a565b90915550506040517f566422577e2cd00218e9da421ed6299bed23d9cefbe4d7a60cf91f291ed3a27c90612be09086908690614107565b60405180910390a150505050565b600a5460ff1615612c375760405162461bcd60e51b81526020600482015260136024820152721b5a59dc985d19555cd95c8e881c185d5cd959606a1b6044820152606401610715565b600a546201000090046001600160a01b0316612c8f5760405162461bcd60e51b815260206004820152601760248201527636b4b3b930ba32aab9b2b91d1010b7b63229ba30b5b2b960491b6044820152606401610715565b600a546201000090046001600160a01b031660005b82811015612efa576000848483818110612cce57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0389166000908152600c60209081526040808320938202959095013580835292905292909220549192505060ff1615612d505760405162461bcd60e51b815260206004820152601d60248201527f6d696772617465557365723a2070696420616c726561647920646f6e650000006044820152606401610715565b6040516393f1a40b60e01b8152600481018290526001600160a01b038781166024830152600091908516906393f1a40b90604401604080518083038186803b158015612d9b57600080fd5b505afa158015612daf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd39190613fdd565b805190915015612ee55760008281526003602090815260408083206001600160a01b038b1684529091529020600280546000805160206143b6833981519152919085908110612e3257634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b03161415612e7e578151612e609061374f565b816000016000828254612e73919061426a565b90915550612e989050565b815181548290600090612e9290849061426a565b90915550505b8160200151816001016000828254612eb09190614229565b9091555050506001600160a01b0387166000908152600c602090815260408083208584529091529020805460ff191660011790555b50508080612ef290614337565b915050612ca4565b50836001600160a01b03167fe0a1de4b2e05162caaf98957f5b3345a33b5a8faad770ec1b6bc291b39b0aa498484604051611d27929190614107565b6000546001600160a01b03163314612f605760405162461bcd60e51b8152600401610715906141f4565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527fd5e2a84aa36d46ec4790f610ee38160940db160864c3e92ad933ddf4fd72ad5d90602001610772565b600a5460ff1615612ff15760405162461bcd60e51b815260206004820152600d60248201526c18db185a5b4e881c185d5cd959609a1b6044820152606401610715565b6000612ffc8261145f565b6000838152600360209081526040808320338452909152812082518154939450909264e8d4a510009161302e91614296565b6130389190614282565b90506000826001015482121561304f57600061305e565b600183015461305e90836142b5565b60018401839055905080156130d457600154604051635ef09f2760e01b81526001600160a01b0390911690635ef09f27906130a190899033908690600401614173565b600060405180830381600087803b1580156130bb57600080fd5b505af11580156130cf573d6000803e3d6000fd5b505050505b60408051871515815260208101839052869133917ff09de34ff439ca359f3636a01deee70e1e982ce5fba2b22ffab7ef4715d848f391016110bf565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146131815760405162461bcd60e51b81526020600482015260166024820152756d73672e73656e64657220213d2074696d656c6f636b60501b6044820152606401610715565b600b546001600160a01b03166131cf5760405162461bcd60e51b815260206004820152601360248201527236b4b3b930ba329d1010b732bba9ba30b5b2b960691b6044820152606401610715565b60005b8181101561338057600060028484848181106131fe57634e487b7160e01b600052603260045260246000fd5b905060200201358154811061322357634e487b7160e01b600052603260045260246000fd5b60009182526020808320604080516080810182526004948502909201805483526001810154938301939093526002830154828201526003909201546001600160a01b03166060820181905291516370a0823160e01b815230938101939093529350906370a082319060240160206040518083038186803b1580156132a657600080fd5b505afa1580156132ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132de919061404f565b6060830151600b5460405163095ea7b360e01b81526001600160a01b03918216600482015260248101849052929350169063095ea7b390604401602060405180830381600087803b15801561333257600080fd5b505af1158015613346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061336a9190613e5a565b505050808061337890614337565b9150506131d2565b50600b54604051633074fbc960e21b81526001600160a01b039091169063c1d3ef24906133b39085908590600401614107565b600060405180830381600087803b1580156133cd57600080fd5b505af11580156133e1573d6000803e3d6000fd5b505050507f84ce7058aba6e2dc92fe658c5276dc60bde4b34802344ec9588c47ba54a4236c82826040516121d8929190614107565b600a5460ff161561345b5760405162461bcd60e51b815260206004820152600f60248201526e19195c1bdcda5d0e881c185d5cd959608a1b6044820152606401610715565b60006134668361145f565b6000848152600360209081526040808320338452909152902060028054929350909184916000805160206143b683398151915291879081106134b857634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b031614156134e7576134e48461374f565b90505b81546134f490829061426a565b8255825164e8d4a51000906135099083614296565b6135139190614282565b82600101546135229190614229565b60018301556060830151613541906001600160a01b03163330876138f6565b604051818152859033907f9dbb0e7dda3e09710ce75b801addc87cf9d9c6c581641b3275fca409ad086c629060200160405180910390a35050505050565b60085460009081526003602090815260408083206001600160a01b0385168452909152812054806135b35750600092915050565b6135bc8161392e565b9392505050565b6000546001600160a01b031633146135ed5760405162461bcd60e51b8152600401610715906141f4565b6001600160a01b0381166136525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610715565b61365b816138a6565b50565b600080600061366c8561374f565b90508361367a6001836142f4565b148061368557508381145b1561369657848492509250506136e0565b838111156136b2576136a78461374f565b8492509250506136e0565b61270b846136c283612710614296565b6136cc9190614282565b106136da576136a78461374f565b84925090505b9250929050565b6040516001600160a01b03831660248201526044810182905261374a90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613a52565b505050565b6000806000805160206143b683398151915290506000816001600160a01b03166354f703f86040518163ffffffff1660e01b815260040160206040518083038186803b15801561379e57600080fd5b505afa1580156137b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d6919061404f565b90506000826001600160a01b031663ec342ad06040518163ffffffff1660e01b815260040160206040518083038186803b15801561381357600080fd5b505afa158015613827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061384b919061404f565b905060008161385a8488614296565b6138649190614352565b90506000826138738589614296565b61387d9190614282565b90506706f05b59d3b20000821061389c5761389981600161426a565b90505b9695505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052611a179085906323b872dd60e01b90608401613713565b6000806000805160206143b683398151915290506000816001600160a01b03166354f703f86040518163ffffffff1660e01b815260040160206040518083038186803b15801561397d57600080fd5b505afa158015613991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b5919061404f565b90506000826001600160a01b031663ec342ad06040518163ffffffff1660e01b815260040160206040518083038186803b1580156139f257600080fd5b505afa158015613a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a2a919061404f565b9050600082613a398388614296565b613a439190614352565b90506000836138738489614296565b6000613aa7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613b249092919063ffffffff16565b80519091501561374a5780806020019051810190613ac59190613e5a565b61374a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610715565b6060613b338484600085613b3b565b949350505050565b606082471015613b9c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610715565b843b613bea5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610715565b600080866001600160a01b03168587604051613c0691906140eb565b60006040518083038185875af1925050503d8060008114613c43576040519150601f19603f3d011682016040523d82523d6000602084013e613c48565b606091505b5091509150613c58828286613c63565b979650505050505050565b60608315613c725750816135bc565b825115613c825782518084602001fd5b8160405162461bcd60e51b815260040161071591906141c1565b60008083601f840112613cad578182fd5b50813567ffffffffffffffff811115613cc4578182fd5b6020830191508360208260051b85010111156136e057600080fd5b600060208284031215613cf0578081fd5b81356135bc81614392565b600060208284031215613d0c578081fd5b81516135bc81614392565b600080600060408486031215613d2b578182fd5b8335613d3681614392565b9250602084013567ffffffffffffffff811115613d51578283fd5b613d5d86828701613c9c565b9497909650939450505050565b60008060408385031215613d7c578182fd5b8235613d8781614392565b946020939093013593505050565b60008060208385031215613da7578182fd5b823567ffffffffffffffff811115613dbd578283fd5b613dc985828601613c9c565b90969095509350505050565b60008060008060408587031215613dea578081fd5b843567ffffffffffffffff80821115613e01578283fd5b613e0d88838901613c9c565b90965094506020870135915080821115613e25578283fd5b50613e3287828801613c9c565b95989497509550505050565b600060208284031215613e4f578081fd5b81356135bc816143a7565b600060208284031215613e6b578081fd5b81516135bc816143a7565b600080600060408486031215613e8a578283fd5b8335613d36816143a7565b600080600080600060608688031215613eac578081fd5b8535613eb7816143a7565b9450602086013567ffffffffffffffff80821115613ed3578283fd5b613edf89838a01613c9c565b90965094506040880135915080821115613ef7578283fd5b50613f0488828901613c9c565b969995985093965092949392505050565b60008060408385031215613f27578182fd5b8235613d87816143a7565b600080600060608486031215613f46578081fd5b8335613f51816143a7565b95602085013595506040909401359392505050565b600060808284031215613f77578081fd5b6040516080810181811067ffffffffffffffff82111715613fa657634e487b7160e01b83526041600452602483fd5b80604052508251815260208301516020820152604083015160408201526060830151613fd181614392565b60608201529392505050565b600060408284031215613fee578081fd5b6040516040810181811067ffffffffffffffff8211171561401d57634e487b7160e01b83526041600452602483fd5b604052825181526020928301519281019290925250919050565b600060208284031215614048578081fd5b5035919050565b600060208284031215614060578081fd5b5051919050565b60008060408385031215614079578182fd5b82359150602083013561408b81614392565b809150509250929050565b600080604083850312156140a8578182fd5b50508035926020909101359150565b81835260006001600160fb1b038311156140cf578081fd5b8260051b80836020870137939093016020019283525090919050565b600082516140fd81846020870161430b565b9190910192915050565b602081526000613b336020830184866140b7565b60408152600061412f6040830185876140b7565b828103602084810191909152845180835285820192820190845b8181101561416557845183529383019391830191600101614149565b509098975050505050505050565b92151583526001600160a01b03919091166020830152604082015260600190565b84151581526060602082015260006141b06060830185876140b7565b905082604083015295945050505050565b60208152600082518060208401526141e081604085016020870161430b565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600080821280156001600160ff1b038490038513161561424b5761424b614366565b600160ff1b839003841281161561426457614264614366565b50500190565b6000821982111561427d5761427d614366565b500190565b6000826142915761429161437c565b500490565b60008160001904831182151516156142b0576142b0614366565b500290565b60008083128015600160ff1b8501841216156142d3576142d3614366565b6001600160ff1b03840183138116156142ee576142ee614366565b50500390565b60008282101561430657614306614366565b500390565b60005b8381101561432657818101518382015260200161430e565b83811115611a175750506000910152565b600060001982141561434b5761434b614366565b5060010190565b6000826143615761436161437c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b038116811461365b57600080fd5b801515811461365b57600080fdfe000000000000000000000000f0a93d4994b3d98fb5e3a2f90dbc2d69073cb86ba2646970667358221220b42f7025d5910289c4b7a04abec50b8743db63641634b55bacbf2ba76c9161d764736f6c634300080400330000000000000000000000001aebe9147766936906ab56ec0693306da3539824
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a05760003560e01c8063715018a611610167578063aea62e3f116100ce578063d505a36411610087578063d505a36414610665578063d93bf4fe14610678578063e0a09c681461068b578063e2bbb158146106b2578063e6435ccc146106c5578063f2fde38b146106d857600080fd5b8063aea62e3f146105fd578063b563b27f14610610578063c1d3ef2414610623578063cab1364f14610636578063cd2a52141461063f578063d0ebdbe71461065257600080fd5b806384e796611161012057806384e79661146105525780638da5cb5b1461058057806393f1a40b14610591578063a0c7f71c146105d8578063a2133665146105eb578063a571ba0f146105f457600080fd5b8063715018a6146104f957806379b9c399146105015780637c59a910146105095780637ce381b91461051c5780637d687cf3146105355780638129fc1c1461054a57600080fd5b8063441a3e701161020b57806357a5b58c116101c457806357a5b58c1461047d5780635c40f6f4146104905780635c975abb146104a3578063677e2af0146104b05780636f6ff3bc146104d35780637120d521146104e657600080fd5b8063441a3e70146103b757806344c63eec146103ca578063481c6a75146103f557806350e84a2c1461040857806351eb05a61461041b5780635312ea8e1461046a57600080fd5b806317caf6f11161025d57806317caf6f1146103555780631ab06ee51461035e5780631e014fcc1461037157806321fb8da6146103845780632b8bbbe81461039757806340bace48146103aa57600080fd5b80630239b3c4146102a5578063081e3eda146102ba5780630d320682146102d1578063119d3dae146102e45780631526fe27146102f7578063158ef93e14610333575b600080fd5b6102b86102b3366004613cdf565b6106eb565b005b6002545b6040519081526020015b60405180910390f35b6102b86102df366004613f32565b61077d565b6102b86102f2366004614037565b6109f3565b61030a610305366004614037565b610a79565b604080519485526020850193909352918301526001600160a01b031660608201526080016102c8565b600a5461034590610100900460ff1681565b60405190151581526020016102c8565b6102be60045481565b6102b861036c366004614096565b610abc565b6102b861037f366004614037565b610bcc565b6102b8610392366004614037565b610c2b565b6102b86103a5366004614067565b610d0c565b600d546103459060ff1681565b6102b86103c5366004614096565b610f61565b6001546103dd906001600160a01b031681565b6040516001600160a01b0390911681526020016102c8565b6007546103dd906001600160a01b031681565b6102b8610416366004613e95565b6110cf565b61042e610429366004614037565b61145f565b6040516102c891908151815260208083015190820152604080830151908201526060918201516001600160a01b03169181019190915260800190565b6102b8610478366004614037565b61177e565b6102b861048b366004613d95565b6119cb565b6102b861049e366004613e3e565b611a1d565b600a546103459060ff1681565b6103456104be366004613cdf565b60096020526000908152604090205460ff1681565b6102b86104e1366004613cdf565b611acf565b6102b86104f4366004613e76565b611b47565b6102b8611d35565b6102b8611d6b565b600b546103dd906001600160a01b031681565b600a546103dd906201000090046001600160a01b031681565b6103dd6000805160206143b683398151915281565b6102b86121e4565b610345610560366004613d6a565b600c60209081526000928352604080842090915290825290205460ff1681565b6000546001600160a01b03166103dd565b6105c361059f366004614067565b60036020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016102c8565b6102be6105e6366004614067565b6122bd565b6102be60065481565b6102be60085481565b6102b861060b366004613dd5565b612509565b6102b861061e366004613cdf565b612784565b6102b8610631366004613d95565b6127fc565b6102be60055481565b6102b861064d366004613d17565b612bee565b6102b8610660366004613cdf565b612f36565b6102b8610673366004613f15565b612fae565b6102b8610686366004613d95565b613110565b6103dd7f0000000000000000000000001aebe9147766936906ab56ec0693306da353982481565b6102b86106c0366004614096565b613416565b6102be6106d3366004613cdf565b61357f565b6102b86106e6366004613cdf565b6135c3565b6000546001600160a01b0316331461071e5760405162461bcd60e51b8152600401610715906141f4565b60405180910390fd5b600a805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040519081527f7a587e6bf52664adf21ed4ef40c5a2d236ced93bca80ae4af80f604cd07ef949906020015b60405180910390a150565b600a5460ff16156107d05760405162461bcd60e51b815260206004820152601860248201527f7769746864726177416e64436c61696d3a2070617573656400000000000000006044820152606401610715565b60006107db8361145f565b6000848152600360209081526040808320338452909152812080548351939450909290919064e8d4a51000906108119084614296565b61081b9190614282565b905060008360010154821215610832576000610841565b600184015461084190836142b5565b905060008690506000805160206143b68339815191526001600160a01b03166002898154811061088157634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b031614156108b4576108ae878561365e565b90975090505b6108be81856142f4565b8555855164e8d4a51000906108d39083614296565b6108dd9190614282565b6108e790846142b5565b6001860155811561095957600154604051635ef09f2760e01b81526001600160a01b0390911690635ef09f2790610926908c9033908790600401614173565b600060405180830381600087803b15801561094057600080fd5b505af1158015610954573d6000803e3d6000fd5b505050505b6060860151610972906001600160a01b031633896136e7565b604051818152889033907fda9a10d7b992511ddadbfc7ff712c1424ce2058bbcdac8c9876d6f8de590d43f9060200160405180910390a3604080518a1515815260208101849052899133917ff09de34ff439ca359f3636a01deee70e1e982ce5fba2b22ffab7ef4715d848f3910160405180910390a3505050505050505050565b60088190556007546001600160a01b03163314610a495760405162461bcd60e51b815260206004820152601460248201527339b2ba283bb9322834b21d1010b6b0b730b3b2b960611b6044820152606401610715565b6040518181527f226b5421dbd6c8876b4610b3f4d2520fc6a32779fda58f740b773493b819ab6690602001610772565b60028181548110610a8957600080fd5b6000918252602090912060049091020180546001820154600283015460039093015491935091906001600160a01b031684565b6007546001600160a01b03163314610b065760405162461bcd60e51b815260206004820152600d60248201526c39b2ba1d1010b6b0b730b3b2b960991b6044820152606401610715565b8060028381548110610b2857634e487b7160e01b600052603260045260246000fd5b906000526020600020906004020160010154600454610b4791906142f4565b610b51919061426a565b6004819055508060028381548110610b7957634e487b7160e01b600052603260045260246000fd5b906000526020600020906004020160010181905550817f942cc7e17a17c164bd977f32ab8c54265d5b9d481e4e352bf874f1e568874e7c82604051610bc091815260200190565b60405180910390a25050565b6000546001600160a01b03163314610bf65760405162461bcd60e51b8152600401610715906141f4565b60058190556040518181527fef5cff0f07016d24d3b61ccdbbd8a5cd2b1c7cc12fe03dcf61258c4dc2afa76d90602001610772565b6007546001600160a01b03163314610c855760405162461bcd60e51b815260206004820152601860248201527f73657447726f506572426c6f636b3a20216d616e6167657200000000000000006044820152606401610715565b600554811115610cd75760405162461bcd60e51b815260206004820181905260248201527f73657447726f506572426c6f636b3a203e206d617847726f506572426c6f636b6044820152606401610715565b60068190556040518181527f1fa92eb48df781e7cc40c189fdd28e43db409a6014f5a9af156b623c761b386790602001610772565b6007546001600160a01b03163314610d565760405162461bcd60e51b815260206004820152600d60248201526c30b2321d1010b6b0b730b3b2b960991b6044820152606401610715565b8160046000828254610d68919061426a565b90915550506001600160a01b03811660009081526009602052604090205460ff1615610dd65760405162461bcd60e51b815260206004820152601a60248201527f6164643a206c70546f6b656e20616c72656164792061646465640000000000006044820152606401610715565b6040805160808101825260008082526020808301868152438486019081526001600160a01b0387811660608701818152600280546001808201835591895298517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace6004909a02998a015594517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf89015592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad088015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad190960180546001600160a01b03191696909116959095179094558383526009825291849020805460ff191690921790915591519081527f62f9ac45ee463803e8be25d4b152392732d8d82a35d71f88608df68df9fc46c8910160405180910390a16002546001600160a01b03821690610f2a906001906142f4565b6040518481527f80ced013fa6cac51587ad829f875c2dff69de70dddf137abbf704b91b7163b5d9060200160405180910390a35050565b600a5460ff1615610fa75760405162461bcd60e51b815260206004820152601060248201526f1dda5d1a191c985dce881c185d5cd95960821b6044820152606401610715565b6000610fb28361145f565b60008481526003602090815260408083203384529091529020805460028054939450919285926000805160206143b6833981519152918890811061100657634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b0316141561103957611033858261365e565b90955091505b61104382826142f4565b8355835164e8d4a51000906110589084614296565b6110629190614282565b836001015461107191906142b5565b6001840155606084015161108f906001600160a01b031633876136e7565b604051828152869033907fda9a10d7b992511ddadbfc7ff712c1424ce2058bbcdac8c9876d6f8de590d43f906020015b60405180910390a3505050505050565b600a5460ff16156111225760405162461bcd60e51b815260206004820152601d60248201527f6d756c74695769746864726177416e64436c61696d3a207061757365640000006044820152606401610715565b60008167ffffffffffffffff81111561114b57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611174578160200160208202803683370190505b5090506000805b8581101561135c5760008787838181106111a557634e487b7160e01b600052603260045260246000fd5b90506020020135905060008686848181106111d057634e487b7160e01b600052603260045260246000fd5b90506020020135905060006111e48361145f565b6000848152600360209081526040808320338452909152812080548351939450909290919064e8d4a510009061121a9084614296565b6112249190614282565b90508260010154811215611239576000611248565b600183015461124890826142b5565b611252908961426a565b975060008590506000805160206143b68339815191526001600160a01b03166002888154811061129257634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b031614156112c5576112bf868461365e565b90965090505b808a89815181106112e657634e487b7160e01b600052603260045260246000fd5b60209081029190910101526112fb81846142f4565b8455845164e8d4a51000906113109083614296565b61131a9190614282565b61132490836142b5565b60018501556060850151611342906001600160a01b031633886136e7565b50505050505050808061135490614337565b91505061117b565b5080156113ca57600154604051635ef09f2760e01b81526001600160a01b0390911690635ef09f2790611397908a9033908690600401614173565b600060405180830381600087803b1580156113b157600080fd5b505af11580156113c5573d6000803e3d6000fd5b505050505b336001600160a01b03167fa6b1db69b5daa95297de95867c9772ed569ce4cfb5412de6cb2c64bca2b1ed7e8787856040516114079392919061411b565b60405180910390a2336001600160a01b03167f31b47c5df8b5d578fcbc4cb58092fd5f39cc63f8de62bde2fb9c16b1f480e1b38888888560405161144e9493929190614194565b60405180910390a250505050505050565b611493604051806080016040528060008152602001600081526020016000815260200160006001600160a01b031681525090565b600454806114e35760405162461bcd60e51b815260206004820181905260248201527f757064617465506f6f6c3a20746f74616c416c6c6f63506f696e74203d3d20306044820152606401610715565b6002838154811061150457634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160808101825260049093029091018054835260018101549383019390935260028301549082018190526003909201546001600160a01b0316606082015292504311156117785760608201516040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561159f57600080fd5b505afa1580156115b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d7919061404f565b90506000805160206143b68339815191526001600160a01b03166002858154811061161257634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b031614156116415761163e8161374f565b90505b80156116b257600083604001514361165991906142f4565b90506000838560200151600654846116719190614296565b61167b9190614296565b6116859190614282565b90508261169764e8d4a5100083614296565b6116a19190614282565b85516116ad919061426a565b855250505b43604084015260028054849190869081106116dd57634e487b7160e01b600052603260045260246000fd5b60009182526020918290208351600492909202019081558282015160018201556040808401516002830155606093840151600390920180546001600160a01b0319166001600160a01b039093169290921790915585810151865182519182529281018590529081019190915285917fcb7325664a4a3b7c7223eefc492a97ca4fdf94d46884621e5a8fae5a04b2b9d2910160405180910390a2505b50919050565b600a5460ff16156117d15760405162461bcd60e51b815260206004820152601960248201527f656d657267656e637957697468647261773a20706175736564000000000000006044820152606401610715565b60006117dc8261145f565b60008381526003602090815260408083203384529091529020805460028054939450919290916000805160206143b6833981519152918690811061183057634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b0316141561196b5760006000805160206143b683398151915290506000816001600160a01b03166354f703f86040518163ffffffff1660e01b815260040160206040518083038186803b1580156118a157600080fd5b505afa1580156118b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d9919061404f565b90506000826001600160a01b031663ec342ad06040518163ffffffff1660e01b815260040160206040518083038186803b15801561191657600080fd5b505afa15801561192a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194e919061404f565b90508161195b8286614296565b6119659190614282565b93505050505b60008083556001830155606083015161198e906001600160a01b031633836136e7565b604051818152849033907fcb8e650a8088d4aa667da82206cb1273e93b40a8f1e718e3ab86e9577b7252499060200160405180910390a350505050565b8060005b81811015611a1757611a068484838181106119fa57634e487b7160e01b600052603260045260246000fd5b9050602002013561145f565b50611a1081614337565b90506119cf565b50505050565b336001600160a01b037f0000000000000000000000001aebe9147766936906ab56ec0693306da35398241614611a8e5760405162461bcd60e51b81526020600482015260166024820152756d73672e73656e64657220213d2074696d656c6f636b60501b6044820152606401610715565b600a805460ff19168215159081179091556040519081527f36f7db4c82c265132d7db2f7305a12af69020f4864a84ac204c1fa4497d2642090602001610772565b6000546001600160a01b03163314611af95760405162461bcd60e51b8152600401610715906141f4565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f021bc7f0c8f417c0bfd2953190e2bb164345161eec2bc776c10ac94f29d452df90602001610772565b600a5460ff1615611b8f5760405162461bcd60e51b81526020600482015260126024820152711b5d5b1d1a50db185a5b4e881c185d5cd95960721b6044820152606401610715565b6000805b82811015611c7a576000611bc08585848181106119fa57634e487b7160e01b600052603260045260246000fd5b9050600060036000878786818110611be857634e487b7160e01b600052603260045260246000fd5b60209081029290920135835250818101929092526040908101600090812033825290925281208351815491935064e8d4a5100091611c269190614296565b611c309190614282565b90508160010154811215611c45576000611c54565b6001820154611c5490826142b5565b611c5e908661426a565b6001909201559250819050611c7281614337565b915050611b93565b508015611ce857600154604051635ef09f2760e01b81526001600160a01b0390911690635ef09f2790611cb590879033908690600401614173565b600060405180830381600087803b158015611ccf57600080fd5b505af1158015611ce3573d6000803e3d6000fd5b505050505b336001600160a01b03167f31b47c5df8b5d578fcbc4cb58092fd5f39cc63f8de62bde2fb9c16b1f480e1b385858585604051611d279493929190614194565b60405180910390a250505050565b6000546001600160a01b03163314611d5f5760405162461bcd60e51b8152600401610715906141f4565b611d6960006138a6565b565b6000546001600160a01b03163314611d955760405162461bcd60e51b8152600401610715906141f4565b600d5460ff1615611de85760405162461bcd60e51b815260206004820152601b60248201527f6d69677261746546726f6d56313a20616c726561647920646f6e6500000000006044820152606401610715565b600a546201000090046001600160a01b0316611e405760405162461bcd60e51b815260206004820152601760248201527636b4b3b930ba32aab9b2b91d1010b7b63229ba30b5b2b960491b6044820152606401610715565b6000600a60029054906101000a90046001600160a01b03169050806001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b158015611e9357600080fd5b505afa158015611ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecb9190613cfb565b600760006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806001600160a01b031663cab1364f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f2a57600080fd5b505afa158015611f3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f62919061404f565b6005819055506000816001600160a01b031663081e3eda6040518163ffffffff1660e01b815260040160206040518083038186803b158015611fa357600080fd5b505afa158015611fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdb919061404f565b905060005b8181101561218a57604051631526fe2760e01b8152600481018290526000906001600160a01b03851690631526fe279060240160806040518083038186803b15801561202b57600080fd5b505afa15801561203f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120639190613f66565b60408051608081018252825181526000602080830182815285850151848601908152606096870180516001600160a01b03908116988701988952600280546001808201835591885297517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace60049099029889015593517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf88015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad087015596517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad190950180546001600160a01b0319169582169590951790945594519092168152600990915220805460ff19169091179055508061218281614337565b915050611fe0565b50600d8054600160ff19909116179055600a54604051620100009091046001600160a01b031681527f9d1bb9fe06dbac2065c9abc3e452d4bd32f15d7652e53ecd1202adde3b86d270906020015b60405180910390a15050565b6000546001600160a01b0316331461220e5760405162461bcd60e51b8152600401610715906141f4565b600a54610100900460ff16156122785760405162461bcd60e51b815260206004820152602960248201527f696e697469616c697a65643a20436f6e747261637420616c726561647920696e6044820152681a5d1a585b1a5e995960ba1b6064820152608401610715565b600a805461ffff1916610100179055604051600081527f36f7db4c82c265132d7db2f7305a12af69020f4864a84ac204c1fa4497d264209060200160405180910390a1565b600454600090806122d2576000915050612503565b6000600285815481106122f557634e487b7160e01b600052603260045260246000fd5b6000918252602080832060408051608081018252600494850290920180548352600180820154848601526002820154848401526003918201546001600160a01b03908116606086019081528d89529286528388208c8216895286528388208451808601865281548152920154958201959095528351915192516370a0823160e01b8152309681019690965292965091949193919216906370a082319060240160206040518083038186803b1580156123ac57600080fd5b505afa1580156123c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e4919061404f565b90506000805160206143b68339815191526001600160a01b03166002898154811061241f57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b0316141561244e5761244b8161374f565b90505b83604001514311801561246057508015155b156124ce57600084604001514361247791906142f4565b905060008686602001516006548461248f9190614296565b6124999190614296565b6124a39190614282565b9050826124b564e8d4a5100083614296565b6124bf9190614282565b6124c9908561426a565b935050505b6020830151835164e8d4a51000906124e7908590614296565b6124f19190614282565b6124fb91906142b5565b955050505050505b92915050565b600a5460ff16156125545760405162461bcd60e51b81526020600482015260156024820152741b5d5b1d1a55da5d1a191c985dce881c185d5cd959605a1b6044820152606401610715565b60008167ffffffffffffffff81111561257d57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156125a6578160200160208202803683370190505b50905060005b848110156127375760008686838181106125d657634e487b7160e01b600052603260045260246000fd5b905060200201359050600085858481811061260157634e487b7160e01b600052603260045260246000fd5b90506020020135905060006126158361145f565b60008481526003602090815260408083203384529091529020805460028054939450919285926000805160206143b6833981519152918890811061266957634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b0316141561269c57612696858261365e565b90955091505b818888815181106126bd57634e487b7160e01b600052603260045260246000fd5b60209081029190910101526126d285826142f4565b8355835164e8d4a51000906126e79084614296565b6126f19190614282565b836001015461270091906142b5565b6001840155606084015161271e906001600160a01b031633876136e7565b505050505050808061272f90614337565b9150506125ac565b50336001600160a01b03167fa6b1db69b5daa95297de95867c9772ed569ce4cfb5412de6cb2c64bca2b1ed7e8686846040516127759392919061411b565b60405180910390a25050505050565b6000546001600160a01b031633146127ae5760405162461bcd60e51b8152600401610715906141f4565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f902a51bc98a3ab870a6d330f876b13d7e1c3a6020f8003a2bcdf000927535f5590602001610772565b600a546201000090046001600160a01b0316331461285c5760405162461bcd60e51b815260206004820152601760248201527f6d69677261746546726f6d3a20216f6c645374616b65720000000000000000006044820152606401610715565b600a546000906201000090046001600160a01b0316815b83811015612b96576000826001600160a01b0316631526fe278787858181106128ac57634e487b7160e01b600052603260045260246000fd5b905060200201356040518263ffffffff1660e01b81526004016128d191815260200190565b60806040518083038186803b1580156128e957600080fd5b505afa1580156128fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129219190613f66565b60608101516001600160a01b031660009081526009602052604090205490915060ff161561299c5760405162461bcd60e51b815260206004820152602260248201527f6d69677261746546726f6d3a206c70546f6b656e20616c726561647920616464604482015261195960f21b6064820152608401610715565b604080516080810182528251815260208084018051918301918252848401519383019384526060808601516001600160a01b039081169185019182526002805460018101825560009190915294517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace60049096029586015592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf85015593517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad084015592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad190920180546001600160a01b0319169290911691909117905551612aa7908561426a565b6060820151600a546040516370a0823160e01b81526001600160a01b0362010000909204821660048201529296506000929116906370a082319060240160206040518083038186803b158015612afc57600080fd5b505afa158015612b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b34919061404f565b600a546060840151919250612b5d916001600160a01b03908116916201000090041630846138f6565b50606001516001600160a01b03166000908152600960205260409020805460ff1916600117905580612b8e81614337565b915050612873565b508160046000828254612ba9919061426a565b90915550506040517f566422577e2cd00218e9da421ed6299bed23d9cefbe4d7a60cf91f291ed3a27c90612be09086908690614107565b60405180910390a150505050565b600a5460ff1615612c375760405162461bcd60e51b81526020600482015260136024820152721b5a59dc985d19555cd95c8e881c185d5cd959606a1b6044820152606401610715565b600a546201000090046001600160a01b0316612c8f5760405162461bcd60e51b815260206004820152601760248201527636b4b3b930ba32aab9b2b91d1010b7b63229ba30b5b2b960491b6044820152606401610715565b600a546201000090046001600160a01b031660005b82811015612efa576000848483818110612cce57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0389166000908152600c60209081526040808320938202959095013580835292905292909220549192505060ff1615612d505760405162461bcd60e51b815260206004820152601d60248201527f6d696772617465557365723a2070696420616c726561647920646f6e650000006044820152606401610715565b6040516393f1a40b60e01b8152600481018290526001600160a01b038781166024830152600091908516906393f1a40b90604401604080518083038186803b158015612d9b57600080fd5b505afa158015612daf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd39190613fdd565b805190915015612ee55760008281526003602090815260408083206001600160a01b038b1684529091529020600280546000805160206143b6833981519152919085908110612e3257634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b03161415612e7e578151612e609061374f565b816000016000828254612e73919061426a565b90915550612e989050565b815181548290600090612e9290849061426a565b90915550505b8160200151816001016000828254612eb09190614229565b9091555050506001600160a01b0387166000908152600c602090815260408083208584529091529020805460ff191660011790555b50508080612ef290614337565b915050612ca4565b50836001600160a01b03167fe0a1de4b2e05162caaf98957f5b3345a33b5a8faad770ec1b6bc291b39b0aa498484604051611d27929190614107565b6000546001600160a01b03163314612f605760405162461bcd60e51b8152600401610715906141f4565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527fd5e2a84aa36d46ec4790f610ee38160940db160864c3e92ad933ddf4fd72ad5d90602001610772565b600a5460ff1615612ff15760405162461bcd60e51b815260206004820152600d60248201526c18db185a5b4e881c185d5cd959609a1b6044820152606401610715565b6000612ffc8261145f565b6000838152600360209081526040808320338452909152812082518154939450909264e8d4a510009161302e91614296565b6130389190614282565b90506000826001015482121561304f57600061305e565b600183015461305e90836142b5565b60018401839055905080156130d457600154604051635ef09f2760e01b81526001600160a01b0390911690635ef09f27906130a190899033908690600401614173565b600060405180830381600087803b1580156130bb57600080fd5b505af11580156130cf573d6000803e3d6000fd5b505050505b60408051871515815260208101839052869133917ff09de34ff439ca359f3636a01deee70e1e982ce5fba2b22ffab7ef4715d848f391016110bf565b336001600160a01b037f0000000000000000000000001aebe9147766936906ab56ec0693306da353982416146131815760405162461bcd60e51b81526020600482015260166024820152756d73672e73656e64657220213d2074696d656c6f636b60501b6044820152606401610715565b600b546001600160a01b03166131cf5760405162461bcd60e51b815260206004820152601360248201527236b4b3b930ba329d1010b732bba9ba30b5b2b960691b6044820152606401610715565b60005b8181101561338057600060028484848181106131fe57634e487b7160e01b600052603260045260246000fd5b905060200201358154811061322357634e487b7160e01b600052603260045260246000fd5b60009182526020808320604080516080810182526004948502909201805483526001810154938301939093526002830154828201526003909201546001600160a01b03166060820181905291516370a0823160e01b815230938101939093529350906370a082319060240160206040518083038186803b1580156132a657600080fd5b505afa1580156132ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132de919061404f565b6060830151600b5460405163095ea7b360e01b81526001600160a01b03918216600482015260248101849052929350169063095ea7b390604401602060405180830381600087803b15801561333257600080fd5b505af1158015613346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061336a9190613e5a565b505050808061337890614337565b9150506131d2565b50600b54604051633074fbc960e21b81526001600160a01b039091169063c1d3ef24906133b39085908590600401614107565b600060405180830381600087803b1580156133cd57600080fd5b505af11580156133e1573d6000803e3d6000fd5b505050507f84ce7058aba6e2dc92fe658c5276dc60bde4b34802344ec9588c47ba54a4236c82826040516121d8929190614107565b600a5460ff161561345b5760405162461bcd60e51b815260206004820152600f60248201526e19195c1bdcda5d0e881c185d5cd959608a1b6044820152606401610715565b60006134668361145f565b6000848152600360209081526040808320338452909152902060028054929350909184916000805160206143b683398151915291879081106134b857634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360049092020101546001600160a01b031614156134e7576134e48461374f565b90505b81546134f490829061426a565b8255825164e8d4a51000906135099083614296565b6135139190614282565b82600101546135229190614229565b60018301556060830151613541906001600160a01b03163330876138f6565b604051818152859033907f9dbb0e7dda3e09710ce75b801addc87cf9d9c6c581641b3275fca409ad086c629060200160405180910390a35050505050565b60085460009081526003602090815260408083206001600160a01b0385168452909152812054806135b35750600092915050565b6135bc8161392e565b9392505050565b6000546001600160a01b031633146135ed5760405162461bcd60e51b8152600401610715906141f4565b6001600160a01b0381166136525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610715565b61365b816138a6565b50565b600080600061366c8561374f565b90508361367a6001836142f4565b148061368557508381145b1561369657848492509250506136e0565b838111156136b2576136a78461374f565b8492509250506136e0565b61270b846136c283612710614296565b6136cc9190614282565b106136da576136a78461374f565b84925090505b9250929050565b6040516001600160a01b03831660248201526044810182905261374a90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613a52565b505050565b6000806000805160206143b683398151915290506000816001600160a01b03166354f703f86040518163ffffffff1660e01b815260040160206040518083038186803b15801561379e57600080fd5b505afa1580156137b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d6919061404f565b90506000826001600160a01b031663ec342ad06040518163ffffffff1660e01b815260040160206040518083038186803b15801561381357600080fd5b505afa158015613827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061384b919061404f565b905060008161385a8488614296565b6138649190614352565b90506000826138738589614296565b61387d9190614282565b90506706f05b59d3b20000821061389c5761389981600161426a565b90505b9695505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052611a179085906323b872dd60e01b90608401613713565b6000806000805160206143b683398151915290506000816001600160a01b03166354f703f86040518163ffffffff1660e01b815260040160206040518083038186803b15801561397d57600080fd5b505afa158015613991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b5919061404f565b90506000826001600160a01b031663ec342ad06040518163ffffffff1660e01b815260040160206040518083038186803b1580156139f257600080fd5b505afa158015613a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a2a919061404f565b9050600082613a398388614296565b613a439190614352565b90506000836138738489614296565b6000613aa7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613b249092919063ffffffff16565b80519091501561374a5780806020019051810190613ac59190613e5a565b61374a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610715565b6060613b338484600085613b3b565b949350505050565b606082471015613b9c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610715565b843b613bea5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610715565b600080866001600160a01b03168587604051613c0691906140eb565b60006040518083038185875af1925050503d8060008114613c43576040519150601f19603f3d011682016040523d82523d6000602084013e613c48565b606091505b5091509150613c58828286613c63565b979650505050505050565b60608315613c725750816135bc565b825115613c825782518084602001fd5b8160405162461bcd60e51b815260040161071591906141c1565b60008083601f840112613cad578182fd5b50813567ffffffffffffffff811115613cc4578182fd5b6020830191508360208260051b85010111156136e057600080fd5b600060208284031215613cf0578081fd5b81356135bc81614392565b600060208284031215613d0c578081fd5b81516135bc81614392565b600080600060408486031215613d2b578182fd5b8335613d3681614392565b9250602084013567ffffffffffffffff811115613d51578283fd5b613d5d86828701613c9c565b9497909650939450505050565b60008060408385031215613d7c578182fd5b8235613d8781614392565b946020939093013593505050565b60008060208385031215613da7578182fd5b823567ffffffffffffffff811115613dbd578283fd5b613dc985828601613c9c565b90969095509350505050565b60008060008060408587031215613dea578081fd5b843567ffffffffffffffff80821115613e01578283fd5b613e0d88838901613c9c565b90965094506020870135915080821115613e25578283fd5b50613e3287828801613c9c565b95989497509550505050565b600060208284031215613e4f578081fd5b81356135bc816143a7565b600060208284031215613e6b578081fd5b81516135bc816143a7565b600080600060408486031215613e8a578283fd5b8335613d36816143a7565b600080600080600060608688031215613eac578081fd5b8535613eb7816143a7565b9450602086013567ffffffffffffffff80821115613ed3578283fd5b613edf89838a01613c9c565b90965094506040880135915080821115613ef7578283fd5b50613f0488828901613c9c565b969995985093965092949392505050565b60008060408385031215613f27578182fd5b8235613d87816143a7565b600080600060608486031215613f46578081fd5b8335613f51816143a7565b95602085013595506040909401359392505050565b600060808284031215613f77578081fd5b6040516080810181811067ffffffffffffffff82111715613fa657634e487b7160e01b83526041600452602483fd5b80604052508251815260208301516020820152604083015160408201526060830151613fd181614392565b60608201529392505050565b600060408284031215613fee578081fd5b6040516040810181811067ffffffffffffffff8211171561401d57634e487b7160e01b83526041600452602483fd5b604052825181526020928301519281019290925250919050565b600060208284031215614048578081fd5b5035919050565b600060208284031215614060578081fd5b5051919050565b60008060408385031215614079578182fd5b82359150602083013561408b81614392565b809150509250929050565b600080604083850312156140a8578182fd5b50508035926020909101359150565b81835260006001600160fb1b038311156140cf578081fd5b8260051b80836020870137939093016020019283525090919050565b600082516140fd81846020870161430b565b9190910192915050565b602081526000613b336020830184866140b7565b60408152600061412f6040830185876140b7565b828103602084810191909152845180835285820192820190845b8181101561416557845183529383019391830191600101614149565b509098975050505050505050565b92151583526001600160a01b03919091166020830152604082015260600190565b84151581526060602082015260006141b06060830185876140b7565b905082604083015295945050505050565b60208152600082518060208401526141e081604085016020870161430b565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600080821280156001600160ff1b038490038513161561424b5761424b614366565b600160ff1b839003841281161561426457614264614366565b50500190565b6000821982111561427d5761427d614366565b500190565b6000826142915761429161437c565b500490565b60008160001904831182151516156142b0576142b0614366565b500290565b60008083128015600160ff1b8501841216156142d3576142d3614366565b6001600160ff1b03840183138116156142ee576142ee614366565b50500390565b60008282101561430657614306614366565b500390565b60005b8381101561432657818101518382015260200161430e565b83811115611a175750506000910152565b600060001982141561434b5761434b614366565b5060010190565b6000826143615761436161437c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b038116811461365b57600080fd5b801515811461365b57600080fdfe000000000000000000000000f0a93d4994b3d98fb5e3a2f90dbc2d69073cb86ba2646970667358221220b42f7025d5910289c4b7a04abec50b8743db63641634b55bacbf2ba76c9161d764736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001aebe9147766936906ab56ec0693306da3539824
-----Decoded View---------------
Arg [0] : _timelock (address): 0x1aeBe9147766936906ab56eC0693306Da3539824
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001aebe9147766936906ab56ec0693306da3539824
Deployed Bytecode Sourcemap
1933:22700:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21005:125;;;;;;:::i;:::-;;:::i;:::-;;5893:98;5969:8;:15;5893:98;;;24254:25:8;;;24242:2;24227:18;5893:98:0;;;;;;;;17226:1077;;;;;;:::i;:::-;;:::i;4693:172::-;;;;;;:::i;:::-;;:::i;2087:26::-;;;;;;:::i;:::-;;:::i;:::-;;;;25390:25:8;;;25446:2;25431:18;;25424:34;;;;25474:18;;;25467:34;-1:-1:-1;;;;;25537:32:8;25532:2;25517:18;;25510:60;25377:3;25362:19;2087:26:0;25344:232:8;2886:31:0;;;;;;;;;;;;;;;11470:14:8;;11463:22;11445:41;;11433:2;11418:18;2886:31:0;11400:92:8;2340:30:0;;;;;;7034:300;;;;;;:::i;:::-;;:::i;4871:169::-;;;;;;:::i;:::-;;:::i;5046:294::-;;;;;;:::i;:::-;;:::i;6266:563::-;;;;;;:::i;:::-;;:::i;23603:26::-;;;;;;;;;13453:779;;;;;;:::i;:::-;;:::i;2021:24::-;;;;;-1:-1:-1;;;;;2021:24:0;;;;;;-1:-1:-1;;;;;9470:32:8;;;9452:51;;9440:2;9425:18;2021:24:0;9407:102:8;2445:22:0;;;;;-1:-1:-1;;;;;2445:22:0;;;18309:1407;;;;;;:::i;:::-;;:::i;7879:981::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;23868:13:8;;23850:32;;23938:4;23926:17;;;23920:24;23898:20;;;23891:54;24001:4;23989:17;;;23983:24;23961:20;;;23954:54;24068:4;24056:17;;;24050:24;-1:-1:-1;;;;;24046:50:8;24024:20;;;24017:80;;;;23837:3;23822:19;;23804:299;19851:658:0;;;;;;:::i;:::-;;:::i;7512:188::-;;;;;;:::i;:::-;;:::i;5346:118::-;;;;;;:::i;:::-;;:::i;2855:25::-;;;;;;;;;2668:46;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4330:140;;;;;;:::i;:::-;;:::i;16217:737::-;;;;;;:::i;:::-;;:::i;1605:92:1:-;;;:::i;23754:877:0:-;;;:::i;20545:24::-;;;;;-1:-1:-1;;;;;20545:24:0;;;20515;;;;;;;;-1:-1:-1;;;;;20515:24:0;;;2525:82;;-1:-1:-1;;;;;;;;;;;2525:82:0;;5470:218;;;:::i;20575:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;973:85:1;1019:7;1045:6;-1:-1:-1;;;;;1045:6:1;973:85;;2177:64:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24741:25:8;;;24797:2;24782:18;;24775:34;;;;24714:18;2177:64:0;24696:119:8;9082:936:0;;;;;;:::i;:::-;;:::i;2412:26::-;;;;;;2636:25;;;;;;14238:998;;;;;;:::i;:::-;;:::i;20874:125::-;;;;;;:::i;:::-;;:::i;21588:1037::-;;;;;;:::i;:::-;;:::i;2377:29::-;;;;;;22631:966;;;;;;:::i;:::-;;:::i;4476:132::-;;;;;;:::i;:::-;;:::i;15567:644::-;;;;;;:::i;:::-;;:::i;21136:446::-;;;;;;:::i;:::-;;:::i;2814:34::-;;;;;12614:688;;;;;;:::i;:::-;;:::i;10182:259::-;;;;;;:::i;:::-;;:::i;1846:189:1:-;;;;;;:::i;:::-;;:::i;21005:125:0:-;1019:7:1;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;;;;;;;;;21070:9:0::1;:18:::0;;-1:-1:-1;;;;;;21070:18:0::1;::::0;-1:-1:-1;;;;;21070:18:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;21103:20:::1;::::0;9452:51:8;;;21103:20:0::1;::::0;9440:2:8;9425:18;21103:20:0::1;;;;;;;;21005:125:::0;:::o;17226:1077::-;17348:6;;;;17347:7;17339:44;;;;-1:-1:-1;;;17339:44:0;;13379:2:8;17339:44:0;;;13361:21:8;13418:2;13398:18;;;13391:30;13457:26;13437:18;;;13430:54;13501:18;;17339:44:0;13351:174:8;17339:44:0;17394:20;17417:15;17428:3;17417:10;:15::i;:::-;17442:21;17466:13;;;:8;:13;;;;;;;;17480:10;17466:25;;;;;;;17514:11;;17572:19;;17394:38;;-1:-1:-1;17466:25:0;;17514:11;;17442:21;2766:4;;17567:24;;17514:11;17567:24;:::i;:::-;17566:46;;;;:::i;:::-;17535:78;;17623:15;17659:4;:15;;;17641:14;:33;;:81;;17721:1;17641:81;;;17702:15;;;;17685:32;;:14;:32;:::i;:::-;17623:99;;17733:15;17751:6;17733:24;;-1:-1:-1;;;;;;;;;;;;;;;;17771:38:0;17779:8;17788:3;17779:13;;;;;;-1:-1:-1;;;17779:13:0;;;;;;;;;;;;;;;;;:21;:13;;;;;:21;;-1:-1:-1;;;;;17779:21:0;17771:38;17767:111;;;17845:22;17856:6;17864:2;17845:10;:22::i;:::-;17825:42;;-1:-1:-1;17825:42:0;-1:-1:-1;17767:111:0;17902:12;17907:7;17902:2;:12;:::i;:::-;17888:26;;17977:19;;2766:4;;17967:29;;:7;:29;:::i;:::-;17966:51;;;;:::i;:::-;17942:76;;:14;:76;:::i;:::-;17924:15;;;:94;18057:11;;18053:81;;18084:7;;:39;;-1:-1:-1;;;18084:39:0;;-1:-1:-1;;;;;18084:7:0;;;;:12;;:39;;18097:4;;18103:10;;18115:7;;18084:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18053:81;18143:12;;;;:45;;-1:-1:-1;;;;;18143:25:0;18169:10;18181:6;18143:25;:45::i;:::-;18204:37;;24254:25:8;;;18228:3:0;;18216:10;;18204:37;;24242:2:8;24227:18;18204:37:0;;;;;;;18256:40;;;12495:14:8;;12488:22;12470:41;;12542:2;12527:18;;12520:34;;;18283:3:0;;18265:10;;18256:40;;12443:18:8;18256:40:0;;;;;;;17226:1077;;;;;;;;;:::o;4693:172::-;4747:4;:12;;;4791:7;;-1:-1:-1;;;;;4791:7:0;4777:10;:21;4769:54;;;;-1:-1:-1;;;4769:54:0;;15907:2:8;4769:54:0;;;15889:21:8;15946:2;15926:18;;;15919:30;-1:-1:-1;;;15965:18:8;;;15958:50;16025:18;;4769:54:0;15879:170:8;4769:54:0;4838:20;;24254:25:8;;;4838:20:0;;24242:2:8;24227:18;4838:20:0;24209:76:8;2087:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2087:26:0;;-1:-1:-1;;;;;2087:26:0;;:::o;7034:300::-;7123:7;;-1:-1:-1;;;;;7123:7:0;7109:10;:21;7101:47;;;;-1:-1:-1;;;7101:47:0;;18415:2:8;7101:47:0;;;18397:21:8;18454:2;18434:18;;;18427:30;-1:-1:-1;;;18473:18:8;;;18466:43;18526:18;;7101:47:0;18387:163:8;7101:47:0;7222:11;7194:8;7203:4;7194:14;;;;;;-1:-1:-1;;;7194:14:0;;;;;;;;;;;;;;;;;;;:25;;;7176:15;;:43;;;;:::i;:::-;:57;;;;:::i;:::-;7158:15;:75;;;;7271:11;7243:8;7252:4;7243:14;;;;;;-1:-1:-1;;;7243:14:0;;;;;;;;;;;;;;;;;;;:25;;:39;;;;7309:4;7298:29;7315:11;7298:29;;;;24254:25:8;;24242:2;24227:18;;24209:76;7298:29:0;;;;;;;;7034:300;;:::o;4871:169::-;1019:7:1;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;4952:14:0::1;:32:::0;;;4999:34:::1;::::0;24254:25:8;;;4999:34:0::1;::::0;24242:2:8;24227:18;4999:34:0::1;24209:76:8::0;5046:294:0;5133:7;;-1:-1:-1;;;;;5133:7:0;5119:10;:21;5111:58;;;;-1:-1:-1;;;5111:58:0;;16256:2:8;5111:58:0;;;16238:21:8;16295:2;16275:18;;;16268:30;16334:26;16314:18;;;16307:54;16378:18;;5111:58:0;16228:174:8;5111:58:0;5203:14;;5187:12;:30;;5179:75;;;;-1:-1:-1;;;5179:75:0;;14445:2:8;5179:75:0;;;14427:21:8;;;14464:18;;;14457:30;14523:34;14503:18;;;14496:62;14575:18;;5179:75:0;14417:182:8;5179:75:0;5264:11;:26;;;5305:28;;24254:25:8;;;5305:28:0;;24242:2:8;24227:18;5305:28:0;24209:76:8;6266:563:0;6357:7;;-1:-1:-1;;;;;6357:7:0;6343:10;:21;6335:47;;;;-1:-1:-1;;;6335:47:0;;17719:2:8;6335:47:0;;;17701:21:8;17758:2;17738:18;;;17731:30;-1:-1:-1;;;17777:18:8;;;17770:43;17830:18;;6335:47:0;17691:163:8;6335:47:0;6411:10;6392:15;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;6441:33:0;;;;;;:14;:33;;;;;;;;6440:34;6432:73;;;;-1:-1:-1;;;6432:73:0;;13732:2:8;6432:73:0;;;13714:21:8;13771:2;13751:18;;;13744:30;13810:28;13790:18;;;13783:56;13856:18;;6432:73:0;13704:176:8;6432:73:0;6542:103;;;;;;;;-1:-1:-1;6542:103:0;;;;;;;;;;6593:12;6542:103;;;;;;-1:-1:-1;;;;;6542:103:0;;;;;;;;;6515:8;:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6515:140:0;;;;;;;;;;;;6665:33;;;:14;:33;;;;;;:40;;-1:-1:-1;;6665:40:0;;;;;;;6720:34;;9452:51:8;;;6720:34:0;;9425:18:8;6720:34:0;;;;;;;6780:8;:15;-1:-1:-1;;;;;6769:53:0;;;6780:19;;6798:1;;6780:19;:::i;:::-;6769:53;;24254:25:8;;;6769:53:0;;24242:2:8;24227:18;6769:53:0;;;;;;;6266:563;;:::o;13453:779::-;13526:6;;;;13525:7;13517:36;;;;-1:-1:-1;;;13517:36:0;;18757:2:8;13517:36:0;;;18739:21:8;18796:2;18776:18;;;18769:30;-1:-1:-1;;;18815:18:8;;;18808:46;18871:18;;13517:36:0;18729:166:8;13517:36:0;13564:20;13587:15;13598:3;13587:10;:15::i;:::-;13612:21;13636:13;;;:8;:13;;;;;;;;13650:10;13636:25;;;;;;;13827:11;;13860:8;:13;;13564:38;;-1:-1:-1;13636:25:0;;13790:6;;-1:-1:-1;;;;;;;;;;;2564:42:0;13645:3;;13860:13;;;;-1:-1:-1;;;13860:13:0;;;;;;;;;;;;;;;;;:21;:13;;;;;:21;;-1:-1:-1;;;;;13860:21:0;13852:38;13848:119;;;13926:30;13937:6;13945:10;13926;:30::i;:::-;13906:50;;-1:-1:-1;13906:50:0;-1:-1:-1;13848:119:0;13991:20;14004:7;13991:10;:20;:::i;:::-;13977:34;;14075:19;;2766:4;;14065:29;;:7;:29;:::i;:::-;14064:51;;;;:::i;:::-;14039:4;:15;;;:77;;;;:::i;:::-;14021:15;;;:95;14127:12;;;;:45;;-1:-1:-1;;;;;14127:25:0;14153:10;14165:6;14127:25;:45::i;:::-;14188:37;;24254:25:8;;;14212:3:0;;14200:10;;14188:37;;24242:2:8;24227:18;14188:37:0;;;;;;;;13453:779;;;;;;:::o;18309:1407::-;18460:6;;;;18459:7;18451:49;;;;-1:-1:-1;;;18451:49:0;;14087:2:8;18451:49:0;;;14069:21:8;14126:2;14106:18;;;14099:30;14165:31;14145:18;;;14138:59;14214:18;;18451:49:0;14059:179:8;18451:49:0;18510:25;18552:7;18538:29;;;;;;-1:-1:-1;;;18538:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18538:29:0;-1:-1:-1;18510:57:0;-1:-1:-1;18578:15:0;;18603:895;18623:15;;;18603:895;;;18659:11;18673:4;;18678:1;18673:7;;;;;-1:-1:-1;;;18673:7:0;;;;;;;;;;;;;;;18659:21;;18694:14;18711:7;;18719:1;18711:10;;;;;-1:-1:-1;;;18711:10:0;;;;;;;;;;;;;;;18694:27;;18735:20;18758:15;18769:3;18758:10;:15::i;:::-;18787:21;18811:13;;;:8;:13;;;;;;;;18825:10;18811:25;;;;;;;18863:11;;18925:19;;18735:38;;-1:-1:-1;18811:25:0;;18863:11;;18787:21;2766:4;;18920:24;;18863:11;18920:24;:::i;:::-;18919:46;;;;:::i;:::-;18888:78;;19009:4;:15;;;18991:14;:33;;:81;;19071:1;18991:81;;;19052:15;;;;19035:32;;:14;:32;:::i;:::-;18980:92;;;;:::i;:::-;;;19087:15;19105:6;19087:24;;-1:-1:-1;;;;;;;;;;;;;;;;19129:38:0;19137:8;19146:3;19137:13;;;;;;-1:-1:-1;;;19137:13:0;;;;;;;;;;;;;;;;;:21;:13;;;;;:21;;-1:-1:-1;;;;;19137:21:0;19129:38;19125:119;;;19207:22;19218:6;19226:2;19207:10;:22::i;:::-;19187:42;;-1:-1:-1;19187:42:0;-1:-1:-1;19125:119:0;19272:7;19258:8;19267:1;19258:11;;;;;;-1:-1:-1;;;19258:11:0;;;;;;;;;;;;;;;;;;:21;19307:12;19312:7;19307:2;:12;:::i;:::-;19293:26;;19386:19;;2766:4;;19376:29;;:7;:29;:::i;:::-;19375:51;;;;:::i;:::-;19351:76;;:14;:76;:::i;:::-;19333:15;;;:94;19442:12;;;;:45;;-1:-1:-1;;;;;19442:25:0;19468:10;19480:6;19442:25;:45::i;:::-;18603:895;;;;;;;18640:3;;;;;:::i;:::-;;;;18603:895;;;-1:-1:-1;19512:11:0;;19508:81;;19539:7;;:39;;-1:-1:-1;;;19539:39:0;;-1:-1:-1;;;;;19539:7:0;;;;:12;;:39;;19552:4;;19558:10;;19570:7;;19539:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19508:81;19621:10;-1:-1:-1;;;;;19604:44:0;;19633:4;;19639:8;19604:44;;;;;;;;:::i;:::-;;;;;;;;19677:10;-1:-1:-1;;;;;19663:46:0;;19689:4;19695;;19701:7;19663:46;;;;;;;;;:::i;:::-;;;;;;;;18309:1407;;;;;;;:::o;7879:981::-;7928:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7928:20:0;7987:15;;8020:20;8012:65;;;;-1:-1:-1;;;8012:65:0;;19102:2:8;8012:65:0;;;19084:21:8;;;19121:18;;;19114:30;19180:34;19160:18;;;19153:62;19232:18;;8012:65:0;19074:182:8;8012:65:0;8094:8;8103:3;8094:13;;;;;;-1:-1:-1;;;8094:13:0;;;;;;;;;;;;;;;;;;8087:20;;;;;;;;8094:13;;;;;;;8087:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8087:20:0;;;;;;-1:-1:-1;8121:12:0;:35;8117:737;;;8191:12;;;;:37;;-1:-1:-1;;;8191:37:0;;8222:4;8191:37;;;9452:51:8;8172:16:0;;-1:-1:-1;;;;;8191:22:0;;;;9425:18:8;;8191:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8172:56;;-1:-1:-1;;;;;;;;;;;;;;;;8246:38:0;8254:8;8263:3;8254:13;;;;;;-1:-1:-1;;;8254:13:0;;;;;;;;;;;;;;;;;:21;:13;;;;;:21;;-1:-1:-1;;;;;8254:21:0;8246:38;8242:112;;;8315:24;8330:8;8315:14;:24::i;:::-;8304:35;;8242:112;8371:12;;8367:304;;8403:14;8435:4;:20;;;8420:12;:35;;;;:::i;:::-;8403:52;;8473:17;8536:16;8517:4;:15;;;8503:11;;8494:6;:20;;;;:::i;:::-;:38;;;;:::i;:::-;8493:59;;;;:::i;:::-;8473:79;-1:-1:-1;8648:8:0;8615:29;2766:4;8473:79;8615:29;:::i;:::-;8614:42;;;;:::i;:::-;8592:19;;:64;;;;:::i;:::-;8570:86;;-1:-1:-1;;8367:304:0;8707:12;8684:20;;;:35;8733:8;:13;;8684:4;;8733:8;8742:3;;8733:13;;;;-1:-1:-1;;;8733:13:0;;;;;;;;;;;;;;;;;;:20;;:13;;;;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8733:20:0;-1:-1:-1;;;;;8733:20:0;;;;;;;;;;8791;;;;8823:19;;8772:71;;25022:25:8;;;25063:18;;;25056:34;;;25106:18;;;25099:34;;;;8786:3:0;;8772:71;;24995:18:8;8772:71:0;;;;;;;8117:737;;7879:981;;;;:::o;19851:658::-;19917:6;;;;19916:7;19908:45;;;;-1:-1:-1;;;19908:45:0;;18061:2:8;19908:45:0;;;18043:21:8;18100:2;18080:18;;;18073:30;18139:27;18119:18;;;18112:55;18184:18;;19908:45:0;18033:175:8;19908:45:0;19964:20;19987:15;19998:3;19987:10;:15::i;:::-;20012:21;20036:13;;;:8;:13;;;;;;;;20050:10;20036:25;;;;;;;20088:11;;20121:8;:13;;19964:38;;-1:-1:-1;20036:25:0;;20088:11;;-1:-1:-1;;;;;;;;;;;2564:42:0;20045:3;;20121:13;;;;-1:-1:-1;;;20121:13:0;;;;;;;;;;;;;;;;;:21;:13;;;;;:21;;-1:-1:-1;;;;;20121:21:0;20113:38;20109:224;;;20167:10;-1:-1:-1;;;;;;;;;;;20167:24:0;;20205:14;20222:4;-1:-1:-1;;;;;20222:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20205:30;;20249:12;20264:4;-1:-1:-1;;;;;20264:9:0;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20249:26;-1:-1:-1;20316:6:0;20299:13;20249:26;20299:6;:13;:::i;:::-;20298:24;;;;:::i;:::-;20289:33;;20109:224;;;;20356:1;20342:15;;;20367;;;:19;20397:12;;;;:45;;-1:-1:-1;;;;;20397:25:0;20423:10;20435:6;20397:25;:45::i;:::-;20457;;24254:25:8;;;20490:3:0;;20478:10;;20457:45;;24242:2:8;24227:18;20457:45:0;;;;;;;19851:658;;;;:::o;7512:188::-;7595:4;7581:11;7616:78;7640:3;7636:1;:7;7616:78;;;7664:19;7675:4;;7680:1;7675:7;;;;;-1:-1:-1;;;7675:7:0;;;;;;;;;;;;;;;7664:10;:19::i;:::-;-1:-1:-1;7645:3:0;;;:::i;:::-;;;7616:78;;;;7512:188;;;:::o;5346:118::-;4087:10;-1:-1:-1;;;;;4101:9:0;4087:23;;4079:58;;;;-1:-1:-1;;;4079:58:0;;16609:2:8;4079:58:0;;;16591:21:8;16648:2;16628:18;;;16621:30;-1:-1:-1;;;16667:18:8;;;16660:52;16729:18;;4079:58:0;16581:172:8;4079:58:0;5409:6:::1;:14:::0;;-1:-1:-1;;5409:14:0::1;::::0;::::1;;::::0;;::::1;::::0;;;5438:19:::1;::::0;11445:41:8;;;5438:19:0::1;::::0;11433:2:8;11418:18;5438:19:0::1;11400:92:8::0;4330:140:0;1019:7:1;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;4397:7:0::1;:29:::0;;-1:-1:-1;;;;;;4397:29:0::1;-1:-1:-1::0;;;;;4397:29:0;::::1;::::0;;::::1;::::0;;;4441:22:::1;::::0;9452:51:8;;;4441:22:0::1;::::0;9440:2:8;9425:18;4441:22:0::1;9407:102:8::0;16217:737:0;16301:6;;;;16300:7;16292:38;;;;-1:-1:-1;;;16292:38:0;;22069:2:8;16292:38:0;;;22051:21:8;22108:2;22088:18;;;22081:30;-1:-1:-1;;;22127:18:8;;;22120:48;22185:18;;16292:38:0;22041:168:8;16292:38:0;16341:15;;16366:429;16386:15;;;16366:429;;;16422:20;16445:19;16456:4;;16461:1;16456:7;;;;;-1:-1:-1;;;16456:7:0;;;;;;;;16445:19;16422:42;;16478:21;16502:8;:17;16511:4;;16516:1;16511:7;;;;;-1:-1:-1;;;16511:7:0;;;;;;;;;;;;;;;;;;16502:17;;-1:-1:-1;16502:17:0;;;;;;;;;;;-1:-1:-1;16502:17:0;;;16520:10;16502:29;;;;;;;16591:19;;16577:11;;16502:29;;-1:-1:-1;2766:4:0;;16577:33;;16591:19;16577:33;:::i;:::-;16576:55;;;;:::i;:::-;16545:87;;16675:4;:15;;;16657:14;:33;;:81;;16737:1;16657:81;;;16718:15;;;;16701:32;;:14;:32;:::i;:::-;16646:92;;;;:::i;:::-;16752:15;;;;:32;16646:92;-1:-1:-1;16403:3:0;;-1:-1:-1;16403:3:0;;;:::i;:::-;;;;16366:429;;;-1:-1:-1;16809:11:0;;16805:81;;16836:7;;:39;;-1:-1:-1;;;16836:39:0;;-1:-1:-1;;;;;16836:7:0;;;;:12;;:39;;16849:4;;16855:10;;16867:7;;16836:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16805:81;16915:10;-1:-1:-1;;;;;16901:46:0;;16927:4;16933;;16939:7;16901:46;;;;;;;;;:::i;:::-;;;;;;;;16217:737;;;;:::o;1605:92:1:-;1019:7;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;1669:21:::1;1687:1;1669:9;:21::i;:::-;1605:92::o:0;23754:877:0:-;1019:7:1;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;23817:14:0::1;::::0;::::1;;23816:15;23808:55;;;::::0;-1:-1:-1;;;23808:55:0;;20176:2:8;23808:55:0::1;::::0;::::1;20158:21:8::0;20215:2;20195:18;;;20188:30;20254:29;20234:18;;;20227:57;20301:18;;23808:55:0::1;20148:177:8::0;23808:55:0::1;23881:9;::::0;;;::::1;-1:-1:-1::0;;;;;23881:9:0::1;23873:59;;;::::0;-1:-1:-1;;;23873:59:0;;19463:2:8;23873:59:0::1;::::0;::::1;19445:21:8::0;19502:2;19482:18;;;19475:30;-1:-1:-1;;;19521:18:8;;;19514:53;19584:18;;23873:59:0::1;19435:173:8::0;23873:59:0::1;23943:16;23972:9;;;;;;;;;-1:-1:-1::0;;;;;23972:9:0::1;23943:39;;24002:6;-1:-1:-1::0;;;;;24002:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23992:7;;:26;;;;;-1:-1:-1::0;;;;;23992:26:0::1;;;;;-1:-1:-1::0;;;;;23992:26:0::1;;;;;;24045:6;-1:-1:-1::0;;;;;24045:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24028:14;:40;;;;24079:11;24093:6;-1:-1:-1::0;;;;;24093:17:0::1;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24079:33;;24127:9;24122:429;24146:3;24142:1;:7;24122:429;;;24191:18;::::0;-1:-1:-1;;;24191:18:0;;::::1;::::0;::::1;24254:25:8::0;;;24170:18:0::1;::::0;-1:-1:-1;;;;;24191:15:0;::::1;::::0;::::1;::::0;24227:18:8;;24191::0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24254:216;::::0;;::::1;::::0;::::1;::::0;;24393:17;;24254:216;;-1:-1:-1;24254:216:0::1;::::0;;::::1;::::0;;;24337:18;;::::1;::::0;24254:216;;;;;;;24441:10;;::::1;::::0;;-1:-1:-1;;;;;24254:216:0;;::::1;::::0;;;;;;24223:8:::1;:261:::0;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24223:261:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;24521:10;;24498:35;;::::1;::::0;;:14:::1;:35:::0;;;;:42;;-1:-1:-1;;24498:42:0::1;::::0;;::::1;::::0;;-1:-1:-1;24151:3:0;::::1;::::0;::::1;:::i;:::-;;;;24122:429;;;-1:-1:-1::0;24561:14:0::1;:21:::0;;24578:4:::1;-1:-1:-1::0;;24561:21:0;;::::1;;::::0;;24614:9:::1;::::0;24597:27:::1;::::0;24614:9;;;::::1;-1:-1:-1::0;;;;;24614:9:0::1;9452:51:8::0;;24597:27:0::1;::::0;9440:2:8;9425:18;24597:27:0::1;;;;;;;;1255:1:1;;23754:877:0:o:0;5470:218::-;1019:7:1;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;5529:11:0::1;::::0;::::1;::::0;::::1;;;:20;5521:74;;;::::0;-1:-1:-1;;;5521:74:0;;20890:2:8;5521:74:0::1;::::0;::::1;20872:21:8::0;20929:2;20909:18;;;20902:30;20968:34;20948:18;;;20941:62;-1:-1:-1;;;21019:18:8;;;21012:39;21068:19;;5521:74:0::1;20862:231:8::0;5521:74:0::1;5605:6;:14:::0;;-1:-1:-1;;5629:18:0;5605:14:::1;5629:18;::::0;;5662:19:::1;::::0;-1:-1:-1;11445:41:8;;5662:19:0::1;::::0;11433:2:8;11418:18;5662:19:0::1;;;;;;;5470:218::o:0;9082:936::-;9199:15;;9153:7;;9228:21;9224:35;;9258:1;9251:8;;;;;9224:35;9269:20;9292:8;9301:4;9292:14;;;;;;-1:-1:-1;;;9292:14:0;;;;;;;;;;;;;;;;;9269:37;;;;;;;;9292:14;;;;;;;9269:37;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9269:37:0;;;;;;;;;9339:14;;;;;;;;;:21;;;;;;;;;;9316:44;;;;;;;;;;;;;;;;;;;;;9392:19;;9440:12;;:37;;-1:-1:-1;;;9440:37:0;;9471:4;9440:37;;;9452:51:8;;;;9269:37:0;;-1:-1:-1;9316:44:0;;9392:19;;9292:14;;9440:22;;;;9425:18:8;;9440:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9421:56;;-1:-1:-1;;;;;;;;;;;;;;;;9491:39:0;9499:8;9508:4;9499:14;;;;;;-1:-1:-1;;;9499:14:0;;;;;;;;;;;;;;;;;:22;:14;;;;;:22;;-1:-1:-1;;;;;9499:22:0;9491:39;9487:105;;;9557:24;9572:8;9557:14;:24::i;:::-;9546:35;;9487:105;9620:4;:20;;;9605:12;:35;:52;;;;-1:-1:-1;9644:13:0;;;9605:52;9601:312;;;9673:14;9705:4;:20;;;9690:12;:35;;;;:::i;:::-;9673:52;;9739:17;9802:16;9783:4;:15;;;9769:11;;9760:6;:20;;;;:::i;:::-;:38;;;;:::i;:::-;9759:59;;;;:::i;:::-;9739:79;-1:-1:-1;9894:8:0;9861:29;2766:4;9739:79;9861:29;:::i;:::-;9860:42;;;;:::i;:::-;9846:56;;:11;:56;:::i;:::-;9832:70;;9601:312;;;9995:15;;;;9945:11;;2766:4;;9945:25;;9959:11;;9945:25;:::i;:::-;9944:47;;;;:::i;:::-;9937:73;;;;:::i;:::-;9922:89;;;;;;;9082:936;;;;;:::o;14238:998::-;14340:6;;;;14339:7;14331:41;;;;-1:-1:-1;;;14331:41:0;;14806:2:8;14331:41:0;;;14788:21:8;14845:2;14825:18;;;14818:30;-1:-1:-1;;;14864:18:8;;;14857:51;14925:18;;14331:41:0;14778:171:8;14331:41:0;14382:25;14424:7;14410:29;;;;;;-1:-1:-1;;;14410:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14410:29:0;;14382:57;;14455:9;14450:720;14470:15;;;14450:720;;;14506:11;14520:4;;14525:1;14520:7;;;;;-1:-1:-1;;;14520:7:0;;;;;;;;;;;;;;;14506:21;;14541:14;14558:7;;14566:1;14558:10;;;;;-1:-1:-1;;;14558:10:0;;;;;;;;;;;;;;;14541:27;;14582:20;14605:15;14616:3;14605:10;:15::i;:::-;14634:21;14658:13;;;:8;:13;;;;;;;;14672:10;14658:25;;;;;;;14757:11;;14794:8;:13;;14582:38;;-1:-1:-1;14658:25:0;;14716:6;;-1:-1:-1;;;;;;;;;;;2564:42:0;14667:3;;14794:13;;;;-1:-1:-1;;;14794:13:0;;;;;;;;;;;;;;;;;:21;:13;;;;;:21;;-1:-1:-1;;;;;14794:21:0;14786:38;14782:127;;;14864:30;14875:6;14883:10;14864;:30::i;:::-;14844:50;;-1:-1:-1;14844:50:0;-1:-1:-1;14782:127:0;14936:7;14922:8;14931:1;14922:11;;;;;;-1:-1:-1;;;14922:11:0;;;;;;;;;;;;;;;;;;:21;14972:19;14985:6;14972:10;:19;:::i;:::-;14958:33;;15059:19;;2766:4;;15049:29;;:7;:29;:::i;:::-;15048:51;;;;:::i;:::-;15023:4;:15;;;:77;;;;:::i;:::-;15005:15;;;:95;15114:12;;;;:45;;-1:-1:-1;;;;;15114:25:0;15140:10;15152:6;15114:25;:45::i;:::-;14450:720;;;;;;14487:3;;;;;:::i;:::-;;;;14450:720;;;;15202:10;-1:-1:-1;;;;;15185:44:0;;15214:4;;15220:8;15185:44;;;;;;;;:::i;:::-;;;;;;;;14238:998;;;;;:::o;20874:125::-;1019:7:1;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;20939:9:0::1;:18:::0;;-1:-1:-1;;;;;;20939:18:0::1;-1:-1:-1::0;;;;;20939:18:0;::::1;::::0;;::::1;::::0;;;20972:20:::1;::::0;9452:51:8;;;20972:20:0::1;::::0;9440:2:8;9425:18;20972:20:0::1;9407:102:8::0;21588:1037:0;21675:9;;;;;-1:-1:-1;;;;;21675:9:0;21661:10;:23;21653:59;;;;-1:-1:-1;;;21653:59:0;;16960:2:8;21653:59:0;;;16942:21:8;16999:2;16979:18;;;16972:30;17038:25;17018:18;;;17011:53;17081:18;;21653:59:0;16932:173:8;21653:59:0;21782:9;;21723:24;;21782:9;;;-1:-1:-1;;;;;21782:9:0;21723:24;21802:736;21822:15;;;21802:736;;;21858:18;21879:6;-1:-1:-1;;;;;21879:15:0;;21895:4;;21900:1;21895:7;;;;;-1:-1:-1;;;21895:7:0;;;;;;;;;;;;;;;21879:24;;;;;;;;;;;;;24254:25:8;;24242:2;24227:18;;24209:76;21879:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21949:10;;;;-1:-1:-1;;;;;21926:35:0;;;;;:14;:35;;;;;;21858:45;;-1:-1:-1;21926:35:0;;21925:36;21917:83;;;;-1:-1:-1;;;21917:83:0;;23454:2:8;21917:83:0;;;23436:21:8;23493:2;23473:18;;;23466:30;23532:34;23512:18;;;23505:62;-1:-1:-1;;;23583:18:8;;;23576:32;23625:19;;21917:83:0;23426:224:8;21917:83:0;22045:228;;;;;;;;22196:17;;22045:228;;;22088:13;;;;;22045:228;;;;;;22140:18;;;;22045:228;;;;;;;22244:10;;;;-1:-1:-1;;;;;22045:228:0;;;;;;;;;22014:8;:273;;;;;;;-1:-1:-1;22014:273:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22014:273:0;;;;;;;;;;;22321:13;22301:33;;;;:::i;:::-;22365:10;;;;22386:9;;22365:31;;-1:-1:-1;;;22365:31:0;;-1:-1:-1;;;;;22386:9:0;;;;;;22365:31;;;9452:51:8;22301:33:0;;-1:-1:-1;;;22365:20:0;;;;;9425:18:8;;22365:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22438:9;;22410:10;;;;22348:48;;-1:-1:-1;22410:61:0;;-1:-1:-1;;;;;22410:27:0;;;;22438:9;;;;22457:4;22348:48;22410:27;:61::i;:::-;-1:-1:-1;22508:10:0;;;-1:-1:-1;;;;;22485:35:0;;;;;:14;:35;;;;;:42;;-1:-1:-1;;22485:42:0;22523:4;22485:42;;;21839:3;;;;:::i;:::-;;;;21802:736;;;;22566:16;22547:15;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;22598:20:0;;;;;;22613:4;;;;22598:20;:::i;:::-;;;;;;;;21588:1037;;;;:::o;22631:966::-;22722:6;;;;22721:7;22713:39;;;;-1:-1:-1;;;22713:39:0;;23106:2:8;22713:39:0;;;23088:21:8;23145:2;23125:18;;;23118:30;-1:-1:-1;;;23164:18:8;;;23157:49;23223:18;;22713:39:0;23078:169:8;22713:39:0;22771:9;;;;;-1:-1:-1;;;;;22771:9:0;22763:59;;;;-1:-1:-1;;;22763:59:0;;19463:2:8;22763:59:0;;;19445:21:8;19502:2;19482:18;;;19475:30;-1:-1:-1;;;19521:18:8;;;19514:53;19584:18;;22763:59:0;19435:173:8;22763:59:0;22858:9;;;;;-1:-1:-1;;;;;22858:9:0;22833:14;22878:668;22898:15;;;22878:668;;;22934:11;22948:4;;22953:1;22948:7;;;;;-1:-1:-1;;;22948:7:0;;;;;;;;;-1:-1:-1;;;;;22978:21:0;;;;;;:12;22948:7;22978:21;;;;;;;22948:7;;;;;;;;22978:26;;;;;;;;;;;22948:7;;-1:-1:-1;;22978:26:0;;22977:27;22969:69;;;;-1:-1:-1;;;22969:69:0;;20532:2:8;22969:69:0;;;20514:21:8;20571:2;20551:18;;;20544:30;20610:31;20590:18;;;20583:59;20659:18;;22969:69:0;20504:179:8;22969:69:0;23077:29;;-1:-1:-1;;;23077:29:0;;;;;24464:25:8;;;-1:-1:-1;;;;;24525:32:8;;;24505:18;;;24498:60;23053:21:0;;23077:15;;;;;;24437:18:8;;23077:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23124:12;;23053:53;;-1:-1:-1;23124:16:0;23120:416;;23160:19;23182:13;;;:8;:13;;;;;;;;-1:-1:-1;;;;;23182:22:0;;;;;;;;;23234:8;:13;;-1:-1:-1;;;;;;;;;;;2564:42:0;23234:8;23191:3;;23234:13;;;;-1:-1:-1;;;23234:13:0;;;;;;;;;;;;;;;;;:21;:13;;;;;:21;;-1:-1:-1;;;;;23234:21:0;23226:38;23222:198;;;23316:12;;23301:28;;:14;:28::i;:::-;23288:2;:9;;;:41;;;;;;;:::i;:::-;;;;-1:-1:-1;23222:198:0;;-1:-1:-1;23222:198:0;;23389:12;;23376:25;;:2;;23389:12;;23376:25;;23389:12;;23376:25;:::i;:::-;;;;-1:-1:-1;;23222:198:0;23454:5;:16;;;23437:2;:13;;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;23488:21:0;;;;;;:12;:21;;;;;;;;:26;;;;;;;;:33;;-1:-1:-1;;23488:33:0;23517:4;23488:33;;;23120:416;22878:668;;22915:3;;;;;:::i;:::-;;;;22878:668;;;;23576:7;-1:-1:-1;;;;;23561:29:0;;23585:4;;23561:29;;;;;;;:::i;4476:132::-;1019:7:1;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;4543:7:0::1;:18:::0;;-1:-1:-1;;;;;;4543:18:0::1;-1:-1:-1::0;;;;;4543:18:0;::::1;::::0;;::::1;::::0;;;4576:25:::1;::::0;9452:51:8;;;4576:25:0::1;::::0;9440:2:8;9425:18;4576:25:0::1;9407:102:8::0;15567:644:0;15632:6;;;;15631:7;15623:33;;;;-1:-1:-1;;;15623:33:0;;22764:2:8;15623:33:0;;;22746:21:8;22803:2;22783:18;;;22776:30;-1:-1:-1;;;22822:18:8;;;22815:43;22875:18;;15623:33:0;22736:163:8;15623:33:0;15667:20;15690:15;15701:3;15690:10;:15::i;:::-;15715:21;15739:13;;;:8;:13;;;;;;;;15753:10;15739:25;;;;;;;15821:19;;15807:11;;15667:38;;-1:-1:-1;15739:25:0;;2766:4;;15807:33;;;:::i;:::-;15806:55;;;;:::i;:::-;15775:87;;15872:15;15908:4;:15;;;15890:14;:33;;:81;;15970:1;15890:81;;;15951:15;;;;15934:32;;:14;:32;:::i;:::-;16001:15;;;:32;;;15872:99;-1:-1:-1;16072:11:0;;16068:81;;16099:7;;:39;;-1:-1:-1;;;16099:39:0;;-1:-1:-1;;;;;16099:7:0;;;;:12;;:39;;16112:4;;16118:10;;16130:7;;16099:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16068:81;16164:40;;;12495:14:8;;12488:22;12470:41;;12542:2;12527:18;;12520:34;;;16191:3:0;;16173:10;;16164:40;;12443:18:8;16164:40:0;12425:135:8;21136:446:0;4087:10;-1:-1:-1;;;;;4101:9:0;4087:23;;4079:58;;;;-1:-1:-1;;;4079:58:0;;16609:2:8;4079:58:0;;;16591:21:8;16648:2;16628:18;;;16621:30;-1:-1:-1;;;16667:18:8;;;16660:52;16729:18;;4079:58:0;16581:172:8;4079:58:0;21218:9:::1;::::0;-1:-1:-1;;;;;21218:9:0::1;21210:55;;;::::0;-1:-1:-1;;;21210:55:0;;22416:2:8;21210:55:0::1;::::0;::::1;22398:21:8::0;22455:2;22435:18;;;22428:30;-1:-1:-1;;;22474:18:8;;;22467:49;22533:18;;21210:55:0::1;22388:169:8::0;21210:55:0::1;21281:9;21276:222;21296:15:::0;;::::1;21276:222;;;21332:18;21353:8;21362:4;;21367:1;21362:7;;;;;-1:-1:-1::0;;;21362:7:0::1;;;;;;;;;;;;;;;21353:17;;;;;;-1:-1:-1::0;;;21353:17:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;21332:38:::1;::::0;;::::1;::::0;::::1;::::0;;21353:17:::1;::::0;;::::1;::::0;;::::1;21332:38:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;21332:38:0::1;::::0;;;;;;21401:35;;-1:-1:-1;;;21401:35:0;;21430:4:::1;21401:35:::0;;::::1;9452:51:8::0;;;;21332:38:0;-1:-1:-1;21332:38:0;21401:20:::1;::::0;9425:18:8;;21401:35:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21450:10;::::0;::::1;::::0;21469:9:::1;::::0;21450:37:::1;::::0;-1:-1:-1;;;21450:37:0;;-1:-1:-1;;;;;21469:9:0;;::::1;21450:37;::::0;::::1;10068:51:8::0;10135:18;;;10128:34;;;21384:52:0;;-1:-1:-1;21450:18:0::1;::::0;::::1;::::0;10041::8;;21450:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21276:222;;21313:3;;;;;:::i;:::-;;;;21276:222;;;-1:-1:-1::0;21516:9:0::1;::::0;21508:36:::1;::::0;-1:-1:-1;;;21508:36:0;;-1:-1:-1;;;;;21516:9:0;;::::1;::::0;21508:30:::1;::::0;:36:::1;::::0;21539:4;;;;21508:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21559:16;21570:4;;21559:16;;;;;;;:::i;12614:688::-:0;12686:6;;;;12685:7;12677:35;;;;-1:-1:-1;;;12677:35:0;;15563:2:8;12677:35:0;;;15545:21:8;15602:2;15582:18;;;15575:30;-1:-1:-1;;;15621:18:8;;;15614:45;15676:18;;12677:35:0;15535:165:8;12677:35:0;12723:20;12746:15;12757:3;12746:10;:15::i;:::-;12771:21;12795:13;;;:8;:13;;;;;;;;12809:10;12795:25;;;;;;;12929:8;:13;;12723:38;;-1:-1:-1;12795:25:0;;12901:6;;-1:-1:-1;;;;;;;;;;;2564:42:0;12804:3;;12929:13;;;;-1:-1:-1;;;12929:13:0;;;;;;;;;;;;;;;;;:21;:13;;;;;:21;;-1:-1:-1;;;;;12929:21:0;12921:38;12917:101;;;12985:22;13000:6;12985:14;:22::i;:::-;12975:32;;12917:101;13042:11;;:21;;13056:7;;13042:21;:::i;:::-;13028:35;;13127:19;;2766:4;;13117:29;;:7;:29;:::i;:::-;13116:51;;;;:::i;:::-;13091:4;:15;;;:77;;;;:::i;:::-;13073:15;;;:95;13179:12;;;;:64;;-1:-1:-1;;;;;13179:29:0;13209:10;13229:4;13236:6;13179:29;:64::i;:::-;13259:36;;24254:25:8;;;13282:3:0;;13270:10;;13259:36;;24242:2:8;24227:18;13259:36:0;;;;;;;12614:688;;;;;:::o;10182:259::-;10287:4;;10238:7;10278:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;10278:20:0;;;;;;;;;:27;10319:15;10315:120;;-1:-1:-1;10357:1:0;;10182:259;-1:-1:-1;;10182:259:0:o;10315:120::-;10396:28;10413:10;10396:16;:28::i;:::-;10389:35;10182:259;-1:-1:-1;;;10182:259:0:o;1846:189:1:-;1019:7;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;1934:22:1;::::1;1926:73;;;::::0;-1:-1:-1;;;1926:73:1;;15156:2:8;1926:73:1::1;::::0;::::1;15138:21:8::0;15195:2;15175:18;;;15168:30;15234:34;15214:18;;;15207:62;-1:-1:-1;;;15285:18:8;;;15278:36;15331:19;;1926:73:1::1;15128:228:8::0;1926:73:1::1;2009:19;2019:8;2009:9;:19::i;:::-;1846:189:::0;:::o;11922:528:0:-;12009:7;12018;12037:18;12058:30;12073:14;12058;:30::i;:::-;12037:51;-1:-1:-1;12120:10:0;12102:14;12115:1;12037:51;12102:14;:::i;:::-;:28;:56;;;;12148:10;12134;:24;12102:56;12098:345;;;12168:14;12184:10;12160:35;;;;;;;12098:345;12227:10;12214;:23;12210:233;;;12247:26;12262:10;12247:14;:26::i;:::-;12275:10;12239:47;;;;;;;12210:233;12340:4;12326:10;12306:16;:10;12319:3;12306:16;:::i;:::-;12305:31;;;;:::i;:::-;:39;12301:142;;12354:26;12369:10;12354:14;:26::i;12301:142::-;12416:14;;-1:-1:-1;12432:10:0;-1:-1:-1;11922:528:0;;;;;;:::o;634:205:5:-;773:58;;-1:-1:-1;;;;;10086:32:8;;773:58:5;;;10068:51:8;10135:18;;;10128:34;;;746:86:5;;766:5;;-1:-1:-1;;;796:23:5;10041:18:8;;773:58:5;;;;-1:-1:-1;;773:58:5;;;;;;;;;;;;;;-1:-1:-1;;;;;773:58:5;-1:-1:-1;;;;;;773:58:5;;;;;;;;;;746:19;:86::i;:::-;634:205;;;:::o;10794:383:0:-;10857:7;10876:10;-1:-1:-1;;;;;;;;;;;10876:24:0;;10910:14;10927:4;-1:-1:-1;;;;;10927:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10910:30;;10950:12;10965:4;-1:-1:-1;;;;;10965:9:0;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10950:26;-1:-1:-1;10986:12:0;10950:26;11002:15;11011:6;11002;:15;:::i;:::-;11001:24;;;;:::i;:::-;10986:39;-1:-1:-1;11035:14:0;11072:4;11053:15;11062:6;11053;:15;:::i;:::-;11052:24;;;;:::i;:::-;11035:41;;11098:4;11090;:12;11086:62;;11127:10;:6;11136:1;11127:10;:::i;:::-;11118:19;;11086:62;11164:6;10794:383;-1:-1:-1;;;;;;10794:383:0:o;2041:169:1:-;2096:16;2115:6;;-1:-1:-1;;;;;2131:17:1;;;-1:-1:-1;;;;;;2131:17:1;;;;;;2163:40;;2115:6;;;;;;;2163:40;;2096:16;2163:40;2041:169;;:::o;845:241:5:-;1010:68;;-1:-1:-1;;;;;9772:15:8;;;1010:68:5;;;9754:34:8;9824:15;;9804:18;;;9797:43;9856:18;;;9849:34;;;983:96:5;;1003:5;;-1:-1:-1;;;1033:27:5;9689:18:8;;1010:68:5;9671:218:8;11294:385:0;11359:7;11378:10;-1:-1:-1;;;;;;;;;;;11378:24:0;;11412:14;11429:4;-1:-1:-1;;;;;11429:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11412:30;;11452:12;11467:4;-1:-1:-1;;;;;11467:9:0;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11452:26;-1:-1:-1;11488:12:0;11521:6;11504:13;11452:26;11504:6;:13;:::i;:::-;11503:24;;;;:::i;:::-;11488:39;-1:-1:-1;11537:14:0;11572:6;11555:13;11564:4;11555:6;:13;:::i;3140:706:5:-;3559:23;3585:69;3613:4;3585:69;;;;;;;;;;;;;;;;;3593:5;-1:-1:-1;;;;;3585:27:5;;;:69;;;;;:::i;:::-;3668:17;;3559:95;;-1:-1:-1;3668:21:5;3664:176;;3763:10;3752:30;;;;;;;;;;;;:::i;:::-;3744:85;;;;-1:-1:-1;;;3744:85:5;;21658:2:8;3744:85:5;;;21640:21:8;21697:2;21677:18;;;21670:30;21736:34;21716:18;;;21709:62;-1:-1:-1;;;21787:18:8;;;21780:40;21837:19;;3744:85:5;21630:232:8;3461:223:6;3594:12;3625:52;3647:6;3655:4;3661:1;3664:12;3625:21;:52::i;:::-;3618:59;3461:223;-1:-1:-1;;;;3461:223:6:o;4548:499::-;4713:12;4770:5;4745:21;:30;;4737:81;;;;-1:-1:-1;;;4737:81:6;;17312:2:8;4737:81:6;;;17294:21:8;17351:2;17331:18;;;17324:30;17390:34;17370:18;;;17363:62;-1:-1:-1;;;17441:18:8;;;17434:36;17487:19;;4737:81:6;17284:228:8;4737:81:6;1034:20;;4828:60;;;;-1:-1:-1;;;4828:60:6;;21300:2:8;4828:60:6;;;21282:21:8;21339:2;21319:18;;;21312:30;21378:31;21358:18;;;21351:59;21427:18;;4828:60:6;21272:179:8;4828:60:6;4900:12;4914:23;4941:6;-1:-1:-1;;;;;4941:11:6;4960:5;4967:4;4941:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4899:73;;;;4989:51;5006:7;5015:10;5027:12;4989:16;:51::i;:::-;4982:58;4548:499;-1:-1:-1;;;;;;;4548:499:6:o;7161:692::-;7307:12;7335:7;7331:516;;;-1:-1:-1;7365:10:6;7358:17;;7331:516;7476:17;;:21;7472:365;;7670:10;7664:17;7730:15;7717:10;7713:2;7709:19;7702:44;7619:145;7809:12;7802:20;;-1:-1:-1;;;7802:20:6;;;;;;;;:::i;14:395:8:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:2;;166:8;156;149:26;108:2;-1:-1:-1;196:20:8;;239:18;228:30;;225:2;;;278:8;268;261:26;225:2;322:4;314:6;310:17;298:29;;382:3;375:4;365:6;362:1;358:14;350:6;346:27;342:38;339:47;336:2;;;399:1;396;389:12;414:257;473:6;526:2;514:9;505:7;501:23;497:32;494:2;;;547:6;539;532:22;494:2;591:9;578:23;610:31;635:5;610:31;:::i;676:261::-;746:6;799:2;787:9;778:7;774:23;770:32;767:2;;;820:6;812;805:22;767:2;857:9;851:16;876:31;901:5;876:31;:::i;942:592::-;1037:6;1045;1053;1106:2;1094:9;1085:7;1081:23;1077:32;1074:2;;;1127:6;1119;1112:22;1074:2;1171:9;1158:23;1190:31;1215:5;1190:31;:::i;:::-;1240:5;-1:-1:-1;1296:2:8;1281:18;;1268:32;1323:18;1312:30;;1309:2;;;1360:6;1352;1345:22;1309:2;1404:70;1466:7;1457:6;1446:9;1442:22;1404:70;:::i;:::-;1064:470;;1493:8;;-1:-1:-1;1378:96:8;;-1:-1:-1;;;;1064:470:8:o;1539:325::-;1607:6;1615;1668:2;1656:9;1647:7;1643:23;1639:32;1636:2;;;1689:6;1681;1674:22;1636:2;1733:9;1720:23;1752:31;1777:5;1752:31;:::i;:::-;1802:5;1854:2;1839:18;;;;1826:32;;-1:-1:-1;;;1626:238:8:o;1869:457::-;1955:6;1963;2016:2;2004:9;1995:7;1991:23;1987:32;1984:2;;;2037:6;2029;2022:22;1984:2;2082:9;2069:23;2115:18;2107:6;2104:30;2101:2;;;2152:6;2144;2137:22;2101:2;2196:70;2258:7;2249:6;2238:9;2234:22;2196:70;:::i;:::-;2285:8;;2170:96;;-1:-1:-1;1974:352:8;-1:-1:-1;;;;1974:352:8:o;2331:803::-;2453:6;2461;2469;2477;2530:2;2518:9;2509:7;2505:23;2501:32;2498:2;;;2551:6;2543;2536:22;2498:2;2596:9;2583:23;2625:18;2666:2;2658:6;2655:14;2652:2;;;2687:6;2679;2672:22;2652:2;2731:70;2793:7;2784:6;2773:9;2769:22;2731:70;:::i;:::-;2820:8;;-1:-1:-1;2705:96:8;-1:-1:-1;2908:2:8;2893:18;;2880:32;;-1:-1:-1;2924:16:8;;;2921:2;;;2958:6;2950;2943:22;2921:2;;3002:72;3066:7;3055:8;3044:9;3040:24;3002:72;:::i;:::-;2488:646;;;;-1:-1:-1;3093:8:8;-1:-1:-1;;;;2488:646:8:o;3139:251::-;3195:6;3248:2;3236:9;3227:7;3223:23;3219:32;3216:2;;;3269:6;3261;3254:22;3216:2;3313:9;3300:23;3332:28;3354:5;3332:28;:::i;3395:255::-;3462:6;3515:2;3503:9;3494:7;3490:23;3486:32;3483:2;;;3536:6;3528;3521:22;3483:2;3573:9;3567:16;3592:28;3614:5;3592:28;:::i;3655:586::-;3747:6;3755;3763;3816:2;3804:9;3795:7;3791:23;3787:32;3784:2;;;3837:6;3829;3822:22;3784:2;3881:9;3868:23;3900:28;3922:5;3900:28;:::i;4246:932::-;4374:6;4382;4390;4398;4406;4459:2;4447:9;4438:7;4434:23;4430:32;4427:2;;;4480:6;4472;4465:22;4427:2;4524:9;4511:23;4543:28;4565:5;4543:28;:::i;:::-;4590:5;-1:-1:-1;4646:2:8;4631:18;;4618:32;4669:18;4699:14;;;4696:2;;;4731:6;4723;4716:22;4696:2;4775:70;4837:7;4828:6;4817:9;4813:22;4775:70;:::i;:::-;4864:8;;-1:-1:-1;4749:96:8;-1:-1:-1;4952:2:8;4937:18;;4924:32;;-1:-1:-1;4968:16:8;;;4965:2;;;5002:6;4994;4987:22;4965:2;;5046:72;5110:7;5099:8;5088:9;5084:24;5046:72;:::i;:::-;4417:761;;;;-1:-1:-1;4417:761:8;;-1:-1:-1;5137:8:8;;5020:98;4417:761;-1:-1:-1;;;4417:761:8:o;5183:319::-;5248:6;5256;5309:2;5297:9;5288:7;5284:23;5280:32;5277:2;;;5330:6;5322;5315:22;5277:2;5374:9;5361:23;5393:28;5415:5;5393:28;:::i;5507:387::-;5581:6;5589;5597;5650:2;5638:9;5629:7;5625:23;5621:32;5618:2;;;5671:6;5663;5656:22;5618:2;5715:9;5702:23;5734:28;5756:5;5734:28;:::i;:::-;5781:5;5833:2;5818:18;;5805:32;;-1:-1:-1;5884:2:8;5869:18;;;5856:32;;5608:286;-1:-1:-1;;;5608:286:8:o;5899:804::-;5993:6;6046:3;6034:9;6025:7;6021:23;6017:33;6014:2;;;6068:6;6060;6053:22;6014:2;6106;6100:9;6148:3;6140:6;6136:16;6218:6;6206:10;6203:22;6182:18;6170:10;6167:34;6164:62;6161:2;;;-1:-1:-1;;;6249:36:8;;6308:4;6305:1;6298:15;6341:4;6256:6;6326:20;6161:2;6376:10;6372:2;6365:22;;6417:9;6411:16;6403:6;6396:32;6482:2;6471:9;6467:18;6461:25;6456:2;6448:6;6444:15;6437:50;6541:2;6530:9;6526:18;6520:25;6515:2;6507:6;6503:15;6496:50;6589:2;6578:9;6574:18;6568:25;6602:31;6627:5;6602:31;:::i;:::-;6661:2;6649:15;;6642:30;6653:6;6004:699;-1:-1:-1;;;6004:699:8:o;6708:617::-;6802:6;6855:2;6843:9;6834:7;6830:23;6826:32;6823:2;;;6876:6;6868;6861:22;6823:2;6914;6908:9;6956:2;6948:6;6944:15;7025:6;7013:10;7010:22;6989:18;6977:10;6974:34;6971:62;6968:2;;;-1:-1:-1;;;7056:36:8;;7115:4;7112:1;7105:15;7148:4;7063:6;7133:20;6968:2;7179;7172:22;7218:16;;7203:32;;7289:2;7274:18;;;7268:25;7251:15;;;7244:50;;;;-1:-1:-1;7210:6:8;6813:512;-1:-1:-1;6813:512:8:o;7330:190::-;7389:6;7442:2;7430:9;7421:7;7417:23;7413:32;7410:2;;;7463:6;7455;7448:22;7410:2;-1:-1:-1;7491:23:8;;7400:120;-1:-1:-1;7400:120:8:o;7525:194::-;7595:6;7648:2;7636:9;7627:7;7623:23;7619:32;7616:2;;;7669:6;7661;7654:22;7616:2;-1:-1:-1;7697:16:8;;7606:113;-1:-1:-1;7606:113:8:o;7724:325::-;7792:6;7800;7853:2;7841:9;7832:7;7828:23;7824:32;7821:2;;;7874:6;7866;7859:22;7821:2;7915:9;7902:23;7892:33;;7975:2;7964:9;7960:18;7947:32;7988:31;8013:5;7988:31;:::i;:::-;8038:5;8028:15;;;7811:238;;;;;:::o;8399:258::-;8467:6;8475;8528:2;8516:9;8507:7;8503:23;8499:32;8496:2;;;8549:6;8541;8534:22;8496:2;-1:-1:-1;;8577:23:8;;;8647:2;8632:18;;;8619:32;;-1:-1:-1;8486:171:8:o;8662:360::-;8750:19;;;8732:3;-1:-1:-1;;;;;8781:31:8;;8778:2;;;8827:3;8822;8815:16;8778:2;8865:6;8862:1;8858:14;8917:8;8910:5;8903:4;8898:3;8894:14;8881:45;8949:18;;;;8969:4;8945:29;8983:15;;;-1:-1:-1;8945:29:8;;8740:282;-1:-1:-1;8740:282:8:o;9027:274::-;9156:3;9194:6;9188:13;9210:53;9256:6;9251:3;9244:4;9236:6;9232:17;9210:53;:::i;:::-;9279:16;;;;;9164:137;-1:-1:-1;;9164:137:8:o;10173:288::-;10362:2;10351:9;10344:21;10325:4;10382:73;10451:2;10440:9;10436:18;10428:6;10420;10382:73;:::i;10466:834::-;10733:2;10722:9;10715:21;10696:4;10759:73;10828:2;10817:9;10813:18;10805:6;10797;10759:73;:::i;:::-;10889:22;;;10851:2;10869:18;;;10862:50;;;;10961:13;;10983:22;;;11059:15;;;;11021;;;11092:4;11105:169;11119:6;11116:1;11113:13;11105:169;;;11180:13;;11168:26;;11249:15;;;;11214:12;;;;11141:1;11134:9;11105:169;;;-1:-1:-1;11291:3:8;;10705:595;-1:-1:-1;;;;;;;;10705:595:8:o;11497:355::-;11718:14;;11711:22;11693:41;;-1:-1:-1;;;;;11770:32:8;;;;11765:2;11750:18;;11743:60;11834:2;11819:18;;11812:34;11681:2;11666:18;;11648:204::o;11857:440::-;12110:6;12103:14;12096:22;12085:9;12078:41;12155:2;12150;12139:9;12135:18;12128:30;12059:4;12175:73;12244:2;12233:9;12229:18;12221:6;12213;12175:73;:::i;:::-;12167:81;;12284:6;12279:2;12268:9;12264:18;12257:34;12068:229;;;;;;;:::o;12789:383::-;12938:2;12927:9;12920:21;12901:4;12970:6;12964:13;13013:6;13008:2;12997:9;12993:18;12986:34;13029:66;13088:6;13083:2;13072:9;13068:18;13063:2;13055:6;13051:15;13029:66;:::i;:::-;13156:2;13135:15;-1:-1:-1;;13131:29:8;13116:45;;;;13163:2;13112:54;;12910:262;-1:-1:-1;;12910:262:8:o;19613:356::-;19815:2;19797:21;;;19834:18;;;19827:30;19893:34;19888:2;19873:18;;19866:62;19960:2;19945:18;;19787:182::o;25581:267::-;25620:3;25648:11;;;25675:10;;-1:-1:-1;;;;;25694:27:8;;;25687:35;;25671:52;25668:2;;;25726:18;;:::i;:::-;-1:-1:-1;;;25773:19:8;;;25766:27;;25758:36;;25755:2;;;25797:18;;:::i;:::-;-1:-1:-1;;25833:9:8;;25628:220::o;25853:128::-;25893:3;25924:1;25920:6;25917:1;25914:13;25911:2;;;25930:18;;:::i;:::-;-1:-1:-1;25966:9:8;;25901:80::o;25986:120::-;26026:1;26052;26042:2;;26057:18;;:::i;:::-;-1:-1:-1;26091:9:8;;26032:74::o;26111:168::-;26151:7;26217:1;26213;26209:6;26205:14;26202:1;26199:21;26194:1;26187:9;26180:17;26176:45;26173:2;;;26224:18;;:::i;:::-;-1:-1:-1;26264:9:8;;26163:116::o;26284:270::-;26323:4;26352:12;;;26380:10;;-1:-1:-1;;;26399:19:8;;26392:27;;26376:44;26373:2;;;26423:18;;:::i;:::-;-1:-1:-1;;;;;26470:27:8;;26463:35;;26455:44;;26452:2;;;26502:18;;:::i;:::-;-1:-1:-1;;26539:9:8;;26332:222::o;26559:125::-;26599:4;26627:1;26624;26621:8;26618:2;;;26632:18;;:::i;:::-;-1:-1:-1;26669:9:8;;26608:76::o;26689:258::-;26761:1;26771:113;26785:6;26782:1;26779:13;26771:113;;;26861:11;;;26855:18;26842:11;;;26835:39;26807:2;26800:10;26771:113;;;26902:6;26899:1;26896:13;26893:2;;;-1:-1:-1;;26937:1:8;26919:16;;26912:27;26742:205::o;26952:135::-;26991:3;-1:-1:-1;;27012:17:8;;27009:2;;;27032:18;;:::i;:::-;-1:-1:-1;27079:1:8;27068:13;;26999:88::o;27092:112::-;27124:1;27150;27140:2;;27155:18;;:::i;:::-;-1:-1:-1;27189:9:8;;27130:74::o;27209:127::-;27270:10;27265:3;27261:20;27258:1;27251:31;27301:4;27298:1;27291:15;27325:4;27322:1;27315:15;27341:127;27402:10;27397:3;27393:20;27390:1;27383:31;27433:4;27430:1;27423:15;27457:4;27454:1;27447:15;27473:131;-1:-1:-1;;;;;27548:31:8;;27538:42;;27528:2;;27594:1;27591;27584:12;27609:118;27695:5;27688:13;27681:21;27674:5;27671:32;27661:2;;27717:1;27714;27707:12
Swarm Source
ipfs://b42f7025d5910289c4b7a04abec50b8743db63641634b55bacbf2ba76c9161d7
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.