Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 32 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Emergency Reward... | 18027980 | 380 days ago | IN | 0 ETH | 0.00363011 | ||||
Deposit | 18000832 | 384 days ago | IN | 0 ETH | 0.00099925 | ||||
Withdraw | 18000827 | 384 days ago | IN | 0 ETH | 0.00261378 | ||||
Withdraw | 18000346 | 384 days ago | IN | 0 ETH | 0.00254439 | ||||
Withdraw | 18000330 | 384 days ago | IN | 0 ETH | 0.00263994 | ||||
Withdraw | 18000326 | 384 days ago | IN | 0 ETH | 0.00119462 | ||||
Withdraw | 18000320 | 384 days ago | IN | 0 ETH | 0.00034573 | ||||
Withdraw | 18000312 | 384 days ago | IN | 0 ETH | 0.00176259 | ||||
Withdraw | 18000310 | 384 days ago | IN | 0 ETH | 0.00179365 | ||||
Withdraw | 18000238 | 384 days ago | IN | 0 ETH | 0.0029287 | ||||
Withdraw | 17975408 | 388 days ago | IN | 0 ETH | 0.0029694 | ||||
Deposit | 17933266 | 394 days ago | IN | 0 ETH | 0.00412227 | ||||
Deposit | 17926873 | 395 days ago | IN | 0 ETH | 0.00637686 | ||||
Deposit | 17924489 | 395 days ago | IN | 0 ETH | 0.00048152 | ||||
Deposit | 17884862 | 400 days ago | IN | 0 ETH | 0.00130755 | ||||
Deposit | 17884856 | 400 days ago | IN | 0 ETH | 0.00110137 | ||||
Deposit | 17876983 | 401 days ago | IN | 0 ETH | 0.00253045 | ||||
Deposit | 17874914 | 402 days ago | IN | 0 ETH | 0.00120722 | ||||
Deposit | 17874910 | 402 days ago | IN | 0 ETH | 0.00037175 | ||||
Deposit | 17874904 | 402 days ago | IN | 0 ETH | 0.0003804 | ||||
Deposit | 17874554 | 402 days ago | IN | 0 ETH | 0.00039231 | ||||
Deposit | 17874501 | 402 days ago | IN | 0 ETH | 0.00034237 | ||||
Deposit | 17874283 | 402 days ago | IN | 0 ETH | 0.00038023 | ||||
Deposit | 17873155 | 402 days ago | IN | 0 ETH | 0.00646916 | ||||
Deposit | 17872212 | 402 days ago | IN | 0 ETH | 0.00688041 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CurveStake
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-08 */ //SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.11; //import "@nomiclabs/buidler/console.sol"; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() { } function _msgSender() internal view returns(address payable) { return payable(msg.sender); } function _msgData() internal view returns(bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns(address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), 'Ownable: caller is not the owner'); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), 'Ownable: new owner is the zero address'); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns(uint256) { uint256 c = a + b; require(c >= a, 'SafeMath: addition overflow'); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns(uint256) { return sub(a, b, 'SafeMath: subtraction overflow'); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns(uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns(uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, 'SafeMath: multiplication overflow'); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns(uint256) { return div(a, b, 'SafeMath: division by zero'); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns(uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns(uint256) { return mod(a, b, 'SafeMath: modulo by zero'); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns(uint256) { require(b != 0, errorMessage); return a % b; } function min(uint256 x, uint256 y) internal pure returns(uint256 z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns(uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } interface IBEP20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns(uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns(uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns(string memory); /** * @dev Returns the token name. */ function name() external view returns(string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns(address); /** * @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); } /** * @title SafeBEP20 * @dev Wrappers around BEP20 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 SafeBEP20 for IBEP20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeBEP20 { using SafeMath for uint256; using Address for address; function safeTransfer( IBEP20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IBEP20 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 * {IBEP20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IBEP20 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' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), 'SafeBEP20: approve from non-zero to non-zero allowance' ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IBEP20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IBEP20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, 'SafeBEP20: decreased allowance below zero' ); _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(IBEP20 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, 'SafeBEP20: low-level call failed'); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), 'SafeBEP20: BEP20 operation did not succeed'); } } } /** * @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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash:= extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, 'Address: insufficient balance'); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount } (''); require(success, 'Address: unable to send value, recipient may have reverted'); } /** * @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'); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns(bytes memory) { require(isContract(target), 'Address: call to non-contract'); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue } (data); 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size:= mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } contract CurveStake is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeBEP20 for IBEP20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } // Info of each pool. struct PoolInfo { IBEP20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. Tokens to distribute per block. uint256 lastRewardTimestamp; // Last block number that Tokens distribution occurs. uint256 accTokensPerShare; // Accumulated Tokens per share, times 1e12. See below. } IBEP20 public immutable stakingToken; IBEP20 public immutable rewardToken; mapping(address => uint256) public holderUnlockTime; uint256 public totalStaked; uint256 public apy; uint256 public lockDuration; uint256 public exitPenaltyPerc; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(address => UserInfo) public userInfo; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 private totalAllocPoint = 0; event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); constructor( ) { stakingToken = IBEP20(0xeCbddf83687e9842837e08c5A650658f2260b376); rewardToken = stakingToken; apy = 200; lockDuration = 5 days; exitPenaltyPerc = 2; // staking pool poolInfo.push(PoolInfo({ lpToken: stakingToken, allocPoint: 1000, lastRewardTimestamp: 2199615, accTokensPerShare: 0 })); totalAllocPoint = 1000; } function stopReward() external onlyOwner { updatePool(0); apy = 0; } function startReward() external onlyOwner { require(poolInfo[0].lastRewardTimestamp == 21799615, "Can only start rewards once"); poolInfo[0].lastRewardTimestamp = block.timestamp; } // View function to see pending Reward on frontend. function pendingReward(address _user) external view returns(uint256) { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[_user]; if (pool.lastRewardTimestamp == 21799615) { return 0; } uint256 accTokensPerShare = pool.accTokensPerShare; uint256 lpSupply = totalStaked; if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 tokenReward = calculateNewRewards().mul(pool.allocPoint).div(totalAllocPoint); accTokensPerShare = accTokensPerShare.add(tokenReward.mul(1e12).div(lpSupply)); } return user.amount.mul(accTokensPerShare).div(1e12).sub(user.rewardDebt); } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTimestamp) { return; } uint256 lpSupply = totalStaked; if (lpSupply == 0) { pool.lastRewardTimestamp = block.timestamp; return; } uint256 tokenReward = calculateNewRewards().mul(pool.allocPoint).div(totalAllocPoint); pool.accTokensPerShare = pool.accTokensPerShare.add(tokenReward.mul(1e12).div(lpSupply)); pool.lastRewardTimestamp = block.timestamp; } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public onlyOwner { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Stake primary tokens function deposit(uint256 _amount) public nonReentrant { if (holderUnlockTime[msg.sender] == 0) { holderUnlockTime[msg.sender] = block.timestamp + lockDuration; } PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; updatePool(0); if (user.amount > 0) { uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt); if (pending > 0) { require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin."); rewardToken.safeTransfer(address(msg.sender), pending); } } uint256 amountTransferred = 0; if (_amount > 0) { uint256 initialBalance = pool.lpToken.balanceOf(address(this)); pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); amountTransferred = pool.lpToken.balanceOf(address(this)) - initialBalance; user.amount = user.amount.add(amountTransferred); totalStaked += amountTransferred; } user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12); emit Deposit(msg.sender, _amount); } // Withdraw primary tokens from STAKING. function withdraw() public nonReentrant { require(holderUnlockTime[msg.sender] <= block.timestamp, "May not do normal withdraw early"); PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; uint256 _amount = user.amount; updatePool(0); uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt); if (pending > 0) { require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin."); rewardToken.safeTransfer(address(msg.sender), pending); } if (_amount > 0) { user.amount = 0; totalStaked -= _amount; pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12); if (user.amount > 0) { holderUnlockTime[msg.sender] = block.timestamp + lockDuration; } else { holderUnlockTime[msg.sender] = 0; } emit Withdraw(msg.sender, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external nonReentrant { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; uint256 _amount = user.amount; totalStaked -= _amount; // exit penalty for early unstakers, penalty held on contract as rewards. if (holderUnlockTime[msg.sender] >= block.timestamp) { _amount -= _amount * exitPenaltyPerc / 100; } holderUnlockTime[msg.sender] = 0; pool.lpToken.safeTransfer(address(msg.sender), _amount); user.amount = 0; user.rewardDebt = 0; emit EmergencyWithdraw(msg.sender, _amount); } // Withdraw reward. EMERGENCY ONLY. This allows the owner to migrate rewards to a new staking pool since we are not minting new tokens. function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { require(_amount <= rewardToken.balanceOf(address(this)) - totalStaked, 'not enough tokens to take out'); rewardToken.safeTransfer(address(msg.sender), _amount); } function calculateNewRewards() public view returns(uint256) { PoolInfo storage pool = poolInfo[0]; if (pool.lastRewardTimestamp > block.timestamp) { return 0; } return (((block.timestamp - pool.lastRewardTimestamp) * totalStaked) * apy / 100 / 365 days); } function rewardsRemaining() public view returns(uint256){ return rewardToken.balanceOf(address(this)) - totalStaked; } function updateApy(uint256 newApy) external onlyOwner { require(newApy <= 10000, "APY must be below 10000%"); updatePool(0); apy = newApy; } function updatelockduration(uint256 newlockDuration) external onlyOwner { require(newlockDuration <= 2419200, "Duration must be below 2 weeks"); lockDuration = newlockDuration; } function updateExitPenalty(uint256 newPenaltyPerc) external onlyOwner { require(newPenaltyPerc <= 20, "May not set higher than 20%"); exitPenaltyPerc = newPenaltyPerc; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"apy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateNewRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exitPenaltyPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBEP20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accTokensPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalStaked","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":"newApy","type":"uint256"}],"name":"updateApy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPenaltyPerc","type":"uint256"}],"name":"updateExitPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newlockDuration","type":"uint256"}],"name":"updatelockduration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052600060095534801561001557600080fd5b50600061002661024260201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506001808190555073ecbddf83687e9842837e08c5a650658f2260b37673ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505060c86004819055506206978060058190555060026006819055506007604051806080016040528060805173ffffffffffffffffffffffffffffffffffffffff1681526020016103e881526020016221903f81526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550506103e860098190555061024a565b600033905090565b60805160a0516130b762000293600039600081816105520152818161063d0152818161087d01528181610df0015281816113ee0152611b0e01526000610c9901526130b76000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806380dc0672116100de578063a913a5f711610097578063f2fde38b11610071578063f2fde38b146103a8578063f40f0f52146103c4578063f7c618c1146103f4578063ff16ef391461041257610173565b8063a913a5f714610352578063b6b55f2514610382578063db2e21bc1461039e57610173565b806380dc0672146102b6578063817b1cd2146102c05780638c09c135146102de5780638da5cb5b146102fa5780638e0b019814610318578063999e2f751461033457610173565b8063630b5ba111610130578063630b5ba11461023e578063715018a61461024857806372f702f314610252578063746c8ae11461027057806378c196f31461027a5780637b280def1461029857610173565b806304554443146101785780631526fe27146101965780631959a002146101c95780633279beab146101fa5780633bcfc4b8146102165780633ccfd60b14610234575b600080fd5b61018061042e565b60405161018d91906123e0565b60405180910390f35b6101b060048036038101906101ab919061242c565b610434565b6040516101c094939291906124d8565b60405180910390f35b6101e360048036038101906101de919061255b565b610494565b6040516101f1929190612588565b60405180910390f35b610214600480360381019061020f919061242c565b6104b8565b005b61021e610684565b60405161022b91906123e0565b60405180910390f35b61023c61068a565b005b610246610a7c565b005b610250610b44565b005b61025a610c97565b60405161026791906125b1565b60405180910390f35b610278610cbb565b005b610282610de9565b60405161028f91906123e0565b60405180910390f35b6102a0610e97565b6040516102ad91906123e0565b60405180910390f35b6102be610e9d565b005b6102c8610f46565b6040516102d591906123e0565b60405180910390f35b6102f860048036038101906102f3919061242c565b610f4c565b005b610302611031565b60405161030f91906125db565b60405180910390f35b610332600480360381019061032d919061242c565b61105a565b005b61033c61113d565b60405161034991906123e0565b60405180910390f35b61036c6004803603810190610367919061255b565b6111c7565b60405161037991906123e0565b60405180910390f35b61039c6004803603810190610397919061242c565b6111df565b005b6103a66116ac565b005b6103c260048036038101906103bd919061255b565b6118f6565b005b6103de60048036038101906103d9919061255b565b611997565b6040516103eb91906123e0565b60405180910390f35b6103fc611b0c565b60405161040991906125b1565b60405180910390f35b61042c6004803603810190610427919061242c565b611b30565b005b60055481565b6007818154811061044457600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60086020528060005260406000206000915090508060000154908060010154905082565b6104c0611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461054d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054490612653565b60405180910390fd5b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105a991906125db565b602060405180830381865afa1580156105c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ea9190612688565b6105f491906126e4565b811115610636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062d90612764565b60405180910390fd5b61068133827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b50565b60045481565b600260015414156106d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c7906127d0565b60405180910390fd5b600260018190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561075a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107519061283c565b60405180910390fd5b600060076000815481106107715761077061285c565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506107d76000611cac565b6000610821836001015461081364e8d4a5100061080588600301548860000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b611e5690919063ffffffff16565b905060008111156108c257610834610de9565b811115610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086d906128fd565b60405180910390fd5b6108c133827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b5b600082111561093e576000836000018190555081600360008282546108e791906126e4565b9250508190555061093d33838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b5b61097064e8d4a5100061096286600301548660000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b83600101819055506000836000015411156109db5760055442610993919061291d565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a21565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436483604051610a6791906123e0565b60405180910390a25050505060018081905550565b610a84611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0890612653565b60405180910390fd5b6000600780549050905060005b81811015610b4057610b2f81611cac565b80610b3990612973565b9050610b1e565b5050565b610b4c611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090612653565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b610cc3611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4790612653565b60405180910390fd5b63014ca2bf6007600081548110610d6a57610d6961285c565b5b90600052602060002090600402016002015414610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db390612a08565b60405180910390fd5b426007600081548110610dd257610dd161285c565b5b906000526020600020906004020160020181905550565b60006003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e4791906125db565b602060405180830381865afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e889190612688565b610e9291906126e4565b905090565b60065481565b610ea5611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2990612653565b60405180910390fd5b610f3c6000611cac565b6000600481905550565b60035481565b610f54611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890612653565b60405180910390fd5b6224ea00811115611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e90612a74565b60405180910390fd5b8060058190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611062611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e690612653565b60405180910390fd5b6014811115611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90612ae0565b60405180910390fd5b8060068190555050565b60008060076000815481106111555761115461285c565b5b90600052602060002090600402019050428160020154111561117b5760009150506111c4565b6301e13380606460045460035484600201544261119891906126e4565b6111a29190612b00565b6111ac9190612b00565b6111b69190612b89565b6111c09190612b89565b9150505b90565b60026020528060005260406000206000915090505481565b60026001541415611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c906127d0565b60405180910390fd5b60026001819055506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156112c75760055442611283919061291d565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600060076000815481106112de576112dd61285c565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061133b6000611cac565b600081600001541115611435576000611392826001015461138464e8d4a5100061137687600301548760000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b611e5690919063ffffffff16565b90506000811115611433576113a5610de9565b8111156113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de906128fd565b60405180910390fd5b61143233827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b5b505b6000808411156116175760008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161149e91906125db565b602060405180830381865afa1580156114bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114df9190612688565b90506115323330878760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ea0909392919063ffffffff16565b808460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161159091906125db565b602060405180830381865afa1580156115ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d19190612688565b6115db91906126e4565b91506115f4828460000154611f2990919063ffffffff16565b8360000181905550816003600082825461160e919061291d565b92505081905550505b61164964e8d4a5100061163b85600301548560000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8560405161169791906123e0565b60405180910390a25050506001808190555050565b600260015414156116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e9906127d0565b60405180910390fd5b6002600181905550600060076000815481106117115761171061285c565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050806003600082825461177f91906126e4565b9250508190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106117f4576064600654826117dc9190612b00565b6117e69190612b89565b816117f191906126e4565b90505b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061188833828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b60008260000181905550600082600101819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695826040516118e291906123e0565b60405180910390a250505060018081905550565b6118fe611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198290612653565b60405180910390fd5b61199481611f87565b50565b60008060076000815481106119af576119ae61285c565b5b906000526020600020906004020190506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905063014ca2bf82600201541415611a1d57600092505050611b07565b60008260030154905060006003549050836002015442118015611a41575060008114155b15611abc576000611a7a600954611a6c8760010154611a5e61113d565b611d9190919063ffffffff16565b611e0c90919063ffffffff16565b9050611ab8611aa983611a9b64e8d4a5100085611d9190919063ffffffff16565b611e0c90919063ffffffff16565b84611f2990919063ffffffff16565b9250505b611b008360010154611af264e8d4a51000611ae4868860000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b611e5690919063ffffffff16565b9450505050505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611b38611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc90612653565b60405180910390fd5b612710811115611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0190612c06565b60405180910390fd5b611c146000611cac565b8060048190555050565b600033905090565b611ca78363a9059cbb60e01b8484604051602401611c45929190612c26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506120b4565b505050565b600060078281548110611cc257611cc161285c565b5b9060005260206000209060040201905080600201544211611ce35750611d8e565b600060035490506000811415611d03574282600201819055505050611d8e565b6000611d37600954611d298560010154611d1b61113d565b611d9190919063ffffffff16565b611e0c90919063ffffffff16565b9050611d79611d6683611d5864e8d4a5100085611d9190919063ffffffff16565b611e0c90919063ffffffff16565b8460030154611f2990919063ffffffff16565b83600301819055504283600201819055505050505b50565b600080831415611da45760009050611e06565b60008284611db29190612b00565b9050828482611dc19190612b89565b14611e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df890612cc1565b60405180910390fd5b809150505b92915050565b6000611e4e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061217b565b905092915050565b6000611e9883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506121de565b905092915050565b611f23846323b872dd60e01b858585604051602401611ec193929190612ce1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506120b4565b50505050565b6000808284611f38919061291d565b905083811015611f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7490612d64565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fee90612df6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612116826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166122429092919063ffffffff16565b905060008151111561217657808060200190518101906121369190612e4e565b612175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216c90612eed565b60405180910390fd5b5b505050565b600080831182906121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b99190612f95565b60405180910390fd5b50600083856121d19190612b89565b9050809150509392505050565b6000838311158290612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d9190612f95565b60405180910390fd5b506000838561223591906126e4565b9050809150509392505050565b6060612251848460008561225a565b90509392505050565b60606122658561237c565b6122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b90613003565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516122cd919061306a565b60006040518083038185875af1925050503d806000811461230a576040519150601f19603f3d011682016040523d82523d6000602084013e61230f565b606091505b50915091508115612324578092505050612374565b6000815111156123375780518082602001fd5b836040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236b9190612f95565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156123be57506000801b8214155b92505050919050565b6000819050919050565b6123da816123c7565b82525050565b60006020820190506123f560008301846123d1565b92915050565b600080fd5b612409816123c7565b811461241457600080fd5b50565b60008135905061242681612400565b92915050565b600060208284031215612442576124416123fb565b5b600061245084828501612417565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061249e61249961249484612459565b612479565b612459565b9050919050565b60006124b082612483565b9050919050565b60006124c2826124a5565b9050919050565b6124d2816124b7565b82525050565b60006080820190506124ed60008301876124c9565b6124fa60208301866123d1565b61250760408301856123d1565b61251460608301846123d1565b95945050505050565b600061252882612459565b9050919050565b6125388161251d565b811461254357600080fd5b50565b6000813590506125558161252f565b92915050565b600060208284031215612571576125706123fb565b5b600061257f84828501612546565b91505092915050565b600060408201905061259d60008301856123d1565b6125aa60208301846123d1565b9392505050565b60006020820190506125c660008301846124c9565b92915050565b6125d58161251d565b82525050565b60006020820190506125f060008301846125cc565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061263d6020836125f6565b915061264882612607565b602082019050919050565b6000602082019050818103600083015261266c81612630565b9050919050565b60008151905061268281612400565b92915050565b60006020828403121561269e5761269d6123fb565b5b60006126ac84828501612673565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126ef826123c7565b91506126fa836123c7565b92508282101561270d5761270c6126b5565b5b828203905092915050565b7f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000600082015250565b600061274e601d836125f6565b915061275982612718565b602082019050919050565b6000602082019050818103600083015261277d81612741565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006127ba601f836125f6565b91506127c582612784565b602082019050919050565b600060208201905081810360008301526127e9816127ad565b9050919050565b7f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c79600082015250565b60006128266020836125f6565b9150612831826127f0565b602082019050919050565b6000602082019050818103600083015261285581612819565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f74207769746864726177206f746865722070656f706c652773207360008201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e602082015250565b60006128e76040836125f6565b91506128f28261288b565b604082019050919050565b60006020820190508181036000830152612916816128da565b9050919050565b6000612928826123c7565b9150612933836123c7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612968576129676126b5565b5b828201905092915050565b600061297e826123c7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129b1576129b06126b5565b5b600182019050919050565b7f43616e206f6e6c792073746172742072657761726473206f6e63650000000000600082015250565b60006129f2601b836125f6565b91506129fd826129bc565b602082019050919050565b60006020820190508181036000830152612a21816129e5565b9050919050565b7f4475726174696f6e206d7573742062652062656c6f772032207765656b730000600082015250565b6000612a5e601e836125f6565b9150612a6982612a28565b602082019050919050565b60006020820190508181036000830152612a8d81612a51565b9050919050565b7f4d6179206e6f742073657420686967686572207468616e203230250000000000600082015250565b6000612aca601b836125f6565b9150612ad582612a94565b602082019050919050565b60006020820190508181036000830152612af981612abd565b9050919050565b6000612b0b826123c7565b9150612b16836123c7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b4f57612b4e6126b5565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612b94826123c7565b9150612b9f836123c7565b925082612baf57612bae612b5a565b5b828204905092915050565b7f415059206d7573742062652062656c6f77203130303030250000000000000000600082015250565b6000612bf06018836125f6565b9150612bfb82612bba565b602082019050919050565b60006020820190508181036000830152612c1f81612be3565b9050919050565b6000604082019050612c3b60008301856125cc565b612c4860208301846123d1565b9392505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cab6021836125f6565b9150612cb682612c4f565b604082019050919050565b60006020820190508181036000830152612cda81612c9e565b9050919050565b6000606082019050612cf660008301866125cc565b612d0360208301856125cc565b612d1060408301846123d1565b949350505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000612d4e601b836125f6565b9150612d5982612d18565b602082019050919050565b60006020820190508181036000830152612d7d81612d41565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612de06026836125f6565b9150612deb82612d84565b604082019050919050565b60006020820190508181036000830152612e0f81612dd3565b9050919050565b60008115159050919050565b612e2b81612e16565b8114612e3657600080fd5b50565b600081519050612e4881612e22565b92915050565b600060208284031215612e6457612e636123fb565b5b6000612e7284828501612e39565b91505092915050565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612ed7602a836125f6565b9150612ee282612e7b565b604082019050919050565b60006020820190508181036000830152612f0681612eca565b9050919050565b600081519050919050565b60005b83811015612f36578082015181840152602081019050612f1b565b83811115612f45576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f6782612f0d565b612f7181856125f6565b9350612f81818560208601612f18565b612f8a81612f4b565b840191505092915050565b60006020820190508181036000830152612faf8184612f5c565b905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612fed601d836125f6565b9150612ff882612fb7565b602082019050919050565b6000602082019050818103600083015261301c81612fe0565b9050919050565b600081519050919050565b600081905092915050565b600061304482613023565b61304e818561302e565b935061305e818560208601612f18565b80840191505092915050565b60006130768284613039565b91508190509291505056fea264697066735822122085e5b957e6a00a81d9052297490d07569e9e4eb9bb375f5ac355c6c746df86f064736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c806380dc0672116100de578063a913a5f711610097578063f2fde38b11610071578063f2fde38b146103a8578063f40f0f52146103c4578063f7c618c1146103f4578063ff16ef391461041257610173565b8063a913a5f714610352578063b6b55f2514610382578063db2e21bc1461039e57610173565b806380dc0672146102b6578063817b1cd2146102c05780638c09c135146102de5780638da5cb5b146102fa5780638e0b019814610318578063999e2f751461033457610173565b8063630b5ba111610130578063630b5ba11461023e578063715018a61461024857806372f702f314610252578063746c8ae11461027057806378c196f31461027a5780637b280def1461029857610173565b806304554443146101785780631526fe27146101965780631959a002146101c95780633279beab146101fa5780633bcfc4b8146102165780633ccfd60b14610234575b600080fd5b61018061042e565b60405161018d91906123e0565b60405180910390f35b6101b060048036038101906101ab919061242c565b610434565b6040516101c094939291906124d8565b60405180910390f35b6101e360048036038101906101de919061255b565b610494565b6040516101f1929190612588565b60405180910390f35b610214600480360381019061020f919061242c565b6104b8565b005b61021e610684565b60405161022b91906123e0565b60405180910390f35b61023c61068a565b005b610246610a7c565b005b610250610b44565b005b61025a610c97565b60405161026791906125b1565b60405180910390f35b610278610cbb565b005b610282610de9565b60405161028f91906123e0565b60405180910390f35b6102a0610e97565b6040516102ad91906123e0565b60405180910390f35b6102be610e9d565b005b6102c8610f46565b6040516102d591906123e0565b60405180910390f35b6102f860048036038101906102f3919061242c565b610f4c565b005b610302611031565b60405161030f91906125db565b60405180910390f35b610332600480360381019061032d919061242c565b61105a565b005b61033c61113d565b60405161034991906123e0565b60405180910390f35b61036c6004803603810190610367919061255b565b6111c7565b60405161037991906123e0565b60405180910390f35b61039c6004803603810190610397919061242c565b6111df565b005b6103a66116ac565b005b6103c260048036038101906103bd919061255b565b6118f6565b005b6103de60048036038101906103d9919061255b565b611997565b6040516103eb91906123e0565b60405180910390f35b6103fc611b0c565b60405161040991906125b1565b60405180910390f35b61042c6004803603810190610427919061242c565b611b30565b005b60055481565b6007818154811061044457600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60086020528060005260406000206000915090508060000154908060010154905082565b6104c0611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461054d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054490612653565b60405180910390fd5b6003547f000000000000000000000000ecbddf83687e9842837e08c5a650658f2260b37673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105a991906125db565b602060405180830381865afa1580156105c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ea9190612688565b6105f491906126e4565b811115610636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062d90612764565b60405180910390fd5b61068133827f000000000000000000000000ecbddf83687e9842837e08c5a650658f2260b37673ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b50565b60045481565b600260015414156106d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c7906127d0565b60405180910390fd5b600260018190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561075a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107519061283c565b60405180910390fd5b600060076000815481106107715761077061285c565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506107d76000611cac565b6000610821836001015461081364e8d4a5100061080588600301548860000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b611e5690919063ffffffff16565b905060008111156108c257610834610de9565b811115610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086d906128fd565b60405180910390fd5b6108c133827f000000000000000000000000ecbddf83687e9842837e08c5a650658f2260b37673ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b5b600082111561093e576000836000018190555081600360008282546108e791906126e4565b9250508190555061093d33838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b5b61097064e8d4a5100061096286600301548660000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b83600101819055506000836000015411156109db5760055442610993919061291d565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a21565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436483604051610a6791906123e0565b60405180910390a25050505060018081905550565b610a84611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0890612653565b60405180910390fd5b6000600780549050905060005b81811015610b4057610b2f81611cac565b80610b3990612973565b9050610b1e565b5050565b610b4c611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090612653565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000ecbddf83687e9842837e08c5a650658f2260b37681565b610cc3611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4790612653565b60405180910390fd5b63014ca2bf6007600081548110610d6a57610d6961285c565b5b90600052602060002090600402016002015414610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db390612a08565b60405180910390fd5b426007600081548110610dd257610dd161285c565b5b906000526020600020906004020160020181905550565b60006003547f000000000000000000000000ecbddf83687e9842837e08c5a650658f2260b37673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e4791906125db565b602060405180830381865afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e889190612688565b610e9291906126e4565b905090565b60065481565b610ea5611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2990612653565b60405180910390fd5b610f3c6000611cac565b6000600481905550565b60035481565b610f54611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890612653565b60405180910390fd5b6224ea00811115611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e90612a74565b60405180910390fd5b8060058190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611062611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e690612653565b60405180910390fd5b6014811115611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90612ae0565b60405180910390fd5b8060068190555050565b60008060076000815481106111555761115461285c565b5b90600052602060002090600402019050428160020154111561117b5760009150506111c4565b6301e13380606460045460035484600201544261119891906126e4565b6111a29190612b00565b6111ac9190612b00565b6111b69190612b89565b6111c09190612b89565b9150505b90565b60026020528060005260406000206000915090505481565b60026001541415611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c906127d0565b60405180910390fd5b60026001819055506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156112c75760055442611283919061291d565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600060076000815481106112de576112dd61285c565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061133b6000611cac565b600081600001541115611435576000611392826001015461138464e8d4a5100061137687600301548760000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b611e5690919063ffffffff16565b90506000811115611433576113a5610de9565b8111156113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de906128fd565b60405180910390fd5b61143233827f000000000000000000000000ecbddf83687e9842837e08c5a650658f2260b37673ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b5b505b6000808411156116175760008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161149e91906125db565b602060405180830381865afa1580156114bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114df9190612688565b90506115323330878760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ea0909392919063ffffffff16565b808460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161159091906125db565b602060405180830381865afa1580156115ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d19190612688565b6115db91906126e4565b91506115f4828460000154611f2990919063ffffffff16565b8360000181905550816003600082825461160e919061291d565b92505081905550505b61164964e8d4a5100061163b85600301548560000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8560405161169791906123e0565b60405180910390a25050506001808190555050565b600260015414156116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e9906127d0565b60405180910390fd5b6002600181905550600060076000815481106117115761171061285c565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050806003600082825461177f91906126e4565b9250508190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106117f4576064600654826117dc9190612b00565b6117e69190612b89565b816117f191906126e4565b90505b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061188833828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b60008260000181905550600082600101819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695826040516118e291906123e0565b60405180910390a250505060018081905550565b6118fe611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198290612653565b60405180910390fd5b61199481611f87565b50565b60008060076000815481106119af576119ae61285c565b5b906000526020600020906004020190506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905063014ca2bf82600201541415611a1d57600092505050611b07565b60008260030154905060006003549050836002015442118015611a41575060008114155b15611abc576000611a7a600954611a6c8760010154611a5e61113d565b611d9190919063ffffffff16565b611e0c90919063ffffffff16565b9050611ab8611aa983611a9b64e8d4a5100085611d9190919063ffffffff16565b611e0c90919063ffffffff16565b84611f2990919063ffffffff16565b9250505b611b008360010154611af264e8d4a51000611ae4868860000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b611e5690919063ffffffff16565b9450505050505b919050565b7f000000000000000000000000ecbddf83687e9842837e08c5a650658f2260b37681565b611b38611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc90612653565b60405180910390fd5b612710811115611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0190612c06565b60405180910390fd5b611c146000611cac565b8060048190555050565b600033905090565b611ca78363a9059cbb60e01b8484604051602401611c45929190612c26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506120b4565b505050565b600060078281548110611cc257611cc161285c565b5b9060005260206000209060040201905080600201544211611ce35750611d8e565b600060035490506000811415611d03574282600201819055505050611d8e565b6000611d37600954611d298560010154611d1b61113d565b611d9190919063ffffffff16565b611e0c90919063ffffffff16565b9050611d79611d6683611d5864e8d4a5100085611d9190919063ffffffff16565b611e0c90919063ffffffff16565b8460030154611f2990919063ffffffff16565b83600301819055504283600201819055505050505b50565b600080831415611da45760009050611e06565b60008284611db29190612b00565b9050828482611dc19190612b89565b14611e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df890612cc1565b60405180910390fd5b809150505b92915050565b6000611e4e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061217b565b905092915050565b6000611e9883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506121de565b905092915050565b611f23846323b872dd60e01b858585604051602401611ec193929190612ce1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506120b4565b50505050565b6000808284611f38919061291d565b905083811015611f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7490612d64565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fee90612df6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612116826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166122429092919063ffffffff16565b905060008151111561217657808060200190518101906121369190612e4e565b612175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216c90612eed565b60405180910390fd5b5b505050565b600080831182906121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b99190612f95565b60405180910390fd5b50600083856121d19190612b89565b9050809150509392505050565b6000838311158290612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d9190612f95565b60405180910390fd5b506000838561223591906126e4565b9050809150509392505050565b6060612251848460008561225a565b90509392505050565b60606122658561237c565b6122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b90613003565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516122cd919061306a565b60006040518083038185875af1925050503d806000811461230a576040519150601f19603f3d011682016040523d82523d6000602084013e61230f565b606091505b50915091508115612324578092505050612374565b6000815111156123375780518082602001fd5b836040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236b9190612f95565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156123be57506000801b8214155b92505050919050565b6000819050919050565b6123da816123c7565b82525050565b60006020820190506123f560008301846123d1565b92915050565b600080fd5b612409816123c7565b811461241457600080fd5b50565b60008135905061242681612400565b92915050565b600060208284031215612442576124416123fb565b5b600061245084828501612417565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061249e61249961249484612459565b612479565b612459565b9050919050565b60006124b082612483565b9050919050565b60006124c2826124a5565b9050919050565b6124d2816124b7565b82525050565b60006080820190506124ed60008301876124c9565b6124fa60208301866123d1565b61250760408301856123d1565b61251460608301846123d1565b95945050505050565b600061252882612459565b9050919050565b6125388161251d565b811461254357600080fd5b50565b6000813590506125558161252f565b92915050565b600060208284031215612571576125706123fb565b5b600061257f84828501612546565b91505092915050565b600060408201905061259d60008301856123d1565b6125aa60208301846123d1565b9392505050565b60006020820190506125c660008301846124c9565b92915050565b6125d58161251d565b82525050565b60006020820190506125f060008301846125cc565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061263d6020836125f6565b915061264882612607565b602082019050919050565b6000602082019050818103600083015261266c81612630565b9050919050565b60008151905061268281612400565b92915050565b60006020828403121561269e5761269d6123fb565b5b60006126ac84828501612673565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126ef826123c7565b91506126fa836123c7565b92508282101561270d5761270c6126b5565b5b828203905092915050565b7f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000600082015250565b600061274e601d836125f6565b915061275982612718565b602082019050919050565b6000602082019050818103600083015261277d81612741565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006127ba601f836125f6565b91506127c582612784565b602082019050919050565b600060208201905081810360008301526127e9816127ad565b9050919050565b7f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c79600082015250565b60006128266020836125f6565b9150612831826127f0565b602082019050919050565b6000602082019050818103600083015261285581612819565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f74207769746864726177206f746865722070656f706c652773207360008201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e602082015250565b60006128e76040836125f6565b91506128f28261288b565b604082019050919050565b60006020820190508181036000830152612916816128da565b9050919050565b6000612928826123c7565b9150612933836123c7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612968576129676126b5565b5b828201905092915050565b600061297e826123c7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129b1576129b06126b5565b5b600182019050919050565b7f43616e206f6e6c792073746172742072657761726473206f6e63650000000000600082015250565b60006129f2601b836125f6565b91506129fd826129bc565b602082019050919050565b60006020820190508181036000830152612a21816129e5565b9050919050565b7f4475726174696f6e206d7573742062652062656c6f772032207765656b730000600082015250565b6000612a5e601e836125f6565b9150612a6982612a28565b602082019050919050565b60006020820190508181036000830152612a8d81612a51565b9050919050565b7f4d6179206e6f742073657420686967686572207468616e203230250000000000600082015250565b6000612aca601b836125f6565b9150612ad582612a94565b602082019050919050565b60006020820190508181036000830152612af981612abd565b9050919050565b6000612b0b826123c7565b9150612b16836123c7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b4f57612b4e6126b5565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612b94826123c7565b9150612b9f836123c7565b925082612baf57612bae612b5a565b5b828204905092915050565b7f415059206d7573742062652062656c6f77203130303030250000000000000000600082015250565b6000612bf06018836125f6565b9150612bfb82612bba565b602082019050919050565b60006020820190508181036000830152612c1f81612be3565b9050919050565b6000604082019050612c3b60008301856125cc565b612c4860208301846123d1565b9392505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cab6021836125f6565b9150612cb682612c4f565b604082019050919050565b60006020820190508181036000830152612cda81612c9e565b9050919050565b6000606082019050612cf660008301866125cc565b612d0360208301856125cc565b612d1060408301846123d1565b949350505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000612d4e601b836125f6565b9150612d5982612d18565b602082019050919050565b60006020820190508181036000830152612d7d81612d41565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612de06026836125f6565b9150612deb82612d84565b604082019050919050565b60006020820190508181036000830152612e0f81612dd3565b9050919050565b60008115159050919050565b612e2b81612e16565b8114612e3657600080fd5b50565b600081519050612e4881612e22565b92915050565b600060208284031215612e6457612e636123fb565b5b6000612e7284828501612e39565b91505092915050565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612ed7602a836125f6565b9150612ee282612e7b565b604082019050919050565b60006020820190508181036000830152612f0681612eca565b9050919050565b600081519050919050565b60005b83811015612f36578082015181840152602081019050612f1b565b83811115612f45576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f6782612f0d565b612f7181856125f6565b9350612f81818560208601612f18565b612f8a81612f4b565b840191505092915050565b60006020820190508181036000830152612faf8184612f5c565b905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612fed601d836125f6565b9150612ff882612fb7565b602082019050919050565b6000602082019050818103600083015261301c81612fe0565b9050919050565b600081519050919050565b600081905092915050565b600061304482613023565b61304e818561302e565b935061305e818560208601612f18565b80840191505092915050565b60006130768284613039565b91508190509291505056fea264697066735822122085e5b957e6a00a81d9052297490d07569e9e4eb9bb375f5ac355c6c746df86f064736f6c634300080b0033
Deployed Bytecode Sourcemap
24450:8790:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25433:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25533:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;25615:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;31930:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25408:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29894:1149;;;:::i;:::-;;28326:190;;;:::i;:::-;;2813:140;;;:::i;:::-;;25230:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26573:204;;;:::i;:::-;;32514:132;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25467:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26474:91;;;:::i;:::-;;25375:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32834:203;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2172:78;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33045:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32196:310;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25315:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28553:1285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31114:667;;;:::i;:::-;;3108:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26842:725;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25273:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32654:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25433:27;;;;:::o;25533:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25615:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31930:256::-;2393:12;:10;:12::i;:::-;2383:22;;:6;;;;;;;;;;:22;;;2375:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32068:11:::1;;32029;:21;;;32059:4;32029:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32018:7;:61;;32010:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32124:54;32157:10;32170:7;32124:11;:24;;;;:54;;;;;:::i;:::-;31930:256:::0;:::o;25408:18::-;;;;:::o;29894:1149::-;23503:1;24101:7;;:19;;24093:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23503:1;24234:7;:18;;;;29987:15:::1;29955:16;:28;29972:10;29955:28;;;;;;;;;;;;;;;;:47;;29947:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;30060:21;30084:8;30093:1;30084:11;;;;;;;;:::i;:::-;;;;;;;;;;;;30060:35;;30106:21;30130:8;:20;30139:10;30130:20;;;;;;;;;;;;;;;30106:44;;30163:15;30181:4;:11;;;30163:29;;30203:13;30214:1;30203:10;:13::i;:::-;30227:15;30245:70;30299:4;:15;;;30245:49;30289:4;30245:39;30261:4;:22;;;30245:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;30227:88;;30340:1;30330:7;:11;30326:219;;;30377:18;:16;:18::i;:::-;30366:7;:29;;30358:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;30479:54;30512:10;30525:7;30479:11;:24;;;;:54;;;;;:::i;:::-;30326:219;30571:1;30561:7;:11;30557:166;;;30603:1;30589:4;:11;;:15;;;;30634:7;30619:11;;:22;;;;;;;:::i;:::-;;;;;;;;30656:55;30690:10;30703:7;30656:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;30557:166;30753:49;30797:4;30753:39;30769:4;:22;;;30753:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;30735:4;:15;;:67;;;;30833:1;30819:4;:11;;;:15;30815:174;;;30900:12;;30882:15;:30;;;;:::i;:::-;30851:16;:28;30868:10;30851:28;;;;;;;;;;;;;;;:61;;;;30815:174;;;30976:1;30945:16;:28;30962:10;30945:28;;;;;;;;;;;;;;;:32;;;;30815:174;31015:10;31006:29;;;31027:7;31006:29;;;;;;:::i;:::-;;;;;;;;29934:1109;;;;23459:1:::0;24413:7;:22;;;;29894:1149::o;28326:190::-;2393:12;:10;:12::i;:::-;2383:22;;:6;;;;;;;;;;:22;;;2375:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28381:14:::1;28398:8;:15;;;;28381:32;;28429:11;28424:85;28452:6;28446:3;:12;28424:85;;;28482:15;28493:3;28482:10;:15::i;:::-;28460:5;;;;:::i;:::-;;;28424:85;;;;28370:146;28326:190::o:0;2813:140::-;2393:12;:10;:12::i;:::-;2383:22;;:6;;;;;;;;;;:22;;;2375:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2912:1:::1;2875:40;;2896:6;::::0;::::1;;;;;;;;2875:40;;;;;;;;;;;;2943:1;2926:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2813:140::o:0;25230:36::-;;;:::o;26573:204::-;2393:12;:10;:12::i;:::-;2383:22;;:6;;;;;;;;;;:22;;;2375:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26669:8:::1;26634;26643:1;26634:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;:43;26626:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;26754:15;26720:8;26729:1;26720:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;:49;;;;26573:204::o:0;32514:132::-;32562:7;32627:11;;32588;:21;;;32618:4;32588:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32581:57;;32514:132;:::o;25467:30::-;;;;:::o;26474:91::-;2393:12;:10;:12::i;:::-;2383:22;;:6;;;;;;;;;;:22;;;2375:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26526:13:::1;26537:1;26526:10;:13::i;:::-;26556:1;26550:3;:7;;;;26474:91::o:0;25375:26::-;;;;:::o;32834:203::-;2393:12;:10;:12::i;:::-;2383:22;;:6;;;;;;;;;;:22;;;2375:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32944:7:::1;32925:15;:26;;32917:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;33012:15;32997:12;:30;;;;32834:203:::0;:::o;2172:78::-;2209:7;2236:6;;;;;;;;;;;2229:13;;2172:78;:::o;33045:192::-;2393:12;:10;:12::i;:::-;2383:22;;:6;;;;;;;;;;:22;;;2375:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33152:2:::1;33134:14;:20;;33126:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;33215:14;33197:15;:32;;;;33045:192:::0;:::o;32196:310::-;32247:7;32267:21;32291:8;32300:1;32291:11;;;;;;;;:::i;:::-;;;;;;;;;;;;32267:35;;32344:15;32317:4;:24;;;:42;32313:83;;;32383:1;32376:8;;;;;32313:83;32489:8;32483:3;32477;;32462:11;;32434:4;:24;;;32416:15;:42;;;;:::i;:::-;32415:58;;;;:::i;:::-;32414:66;;;;:::i;:::-;:72;;;;:::i;:::-;:83;;;;:::i;:::-;32406:92;;;32196:310;;:::o;25315:51::-;;;;;;;;;;;;;;;;;:::o;28553:1285::-;23503:1;24101:7;;:19;;24093:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23503:1;24234:7;:18;;;;28654:1:::1;28622:16;:28;28639:10;28622:28;;;;;;;;;;;;;;;;:33;28618:127;;;28721:12;;28703:15;:30;;;;:::i;:::-;28672:16;:28;28689:10;28672:28;;;;;;;;;;;;;;;:61;;;;28618:127;28755:21;28779:8;28788:1;28779:11;;;;;;;;:::i;:::-;;;;;;;;;;;;28755:35;;28801:21;28825:8;:20;28834:10;28825:20;;;;;;;;;;;;;;;28801:44;;28858:13;28869:1;28858:10;:13::i;:::-;28900:1;28886:4;:11;;;:15;28882:381;;;28918:15;28936:70;28990:4;:15;;;28936:49;28980:4;28936:39;28952:4;:22;;;28936:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;28918:88;;29035:1;29025:7;:11;29021:231;;;29076:18;:16;:18::i;:::-;29065:7;:29;;29057:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;29182:54;29215:10;29228:7;29182:11;:24;;;;:54;;;;;:::i;:::-;29021:231;28903:360;28882:381;29273:25;29327:1:::0;29317:7:::1;:11;29313:394;;;29345:22;29370:4;:12;;;;;;;;;;;;:22;;;29401:4;29370:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29345:62;;29422:74;29460:10;29481:4;29488:7;29422:4;:12;;;;;;;;;;;;:29;;;;:74;;;;;;:::i;:::-;29571:14;29531:4;:12;;;;;;;;;;;;:22;;;29562:4;29531:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;29511:74;;29614:34;29630:17;29614:4;:11;;;:15;;:34;;;;:::i;:::-;29600:4;:11;;:48;;;;29678:17;29663:11;;:32;;;;;;;:::i;:::-;;;;;;;;29330:377;29313:394;29735:49;29779:4;29735:39;29751:4;:22;;;29735:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;29717:4;:15;;:67;;;;29810:10;29802:28;;;29822:7;29802:28;;;;;;:::i;:::-;;;;;;;;28607:1231;;;23459:1:::0;24413:7;:22;;;;28553:1285;:::o;31114:667::-;23503:1;24101:7;;:19;;24093:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23503:1;24234:7;:18;;;;31176:21:::1;31200:8;31209:1;31200:11;;;;;;;;:::i;:::-;;;;;;;;;;;;31176:35;;31222:21;31246:8;:20;31255:10;31246:20;;;;;;;;;;;;;;;31222:44;;31277:15;31295:4;:11;;;31277:29;;31332:7;31317:11;;:22;;;;;;;:::i;:::-;;;;;;;;31469:15;31437:16;:28;31454:10;31437:28;;;;;;;;;;;;;;;;:47;31433:122;;31540:3;31522:15;;31512:7;:25;;;;:::i;:::-;:31;;;;:::i;:::-;31501:42;;;;;:::i;:::-;;;31433:122;31596:1;31565:16;:28;31582:10;31565:28;;;;;;;;;;;;;;;:32;;;;31608:55;31642:10;31655:7;31608:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;31688:1;31674:4;:11;;:15;;;;31718:1;31700:4;:15;;:19;;;;31753:10;31735:38;;;31765:7;31735:38;;;;;;:::i;:::-;;;;;;;;31165:616;;;23459:1:::0;24413:7;:22;;;;31114:667::o;3108:109::-;2393:12;:10;:12::i;:::-;2383:22;;:6;;;;;;;;;;:22;;;2375:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3181:28:::1;3200:8;3181:18;:28::i;:::-;3108:109:::0;:::o;26842:725::-;26902:7;26922:21;26946:8;26955:1;26946:11;;;;;;;;:::i;:::-;;;;;;;;;;;;26922:35;;26968:21;26992:8;:15;27001:5;26992:15;;;;;;;;;;;;;;;26968:39;;27050:8;27022:4;:24;;;:36;27018:77;;;27082:1;27075:8;;;;;;27018:77;27105:25;27133:4;:22;;;27105:50;;27166:16;27185:11;;27166:30;;27229:4;:24;;;27211:15;:42;:59;;;;;27269:1;27257:8;:13;;27211:59;27207:270;;;27287:19;27309:63;27356:15;;27309:42;27335:4;:15;;;27309:21;:19;:21::i;:::-;:25;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;27287:85;;27407:58;27429:35;27455:8;27429:21;27445:4;27429:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;27407:17;:21;;:58;;;;:::i;:::-;27387:78;;27272:205;27207:270;27494:65;27543:4;:15;;;27494:44;27533:4;27494:34;27510:17;27494:4;:11;;;:15;;:34;;;;:::i;:::-;:38;;:44;;;;:::i;:::-;:48;;:65;;;;:::i;:::-;27487:72;;;;;;26842:725;;;;:::o;25273:35::-;;;:::o;32654:172::-;2393:12;:10;:12::i;:::-;2383:22;;:6;;;;;;;;;;:22;;;2375:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32737:5:::1;32727:6;:15;;32719:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;32782:13;32793:1;32782:10;:13::i;:::-;32812:6;32806:3;:12;;;;32654:172:::0;:::o;829:106::-;873:15;916:10;901:26;;829:106;:::o;12944:251::-;13097:86;13117:5;13147:23;;;13172:2;13176:5;13124:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13097:19;:86::i;:::-;12944:251;;;:::o;27643:600::-;27697:21;27721:8;27730:4;27721:14;;;;;;;;:::i;:::-;;;;;;;;;;;;27697:38;;27769:4;:24;;;27750:15;:43;27746:82;;27810:7;;;27746:82;27838:16;27857:11;;27838:30;;27895:1;27883:8;:13;27879:109;;;27940:15;27913:4;:24;;:42;;;;27970:7;;;;27879:109;27998:19;28020:63;28067:15;;28020:42;28046:4;:15;;;28020:21;:19;:21::i;:::-;:25;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;27998:85;;28119:63;28146:35;28172:8;28146:21;28162:4;28146:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;28119:4;:22;;;:26;;:63;;;;:::i;:::-;28094:4;:22;;:88;;;;28220:15;28193:4;:24;;:42;;;;27686:557;;;27643:600;;:::o;5784:470::-;5841:7;6091:1;6086;:6;6082:47;;;6116:1;6109:8;;;;6082:47;6141:9;6157:1;6153;:5;;;;:::i;:::-;6141:17;;6186:1;6181;6177;:5;;;;:::i;:::-;:10;6169:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;6245:1;6238:8;;;5784:470;;;;;:::o;6730:131::-;6787:7;6814:39;6818:1;6821;6814:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6807:46;;6730:131;;;;:::o;4862:135::-;4919:7;4946:43;4950:1;4953;4946:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4939:50;;4862:135;;;;:::o;13203:248::-;13347:96;13367:5;13397:27;;;13426:4;13432:2;13436:5;13374:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13347:19;:96::i;:::-;13203:248;;;;:::o;4399:180::-;4456:7;4476:9;4492:1;4488;:5;;;;:::i;:::-;4476:17;;4517:1;4512;:6;;4504:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4570:1;4563:8;;;4399:180;;;;:::o;3323:229::-;3417:1;3397:22;;:8;:22;;;;3389:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3507:8;3478:38;;3499:6;;;;;;;;;;3478:38;;;;;;;;;;;;3536:8;3527:6;;:17;;;;;;;;;;;;;;;;;;3323:229;:::o;15507:774::-;15931:23;15957:69;15985:4;15957:69;;;;;;;;;;;;;;;;;15965:5;15957:27;;;;:69;;;;;:::i;:::-;15931:95;;16061:1;16041:10;:17;:21;16037:237;;;16196:10;16185:30;;;;;;;;;;;;:::i;:::-;16177:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;16037:237;15577:704;15507:774;;:::o;7357:311::-;7476:7;7508:1;7504;:5;7511:12;7496:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;7535:9;7551:1;7547;:5;;;;:::i;:::-;7535:17;;7659:1;7652:8;;;7357:311;;;;;:::o;5300:225::-;5419:7;5452:1;5447;:6;;5455:12;5439:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5479:9;5495:1;5491;:5;;;;:::i;:::-;5479:17;;5516:1;5509:8;;;5300:225;;;;;:::o;20106:229::-;20242:12;20274:53;20297:6;20305:4;20311:1;20314:12;20274:22;:53::i;:::-;20267:60;;20106:229;;;;;:::o;21591:1021::-;21763:12;21796:18;21807:6;21796:10;:18::i;:::-;21788:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;21922:12;21936:23;21963:6;:11;;21983:8;21995:4;21963:37;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21921:79;;;;22015:7;22011:594;;;22046:10;22039:17;;;;;;22011:594;22180:1;22160:10;:17;:21;22156:438;;;22422:10;22416:17;22483:15;22470:10;22466:2;22462:19;22455:44;22156:438;22565:12;22558:20;;;;;;;;;;;:::i;:::-;;;;;;;;21591:1021;;;;;;;:::o;16969:639::-;17028:4;17290:16;17317:19;17339:66;17317:88;;;;17520:7;17508:20;17497:31;;17569:11;17557:8;:23;;:42;;;;;17596:3;17584:15;;:8;:15;;17557:42;17549:51;;;;16969:639;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;523:117::-;632:1;629;622:12;769:122;842:24;860:5;842:24;:::i;:::-;835:5;832:35;822:63;;881:1;878;871:12;822:63;769:122;:::o;897:139::-;943:5;981:6;968:20;959:29;;997:33;1024:5;997:33;:::i;:::-;897:139;;;;:::o;1042:329::-;1101:6;1150:2;1138:9;1129:7;1125:23;1121:32;1118:119;;;1156:79;;:::i;:::-;1118:119;1276:1;1301:53;1346:7;1337:6;1326:9;1322:22;1301:53;:::i;:::-;1291:63;;1247:117;1042:329;;;;:::o;1377:126::-;1414:7;1454:42;1447:5;1443:54;1432:65;;1377:126;;;:::o;1509:60::-;1537:3;1558:5;1551:12;;1509:60;;;:::o;1575:142::-;1625:9;1658:53;1676:34;1685:24;1703:5;1685:24;:::i;:::-;1676:34;:::i;:::-;1658:53;:::i;:::-;1645:66;;1575:142;;;:::o;1723:126::-;1773:9;1806:37;1837:5;1806:37;:::i;:::-;1793:50;;1723:126;;;:::o;1855:140::-;1919:9;1952:37;1983:5;1952:37;:::i;:::-;1939:50;;1855:140;;;:::o;2001:159::-;2102:51;2147:5;2102:51;:::i;:::-;2097:3;2090:64;2001:159;;:::o;2166:581::-;2357:4;2395:3;2384:9;2380:19;2372:27;;2409:85;2491:1;2480:9;2476:17;2467:6;2409:85;:::i;:::-;2504:72;2572:2;2561:9;2557:18;2548:6;2504:72;:::i;:::-;2586;2654:2;2643:9;2639:18;2630:6;2586:72;:::i;:::-;2668;2736:2;2725:9;2721:18;2712:6;2668:72;:::i;:::-;2166:581;;;;;;;:::o;2753:96::-;2790:7;2819:24;2837:5;2819:24;:::i;:::-;2808:35;;2753:96;;;:::o;2855:122::-;2928:24;2946:5;2928:24;:::i;:::-;2921:5;2918:35;2908:63;;2967:1;2964;2957:12;2908:63;2855:122;:::o;2983:139::-;3029:5;3067:6;3054:20;3045:29;;3083:33;3110:5;3083:33;:::i;:::-;2983:139;;;;:::o;3128:329::-;3187:6;3236:2;3224:9;3215:7;3211:23;3207:32;3204:119;;;3242:79;;:::i;:::-;3204:119;3362:1;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3333:117;3128:329;;;;:::o;3463:332::-;3584:4;3622:2;3611:9;3607:18;3599:26;;3635:71;3703:1;3692:9;3688:17;3679:6;3635:71;:::i;:::-;3716:72;3784:2;3773:9;3769:18;3760:6;3716:72;:::i;:::-;3463:332;;;;;:::o;3801:250::-;3908:4;3946:2;3935:9;3931:18;3923:26;;3959:85;4041:1;4030:9;4026:17;4017:6;3959:85;:::i;:::-;3801:250;;;;:::o;4057:118::-;4144:24;4162:5;4144:24;:::i;:::-;4139:3;4132:37;4057:118;;:::o;4181:222::-;4274:4;4312:2;4301:9;4297:18;4289:26;;4325:71;4393:1;4382:9;4378:17;4369:6;4325:71;:::i;:::-;4181:222;;;;:::o;4409:169::-;4493:11;4527:6;4522:3;4515:19;4567:4;4562:3;4558:14;4543:29;;4409:169;;;;:::o;4584:182::-;4724:34;4720:1;4712:6;4708:14;4701:58;4584:182;:::o;4772:366::-;4914:3;4935:67;4999:2;4994:3;4935:67;:::i;:::-;4928:74;;5011:93;5100:3;5011:93;:::i;:::-;5129:2;5124:3;5120:12;5113:19;;4772:366;;;:::o;5144:419::-;5310:4;5348:2;5337:9;5333:18;5325:26;;5397:9;5391:4;5387:20;5383:1;5372:9;5368:17;5361:47;5425:131;5551:4;5425:131;:::i;:::-;5417:139;;5144:419;;;:::o;5569:143::-;5626:5;5657:6;5651:13;5642:22;;5673:33;5700:5;5673:33;:::i;:::-;5569:143;;;;:::o;5718:351::-;5788:6;5837:2;5825:9;5816:7;5812:23;5808:32;5805:119;;;5843:79;;:::i;:::-;5805:119;5963:1;5988:64;6044:7;6035:6;6024:9;6020:22;5988:64;:::i;:::-;5978:74;;5934:128;5718:351;;;;:::o;6075:180::-;6123:77;6120:1;6113:88;6220:4;6217:1;6210:15;6244:4;6241:1;6234:15;6261:191;6301:4;6321:20;6339:1;6321:20;:::i;:::-;6316:25;;6355:20;6373:1;6355:20;:::i;:::-;6350:25;;6394:1;6391;6388:8;6385:34;;;6399:18;;:::i;:::-;6385:34;6444:1;6441;6437:9;6429:17;;6261:191;;;;:::o;6458:179::-;6598:31;6594:1;6586:6;6582:14;6575:55;6458:179;:::o;6643:366::-;6785:3;6806:67;6870:2;6865:3;6806:67;:::i;:::-;6799:74;;6882:93;6971:3;6882:93;:::i;:::-;7000:2;6995:3;6991:12;6984:19;;6643:366;;;:::o;7015:419::-;7181:4;7219:2;7208:9;7204:18;7196:26;;7268:9;7262:4;7258:20;7254:1;7243:9;7239:17;7232:47;7296:131;7422:4;7296:131;:::i;:::-;7288:139;;7015:419;;;:::o;7440:181::-;7580:33;7576:1;7568:6;7564:14;7557:57;7440:181;:::o;7627:366::-;7769:3;7790:67;7854:2;7849:3;7790:67;:::i;:::-;7783:74;;7866:93;7955:3;7866:93;:::i;:::-;7984:2;7979:3;7975:12;7968:19;;7627:366;;;:::o;7999:419::-;8165:4;8203:2;8192:9;8188:18;8180:26;;8252:9;8246:4;8242:20;8238:1;8227:9;8223:17;8216:47;8280:131;8406:4;8280:131;:::i;:::-;8272:139;;7999:419;;;:::o;8424:182::-;8564:34;8560:1;8552:6;8548:14;8541:58;8424:182;:::o;8612:366::-;8754:3;8775:67;8839:2;8834:3;8775:67;:::i;:::-;8768:74;;8851:93;8940:3;8851:93;:::i;:::-;8969:2;8964:3;8960:12;8953:19;;8612:366;;;:::o;8984:419::-;9150:4;9188:2;9177:9;9173:18;9165:26;;9237:9;9231:4;9227:20;9223:1;9212:9;9208:17;9201:47;9265:131;9391:4;9265:131;:::i;:::-;9257:139;;8984:419;;;:::o;9409:180::-;9457:77;9454:1;9447:88;9554:4;9551:1;9544:15;9578:4;9575:1;9568:15;9595:251;9735:34;9731:1;9723:6;9719:14;9712:58;9804:34;9799:2;9791:6;9787:15;9780:59;9595:251;:::o;9852:366::-;9994:3;10015:67;10079:2;10074:3;10015:67;:::i;:::-;10008:74;;10091:93;10180:3;10091:93;:::i;:::-;10209:2;10204:3;10200:12;10193:19;;9852:366;;;:::o;10224:419::-;10390:4;10428:2;10417:9;10413:18;10405:26;;10477:9;10471:4;10467:20;10463:1;10452:9;10448:17;10441:47;10505:131;10631:4;10505:131;:::i;:::-;10497:139;;10224:419;;;:::o;10649:305::-;10689:3;10708:20;10726:1;10708:20;:::i;:::-;10703:25;;10742:20;10760:1;10742:20;:::i;:::-;10737:25;;10896:1;10828:66;10824:74;10821:1;10818:81;10815:107;;;10902:18;;:::i;:::-;10815:107;10946:1;10943;10939:9;10932:16;;10649:305;;;;:::o;10960:233::-;10999:3;11022:24;11040:5;11022:24;:::i;:::-;11013:33;;11068:66;11061:5;11058:77;11055:103;;;11138:18;;:::i;:::-;11055:103;11185:1;11178:5;11174:13;11167:20;;10960:233;;;:::o;11199:177::-;11339:29;11335:1;11327:6;11323:14;11316:53;11199:177;:::o;11382:366::-;11524:3;11545:67;11609:2;11604:3;11545:67;:::i;:::-;11538:74;;11621:93;11710:3;11621:93;:::i;:::-;11739:2;11734:3;11730:12;11723:19;;11382:366;;;:::o;11754:419::-;11920:4;11958:2;11947:9;11943:18;11935:26;;12007:9;12001:4;11997:20;11993:1;11982:9;11978:17;11971:47;12035:131;12161:4;12035:131;:::i;:::-;12027:139;;11754:419;;;:::o;12179:180::-;12319:32;12315:1;12307:6;12303:14;12296:56;12179:180;:::o;12365:366::-;12507:3;12528:67;12592:2;12587:3;12528:67;:::i;:::-;12521:74;;12604:93;12693:3;12604:93;:::i;:::-;12722:2;12717:3;12713:12;12706:19;;12365:366;;;:::o;12737:419::-;12903:4;12941:2;12930:9;12926:18;12918:26;;12990:9;12984:4;12980:20;12976:1;12965:9;12961:17;12954:47;13018:131;13144:4;13018:131;:::i;:::-;13010:139;;12737:419;;;:::o;13162:177::-;13302:29;13298:1;13290:6;13286:14;13279:53;13162:177;:::o;13345:366::-;13487:3;13508:67;13572:2;13567:3;13508:67;:::i;:::-;13501:74;;13584:93;13673:3;13584:93;:::i;:::-;13702:2;13697:3;13693:12;13686:19;;13345:366;;;:::o;13717:419::-;13883:4;13921:2;13910:9;13906:18;13898:26;;13970:9;13964:4;13960:20;13956:1;13945:9;13941:17;13934:47;13998:131;14124:4;13998:131;:::i;:::-;13990:139;;13717:419;;;:::o;14142:348::-;14182:7;14205:20;14223:1;14205:20;:::i;:::-;14200:25;;14239:20;14257:1;14239:20;:::i;:::-;14234:25;;14427:1;14359:66;14355:74;14352:1;14349:81;14344:1;14337:9;14330:17;14326:105;14323:131;;;14434:18;;:::i;:::-;14323:131;14482:1;14479;14475:9;14464:20;;14142:348;;;;:::o;14496:180::-;14544:77;14541:1;14534:88;14641:4;14638:1;14631:15;14665:4;14662:1;14655:15;14682:185;14722:1;14739:20;14757:1;14739:20;:::i;:::-;14734:25;;14773:20;14791:1;14773:20;:::i;:::-;14768:25;;14812:1;14802:35;;14817:18;;:::i;:::-;14802:35;14859:1;14856;14852:9;14847:14;;14682:185;;;;:::o;14873:174::-;15013:26;15009:1;15001:6;14997:14;14990:50;14873:174;:::o;15053:366::-;15195:3;15216:67;15280:2;15275:3;15216:67;:::i;:::-;15209:74;;15292:93;15381:3;15292:93;:::i;:::-;15410:2;15405:3;15401:12;15394:19;;15053:366;;;:::o;15425:419::-;15591:4;15629:2;15618:9;15614:18;15606:26;;15678:9;15672:4;15668:20;15664:1;15653:9;15649:17;15642:47;15706:131;15832:4;15706:131;:::i;:::-;15698:139;;15425:419;;;:::o;15850:332::-;15971:4;16009:2;15998:9;15994:18;15986:26;;16022:71;16090:1;16079:9;16075:17;16066:6;16022:71;:::i;:::-;16103:72;16171:2;16160:9;16156:18;16147:6;16103:72;:::i;:::-;15850:332;;;;;:::o;16188:220::-;16328:34;16324:1;16316:6;16312:14;16305:58;16397:3;16392:2;16384:6;16380:15;16373:28;16188:220;:::o;16414:366::-;16556:3;16577:67;16641:2;16636:3;16577:67;:::i;:::-;16570:74;;16653:93;16742:3;16653:93;:::i;:::-;16771:2;16766:3;16762:12;16755:19;;16414:366;;;:::o;16786:419::-;16952:4;16990:2;16979:9;16975:18;16967:26;;17039:9;17033:4;17029:20;17025:1;17014:9;17010:17;17003:47;17067:131;17193:4;17067:131;:::i;:::-;17059:139;;16786:419;;;:::o;17211:442::-;17360:4;17398:2;17387:9;17383:18;17375:26;;17411:71;17479:1;17468:9;17464:17;17455:6;17411:71;:::i;:::-;17492:72;17560:2;17549:9;17545:18;17536:6;17492:72;:::i;:::-;17574;17642:2;17631:9;17627:18;17618:6;17574:72;:::i;:::-;17211:442;;;;;;:::o;17659:177::-;17799:29;17795:1;17787:6;17783:14;17776:53;17659:177;:::o;17842:366::-;17984:3;18005:67;18069:2;18064:3;18005:67;:::i;:::-;17998:74;;18081:93;18170:3;18081:93;:::i;:::-;18199:2;18194:3;18190:12;18183:19;;17842:366;;;:::o;18214:419::-;18380:4;18418:2;18407:9;18403:18;18395:26;;18467:9;18461:4;18457:20;18453:1;18442:9;18438:17;18431:47;18495:131;18621:4;18495:131;:::i;:::-;18487:139;;18214:419;;;:::o;18639:225::-;18779:34;18775:1;18767:6;18763:14;18756:58;18848:8;18843:2;18835:6;18831:15;18824:33;18639:225;:::o;18870:366::-;19012:3;19033:67;19097:2;19092:3;19033:67;:::i;:::-;19026:74;;19109:93;19198:3;19109:93;:::i;:::-;19227:2;19222:3;19218:12;19211:19;;18870:366;;;:::o;19242:419::-;19408:4;19446:2;19435:9;19431:18;19423:26;;19495:9;19489:4;19485:20;19481:1;19470:9;19466:17;19459:47;19523:131;19649:4;19523:131;:::i;:::-;19515:139;;19242:419;;;:::o;19667:90::-;19701:7;19744:5;19737:13;19730:21;19719:32;;19667:90;;;:::o;19763:116::-;19833:21;19848:5;19833:21;:::i;:::-;19826:5;19823:32;19813:60;;19869:1;19866;19859:12;19813:60;19763:116;:::o;19885:137::-;19939:5;19970:6;19964:13;19955:22;;19986:30;20010:5;19986:30;:::i;:::-;19885:137;;;;:::o;20028:345::-;20095:6;20144:2;20132:9;20123:7;20119:23;20115:32;20112:119;;;20150:79;;:::i;:::-;20112:119;20270:1;20295:61;20348:7;20339:6;20328:9;20324:22;20295:61;:::i;:::-;20285:71;;20241:125;20028:345;;;;:::o;20379:229::-;20519:34;20515:1;20507:6;20503:14;20496:58;20588:12;20583:2;20575:6;20571:15;20564:37;20379:229;:::o;20614:366::-;20756:3;20777:67;20841:2;20836:3;20777:67;:::i;:::-;20770:74;;20853:93;20942:3;20853:93;:::i;:::-;20971:2;20966:3;20962:12;20955:19;;20614:366;;;:::o;20986:419::-;21152:4;21190:2;21179:9;21175:18;21167:26;;21239:9;21233:4;21229:20;21225:1;21214:9;21210:17;21203:47;21267:131;21393:4;21267:131;:::i;:::-;21259:139;;20986:419;;;:::o;21411:99::-;21463:6;21497:5;21491:12;21481:22;;21411:99;;;:::o;21516:307::-;21584:1;21594:113;21608:6;21605:1;21602:13;21594:113;;;21693:1;21688:3;21684:11;21678:18;21674:1;21669:3;21665:11;21658:39;21630:2;21627:1;21623:10;21618:15;;21594:113;;;21725:6;21722:1;21719:13;21716:101;;;21805:1;21796:6;21791:3;21787:16;21780:27;21716:101;21565:258;21516:307;;;:::o;21829:102::-;21870:6;21921:2;21917:7;21912:2;21905:5;21901:14;21897:28;21887:38;;21829:102;;;:::o;21937:364::-;22025:3;22053:39;22086:5;22053:39;:::i;:::-;22108:71;22172:6;22167:3;22108:71;:::i;:::-;22101:78;;22188:52;22233:6;22228:3;22221:4;22214:5;22210:16;22188:52;:::i;:::-;22265:29;22287:6;22265:29;:::i;:::-;22260:3;22256:39;22249:46;;22029:272;21937:364;;;;:::o;22307:313::-;22420:4;22458:2;22447:9;22443:18;22435:26;;22507:9;22501:4;22497:20;22493:1;22482:9;22478:17;22471:47;22535:78;22608:4;22599:6;22535:78;:::i;:::-;22527:86;;22307:313;;;;:::o;22626:179::-;22766:31;22762:1;22754:6;22750:14;22743:55;22626:179;:::o;22811:366::-;22953:3;22974:67;23038:2;23033:3;22974:67;:::i;:::-;22967:74;;23050:93;23139:3;23050:93;:::i;:::-;23168:2;23163:3;23159:12;23152:19;;22811:366;;;:::o;23183:419::-;23349:4;23387:2;23376:9;23372:18;23364:26;;23436:9;23430:4;23426:20;23422:1;23411:9;23407:17;23400:47;23464:131;23590:4;23464:131;:::i;:::-;23456:139;;23183:419;;;:::o;23608:98::-;23659:6;23693:5;23687:12;23677:22;;23608:98;;;:::o;23712:147::-;23813:11;23850:3;23835:18;;23712:147;;;;:::o;23865:373::-;23969:3;23997:38;24029:5;23997:38;:::i;:::-;24051:88;24132:6;24127:3;24051:88;:::i;:::-;24044:95;;24148:52;24193:6;24188:3;24181:4;24174:5;24170:16;24148:52;:::i;:::-;24225:6;24220:3;24216:16;24209:23;;23973:265;23865:373;;;;:::o;24244:271::-;24374:3;24396:93;24485:3;24476:6;24396:93;:::i;:::-;24389:100;;24506:3;24499:10;;24244:271;;;;:::o
Swarm Source
ipfs://85e5b957e6a00a81d9052297490d07569e9e4eb9bb375f5ac355c6c746df86f0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.