More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 814 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 16777394 | 537 days ago | IN | 0 ETH | 0.00440679 | ||||
Emergency Reward... | 16629720 | 558 days ago | IN | 0 ETH | 0.00536119 | ||||
Emergency Reward... | 16629413 | 558 days ago | IN | 0 ETH | 0.00804221 | ||||
Emergency Reward... | 16629397 | 558 days ago | IN | 0 ETH | 0.00728902 | ||||
Deposit | 16532971 | 572 days ago | IN | 0 ETH | 0.00224326 | ||||
Deposit | 16532968 | 572 days ago | IN | 0 ETH | 0.00237764 | ||||
Deposit | 16471993 | 580 days ago | IN | 0 ETH | 0.00386115 | ||||
Withdraw | 16471990 | 580 days ago | IN | 0 ETH | 0.00202191 | ||||
Add Boost | 16470783 | 580 days ago | IN | 0 ETH | 0.00367827 | ||||
Deposit | 16465412 | 581 days ago | IN | 0 ETH | 0.00353537 | ||||
Add Boost | 16465370 | 581 days ago | IN | 0 ETH | 0.00054106 | ||||
Deposit | 16457277 | 582 days ago | IN | 0 ETH | 0.00197224 | ||||
Deposit | 16457273 | 582 days ago | IN | 0 ETH | 0.00228756 | ||||
Add Boost | 16456180 | 582 days ago | IN | 0 ETH | 0.00229723 | ||||
Add Boost | 16456179 | 582 days ago | IN | 0 ETH | 0.00267936 | ||||
Deposit | 16456178 | 582 days ago | IN | 0 ETH | 0.00407198 | ||||
Add Boost | 16456178 | 582 days ago | IN | 0 ETH | 0.00172594 | ||||
Add Boost | 16456176 | 582 days ago | IN | 0 ETH | 0.00181831 | ||||
Add Boost | 16456174 | 582 days ago | IN | 0 ETH | 0.00162206 | ||||
Add Boost | 16456171 | 582 days ago | IN | 0 ETH | 0.00231422 | ||||
Withdraw | 16433359 | 586 days ago | IN | 0 ETH | 0.00193277 | ||||
Withdraw | 16429324 | 586 days ago | IN | 0 ETH | 0.00227253 | ||||
Deposit | 16417811 | 588 days ago | IN | 0 ETH | 0.00261133 | ||||
Deposit | 16417808 | 588 days ago | IN | 0 ETH | 0.00236196 | ||||
Withdraw | 16377397 | 593 days ago | IN | 0 ETH | 0.00245898 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
FixedAPRSoloStakingWithBoosts
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-28 */ //SPDX-License-Identifier: MIT pragma solidity 0.8.16; //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 FixedAPRSoloStakingWithBoosts 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 boostedAmount; uint256 boosts; uint256 rewardDebt; // Reward debt. See explanation below. uint256 pendingPayout; // track any previously pending payouts from boosts } // 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; mapping (address => bool) public _isAuthorized; uint256 public totalStaked; uint256 public totalBoostedStaked; uint256 public apr; uint256 public lockDuration; uint256 public exitPenaltyPerc; uint256 public amountPerBoost; uint256 public maxBoostAmount; mapping ( address => uint256) public lastWalletBoostTs; bool public canCompoundOrStakeMore; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping (address => UserInfo) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 private totalAllocPoint; event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event Compound(address indexed user); event EmergencyWithdraw(address indexed user, uint256 amount); constructor(address _tokenAddress, uint256 _apr, uint256 _lockDurationInDays, uint256 _exitPenaltyPerc, bool _canCompoundOrStakeMore) { stakingToken = IBEP20(_tokenAddress); rewardToken = IBEP20(_tokenAddress); canCompoundOrStakeMore = _canCompoundOrStakeMore; _isAuthorized[msg.sender] = true; apr = _apr; lockDuration = _lockDurationInDays * 1 days; exitPenaltyPerc = _exitPenaltyPerc; amountPerBoost = 50; // 25% boost per booster maxBoostAmount = 6; // 6 boosts allowed // staking pool poolInfo.push(PoolInfo({ lpToken: stakingToken, allocPoint: 1000, lastRewardTimestamp: 99999999999, accTokensPerShare: 0 })); totalAllocPoint = 1000; } modifier onlyAuthorized() { require(_isAuthorized[msg.sender], "Not Authorized"); _; } function setAuthorization(address account, bool authorized) external onlyOwner { _isAuthorized[account] = authorized; } function stopReward() external onlyOwner { updatePool(0); apr = 0; } function startReward() external onlyOwner { require(poolInfo[0].lastRewardTimestamp == 99999999999, "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 == 99999999999){ return 0; } uint256 accTokensPerShare = pool.accTokensPerShare; uint256 lpSupply = totalBoostedStaked; 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.boostedAmount.mul(accTokensPerShare).div(1e12).sub(user.rewardDebt) + user.pendingPayout; } // 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 = totalBoostedStaked; 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) external nonReentrant { if(holderUnlockTime[msg.sender] == 0){ holderUnlockTime[msg.sender] = block.timestamp + lockDuration; } PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; if(!canCompoundOrStakeMore && _amount > 0){ require(user.boostedAmount == 0, "Cannot stake more"); } updatePool(0); if (user.boostedAmount > 0) { uint256 pending = user.boostedAmount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt) + user.pendingPayout; user.pendingPayout = 0; 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) { totalBoostedStaked -= getWalletBoostedAmount(msg.sender); 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; totalBoostedStaked += getWalletBoostedAmount(msg.sender); user.boostedAmount = getWalletBoostedAmount(msg.sender); } user.rewardDebt = user.boostedAmount.mul(pool.accTokensPerShare).div(1e12); emit Deposit(msg.sender, _amount); } function compound() external nonReentrant { require(canCompoundOrStakeMore, "Cannot compound"); PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; updatePool(0); if (user.boostedAmount > 0) { uint256 pending = user.boostedAmount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt) + user.pendingPayout; user.pendingPayout = 0; if(pending > 0) { require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin."); totalBoostedStaked -= getWalletBoostedAmount(msg.sender); user.amount += pending; totalStaked += pending; totalBoostedStaked += getWalletBoostedAmount(msg.sender); user.boostedAmount = getWalletBoostedAmount(msg.sender); } } user.rewardDebt = user.boostedAmount.mul(pool.accTokensPerShare).div(1e12); emit Compound(msg.sender); } // Withdraw primary tokens from STAKING. function withdraw() external 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.boostedAmount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt) + user.pendingPayout; user.pendingPayout = 0; 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) { totalBoostedStaked -= user.boostedAmount; user.boostedAmount = 0; user.boosts = 0; user.amount = 0; totalStaked -= _amount; pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.boostedAmount.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; totalBoostedStaked -= user.boostedAmount; 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.boostedAmount = 0; user.boosts = 0; user.rewardDebt = 0; user.pendingPayout = 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) * totalBoostedStaked) * apr / 100 / 365 days); } function rewardsRemaining() public view returns (uint256){ return rewardToken.balanceOf(address(this)) - totalStaked; } function updateApr(uint256 newApr) external onlyOwner { require(newApr <= 1000, "APR must be below 1000%"); updatePool(0); apr = newApr; } // only applies for new stakers function updateLockDuration(uint256 daysForLock) external onlyOwner { require(daysForLock <= 365, "Lock must be 365 days or less."); lockDuration = daysForLock * 1 days; } function updateExitPenalty(uint256 newPenaltyPerc) external onlyOwner { require(newPenaltyPerc <= 20, "May not set higher than 20%"); exitPenaltyPerc = newPenaltyPerc; } function updateCanCompoundOrStakeMore(bool compoundEnabled) external onlyOwner { canCompoundOrStakeMore = compoundEnabled; } function getWalletBoostedAmount(address wallet) public view returns (uint256){ UserInfo storage user = userInfo[wallet]; return user.amount * (100+(user.boosts*amountPerBoost)) / 100; } function getWalletAPR(address wallet) public view returns (uint256){ UserInfo storage user = userInfo[wallet]; return apr * (100+(user.boosts*amountPerBoost)) / 100; } function addBoost(address wallet) external onlyAuthorized { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[wallet]; if(user.boosts < maxBoostAmount){ updatePool(0); uint256 pending = user.boostedAmount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt) + user.pendingPayout; user.pendingPayout = pending; totalBoostedStaked -= user.boostedAmount; user.boosts += 1; user.boostedAmount = getWalletBoostedAmount(wallet); totalBoostedStaked += user.boostedAmount; user.rewardDebt = user.boostedAmount.mul(pool.accTokensPerShare).div(1e12); lastWalletBoostTs[wallet] = block.timestamp; } } function removeBoost(address wallet) external onlyAuthorized { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[wallet]; if(user.boosts > 0){ updatePool(0); uint256 pending = user.boostedAmount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt) + user.pendingPayout; user.pendingPayout = pending; totalBoostedStaked -= user.boostedAmount; user.boosts -= 1; user.boostedAmount = getWalletBoostedAmount(wallet); totalBoostedStaked += user.boostedAmount; user.rewardDebt = user.boostedAmount.mul(pool.accTokensPerShare).div(1e12); } } function updateBoosters(uint256 newMaxBoostAmount, uint256 newAmountPerBoost) external onlyOwner { require(newAmountPerBoost <= 100, "amount per boost too high"); maxBoostAmount = newMaxBoostAmount; amountPerBoost = newAmountPerBoost; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_apr","type":"uint256"},{"internalType":"uint256","name":"_lockDurationInDays","type":"uint256"},{"internalType":"uint256","name":"_exitPenaltyPerc","type":"uint256"},{"internalType":"bool","name":"_canCompoundOrStakeMore","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Compound","type":"event"},{"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":[{"internalType":"address","name":"","type":"address"}],"name":"_isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"addBoost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"amountPerBoost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateNewRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canCompoundOrStakeMore","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","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":"wallet","type":"address"}],"name":"getWalletAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getWalletBoostedAmount","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":[{"internalType":"address","name":"","type":"address"}],"name":"lastWalletBoostTs","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":"maxBoostAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeBoost","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"authorized","type":"bool"}],"name":"setAuthorization","outputs":[],"stateMutability":"nonpayable","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":"totalBoostedStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"newApr","type":"uint256"}],"name":"updateApr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBoostAmount","type":"uint256"},{"internalType":"uint256","name":"newAmountPerBoost","type":"uint256"}],"name":"updateBoosters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"compoundEnabled","type":"bool"}],"name":"updateCanCompoundOrStakeMore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPenaltyPerc","type":"uint256"}],"name":"updateExitPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"daysForLock","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":"boostedAmount","type":"uint256"},{"internalType":"uint256","name":"boosts","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"pendingPayout","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620047ee380380620047ee8339818101604052810190620000379190620003ce565b600062000049620002e460201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600180819055508473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508473ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505080600c60006101000a81548160ff0219169083151502179055506001600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836006819055506201518083620001e0919062000485565b6007819055508160088190555060326009819055506006600a81905550600d604051806080016040528060805173ffffffffffffffffffffffffffffffffffffffff1681526020016103e8815260200164174876e7ff81526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550506103e8600f819055505050505050620004e6565b600033905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200031e82620002f1565b9050919050565b620003308162000311565b81146200033c57600080fd5b50565b600081519050620003508162000325565b92915050565b6000819050919050565b6200036b8162000356565b81146200037757600080fd5b50565b6000815190506200038b8162000360565b92915050565b60008115159050919050565b620003a88162000391565b8114620003b457600080fd5b50565b600081519050620003c8816200039d565b92915050565b600080600080600060a08688031215620003ed57620003ec620002ec565b5b6000620003fd888289016200033f565b955050602062000410888289016200037a565b945050604062000423888289016200037a565b935050606062000436888289016200037a565b92505060806200044988828901620003b7565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620004928262000356565b91506200049f8362000356565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004db57620004da62000456565b5b828202905092915050565b60805160a0516142bf6200052f60003960008181610c4401528181610d2f01528181610f81015281816115ca01528181611c8a0152612b6d0152600061147201526142bf6000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c806378c196f31161013b578063a913a5f7116100b8578063eecea0001161007c578063eecea00014610639578063f2fde38b14610655578063f40f0f5214610671578063f69e2046146106a1578063f7c618c1146106ab5761023d565b8063a913a5f7146105ab578063b6b55f25146105db578063d477edf4146105f7578063dac4516514610613578063db2e21bc1461062f5761023d565b806387f3b92a116100ff57806387f3b92a146104f35780638da5cb5b146105235780638e0b019814610541578063999e2f751461055d578063a09552061461057b5761023d565b806378c196f3146104735780637b280def1461049157806380dc0672146104af578063817b1cd2146104b95780638552bf90146104d75761023d565b80633279beab116101c95780636787e79e1161018d5780636787e79e146103f357806368365d0314610423578063715018a61461044157806372f702f31461044b578063746c8ae1146104695761023d565b80633279beab146103875780633ccfd60b146103a357806357ded9c9146103ad5780635bcd0bdb146103cb578063630b5ba1146103e95761023d565b80631385ae5b116102105780631385ae5b146102b45780631526fe27146102d25780631959a0021461030557806319af52a214610339578063221ac771146103695761023d565b806304554443146102425780630698260f1461026057806308aa16791461027c5780630dbd526a14610298575b600080fd5b61024a6106c9565b604051610257919061334e565b60405180910390f35b61027a600480360381019061027591906133a6565b6106cf565b005b610296600480360381019061029191906133ff565b610781565b005b6102b260048036038101906102ad919061349d565b61086c565b005b6102bc610a85565b6040516102c9919061334e565b60405180910390f35b6102ec60048036038101906102e791906134ca565b610a8b565b6040516102fc9493929190613556565b60405180910390f35b61031f600480360381019061031a919061349d565b610aeb565b60405161033095949392919061359b565b60405180910390f35b610353600480360381019061034e919061349d565b610b21565b604051610360919061334e565b60405180910390f35b610371610ba4565b60405161037e919061334e565b60405180910390f35b6103a1600480360381019061039c91906134ca565b610baa565b005b6103ab610d76565b005b6103b56111b1565b6040516103c2919061334e565b60405180910390f35b6103d36111b7565b6040516103e0919061334e565b60405180910390f35b6103f16111bd565b005b61040d6004803603810190610408919061349d565b611285565b60405161041a919061334e565b60405180910390f35b61042b61130a565b60405161043891906135fd565b60405180910390f35b61044961131d565b005b610453611470565b6040516104609190613618565b60405180910390f35b610471611494565b005b61047b6115c3565b604051610488919061334e565b60405180910390f35b610499611671565b6040516104a6919061334e565b60405180910390f35b6104b7611677565b005b6104c1611720565b6040516104ce919061334e565b60405180910390f35b6104f160048036038101906104ec91906134ca565b611726565b005b61050d6004803603810190610508919061349d565b611814565b60405161051a91906135fd565b60405180910390f35b61052b611834565b6040516105389190613642565b60405180910390f35b61055b600480360381019061055691906134ca565b61185d565b005b610565611940565b604051610572919061334e565b60405180910390f35b6105956004803603810190610590919061349d565b6119ca565b6040516105a2919061334e565b60405180910390f35b6105c560048036038101906105c0919061349d565b6119e2565b6040516105d2919061334e565b60405180910390f35b6105f560048036038101906105f091906134ca565b6119fa565b005b610611600480360381019061060c91906134ca565b611f9b565b005b61062d6004803603810190610628919061349d565b61208d565b005b6106376122eb565b005b610653600480360381019061064e919061365d565b61256f565b005b61066f600480360381019061066a919061349d565b61265f565b005b61068b6004803603810190610686919061349d565b612700565b604051610698919061334e565b60405180910390f35b6106a9612884565b005b6106b3612b6b565b6040516106c09190613618565b60405180910390f35b60075481565b6106d7612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075b906136fa565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b610789612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080d906136fa565b60405180910390fd5b606481111561085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085190613766565b60405180910390fd5b81600a81905550806009819055505050565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef906137d2565b60405180910390fd5b6000600d60008154811061090f5761090e6137f2565b5b906000526020600020906004020190506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600201541115610a80576109796000612b97565b600081600401546109c883600301546109ba64e8d4a510006109ac88600301548860010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b612d3f90919063ffffffff16565b6109d29190613850565b90508082600401819055508160010154600560008282546109f39190613884565b925050819055506001826002016000828254610a0f9190613884565b92505081905550610a1f84611285565b8260010181905550816001015460056000828254610a3d9190613850565b92505081905550610a7664e8d4a51000610a6885600301548560010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b8260030181905550505b505050565b60055481565b600d8181548110610a9b57600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b600e6020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060646009548260020154610b7991906138b8565b6064610b859190613850565b600654610b9291906138b8565b610b9c9190613941565b915050919050565b600a5481565b610bb2612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c36906136fa565b60405180910390fd5b6004547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c9b9190613642565b602060405180830381865afa158015610cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdc9190613987565b610ce69190613884565b811115610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f90613a00565b60405180910390fd5b610d7333827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612d899092919063ffffffff16565b50565b600260015403610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db290613a6c565b60405180910390fd5b600260018190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90613ad8565b60405180910390fd5b6000600d600081548110610e5c57610e5b6137f2565b5b906000526020600020906004020190506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050610ec26000612b97565b60008260040154610f118460030154610f0364e8d4a51000610ef589600301548960010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b612d3f90919063ffffffff16565b610f1b9190613850565b9050600083600401819055506000811115610fc657610f386115c3565b811115610f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7190613b6a565b60405180910390fd5b610fc533827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612d899092919063ffffffff16565b5b600082111561107357826001015460056000828254610fe59190613884565b92505081905550600083600101819055506000836002018190555060008360000181905550816004600082825461101c9190613884565b9250508190555061107233838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612d899092919063ffffffff16565b5b6110a564e8d4a5100061109786600301548660010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b836003018190555060008360000154111561111057600754426110c89190613850565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611156565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243648360405161119c919061334e565b60405180910390a25050505060018081905550565b60065481565b60095481565b6111c5612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611252576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611249906136fa565b60405180910390fd5b6000600d80549050905060005b818110156112815761127081612b97565b8061127a90613b8a565b905061125f565b5050565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050606460095482600201546112dd91906138b8565b60646112e99190613850565b82600001546112f891906138b8565b6113029190613941565b915050919050565b600c60009054906101000a900460ff1681565b611325612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a9906136fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b61149c612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611529576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611520906136fa565b60405180910390fd5b64174876e7ff600d600081548110611544576115436137f2565b5b90600052602060002090600402016002015414611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90613c1e565b60405180910390fd5b42600d6000815481106115ac576115ab6137f2565b5b906000526020600020906004020160020181905550565b60006004547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116219190613642565b602060405180830381865afa15801561163e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116629190613987565b61166c9190613884565b905090565b60085481565b61167f612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461170c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611703906136fa565b60405180910390fd5b6117166000612b97565b6000600681905550565b60045481565b61172e612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b2906136fa565b60405180910390fd5b6103e8811115611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790613c8a565b60405180910390fd5b61180a6000612b97565b8060068190555050565b60036020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611865612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e9906136fa565b60405180910390fd5b6014811115611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d90613cf6565b60405180910390fd5b8060088190555050565b600080600d600081548110611958576119576137f2565b5b90600052602060002090600402019050428160020154111561197e5760009150506119c7565b6301e13380606460065460055484600201544261199b9190613884565b6119a591906138b8565b6119af91906138b8565b6119b99190613941565b6119c39190613941565b9150505b90565b600b6020528060005260406000206000915090505481565b60026020528060005260406000206000915090505481565b600260015403611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690613a6c565b60405180910390fd5b60026001819055506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403611ae05760075442611a9c9190613850565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600d600081548110611af757611af66137f2565b5b906000526020600020906004020190506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600c60009054906101000a900460ff16158015611b675750600083115b15611bb4576000816001015414611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa90613d62565b60405180910390fd5b5b611bbe6000612b97565b600081600101541115611cd15760008160040154611c1a8360030154611c0c64e8d4a51000611bfe88600301548860010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b612d3f90919063ffffffff16565b611c249190613850565b9050600082600401819055506000811115611ccf57611c416115c3565b811115611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a90613b6a565b60405180910390fd5b611cce33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612d899092919063ffffffff16565b5b505b600080841115611f0657611ce433611285565b60056000828254611cf59190613884565b9250508190555060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d5b9190613642565b602060405180830381865afa158015611d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9c9190613987565b9050611def3330878760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612e0f909392919063ffffffff16565b808460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e4d9190613642565b602060405180830381865afa158015611e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e9190613987565b611e989190613884565b9150611eb1828460000154612e9890919063ffffffff16565b83600001819055508160046000828254611ecb9190613850565b92505081905550611edb33611285565b60056000828254611eec9190613850565b92505081905550611efc33611285565b8360010181905550505b611f3864e8d4a51000611f2a85600301548560010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b82600301819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c85604051611f86919061334e565b60405180910390a25050506001808190555050565b611fa3612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612030576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612027906136fa565b60405180910390fd5b61016d811115612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c90613dce565b60405180910390fd5b620151808161208491906138b8565b60078190555050565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612119576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612110906137d2565b60405180910390fd5b6000600d6000815481106121305761212f6137f2565b5b906000526020600020906004020190506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600a54816002015410156122e65761219b6000612b97565b600081600401546121ea83600301546121dc64e8d4a510006121ce88600301548860010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b612d3f90919063ffffffff16565b6121f49190613850565b90508082600401819055508160010154600560008282546122159190613884565b9250508190555060018260020160008282546122319190613850565b9250508190555061224184611285565b826001018190555081600101546005600082825461225f9190613850565b9250508190555061229864e8d4a5100061228a85600301548560010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b826003018190555042600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b505050565b600260015403612330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232790613a6c565b60405180910390fd5b60026001819055506000600d60008154811061234f5761234e6137f2565b5b906000526020600020906004020190506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490508160010154600560008282546123c19190613884565b9250508190555080600460008282546123da9190613884565b9250508190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061244f5760646008548261243791906138b8565b6124419190613941565b8161244c9190613884565b90505b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506124e333828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612d899092919063ffffffff16565b60008260000181905550600082600101819055506000826002018190555060008260030181905550600082600401819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96958260405161255b919061334e565b60405180910390a250505060018081905550565b612577612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fb906136fa565b60405180910390fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612667612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb906136fa565b60405180910390fd5b6126fd81612ef6565b50565b600080600d600081548110612718576127176137f2565b5b906000526020600020906004020190506000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905064174876e7ff8260020154036127865760009250505061287f565b600082600301549050600060055490508360020154421180156127aa575060008114155b156128255760006127e3600f546127d587600101546127c7611940565b612c7b90919063ffffffff16565b612cf590919063ffffffff16565b90506128216128128361280464e8d4a5100085612c7b90919063ffffffff16565b612cf590919063ffffffff16565b84612e9890919063ffffffff16565b9250505b826004015461286e846003015461286064e8d4a51000612852878960010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b612d3f90919063ffffffff16565b6128789190613850565b9450505050505b919050565b6002600154036128c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c090613a6c565b60405180910390fd5b6002600181905550600c60009054906101000a900460ff16612920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291790613e3a565b60405180910390fd5b6000600d600081548110612937576129366137f2565b5b906000526020600020906004020190506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506129946000612b97565b600081600101541115612ae357600081600401546129f083600301546129e264e8d4a510006129d488600301548860010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b612d3f90919063ffffffff16565b6129fa9190613850565b9050600082600401819055506000811115612ae157612a176115c3565b811115612a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5090613b6a565b60405180910390fd5b612a6233611285565b60056000828254612a739190613884565b9250508190555080826000016000828254612a8e9190613850565b925050819055508060046000828254612aa79190613850565b92505081905550612ab733611285565b60056000828254612ac89190613850565b92505081905550612ad833611285565b82600101819055505b505b612b1564e8d4a51000612b0784600301548460010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b81600301819055503373ffffffffffffffffffffffffffffffffffffffff167fda323bd96658b18a6ce813e824305dc61760462bad6aaf52c65aebb8c8c9faa160405160405180910390a2505060018081905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b600033905090565b6000600d8281548110612bad57612bac6137f2565b5b9060005260206000209060040201905080600201544211612bce5750612c78565b6000600554905060008103612bed574282600201819055505050612c78565b6000612c21600f54612c138560010154612c05611940565b612c7b90919063ffffffff16565b612cf590919063ffffffff16565b9050612c63612c5083612c4264e8d4a5100085612c7b90919063ffffffff16565b612cf590919063ffffffff16565b8460030154612e9890919063ffffffff16565b83600301819055504283600201819055505050505b50565b6000808303612c8d5760009050612cef565b60008284612c9b91906138b8565b9050828482612caa9190613941565b14612cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce190613ecc565b60405180910390fd5b809150505b92915050565b6000612d3783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613022565b905092915050565b6000612d8183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613085565b905092915050565b612e0a8363a9059cbb60e01b8484604051602401612da8929190613eec565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130e9565b505050565b612e92846323b872dd60e01b858585604051602401612e3093929190613f15565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130e9565b50505050565b6000808284612ea79190613850565b905083811015612eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee390613f98565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5c9061402a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290613069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306091906140c9565b60405180910390fd5b50600083856130789190613941565b9050809150509392505050565b60008383111582906130cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c491906140c9565b60405180910390fd5b50600083856130dc9190613884565b9050809150509392505050565b600061314b826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131b09092919063ffffffff16565b90506000815111156131ab578080602001905181019061316b9190614100565b6131aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a19061419f565b60405180910390fd5b5b505050565b60606131bf84846000856131c8565b90509392505050565b60606131d3856132ea565b613212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132099061420b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161323b9190614272565b60006040518083038185875af1925050503d8060008114613278576040519150601f19603f3d011682016040523d82523d6000602084013e61327d565b606091505b509150915081156132925780925050506132e2565b6000815111156132a55780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d991906140c9565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561332c57506000801b8214155b92505050919050565b6000819050919050565b61334881613335565b82525050565b6000602082019050613363600083018461333f565b92915050565b600080fd5b60008115159050919050565b6133838161336e565b811461338e57600080fd5b50565b6000813590506133a08161337a565b92915050565b6000602082840312156133bc576133bb613369565b5b60006133ca84828501613391565b91505092915050565b6133dc81613335565b81146133e757600080fd5b50565b6000813590506133f9816133d3565b92915050565b6000806040838503121561341657613415613369565b5b6000613424858286016133ea565b9250506020613435858286016133ea565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061346a8261343f565b9050919050565b61347a8161345f565b811461348557600080fd5b50565b60008135905061349781613471565b92915050565b6000602082840312156134b3576134b2613369565b5b60006134c184828501613488565b91505092915050565b6000602082840312156134e0576134df613369565b5b60006134ee848285016133ea565b91505092915050565b6000819050919050565b600061351c6135176135128461343f565b6134f7565b61343f565b9050919050565b600061352e82613501565b9050919050565b600061354082613523565b9050919050565b61355081613535565b82525050565b600060808201905061356b6000830187613547565b613578602083018661333f565b613585604083018561333f565b613592606083018461333f565b95945050505050565b600060a0820190506135b0600083018861333f565b6135bd602083018761333f565b6135ca604083018661333f565b6135d7606083018561333f565b6135e4608083018461333f565b9695505050505050565b6135f78161336e565b82525050565b600060208201905061361260008301846135ee565b92915050565b600060208201905061362d6000830184613547565b92915050565b61363c8161345f565b82525050565b60006020820190506136576000830184613633565b92915050565b6000806040838503121561367457613673613369565b5b600061368285828601613488565b925050602061369385828601613391565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136e460208361369d565b91506136ef826136ae565b602082019050919050565b60006020820190508181036000830152613713816136d7565b9050919050565b7f616d6f756e742070657220626f6f737420746f6f206869676800000000000000600082015250565b600061375060198361369d565b915061375b8261371a565b602082019050919050565b6000602082019050818103600083015261377f81613743565b9050919050565b7f4e6f7420417574686f72697a6564000000000000000000000000000000000000600082015250565b60006137bc600e8361369d565b91506137c782613786565b602082019050919050565b600060208201905081810360008301526137eb816137af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061385b82613335565b915061386683613335565b925082820190508082111561387e5761387d613821565b5b92915050565b600061388f82613335565b915061389a83613335565b92508282039050818111156138b2576138b1613821565b5b92915050565b60006138c382613335565b91506138ce83613335565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561390757613906613821565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061394c82613335565b915061395783613335565b92508261396757613966613912565b5b828204905092915050565b600081519050613981816133d3565b92915050565b60006020828403121561399d5761399c613369565b5b60006139ab84828501613972565b91505092915050565b7f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000600082015250565b60006139ea601d8361369d565b91506139f5826139b4565b602082019050919050565b60006020820190508181036000830152613a19816139dd565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613a56601f8361369d565b9150613a6182613a20565b602082019050919050565b60006020820190508181036000830152613a8581613a49565b9050919050565b7f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c79600082015250565b6000613ac260208361369d565b9150613acd82613a8c565b602082019050919050565b60006020820190508181036000830152613af181613ab5565b9050919050565b7f43616e6e6f74207769746864726177206f746865722070656f706c652773207360008201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e602082015250565b6000613b5460408361369d565b9150613b5f82613af8565b604082019050919050565b60006020820190508181036000830152613b8381613b47565b9050919050565b6000613b9582613335565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bc757613bc6613821565b5b600182019050919050565b7f43616e206f6e6c792073746172742072657761726473206f6e63650000000000600082015250565b6000613c08601b8361369d565b9150613c1382613bd2565b602082019050919050565b60006020820190508181036000830152613c3781613bfb565b9050919050565b7f415052206d7573742062652062656c6f77203130303025000000000000000000600082015250565b6000613c7460178361369d565b9150613c7f82613c3e565b602082019050919050565b60006020820190508181036000830152613ca381613c67565b9050919050565b7f4d6179206e6f742073657420686967686572207468616e203230250000000000600082015250565b6000613ce0601b8361369d565b9150613ceb82613caa565b602082019050919050565b60006020820190508181036000830152613d0f81613cd3565b9050919050565b7f43616e6e6f74207374616b65206d6f7265000000000000000000000000000000600082015250565b6000613d4c60118361369d565b9150613d5782613d16565b602082019050919050565b60006020820190508181036000830152613d7b81613d3f565b9050919050565b7f4c6f636b206d757374206265203336352064617973206f72206c6573732e0000600082015250565b6000613db8601e8361369d565b9150613dc382613d82565b602082019050919050565b60006020820190508181036000830152613de781613dab565b9050919050565b7f43616e6e6f7420636f6d706f756e640000000000000000000000000000000000600082015250565b6000613e24600f8361369d565b9150613e2f82613dee565b602082019050919050565b60006020820190508181036000830152613e5381613e17565b9050919050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eb660218361369d565b9150613ec182613e5a565b604082019050919050565b60006020820190508181036000830152613ee581613ea9565b9050919050565b6000604082019050613f016000830185613633565b613f0e602083018461333f565b9392505050565b6000606082019050613f2a6000830186613633565b613f376020830185613633565b613f44604083018461333f565b949350505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000613f82601b8361369d565b9150613f8d82613f4c565b602082019050919050565b60006020820190508181036000830152613fb181613f75565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061401460268361369d565b915061401f82613fb8565b604082019050919050565b6000602082019050818103600083015261404381614007565b9050919050565b600081519050919050565b60005b83811015614073578082015181840152602081019050614058565b60008484015250505050565b6000601f19601f8301169050919050565b600061409b8261404a565b6140a5818561369d565b93506140b5818560208601614055565b6140be8161407f565b840191505092915050565b600060208201905081810360008301526140e38184614090565b905092915050565b6000815190506140fa8161337a565b92915050565b60006020828403121561411657614115613369565b5b6000614124848285016140eb565b91505092915050565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614189602a8361369d565b91506141948261412d565b604082019050919050565b600060208201905081810360008301526141b88161417c565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006141f5601d8361369d565b9150614200826141bf565b602082019050919050565b60006020820190508181036000830152614224816141e8565b9050919050565b600081519050919050565b600081905092915050565b600061424c8261422b565b6142568185614236565b9350614266818560208601614055565b80840191505092915050565b600061427e8284614241565b91508190509291505056fea2646970667358221220aa60e3c9783cb3e21d959ebbb82341e11137268e2ae3df42851accbb26e9970364736f6c63430008100033000000000000000000000000dd3a88ef8535ff7b19178b735c52ea277ef256230000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023d5760003560e01c806378c196f31161013b578063a913a5f7116100b8578063eecea0001161007c578063eecea00014610639578063f2fde38b14610655578063f40f0f5214610671578063f69e2046146106a1578063f7c618c1146106ab5761023d565b8063a913a5f7146105ab578063b6b55f25146105db578063d477edf4146105f7578063dac4516514610613578063db2e21bc1461062f5761023d565b806387f3b92a116100ff57806387f3b92a146104f35780638da5cb5b146105235780638e0b019814610541578063999e2f751461055d578063a09552061461057b5761023d565b806378c196f3146104735780637b280def1461049157806380dc0672146104af578063817b1cd2146104b95780638552bf90146104d75761023d565b80633279beab116101c95780636787e79e1161018d5780636787e79e146103f357806368365d0314610423578063715018a61461044157806372f702f31461044b578063746c8ae1146104695761023d565b80633279beab146103875780633ccfd60b146103a357806357ded9c9146103ad5780635bcd0bdb146103cb578063630b5ba1146103e95761023d565b80631385ae5b116102105780631385ae5b146102b45780631526fe27146102d25780631959a0021461030557806319af52a214610339578063221ac771146103695761023d565b806304554443146102425780630698260f1461026057806308aa16791461027c5780630dbd526a14610298575b600080fd5b61024a6106c9565b604051610257919061334e565b60405180910390f35b61027a600480360381019061027591906133a6565b6106cf565b005b610296600480360381019061029191906133ff565b610781565b005b6102b260048036038101906102ad919061349d565b61086c565b005b6102bc610a85565b6040516102c9919061334e565b60405180910390f35b6102ec60048036038101906102e791906134ca565b610a8b565b6040516102fc9493929190613556565b60405180910390f35b61031f600480360381019061031a919061349d565b610aeb565b60405161033095949392919061359b565b60405180910390f35b610353600480360381019061034e919061349d565b610b21565b604051610360919061334e565b60405180910390f35b610371610ba4565b60405161037e919061334e565b60405180910390f35b6103a1600480360381019061039c91906134ca565b610baa565b005b6103ab610d76565b005b6103b56111b1565b6040516103c2919061334e565b60405180910390f35b6103d36111b7565b6040516103e0919061334e565b60405180910390f35b6103f16111bd565b005b61040d6004803603810190610408919061349d565b611285565b60405161041a919061334e565b60405180910390f35b61042b61130a565b60405161043891906135fd565b60405180910390f35b61044961131d565b005b610453611470565b6040516104609190613618565b60405180910390f35b610471611494565b005b61047b6115c3565b604051610488919061334e565b60405180910390f35b610499611671565b6040516104a6919061334e565b60405180910390f35b6104b7611677565b005b6104c1611720565b6040516104ce919061334e565b60405180910390f35b6104f160048036038101906104ec91906134ca565b611726565b005b61050d6004803603810190610508919061349d565b611814565b60405161051a91906135fd565b60405180910390f35b61052b611834565b6040516105389190613642565b60405180910390f35b61055b600480360381019061055691906134ca565b61185d565b005b610565611940565b604051610572919061334e565b60405180910390f35b6105956004803603810190610590919061349d565b6119ca565b6040516105a2919061334e565b60405180910390f35b6105c560048036038101906105c0919061349d565b6119e2565b6040516105d2919061334e565b60405180910390f35b6105f560048036038101906105f091906134ca565b6119fa565b005b610611600480360381019061060c91906134ca565b611f9b565b005b61062d6004803603810190610628919061349d565b61208d565b005b6106376122eb565b005b610653600480360381019061064e919061365d565b61256f565b005b61066f600480360381019061066a919061349d565b61265f565b005b61068b6004803603810190610686919061349d565b612700565b604051610698919061334e565b60405180910390f35b6106a9612884565b005b6106b3612b6b565b6040516106c09190613618565b60405180910390f35b60075481565b6106d7612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075b906136fa565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b610789612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080d906136fa565b60405180910390fd5b606481111561085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085190613766565b60405180910390fd5b81600a81905550806009819055505050565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef906137d2565b60405180910390fd5b6000600d60008154811061090f5761090e6137f2565b5b906000526020600020906004020190506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600201541115610a80576109796000612b97565b600081600401546109c883600301546109ba64e8d4a510006109ac88600301548860010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b612d3f90919063ffffffff16565b6109d29190613850565b90508082600401819055508160010154600560008282546109f39190613884565b925050819055506001826002016000828254610a0f9190613884565b92505081905550610a1f84611285565b8260010181905550816001015460056000828254610a3d9190613850565b92505081905550610a7664e8d4a51000610a6885600301548560010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b8260030181905550505b505050565b60055481565b600d8181548110610a9b57600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b600e6020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060646009548260020154610b7991906138b8565b6064610b859190613850565b600654610b9291906138b8565b610b9c9190613941565b915050919050565b600a5481565b610bb2612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c36906136fa565b60405180910390fd5b6004547f000000000000000000000000dd3a88ef8535ff7b19178b735c52ea277ef2562373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c9b9190613642565b602060405180830381865afa158015610cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdc9190613987565b610ce69190613884565b811115610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f90613a00565b60405180910390fd5b610d7333827f000000000000000000000000dd3a88ef8535ff7b19178b735c52ea277ef2562373ffffffffffffffffffffffffffffffffffffffff16612d899092919063ffffffff16565b50565b600260015403610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db290613a6c565b60405180910390fd5b600260018190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90613ad8565b60405180910390fd5b6000600d600081548110610e5c57610e5b6137f2565b5b906000526020600020906004020190506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050610ec26000612b97565b60008260040154610f118460030154610f0364e8d4a51000610ef589600301548960010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b612d3f90919063ffffffff16565b610f1b9190613850565b9050600083600401819055506000811115610fc657610f386115c3565b811115610f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7190613b6a565b60405180910390fd5b610fc533827f000000000000000000000000dd3a88ef8535ff7b19178b735c52ea277ef2562373ffffffffffffffffffffffffffffffffffffffff16612d899092919063ffffffff16565b5b600082111561107357826001015460056000828254610fe59190613884565b92505081905550600083600101819055506000836002018190555060008360000181905550816004600082825461101c9190613884565b9250508190555061107233838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612d899092919063ffffffff16565b5b6110a564e8d4a5100061109786600301548660010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b836003018190555060008360000154111561111057600754426110c89190613850565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611156565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243648360405161119c919061334e565b60405180910390a25050505060018081905550565b60065481565b60095481565b6111c5612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611252576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611249906136fa565b60405180910390fd5b6000600d80549050905060005b818110156112815761127081612b97565b8061127a90613b8a565b905061125f565b5050565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050606460095482600201546112dd91906138b8565b60646112e99190613850565b82600001546112f891906138b8565b6113029190613941565b915050919050565b600c60009054906101000a900460ff1681565b611325612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a9906136fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000dd3a88ef8535ff7b19178b735c52ea277ef2562381565b61149c612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611529576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611520906136fa565b60405180910390fd5b64174876e7ff600d600081548110611544576115436137f2565b5b90600052602060002090600402016002015414611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90613c1e565b60405180910390fd5b42600d6000815481106115ac576115ab6137f2565b5b906000526020600020906004020160020181905550565b60006004547f000000000000000000000000dd3a88ef8535ff7b19178b735c52ea277ef2562373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116219190613642565b602060405180830381865afa15801561163e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116629190613987565b61166c9190613884565b905090565b60085481565b61167f612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461170c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611703906136fa565b60405180910390fd5b6117166000612b97565b6000600681905550565b60045481565b61172e612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b2906136fa565b60405180910390fd5b6103e8811115611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790613c8a565b60405180910390fd5b61180a6000612b97565b8060068190555050565b60036020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611865612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e9906136fa565b60405180910390fd5b6014811115611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d90613cf6565b60405180910390fd5b8060088190555050565b600080600d600081548110611958576119576137f2565b5b90600052602060002090600402019050428160020154111561197e5760009150506119c7565b6301e13380606460065460055484600201544261199b9190613884565b6119a591906138b8565b6119af91906138b8565b6119b99190613941565b6119c39190613941565b9150505b90565b600b6020528060005260406000206000915090505481565b60026020528060005260406000206000915090505481565b600260015403611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690613a6c565b60405180910390fd5b60026001819055506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403611ae05760075442611a9c9190613850565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600d600081548110611af757611af66137f2565b5b906000526020600020906004020190506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600c60009054906101000a900460ff16158015611b675750600083115b15611bb4576000816001015414611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa90613d62565b60405180910390fd5b5b611bbe6000612b97565b600081600101541115611cd15760008160040154611c1a8360030154611c0c64e8d4a51000611bfe88600301548860010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b612d3f90919063ffffffff16565b611c249190613850565b9050600082600401819055506000811115611ccf57611c416115c3565b811115611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a90613b6a565b60405180910390fd5b611cce33827f000000000000000000000000dd3a88ef8535ff7b19178b735c52ea277ef2562373ffffffffffffffffffffffffffffffffffffffff16612d899092919063ffffffff16565b5b505b600080841115611f0657611ce433611285565b60056000828254611cf59190613884565b9250508190555060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d5b9190613642565b602060405180830381865afa158015611d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9c9190613987565b9050611def3330878760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612e0f909392919063ffffffff16565b808460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e4d9190613642565b602060405180830381865afa158015611e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e9190613987565b611e989190613884565b9150611eb1828460000154612e9890919063ffffffff16565b83600001819055508160046000828254611ecb9190613850565b92505081905550611edb33611285565b60056000828254611eec9190613850565b92505081905550611efc33611285565b8360010181905550505b611f3864e8d4a51000611f2a85600301548560010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b82600301819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c85604051611f86919061334e565b60405180910390a25050506001808190555050565b611fa3612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612030576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612027906136fa565b60405180910390fd5b61016d811115612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c90613dce565b60405180910390fd5b620151808161208491906138b8565b60078190555050565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612119576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612110906137d2565b60405180910390fd5b6000600d6000815481106121305761212f6137f2565b5b906000526020600020906004020190506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600a54816002015410156122e65761219b6000612b97565b600081600401546121ea83600301546121dc64e8d4a510006121ce88600301548860010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b612d3f90919063ffffffff16565b6121f49190613850565b90508082600401819055508160010154600560008282546122159190613884565b9250508190555060018260020160008282546122319190613850565b9250508190555061224184611285565b826001018190555081600101546005600082825461225f9190613850565b9250508190555061229864e8d4a5100061228a85600301548560010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b826003018190555042600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b505050565b600260015403612330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232790613a6c565b60405180910390fd5b60026001819055506000600d60008154811061234f5761234e6137f2565b5b906000526020600020906004020190506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490508160010154600560008282546123c19190613884565b9250508190555080600460008282546123da9190613884565b9250508190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061244f5760646008548261243791906138b8565b6124419190613941565b8161244c9190613884565b90505b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506124e333828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612d899092919063ffffffff16565b60008260000181905550600082600101819055506000826002018190555060008260030181905550600082600401819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96958260405161255b919061334e565b60405180910390a250505060018081905550565b612577612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fb906136fa565b60405180910390fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612667612b8f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb906136fa565b60405180910390fd5b6126fd81612ef6565b50565b600080600d600081548110612718576127176137f2565b5b906000526020600020906004020190506000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905064174876e7ff8260020154036127865760009250505061287f565b600082600301549050600060055490508360020154421180156127aa575060008114155b156128255760006127e3600f546127d587600101546127c7611940565b612c7b90919063ffffffff16565b612cf590919063ffffffff16565b90506128216128128361280464e8d4a5100085612c7b90919063ffffffff16565b612cf590919063ffffffff16565b84612e9890919063ffffffff16565b9250505b826004015461286e846003015461286064e8d4a51000612852878960010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b612d3f90919063ffffffff16565b6128789190613850565b9450505050505b919050565b6002600154036128c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c090613a6c565b60405180910390fd5b6002600181905550600c60009054906101000a900460ff16612920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291790613e3a565b60405180910390fd5b6000600d600081548110612937576129366137f2565b5b906000526020600020906004020190506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506129946000612b97565b600081600101541115612ae357600081600401546129f083600301546129e264e8d4a510006129d488600301548860010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b612d3f90919063ffffffff16565b6129fa9190613850565b9050600082600401819055506000811115612ae157612a176115c3565b811115612a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5090613b6a565b60405180910390fd5b612a6233611285565b60056000828254612a739190613884565b9250508190555080826000016000828254612a8e9190613850565b925050819055508060046000828254612aa79190613850565b92505081905550612ab733611285565b60056000828254612ac89190613850565b92505081905550612ad833611285565b82600101819055505b505b612b1564e8d4a51000612b0784600301548460010154612c7b90919063ffffffff16565b612cf590919063ffffffff16565b81600301819055503373ffffffffffffffffffffffffffffffffffffffff167fda323bd96658b18a6ce813e824305dc61760462bad6aaf52c65aebb8c8c9faa160405160405180910390a2505060018081905550565b7f000000000000000000000000dd3a88ef8535ff7b19178b735c52ea277ef2562381565b600033905090565b6000600d8281548110612bad57612bac6137f2565b5b9060005260206000209060040201905080600201544211612bce5750612c78565b6000600554905060008103612bed574282600201819055505050612c78565b6000612c21600f54612c138560010154612c05611940565b612c7b90919063ffffffff16565b612cf590919063ffffffff16565b9050612c63612c5083612c4264e8d4a5100085612c7b90919063ffffffff16565b612cf590919063ffffffff16565b8460030154612e9890919063ffffffff16565b83600301819055504283600201819055505050505b50565b6000808303612c8d5760009050612cef565b60008284612c9b91906138b8565b9050828482612caa9190613941565b14612cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce190613ecc565b60405180910390fd5b809150505b92915050565b6000612d3783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613022565b905092915050565b6000612d8183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613085565b905092915050565b612e0a8363a9059cbb60e01b8484604051602401612da8929190613eec565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130e9565b505050565b612e92846323b872dd60e01b858585604051602401612e3093929190613f15565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130e9565b50505050565b6000808284612ea79190613850565b905083811015612eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee390613f98565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5c9061402a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290613069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306091906140c9565b60405180910390fd5b50600083856130789190613941565b9050809150509392505050565b60008383111582906130cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c491906140c9565b60405180910390fd5b50600083856130dc9190613884565b9050809150509392505050565b600061314b826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131b09092919063ffffffff16565b90506000815111156131ab578080602001905181019061316b9190614100565b6131aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a19061419f565b60405180910390fd5b5b505050565b60606131bf84846000856131c8565b90509392505050565b60606131d3856132ea565b613212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132099061420b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161323b9190614272565b60006040518083038185875af1925050503d8060008114613278576040519150601f19603f3d011682016040523d82523d6000602084013e61327d565b606091505b509150915081156132925780925050506132e2565b6000815111156132a55780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d991906140c9565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561332c57506000801b8214155b92505050919050565b6000819050919050565b61334881613335565b82525050565b6000602082019050613363600083018461333f565b92915050565b600080fd5b60008115159050919050565b6133838161336e565b811461338e57600080fd5b50565b6000813590506133a08161337a565b92915050565b6000602082840312156133bc576133bb613369565b5b60006133ca84828501613391565b91505092915050565b6133dc81613335565b81146133e757600080fd5b50565b6000813590506133f9816133d3565b92915050565b6000806040838503121561341657613415613369565b5b6000613424858286016133ea565b9250506020613435858286016133ea565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061346a8261343f565b9050919050565b61347a8161345f565b811461348557600080fd5b50565b60008135905061349781613471565b92915050565b6000602082840312156134b3576134b2613369565b5b60006134c184828501613488565b91505092915050565b6000602082840312156134e0576134df613369565b5b60006134ee848285016133ea565b91505092915050565b6000819050919050565b600061351c6135176135128461343f565b6134f7565b61343f565b9050919050565b600061352e82613501565b9050919050565b600061354082613523565b9050919050565b61355081613535565b82525050565b600060808201905061356b6000830187613547565b613578602083018661333f565b613585604083018561333f565b613592606083018461333f565b95945050505050565b600060a0820190506135b0600083018861333f565b6135bd602083018761333f565b6135ca604083018661333f565b6135d7606083018561333f565b6135e4608083018461333f565b9695505050505050565b6135f78161336e565b82525050565b600060208201905061361260008301846135ee565b92915050565b600060208201905061362d6000830184613547565b92915050565b61363c8161345f565b82525050565b60006020820190506136576000830184613633565b92915050565b6000806040838503121561367457613673613369565b5b600061368285828601613488565b925050602061369385828601613391565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136e460208361369d565b91506136ef826136ae565b602082019050919050565b60006020820190508181036000830152613713816136d7565b9050919050565b7f616d6f756e742070657220626f6f737420746f6f206869676800000000000000600082015250565b600061375060198361369d565b915061375b8261371a565b602082019050919050565b6000602082019050818103600083015261377f81613743565b9050919050565b7f4e6f7420417574686f72697a6564000000000000000000000000000000000000600082015250565b60006137bc600e8361369d565b91506137c782613786565b602082019050919050565b600060208201905081810360008301526137eb816137af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061385b82613335565b915061386683613335565b925082820190508082111561387e5761387d613821565b5b92915050565b600061388f82613335565b915061389a83613335565b92508282039050818111156138b2576138b1613821565b5b92915050565b60006138c382613335565b91506138ce83613335565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561390757613906613821565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061394c82613335565b915061395783613335565b92508261396757613966613912565b5b828204905092915050565b600081519050613981816133d3565b92915050565b60006020828403121561399d5761399c613369565b5b60006139ab84828501613972565b91505092915050565b7f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000600082015250565b60006139ea601d8361369d565b91506139f5826139b4565b602082019050919050565b60006020820190508181036000830152613a19816139dd565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613a56601f8361369d565b9150613a6182613a20565b602082019050919050565b60006020820190508181036000830152613a8581613a49565b9050919050565b7f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c79600082015250565b6000613ac260208361369d565b9150613acd82613a8c565b602082019050919050565b60006020820190508181036000830152613af181613ab5565b9050919050565b7f43616e6e6f74207769746864726177206f746865722070656f706c652773207360008201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e602082015250565b6000613b5460408361369d565b9150613b5f82613af8565b604082019050919050565b60006020820190508181036000830152613b8381613b47565b9050919050565b6000613b9582613335565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bc757613bc6613821565b5b600182019050919050565b7f43616e206f6e6c792073746172742072657761726473206f6e63650000000000600082015250565b6000613c08601b8361369d565b9150613c1382613bd2565b602082019050919050565b60006020820190508181036000830152613c3781613bfb565b9050919050565b7f415052206d7573742062652062656c6f77203130303025000000000000000000600082015250565b6000613c7460178361369d565b9150613c7f82613c3e565b602082019050919050565b60006020820190508181036000830152613ca381613c67565b9050919050565b7f4d6179206e6f742073657420686967686572207468616e203230250000000000600082015250565b6000613ce0601b8361369d565b9150613ceb82613caa565b602082019050919050565b60006020820190508181036000830152613d0f81613cd3565b9050919050565b7f43616e6e6f74207374616b65206d6f7265000000000000000000000000000000600082015250565b6000613d4c60118361369d565b9150613d5782613d16565b602082019050919050565b60006020820190508181036000830152613d7b81613d3f565b9050919050565b7f4c6f636b206d757374206265203336352064617973206f72206c6573732e0000600082015250565b6000613db8601e8361369d565b9150613dc382613d82565b602082019050919050565b60006020820190508181036000830152613de781613dab565b9050919050565b7f43616e6e6f7420636f6d706f756e640000000000000000000000000000000000600082015250565b6000613e24600f8361369d565b9150613e2f82613dee565b602082019050919050565b60006020820190508181036000830152613e5381613e17565b9050919050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eb660218361369d565b9150613ec182613e5a565b604082019050919050565b60006020820190508181036000830152613ee581613ea9565b9050919050565b6000604082019050613f016000830185613633565b613f0e602083018461333f565b9392505050565b6000606082019050613f2a6000830186613633565b613f376020830185613633565b613f44604083018461333f565b949350505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000613f82601b8361369d565b9150613f8d82613f4c565b602082019050919050565b60006020820190508181036000830152613fb181613f75565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061401460268361369d565b915061401f82613fb8565b604082019050919050565b6000602082019050818103600083015261404381614007565b9050919050565b600081519050919050565b60005b83811015614073578082015181840152602081019050614058565b60008484015250505050565b6000601f19601f8301169050919050565b600061409b8261404a565b6140a5818561369d565b93506140b5818560208601614055565b6140be8161407f565b840191505092915050565b600060208201905081810360008301526140e38184614090565b905092915050565b6000815190506140fa8161337a565b92915050565b60006020828403121561411657614115613369565b5b6000614124848285016140eb565b91505092915050565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614189602a8361369d565b91506141948261412d565b604082019050919050565b600060208201905081810360008301526141b88161417c565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006141f5601d8361369d565b9150614200826141bf565b602082019050919050565b60006020820190508181036000830152614224816141e8565b9050919050565b600081519050919050565b600081905092915050565b600061424c8261422b565b6142568185614236565b9350614266818560208601614055565b80840191505092915050565b600061427e8284614241565b91508190509291505056fea2646970667358221220aa60e3c9783cb3e21d959ebbb82341e11137268e2ae3df42851accbb26e9970364736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000dd3a88ef8535ff7b19178b735c52ea277ef256230000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _tokenAddress (address): 0xdD3A88EF8535Ff7b19178B735C52eA277eF25623
Arg [1] : _apr (uint256): 100
Arg [2] : _lockDurationInDays (uint256): 0
Arg [3] : _exitPenaltyPerc (uint256): 0
Arg [4] : _canCompoundOrStakeMore (bool): True
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000dd3a88ef8535ff7b19178b735c52ea277ef25623
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode Sourcemap
24689:14107:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25904:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36441:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38525:268;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37792:725;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25839:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26186:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;26268:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;36803:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26013:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35095:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32723:1344;;;:::i;:::-;;25879:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25977:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29668:190;;;:::i;:::-;;36587:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26116:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2810:140;;;:::i;:::-;;25605:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27868:207;;;:::i;:::-;;35683:133;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25938:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27769:91;;;:::i;:::-;;25806:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35824:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25751:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2168:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36241:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35359:316;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26049:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25690:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29895:1708;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36039:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37001:783;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34138:808;;;:::i;:::-;;27628:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3105:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28140:762;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31611:1056;;;:::i;:::-;;25648:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25904:27;;;;:::o;36441:138::-;2390:12;:10;:12::i;:::-;2380:22;;:6;;;;;;;;;;:22;;;2372:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36556:15:::1;36531:22;;:40;;;;;;;;;;;;;;;;;;36441:138:::0;:::o;38525:268::-;2390:12;:10;:12::i;:::-;2380:22;;:6;;;;;;;;;;:22;;;2372:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38662:3:::1;38641:17;:24;;38633:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;38723:17;38706:14;:34;;;;38768:17;38751:14;:34;;;;38525:268:::0;;:::o;37792:725::-;27556:13;:25;27570:10;27556:25;;;;;;;;;;;;;;;;;;;;;;;;;27548:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;37874:21:::1;37898:8;37907:1;37898:11;;;;;;;;:::i;:::-;;;;;;;;;;;;37874:35;;37920:21;37944:8;:16;37953:6;37944:16;;;;;;;;;;;;;;;37920:40;;37988:1;37974:4;:11;;;:15;37971:529;;;38005:13;38016:1;38005:10;:13::i;:::-;38033:15;38131:4;:18;;;38051:77;38112:4;:15;;;38051:56;38102:4;38051:46;38074:4;:22;;;38051:4;:18;;;:22;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;:60;;:77;;;;:::i;:::-;:98;;;;:::i;:::-;38033:116;;38185:7;38164:4;:18;;:28;;;;38229:4;:18;;;38207;;:40;;;;;;;:::i;:::-;;;;;;;;38277:1;38262:4;:11;;;:16;;;;;;;:::i;:::-;;;;;;;;38314:30;38337:6;38314:22;:30::i;:::-;38293:4;:18;;:51;;;;38381:4;:18;;;38359;;:40;;;;;;;:::i;:::-;;;;;;;;38432:56;38483:4;38432:46;38455:4;:22;;;38432:4;:18;;;:22;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;38414:4;:15;;:74;;;;37990:510;37971:529;37853:664;;37792:725:::0;:::o;25839:33::-;;;;:::o;26186:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26268:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36803:190::-;36862:7;36881:21;36905:8;:16;36914:6;36905:16;;;;;;;;;;;;;;;36881:40;;36982:3;36963:14;;36951:4;:11;;;:26;;;;:::i;:::-;36946:3;:32;;;;:::i;:::-;36939:3;;:40;;;;:::i;:::-;:46;;;;:::i;:::-;36932:53;;;36803:190;;;:::o;26013:29::-;;;;:::o;35095:256::-;2390:12;:10;:12::i;:::-;2380:22;;:6;;;;;;;;;;:22;;;2372:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35233:11:::1;;35194;:21;;;35224:4;35194:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;35183:7;:61;;35175:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35289:54;35322:10;35335:7;35289:11;:24;;;;:54;;;;;:::i;:::-;35095:256:::0;:::o;32723:1344::-;23742:1;24340:7;;:19;24332:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23742:1;24473:7;:18;;;;32818:15:::1;32786:16;:28;32803:10;32786:28;;;;;;;;;;;;;;;;:47;;32778:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;32891:21;32915:8;32924:1;32915:11;;;;;;;;:::i;:::-;;;;;;;;;;;;32891:35;;32937:21;32961:8;:20;32970:10;32961:20;;;;;;;;;;;;;;;32937:44;;32994:15;33012:4;:11;;;32994:29;;33034:13;33045:1;33034:10;:13::i;:::-;33058:15;33156:4;:18;;;33076:77;33137:4;:15;;;33076:56;33127:4;33076:46;33099:4;:22;;;33076:4;:18;;;:22;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;:60;;:77;;;;:::i;:::-;:98;;;;:::i;:::-;33058:116;;33206:1;33185:4;:18;;:22;;;;33231:1;33221:7;:11;33218:217;;;33267:18;:16;:18::i;:::-;33256:7;:29;;33248:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;33369:54;33402:10;33415:7;33369:11;:24;;;;:54;;;;;:::i;:::-;33218:217;33460:1;33450:7;:11;33447:287;;;33500:4;:18;;;33478;;:40;;;;;;;:::i;:::-;;;;;;;;33554:1;33533:4;:18;;:22;;;;33584:1;33570:4;:11;;:15;;;;33614:1;33600:4;:11;;:15;;;;33645:7;33630:11;;:22;;;;;;;:::i;:::-;;;;;;;;33667:55;33701:10;33714:7;33667:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;33447:287;33764:56;33815:4;33764:46;33787:4;:22;;;33764:4;:18;;;:22;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;33746:4;:15;;:74;;;;33858:1;33844:4;:11;;;:15;33841:172;;;33924:12;;33906:15;:30;;;;:::i;:::-;33875:16;:28;33892:10;33875:28;;;;;;;;;;;;;;;:61;;;;33841:172;;;34000:1;33969:16;:28;33986:10;33969:28;;;;;;;;;;;;;;;:32;;;;33841:172;34039:10;34030:29;;;34051:7;34030:29;;;;;;:::i;:::-;;;;;;;;32765:1302;;;;23698:1:::0;24652:7;:22;;;;32723:1344::o;25879:18::-;;;;:::o;25977:29::-;;;;:::o;29668:190::-;2390:12;:10;:12::i;:::-;2380:22;;:6;;;;;;;;;;:22;;;2372:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29723:14:::1;29740:8;:15;;;;29723:32;;29771:11;29766:85;29794:6;29788:3;:12;29766:85;;;29824:15;29835:3;29824:10;:15::i;:::-;29802:5;;;;:::i;:::-;;;29766:85;;;;29712:146;29668:190::o:0;36587:208::-;36656:7;36675:21;36699:8;:16;36708:6;36699:16;;;;;;;;;;;;;;;36675:40;;36784:3;36765:14;;36753:4;:11;;;:26;;;;:::i;:::-;36748:3;:32;;;;:::i;:::-;36733:4;:11;;;:48;;;;:::i;:::-;:54;;;;:::i;:::-;36726:61;;;36587:208;;;:::o;26116:34::-;;;;;;;;;;;;;:::o;2810:140::-;2390:12;:10;:12::i;:::-;2380:22;;:6;;;;;;;;;;:22;;;2372:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2909:1:::1;2872:40;;2893:6;::::0;::::1;;;;;;;;2872:40;;;;;;;;;;;;2940:1;2923:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2810:140::o:0;25605:36::-;;;:::o;27868:207::-;2390:12;:10;:12::i;:::-;2380:22;;:6;;;;;;;;;;:22;;;2372:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27964:11:::1;27929:8;27938:1;27929:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;:46;27921:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;28052:15;28018:8;28027:1;28018:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;:49;;;;27868:207::o:0;35683:133::-;35732:7;35797:11;;35758;:21;;;35788:4;35758:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;35751:57;;35683:133;:::o;25938:30::-;;;;:::o;27769:91::-;2390:12;:10;:12::i;:::-;2380:22;;:6;;;;;;;;;;:22;;;2372:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27821:13:::1;27832:1;27821:10;:13::i;:::-;27851:1;27845:3;:7;;;;27769:91::o:0;25806:26::-;;;;:::o;35824:170::-;2390:12;:10;:12::i;:::-;2380:22;;:6;;;;;;;;;;:22;;;2372:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35907:4:::1;35897:6;:14;;35889:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;35950:13;35961:1;35950:10;:13::i;:::-;35980:6;35974:3;:12;;;;35824:170:::0;:::o;25751:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;2168:79::-;2206:7;2233:6;;;;;;;;;;;2226:13;;2168:79;:::o;36241:192::-;2390:12;:10;:12::i;:::-;2380:22;;:6;;;;;;;;;;:22;;;2372:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36348:2:::1;36330:14;:20;;36322:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;36411:14;36393:15;:32;;;;36241:192:::0;:::o;35359:316::-;35411:7;35431:21;35455:8;35464:1;35455:11;;;;;;;;:::i;:::-;;;;;;;;;;;;35431:35;;35507:15;35480:4;:24;;;:42;35477:81;;;35545:1;35538:8;;;;;35477:81;35658:8;35652:3;35646;;35624:18;;35596:4;:24;;;35578:15;:42;;;;:::i;:::-;35577:65;;;;:::i;:::-;35576:73;;;;:::i;:::-;:79;;;;:::i;:::-;:90;;;;:::i;:::-;35568:99;;;35359:316;;:::o;26049:54::-;;;;;;;;;;;;;;;;;:::o;25690:52::-;;;;;;;;;;;;;;;;;:::o;29895:1708::-;23742:1;24340:7;;:19;24332:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23742:1;24473:7;:18;;;;29997:1:::1;29965:16;:28;29982:10;29965:28;;;;;;;;;;;;;;;;:33:::0;29962:125:::1;;30063:12;;30045:15;:30;;;;:::i;:::-;30014:16;:28;30031:10;30014:28;;;;;;;;;;;;;;;:61;;;;29962:125;30097:21;30121:8;30130:1;30121:11;;;;;;;;:::i;:::-;;;;;;;;;;;;30097:35;;30143:21;30167:8;:20;30176:10;30167:20;;;;;;;;;;;;;;;30143:44;;30204:22;;;;;;;;;;;30203:23;:38;;;;;30240:1;30230:7;:11;30203:38;30200:122;;;30287:1;30265:4;:18;;;:23;30257:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;30200:122;30334:13;30345:1;30334:10;:13::i;:::-;30383:1;30362:4;:18;;;:22;30358:452;;;30401:15;30499:4;:18;;;30419:77;30480:4;:15;;;30419:56;30470:4;30419:46;30442:4;:22;;;30419:4;:18;;;:22;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;:60;;:77;;;;:::i;:::-;:98;;;;:::i;:::-;30401:116;;30553:1;30532:4;:18;;:22;;;;30582:1;30572:7;:11;30569:230;;;30623:18;:16;:18::i;:::-;30612:7;:29;;30604:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;30729:54;30762:10;30775:7;30729:11;:24;;;;:54;;;;;:::i;:::-;30569:230;30386:424;30358:452;30820:25;30873:1:::0;30863:7:::1;:11;30860:605;;;30913:34;30936:10;30913:22;:34::i;:::-;30891:18;;:56;;;;;;;:::i;:::-;;;;;;;;30962:22;30987:4;:12;;;;;;;;;;;;:22;;;31018:4;30987:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30962:62;;31039:74;31077:10;31098:4;31105:7;31039:4;:12;;;;;;;;;;;;:29;;;;:74;;;;;;:::i;:::-;31188:14;31148:4;:12;;;;;;;;;;;;:22;;;31179:4;31148:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;31128:74;;31231:34;31247:17;31231:4;:11;;;:15;;:34;;;;:::i;:::-;31217:4;:11;;:48;;;;31295:17;31280:11;;:32;;;;;;;:::i;:::-;;;;;;;;31349:34;31372:10;31349:22;:34::i;:::-;31327:18;;:56;;;;;;;:::i;:::-;;;;;;;;31419:34;31442:10;31419:22;:34::i;:::-;31398:4;:18;;:55;;;;30876:589;30860:605;31493:56;31544:4;31493:46;31516:4;:22;;;31493:4;:18;;;:22;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;31475:4;:15;;:74;;;;31575:10;31567:28;;;31587:7;31567:28;;;;;;:::i;:::-;;;;;;;;29951:1652;;;23698:1:::0;24652:7;:22;;;;29895:1708;:::o;36039:194::-;2390:12;:10;:12::i;:::-;2380:22;;:6;;;;;;;;;;:22;;;2372:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36141:3:::1;36126:11;:18;;36118:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36219:6;36205:11;:20;;;;:::i;:::-;36190:12;:35;;;;36039:194:::0;:::o;37001:783::-;27556:13;:25;27570:10;27556:25;;;;;;;;;;;;;;;;;;;;;;;;;27548:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;37080:21:::1;37104:8;37113:1;37104:11;;;;;;;;:::i;:::-;;;;;;;;;;;;37080:35;;37126:21;37150:8;:16;37159:6;37150:16;;;;;;;;;;;;;;;37126:40;;37194:14;;37180:4;:11;;;:28;37177:600;;;37224:13;37235:1;37224:10;:13::i;:::-;37252:15;37350:4;:18;;;37270:77;37331:4;:15;;;37270:56;37321:4;37270:46;37293:4;:22;;;37270:4;:18;;;:22;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;:60;;:77;;;;:::i;:::-;:98;;;;:::i;:::-;37252:116;;37404:7;37383:4;:18;;:28;;;;37448:4;:18;;;37426;;:40;;;;;;;:::i;:::-;;;;;;;;37496:1;37481:4;:11;;;:16;;;;;;;:::i;:::-;;;;;;;;37533:30;37556:6;37533:22;:30::i;:::-;37512:4;:18;;:51;;;;37600:4;:18;;;37578;;:40;;;;;;;:::i;:::-;;;;;;;;37651:56;37702:4;37651:46;37674:4;:22;;;37651:4;:18;;;:22;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;37633:4;:15;;:74;;;;37750:15;37722:17;:25;37740:6;37722:25;;;;;;;;;;;;;;;:43;;;;37209:568;37177:600;37059:725;;37001:783:::0;:::o;34138:808::-;23742:1;24340:7;;:19;24332:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23742:1;24473:7;:18;;;;34200:21:::1;34224:8;34233:1;34224:11;;;;;;;;:::i;:::-;;;;;;;;;;;;34200:35;;34246:21;34270:8;:20;34279:10;34270:20;;;;;;;;;;;;;;;34246:44;;34301:15;34319:4;:11;;;34301:29;;34363:4;:18;;;34341;;:40;;;;;;;:::i;:::-;;;;;;;;34407:7;34392:11;;:22;;;;;;;:::i;:::-;;;;;;;;34543:15;34511:16;:28;34528:10;34511:28;;;;;;;;;;;;;;;;:47;34508:120;;34613:3;34595:15;;34585:7;:25;;;;:::i;:::-;:31;;;;:::i;:::-;34574:42;;;;;:::i;:::-;;;34508:120;34669:1;34638:16;:28;34655:10;34638:28;;;;;;;;;;;;;;;:32;;;;34681:55;34715:10;34728:7;34681:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;34761:1;34747:4;:11;;:15;;;;34794:1;34773:4;:18;;:22;;;;34820:1;34806:4;:11;;:15;;;;34850:1;34832:4;:15;;:19;;;;34883:1;34862:4;:18;;:22;;;;34918:10;34900:38;;;34930:7;34900:38;;;;;;:::i;:::-;;;;;;;;34189:757;;;23698:1:::0;24652:7;:22;;;;34138:808::o;27628:133::-;2390:12;:10;:12::i;:::-;2380:22;;:6;;;;;;;;;;:22;;;2372:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27743:10:::1;27718:13;:22;27732:7;27718:22;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;27628:133:::0;;:::o;3105:109::-;2390:12;:10;:12::i;:::-;2380:22;;:6;;;;;;;;;;:22;;;2372:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3178:28:::1;3197:8;3178:18;:28::i;:::-;3105:109:::0;:::o;28140:762::-;28201:7;28221:21;28245:8;28254:1;28245:11;;;;;;;;:::i;:::-;;;;;;;;;;;;28221:35;;28267:21;28291:8;:15;28300:5;28291:15;;;;;;;;;;;;;;;28267:39;;28348:11;28320:4;:24;;;:39;28317:78;;28382:1;28375:8;;;;;;28317:78;28405:25;28433:4;:22;;;28405:50;;28466:16;28485:18;;28466:37;;28536:4;:24;;;28518:15;:42;:59;;;;;28576:1;28564:8;:13;;28518:59;28514:270;;;28594:19;28616:63;28663:15;;28616:42;28642:4;:15;;;28616:21;:19;:21::i;:::-;:25;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;28594:85;;28714:58;28736:35;28762:8;28736:21;28752:4;28736:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;28714:17;:21;;:58;;;;:::i;:::-;28694:78;;28579:205;28514:270;28876:4;:18;;;28801:72;28857:4;:15;;;28801:51;28847:4;28801:41;28824:17;28801:4;:18;;;:22;;:41;;;;:::i;:::-;:45;;:51;;;;:::i;:::-;:55;;:72;;;;:::i;:::-;:93;;;;:::i;:::-;28794:100;;;;;;28140:762;;;;:::o;31611:1056::-;23742:1;24340:7;;:19;24332:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23742:1;24473:7;:18;;;;31672:22:::1;;;;;;;;;;;31664:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;31725:21;31749:8;31758:1;31749:11;;;;;;;;:::i;:::-;;;;;;;;;;;;31725:35;;31771:21;31795:8;:20;31804:10;31795:20;;;;;;;;;;;;;;;31771:44;;31828:13;31839:1;31828:10;:13::i;:::-;31877:1;31856:4;:18;;;:22;31852:685;;;31895:15;31993:4;:18;;;31913:77;31974:4;:15;;;31913:56;31964:4;31913:46;31936:4;:22;;;31913:4;:18;;;:22;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;:60;;:77;;;;:::i;:::-;:98;;;;:::i;:::-;31895:116;;32047:1;32026:4;:18;;:22;;;;32076:1;32066:7;:11;32063:463;;;32117:18;:16;:18::i;:::-;32106:7;:29;;32098:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;32245:34;32268:10;32245:22;:34::i;:::-;32223:18;;:56;;;;;;;:::i;:::-;;;;;;;;32313:7;32298:4;:11;;;:22;;;;;;;:::i;:::-;;;;;;;;32354:7;32339:11;;:22;;;;;;;:::i;:::-;;;;;;;;32402:34;32425:10;32402:22;:34::i;:::-;32380:18;;:56;;;;;;;:::i;:::-;;;;;;;;32476:34;32499:10;32476:22;:34::i;:::-;32455:4;:18;;:55;;;;32063:463;31880:657;31852:685;32567:56;32618:4;32567:46;32590:4;:22;;;32567:4;:18;;;:22;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;32549:4;:15;;:74;;;;32648:10;32639:20;;;;;;;;;;;;31653:1014;;23698:1:::0;24652:7;:22;;;;31611:1056::o;25648:35::-;;;:::o;823:107::-;868:15;911:10;896:26;;823:107;:::o;28978:607::-;29032:21;29056:8;29065:4;29056:14;;;;;;;;:::i;:::-;;;;;;;;;;;;29032:38;;29104:4;:24;;;29085:15;:43;29081:82;;29145:7;;;29081:82;29173:16;29192:18;;29173:37;;29237:1;29225:8;:13;29221:109;;29282:15;29255:4;:24;;:42;;;;29312:7;;;;29221:109;29340:19;29362:63;29409:15;;29362:42;29388:4;:15;;;29362:21;:19;:21::i;:::-;:25;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;29340:85;;29461:63;29488:35;29514:8;29488:21;29504:4;29488:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;29461:4;:22;;;:26;;:63;;;;:::i;:::-;29436:4;:22;;:88;;;;29562:15;29535:4;:24;;:42;;;;29021:564;;;28978:607;;:::o;5784:471::-;5842:7;6092:1;6087;:6;6083:47;;6117:1;6110:8;;;;6083:47;6142:9;6158:1;6154;:5;;;;:::i;:::-;6142:17;;6187:1;6182;6178;:5;;;;:::i;:::-;:10;6170:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;6246:1;6239:8;;;5784:471;;;;;:::o;6731:132::-;6789:7;6816:39;6820:1;6823;6816:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6809:46;;6731:132;;;;:::o;4860:136::-;4918:7;4945:43;4949:1;4952;4945:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4938:50;;4860:136;;;;:::o;13209:211::-;13326:86;13346:5;13376:23;;;13401:2;13405:5;13353:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13326:19;:86::i;:::-;13209:211;;;:::o;13428:248::-;13572:96;13592:5;13622:27;;;13651:4;13657:2;13661:5;13599:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13572:19;:96::i;:::-;13428:248;;;;:::o;4396:181::-;4454:7;4474:9;4490:1;4486;:5;;;;:::i;:::-;4474:17;;4515:1;4510;:6;;4502:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4568:1;4561:8;;;4396:181;;;;:::o;3320:229::-;3414:1;3394:22;;:8;:22;;;3386:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3504:8;3475:38;;3496:6;;;;;;;;;;3475:38;;;;;;;;;;;;3533:8;3524:6;;:17;;;;;;;;;;;;;;;;;;3320:229;:::o;7359:312::-;7479:7;7511:1;7507;:5;7514:12;7499:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;7538:9;7554:1;7550;:5;;;;:::i;:::-;7538:17;;7662:1;7655:8;;;7359:312;;;;;:::o;5299:226::-;5419:7;5452:1;5447;:6;;5455:12;5439:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5479:9;5495:1;5491;:5;;;;:::i;:::-;5479:17;;5516:1;5509:8;;;5299:226;;;;;:::o;15744:774::-;16168:23;16194:69;16222:4;16194:69;;;;;;;;;;;;;;;;;16202:5;16194:27;;;;:69;;;;;:::i;:::-;16168:95;;16298:1;16278:10;:17;:21;16274:237;;;16433:10;16422:30;;;;;;;;;;;;:::i;:::-;16414:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;16274:237;15814:704;15744:774;;:::o;20343:230::-;20480:12;20512:53;20535:6;20543:4;20549:1;20552:12;20512:22;:53::i;:::-;20505:60;;20343:230;;;;;:::o;21831:1020::-;22004:12;22037:18;22048:6;22037:10;:18::i;:::-;22029:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;22163:12;22177:23;22204:6;:11;;22223:8;22233:4;22204:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22162:76;;;;22253:7;22249:595;;;22284:10;22277:17;;;;;;22249:595;22418:1;22398:10;:17;:21;22394:439;;;22661:10;22655:17;22722:15;22709:10;22705:2;22701:19;22694:44;22394:439;22804:12;22797:20;;;;;;;;;;;:::i;:::-;;;;;;;;21831:1020;;;;;;;:::o;17206:641::-;17266:4;17528:16;17555:19;17577:66;17555:88;;;;17759:7;17747:20;17735:32;;17808:11;17796:8;:23;;:42;;;;;17835:3;17823:15;;:8;:15;;17796:42;17788:51;;;;17206:641;;;:::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:90;803:7;846:5;839:13;832:21;821:32;;769:90;;;:::o;865:116::-;935:21;950:5;935:21;:::i;:::-;928:5;925:32;915:60;;971:1;968;961:12;915:60;865:116;:::o;987:133::-;1030:5;1068:6;1055:20;1046:29;;1084:30;1108:5;1084:30;:::i;:::-;987:133;;;;:::o;1126:323::-;1182:6;1231:2;1219:9;1210:7;1206:23;1202:32;1199:119;;;1237:79;;:::i;:::-;1199:119;1357:1;1382:50;1424:7;1415:6;1404:9;1400:22;1382:50;:::i;:::-;1372:60;;1328:114;1126:323;;;;:::o;1455:122::-;1528:24;1546:5;1528:24;:::i;:::-;1521:5;1518:35;1508:63;;1567:1;1564;1557:12;1508:63;1455:122;:::o;1583:139::-;1629:5;1667:6;1654:20;1645:29;;1683:33;1710:5;1683:33;:::i;:::-;1583:139;;;;:::o;1728:474::-;1796:6;1804;1853:2;1841:9;1832:7;1828:23;1824:32;1821:119;;;1859:79;;:::i;:::-;1821:119;1979:1;2004:53;2049:7;2040:6;2029:9;2025:22;2004:53;:::i;:::-;1994:63;;1950:117;2106:2;2132:53;2177:7;2168:6;2157:9;2153:22;2132:53;:::i;:::-;2122:63;;2077:118;1728:474;;;;;:::o;2208:126::-;2245:7;2285:42;2278:5;2274:54;2263:65;;2208:126;;;:::o;2340:96::-;2377:7;2406:24;2424:5;2406:24;:::i;:::-;2395:35;;2340:96;;;:::o;2442:122::-;2515:24;2533:5;2515:24;:::i;:::-;2508:5;2505:35;2495:63;;2554:1;2551;2544:12;2495:63;2442:122;:::o;2570:139::-;2616:5;2654:6;2641:20;2632:29;;2670:33;2697:5;2670:33;:::i;:::-;2570:139;;;;:::o;2715:329::-;2774:6;2823:2;2811:9;2802:7;2798:23;2794:32;2791:119;;;2829:79;;:::i;:::-;2791:119;2949:1;2974:53;3019:7;3010:6;2999:9;2995:22;2974:53;:::i;:::-;2964:63;;2920:117;2715:329;;;;:::o;3050:::-;3109:6;3158:2;3146:9;3137:7;3133:23;3129:32;3126:119;;;3164:79;;:::i;:::-;3126:119;3284:1;3309:53;3354:7;3345:6;3334:9;3330:22;3309:53;:::i;:::-;3299:63;;3255:117;3050:329;;;;:::o;3385:60::-;3413:3;3434:5;3427:12;;3385:60;;;:::o;3451:142::-;3501:9;3534:53;3552:34;3561:24;3579:5;3561:24;:::i;:::-;3552:34;:::i;:::-;3534:53;:::i;:::-;3521:66;;3451:142;;;:::o;3599:126::-;3649:9;3682:37;3713:5;3682:37;:::i;:::-;3669:50;;3599:126;;;:::o;3731:140::-;3795:9;3828:37;3859:5;3828:37;:::i;:::-;3815:50;;3731:140;;;:::o;3877:159::-;3978:51;4023:5;3978:51;:::i;:::-;3973:3;3966:64;3877:159;;:::o;4042:581::-;4233:4;4271:3;4260:9;4256:19;4248:27;;4285:85;4367:1;4356:9;4352:17;4343:6;4285:85;:::i;:::-;4380:72;4448:2;4437:9;4433:18;4424:6;4380:72;:::i;:::-;4462;4530:2;4519:9;4515:18;4506:6;4462:72;:::i;:::-;4544;4612:2;4601:9;4597:18;4588:6;4544:72;:::i;:::-;4042:581;;;;;;;:::o;4629:664::-;4834:4;4872:3;4861:9;4857:19;4849:27;;4886:71;4954:1;4943:9;4939:17;4930:6;4886:71;:::i;:::-;4967:72;5035:2;5024:9;5020:18;5011:6;4967:72;:::i;:::-;5049;5117:2;5106:9;5102:18;5093:6;5049:72;:::i;:::-;5131;5199:2;5188:9;5184:18;5175:6;5131:72;:::i;:::-;5213:73;5281:3;5270:9;5266:19;5257:6;5213:73;:::i;:::-;4629:664;;;;;;;;:::o;5299:109::-;5380:21;5395:5;5380:21;:::i;:::-;5375:3;5368:34;5299:109;;:::o;5414:210::-;5501:4;5539:2;5528:9;5524:18;5516:26;;5552:65;5614:1;5603:9;5599:17;5590:6;5552:65;:::i;:::-;5414:210;;;;:::o;5630:250::-;5737:4;5775:2;5764:9;5760:18;5752:26;;5788:85;5870:1;5859:9;5855:17;5846:6;5788:85;:::i;:::-;5630:250;;;;:::o;5886:118::-;5973:24;5991:5;5973:24;:::i;:::-;5968:3;5961:37;5886:118;;:::o;6010:222::-;6103:4;6141:2;6130:9;6126:18;6118:26;;6154:71;6222:1;6211:9;6207:17;6198:6;6154:71;:::i;:::-;6010:222;;;;:::o;6238:468::-;6303:6;6311;6360:2;6348:9;6339:7;6335:23;6331:32;6328:119;;;6366:79;;:::i;:::-;6328:119;6486:1;6511:53;6556:7;6547:6;6536:9;6532:22;6511:53;:::i;:::-;6501:63;;6457:117;6613:2;6639:50;6681:7;6672:6;6661:9;6657:22;6639:50;:::i;:::-;6629:60;;6584:115;6238:468;;;;;:::o;6712:169::-;6796:11;6830:6;6825:3;6818:19;6870:4;6865:3;6861:14;6846:29;;6712:169;;;;:::o;6887:182::-;7027:34;7023:1;7015:6;7011:14;7004:58;6887:182;:::o;7075:366::-;7217:3;7238:67;7302:2;7297:3;7238:67;:::i;:::-;7231:74;;7314:93;7403:3;7314:93;:::i;:::-;7432:2;7427:3;7423:12;7416:19;;7075:366;;;:::o;7447:419::-;7613:4;7651:2;7640:9;7636:18;7628:26;;7700:9;7694:4;7690:20;7686:1;7675:9;7671:17;7664:47;7728:131;7854:4;7728:131;:::i;:::-;7720:139;;7447:419;;;:::o;7872:175::-;8012:27;8008:1;8000:6;7996:14;7989:51;7872:175;:::o;8053:366::-;8195:3;8216:67;8280:2;8275:3;8216:67;:::i;:::-;8209:74;;8292:93;8381:3;8292:93;:::i;:::-;8410:2;8405:3;8401:12;8394:19;;8053:366;;;:::o;8425:419::-;8591:4;8629:2;8618:9;8614:18;8606:26;;8678:9;8672:4;8668:20;8664:1;8653:9;8649:17;8642:47;8706:131;8832:4;8706:131;:::i;:::-;8698:139;;8425:419;;;:::o;8850:164::-;8990:16;8986:1;8978:6;8974:14;8967:40;8850:164;:::o;9020:366::-;9162:3;9183:67;9247:2;9242:3;9183:67;:::i;:::-;9176:74;;9259:93;9348:3;9259:93;:::i;:::-;9377:2;9372:3;9368:12;9361:19;;9020:366;;;:::o;9392:419::-;9558:4;9596:2;9585:9;9581:18;9573:26;;9645:9;9639:4;9635:20;9631:1;9620:9;9616:17;9609:47;9673:131;9799:4;9673:131;:::i;:::-;9665:139;;9392:419;;;:::o;9817:180::-;9865:77;9862:1;9855:88;9962:4;9959:1;9952:15;9986:4;9983:1;9976:15;10003:180;10051:77;10048:1;10041:88;10148:4;10145:1;10138:15;10172:4;10169:1;10162:15;10189:191;10229:3;10248:20;10266:1;10248:20;:::i;:::-;10243:25;;10282:20;10300:1;10282:20;:::i;:::-;10277:25;;10325:1;10322;10318:9;10311:16;;10346:3;10343:1;10340:10;10337:36;;;10353:18;;:::i;:::-;10337:36;10189:191;;;;:::o;10386:194::-;10426:4;10446:20;10464:1;10446:20;:::i;:::-;10441:25;;10480:20;10498:1;10480:20;:::i;:::-;10475:25;;10524:1;10521;10517:9;10509:17;;10548:1;10542:4;10539:11;10536:37;;;10553:18;;:::i;:::-;10536:37;10386:194;;;;:::o;10586:348::-;10626:7;10649:20;10667:1;10649:20;:::i;:::-;10644:25;;10683:20;10701:1;10683:20;:::i;:::-;10678:25;;10871:1;10803:66;10799:74;10796:1;10793:81;10788:1;10781:9;10774:17;10770:105;10767:131;;;10878:18;;:::i;:::-;10767:131;10926:1;10923;10919:9;10908:20;;10586:348;;;;:::o;10940:180::-;10988:77;10985:1;10978:88;11085:4;11082:1;11075:15;11109:4;11106:1;11099:15;11126:185;11166:1;11183:20;11201:1;11183:20;:::i;:::-;11178:25;;11217:20;11235:1;11217:20;:::i;:::-;11212:25;;11256:1;11246:35;;11261:18;;:::i;:::-;11246:35;11303:1;11300;11296:9;11291:14;;11126:185;;;;:::o;11317:143::-;11374:5;11405:6;11399:13;11390:22;;11421:33;11448:5;11421:33;:::i;:::-;11317:143;;;;:::o;11466:351::-;11536:6;11585:2;11573:9;11564:7;11560:23;11556:32;11553:119;;;11591:79;;:::i;:::-;11553:119;11711:1;11736:64;11792:7;11783:6;11772:9;11768:22;11736:64;:::i;:::-;11726:74;;11682:128;11466:351;;;;:::o;11823:179::-;11963:31;11959:1;11951:6;11947:14;11940:55;11823:179;:::o;12008:366::-;12150:3;12171:67;12235:2;12230:3;12171:67;:::i;:::-;12164:74;;12247:93;12336:3;12247:93;:::i;:::-;12365:2;12360:3;12356:12;12349:19;;12008:366;;;:::o;12380:419::-;12546:4;12584:2;12573:9;12569:18;12561:26;;12633:9;12627:4;12623:20;12619:1;12608:9;12604:17;12597:47;12661:131;12787:4;12661:131;:::i;:::-;12653:139;;12380:419;;;:::o;12805:181::-;12945:33;12941:1;12933:6;12929:14;12922:57;12805:181;:::o;12992:366::-;13134:3;13155:67;13219:2;13214:3;13155:67;:::i;:::-;13148:74;;13231:93;13320:3;13231:93;:::i;:::-;13349:2;13344:3;13340:12;13333:19;;12992:366;;;:::o;13364:419::-;13530:4;13568:2;13557:9;13553:18;13545:26;;13617:9;13611:4;13607:20;13603:1;13592:9;13588:17;13581:47;13645:131;13771:4;13645:131;:::i;:::-;13637:139;;13364:419;;;:::o;13789:182::-;13929:34;13925:1;13917:6;13913:14;13906:58;13789:182;:::o;13977:366::-;14119:3;14140:67;14204:2;14199:3;14140:67;:::i;:::-;14133:74;;14216:93;14305:3;14216:93;:::i;:::-;14334:2;14329:3;14325:12;14318:19;;13977:366;;;:::o;14349:419::-;14515:4;14553:2;14542:9;14538:18;14530:26;;14602:9;14596:4;14592:20;14588:1;14577:9;14573:17;14566:47;14630:131;14756:4;14630:131;:::i;:::-;14622:139;;14349:419;;;:::o;14774:251::-;14914:34;14910:1;14902:6;14898:14;14891:58;14983:34;14978:2;14970:6;14966:15;14959:59;14774:251;:::o;15031:366::-;15173:3;15194:67;15258:2;15253:3;15194:67;:::i;:::-;15187:74;;15270:93;15359:3;15270:93;:::i;:::-;15388:2;15383:3;15379:12;15372:19;;15031:366;;;:::o;15403:419::-;15569:4;15607:2;15596:9;15592:18;15584:26;;15656:9;15650:4;15646:20;15642:1;15631:9;15627:17;15620:47;15684:131;15810:4;15684:131;:::i;:::-;15676:139;;15403:419;;;:::o;15828:233::-;15867:3;15890:24;15908:5;15890:24;:::i;:::-;15881:33;;15936:66;15929:5;15926:77;15923:103;;16006:18;;:::i;:::-;15923:103;16053:1;16046:5;16042:13;16035:20;;15828:233;;;:::o;16067:177::-;16207:29;16203:1;16195:6;16191:14;16184:53;16067:177;:::o;16250:366::-;16392:3;16413:67;16477:2;16472:3;16413:67;:::i;:::-;16406:74;;16489:93;16578:3;16489:93;:::i;:::-;16607:2;16602:3;16598:12;16591:19;;16250:366;;;:::o;16622:419::-;16788:4;16826:2;16815:9;16811:18;16803:26;;16875:9;16869:4;16865:20;16861:1;16850:9;16846:17;16839:47;16903:131;17029:4;16903:131;:::i;:::-;16895:139;;16622:419;;;:::o;17047:173::-;17187:25;17183:1;17175:6;17171:14;17164:49;17047:173;:::o;17226:366::-;17368:3;17389:67;17453:2;17448:3;17389:67;:::i;:::-;17382:74;;17465:93;17554:3;17465:93;:::i;:::-;17583:2;17578:3;17574:12;17567:19;;17226:366;;;:::o;17598:419::-;17764:4;17802:2;17791:9;17787:18;17779:26;;17851:9;17845:4;17841:20;17837:1;17826:9;17822:17;17815:47;17879:131;18005:4;17879:131;:::i;:::-;17871:139;;17598:419;;;:::o;18023:177::-;18163:29;18159:1;18151:6;18147:14;18140:53;18023:177;:::o;18206:366::-;18348:3;18369:67;18433:2;18428:3;18369:67;:::i;:::-;18362:74;;18445:93;18534:3;18445:93;:::i;:::-;18563:2;18558:3;18554:12;18547:19;;18206:366;;;:::o;18578:419::-;18744:4;18782:2;18771:9;18767:18;18759:26;;18831:9;18825:4;18821:20;18817:1;18806:9;18802:17;18795:47;18859:131;18985:4;18859:131;:::i;:::-;18851:139;;18578:419;;;:::o;19003:167::-;19143:19;19139:1;19131:6;19127:14;19120:43;19003:167;:::o;19176:366::-;19318:3;19339:67;19403:2;19398:3;19339:67;:::i;:::-;19332:74;;19415:93;19504:3;19415:93;:::i;:::-;19533:2;19528:3;19524:12;19517:19;;19176:366;;;:::o;19548:419::-;19714:4;19752:2;19741:9;19737:18;19729:26;;19801:9;19795:4;19791:20;19787:1;19776:9;19772:17;19765:47;19829:131;19955:4;19829:131;:::i;:::-;19821:139;;19548:419;;;:::o;19973:180::-;20113:32;20109:1;20101:6;20097:14;20090:56;19973:180;:::o;20159:366::-;20301:3;20322:67;20386:2;20381:3;20322:67;:::i;:::-;20315:74;;20398:93;20487:3;20398:93;:::i;:::-;20516:2;20511:3;20507:12;20500:19;;20159:366;;;:::o;20531:419::-;20697:4;20735:2;20724:9;20720:18;20712:26;;20784:9;20778:4;20774:20;20770:1;20759:9;20755:17;20748:47;20812:131;20938:4;20812:131;:::i;:::-;20804:139;;20531:419;;;:::o;20956:165::-;21096:17;21092:1;21084:6;21080:14;21073:41;20956:165;:::o;21127:366::-;21269:3;21290:67;21354:2;21349:3;21290:67;:::i;:::-;21283:74;;21366:93;21455:3;21366:93;:::i;:::-;21484:2;21479:3;21475:12;21468:19;;21127:366;;;:::o;21499:419::-;21665:4;21703:2;21692:9;21688:18;21680:26;;21752:9;21746:4;21742:20;21738:1;21727:9;21723:17;21716:47;21780:131;21906:4;21780:131;:::i;:::-;21772:139;;21499:419;;;:::o;21924:220::-;22064:34;22060:1;22052:6;22048:14;22041:58;22133:3;22128:2;22120:6;22116:15;22109:28;21924:220;:::o;22150:366::-;22292:3;22313:67;22377:2;22372:3;22313:67;:::i;:::-;22306:74;;22389:93;22478:3;22389:93;:::i;:::-;22507:2;22502:3;22498:12;22491:19;;22150:366;;;:::o;22522:419::-;22688:4;22726:2;22715:9;22711:18;22703:26;;22775:9;22769:4;22765:20;22761:1;22750:9;22746:17;22739:47;22803:131;22929:4;22803:131;:::i;:::-;22795:139;;22522:419;;;:::o;22947:332::-;23068:4;23106:2;23095:9;23091:18;23083:26;;23119:71;23187:1;23176:9;23172:17;23163:6;23119:71;:::i;:::-;23200:72;23268:2;23257:9;23253:18;23244:6;23200:72;:::i;:::-;22947:332;;;;;:::o;23285:442::-;23434:4;23472:2;23461:9;23457:18;23449:26;;23485:71;23553:1;23542:9;23538:17;23529:6;23485:71;:::i;:::-;23566:72;23634:2;23623:9;23619:18;23610:6;23566:72;:::i;:::-;23648;23716:2;23705:9;23701:18;23692:6;23648:72;:::i;:::-;23285:442;;;;;;:::o;23733:177::-;23873:29;23869:1;23861:6;23857:14;23850:53;23733:177;:::o;23916:366::-;24058:3;24079:67;24143:2;24138:3;24079:67;:::i;:::-;24072:74;;24155:93;24244:3;24155:93;:::i;:::-;24273:2;24268:3;24264:12;24257:19;;23916:366;;;:::o;24288:419::-;24454:4;24492:2;24481:9;24477:18;24469:26;;24541:9;24535:4;24531:20;24527:1;24516:9;24512:17;24505:47;24569:131;24695:4;24569:131;:::i;:::-;24561:139;;24288:419;;;:::o;24713:225::-;24853:34;24849:1;24841:6;24837:14;24830:58;24922:8;24917:2;24909:6;24905:15;24898:33;24713:225;:::o;24944:366::-;25086:3;25107:67;25171:2;25166:3;25107:67;:::i;:::-;25100:74;;25183:93;25272:3;25183:93;:::i;:::-;25301:2;25296:3;25292:12;25285:19;;24944:366;;;:::o;25316:419::-;25482:4;25520:2;25509:9;25505:18;25497:26;;25569:9;25563:4;25559:20;25555:1;25544:9;25540:17;25533:47;25597:131;25723:4;25597:131;:::i;:::-;25589:139;;25316:419;;;:::o;25741:99::-;25793:6;25827:5;25821:12;25811:22;;25741:99;;;:::o;25846:246::-;25927:1;25937:113;25951:6;25948:1;25945:13;25937:113;;;26036:1;26031:3;26027:11;26021:18;26017:1;26012:3;26008:11;26001:39;25973:2;25970:1;25966:10;25961:15;;25937:113;;;26084:1;26075:6;26070:3;26066:16;26059:27;25908:184;25846:246;;;:::o;26098:102::-;26139:6;26190:2;26186:7;26181:2;26174:5;26170:14;26166:28;26156:38;;26098:102;;;:::o;26206:377::-;26294:3;26322:39;26355:5;26322:39;:::i;:::-;26377:71;26441:6;26436:3;26377:71;:::i;:::-;26370:78;;26457:65;26515:6;26510:3;26503:4;26496:5;26492:16;26457:65;:::i;:::-;26547:29;26569:6;26547:29;:::i;:::-;26542:3;26538:39;26531:46;;26298:285;26206:377;;;;:::o;26589:313::-;26702:4;26740:2;26729:9;26725:18;26717:26;;26789:9;26783:4;26779:20;26775:1;26764:9;26760:17;26753:47;26817:78;26890:4;26881:6;26817:78;:::i;:::-;26809:86;;26589:313;;;;:::o;26908:137::-;26962:5;26993:6;26987:13;26978:22;;27009:30;27033:5;27009:30;:::i;:::-;26908:137;;;;:::o;27051:345::-;27118:6;27167:2;27155:9;27146:7;27142:23;27138:32;27135:119;;;27173:79;;:::i;:::-;27135:119;27293:1;27318:61;27371:7;27362:6;27351:9;27347:22;27318:61;:::i;:::-;27308:71;;27264:125;27051:345;;;;:::o;27402:229::-;27542:34;27538:1;27530:6;27526:14;27519:58;27611:12;27606:2;27598:6;27594:15;27587:37;27402:229;:::o;27637:366::-;27779:3;27800:67;27864:2;27859:3;27800:67;:::i;:::-;27793:74;;27876:93;27965:3;27876:93;:::i;:::-;27994:2;27989:3;27985:12;27978:19;;27637:366;;;:::o;28009:419::-;28175:4;28213:2;28202:9;28198:18;28190:26;;28262:9;28256:4;28252:20;28248:1;28237:9;28233:17;28226:47;28290:131;28416:4;28290:131;:::i;:::-;28282:139;;28009:419;;;:::o;28434:179::-;28574:31;28570:1;28562:6;28558:14;28551:55;28434:179;:::o;28619:366::-;28761:3;28782:67;28846:2;28841:3;28782:67;:::i;:::-;28775:74;;28858:93;28947:3;28858:93;:::i;:::-;28976:2;28971:3;28967:12;28960:19;;28619:366;;;:::o;28991:419::-;29157:4;29195:2;29184:9;29180:18;29172:26;;29244:9;29238:4;29234:20;29230:1;29219:9;29215:17;29208:47;29272:131;29398:4;29272:131;:::i;:::-;29264:139;;28991:419;;;:::o;29416:98::-;29467:6;29501:5;29495:12;29485:22;;29416:98;;;:::o;29520:147::-;29621:11;29658:3;29643:18;;29520:147;;;;:::o;29673:386::-;29777:3;29805:38;29837:5;29805:38;:::i;:::-;29859:88;29940:6;29935:3;29859:88;:::i;:::-;29852:95;;29956:65;30014:6;30009:3;30002:4;29995:5;29991:16;29956:65;:::i;:::-;30046:6;30041:3;30037:16;30030:23;;29781:278;29673:386;;;;:::o;30065:271::-;30195:3;30217:93;30306:3;30297:6;30217:93;:::i;:::-;30210:100;;30327:3;30320:10;;30065:271;;;;:::o
Swarm Source
ipfs://aa60e3c9783cb3e21d959ebbb82341e11137268e2ae3df42851accbb26e99703
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.