More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 940 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 1681280 | 6 mins ago | IN | 0 S | 0.00016588 | ||||
Deposit | 1681255 | 6 mins ago | IN | 0 S | 0.00016588 | ||||
Deposit | 1681092 | 8 mins ago | IN | 0 S | 0.00019139 | ||||
Deposit | 1680875 | 10 mins ago | IN | 0 S | 0.0001644 | ||||
Deposit | 1680858 | 10 mins ago | IN | 0 S | 0.0001644 | ||||
Deposit | 1680847 | 10 mins ago | IN | 0 S | 0.00018148 | ||||
Deposit | 1680845 | 11 mins ago | IN | 0 S | 0.0001644 | ||||
Deposit | 1680341 | 16 mins ago | IN | 0 S | 0.00016292 | ||||
Deposit | 1680334 | 16 mins ago | IN | 0 S | 0.00016292 | ||||
Deposit | 1679907 | 22 mins ago | IN | 0 S | 0.00016292 | ||||
Deposit | 1679211 | 34 mins ago | IN | 0 S | 0.00072921 | ||||
Deposit | 1677392 | 1 hr ago | IN | 0 S | 0.00016292 | ||||
Deposit | 1675477 | 1 hr ago | IN | 0 S | 0.00016292 | ||||
Deposit | 1675463 | 1 hr ago | IN | 0 S | 0.00017985 | ||||
Deposit | 1673508 | 2 hrs ago | IN | 0 S | 0.00016292 | ||||
Deposit | 1673311 | 2 hrs ago | IN | 0 S | 0.00021068 | ||||
Deposit | 1672933 | 2 hrs ago | IN | 0 S | 0.0001644 | ||||
Deposit | 1672922 | 2 hrs ago | IN | 0 S | 0.0001644 | ||||
Deposit | 1671112 | 2 hrs ago | IN | 0 S | 0.00024734 | ||||
Deposit | 1671097 | 2 hrs ago | IN | 0 S | 0.00024734 | ||||
Deposit | 1671067 | 2 hrs ago | IN | 0 S | 0.0001644 | ||||
Deposit | 1669862 | 3 hrs ago | IN | 0 S | 0.0001644 | ||||
Deposit | 1669482 | 3 hrs ago | IN | 0 S | 0.00022763 | ||||
Deposit | 1669445 | 3 hrs ago | IN | 0 S | 0.00016292 | ||||
Deposit | 1669441 | 3 hrs ago | IN | 0 S | 0.00016292 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MasterChefV3WithFees
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2024-12-25 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @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; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // 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); } } } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IERC20Mintable is IERC20 { function mint(address to, uint256 amount) external; } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: 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(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ 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 make 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; } } // MasterChef is the master of Mobius. He can make Mobius and he is a fair guy. // Note that it's ownable and the owner wields tremendous power. The ownership // will be transferred to a governance smart contract once MOBIUS is sufficiently // distributed and the community can show to govern itself. // // Have fun reading it. Hopefully it's bug-free. God bless. contract MasterChefV3WithFees is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. // // We do some fancy math here. Basically, any point in time, the amount of MOBIUSs // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accMobiusPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accMobiusPerShare` (and `lastRewardBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. MOBIUSs to distribute per block. uint256 lastRewardBlock; // Last block number that MOBIUSs distribution occurs. uint256 accMobiusPerShare; // Accumulated MOBIUSs per share, times PRECISION_FACTOR. See below. uint256 depositFee; uint256 withdrawalFee; bool exists; } // The MOBIUS TOKEN! IERC20Mintable public mobius; // Dev address. address public devaddr; // MOBIUS tokens created per block. uint256 public mobiusPerBlock; // Bonus muliplier for early mobius makers. uint256 public constant BONUS_MULTIPLIER = 1; // Dev Fee uint256 public devFee = 10; // 10% // Info of each pool. uint256[] public poolIds; mapping(uint256 => PoolInfo) public poolInfo; uint256 public currentPoolId = 2000; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The block number when MOBIUS mining starts. uint256 public startBlock; uint256 private constant PRECISION_FACTOR = 1e24; uint256 private constant DENOMINATOR = 1e4; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); event SetDevAddress(address indexed user, address indexed newAddress); event UpdateEmissionRate(address indexed user, uint256 mobiusPerBlock); constructor( address _mobius, address _devaddr, uint256 _mobiusPerBlock, uint256 _startBlock ) { mobius = IERC20Mintable(_mobius); devaddr = _devaddr; mobiusPerBlock = _mobiusPerBlock; startBlock = _startBlock; } function poolLength() external view returns (uint256) { return poolIds.length; } mapping(IERC20 => bool) public poolExistence; modifier nonDuplicated(IERC20 _lpToken) { require(poolExistence[_lpToken] == false, "nonDuplicated: duplicated"); _; } // Add a new lp to the pool. Can only be called by the owner. function add( uint256 _allocPoint, IERC20 _lpToken, uint256 _depositFee, uint256 _withdrawalFee, bool _withUpdate ) public onlyOwner nonDuplicated(_lpToken) { require (_depositFee <= 500 && _withdrawalFee <= 500, "Fees not within limit"); if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolExistence[_lpToken] = true; poolInfo[currentPoolId] = PoolInfo({ lpToken : _lpToken, allocPoint : _allocPoint, lastRewardBlock : lastRewardBlock, accMobiusPerShare : 0, depositFee: _depositFee, withdrawalFee: _withdrawalFee, exists: true }); poolIds.push(currentPoolId); currentPoolId++; } // Update the given pool's MOBIUS allocation point and deposit fee. Can only be called by the owner. function set( uint256 _pid, uint256 _allocPoint, uint256 _depositFee, uint256 _withdrawalFee, bool _withUpdate ) public onlyOwner { require (poolInfo[_pid].exists, "Invalid pid"); require (_depositFee <= 500 && _withdrawalFee <= 500, "Fees not within limit"); if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; poolInfo[_pid].depositFee = _depositFee; poolInfo[_pid].withdrawalFee = _withdrawalFee; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) { return _to.sub(_from).mul(BONUS_MULTIPLIER); } // View function to see pending MOBIUSs on frontend. function pendingMobius(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accMobiusPerShare = pool.accMobiusPerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 mobiusReward = multiplier.mul(mobiusPerBlock).mul(pool.allocPoint).div(totalAllocPoint); accMobiusPerShare = accMobiusPerShare.add(mobiusReward.mul(PRECISION_FACTOR).div(lpSupply)); } return user.amount.mul(accMobiusPerShare).div(PRECISION_FACTOR).sub(user.rewardDebt); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolIds.length; for (uint256 index = 0; index < length; ++index) { updatePool(poolIds[index]); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; require (pool.exists, "Invalid pid"); if (block.number <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (lpSupply == 0 || pool.allocPoint == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 mobiusReward = multiplier.mul(mobiusPerBlock).mul(pool.allocPoint).div(totalAllocPoint); mobius.mint(devaddr, mobiusReward.div(devFee)); mobius.mint(address(this), mobiusReward); pool.accMobiusPerShare = pool.accMobiusPerShare.add(mobiusReward.mul(PRECISION_FACTOR).div(lpSupply)); pool.lastRewardBlock = block.number; } // Deposit LP tokens to MasterChef for MOBIUS allocation. function deposit(uint256 _pid, uint256 _amount) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; require (poolInfo[_pid].exists, "Invalid pid"); UserInfo storage user = userInfo[_pid][_msgSender()]; updatePool(_pid); if (user.amount > 0) { uint256 pending = user.amount.mul(pool.accMobiusPerShare).div(PRECISION_FACTOR).sub(user.rewardDebt); if (pending > 0) { safeMobiusTransfer(_msgSender(), pending); } } uint256 fee = 0; if (_amount > 0) { fee = _amount.mul(pool.depositFee).div(DENOMINATOR); pool.lpToken.safeTransferFrom(address(_msgSender()), address(this), _amount); if (fee > 0) pool.lpToken.safeTransfer(devaddr, fee); user.amount = user.amount.add(_amount.sub(fee)); } user.rewardDebt = user.amount.mul(pool.accMobiusPerShare).div(PRECISION_FACTOR); emit Deposit(_msgSender(), _pid, _amount.sub(fee)); } // Withdraw LP tokens from MasterChef. function withdraw(uint256 _pid, uint256 _amount) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; require (poolInfo[_pid].exists, "Invalid pid"); UserInfo storage user = userInfo[_pid][_msgSender()]; require(user.amount >= _amount, "withdraw: not good"); updatePool(_pid); uint256 pending = user.amount.mul(pool.accMobiusPerShare).div(PRECISION_FACTOR).sub(user.rewardDebt); if (pending > 0) { safeMobiusTransfer(_msgSender(), pending); } if (_amount > 0) { uint256 fee = _amount.mul(pool.withdrawalFee).div(DENOMINATOR); user.amount = user.amount.sub(_amount); pool.lpToken.safeTransfer(address(_msgSender()), _amount.sub(fee)); if (fee > 0) pool.lpToken.safeTransfer(devaddr, fee); } user.rewardDebt = user.amount.mul(pool.accMobiusPerShare).div(PRECISION_FACTOR); emit Withdraw(_msgSender(), _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; require (poolInfo[_pid].exists, "Invalid pid"); UserInfo storage user = userInfo[_pid][_msgSender()]; uint256 amount = user.amount; uint256 fee = amount.mul(pool.withdrawalFee).div(DENOMINATOR); user.amount = 0; user.rewardDebt = 0; pool.lpToken.safeTransfer(address(_msgSender()), amount.sub(fee)); if (fee > 0) pool.lpToken.safeTransfer(devaddr, fee); emit EmergencyWithdraw(_msgSender(), _pid, amount); } // Safe mobius transfer function, just in case if rounding error causes pool to not have enough MOBIUSs. function safeMobiusTransfer(address _to, uint256 _amount) internal { uint256 mobiusBal = mobius.balanceOf(address(this)); bool transferSuccess = false; if (_amount > mobiusBal) { transferSuccess = mobius.transfer(_to, mobiusBal); } else { transferSuccess = mobius.transfer(_to, _amount); } require(transferSuccess, "safeMobiusTransfer: transfer failed"); } function dev(address _devaddr) public onlyOwner { devaddr = _devaddr; emit SetDevAddress(_msgSender(), _devaddr); } function setStartBlock(uint256 _startBlock) public onlyOwner { require(block.number < startBlock, "Farm has started"); startBlock = _startBlock; } function setDevFee(uint256 _newDevFee) public onlyOwner { require(_newDevFee <= 10, "Must keep fees at 10% or less"); devFee = _newDevFee; } function updateEmissionRate(uint256 _mobiusPerBlock) public onlyOwner { massUpdatePools(); mobiusPerBlock = _mobiusPerBlock; emit UpdateEmissionRate(_msgSender(), _mobiusPerBlock); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_mobius","type":"address"},{"internalType":"address","name":"_devaddr","type":"address"},{"internalType":"uint256","name":"_mobiusPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetDevAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"mobiusPerBlock","type":"uint256"}],"name":"UpdateEmissionRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_depositFee","type":"uint256"},{"internalType":"uint256","name":"_withdrawalFee","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentPoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"dev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mobius","outputs":[{"internalType":"contract IERC20Mintable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mobiusPerBlock","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":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingMobius","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"poolExistence","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accMobiusPerShare","type":"uint256"},{"internalType":"uint256","name":"depositFee","type":"uint256"},{"internalType":"uint256","name":"withdrawalFee","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"},{"internalType":"uint256","name":"_withdrawalFee","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDevFee","type":"uint256"}],"name":"setDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"name":"setStartBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mobiusPerBlock","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600a6005556107d06008555f600a5534801561001e575f5ffd5b50604051613b13380380613b1383398181016040528101906100409190610221565b5f61004f61018960201b60201c565b9050805f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600180819055508360025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160048190555080600b8190555050505050610285565b5f33905090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101bd82610194565b9050919050565b6101cd816101b3565b81146101d7575f5ffd5b50565b5f815190506101e8816101c4565b92915050565b5f819050919050565b610200816101ee565b811461020a575f5ffd5b50565b5f8151905061021b816101f7565b92915050565b5f5f5f5f6080858703121561023957610238610190565b5b5f610246878288016101da565b9450506020610257878288016101da565b93505060406102688782880161020d565b92505060606102798782880161020d565b91505092959194509250565b613881806102925f395ff3fe608060405234801561000f575f5ffd5b50600436106101cd575f3560e01c8063715018a611610102578063cbd258b5116100a0578063ebc5163b1161006f578063ebc5163b146104fa578063f2fde38b14610518578063f35e4a6e14610534578063f6e6a0e614610550576101cd565b8063cbd258b514610472578063d49e77cd146104a2578063db046fd4146104c0578063e2bbb158146104de576101cd565b80638d88a90e116100dc5780638d88a90e146103d75780638da5cb5b146103f35780638dbb1e3a1461041157806393f1a40b14610441576101cd565b8063715018a61461037f57806379d20a13146103895780638aa28550146103b9576101cd565b806348cd4cb11161016f57806360e4c4ce1161014957806360e4c4ce1461030b578063630b5ba1146103275780636827e7641461033157806369883b4e1461034f576101cd565b806348cd4cb1146102b557806351eb05a6146102d35780635312ea8e146102ef576101cd565b806317caf6f1116101ab57806317caf6f1146102415780631c75b6b21461025f57806341604de01461027b578063441a3e7014610299576101cd565b8063081e3eda146101d15780630ba84cd2146101ef5780631526fe271461020b575b5f5ffd5b6101d961056c565b6040516101e69190612a26565b60405180910390f35b61020960048036038101906102049190612a6d565b610578565b005b61022560048036038101906102209190612a6d565b610674565b6040516102389796959493929190612b2c565b60405180910390f35b6102496106dd565b6040516102569190612a26565b60405180910390f35b61027960048036038101906102749190612a6d565b6106e3565b005b6102836107c6565b6040516102909190612bb9565b60405180910390f35b6102b360048036038101906102ae9190612bd2565b6107eb565b005b6102bd610b8e565b6040516102ca9190612a26565b60405180910390f35b6102ed60048036038101906102e89190612a6d565b610b94565b005b61030960048036038101906103049190612a6d565b610ec4565b005b61032560048036038101906103209190612c3a565b611162565b005b61032f61134c565b005b610339611396565b6040516103469190612a26565b60405180910390f35b61036960048036038101906103649190612a6d565b61139c565b6040516103769190612a26565b60405180910390f35b6103876113bc565b005b6103a3600480360381019061039e9190612cec565b61150c565b6040516103b09190612a26565b60405180910390f35b6103c161171a565b6040516103ce9190612a26565b60405180910390f35b6103f160048036038101906103ec9190612d2a565b61171f565b005b6103fb611858565b6040516104089190612d64565b60405180910390f35b61042b60048036038101906104269190612bd2565b61187f565b6040516104389190612a26565b60405180910390f35b61045b60048036038101906104569190612cec565b6118ae565b604051610469929190612d7d565b60405180910390f35b61048c60048036038101906104879190612ddf565b6118d9565b6040516104999190612e0a565b60405180910390f35b6104aa6118f6565b6040516104b79190612d64565b60405180910390f35b6104c861191b565b6040516104d59190612a26565b60405180910390f35b6104f860048036038101906104f39190612bd2565b611921565b005b610502611ca1565b60405161050f9190612a26565b60405180910390f35b610532600480360381019061052d9190612d2a565b611ca7565b005b61054e60048036038101906105499190612a6d565b611e66565b005b61056a60048036038101906105659190612e23565b611f49565b005b5f600680549050905090565b610580612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461060d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060490612ef4565b60405180910390fd5b61061561134c565b80600481905550610624612295565b73ffffffffffffffffffffffffffffffffffffffff167fe2492e003bbe8afa53088b406f0c1cb5d9e280370fc72a74cf116ffd343c4053826040516106699190612a26565b60405180910390a250565b6007602052805f5260405f205f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002015490806003015490806004015490806005015490806006015f9054906101000a900460ff16905087565b600a5481565b6106eb612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076f90612ef4565b60405180910390fd5b600a8111156107bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b390612f5c565b60405180910390fd5b8060058190555050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260015403610830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082790612fc4565b60405180910390fd5b60026001819055505f60075f8481526020019081526020015f20905060075f8481526020019081526020015f206006015f9054906101000a900460ff166108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a39061302c565b60405180910390fd5b5f60095f8581526020019081526020015f205f6108c7612295565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905082815f01541015610948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093f90613094565b60405180910390fd5b61095184610b94565b5f61099e826001015461099069d3c21bcecceda10000006109828760030154875f015461229c90919063ffffffff16565b61231390919063ffffffff16565b61235c90919063ffffffff16565b90505f8111156109ba576109b96109b3612295565b826123a5565b5b5f841115610aec575f6109ee6127106109e086600501548861229c90919063ffffffff16565b61231390919063ffffffff16565b9050610a0685845f015461235c90919063ffffffff16565b835f0181905550610a73610a18612295565b610a2b838861235c90919063ffffffff16565b865f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166125d59092919063ffffffff16565b5f811115610aea57610ae960035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682865f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166125d59092919063ffffffff16565b5b505b610b2269d3c21bcecceda1000000610b148560030154855f015461229c90919063ffffffff16565b61231390919063ffffffff16565b826001018190555084610b33612295565b73ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56886604051610b789190612a26565b60405180910390a3505050600180819055505050565b600b5481565b5f60075f8381526020019081526020015f209050806006015f9054906101000a900460ff16610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef9061302c565b60405180910390fd5b80600201544311610c095750610ec1565b5f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c659190612d64565b602060405180830381865afa158015610c80573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca491906130c6565b90505f811480610cb757505f8260010154145b15610ccc574382600201819055505050610ec1565b5f610cdb83600201544361187f565b90505f610d1d600a54610d0f8660010154610d016004548761229c90919063ffffffff16565b61229c90919063ffffffff16565b61231390919063ffffffff16565b905060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1960035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610d936005548561231390919063ffffffff16565b6040518363ffffffff1660e01b8152600401610db09291906130f1565b5f604051808303815f87803b158015610dc7575f5ffd5b505af1158015610dd9573d5f5f3e3d5ffd5b5050505060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401610e399291906130f1565b5f604051808303815f87803b158015610e50575f5ffd5b505af1158015610e62573d5f5f3e3d5ffd5b50505050610eab610e9884610e8a69d3c21bcecceda10000008561229c90919063ffffffff16565b61231390919063ffffffff16565b856003015461265b90919063ffffffff16565b8460030181905550438460020181905550505050505b50565b600260015403610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0090612fc4565b60405180910390fd5b60026001819055505f60075f8381526020019081526020015f20905060075f8381526020019081526020015f206006015f9054906101000a900460ff16610f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7c9061302c565b60405180910390fd5b5f60095f8481526020019081526020015f205f610fa0612295565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015490505f61100e61271061100086600501548561229c90919063ffffffff16565b61231390919063ffffffff16565b90505f835f01819055505f836001018190555061108761102c612295565b61103f838561235c90919063ffffffff16565b865f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166125d59092919063ffffffff16565b5f8111156110fe576110fd60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682865f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166125d59092919063ffffffff16565b5b84611107612295565b73ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05958460405161114c9190612a26565b60405180910390a3505050506001808190555050565b61116a612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ee90612ef4565b60405180910390fd5b60075f8681526020019081526020015f206006015f9054906101000a900460ff16611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e9061302c565b60405180910390fd5b6101f4831115801561126b57506101f48211155b6112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a190613162565b60405180910390fd5b80156112b9576112b861134c565b5b6112f4846112e660075f8981526020019081526020015f2060010154600a5461235c90919063ffffffff16565b61265b90919063ffffffff16565b600a819055508360075f8781526020019081526020015f20600101819055508260075f8781526020019081526020015f20600401819055508160075f8781526020019081526020015f20600501819055505050505050565b5f60068054905090505f5f90505b81811015611392576113876006828154811061137957611378613180565b5b905f5260205f200154610b94565b80600101905061135a565b5050565b60055481565b600681815481106113ab575f80fd5b905f5260205f20015f915090505481565b6113c4612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144890612ef4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f5f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b5f5f60075f8581526020019081526020015f2090505f60095f8681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f826003015490505f835f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115d49190612d64565b602060405180830381865afa1580156115ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161391906130c6565b905083600201544311801561162857505f8114155b156116c6575f61163c85600201544361187f565b90505f61167e600a5461167088600101546116626004548761229c90919063ffffffff16565b61229c90919063ffffffff16565b61231390919063ffffffff16565b90506116c16116b2846116a469d3c21bcecceda10000008561229c90919063ffffffff16565b61231390919063ffffffff16565b8561265b90919063ffffffff16565b935050505b61170e836001015461170069d3c21bcecceda10000006116f286885f015461229c90919063ffffffff16565b61231390919063ffffffff16565b61235c90919063ffffffff16565b94505050505092915050565b600181565b611727612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ab90612ef4565b60405180910390fd5b8060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16611813612295565b73ffffffffffffffffffffffffffffffffffffffff167f618c54559e94f1499a808aad71ee8729f8e74e8c48e979616328ce493a1a52e760405160405180910390a350565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6118a66001611898858561235c90919063ffffffff16565b61229c90919063ffffffff16565b905092915050565b6009602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154905082565b600c602052805f5260405f205f915054906101000a900460ff1681565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b600260015403611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90612fc4565b60405180910390fd5b60026001819055505f60075f8481526020019081526020015f20905060075f8481526020019081526020015f206006015f9054906101000a900460ff166119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d99061302c565b60405180910390fd5b5f60095f8581526020019081526020015f205f6119fd612295565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050611a4184610b94565b5f815f01541115611ab7575f611a998260010154611a8b69d3c21bcecceda1000000611a7d8760030154875f015461229c90919063ffffffff16565b61231390919063ffffffff16565b61235c90919063ffffffff16565b90505f811115611ab557611ab4611aae612295565b826123a5565b5b505b5f5f90505f841115611bed57611aee612710611ae085600401548761229c90919063ffffffff16565b61231390919063ffffffff16565b9050611b46611afb612295565b3086865f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126b8909392919063ffffffff16565b5f811115611bbd57611bbc60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682855f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166125d59092919063ffffffff16565b5b611be5611bd3828661235c90919063ffffffff16565b835f015461265b90919063ffffffff16565b825f01819055505b611c2369d3c21bcecceda1000000611c158560030154855f015461229c90919063ffffffff16565b61231390919063ffffffff16565b826001018190555084611c34612295565b73ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15611c7e848861235c90919063ffffffff16565b604051611c8b9190612a26565b60405180910390a3505050600180819055505050565b60085481565b611caf612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3390612ef4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da19061321d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e6e612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef290612ef4565b60405180910390fd5b600b544310611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3690613285565b60405180910390fd5b80600b8190555050565b611f51612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd590612ef4565b60405180910390fd5b835f1515600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615151461206e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612065906132ed565b60405180910390fd5b6101f4841115801561208257506101f48311155b6120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b890613162565b60405180910390fd5b81156120d0576120cf61134c565b5b5f600b5443116120e257600b546120e4565b435b90506120fb87600a5461265b90919063ffffffff16565b600a819055506001600c5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506040518060e001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018281526020015f81526020018681526020018581526020016001151581525060075f60085481526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015f6101000a81548160ff0219169083151502179055509050506006600854908060018154018082558091505060019003905f5260205f20015f909190919091505560085f81548092919061228790613338565b919050555050505050505050565b5f33905090565b5f5f83036122ac575f905061230d565b5f82846122b9919061337f565b90508284826122c891906133ed565b14612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ff9061348d565b60405180910390fd5b809150505b92915050565b5f61235483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612741565b905092915050565b5f61239d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506127a2565b905092915050565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124009190612d64565b602060405180830381865afa15801561241b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061243f91906130c6565b90505f5f9050818311156124f05760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b81526004016124a99291906130f1565b6020604051808303815f875af11580156124c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124e991906134bf565b905061258f565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b815260040161254c9291906130f1565b6020604051808303815f875af1158015612568573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061258c91906134bf565b90505b806125cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c69061355a565b60405180910390fd5b50505050565b6126568363a9059cbb60e01b84846040516024016125f49291906130f1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612804565b505050565b5f5f82846126699190613578565b9050838110156126ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a5906135f5565b60405180910390fd5b8091505092915050565b61273b846323b872dd60e01b8585856040516024016126d993929190613613565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612804565b50505050565b5f5f83118290612787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277e91906136a8565b60405180910390fd5b505f838561279591906133ed565b9050809150509392505050565b5f8383111582906127e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e091906136a8565b60405180910390fd5b505f83856127f791906136c8565b9050809150509392505050565b5f612865826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166128c99092919063ffffffff16565b90505f815111156128c4578080602001905181019061288491906134bf565b6128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba9061376b565b60405180910390fd5b5b505050565b60606128d784845f856128e0565b90509392505050565b60606128eb856129fd565b61292a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612921906137d3565b60405180910390fd5b5f5f8673ffffffffffffffffffffffffffffffffffffffff1685876040516129529190613835565b5f6040518083038185875af1925050503d805f811461298c576040519150601f19603f3d011682016040523d82523d5f602084013e612991565b606091505b509150915081156129a65780925050506129f5565b5f815111156129b85780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ec91906136a8565b60405180910390fd5b949350505050565b5f5f823b90505f8111915050919050565b5f819050919050565b612a2081612a0e565b82525050565b5f602082019050612a395f830184612a17565b92915050565b5f5ffd5b612a4c81612a0e565b8114612a56575f5ffd5b50565b5f81359050612a6781612a43565b92915050565b5f60208284031215612a8257612a81612a3f565b5b5f612a8f84828501612a59565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f612ada612ad5612ad084612a98565b612ab7565b612a98565b9050919050565b5f612aeb82612ac0565b9050919050565b5f612afc82612ae1565b9050919050565b612b0c81612af2565b82525050565b5f8115159050919050565b612b2681612b12565b82525050565b5f60e082019050612b3f5f83018a612b03565b612b4c6020830189612a17565b612b596040830188612a17565b612b666060830187612a17565b612b736080830186612a17565b612b8060a0830185612a17565b612b8d60c0830184612b1d565b98975050505050505050565b5f612ba382612ae1565b9050919050565b612bb381612b99565b82525050565b5f602082019050612bcc5f830184612baa565b92915050565b5f5f60408385031215612be857612be7612a3f565b5b5f612bf585828601612a59565b9250506020612c0685828601612a59565b9150509250929050565b612c1981612b12565b8114612c23575f5ffd5b50565b5f81359050612c3481612c10565b92915050565b5f5f5f5f5f60a08688031215612c5357612c52612a3f565b5b5f612c6088828901612a59565b9550506020612c7188828901612a59565b9450506040612c8288828901612a59565b9350506060612c9388828901612a59565b9250506080612ca488828901612c26565b9150509295509295909350565b5f612cbb82612a98565b9050919050565b612ccb81612cb1565b8114612cd5575f5ffd5b50565b5f81359050612ce681612cc2565b92915050565b5f5f60408385031215612d0257612d01612a3f565b5b5f612d0f85828601612a59565b9250506020612d2085828601612cd8565b9150509250929050565b5f60208284031215612d3f57612d3e612a3f565b5b5f612d4c84828501612cd8565b91505092915050565b612d5e81612cb1565b82525050565b5f602082019050612d775f830184612d55565b92915050565b5f604082019050612d905f830185612a17565b612d9d6020830184612a17565b9392505050565b5f612dae82612cb1565b9050919050565b612dbe81612da4565b8114612dc8575f5ffd5b50565b5f81359050612dd981612db5565b92915050565b5f60208284031215612df457612df3612a3f565b5b5f612e0184828501612dcb565b91505092915050565b5f602082019050612e1d5f830184612b1d565b92915050565b5f5f5f5f5f60a08688031215612e3c57612e3b612a3f565b5b5f612e4988828901612a59565b9550506020612e5a88828901612dcb565b9450506040612e6b88828901612a59565b9350506060612e7c88828901612a59565b9250506080612e8d88828901612c26565b9150509295509295909350565b5f82825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612ede602083612e9a565b9150612ee982612eaa565b602082019050919050565b5f6020820190508181035f830152612f0b81612ed2565b9050919050565b7f4d757374206b656570206665657320617420313025206f72206c6573730000005f82015250565b5f612f46601d83612e9a565b9150612f5182612f12565b602082019050919050565b5f6020820190508181035f830152612f7381612f3a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f612fae601f83612e9a565b9150612fb982612f7a565b602082019050919050565b5f6020820190508181035f830152612fdb81612fa2565b9050919050565b7f496e76616c6964207069640000000000000000000000000000000000000000005f82015250565b5f613016600b83612e9a565b915061302182612fe2565b602082019050919050565b5f6020820190508181035f8301526130438161300a565b9050919050565b7f77697468647261773a206e6f7420676f6f6400000000000000000000000000005f82015250565b5f61307e601283612e9a565b91506130898261304a565b602082019050919050565b5f6020820190508181035f8301526130ab81613072565b9050919050565b5f815190506130c081612a43565b92915050565b5f602082840312156130db576130da612a3f565b5b5f6130e8848285016130b2565b91505092915050565b5f6040820190506131045f830185612d55565b6131116020830184612a17565b9392505050565b7f46656573206e6f742077697468696e206c696d697400000000000000000000005f82015250565b5f61314c601583612e9a565b915061315782613118565b602082019050919050565b5f6020820190508181035f83015261317981613140565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613207602683612e9a565b9150613212826131ad565b604082019050919050565b5f6020820190508181035f830152613234816131fb565b9050919050565b7f4661726d206861732073746172746564000000000000000000000000000000005f82015250565b5f61326f601083612e9a565b915061327a8261323b565b602082019050919050565b5f6020820190508181035f83015261329c81613263565b9050919050565b7f6e6f6e4475706c6963617465643a206475706c696361746564000000000000005f82015250565b5f6132d7601983612e9a565b91506132e2826132a3565b602082019050919050565b5f6020820190508181035f830152613304816132cb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61334282612a0e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133745761337361330b565b5b600182019050919050565b5f61338982612a0e565b915061339483612a0e565b92508282026133a281612a0e565b915082820484148315176133b9576133b861330b565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6133f782612a0e565b915061340283612a0e565b925082613412576134116133c0565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f613477602183612e9a565b91506134828261341d565b604082019050919050565b5f6020820190508181035f8301526134a48161346b565b9050919050565b5f815190506134b981612c10565b92915050565b5f602082840312156134d4576134d3612a3f565b5b5f6134e1848285016134ab565b91505092915050565b7f736166654d6f626975735472616e736665723a207472616e73666572206661695f8201527f6c65640000000000000000000000000000000000000000000000000000000000602082015250565b5f613544602383612e9a565b915061354f826134ea565b604082019050919050565b5f6020820190508181035f83015261357181613538565b9050919050565b5f61358282612a0e565b915061358d83612a0e565b92508282019050808211156135a5576135a461330b565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f6135df601b83612e9a565b91506135ea826135ab565b602082019050919050565b5f6020820190508181035f83015261360c816135d3565b9050919050565b5f6060820190506136265f830186612d55565b6136336020830185612d55565b6136406040830184612a17565b949350505050565b5f81519050919050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61367a82613648565b6136848185612e9a565b9350613694818560208601613652565b61369d81613660565b840191505092915050565b5f6020820190508181035f8301526136c08184613670565b905092915050565b5f6136d282612a0e565b91506136dd83612a0e565b92508282039050818111156136f5576136f461330b565b5b92915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f613755602a83612e9a565b9150613760826136fb565b604082019050919050565b5f6020820190508181035f83015261378281613749565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f6137bd601d83612e9a565b91506137c882613789565b602082019050919050565b5f6020820190508181035f8301526137ea816137b1565b9050919050565b5f81519050919050565b5f81905092915050565b5f61380f826137f1565b61381981856137fb565b9350613829818560208601613652565b80840191505092915050565b5f6138408284613805565b91508190509291505056fea264697066735822122097d8004babd3b65e857a8ab50e7371171486c3c2aacbe871aa37a17b6a96c31164736f6c634300081c0033000000000000000000000000f3969639ae1f2716568edbd0420153a6709f6e7b0000000000000000000000009c1b8deb6d89a795bc2e45f86a9af6e0347447740000000000000000000000000000000000000000000000000000000000149970000000000000000000000000000000000000000000000000000000000016c358
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106101cd575f3560e01c8063715018a611610102578063cbd258b5116100a0578063ebc5163b1161006f578063ebc5163b146104fa578063f2fde38b14610518578063f35e4a6e14610534578063f6e6a0e614610550576101cd565b8063cbd258b514610472578063d49e77cd146104a2578063db046fd4146104c0578063e2bbb158146104de576101cd565b80638d88a90e116100dc5780638d88a90e146103d75780638da5cb5b146103f35780638dbb1e3a1461041157806393f1a40b14610441576101cd565b8063715018a61461037f57806379d20a13146103895780638aa28550146103b9576101cd565b806348cd4cb11161016f57806360e4c4ce1161014957806360e4c4ce1461030b578063630b5ba1146103275780636827e7641461033157806369883b4e1461034f576101cd565b806348cd4cb1146102b557806351eb05a6146102d35780635312ea8e146102ef576101cd565b806317caf6f1116101ab57806317caf6f1146102415780631c75b6b21461025f57806341604de01461027b578063441a3e7014610299576101cd565b8063081e3eda146101d15780630ba84cd2146101ef5780631526fe271461020b575b5f5ffd5b6101d961056c565b6040516101e69190612a26565b60405180910390f35b61020960048036038101906102049190612a6d565b610578565b005b61022560048036038101906102209190612a6d565b610674565b6040516102389796959493929190612b2c565b60405180910390f35b6102496106dd565b6040516102569190612a26565b60405180910390f35b61027960048036038101906102749190612a6d565b6106e3565b005b6102836107c6565b6040516102909190612bb9565b60405180910390f35b6102b360048036038101906102ae9190612bd2565b6107eb565b005b6102bd610b8e565b6040516102ca9190612a26565b60405180910390f35b6102ed60048036038101906102e89190612a6d565b610b94565b005b61030960048036038101906103049190612a6d565b610ec4565b005b61032560048036038101906103209190612c3a565b611162565b005b61032f61134c565b005b610339611396565b6040516103469190612a26565b60405180910390f35b61036960048036038101906103649190612a6d565b61139c565b6040516103769190612a26565b60405180910390f35b6103876113bc565b005b6103a3600480360381019061039e9190612cec565b61150c565b6040516103b09190612a26565b60405180910390f35b6103c161171a565b6040516103ce9190612a26565b60405180910390f35b6103f160048036038101906103ec9190612d2a565b61171f565b005b6103fb611858565b6040516104089190612d64565b60405180910390f35b61042b60048036038101906104269190612bd2565b61187f565b6040516104389190612a26565b60405180910390f35b61045b60048036038101906104569190612cec565b6118ae565b604051610469929190612d7d565b60405180910390f35b61048c60048036038101906104879190612ddf565b6118d9565b6040516104999190612e0a565b60405180910390f35b6104aa6118f6565b6040516104b79190612d64565b60405180910390f35b6104c861191b565b6040516104d59190612a26565b60405180910390f35b6104f860048036038101906104f39190612bd2565b611921565b005b610502611ca1565b60405161050f9190612a26565b60405180910390f35b610532600480360381019061052d9190612d2a565b611ca7565b005b61054e60048036038101906105499190612a6d565b611e66565b005b61056a60048036038101906105659190612e23565b611f49565b005b5f600680549050905090565b610580612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461060d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060490612ef4565b60405180910390fd5b61061561134c565b80600481905550610624612295565b73ffffffffffffffffffffffffffffffffffffffff167fe2492e003bbe8afa53088b406f0c1cb5d9e280370fc72a74cf116ffd343c4053826040516106699190612a26565b60405180910390a250565b6007602052805f5260405f205f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002015490806003015490806004015490806005015490806006015f9054906101000a900460ff16905087565b600a5481565b6106eb612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076f90612ef4565b60405180910390fd5b600a8111156107bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b390612f5c565b60405180910390fd5b8060058190555050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260015403610830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082790612fc4565b60405180910390fd5b60026001819055505f60075f8481526020019081526020015f20905060075f8481526020019081526020015f206006015f9054906101000a900460ff166108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a39061302c565b60405180910390fd5b5f60095f8581526020019081526020015f205f6108c7612295565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905082815f01541015610948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093f90613094565b60405180910390fd5b61095184610b94565b5f61099e826001015461099069d3c21bcecceda10000006109828760030154875f015461229c90919063ffffffff16565b61231390919063ffffffff16565b61235c90919063ffffffff16565b90505f8111156109ba576109b96109b3612295565b826123a5565b5b5f841115610aec575f6109ee6127106109e086600501548861229c90919063ffffffff16565b61231390919063ffffffff16565b9050610a0685845f015461235c90919063ffffffff16565b835f0181905550610a73610a18612295565b610a2b838861235c90919063ffffffff16565b865f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166125d59092919063ffffffff16565b5f811115610aea57610ae960035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682865f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166125d59092919063ffffffff16565b5b505b610b2269d3c21bcecceda1000000610b148560030154855f015461229c90919063ffffffff16565b61231390919063ffffffff16565b826001018190555084610b33612295565b73ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56886604051610b789190612a26565b60405180910390a3505050600180819055505050565b600b5481565b5f60075f8381526020019081526020015f209050806006015f9054906101000a900460ff16610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef9061302c565b60405180910390fd5b80600201544311610c095750610ec1565b5f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c659190612d64565b602060405180830381865afa158015610c80573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca491906130c6565b90505f811480610cb757505f8260010154145b15610ccc574382600201819055505050610ec1565b5f610cdb83600201544361187f565b90505f610d1d600a54610d0f8660010154610d016004548761229c90919063ffffffff16565b61229c90919063ffffffff16565b61231390919063ffffffff16565b905060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1960035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610d936005548561231390919063ffffffff16565b6040518363ffffffff1660e01b8152600401610db09291906130f1565b5f604051808303815f87803b158015610dc7575f5ffd5b505af1158015610dd9573d5f5f3e3d5ffd5b5050505060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401610e399291906130f1565b5f604051808303815f87803b158015610e50575f5ffd5b505af1158015610e62573d5f5f3e3d5ffd5b50505050610eab610e9884610e8a69d3c21bcecceda10000008561229c90919063ffffffff16565b61231390919063ffffffff16565b856003015461265b90919063ffffffff16565b8460030181905550438460020181905550505050505b50565b600260015403610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0090612fc4565b60405180910390fd5b60026001819055505f60075f8381526020019081526020015f20905060075f8381526020019081526020015f206006015f9054906101000a900460ff16610f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7c9061302c565b60405180910390fd5b5f60095f8481526020019081526020015f205f610fa0612295565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015490505f61100e61271061100086600501548561229c90919063ffffffff16565b61231390919063ffffffff16565b90505f835f01819055505f836001018190555061108761102c612295565b61103f838561235c90919063ffffffff16565b865f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166125d59092919063ffffffff16565b5f8111156110fe576110fd60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682865f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166125d59092919063ffffffff16565b5b84611107612295565b73ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05958460405161114c9190612a26565b60405180910390a3505050506001808190555050565b61116a612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ee90612ef4565b60405180910390fd5b60075f8681526020019081526020015f206006015f9054906101000a900460ff16611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e9061302c565b60405180910390fd5b6101f4831115801561126b57506101f48211155b6112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a190613162565b60405180910390fd5b80156112b9576112b861134c565b5b6112f4846112e660075f8981526020019081526020015f2060010154600a5461235c90919063ffffffff16565b61265b90919063ffffffff16565b600a819055508360075f8781526020019081526020015f20600101819055508260075f8781526020019081526020015f20600401819055508160075f8781526020019081526020015f20600501819055505050505050565b5f60068054905090505f5f90505b81811015611392576113876006828154811061137957611378613180565b5b905f5260205f200154610b94565b80600101905061135a565b5050565b60055481565b600681815481106113ab575f80fd5b905f5260205f20015f915090505481565b6113c4612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144890612ef4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f5f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b5f5f60075f8581526020019081526020015f2090505f60095f8681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f826003015490505f835f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115d49190612d64565b602060405180830381865afa1580156115ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161391906130c6565b905083600201544311801561162857505f8114155b156116c6575f61163c85600201544361187f565b90505f61167e600a5461167088600101546116626004548761229c90919063ffffffff16565b61229c90919063ffffffff16565b61231390919063ffffffff16565b90506116c16116b2846116a469d3c21bcecceda10000008561229c90919063ffffffff16565b61231390919063ffffffff16565b8561265b90919063ffffffff16565b935050505b61170e836001015461170069d3c21bcecceda10000006116f286885f015461229c90919063ffffffff16565b61231390919063ffffffff16565b61235c90919063ffffffff16565b94505050505092915050565b600181565b611727612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ab90612ef4565b60405180910390fd5b8060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16611813612295565b73ffffffffffffffffffffffffffffffffffffffff167f618c54559e94f1499a808aad71ee8729f8e74e8c48e979616328ce493a1a52e760405160405180910390a350565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6118a66001611898858561235c90919063ffffffff16565b61229c90919063ffffffff16565b905092915050565b6009602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154905082565b600c602052805f5260405f205f915054906101000a900460ff1681565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b600260015403611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90612fc4565b60405180910390fd5b60026001819055505f60075f8481526020019081526020015f20905060075f8481526020019081526020015f206006015f9054906101000a900460ff166119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d99061302c565b60405180910390fd5b5f60095f8581526020019081526020015f205f6119fd612295565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050611a4184610b94565b5f815f01541115611ab7575f611a998260010154611a8b69d3c21bcecceda1000000611a7d8760030154875f015461229c90919063ffffffff16565b61231390919063ffffffff16565b61235c90919063ffffffff16565b90505f811115611ab557611ab4611aae612295565b826123a5565b5b505b5f5f90505f841115611bed57611aee612710611ae085600401548761229c90919063ffffffff16565b61231390919063ffffffff16565b9050611b46611afb612295565b3086865f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126b8909392919063ffffffff16565b5f811115611bbd57611bbc60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682855f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166125d59092919063ffffffff16565b5b611be5611bd3828661235c90919063ffffffff16565b835f015461265b90919063ffffffff16565b825f01819055505b611c2369d3c21bcecceda1000000611c158560030154855f015461229c90919063ffffffff16565b61231390919063ffffffff16565b826001018190555084611c34612295565b73ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15611c7e848861235c90919063ffffffff16565b604051611c8b9190612a26565b60405180910390a3505050600180819055505050565b60085481565b611caf612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3390612ef4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da19061321d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e6e612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef290612ef4565b60405180910390fd5b600b544310611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3690613285565b60405180910390fd5b80600b8190555050565b611f51612295565b73ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd590612ef4565b60405180910390fd5b835f1515600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615151461206e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612065906132ed565b60405180910390fd5b6101f4841115801561208257506101f48311155b6120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b890613162565b60405180910390fd5b81156120d0576120cf61134c565b5b5f600b5443116120e257600b546120e4565b435b90506120fb87600a5461265b90919063ffffffff16565b600a819055506001600c5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506040518060e001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018281526020015f81526020018681526020018581526020016001151581525060075f60085481526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015f6101000a81548160ff0219169083151502179055509050506006600854908060018154018082558091505060019003905f5260205f20015f909190919091505560085f81548092919061228790613338565b919050555050505050505050565b5f33905090565b5f5f83036122ac575f905061230d565b5f82846122b9919061337f565b90508284826122c891906133ed565b14612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ff9061348d565b60405180910390fd5b809150505b92915050565b5f61235483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612741565b905092915050565b5f61239d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506127a2565b905092915050565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124009190612d64565b602060405180830381865afa15801561241b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061243f91906130c6565b90505f5f9050818311156124f05760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b81526004016124a99291906130f1565b6020604051808303815f875af11580156124c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124e991906134bf565b905061258f565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b815260040161254c9291906130f1565b6020604051808303815f875af1158015612568573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061258c91906134bf565b90505b806125cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c69061355a565b60405180910390fd5b50505050565b6126568363a9059cbb60e01b84846040516024016125f49291906130f1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612804565b505050565b5f5f82846126699190613578565b9050838110156126ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a5906135f5565b60405180910390fd5b8091505092915050565b61273b846323b872dd60e01b8585856040516024016126d993929190613613565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612804565b50505050565b5f5f83118290612787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277e91906136a8565b60405180910390fd5b505f838561279591906133ed565b9050809150509392505050565b5f8383111582906127e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e091906136a8565b60405180910390fd5b505f83856127f791906136c8565b9050809150509392505050565b5f612865826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166128c99092919063ffffffff16565b90505f815111156128c4578080602001905181019061288491906134bf565b6128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba9061376b565b60405180910390fd5b5b505050565b60606128d784845f856128e0565b90509392505050565b60606128eb856129fd565b61292a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612921906137d3565b60405180910390fd5b5f5f8673ffffffffffffffffffffffffffffffffffffffff1685876040516129529190613835565b5f6040518083038185875af1925050503d805f811461298c576040519150601f19603f3d011682016040523d82523d5f602084013e612991565b606091505b509150915081156129a65780925050506129f5565b5f815111156129b85780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ec91906136a8565b60405180910390fd5b949350505050565b5f5f823b90505f8111915050919050565b5f819050919050565b612a2081612a0e565b82525050565b5f602082019050612a395f830184612a17565b92915050565b5f5ffd5b612a4c81612a0e565b8114612a56575f5ffd5b50565b5f81359050612a6781612a43565b92915050565b5f60208284031215612a8257612a81612a3f565b5b5f612a8f84828501612a59565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f612ada612ad5612ad084612a98565b612ab7565b612a98565b9050919050565b5f612aeb82612ac0565b9050919050565b5f612afc82612ae1565b9050919050565b612b0c81612af2565b82525050565b5f8115159050919050565b612b2681612b12565b82525050565b5f60e082019050612b3f5f83018a612b03565b612b4c6020830189612a17565b612b596040830188612a17565b612b666060830187612a17565b612b736080830186612a17565b612b8060a0830185612a17565b612b8d60c0830184612b1d565b98975050505050505050565b5f612ba382612ae1565b9050919050565b612bb381612b99565b82525050565b5f602082019050612bcc5f830184612baa565b92915050565b5f5f60408385031215612be857612be7612a3f565b5b5f612bf585828601612a59565b9250506020612c0685828601612a59565b9150509250929050565b612c1981612b12565b8114612c23575f5ffd5b50565b5f81359050612c3481612c10565b92915050565b5f5f5f5f5f60a08688031215612c5357612c52612a3f565b5b5f612c6088828901612a59565b9550506020612c7188828901612a59565b9450506040612c8288828901612a59565b9350506060612c9388828901612a59565b9250506080612ca488828901612c26565b9150509295509295909350565b5f612cbb82612a98565b9050919050565b612ccb81612cb1565b8114612cd5575f5ffd5b50565b5f81359050612ce681612cc2565b92915050565b5f5f60408385031215612d0257612d01612a3f565b5b5f612d0f85828601612a59565b9250506020612d2085828601612cd8565b9150509250929050565b5f60208284031215612d3f57612d3e612a3f565b5b5f612d4c84828501612cd8565b91505092915050565b612d5e81612cb1565b82525050565b5f602082019050612d775f830184612d55565b92915050565b5f604082019050612d905f830185612a17565b612d9d6020830184612a17565b9392505050565b5f612dae82612cb1565b9050919050565b612dbe81612da4565b8114612dc8575f5ffd5b50565b5f81359050612dd981612db5565b92915050565b5f60208284031215612df457612df3612a3f565b5b5f612e0184828501612dcb565b91505092915050565b5f602082019050612e1d5f830184612b1d565b92915050565b5f5f5f5f5f60a08688031215612e3c57612e3b612a3f565b5b5f612e4988828901612a59565b9550506020612e5a88828901612dcb565b9450506040612e6b88828901612a59565b9350506060612e7c88828901612a59565b9250506080612e8d88828901612c26565b9150509295509295909350565b5f82825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612ede602083612e9a565b9150612ee982612eaa565b602082019050919050565b5f6020820190508181035f830152612f0b81612ed2565b9050919050565b7f4d757374206b656570206665657320617420313025206f72206c6573730000005f82015250565b5f612f46601d83612e9a565b9150612f5182612f12565b602082019050919050565b5f6020820190508181035f830152612f7381612f3a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f612fae601f83612e9a565b9150612fb982612f7a565b602082019050919050565b5f6020820190508181035f830152612fdb81612fa2565b9050919050565b7f496e76616c6964207069640000000000000000000000000000000000000000005f82015250565b5f613016600b83612e9a565b915061302182612fe2565b602082019050919050565b5f6020820190508181035f8301526130438161300a565b9050919050565b7f77697468647261773a206e6f7420676f6f6400000000000000000000000000005f82015250565b5f61307e601283612e9a565b91506130898261304a565b602082019050919050565b5f6020820190508181035f8301526130ab81613072565b9050919050565b5f815190506130c081612a43565b92915050565b5f602082840312156130db576130da612a3f565b5b5f6130e8848285016130b2565b91505092915050565b5f6040820190506131045f830185612d55565b6131116020830184612a17565b9392505050565b7f46656573206e6f742077697468696e206c696d697400000000000000000000005f82015250565b5f61314c601583612e9a565b915061315782613118565b602082019050919050565b5f6020820190508181035f83015261317981613140565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613207602683612e9a565b9150613212826131ad565b604082019050919050565b5f6020820190508181035f830152613234816131fb565b9050919050565b7f4661726d206861732073746172746564000000000000000000000000000000005f82015250565b5f61326f601083612e9a565b915061327a8261323b565b602082019050919050565b5f6020820190508181035f83015261329c81613263565b9050919050565b7f6e6f6e4475706c6963617465643a206475706c696361746564000000000000005f82015250565b5f6132d7601983612e9a565b91506132e2826132a3565b602082019050919050565b5f6020820190508181035f830152613304816132cb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61334282612a0e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133745761337361330b565b5b600182019050919050565b5f61338982612a0e565b915061339483612a0e565b92508282026133a281612a0e565b915082820484148315176133b9576133b861330b565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6133f782612a0e565b915061340283612a0e565b925082613412576134116133c0565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f613477602183612e9a565b91506134828261341d565b604082019050919050565b5f6020820190508181035f8301526134a48161346b565b9050919050565b5f815190506134b981612c10565b92915050565b5f602082840312156134d4576134d3612a3f565b5b5f6134e1848285016134ab565b91505092915050565b7f736166654d6f626975735472616e736665723a207472616e73666572206661695f8201527f6c65640000000000000000000000000000000000000000000000000000000000602082015250565b5f613544602383612e9a565b915061354f826134ea565b604082019050919050565b5f6020820190508181035f83015261357181613538565b9050919050565b5f61358282612a0e565b915061358d83612a0e565b92508282019050808211156135a5576135a461330b565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f6135df601b83612e9a565b91506135ea826135ab565b602082019050919050565b5f6020820190508181035f83015261360c816135d3565b9050919050565b5f6060820190506136265f830186612d55565b6136336020830185612d55565b6136406040830184612a17565b949350505050565b5f81519050919050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61367a82613648565b6136848185612e9a565b9350613694818560208601613652565b61369d81613660565b840191505092915050565b5f6020820190508181035f8301526136c08184613670565b905092915050565b5f6136d282612a0e565b91506136dd83612a0e565b92508282039050818111156136f5576136f461330b565b5b92915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f613755602a83612e9a565b9150613760826136fb565b604082019050919050565b5f6020820190508181035f83015261378281613749565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f6137bd601d83612e9a565b91506137c882613789565b602082019050919050565b5f6020820190508181035f8301526137ea816137b1565b9050919050565b5f81519050919050565b5f81905092915050565b5f61380f826137f1565b61381981856137fb565b9350613829818560208601613652565b80840191505092915050565b5f6138408284613805565b91508190509291505056fea264697066735822122097d8004babd3b65e857a8ab50e7371171486c3c2aacbe871aa37a17b6a96c31164736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f3969639ae1f2716568edbd0420153a6709f6e7b0000000000000000000000009c1b8deb6d89a795bc2e45f86a9af6e0347447740000000000000000000000000000000000000000000000000000000000149970000000000000000000000000000000000000000000000000000000000016c358
-----Decoded View---------------
Arg [0] : _mobius (address): 0xf3969639AE1f2716568eDBd0420153a6709f6e7b
Arg [1] : _devaddr (address): 0x9C1B8Deb6d89A795Bc2e45F86A9Af6e034744774
Arg [2] : _mobiusPerBlock (uint256): 1350000
Arg [3] : _startBlock (uint256): 1491800
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000f3969639ae1f2716568edbd0420153a6709f6e7b
Arg [1] : 0000000000000000000000009c1b8deb6d89a795bc2e45f86a9af6e034744774
Arg [2] : 0000000000000000000000000000000000000000000000000000000000149970
Arg [3] : 000000000000000000000000000000000000000000000000000000000016c358
Deployed Bytecode Sourcemap
23827:11716:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26975:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35326:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25736:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;26037:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35155:163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25358:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32574:1005;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26130:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30518:892;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33650:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28418:659;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30246:196;;;:::i;:::-;;25636:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25705:24;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16574:148;;;:::i;:::-;;29362:801;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25569:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34832:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15932:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29153:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25878:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;27077:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25414:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25484:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31481:1041;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25787:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16877:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34978:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27344:960;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26975:94;27020:7;27047;:14;;;;27040:21;;26975:94;:::o;35326:214::-;16154:12;:10;:12::i;:::-;16144:22;;:6;;;;;;;;;;;:22;;;16136:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35407:17:::1;:15;:17::i;:::-;35452:15;35435:14;:32;;;;35502:12;:10;:12::i;:::-;35483:49;;;35516:15;35483:49;;;;;;:::i;:::-;;;;;;;;35326:214:::0;:::o;25736:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26037:34::-;;;;:::o;35155:163::-;16154:12;:10;:12::i;:::-;16144:22;;:6;;;;;;;;;;;:22;;;16136:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35244:2:::1;35230:10;:16;;35222:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35300:10;35291:6;:19;;;;35155:163:::0;:::o;25358:28::-;;;;;;;;;;;;;:::o;32574:1005::-;22511:1;23108:7;;:19;23100:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22511:1;23241:7;:18;;;;32654:21:::1;32678:8;:14;32687:4;32678:14;;;;;;;;;;;32654:38;;32712:8;:14;32721:4;32712:14;;;;;;;;;;;:21;;;;;;;;;;;;32703:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;32762:21;32786:8;:14;32795:4;32786:14;;;;;;;;;;;:28;32801:12;:10;:12::i;:::-;32786:28;;;;;;;;;;;;;;;32762:52;;32848:7;32833:4;:11;;;:22;;32825:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32889:16;32900:4;32889:10;:16::i;:::-;32916:15;32934:82;33000:4;:15;;;32934:61;26208:4;32934:39;32950:4;:22;;;32934:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:61;;;;:::i;:::-;:65;;:82;;;;:::i;:::-;32916:100;;33041:1;33031:7;:11;33027:85;;;33059:41;33078:12;:10;:12::i;:::-;33092:7;33059:18;:41::i;:::-;33027:85;33136:1;33126:7;:11;33122:307;;;33154:11;33168:48;26258:3;33168:31;33180:4;:18;;;33168:7;:11;;:31;;;;:::i;:::-;:35;;:48;;;;:::i;:::-;33154:62;;33245:24;33261:7;33245:4;:11;;;:15;;:24;;;;:::i;:::-;33231:4;:11;;:38;;;;33284:66;33318:12;:10;:12::i;:::-;33333:16;33345:3;33333:7;:11;;:16;;;;:::i;:::-;33284:4;:12;;;;;;;;;;;;:25;;;;:66;;;;;:::i;:::-;33375:1;33369:3;:7;33365:52;;;33378:39;33404:7;;;;;;;;;;;33413:3;33378:4;:12;;;;;;;;;;;;:25;;;;:39;;;;;:::i;:::-;33365:52;33139:290;33122:307;33457:61;26208:4;33457:39;33473:4;:22;;;33457:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:61;;;;:::i;:::-;33439:4;:15;;:79;;;;33557:4;33543:12;:10;:12::i;:::-;33534:37;;;33563:7;33534:37;;;;;;:::i;:::-;;;;;;;;32643:936;;;22467:1:::0;23420:7;:22;;;;32574:1005;;:::o;26130:25::-;;;;:::o;30518:892::-;30570:21;30594:8;:14;30603:4;30594:14;;;;;;;;;;;30570:38;;30628:4;:11;;;;;;;;;;;;30619:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;30688:4;:20;;;30672:12;:36;30668:75;;30725:7;;;30668:75;30755:16;30774:4;:12;;;;;;;;;;;;:22;;;30805:4;30774:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30755:56;;30838:1;30826:8;:13;:37;;;;30862:1;30843:4;:15;;;:20;30826:37;30822:126;;;30903:12;30880:4;:20;;:35;;;;30930:7;;;;30822:126;30960:18;30981:49;30995:4;:20;;;31017:12;30981:13;:49::i;:::-;30960:70;;31041:20;31064:72;31120:15;;31064:51;31099:4;:15;;;31064:30;31079:14;;31064:10;:14;;:30;;;;:::i;:::-;:34;;:51;;;;:::i;:::-;:55;;:72;;;;:::i;:::-;31041:95;;31147:6;;;;;;;;;;;:11;;;31159:7;;;;;;;;;;;31168:24;31185:6;;31168:12;:16;;:24;;;;:::i;:::-;31147:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31204:6;;;;;;;;;;;:11;;;31224:4;31231:12;31204:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31280:76;31307:48;31346:8;31307:34;26208:4;31307:12;:16;;:34;;;;:::i;:::-;:38;;:48;;;;:::i;:::-;31280:4;:22;;;:26;;:76;;;;:::i;:::-;31255:4;:22;;:101;;;;31390:12;31367:4;:20;;:35;;;;30559:851;;;;30518:892;;:::o;33650:615::-;22511:1;23108:7;;:19;23100:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22511:1;23241:7;:18;;;;33722:21:::1;33746:8;:14;33755:4;33746:14;;;;;;;;;;;33722:38;;33780:8;:14;33789:4;33780:14;;;;;;;;;;;:21;;;;;;;;;;;;33771:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;33838:21;33862:8;:14;33871:4;33862:14;;;;;;;;;;;:28;33877:12;:10;:12::i;:::-;33862:28;;;;;;;;;;;;;;;33838:52;;33901:14;33918:4;:11;;;33901:28;;33940:11;33954:47;26258:3;33954:30;33965:4;:18;;;33954:6;:10;;:30;;;;:::i;:::-;:34;;:47;;;;:::i;:::-;33940:61;;34026:1;34012:4;:11;;:15;;;;34056:1;34038:4;:15;;:19;;;;34068:65;34102:12;:10;:12::i;:::-;34117:15;34128:3;34117:6;:10;;:15;;;;:::i;:::-;34068:4;:12;;;;;;;;;;;;:25;;;;:65;;;;;:::i;:::-;34154:1;34148:3;:7;34144:52;;;34157:39;34183:7;;;;;;;;;;;34192:3;34157:4;:12;;;;;;;;;;;;:25;;;;:39;;;;;:::i;:::-;34144:52;34244:4;34230:12;:10;:12::i;:::-;34212:45;;;34250:6;34212:45;;;;;;:::i;:::-;;;;;;;;33711:554;;;;22467:1:::0;23420:7;:22;;;;33650:615;:::o;28418:659::-;16154:12;:10;:12::i;:::-;16144:22;;:6;;;;;;;;;;;:22;;;16136:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28622:8:::1;:14;28631:4;28622:14;;;;;;;;;;;:21;;;;;;;;;;;;28613:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;28694:3;28679:11;:18;;:43;;;;;28719:3;28701:14;:21;;28679:43;28670:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;28765:11;28761:61;;;28793:17;:15;:17::i;:::-;28761:61;28850:63;28901:11;28850:46;28870:8;:14;28879:4;28870:14;;;;;;;;;;;:25;;;28850:15;;:19;;:46;;;;:::i;:::-;:50;;:63;;;;:::i;:::-;28832:15;:81;;;;28952:11;28924:8;:14;28933:4;28924:14;;;;;;;;;;;:25;;:39;;;;29002:11;28974:8;:14;28983:4;28974:14;;;;;;;;;;;:25;;:39;;;;29055:14;29024:8;:14;29033:4;29024:14;;;;;;;;;;;:28;;:45;;;;28418:659:::0;;;;;:::o;30246:196::-;30291:14;30308:7;:14;;;;30291:31;;30338:13;30354:1;30338:17;;30333:102;30365:6;30357:5;:14;30333:102;;;30397:26;30408:7;30416:5;30408:14;;;;;;;;:::i;:::-;;;;;;;;;;30397:10;:26::i;:::-;30373:7;;;;;30333:102;;;;30280:162;30246:196::o;25636:26::-;;;;:::o;25705:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16574:148::-;16154:12;:10;:12::i;:::-;16144:22;;:6;;;;;;;;;;;:22;;;16136:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16681:1:::1;16644:40;;16665:6;;;;;;;;;;;16644:40;;;;;;;;;;;;16712:1;16695:6;;:19;;;;;;;;;;;;;;;;;;16574:148::o:0;29362:801::-;29437:7;29457:21;29481:8;:14;29490:4;29481:14;;;;;;;;;;;29457:38;;29506:21;29530:8;:14;29539:4;29530:14;;;;;;;;;;;:21;29545:5;29530:21;;;;;;;;;;;;;;;29506:45;;29562:25;29590:4;:22;;;29562:50;;29623:16;29642:4;:12;;;;;;;;;;;;:22;;;29673:4;29642:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29623:56;;29709:4;:20;;;29694:12;:35;:52;;;;;29745:1;29733:8;:13;;29694:52;29690:371;;;29763:18;29784:49;29798:4;:20;;;29820:12;29784:13;:49::i;:::-;29763:70;;29848:20;29871:72;29927:15;;29871:51;29906:4;:15;;;29871:30;29886:14;;29871:10;:14;;:30;;;;:::i;:::-;:34;;:51;;;;:::i;:::-;:55;;:72;;;;:::i;:::-;29848:95;;29978:71;30000:48;30039:8;30000:34;26208:4;30000:12;:16;;:34;;;;:::i;:::-;:38;;:48;;;;:::i;:::-;29978:17;:21;;:71;;;;:::i;:::-;29958:91;;29748:313;;29690:371;30078:77;30139:4;:15;;;30078:56;26208:4;30078:34;30094:17;30078:4;:11;;;:15;;:34;;;;:::i;:::-;:38;;:56;;;;:::i;:::-;:60;;:77;;;;:::i;:::-;30071:84;;;;;;29362:801;;;;:::o;25569:44::-;25612:1;25569:44;:::o;34832:138::-;16154:12;:10;:12::i;:::-;16144:22;;:6;;;;;;;;;;;:22;;;16136:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34901:8:::1;34891:7;;:18;;;;;;;;;;;;;;;;;;34953:8;34925:37;;34939:12;:10;:12::i;:::-;34925:37;;;;;;;;;;;;34832:138:::0;:::o;15932:79::-;15970:7;15997:6;;;;;;;;;;;15990:13;;15932:79;:::o;29153:143::-;29225:7;29252:36;25612:1;29252:14;29260:5;29252:3;:7;;:14;;;;:::i;:::-;:18;;:36;;;;:::i;:::-;29245:43;;29153:143;;;;:::o;25878:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27077:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;25414:22::-;;;;;;;;;;;;;:::o;25484:29::-;;;;:::o;31481:1041::-;22511:1;23108:7;;:19;23100:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22511:1;23241:7;:18;;;;31560:21:::1;31584:8;:14;31593:4;31584:14;;;;;;;;;;;31560:38;;31618:8;:14;31627:4;31618:14;;;;;;;;;;;:21;;;;;;;;;;;;31609:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;31668:21;31692:8;:14;31701:4;31692:14;;;;;;;;;;;:28;31707:12;:10;:12::i;:::-;31692:28;;;;;;;;;;;;;;;31668:52;;31731:16;31742:4;31731:10;:16::i;:::-;31776:1;31762:4;:11;;;:15;31758:255;;;31794:15;31812:82;31878:4;:15;;;31812:61;26208:4;31812:39;31828:4;:22;;;31812:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:61;;;;:::i;:::-;:65;;:82;;;;:::i;:::-;31794:100;;31923:1;31913:7;:11;31909:93;;;31945:41;31964:12;:10;:12::i;:::-;31978:7;31945:18;:41::i;:::-;31909:93;31779:234;31758:255;32023:11;32037:1;32023:15;;32063:1;32053:7;:11;32049:315;;;32087:45;26258:3;32087:28;32099:4;:15;;;32087:7;:11;;:28;;;;:::i;:::-;:32;;:45;;;;:::i;:::-;32081:51;;32147:76;32185:12;:10;:12::i;:::-;32208:4;32215:7;32147:4;:12;;;;;;;;;;;;:29;;;;:76;;;;;;:::i;:::-;32248:1;32242:3;:7;32238:52;;;32251:39;32277:7;;;;;;;;;;;32286:3;32251:4;:12;;;;;;;;;;;;:25;;;;:39;;;;;:::i;:::-;32238:52;32319:33;32335:16;32347:3;32335:7;:11;;:16;;;;:::i;:::-;32319:4;:11;;;:15;;:33;;;;:::i;:::-;32305:4;:11;;:47;;;;32049:315;32392:61;26208:4;32392:39;32408:4;:22;;;32392:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:61;;;;:::i;:::-;32374:4;:15;;:79;;;;32491:4;32477:12;:10;:12::i;:::-;32469:45;;;32497:16;32509:3;32497:7;:11;;:16;;;;:::i;:::-;32469:45;;;;;;:::i;:::-;;;;;;;;31549:973;;;22467:1:::0;23420:7;:22;;;;31481:1041;;:::o;25787:35::-;;;;:::o;16877:244::-;16154:12;:10;:12::i;:::-;16144:22;;:6;;;;;;;;;;;:22;;;16136:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16986:1:::1;16966:22;;:8;:22;;::::0;16958:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;17076:8;17047:38;;17068:6;;;;;;;;;;;17047:38;;;;;;;;;;;;17105:8;17096:6;;:17;;;;;;;;;;;;;;;;;;16877:244:::0;:::o;34978:169::-;16154:12;:10;:12::i;:::-;16144:22;;:6;;;;;;;;;;;:22;;;16136:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35073:10:::1;;35058:12;:25;35050:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;35128:11;35115:10;:24;;;;34978:169:::0;:::o;27344:960::-;16154:12;:10;:12::i;:::-;16144:22;;:6;;;;;;;;;;;:22;;;16136:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27545:8:::1;27214:5;27187:32;;:13;:23;27201:8;27187:23;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;27179:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;27590:3:::2;27575:11;:18;;:43;;;;;27615:3;27597:14;:21;;27575:43;27566:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;27661:11;27657:61;;;27689:17;:15;:17::i;:::-;27657:61;27728:23;27769:10;;27754:12;:25;:53;;27797:10;;27754:53;;;27782:12;27754:53;27728:79;;27836:32;27856:11;27836:15;;:19;;:32;;;;:::i;:::-;27818:15;:50;;;;27905:4;27879:13;:23;27893:8;27879:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;27946:286;;;;;;;;27980:8;27946:286;;;;;;28016:11;27946:286;;;;28060:15;27946:286;;;;28110:1;27946:286;;;;28138:11;27946:286;;;;28179:14;27946:286;;;;28216:4;27946:286;;;;::::0;27920:8:::2;:23;27929:13;;27920:23;;;;;;;;;;;:312;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28243:7;28256:13;;28243:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28281:13;;:15;;;;;;;;;:::i;:::-;;;;;;27555:749;16214:1:::1;27344:960:::0;;;;;:::o;604:98::-;657:7;684:10;677:17;;604:98;:::o;5861:471::-;5919:7;6169:1;6164;:6;6160:47;;6194:1;6187:8;;;;6160:47;6219:9;6235:1;6231;:5;;;;:::i;:::-;6219:17;;6264:1;6259;6255;:5;;;;:::i;:::-;:10;6247:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;6323:1;6316:8;;;5861:471;;;;;:::o;6808:132::-;6866:7;6893:39;6897:1;6900;6893:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6886:46;;6808:132;;;;:::o;4971:136::-;5029:7;5056:43;5060:1;5063;5056:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5049:50;;4971:136;;;;:::o;34383:441::-;34461:17;34481:6;;;;;;;;;;;:16;;;34506:4;34481:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34461:51;;34523:20;34546:5;34523:28;;34576:9;34566:7;:19;34562:181;;;34620:6;;;;;;;;;;;:15;;;34636:3;34641:9;34620:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34602:49;;34562:181;;;34702:6;;;;;;;;;;;:15;;;34718:3;34723:7;34702:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34684:47;;34562:181;34761:15;34753:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34450:374;;34383:441;;:::o;17787:177::-;17870:86;17890:5;17920:23;;;17945:2;17949:5;17897:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17870:19;:86::i;:::-;17787:177;;;:::o;4507:181::-;4565:7;4585:9;4601:1;4597;:5;;;;:::i;:::-;4585:17;;4626:1;4621;:6;;4613:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4679:1;4672:8;;;4507:181;;;;:::o;17972:205::-;18073:96;18093:5;18123:27;;;18152:4;18158:2;18162:5;18100:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18073:19;:96::i;:::-;17972:205;;;;:::o;7436:278::-;7522:7;7554:1;7550;:5;7557:12;7542:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;7581:9;7597:1;7593;:5;;;;:::i;:::-;7581:17;;7705:1;7698:8;;;7436:278;;;;;:::o;5410:192::-;5496:7;5529:1;5524;:6;;5532:12;5516:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5556:9;5572:1;5568;:5;;;;:::i;:::-;5556:17;;5593:1;5586:8;;;5410:192;;;;;:::o;20092:761::-;20516:23;20542:69;20570:4;20542:69;;;;;;;;;;;;;;;;;20550:5;20542:27;;;;:69;;;;;:::i;:::-;20516:95;;20646:1;20626:10;:17;:21;20622:224;;;20768:10;20757:30;;;;;;;;;;;;:::i;:::-;20749:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;20622:224;20162:691;20092:761;;:::o;12568:196::-;12671:12;12703:53;12726:6;12734:4;12740:1;12743:12;12703:22;:53::i;:::-;12696:60;;12568:196;;;;;:::o;13945:979::-;14075:12;14108:18;14119:6;14108:10;:18::i;:::-;14100:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;14234:12;14248:23;14275:6;:11;;14295:8;14306:4;14275:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14233:78;;;;14326:7;14322:595;;;14357:10;14350:17;;;;;;14322:595;14491:1;14471:10;:17;:21;14467:439;;;14734:10;14728:17;14795:15;14782:10;14778:2;14774:19;14767:44;14467:439;14877:12;14870:20;;;;;;;;;;;:::i;:::-;;;;;;;;13945:979;;;;;;;:::o;9650:422::-;9710:4;9918:12;10029:7;10017:20;10009:28;;10063:1;10056:4;:8;10049:15;;;9650:422;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;523:117::-;632:1;629;622:12;769:122;842:24;860:5;842:24;:::i;:::-;835:5;832:35;822:63;;881:1;878;871:12;822:63;769:122;:::o;897:139::-;943:5;981:6;968:20;959:29;;997:33;1024:5;997:33;:::i;:::-;897:139;;;;:::o;1042:329::-;1101:6;1150:2;1138:9;1129:7;1125:23;1121:32;1118:119;;;1156:79;;:::i;:::-;1118:119;1276:1;1301:53;1346:7;1337:6;1326:9;1322:22;1301:53;:::i;:::-;1291:63;;1247:117;1042:329;;;;:::o;1377:126::-;1414:7;1454:42;1447:5;1443:54;1432:65;;1377:126;;;:::o;1509:60::-;1537:3;1558:5;1551:12;;1509:60;;;:::o;1575:142::-;1625:9;1658:53;1676:34;1685:24;1703:5;1685:24;:::i;:::-;1676:34;:::i;:::-;1658:53;:::i;:::-;1645:66;;1575:142;;;:::o;1723:126::-;1773:9;1806:37;1837:5;1806:37;:::i;:::-;1793:50;;1723:126;;;:::o;1855:139::-;1918:9;1951:37;1982:5;1951:37;:::i;:::-;1938:50;;1855:139;;;:::o;2000:157::-;2100:50;2144:5;2100:50;:::i;:::-;2095:3;2088:63;2000:157;;:::o;2163:90::-;2197:7;2240:5;2233:13;2226:21;2215:32;;2163:90;;;:::o;2259:109::-;2340:21;2355:5;2340:21;:::i;:::-;2335:3;2328:34;2259:109;;:::o;2374:900::-;2642:4;2680:3;2669:9;2665:19;2657:27;;2694:84;2775:1;2764:9;2760:17;2751:6;2694:84;:::i;:::-;2788:72;2856:2;2845:9;2841:18;2832:6;2788:72;:::i;:::-;2870;2938:2;2927:9;2923:18;2914:6;2870:72;:::i;:::-;2952;3020:2;3009:9;3005:18;2996:6;2952:72;:::i;:::-;3034:73;3102:3;3091:9;3087:19;3078:6;3034:73;:::i;:::-;3117;3185:3;3174:9;3170:19;3161:6;3117:73;:::i;:::-;3200:67;3262:3;3251:9;3247:19;3238:6;3200:67;:::i;:::-;2374:900;;;;;;;;;;:::o;3280:148::-;3352:9;3385:37;3416:5;3385:37;:::i;:::-;3372:50;;3280:148;;;:::o;3434:175::-;3543:59;3596:5;3543:59;:::i;:::-;3538:3;3531:72;3434:175;;:::o;3615:266::-;3730:4;3768:2;3757:9;3753:18;3745:26;;3781:93;3871:1;3860:9;3856:17;3847:6;3781:93;:::i;:::-;3615:266;;;;:::o;3887:474::-;3955:6;3963;4012:2;4000:9;3991:7;3987:23;3983:32;3980:119;;;4018:79;;:::i;:::-;3980:119;4138:1;4163:53;4208:7;4199:6;4188:9;4184:22;4163:53;:::i;:::-;4153:63;;4109:117;4265:2;4291:53;4336:7;4327:6;4316:9;4312:22;4291:53;:::i;:::-;4281:63;;4236:118;3887:474;;;;;:::o;4367:116::-;4437:21;4452:5;4437:21;:::i;:::-;4430:5;4427:32;4417:60;;4473:1;4470;4463:12;4417:60;4367:116;:::o;4489:133::-;4532:5;4570:6;4557:20;4548:29;;4586:30;4610:5;4586:30;:::i;:::-;4489:133;;;;:::o;4628:905::-;4720:6;4728;4736;4744;4752;4801:3;4789:9;4780:7;4776:23;4772:33;4769:120;;;4808:79;;:::i;:::-;4769:120;4928:1;4953:53;4998:7;4989:6;4978:9;4974:22;4953:53;:::i;:::-;4943:63;;4899:117;5055:2;5081:53;5126:7;5117:6;5106:9;5102:22;5081:53;:::i;:::-;5071:63;;5026:118;5183:2;5209:53;5254:7;5245:6;5234:9;5230:22;5209:53;:::i;:::-;5199:63;;5154:118;5311:2;5337:53;5382:7;5373:6;5362:9;5358:22;5337:53;:::i;:::-;5327:63;;5282:118;5439:3;5466:50;5508:7;5499:6;5488:9;5484:22;5466:50;:::i;:::-;5456:60;;5410:116;4628:905;;;;;;;;:::o;5539:96::-;5576:7;5605:24;5623:5;5605:24;:::i;:::-;5594:35;;5539:96;;;:::o;5641:122::-;5714:24;5732:5;5714:24;:::i;:::-;5707:5;5704:35;5694:63;;5753:1;5750;5743:12;5694:63;5641:122;:::o;5769:139::-;5815:5;5853:6;5840:20;5831:29;;5869:33;5896:5;5869:33;:::i;:::-;5769:139;;;;:::o;5914:474::-;5982:6;5990;6039:2;6027:9;6018:7;6014:23;6010:32;6007:119;;;6045:79;;:::i;:::-;6007:119;6165:1;6190:53;6235:7;6226:6;6215:9;6211:22;6190:53;:::i;:::-;6180:63;;6136:117;6292:2;6318:53;6363:7;6354:6;6343:9;6339:22;6318:53;:::i;:::-;6308:63;;6263:118;5914:474;;;;;:::o;6394:329::-;6453:6;6502:2;6490:9;6481:7;6477:23;6473:32;6470:119;;;6508:79;;:::i;:::-;6470:119;6628:1;6653:53;6698:7;6689:6;6678:9;6674:22;6653:53;:::i;:::-;6643:63;;6599:117;6394:329;;;;:::o;6729:118::-;6816:24;6834:5;6816:24;:::i;:::-;6811:3;6804:37;6729:118;;:::o;6853:222::-;6946:4;6984:2;6973:9;6969:18;6961:26;;6997:71;7065:1;7054:9;7050:17;7041:6;6997:71;:::i;:::-;6853:222;;;;:::o;7081:332::-;7202:4;7240:2;7229:9;7225:18;7217:26;;7253:71;7321:1;7310:9;7306:17;7297:6;7253:71;:::i;:::-;7334:72;7402:2;7391:9;7387:18;7378:6;7334:72;:::i;:::-;7081:332;;;;;:::o;7419:109::-;7469:7;7498:24;7516:5;7498:24;:::i;:::-;7487:35;;7419:109;;;:::o;7534:148::-;7620:37;7651:5;7620:37;:::i;:::-;7613:5;7610:48;7600:76;;7672:1;7669;7662:12;7600:76;7534:148;:::o;7688:165::-;7747:5;7785:6;7772:20;7763:29;;7801:46;7841:5;7801:46;:::i;:::-;7688:165;;;;:::o;7859:355::-;7931:6;7980:2;7968:9;7959:7;7955:23;7951:32;7948:119;;;7986:79;;:::i;:::-;7948:119;8106:1;8131:66;8189:7;8180:6;8169:9;8165:22;8131:66;:::i;:::-;8121:76;;8077:130;7859:355;;;;:::o;8220:210::-;8307:4;8345:2;8334:9;8330:18;8322:26;;8358:65;8420:1;8409:9;8405:17;8396:6;8358:65;:::i;:::-;8220:210;;;;:::o;8436:931::-;8541:6;8549;8557;8565;8573;8622:3;8610:9;8601:7;8597:23;8593:33;8590:120;;;8629:79;;:::i;:::-;8590:120;8749:1;8774:53;8819:7;8810:6;8799:9;8795:22;8774:53;:::i;:::-;8764:63;;8720:117;8876:2;8902:66;8960:7;8951:6;8940:9;8936:22;8902:66;:::i;:::-;8892:76;;8847:131;9017:2;9043:53;9088:7;9079:6;9068:9;9064:22;9043:53;:::i;:::-;9033:63;;8988:118;9145:2;9171:53;9216:7;9207:6;9196:9;9192:22;9171:53;:::i;:::-;9161:63;;9116:118;9273:3;9300:50;9342:7;9333:6;9322:9;9318:22;9300:50;:::i;:::-;9290:60;;9244:116;8436:931;;;;;;;;:::o;9373:169::-;9457:11;9491:6;9486:3;9479:19;9531:4;9526:3;9522:14;9507:29;;9373:169;;;;:::o;9548:182::-;9688:34;9684:1;9676:6;9672:14;9665:58;9548:182;:::o;9736:366::-;9878:3;9899:67;9963:2;9958:3;9899:67;:::i;:::-;9892:74;;9975:93;10064:3;9975:93;:::i;:::-;10093:2;10088:3;10084:12;10077:19;;9736:366;;;:::o;10108:419::-;10274:4;10312:2;10301:9;10297:18;10289:26;;10361:9;10355:4;10351:20;10347:1;10336:9;10332:17;10325:47;10389:131;10515:4;10389:131;:::i;:::-;10381:139;;10108:419;;;:::o;10533:179::-;10673:31;10669:1;10661:6;10657:14;10650:55;10533:179;:::o;10718:366::-;10860:3;10881:67;10945:2;10940:3;10881:67;:::i;:::-;10874:74;;10957:93;11046:3;10957:93;:::i;:::-;11075:2;11070:3;11066:12;11059:19;;10718:366;;;:::o;11090:419::-;11256:4;11294:2;11283:9;11279:18;11271:26;;11343:9;11337:4;11333:20;11329:1;11318:9;11314:17;11307:47;11371:131;11497:4;11371:131;:::i;:::-;11363:139;;11090:419;;;:::o;11515:181::-;11655:33;11651:1;11643:6;11639:14;11632:57;11515:181;:::o;11702:366::-;11844:3;11865:67;11929:2;11924:3;11865:67;:::i;:::-;11858:74;;11941:93;12030:3;11941:93;:::i;:::-;12059:2;12054:3;12050:12;12043:19;;11702:366;;;:::o;12074:419::-;12240:4;12278:2;12267:9;12263:18;12255:26;;12327:9;12321:4;12317:20;12313:1;12302:9;12298:17;12291:47;12355:131;12481:4;12355:131;:::i;:::-;12347:139;;12074:419;;;:::o;12499:161::-;12639:13;12635:1;12627:6;12623:14;12616:37;12499:161;:::o;12666:366::-;12808:3;12829:67;12893:2;12888:3;12829:67;:::i;:::-;12822:74;;12905:93;12994:3;12905:93;:::i;:::-;13023:2;13018:3;13014:12;13007:19;;12666:366;;;:::o;13038:419::-;13204:4;13242:2;13231:9;13227:18;13219:26;;13291:9;13285:4;13281:20;13277:1;13266:9;13262:17;13255:47;13319:131;13445:4;13319:131;:::i;:::-;13311:139;;13038:419;;;:::o;13463:168::-;13603:20;13599:1;13591:6;13587:14;13580:44;13463:168;:::o;13637:366::-;13779:3;13800:67;13864:2;13859:3;13800:67;:::i;:::-;13793:74;;13876:93;13965:3;13876:93;:::i;:::-;13994:2;13989:3;13985:12;13978:19;;13637:366;;;:::o;14009:419::-;14175:4;14213:2;14202:9;14198:18;14190:26;;14262:9;14256:4;14252:20;14248:1;14237:9;14233:17;14226:47;14290:131;14416:4;14290:131;:::i;:::-;14282:139;;14009:419;;;:::o;14434:143::-;14491:5;14522:6;14516:13;14507:22;;14538:33;14565:5;14538:33;:::i;:::-;14434:143;;;;:::o;14583:351::-;14653:6;14702:2;14690:9;14681:7;14677:23;14673:32;14670:119;;;14708:79;;:::i;:::-;14670:119;14828:1;14853:64;14909:7;14900:6;14889:9;14885:22;14853:64;:::i;:::-;14843:74;;14799:128;14583:351;;;;:::o;14940:332::-;15061:4;15099:2;15088:9;15084:18;15076:26;;15112:71;15180:1;15169:9;15165:17;15156:6;15112:71;:::i;:::-;15193:72;15261:2;15250:9;15246:18;15237:6;15193:72;:::i;:::-;14940:332;;;;;:::o;15278:171::-;15418:23;15414:1;15406:6;15402:14;15395:47;15278:171;:::o;15455:366::-;15597:3;15618:67;15682:2;15677:3;15618:67;:::i;:::-;15611:74;;15694:93;15783:3;15694:93;:::i;:::-;15812:2;15807:3;15803:12;15796:19;;15455:366;;;:::o;15827:419::-;15993:4;16031:2;16020:9;16016:18;16008:26;;16080:9;16074:4;16070:20;16066:1;16055:9;16051:17;16044:47;16108:131;16234:4;16108:131;:::i;:::-;16100:139;;15827:419;;;:::o;16252:180::-;16300:77;16297:1;16290:88;16397:4;16394:1;16387:15;16421:4;16418:1;16411:15;16438:225;16578:34;16574:1;16566:6;16562:14;16555:58;16647:8;16642:2;16634:6;16630:15;16623:33;16438:225;:::o;16669:366::-;16811:3;16832:67;16896:2;16891:3;16832:67;:::i;:::-;16825:74;;16908:93;16997:3;16908:93;:::i;:::-;17026:2;17021:3;17017:12;17010:19;;16669:366;;;:::o;17041:419::-;17207:4;17245:2;17234:9;17230:18;17222:26;;17294:9;17288:4;17284:20;17280:1;17269:9;17265:17;17258:47;17322:131;17448:4;17322:131;:::i;:::-;17314:139;;17041:419;;;:::o;17466:166::-;17606:18;17602:1;17594:6;17590:14;17583:42;17466:166;:::o;17638:366::-;17780:3;17801:67;17865:2;17860:3;17801:67;:::i;:::-;17794:74;;17877:93;17966:3;17877:93;:::i;:::-;17995:2;17990:3;17986:12;17979:19;;17638:366;;;:::o;18010:419::-;18176:4;18214:2;18203:9;18199:18;18191:26;;18263:9;18257:4;18253:20;18249:1;18238:9;18234:17;18227:47;18291:131;18417:4;18291:131;:::i;:::-;18283:139;;18010:419;;;:::o;18435:175::-;18575:27;18571:1;18563:6;18559:14;18552:51;18435:175;:::o;18616:366::-;18758:3;18779:67;18843:2;18838:3;18779:67;:::i;:::-;18772:74;;18855:93;18944:3;18855:93;:::i;:::-;18973:2;18968:3;18964:12;18957:19;;18616:366;;;:::o;18988:419::-;19154:4;19192:2;19181:9;19177:18;19169:26;;19241:9;19235:4;19231:20;19227:1;19216:9;19212:17;19205:47;19269:131;19395:4;19269:131;:::i;:::-;19261:139;;18988:419;;;:::o;19413:180::-;19461:77;19458:1;19451:88;19558:4;19555:1;19548:15;19582:4;19579:1;19572:15;19599:233;19638:3;19661:24;19679:5;19661:24;:::i;:::-;19652:33;;19707:66;19700:5;19697:77;19694:103;;19777:18;;:::i;:::-;19694:103;19824:1;19817:5;19813:13;19806:20;;19599:233;;;:::o;19838:410::-;19878:7;19901:20;19919:1;19901:20;:::i;:::-;19896:25;;19935:20;19953:1;19935:20;:::i;:::-;19930:25;;19990:1;19987;19983:9;20012:30;20030:11;20012:30;:::i;:::-;20001:41;;20191:1;20182:7;20178:15;20175:1;20172:22;20152:1;20145:9;20125:83;20102:139;;20221:18;;:::i;:::-;20102:139;19886:362;19838:410;;;;:::o;20254:180::-;20302:77;20299:1;20292:88;20399:4;20396:1;20389:15;20423:4;20420:1;20413:15;20440:185;20480:1;20497:20;20515:1;20497:20;:::i;:::-;20492:25;;20531:20;20549:1;20531:20;:::i;:::-;20526:25;;20570:1;20560:35;;20575:18;;:::i;:::-;20560:35;20617:1;20614;20610:9;20605:14;;20440:185;;;;:::o;20631:220::-;20771:34;20767:1;20759:6;20755:14;20748:58;20840:3;20835:2;20827:6;20823:15;20816:28;20631:220;:::o;20857:366::-;20999:3;21020:67;21084:2;21079:3;21020:67;:::i;:::-;21013:74;;21096:93;21185:3;21096:93;:::i;:::-;21214:2;21209:3;21205:12;21198:19;;20857:366;;;:::o;21229:419::-;21395:4;21433:2;21422:9;21418:18;21410:26;;21482:9;21476:4;21472:20;21468:1;21457:9;21453:17;21446:47;21510:131;21636:4;21510:131;:::i;:::-;21502:139;;21229:419;;;:::o;21654:137::-;21708:5;21739:6;21733:13;21724:22;;21755:30;21779:5;21755:30;:::i;:::-;21654:137;;;;:::o;21797:345::-;21864:6;21913:2;21901:9;21892:7;21888:23;21884:32;21881:119;;;21919:79;;:::i;:::-;21881:119;22039:1;22064:61;22117:7;22108:6;22097:9;22093:22;22064:61;:::i;:::-;22054:71;;22010:125;21797:345;;;;:::o;22148:222::-;22288:34;22284:1;22276:6;22272:14;22265:58;22357:5;22352:2;22344:6;22340:15;22333:30;22148:222;:::o;22376:366::-;22518:3;22539:67;22603:2;22598:3;22539:67;:::i;:::-;22532:74;;22615:93;22704:3;22615:93;:::i;:::-;22733:2;22728:3;22724:12;22717:19;;22376:366;;;:::o;22748:419::-;22914:4;22952:2;22941:9;22937:18;22929:26;;23001:9;22995:4;22991:20;22987:1;22976:9;22972:17;22965:47;23029:131;23155:4;23029:131;:::i;:::-;23021:139;;22748:419;;;:::o;23173:191::-;23213:3;23232:20;23250:1;23232:20;:::i;:::-;23227:25;;23266:20;23284:1;23266:20;:::i;:::-;23261:25;;23309:1;23306;23302:9;23295:16;;23330:3;23327:1;23324:10;23321:36;;;23337:18;;:::i;:::-;23321:36;23173:191;;;;:::o;23370:177::-;23510:29;23506:1;23498:6;23494:14;23487:53;23370:177;:::o;23553:366::-;23695:3;23716:67;23780:2;23775:3;23716:67;:::i;:::-;23709:74;;23792:93;23881:3;23792:93;:::i;:::-;23910:2;23905:3;23901:12;23894:19;;23553:366;;;:::o;23925:419::-;24091:4;24129:2;24118:9;24114:18;24106:26;;24178:9;24172:4;24168:20;24164:1;24153:9;24149:17;24142:47;24206:131;24332:4;24206:131;:::i;:::-;24198:139;;23925:419;;;:::o;24350:442::-;24499:4;24537:2;24526:9;24522:18;24514:26;;24550:71;24618:1;24607:9;24603:17;24594:6;24550:71;:::i;:::-;24631:72;24699:2;24688:9;24684:18;24675:6;24631:72;:::i;:::-;24713;24781:2;24770:9;24766:18;24757:6;24713:72;:::i;:::-;24350:442;;;;;;:::o;24798:99::-;24850:6;24884:5;24878:12;24868:22;;24798:99;;;:::o;24903:139::-;24992:6;24987:3;24982;24976:23;25033:1;25024:6;25019:3;25015:16;25008:27;24903:139;;;:::o;25048:102::-;25089:6;25140:2;25136:7;25131:2;25124:5;25120:14;25116:28;25106:38;;25048:102;;;:::o;25156:377::-;25244:3;25272:39;25305:5;25272:39;:::i;:::-;25327:71;25391:6;25386:3;25327:71;:::i;:::-;25320:78;;25407:65;25465:6;25460:3;25453:4;25446:5;25442:16;25407:65;:::i;:::-;25497:29;25519:6;25497:29;:::i;:::-;25492:3;25488:39;25481:46;;25248:285;25156:377;;;;:::o;25539:313::-;25652:4;25690:2;25679:9;25675:18;25667:26;;25739:9;25733:4;25729:20;25725:1;25714:9;25710:17;25703:47;25767:78;25840:4;25831:6;25767:78;:::i;:::-;25759:86;;25539:313;;;;:::o;25858:194::-;25898:4;25918:20;25936:1;25918:20;:::i;:::-;25913:25;;25952:20;25970:1;25952:20;:::i;:::-;25947:25;;25996:1;25993;25989:9;25981:17;;26020:1;26014:4;26011:11;26008:37;;;26025:18;;:::i;:::-;26008:37;25858:194;;;;:::o;26058:229::-;26198:34;26194:1;26186:6;26182:14;26175:58;26267:12;26262:2;26254:6;26250:15;26243:37;26058:229;:::o;26293:366::-;26435:3;26456:67;26520:2;26515:3;26456:67;:::i;:::-;26449:74;;26532:93;26621:3;26532:93;:::i;:::-;26650:2;26645:3;26641:12;26634:19;;26293:366;;;:::o;26665:419::-;26831:4;26869:2;26858:9;26854:18;26846:26;;26918:9;26912:4;26908:20;26904:1;26893:9;26889:17;26882:47;26946:131;27072:4;26946:131;:::i;:::-;26938:139;;26665:419;;;:::o;27090:179::-;27230:31;27226:1;27218:6;27214:14;27207:55;27090:179;:::o;27275:366::-;27417:3;27438:67;27502:2;27497:3;27438:67;:::i;:::-;27431:74;;27514:93;27603:3;27514:93;:::i;:::-;27632:2;27627:3;27623:12;27616:19;;27275:366;;;:::o;27647:419::-;27813:4;27851:2;27840:9;27836:18;27828:26;;27900:9;27894:4;27890:20;27886:1;27875:9;27871:17;27864:47;27928:131;28054:4;27928:131;:::i;:::-;27920:139;;27647:419;;;:::o;28072:98::-;28123:6;28157:5;28151:12;28141:22;;28072:98;;;:::o;28176:147::-;28277:11;28314:3;28299:18;;28176:147;;;;:::o;28329:386::-;28433:3;28461:38;28493:5;28461:38;:::i;:::-;28515:88;28596:6;28591:3;28515:88;:::i;:::-;28508:95;;28612:65;28670:6;28665:3;28658:4;28651:5;28647:16;28612:65;:::i;:::-;28702:6;28697:3;28693:16;28686:23;;28437:278;28329:386;;;;:::o;28721:271::-;28851:3;28873:93;28962:3;28953:6;28873:93;:::i;:::-;28866:100;;28983:3;28976:10;;28721:271;;;;:::o
Swarm Source
ipfs://97d8004babd3b65e857a8ab50e7371171486c3c2aacbe871aa37a17b6a96c311
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.