More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 11,732 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exit | 51564098 | 195 days ago | IN | 0 AVAX | 0.00457944 | ||||
Exit | 51238772 | 203 days ago | IN | 0 AVAX | 0.00504999 | ||||
Exit | 44703583 | 361 days ago | IN | 0 AVAX | 0.00495288 | ||||
Get Reward | 44703415 | 361 days ago | IN | 0 AVAX | 0.00421171 | ||||
Exit | 44039741 | 377 days ago | IN | 0 AVAX | 0.00330192 | ||||
Exit | 42819730 | 406 days ago | IN | 0 AVAX | 0.00291669 | ||||
Get Reward | 42819714 | 406 days ago | IN | 0 AVAX | 0.003023 | ||||
Exit | 42503578 | 414 days ago | IN | 0 AVAX | 0.00409971 | ||||
Exit | 41937087 | 427 days ago | IN | 0 AVAX | 0.00291669 | ||||
Exit | 41838875 | 430 days ago | IN | 0 AVAX | 0.00440983 | ||||
Exit | 41752545 | 432 days ago | IN | 0 AVAX | 0.00291669 | ||||
Get Reward | 41752535 | 432 days ago | IN | 0 AVAX | 0.00256334 | ||||
Transfer | 41752184 | 432 days ago | IN | 0 AVAX | 0.00052675 | ||||
Get Reward | 40929220 | 451 days ago | IN | 0 AVAX | 0.00143675 | ||||
Exit | 40929186 | 451 days ago | IN | 0 AVAX | 0.00404148 | ||||
Get Reward | 40854652 | 453 days ago | IN | 0 AVAX | 0.00143675 | ||||
Exit | 40854624 | 453 days ago | IN | 0 AVAX | 0.00449463 | ||||
Exit | 40688869 | 457 days ago | IN | 0 AVAX | 0.00402776 | ||||
Exit | 40664380 | 457 days ago | IN | 0 AVAX | 0.00291779 | ||||
Get Reward | 40664271 | 457 days ago | IN | 0 AVAX | 0.00301763 | ||||
Get Reward | 39838480 | 477 days ago | IN | 0 AVAX | 0.00135596 | ||||
Exit | 39838474 | 477 days ago | IN | 0 AVAX | 0.00381425 | ||||
Exit | 39724680 | 479 days ago | IN | 0 AVAX | 0.00338657 | ||||
Exit | 38841175 | 500 days ago | IN | 0 AVAX | 0.00864527 | ||||
Get Reward | 38841158 | 500 days ago | IN | 0 AVAX | 0.00917703 |
Loading...
Loading
Contract Name:
MultiRewards
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at snowscan.xyz on 2021-12-10 */ // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @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, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @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) { 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, reverting 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) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * 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); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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 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 payable) { 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; } } pragma experimental ABIEncoderV2; /** * @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 () internal { _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; } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { 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; } } /** * @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 Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // 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"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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"); } } } contract MultiRewards is ReentrancyGuard, Pausable, Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; /* ========== STATE VARIABLES ========== */ struct Reward { address rewardsDistributor; uint256 rewardsDuration; uint256 periodFinish; uint256 rewardRate; uint256 lastUpdateTime; uint256 rewardPerTokenStored; } IERC20 public stakingToken; mapping(address => Reward) public rewardData; address[] public rewardTokens; // user -> reward token -> amount mapping(address => mapping(address => uint256)) public userRewardPerTokenPaid; mapping(address => mapping(address => uint256)) public rewards; uint256 private _totalSupply; mapping(address => uint256) private _balances; /* ========== CONSTRUCTOR ========== */ constructor( address _stakingToken ) public { stakingToken = IERC20(_stakingToken); } function addReward( address _rewardsToken, address _rewardsDistributor, uint256 _rewardsDuration ) public onlyOwner { require(rewardData[_rewardsToken].rewardsDuration == 0); rewardTokens.push(_rewardsToken); rewardData[_rewardsToken].rewardsDistributor = _rewardsDistributor; rewardData[_rewardsToken].rewardsDuration = _rewardsDuration; } /* ========== VIEWS ========== */ function totalSupply() external view returns (uint256) { return _totalSupply; } function balanceOf(address account) external view returns (uint256) { return _balances[account]; } function lastTimeRewardApplicable(address _rewardsToken) public view returns (uint256) { return Math.min(block.timestamp, rewardData[_rewardsToken].periodFinish); } function rewardPerToken(address _rewardsToken) public view returns (uint256) { if (_totalSupply == 0) { return rewardData[_rewardsToken].rewardPerTokenStored; } return rewardData[_rewardsToken].rewardPerTokenStored.add( lastTimeRewardApplicable(_rewardsToken).sub(rewardData[_rewardsToken].lastUpdateTime).mul(rewardData[_rewardsToken].rewardRate).mul(1e18).div(_totalSupply) ); } function earned(address account, address _rewardsToken) public view returns (uint256) { return _balances[account].mul(rewardPerToken(_rewardsToken).sub(userRewardPerTokenPaid[account][_rewardsToken])).div(1e18).add(rewards[account][_rewardsToken]); } function getRewardForDuration(address _rewardsToken) external view returns (uint256) { return rewardData[_rewardsToken].rewardRate.mul(rewardData[_rewardsToken].rewardsDuration); } /* ========== MUTATIVE FUNCTIONS ========== */ function setRewardsDistributor(address _rewardsToken, address _rewardsDistributor) external onlyOwner { rewardData[_rewardsToken].rewardsDistributor = _rewardsDistributor; } function stake(uint256 amount) external nonReentrant whenNotPaused updateReward(msg.sender) { require(amount > 0, "Cannot stake 0"); _totalSupply = _totalSupply.add(amount); _balances[msg.sender] = _balances[msg.sender].add(amount); stakingToken.safeTransferFrom(msg.sender, address(this), amount); emit Staked(msg.sender, amount); } function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) { require(amount > 0, "Cannot withdraw 0"); _totalSupply = _totalSupply.sub(amount); _balances[msg.sender] = _balances[msg.sender].sub(amount); stakingToken.safeTransfer(msg.sender, amount); emit Withdrawn(msg.sender, amount); } function getReward() public nonReentrant updateReward(msg.sender) { for (uint i; i < rewardTokens.length; i++) { address _rewardsToken = rewardTokens[i]; uint256 reward = rewards[msg.sender][_rewardsToken]; if (reward > 0) { rewards[msg.sender][_rewardsToken] = 0; IERC20(_rewardsToken).safeTransfer(msg.sender, reward); emit RewardPaid(msg.sender, _rewardsToken, reward); } } } function exit() external { withdraw(_balances[msg.sender]); getReward(); } /* ========== RESTRICTED FUNCTIONS ========== */ function notifyRewardAmount(address _rewardsToken, uint256 reward) external updateReward(address(0)) { require(rewardData[_rewardsToken].rewardsDistributor == msg.sender); // handle the transfer of reward tokens via `transferFrom` to reduce the number // of transactions required and ensure correctness of the reward amount IERC20(_rewardsToken).safeTransferFrom(msg.sender, address(this), reward); if (block.timestamp >= rewardData[_rewardsToken].periodFinish) { rewardData[_rewardsToken].rewardRate = reward.div(rewardData[_rewardsToken].rewardsDuration); } else { uint256 remaining = rewardData[_rewardsToken].periodFinish.sub(block.timestamp); uint256 leftover = remaining.mul(rewardData[_rewardsToken].rewardRate); rewardData[_rewardsToken].rewardRate = reward.add(leftover).div(rewardData[_rewardsToken].rewardsDuration); } rewardData[_rewardsToken].lastUpdateTime = block.timestamp; rewardData[_rewardsToken].periodFinish = block.timestamp.add(rewardData[_rewardsToken].rewardsDuration); emit RewardAdded(reward); } // Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner { require(tokenAddress != address(stakingToken), "Cannot withdraw staking token"); require(rewardData[tokenAddress].lastUpdateTime == 0, "Cannot withdraw reward token"); IERC20(tokenAddress).safeTransfer(owner(), tokenAmount); emit Recovered(tokenAddress, tokenAmount); } function setRewardsDuration(address _rewardsToken, uint256 _rewardsDuration) external { require( block.timestamp > rewardData[_rewardsToken].periodFinish, "Reward period still active" ); require(rewardData[_rewardsToken].rewardsDistributor == msg.sender); require(_rewardsDuration > 0, "Reward duration must be non-zero"); rewardData[_rewardsToken].rewardsDuration = _rewardsDuration; emit RewardsDurationUpdated(_rewardsToken, rewardData[_rewardsToken].rewardsDuration); } /* ========== MODIFIERS ========== */ modifier updateReward(address account) { for (uint i; i < rewardTokens.length; i++) { address token = rewardTokens[i]; rewardData[token].rewardPerTokenStored = rewardPerToken(token); rewardData[token].lastUpdateTime = lastTimeRewardApplicable(token); if (account != address(0)) { rewards[account][token] = earned(account, token); userRewardPerTokenPaid[account][token] = rewardData[token].rewardPerTokenStored; } } _; } /* ========== EVENTS ========== */ event RewardAdded(uint256 reward); event Staked(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event RewardPaid(address indexed user, address indexed rewardsToken, uint256 reward); event RewardsDurationUpdated(address token, uint256 newDuration); event Recovered(address token, uint256 amount); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_stakingToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"rewardsToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsDistributor","type":"address"},{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardData","outputs":[{"internalType":"address","name":"rewardsDistributor","type":"address"},{"internalType":"uint256","name":"rewardsDuration","type":"uint256"},{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsDistributor","type":"address"}],"name":"setRewardsDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","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":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003c0d38038062003c0d833981810160405281019062000037919062000171565b60016000819055506000600160006101000a81548160ff02191690831515021790555060006200006c6200015260201b60201c565b9050806001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001eb565b600033905090565b6000815190506200016b81620001d1565b92915050565b6000602082840312156200018457600080fd5b600062000194848285016200015a565b91505092915050565b6000620001aa82620001b1565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620001dc816200019d565b8114620001e857600080fd5b50565b613a1280620001fb6000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806372f702f3116100c3578063bcd110141161007c578063bcd11014146103b6578063d0ed26ae146103e6578063e70b9e2714610402578063e9fad8ee14610432578063f12297771461043c578063f2fde38b1461046c57610158565b806372f702f3146102f65780637bb7bed1146103145780638980f11f146103445780638da5cb5b14610360578063a694fc3a1461037e578063b66503cf1461039a57610158565b806348e5d9f81161011557806348e5d9f8146102095780635c975abb1461023e578063638634ee1461025c5780637035ab981461028c57806370a08231146102bc578063715018a6146102ec57610158565b806318160ddd1461015d578063211dc32d1461017b5780632378bea6146101ab5780632e1a7d4d146101c75780633d18b912146101e35780633f695b45146101ed575b600080fd5b610165610488565b604051610172919061389a565b60405180910390f35b61019560048036038101906101909190612e98565b610492565b6040516101a2919061389a565b60405180910390f35b6101c560048036038101906101c09190612f23565b61062c565b005b6101e160048036038101906101dc9190612f88565b610853565b005b6101eb610cb7565b005b61020760048036038101906102029190612e98565b611185565b005b610223600480360381019061021e9190612e6f565b611286565b604051610235969594939291906135c1565b60405180910390f35b6102466112e2565b6040516102539190613622565b60405180910390f35b61027660048036038101906102719190612e6f565b6112f9565b604051610283919061389a565b60405180910390f35b6102a660048036038101906102a19190612e98565b61134e565b6040516102b3919061389a565b60405180910390f35b6102d660048036038101906102d19190612e6f565b611373565b6040516102e3919061389a565b60405180910390f35b6102f46113bc565b005b6102fe6114f6565b60405161030b919061363d565b60405180910390f35b61032e60048036038101906103299190612f88565b61151c565b60405161033b9190613546565b60405180910390f35b61035e60048036038101906103599190612f23565b611558565b005b610368611759565b6040516103759190613546565b60405180910390f35b61039860048036038101906103939190612f88565b611781565b005b6103b460048036038101906103af9190612f23565b611c2f565b005b6103d060048036038101906103cb9190612e6f565b6122db565b6040516103dd919061389a565b60405180910390f35b61040060048036038101906103fb9190612ed4565b61237b565b005b61041c60048036038101906104179190612e98565b612576565b604051610429919061389a565b60405180910390f35b61043a61259b565b005b61045660048036038101906104519190612e6f565b6125ed565b604051610463919061389a565b60405180910390f35b61048660048036038101906104819190612e6f565b61277e565b005b6000600754905090565b6000610624600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610616670de0b6b3a76400006106086105ba600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546105ac896125ed565b61292790919063ffffffff16565b600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461297790919063ffffffff16565b6129e790919063ffffffff16565b612a3d90919063ffffffff16565b905092915050565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015442116106b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a79061381a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461074a57600080fd5b6000811161078d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107849061367a565b60405180910390fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055507fad2f86b01ed93b4b3a150d448c61a4f5d8d38075d3c0c64cc0a26fd6e1f4954582600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154604051610847929190613598565b60405180910390a15050565b60026000541415610899576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108909061387a565b60405180910390fd5b60026000819055503360005b600480549050811015610b1c576000600482815481106108c157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108f7816125ed565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050181905550610946816112f9565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610b0e576109ca8382610492565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050154600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5080806001019150506108a5565b5060008211610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b579061377a565b60405180910390fd5b610b758260075461292790919063ffffffff16565b600781905550610bcd82600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461292790919063ffffffff16565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610c5d3383600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612a929092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d583604051610ca3919061389a565b60405180910390a250600160008190555050565b60026000541415610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf49061387a565b60405180910390fd5b60026000819055503360005b600480549050811015610f8057600060048281548110610d2557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610d5b816125ed565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050181905550610daa816112f9565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610f7257610e2e8382610492565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050154600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b508080600101915050610d09565b5060005b60048054905081101561117957600060048281548110610fa057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561116a576000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061110433828473ffffffffffffffffffffffffffffffffffffffff16612a929092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051611161919061389a565b60405180910390a35b50508080600101915050610f84565b50506001600081905550565b61118d612b18565b73ffffffffffffffffffffffffffffffffffffffff166111ab611759565b73ffffffffffffffffffffffffffffffffffffffff1614611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f8906137ba565b60405180910390fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60036020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154905086565b6000600160009054906101000a900460ff16905090565b600061134742600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154612b20565b9050919050565b6005602052816000526040600020602052806000526040600020600091509150505481565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113c4612b18565b73ffffffffffffffffffffffffffffffffffffffff166113e2611759565b73ffffffffffffffffffffffffffffffffffffffff1614611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f906137ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360006001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6004818154811061152957fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611560612b18565b73ffffffffffffffffffffffffffffffffffffffff1661157e611759565b73ffffffffffffffffffffffffffffffffffffffff16146115d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cb906137ba565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c906137da565b60405180910390fd5b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040154146116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e19061385a565b60405180910390fd5b61171c6116f5611759565b828473ffffffffffffffffffffffffffffffffffffffff16612a929092919063ffffffff16565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28828260405161174d929190613598565b60405180910390a15050565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260005414156117c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117be9061387a565b60405180910390fd5b60026000819055506117d76112e2565b15611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180e9061375a565b60405180910390fd5b3360005b600480549050811015611a925760006004828154811061183757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061186d816125ed565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501819055506118bc816112f9565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611a84576119408382610492565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050154600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b50808060010191505061181b565b5060008211611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd906136ba565b60405180910390fd5b611aeb82600754612a3d90919063ffffffff16565b600781905550611b4382600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a3d90919063ffffffff16565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611bd5333084600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b39909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d83604051611c1b919061389a565b60405180910390a250600160008190555050565b6000805b600480549050811015611eaa57600060048281548110611c4f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611c85816125ed565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050181905550611cd4816112f9565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e9c57611d588382610492565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050154600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b508080600101915050611c33565b503373ffffffffffffffffffffffffffffffffffffffff16600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f4557600080fd5b611f723330848673ffffffffffffffffffffffffffffffffffffffff16612b39909392919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154421061205b57612010600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154836129e790919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055506121bd565b60006120b242600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461292790919063ffffffff16565b9050600061210b600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301548361297790919063ffffffff16565b9050612174600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546121668387612a3d90919063ffffffff16565b6129e790919063ffffffff16565b600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003018190555050505b42600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550612259600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015442612a3d90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055507fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d826040516122ce919061389a565b60405180910390a1505050565b6000612374600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015461297790919063ffffffff16565b9050919050565b612383612b18565b73ffffffffffffffffffffffffffffffffffffffff166123a1611759565b73ffffffffffffffffffffffffffffffffffffffff16146123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ee906137ba565b60405180910390fd5b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541461244657600080fd5b6004839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505050565b6006602052816000526040600020602052806000526040600020600091509150505481565b6125e3600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610853565b6125eb610cb7565b565b600080600754141561264357600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501549050612779565b612776612725600754612717670de0b6b3a7640000612709600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301546126fb600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401546126ed8b6112f9565b61292790919063ffffffff16565b61297790919063ffffffff16565b61297790919063ffffffff16565b6129e790919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050154612a3d90919063ffffffff16565b90505b919050565b612786612b18565b73ffffffffffffffffffffffffffffffffffffffff166127a4611759565b73ffffffffffffffffffffffffffffffffffffffff16146127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f1906137ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561286a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128619061369a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008282111561296c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612963906136fa565b60405180910390fd5b818303905092915050565b60008083141561298a57600090506129e1565b600082840290508284828161299b57fe5b04146129dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d39061379a565b60405180910390fd5b809150505b92915050565b6000808211612a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a229061373a565b60405180910390fd5b818381612a3457fe5b04905092915050565b600080828401905083811015612a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7f906136da565b60405180910390fd5b8091505092915050565b612b138363a9059cbb60e01b8484604051602401612ab1929190613598565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612bc2565b505050565b600033905090565b6000818310612b2f5781612b31565b825b905092915050565b612bbc846323b872dd60e01b858585604051602401612b5a93929190613561565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612bc2565b50505050565b6060612c24826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c899092919063ffffffff16565b9050600081511115612c845780806020019051810190612c449190612f5f565b612c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7a9061383a565b60405180910390fd5b5b505050565b6060612c988484600085612ca1565b90509392505050565b606082471015612ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdd9061371a565b60405180910390fd5b612cef85612db6565b612d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d25906137fa565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff168587604051612d58919061352f565b60006040518083038185875af1925050503d8060008114612d95576040519150601f19603f3d011682016040523d82523d6000602084013e612d9a565b606091505b5091509150612daa828286612dc9565b92505050949350505050565b600080823b905060008111915050919050565b60608315612dd957829050612e29565b600083511115612dec5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e209190613658565b60405180910390fd5b9392505050565b600081359050612e3f81613997565b92915050565b600081519050612e54816139ae565b92915050565b600081359050612e69816139c5565b92915050565b600060208284031215612e8157600080fd5b6000612e8f84828501612e30565b91505092915050565b60008060408385031215612eab57600080fd5b6000612eb985828601612e30565b9250506020612eca85828601612e30565b9150509250929050565b600080600060608486031215612ee957600080fd5b6000612ef786828701612e30565b9350506020612f0886828701612e30565b9250506040612f1986828701612e5a565b9150509250925092565b60008060408385031215612f3657600080fd5b6000612f4485828601612e30565b9250506020612f5585828601612e5a565b9150509250929050565b600060208284031215612f7157600080fd5b6000612f7f84828501612e45565b91505092915050565b600060208284031215612f9a57600080fd5b6000612fa884828501612e5a565b91505092915050565b612fba816138e7565b82525050565b612fc9816138f9565b82525050565b6000612fda826138b5565b612fe481856138cb565b9350612ff4818560208601613953565b80840191505092915050565b6130098161392f565b82525050565b600061301a826138c0565b61302481856138d6565b9350613034818560208601613953565b61303d81613986565b840191505092915050565b60006130556020836138d6565b91507f526577617264206475726174696f6e206d757374206265206e6f6e2d7a65726f6000830152602082019050919050565b60006130956026836138d6565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130fb600e836138d6565b91507f43616e6e6f74207374616b6520300000000000000000000000000000000000006000830152602082019050919050565b600061313b601b836138d6565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061317b601e836138d6565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b60006131bb6026836138d6565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613221601a836138d6565b91507f536166654d6174683a206469766973696f6e206279207a65726f0000000000006000830152602082019050919050565b60006132616010836138d6565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b60006132a16011836138d6565b91507f43616e6e6f7420776974686472617720300000000000000000000000000000006000830152602082019050919050565b60006132e16021836138d6565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133476020836138d6565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613387601d836138d6565b91507f43616e6e6f74207769746864726177207374616b696e6720746f6b656e0000006000830152602082019050919050565b60006133c7601d836138d6565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000613407601a836138d6565b91507f52657761726420706572696f64207374696c6c206163746976650000000000006000830152602082019050919050565b6000613447602a836138d6565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b60006134ad601c836138d6565b91507f43616e6e6f742077697468647261772072657761726420746f6b656e000000006000830152602082019050919050565b60006134ed601f836138d6565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b61352981613925565b82525050565b600061353b8284612fcf565b915081905092915050565b600060208201905061355b6000830184612fb1565b92915050565b60006060820190506135766000830186612fb1565b6135836020830185612fb1565b6135906040830184613520565b949350505050565b60006040820190506135ad6000830185612fb1565b6135ba6020830184613520565b9392505050565b600060c0820190506135d66000830189612fb1565b6135e36020830188613520565b6135f06040830187613520565b6135fd6060830186613520565b61360a6080830185613520565b61361760a0830184613520565b979650505050505050565b60006020820190506136376000830184612fc0565b92915050565b60006020820190506136526000830184613000565b92915050565b60006020820190508181036000830152613672818461300f565b905092915050565b6000602082019050818103600083015261369381613048565b9050919050565b600060208201905081810360008301526136b381613088565b9050919050565b600060208201905081810360008301526136d3816130ee565b9050919050565b600060208201905081810360008301526136f38161312e565b9050919050565b600060208201905081810360008301526137138161316e565b9050919050565b60006020820190508181036000830152613733816131ae565b9050919050565b6000602082019050818103600083015261375381613214565b9050919050565b6000602082019050818103600083015261377381613254565b9050919050565b6000602082019050818103600083015261379381613294565b9050919050565b600060208201905081810360008301526137b3816132d4565b9050919050565b600060208201905081810360008301526137d38161333a565b9050919050565b600060208201905081810360008301526137f38161337a565b9050919050565b60006020820190508181036000830152613813816133ba565b9050919050565b60006020820190508181036000830152613833816133fa565b9050919050565b600060208201905081810360008301526138538161343a565b9050919050565b60006020820190508181036000830152613873816134a0565b9050919050565b60006020820190508181036000830152613893816134e0565b9050919050565b60006020820190506138af6000830184613520565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60006138f282613905565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061393a82613941565b9050919050565b600061394c82613905565b9050919050565b60005b83811015613971578082015181840152602081019050613956565b83811115613980576000848401525b50505050565b6000601f19601f8301169050919050565b6139a0816138e7565b81146139ab57600080fd5b50565b6139b7816138f9565b81146139c257600080fd5b50565b6139ce81613925565b81146139d957600080fd5b5056fea264697066735822122073e280fc84692bb775751c46b94d919b0fe26719c2ecf184b11bd9bd9a898dcb64736f6c634300060c00330000000000000000000000000665ef3556520b21368754fb644ed3ebf1993ad4
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c806372f702f3116100c3578063bcd110141161007c578063bcd11014146103b6578063d0ed26ae146103e6578063e70b9e2714610402578063e9fad8ee14610432578063f12297771461043c578063f2fde38b1461046c57610158565b806372f702f3146102f65780637bb7bed1146103145780638980f11f146103445780638da5cb5b14610360578063a694fc3a1461037e578063b66503cf1461039a57610158565b806348e5d9f81161011557806348e5d9f8146102095780635c975abb1461023e578063638634ee1461025c5780637035ab981461028c57806370a08231146102bc578063715018a6146102ec57610158565b806318160ddd1461015d578063211dc32d1461017b5780632378bea6146101ab5780632e1a7d4d146101c75780633d18b912146101e35780633f695b45146101ed575b600080fd5b610165610488565b604051610172919061389a565b60405180910390f35b61019560048036038101906101909190612e98565b610492565b6040516101a2919061389a565b60405180910390f35b6101c560048036038101906101c09190612f23565b61062c565b005b6101e160048036038101906101dc9190612f88565b610853565b005b6101eb610cb7565b005b61020760048036038101906102029190612e98565b611185565b005b610223600480360381019061021e9190612e6f565b611286565b604051610235969594939291906135c1565b60405180910390f35b6102466112e2565b6040516102539190613622565b60405180910390f35b61027660048036038101906102719190612e6f565b6112f9565b604051610283919061389a565b60405180910390f35b6102a660048036038101906102a19190612e98565b61134e565b6040516102b3919061389a565b60405180910390f35b6102d660048036038101906102d19190612e6f565b611373565b6040516102e3919061389a565b60405180910390f35b6102f46113bc565b005b6102fe6114f6565b60405161030b919061363d565b60405180910390f35b61032e60048036038101906103299190612f88565b61151c565b60405161033b9190613546565b60405180910390f35b61035e60048036038101906103599190612f23565b611558565b005b610368611759565b6040516103759190613546565b60405180910390f35b61039860048036038101906103939190612f88565b611781565b005b6103b460048036038101906103af9190612f23565b611c2f565b005b6103d060048036038101906103cb9190612e6f565b6122db565b6040516103dd919061389a565b60405180910390f35b61040060048036038101906103fb9190612ed4565b61237b565b005b61041c60048036038101906104179190612e98565b612576565b604051610429919061389a565b60405180910390f35b61043a61259b565b005b61045660048036038101906104519190612e6f565b6125ed565b604051610463919061389a565b60405180910390f35b61048660048036038101906104819190612e6f565b61277e565b005b6000600754905090565b6000610624600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610616670de0b6b3a76400006106086105ba600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546105ac896125ed565b61292790919063ffffffff16565b600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461297790919063ffffffff16565b6129e790919063ffffffff16565b612a3d90919063ffffffff16565b905092915050565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015442116106b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a79061381a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461074a57600080fd5b6000811161078d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107849061367a565b60405180910390fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055507fad2f86b01ed93b4b3a150d448c61a4f5d8d38075d3c0c64cc0a26fd6e1f4954582600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154604051610847929190613598565b60405180910390a15050565b60026000541415610899576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108909061387a565b60405180910390fd5b60026000819055503360005b600480549050811015610b1c576000600482815481106108c157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108f7816125ed565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050181905550610946816112f9565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610b0e576109ca8382610492565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050154600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5080806001019150506108a5565b5060008211610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b579061377a565b60405180910390fd5b610b758260075461292790919063ffffffff16565b600781905550610bcd82600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461292790919063ffffffff16565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610c5d3383600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612a929092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d583604051610ca3919061389a565b60405180910390a250600160008190555050565b60026000541415610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf49061387a565b60405180910390fd5b60026000819055503360005b600480549050811015610f8057600060048281548110610d2557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610d5b816125ed565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050181905550610daa816112f9565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610f7257610e2e8382610492565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050154600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b508080600101915050610d09565b5060005b60048054905081101561117957600060048281548110610fa057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561116a576000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061110433828473ffffffffffffffffffffffffffffffffffffffff16612a929092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051611161919061389a565b60405180910390a35b50508080600101915050610f84565b50506001600081905550565b61118d612b18565b73ffffffffffffffffffffffffffffffffffffffff166111ab611759565b73ffffffffffffffffffffffffffffffffffffffff1614611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f8906137ba565b60405180910390fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60036020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154905086565b6000600160009054906101000a900460ff16905090565b600061134742600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154612b20565b9050919050565b6005602052816000526040600020602052806000526040600020600091509150505481565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113c4612b18565b73ffffffffffffffffffffffffffffffffffffffff166113e2611759565b73ffffffffffffffffffffffffffffffffffffffff1614611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f906137ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360006001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6004818154811061152957fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611560612b18565b73ffffffffffffffffffffffffffffffffffffffff1661157e611759565b73ffffffffffffffffffffffffffffffffffffffff16146115d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cb906137ba565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c906137da565b60405180910390fd5b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040154146116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e19061385a565b60405180910390fd5b61171c6116f5611759565b828473ffffffffffffffffffffffffffffffffffffffff16612a929092919063ffffffff16565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28828260405161174d929190613598565b60405180910390a15050565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260005414156117c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117be9061387a565b60405180910390fd5b60026000819055506117d76112e2565b15611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180e9061375a565b60405180910390fd5b3360005b600480549050811015611a925760006004828154811061183757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061186d816125ed565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501819055506118bc816112f9565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611a84576119408382610492565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050154600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b50808060010191505061181b565b5060008211611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd906136ba565b60405180910390fd5b611aeb82600754612a3d90919063ffffffff16565b600781905550611b4382600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a3d90919063ffffffff16565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611bd5333084600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b39909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d83604051611c1b919061389a565b60405180910390a250600160008190555050565b6000805b600480549050811015611eaa57600060048281548110611c4f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611c85816125ed565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050181905550611cd4816112f9565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e9c57611d588382610492565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050154600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b508080600101915050611c33565b503373ffffffffffffffffffffffffffffffffffffffff16600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f4557600080fd5b611f723330848673ffffffffffffffffffffffffffffffffffffffff16612b39909392919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154421061205b57612010600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154836129e790919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055506121bd565b60006120b242600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461292790919063ffffffff16565b9050600061210b600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301548361297790919063ffffffff16565b9050612174600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546121668387612a3d90919063ffffffff16565b6129e790919063ffffffff16565b600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003018190555050505b42600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550612259600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015442612a3d90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055507fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d826040516122ce919061389a565b60405180910390a1505050565b6000612374600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015461297790919063ffffffff16565b9050919050565b612383612b18565b73ffffffffffffffffffffffffffffffffffffffff166123a1611759565b73ffffffffffffffffffffffffffffffffffffffff16146123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ee906137ba565b60405180910390fd5b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541461244657600080fd5b6004839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505050565b6006602052816000526040600020602052806000526040600020600091509150505481565b6125e3600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610853565b6125eb610cb7565b565b600080600754141561264357600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501549050612779565b612776612725600754612717670de0b6b3a7640000612709600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301546126fb600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401546126ed8b6112f9565b61292790919063ffffffff16565b61297790919063ffffffff16565b61297790919063ffffffff16565b6129e790919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050154612a3d90919063ffffffff16565b90505b919050565b612786612b18565b73ffffffffffffffffffffffffffffffffffffffff166127a4611759565b73ffffffffffffffffffffffffffffffffffffffff16146127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f1906137ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561286a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128619061369a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008282111561296c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612963906136fa565b60405180910390fd5b818303905092915050565b60008083141561298a57600090506129e1565b600082840290508284828161299b57fe5b04146129dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d39061379a565b60405180910390fd5b809150505b92915050565b6000808211612a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a229061373a565b60405180910390fd5b818381612a3457fe5b04905092915050565b600080828401905083811015612a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7f906136da565b60405180910390fd5b8091505092915050565b612b138363a9059cbb60e01b8484604051602401612ab1929190613598565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612bc2565b505050565b600033905090565b6000818310612b2f5781612b31565b825b905092915050565b612bbc846323b872dd60e01b858585604051602401612b5a93929190613561565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612bc2565b50505050565b6060612c24826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c899092919063ffffffff16565b9050600081511115612c845780806020019051810190612c449190612f5f565b612c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7a9061383a565b60405180910390fd5b5b505050565b6060612c988484600085612ca1565b90509392505050565b606082471015612ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdd9061371a565b60405180910390fd5b612cef85612db6565b612d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d25906137fa565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff168587604051612d58919061352f565b60006040518083038185875af1925050503d8060008114612d95576040519150601f19603f3d011682016040523d82523d6000602084013e612d9a565b606091505b5091509150612daa828286612dc9565b92505050949350505050565b600080823b905060008111915050919050565b60608315612dd957829050612e29565b600083511115612dec5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e209190613658565b60405180910390fd5b9392505050565b600081359050612e3f81613997565b92915050565b600081519050612e54816139ae565b92915050565b600081359050612e69816139c5565b92915050565b600060208284031215612e8157600080fd5b6000612e8f84828501612e30565b91505092915050565b60008060408385031215612eab57600080fd5b6000612eb985828601612e30565b9250506020612eca85828601612e30565b9150509250929050565b600080600060608486031215612ee957600080fd5b6000612ef786828701612e30565b9350506020612f0886828701612e30565b9250506040612f1986828701612e5a565b9150509250925092565b60008060408385031215612f3657600080fd5b6000612f4485828601612e30565b9250506020612f5585828601612e5a565b9150509250929050565b600060208284031215612f7157600080fd5b6000612f7f84828501612e45565b91505092915050565b600060208284031215612f9a57600080fd5b6000612fa884828501612e5a565b91505092915050565b612fba816138e7565b82525050565b612fc9816138f9565b82525050565b6000612fda826138b5565b612fe481856138cb565b9350612ff4818560208601613953565b80840191505092915050565b6130098161392f565b82525050565b600061301a826138c0565b61302481856138d6565b9350613034818560208601613953565b61303d81613986565b840191505092915050565b60006130556020836138d6565b91507f526577617264206475726174696f6e206d757374206265206e6f6e2d7a65726f6000830152602082019050919050565b60006130956026836138d6565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130fb600e836138d6565b91507f43616e6e6f74207374616b6520300000000000000000000000000000000000006000830152602082019050919050565b600061313b601b836138d6565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061317b601e836138d6565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b60006131bb6026836138d6565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613221601a836138d6565b91507f536166654d6174683a206469766973696f6e206279207a65726f0000000000006000830152602082019050919050565b60006132616010836138d6565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b60006132a16011836138d6565b91507f43616e6e6f7420776974686472617720300000000000000000000000000000006000830152602082019050919050565b60006132e16021836138d6565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133476020836138d6565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613387601d836138d6565b91507f43616e6e6f74207769746864726177207374616b696e6720746f6b656e0000006000830152602082019050919050565b60006133c7601d836138d6565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000613407601a836138d6565b91507f52657761726420706572696f64207374696c6c206163746976650000000000006000830152602082019050919050565b6000613447602a836138d6565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b60006134ad601c836138d6565b91507f43616e6e6f742077697468647261772072657761726420746f6b656e000000006000830152602082019050919050565b60006134ed601f836138d6565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b61352981613925565b82525050565b600061353b8284612fcf565b915081905092915050565b600060208201905061355b6000830184612fb1565b92915050565b60006060820190506135766000830186612fb1565b6135836020830185612fb1565b6135906040830184613520565b949350505050565b60006040820190506135ad6000830185612fb1565b6135ba6020830184613520565b9392505050565b600060c0820190506135d66000830189612fb1565b6135e36020830188613520565b6135f06040830187613520565b6135fd6060830186613520565b61360a6080830185613520565b61361760a0830184613520565b979650505050505050565b60006020820190506136376000830184612fc0565b92915050565b60006020820190506136526000830184613000565b92915050565b60006020820190508181036000830152613672818461300f565b905092915050565b6000602082019050818103600083015261369381613048565b9050919050565b600060208201905081810360008301526136b381613088565b9050919050565b600060208201905081810360008301526136d3816130ee565b9050919050565b600060208201905081810360008301526136f38161312e565b9050919050565b600060208201905081810360008301526137138161316e565b9050919050565b60006020820190508181036000830152613733816131ae565b9050919050565b6000602082019050818103600083015261375381613214565b9050919050565b6000602082019050818103600083015261377381613254565b9050919050565b6000602082019050818103600083015261379381613294565b9050919050565b600060208201905081810360008301526137b3816132d4565b9050919050565b600060208201905081810360008301526137d38161333a565b9050919050565b600060208201905081810360008301526137f38161337a565b9050919050565b60006020820190508181036000830152613813816133ba565b9050919050565b60006020820190508181036000830152613833816133fa565b9050919050565b600060208201905081810360008301526138538161343a565b9050919050565b60006020820190508181036000830152613873816134a0565b9050919050565b60006020820190508181036000830152613893816134e0565b9050919050565b60006020820190506138af6000830184613520565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60006138f282613905565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061393a82613941565b9050919050565b600061394c82613905565b9050919050565b60005b83811015613971578082015181840152602081019050613956565b83811115613980576000848401525b50505050565b6000601f19601f8301169050919050565b6139a0816138e7565b81146139ab57600080fd5b50565b6139b7816138f9565b81146139c257600080fd5b50565b6139ce81613925565b81146139d957600080fd5b5056fea264697066735822122073e280fc84692bb775751c46b94d919b0fe26719c2ecf184b11bd9bd9a898dcb64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000665ef3556520b21368754fb644ed3ebf1993ad4
-----Decoded View---------------
Arg [0] : _stakingToken (address): 0x0665eF3556520B21368754Fb644eD3ebF1993AD4
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000665ef3556520b21368754fb644ed3ebf1993ad4
Deployed Bytecode Sourcemap
30517:7780:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31992:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32875:264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36717:558;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33989:357;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34354:502;;;:::i;:::-;;33403:187;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30967:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;12002:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32213:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31095:77;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32093:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15648:148;;;:::i;:::-;;30934:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31018:29;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36313:396;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14997:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33598:383;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35025:1173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33147:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31507:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31179:62;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34864:97;;;:::i;:::-;;32399:468;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15951:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31992:93;32038:7;32065:12;;32058:19;;31992:93;:::o;32875:264::-;32952:7;32979:152;33099:7;:16;33107:7;33099:16;;;;;;;;;;;;;;;:31;33116:13;33099:31;;;;;;;;;;;;;;;;32979:115;33089:4;32979:105;33002:81;33036:22;:31;33059:7;33036:31;;;;;;;;;;;;;;;:46;33068:13;33036:46;;;;;;;;;;;;;;;;33002:29;33017:13;33002:14;:29::i;:::-;:33;;:81;;;;:::i;:::-;32979:9;:18;32989:7;32979:18;;;;;;;;;;;;;;;;:22;;:105;;;;:::i;:::-;:109;;:115;;;;:::i;:::-;:119;;:152;;;;:::i;:::-;32972:159;;32875:264;;;;:::o;36717:558::-;36854:10;:25;36865:13;36854:25;;;;;;;;;;;;;;;:38;;;36836:15;:56;36814:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;37013:10;36965:58;;:10;:25;36976:13;36965:25;;;;;;;;;;;;;;;:44;;;;;;;;;;;;:58;;;36957:67;;;;;;37062:1;37043:16;:20;37035:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37155:16;37111:10;:25;37122:13;37111:25;;;;;;;;;;;;;;;:41;;:60;;;;37187:80;37210:13;37225:10;:25;37236:13;37225:25;;;;;;;;;;;;;;;:41;;;37187:80;;;;;;;:::i;:::-;;;;;;;;36717:558;;:::o;33989:357::-;10042:1;10648:7;;:19;;10640:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10042:1;10781:7;:18;;;;34056:10:::1;37383:6;37378:481;37395:12;:19;;;;37391:1;:23;37378:481;;;37436:13;37452:12;37465:1;37452:15;;;;;;;;;;;;;;;;;;;;;;;;;37436:31;;37523:21;37538:5;37523:14;:21::i;:::-;37482:10;:17;37493:5;37482:17;;;;;;;;;;;;;;;:38;;:62;;;;37594:31;37619:5;37594:24;:31::i;:::-;37559:10;:17;37570:5;37559:17;;;;;;;;;;;;;;;:32;;:66;;;;37663:1;37644:21;;:7;:21;;;37640:208;;37712:22;37719:7;37728:5;37712:6;:22::i;:::-;37686:7;:16;37694:7;37686:16;;;;;;;;;;;;;;;:23;37703:5;37686:23;;;;;;;;;;;;;;;:48;;;;37794:10;:17;37805:5;37794:17;;;;;;;;;;;;;;;:38;;;37753:22;:31;37776:7;37753:31;;;;;;;;;;;;;;;:38;37785:5;37753:38;;;;;;;;;;;;;;;:79;;;;37640:208;37378:481;37416:3;;;;;;;37378:481;;;;34096:1:::2;34087:6;:10;34079:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;34145:24;34162:6;34145:12;;:16;;:24;;;;:::i;:::-;34130:12;:39;;;;34204:33;34230:6;34204:9;:21;34214:10;34204:21;;;;;;;;;;;;;;;;:25;;:33;;;;:::i;:::-;34180:9;:21;34190:10;34180:21;;;;;;;;;;;;;;;:57;;;;34248:45;34274:10;34286:6;34248:12;;;;;;;;;;;:25;;;;:45;;;;;:::i;:::-;34319:10;34309:29;;;34331:6;34309:29;;;;;;:::i;:::-;;;;;;;;10812:1:::1;9998::::0;10960:7;:22;;;;33989:357;:::o;34354:502::-;10042:1;10648:7;;:19;;10640:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10042:1;10781:7;:18;;;;34408:10:::1;37383:6;37378:481;37395:12;:19;;;;37391:1;:23;37378:481;;;37436:13;37452:12;37465:1;37452:15;;;;;;;;;;;;;;;;;;;;;;;;;37436:31;;37523:21;37538:5;37523:14;:21::i;:::-;37482:10;:17;37493:5;37482:17;;;;;;;;;;;;;;;:38;;:62;;;;37594:31;37619:5;37594:24;:31::i;:::-;37559:10;:17;37570:5;37559:17;;;;;;;;;;;;;;;:32;;:66;;;;37663:1;37644:21;;:7;:21;;;37640:208;;37712:22;37719:7;37728:5;37712:6;:22::i;:::-;37686:7;:16;37694:7;37686:16;;;;;;;;;;;;;;;:23;37703:5;37686:23;;;;;;;;;;;;;;;:48;;;;37794:10;:17;37805:5;37794:17;;;;;;;;;;;;;;;:38;;;37753:22;:31;37776:7;37753:31;;;;;;;;;;;;;;;:38;37785:5;37753:38;;;;;;;;;;;;;;;:79;;;;37640:208;37378:481;37416:3;;;;;;;37378:481;;;;34438:6:::2;34433:416;34450:12;:19;;;;34446:1;:23;34433:416;;;34491:21;34515:12;34528:1;34515:15;;;;;;;;;;;;;;;;;;;;;;;;;34491:39;;34545:14;34562:7;:19;34570:10;34562:19;;;;;;;;;;;;;;;:34;34582:13;34562:34;;;;;;;;;;;;;;;;34545:51;;34624:1;34615:6;:10;34611:231;;;34683:1;34646:7;:19;34654:10;34646:19;;;;;;;;;;;;;;;:34;34666:13;34646:34;;;;;;;;;;;;;;;:38;;;;34703:54;34738:10;34750:6;34710:13;34703:34;;;;:54;;;;;:::i;:::-;34804:13;34781:45;;34792:10;34781:45;;;34819:6;34781:45;;;;;;:::i;:::-;;;;;;;;34611:231;34433:416;;34471:3;;;;;;;34433:416;;;;10812:1:::1;9998::::0;10960:7;:22;;;;34354:502::o;33403:187::-;15228:12;:10;:12::i;:::-;15217:23;;:7;:5;:7::i;:::-;:23;;;15209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33563:19:::1;33516:10;:25;33527:13;33516:25;;;;;;;;;;;;;;;:44;;;:66;;;;;;;;;;;;;;;;;;33403:187:::0;;:::o;30967:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12002:86::-;12049:4;12073:7;;;;;;;;;;;12066:14;;12002:86;:::o;32213:178::-;32291:7;32318:65;32327:15;32344:10;:25;32355:13;32344:25;;;;;;;;;;;;;;;:38;;;32318:8;:65::i;:::-;32311:72;;32213:178;;;:::o;31095:77::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32093:112::-;32152:7;32179:9;:18;32189:7;32179:18;;;;;;;;;;;;;;;;32172:25;;32093:112;;;:::o;15648:148::-;15228:12;:10;:12::i;:::-;15217:23;;:7;:5;:7::i;:::-;:23;;;15209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15755:1:::1;15718:40;;15739:6;::::0;::::1;;;;;;;;15718:40;;;;;;;;;;;;15786:1;15769:6;::::0;:19:::1;;;;;;;;;;;;;;;;;;15648:148::o:0;30934:26::-;;;;;;;;;;;;;:::o;31018:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36313:396::-;15228:12;:10;:12::i;:::-;15217:23;;:7;:5;:7::i;:::-;:23;;;15209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36440:12:::1;;;;;;;;;;;36416:37;;:12;:37;;;;36408:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;36549:1;36506:10;:24;36517:12;36506:24;;;;;;;;;;;;;;;:39;;;:44;36498:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36594:55;36628:7;:5;:7::i;:::-;36637:11;36601:12;36594:33;;;;:55;;;;;:::i;:::-;36665:36;36675:12;36689:11;36665:36;;;;;;;:::i;:::-;;;;;;;;36313:396:::0;;:::o;14997:87::-;15043:7;15070:6;;;;;;;;;;15063:13;;14997:87;:::o;33598:383::-;10042:1;10648:7;;:19;;10640:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10042:1;10781:7;:18;;;;12328:8:::1;:6;:8::i;:::-;12327:9;12319:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;33678:10:::2;37383:6;37378:481;37395:12;:19;;;;37391:1;:23;37378:481;;;37436:13;37452:12;37465:1;37452:15;;;;;;;;;;;;;;;;;;;;;;;;;37436:31;;37523:21;37538:5;37523:14;:21::i;:::-;37482:10;:17;37493:5;37482:17;;;;;;;;;;;;;;;:38;;:62;;;;37594:31;37619:5;37594:24;:31::i;:::-;37559:10;:17;37570:5;37559:17;;;;;;;;;;;;;;;:32;;:66;;;;37663:1;37644:21;;:7;:21;;;37640:208;;37712:22;37719:7;37728:5;37712:6;:22::i;:::-;37686:7;:16;37694:7;37686:16;;;;;;;;;;;;;;;:23;37703:5;37686:23;;;;;;;;;;;;;;;:48;;;;37794:10;:17;37805:5;37794:17;;;;;;;;;;;;;;;:38;;;37753:22;:31;37776:7;37753:31;;;;;;;;;;;;;;;:38;37785:5;37753:38;;;;;;;;;;;;;;;:79;;;;37640:208;37378:481;37416:3;;;;;;;37378:481;;;;33718:1:::3;33709:6;:10;33701:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;33764:24;33781:6;33764:12;;:16;;:24;;;;:::i;:::-;33749:12;:39;;;;33823:33;33849:6;33823:9;:21;33833:10;33823:21;;;;;;;;;;;;;;;;:25;;:33;;;;:::i;:::-;33799:9;:21;33809:10;33799:21;;;;;;;;;;;;;;;:57;;;;33867:64;33897:10;33917:4;33924:6;33867:12;;;;;;;;;;;:29;;;;:64;;;;;;:::i;:::-;33954:10;33947:26;;;33966:6;33947:26;;;;;;:::i;:::-;;;;;;;;12368:1:::2;9998::::0;10960:7;:22;;;;33598:383;:::o;35025:1173::-;35122:1;37383:6;37378:481;37395:12;:19;;;;37391:1;:23;37378:481;;;37436:13;37452:12;37465:1;37452:15;;;;;;;;;;;;;;;;;;;;;;;;;37436:31;;37523:21;37538:5;37523:14;:21::i;:::-;37482:10;:17;37493:5;37482:17;;;;;;;;;;;;;;;:38;;:62;;;;37594:31;37619:5;37594:24;:31::i;:::-;37559:10;:17;37570:5;37559:17;;;;;;;;;;;;;;;:32;;:66;;;;37663:1;37644:21;;:7;:21;;;37640:208;;37712:22;37719:7;37728:5;37712:6;:22::i;:::-;37686:7;:16;37694:7;37686:16;;;;;;;;;;;;;;;:23;37703:5;37686:23;;;;;;;;;;;;;;;:48;;;;37794:10;:17;37805:5;37794:17;;;;;;;;;;;;;;;:38;;;37753:22;:31;37776:7;37753:31;;;;;;;;;;;;;;;:38;37785:5;37753:38;;;;;;;;;;;;;;;:79;;;;37640:208;37378:481;37416:3;;;;;;;37378:481;;;;35193:10:::1;35145:58;;:10;:25;35156:13;35145:25;;;;;;;;;;;;;;;:44;;;;;;;;;;;;:58;;;35137:67;;;::::0;::::1;;35385:73;35424:10;35444:4;35451:6;35392:13;35385:38;;;;:73;;;;;;:::i;:::-;35494:10;:25;35505:13;35494:25;;;;;;;;;;;;;;;:38;;;35475:15;:57;35471:500;;35588:53;35599:10;:25;35610:13;35599:25;;;;;;;;;;;;;;;:41;;;35588:6;:10;;:53;;;;:::i;:::-;35549:10;:25;35560:13;35549:25;;;;;;;;;;;;;;;:36;;:92;;;;35471:500;;;35674:17;35694:59;35737:15;35694:10;:25;35705:13;35694:25;;;;;;;;;;;;;;;:38;;;:42;;:59;;;;:::i;:::-;35674:79;;35768:16;35787:51;35801:10;:25;35812:13;35801:25;;;;;;;;;;;;;;;:36;;;35787:9;:13;;:51;;;;:::i;:::-;35768:70;;35892:67;35917:10;:25;35928:13;35917:25;;;;;;;;;;;;;;;:41;;;35892:20;35903:8;35892:6;:10;;:20;;;;:::i;:::-;:24;;:67;;;;:::i;:::-;35853:10;:25;35864:13;35853:25;;;;;;;;;;;;;;;:36;;:106;;;;35471:500;;;36026:15;35983:10;:25;35994:13;35983:25;;;;;;;;;;;;;;;:40;;:58;;;;36093:62;36113:10;:25;36124:13;36113:25;;;;;;;;;;;;;;;:41;;;36093:15;:19;;:62;;;;:::i;:::-;36052:10;:25;36063:13;36052:25;;;;;;;;;;;;;;;:38;;:103;;;;36171:19;36183:6;36171:19;;;;;;:::i;:::-;;;;;;;;35025:1173:::0;;;:::o;33147:194::-;33223:7;33250:83;33291:10;:25;33302:13;33291:25;;;;;;;;;;;;;;;:41;;;33250:10;:25;33261:13;33250:25;;;;;;;;;;;;;;;:36;;;:40;;:83;;;;:::i;:::-;33243:90;;33147:194;;;:::o;31507:436::-;15228:12;:10;:12::i;:::-;15217:23;;:7;:5;:7::i;:::-;:23;;;15209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31742:1:::1;31697:10;:25;31708:13;31697:25;;;;;;;;;;;;;;;:41;;;:46;31689:55;;;::::0;::::1;;31755:12;31773:13;31755:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31845:19;31798:10;:25;31809:13;31798:25;;;;;;;;;;;;;;;:44;;;:66;;;;;;;;;;;;;;;;;;31919:16;31875:10;:25;31886:13;31875:25;;;;;;;;;;;;;;;:41;;:60;;;;31507:436:::0;;;:::o;31179:62::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34864:97::-;34900:31;34909:9;:21;34919:10;34909:21;;;;;;;;;;;;;;;;34900:8;:31::i;:::-;34942:11;:9;:11::i;:::-;34864:97::o;32399:468::-;32467:7;32507:1;32491:12;;:17;32487:103;;;32532:10;:25;32543:13;32532:25;;;;;;;;;;;;;;;:46;;;32525:53;;;;32487:103;32620:239;32689:155;32831:12;;32689:137;32821:4;32689:127;32779:10;:25;32790:13;32779:25;;;;;;;;;;;;;;;:36;;;32689:85;32733:10;:25;32744:13;32733:25;;;;;;;;;;;;;;;:40;;;32689:39;32714:13;32689:24;:39::i;:::-;:43;;:85;;;;:::i;:::-;:89;;:127;;;;:::i;:::-;:131;;:137;;;;:::i;:::-;:141;;:155;;;;:::i;:::-;32620:10;:25;32631:13;32620:25;;;;;;;;;;;;;;;:46;;;:50;;:239;;;;:::i;:::-;32600:259;;32399:468;;;;:::o;15951:244::-;15228:12;:10;:12::i;:::-;15217:23;;:7;:5;:7::i;:::-;:23;;;15209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16060:1:::1;16040:22;;:8;:22;;;;16032:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16150:8;16121:38;;16142:6;::::0;::::1;;;;;;;;16121:38;;;;;;;;;;;;16179:8;16170:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;15951:244:::0;:::o;3236:158::-;3294:7;3327:1;3322;:6;;3314:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;3385:1;3381;:5;3374:12;;3236:158;;;;:::o;3653:220::-;3711:7;3740:1;3735;:6;3731:20;;;3750:1;3743:8;;;;3731:20;3762:9;3778:1;3774;:5;3762:17;;3807:1;3802;3798;:5;;;;;;:10;3790:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3864:1;3857:8;;;3653:220;;;;;:::o;4351:153::-;4409:7;4441:1;4437;:5;4429:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;4495:1;4491;:5;;;;;;4484:12;;4351:153;;;;:::o;2774:179::-;2832:7;2852:9;2868:1;2864;:5;2852:17;;2893:1;2888;:6;;2880:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2944:1;2937:8;;;2774:179;;;;:::o;27442:177::-;27525:86;27545:5;27575:23;;;27600:2;27604:5;27552:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27525:19;:86::i;:::-;27442:177;;;:::o;7990:106::-;8043:15;8078:10;8071:17;;7990:106;:::o;13545:::-;13603:7;13634:1;13630;:5;:13;;13642:1;13630:13;;;13638:1;13630:13;13623:20;;13545:106;;;;:::o;27627:205::-;27728:96;27748:5;27778:27;;;27807:4;27813:2;27817:5;27755:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27728:19;:96::i;:::-;27627:205;;;;:::o;29747:761::-;30171:23;30197:69;30225:4;30197:69;;;;;;;;;;;;;;;;;30205:5;30197:27;;;;:69;;;;;:::i;:::-;30171:95;;30301:1;30281:10;:17;:21;30277:224;;;30423:10;30412:30;;;;;;;;;;;;:::i;:::-;30404:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30277:224;29747:761;;;:::o;22540:195::-;22643:12;22675:52;22697:6;22705:4;22711:1;22714:12;22675:21;:52::i;:::-;22668:59;;22540:195;;;;;:::o;23592:530::-;23719:12;23777:5;23752:21;:30;;23744:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23844:18;23855:6;23844:10;:18::i;:::-;23836:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23970:12;23984:23;24011:6;:11;;24031:5;24039:4;24011:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23969:75;;;;24062:52;24080:7;24089:10;24101:12;24062:17;:52::i;:::-;24055:59;;;;23592:530;;;;;;:::o;19622:422::-;19682:4;19890:12;20001:7;19989:20;19981:28;;20035:1;20028:4;:8;20021:15;;;19622:422;;;:::o;26132:742::-;26247:12;26276:7;26272:595;;;26307:10;26300:17;;;;26272:595;26441:1;26421:10;:17;:21;26417:439;;;26684:10;26678:17;26745:15;26732:10;26728:2;26724:19;26717:44;26632:148;26827:12;26820:20;;;;;;;;;;;:::i;:::-;;;;;;;;26132:742;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:128::-;;223:6;217:13;208:22;;235:30;259:5;235:30;:::i;:::-;202:68;;;;:::o;277:130::-;;357:6;344:20;335:29;;369:33;396:5;369:33;:::i;:::-;329:78;;;;:::o;414:241::-;;518:2;506:9;497:7;493:23;489:32;486:2;;;534:1;531;524:12;486:2;569:1;586:53;631:7;622:6;611:9;607:22;586:53;:::i;:::-;576:63;;548:97;480:175;;;;:::o;662:366::-;;;783:2;771:9;762:7;758:23;754:32;751:2;;;799:1;796;789:12;751:2;834:1;851:53;896:7;887:6;876:9;872:22;851:53;:::i;:::-;841:63;;813:97;941:2;959:53;1004:7;995:6;984:9;980:22;959:53;:::i;:::-;949:63;;920:98;745:283;;;;;:::o;1035:491::-;;;;1173:2;1161:9;1152:7;1148:23;1144:32;1141:2;;;1189:1;1186;1179:12;1141:2;1224:1;1241:53;1286:7;1277:6;1266:9;1262:22;1241:53;:::i;:::-;1231:63;;1203:97;1331:2;1349:53;1394:7;1385:6;1374:9;1370:22;1349:53;:::i;:::-;1339:63;;1310:98;1439:2;1457:53;1502:7;1493:6;1482:9;1478:22;1457:53;:::i;:::-;1447:63;;1418:98;1135:391;;;;;:::o;1533:366::-;;;1654:2;1642:9;1633:7;1629:23;1625:32;1622:2;;;1670:1;1667;1660:12;1622:2;1705:1;1722:53;1767:7;1758:6;1747:9;1743:22;1722:53;:::i;:::-;1712:63;;1684:97;1812:2;1830:53;1875:7;1866:6;1855:9;1851:22;1830:53;:::i;:::-;1820:63;;1791:98;1616:283;;;;;:::o;1906:257::-;;2018:2;2006:9;1997:7;1993:23;1989:32;1986:2;;;2034:1;2031;2024:12;1986:2;2069:1;2086:61;2139:7;2130:6;2119:9;2115:22;2086:61;:::i;:::-;2076:71;;2048:105;1980:183;;;;:::o;2170:241::-;;2274:2;2262:9;2253:7;2249:23;2245:32;2242:2;;;2290:1;2287;2280:12;2242:2;2325:1;2342:53;2387:7;2378:6;2367:9;2363:22;2342:53;:::i;:::-;2332:63;;2304:97;2236:175;;;;:::o;2418:113::-;2501:24;2519:5;2501:24;:::i;:::-;2496:3;2489:37;2483:48;;:::o;2538:104::-;2615:21;2630:5;2615:21;:::i;:::-;2610:3;2603:34;2597:45;;:::o;2649:356::-;;2777:38;2809:5;2777:38;:::i;:::-;2827:88;2908:6;2903:3;2827:88;:::i;:::-;2820:95;;2920:52;2965:6;2960:3;2953:4;2946:5;2942:16;2920:52;:::i;:::-;2993:6;2988:3;2984:16;2977:23;;2757:248;;;;;:::o;3012:154::-;3109:51;3154:5;3109:51;:::i;:::-;3104:3;3097:64;3091:75;;:::o;3173:347::-;;3285:39;3318:5;3285:39;:::i;:::-;3336:71;3400:6;3395:3;3336:71;:::i;:::-;3329:78;;3412:52;3457:6;3452:3;3445:4;3438:5;3434:16;3412:52;:::i;:::-;3485:29;3507:6;3485:29;:::i;:::-;3480:3;3476:39;3469:46;;3265:255;;;;;:::o;3528:332::-;;3688:67;3752:2;3747:3;3688:67;:::i;:::-;3681:74;;3788:34;3784:1;3779:3;3775:11;3768:55;3851:2;3846:3;3842:12;3835:19;;3674:186;;;:::o;3869:375::-;;4029:67;4093:2;4088:3;4029:67;:::i;:::-;4022:74;;4129:34;4125:1;4120:3;4116:11;4109:55;4198:8;4193:2;4188:3;4184:12;4177:30;4235:2;4230:3;4226:12;4219:19;;4015:229;;;:::o;4253:314::-;;4413:67;4477:2;4472:3;4413:67;:::i;:::-;4406:74;;4513:16;4509:1;4504:3;4500:11;4493:37;4558:2;4553:3;4549:12;4542:19;;4399:168;;;:::o;4576:327::-;;4736:67;4800:2;4795:3;4736:67;:::i;:::-;4729:74;;4836:29;4832:1;4827:3;4823:11;4816:50;4894:2;4889:3;4885:12;4878:19;;4722:181;;;:::o;4912:330::-;;5072:67;5136:2;5131:3;5072:67;:::i;:::-;5065:74;;5172:32;5168:1;5163:3;5159:11;5152:53;5233:2;5228:3;5224:12;5217:19;;5058:184;;;:::o;5251:375::-;;5411:67;5475:2;5470:3;5411:67;:::i;:::-;5404:74;;5511:34;5507:1;5502:3;5498:11;5491:55;5580:8;5575:2;5570:3;5566:12;5559:30;5617:2;5612:3;5608:12;5601:19;;5397:229;;;:::o;5635:326::-;;5795:67;5859:2;5854:3;5795:67;:::i;:::-;5788:74;;5895:28;5891:1;5886:3;5882:11;5875:49;5952:2;5947:3;5943:12;5936:19;;5781:180;;;:::o;5970:316::-;;6130:67;6194:2;6189:3;6130:67;:::i;:::-;6123:74;;6230:18;6226:1;6221:3;6217:11;6210:39;6277:2;6272:3;6268:12;6261:19;;6116:170;;;:::o;6295:317::-;;6455:67;6519:2;6514:3;6455:67;:::i;:::-;6448:74;;6555:19;6551:1;6546:3;6542:11;6535:40;6603:2;6598:3;6594:12;6587:19;;6441:171;;;:::o;6621:370::-;;6781:67;6845:2;6840:3;6781:67;:::i;:::-;6774:74;;6881:34;6877:1;6872:3;6868:11;6861:55;6950:3;6945:2;6940:3;6936:12;6929:25;6982:2;6977:3;6973:12;6966:19;;6767:224;;;:::o;7000:332::-;;7160:67;7224:2;7219:3;7160:67;:::i;:::-;7153:74;;7260:34;7256:1;7251:3;7247:11;7240:55;7323:2;7318:3;7314:12;7307:19;;7146:186;;;:::o;7341:329::-;;7501:67;7565:2;7560:3;7501:67;:::i;:::-;7494:74;;7601:31;7597:1;7592:3;7588:11;7581:52;7661:2;7656:3;7652:12;7645:19;;7487:183;;;:::o;7679:329::-;;7839:67;7903:2;7898:3;7839:67;:::i;:::-;7832:74;;7939:31;7935:1;7930:3;7926:11;7919:52;7999:2;7994:3;7990:12;7983:19;;7825:183;;;:::o;8017:326::-;;8177:67;8241:2;8236:3;8177:67;:::i;:::-;8170:74;;8277:28;8273:1;8268:3;8264:11;8257:49;8334:2;8329:3;8325:12;8318:19;;8163:180;;;:::o;8352:379::-;;8512:67;8576:2;8571:3;8512:67;:::i;:::-;8505:74;;8612:34;8608:1;8603:3;8599:11;8592:55;8681:12;8676:2;8671:3;8667:12;8660:34;8722:2;8717:3;8713:12;8706:19;;8498:233;;;:::o;8740:328::-;;8900:67;8964:2;8959:3;8900:67;:::i;:::-;8893:74;;9000:30;8996:1;8991:3;8987:11;8980:51;9059:2;9054:3;9050:12;9043:19;;8886:182;;;:::o;9077:331::-;;9237:67;9301:2;9296:3;9237:67;:::i;:::-;9230:74;;9337:33;9333:1;9328:3;9324:11;9317:54;9399:2;9394:3;9390:12;9383:19;;9223:185;;;:::o;9416:113::-;9499:24;9517:5;9499:24;:::i;:::-;9494:3;9487:37;9481:48;;:::o;9536:271::-;;9689:93;9778:3;9769:6;9689:93;:::i;:::-;9682:100;;9799:3;9792:10;;9670:137;;;;:::o;9814:222::-;;9941:2;9930:9;9926:18;9918:26;;9955:71;10023:1;10012:9;10008:17;9999:6;9955:71;:::i;:::-;9912:124;;;;:::o;10043:444::-;;10226:2;10215:9;10211:18;10203:26;;10240:71;10308:1;10297:9;10293:17;10284:6;10240:71;:::i;:::-;10322:72;10390:2;10379:9;10375:18;10366:6;10322:72;:::i;:::-;10405;10473:2;10462:9;10458:18;10449:6;10405:72;:::i;:::-;10197:290;;;;;;:::o;10494:333::-;;10649:2;10638:9;10634:18;10626:26;;10663:71;10731:1;10720:9;10716:17;10707:6;10663:71;:::i;:::-;10745:72;10813:2;10802:9;10798:18;10789:6;10745:72;:::i;:::-;10620:207;;;;;:::o;10834:780::-;;11101:3;11090:9;11086:19;11078:27;;11116:71;11184:1;11173:9;11169:17;11160:6;11116:71;:::i;:::-;11198:72;11266:2;11255:9;11251:18;11242:6;11198:72;:::i;:::-;11281;11349:2;11338:9;11334:18;11325:6;11281:72;:::i;:::-;11364;11432:2;11421:9;11417:18;11408:6;11364:72;:::i;:::-;11447:73;11515:3;11504:9;11500:19;11491:6;11447:73;:::i;:::-;11531;11599:3;11588:9;11584:19;11575:6;11531:73;:::i;:::-;11072:542;;;;;;;;;:::o;11621:210::-;;11742:2;11731:9;11727:18;11719:26;;11756:65;11818:1;11807:9;11803:17;11794:6;11756:65;:::i;:::-;11713:118;;;;:::o;11838:250::-;;11979:2;11968:9;11964:18;11956:26;;11993:85;12075:1;12064:9;12060:17;12051:6;11993:85;:::i;:::-;11950:138;;;;:::o;12095:310::-;;12242:2;12231:9;12227:18;12219:26;;12292:9;12286:4;12282:20;12278:1;12267:9;12263:17;12256:47;12317:78;12390:4;12381:6;12317:78;:::i;:::-;12309:86;;12213:192;;;;:::o;12412:416::-;;12612:2;12601:9;12597:18;12589:26;;12662:9;12656:4;12652:20;12648:1;12637:9;12633:17;12626:47;12687:131;12813:4;12687:131;:::i;:::-;12679:139;;12583:245;;;:::o;12835:416::-;;13035:2;13024:9;13020:18;13012:26;;13085:9;13079:4;13075:20;13071:1;13060:9;13056:17;13049:47;13110:131;13236:4;13110:131;:::i;:::-;13102:139;;13006:245;;;:::o;13258:416::-;;13458:2;13447:9;13443:18;13435:26;;13508:9;13502:4;13498:20;13494:1;13483:9;13479:17;13472:47;13533:131;13659:4;13533:131;:::i;:::-;13525:139;;13429:245;;;:::o;13681:416::-;;13881:2;13870:9;13866:18;13858:26;;13931:9;13925:4;13921:20;13917:1;13906:9;13902:17;13895:47;13956:131;14082:4;13956:131;:::i;:::-;13948:139;;13852:245;;;:::o;14104:416::-;;14304:2;14293:9;14289:18;14281:26;;14354:9;14348:4;14344:20;14340:1;14329:9;14325:17;14318:47;14379:131;14505:4;14379:131;:::i;:::-;14371:139;;14275:245;;;:::o;14527:416::-;;14727:2;14716:9;14712:18;14704:26;;14777:9;14771:4;14767:20;14763:1;14752:9;14748:17;14741:47;14802:131;14928:4;14802:131;:::i;:::-;14794:139;;14698:245;;;:::o;14950:416::-;;15150:2;15139:9;15135:18;15127:26;;15200:9;15194:4;15190:20;15186:1;15175:9;15171:17;15164:47;15225:131;15351:4;15225:131;:::i;:::-;15217:139;;15121:245;;;:::o;15373:416::-;;15573:2;15562:9;15558:18;15550:26;;15623:9;15617:4;15613:20;15609:1;15598:9;15594:17;15587:47;15648:131;15774:4;15648:131;:::i;:::-;15640:139;;15544:245;;;:::o;15796:416::-;;15996:2;15985:9;15981:18;15973:26;;16046:9;16040:4;16036:20;16032:1;16021:9;16017:17;16010:47;16071:131;16197:4;16071:131;:::i;:::-;16063:139;;15967:245;;;:::o;16219:416::-;;16419:2;16408:9;16404:18;16396:26;;16469:9;16463:4;16459:20;16455:1;16444:9;16440:17;16433:47;16494:131;16620:4;16494:131;:::i;:::-;16486:139;;16390:245;;;:::o;16642:416::-;;16842:2;16831:9;16827:18;16819:26;;16892:9;16886:4;16882:20;16878:1;16867:9;16863:17;16856:47;16917:131;17043:4;16917:131;:::i;:::-;16909:139;;16813:245;;;:::o;17065:416::-;;17265:2;17254:9;17250:18;17242:26;;17315:9;17309:4;17305:20;17301:1;17290:9;17286:17;17279:47;17340:131;17466:4;17340:131;:::i;:::-;17332:139;;17236:245;;;:::o;17488:416::-;;17688:2;17677:9;17673:18;17665:26;;17738:9;17732:4;17728:20;17724:1;17713:9;17709:17;17702:47;17763:131;17889:4;17763:131;:::i;:::-;17755:139;;17659:245;;;:::o;17911:416::-;;18111:2;18100:9;18096:18;18088:26;;18161:9;18155:4;18151:20;18147:1;18136:9;18132:17;18125:47;18186:131;18312:4;18186:131;:::i;:::-;18178:139;;18082:245;;;:::o;18334:416::-;;18534:2;18523:9;18519:18;18511:26;;18584:9;18578:4;18574:20;18570:1;18559:9;18555:17;18548:47;18609:131;18735:4;18609:131;:::i;:::-;18601:139;;18505:245;;;:::o;18757:416::-;;18957:2;18946:9;18942:18;18934:26;;19007:9;19001:4;18997:20;18993:1;18982:9;18978:17;18971:47;19032:131;19158:4;19032:131;:::i;:::-;19024:139;;18928:245;;;:::o;19180:416::-;;19380:2;19369:9;19365:18;19357:26;;19430:9;19424:4;19420:20;19416:1;19405:9;19401:17;19394:47;19455:131;19581:4;19455:131;:::i;:::-;19447:139;;19351:245;;;:::o;19603:222::-;;19730:2;19719:9;19715:18;19707:26;;19744:71;19812:1;19801:9;19797:17;19788:6;19744:71;:::i;:::-;19701:124;;;;:::o;19832:121::-;;19925:5;19919:12;19909:22;;19890:63;;;:::o;19960:122::-;;20054:5;20048:12;20038:22;;20019:63;;;:::o;20090:144::-;;20225:3;20210:18;;20203:31;;;;:::o;20243:163::-;;20358:6;20353:3;20346:19;20395:4;20390:3;20386:14;20371:29;;20339:67;;;;:::o;20414:91::-;;20476:24;20494:5;20476:24;:::i;:::-;20465:35;;20459:46;;;:::o;20512:85::-;;20585:5;20578:13;20571:21;20560:32;;20554:43;;;:::o;20604:121::-;;20677:42;20670:5;20666:54;20655:65;;20649:76;;;:::o;20732:72::-;;20794:5;20783:16;;20777:27;;;:::o;20811:149::-;;20904:51;20949:5;20904:51;:::i;:::-;20891:64;;20885:75;;;:::o;20967:122::-;;21060:24;21078:5;21060:24;:::i;:::-;21047:37;;21041:48;;;:::o;21097:268::-;21162:1;21169:101;21183:6;21180:1;21177:13;21169:101;;;21259:1;21254:3;21250:11;21244:18;21240:1;21235:3;21231:11;21224:39;21205:2;21202:1;21198:10;21193:15;;21169:101;;;21285:6;21282:1;21279:13;21276:2;;;21350:1;21341:6;21336:3;21332:16;21325:27;21276:2;21146:219;;;;:::o;21373:97::-;;21461:2;21457:7;21452:2;21445:5;21441:14;21437:28;21427:38;;21421:49;;;:::o;21478:117::-;21547:24;21565:5;21547:24;:::i;:::-;21540:5;21537:35;21527:2;;21586:1;21583;21576:12;21527:2;21521:74;:::o;21602:111::-;21668:21;21683:5;21668:21;:::i;:::-;21661:5;21658:32;21648:2;;21704:1;21701;21694:12;21648:2;21642:71;:::o;21720:117::-;21789:24;21807:5;21789:24;:::i;:::-;21782:5;21779:35;21769:2;;21828:1;21825;21818:12;21769:2;21763:74;:::o
Swarm Source
ipfs://73e280fc84692bb775751c46b94d919b0fe26719c2ecf184b11bd9bd9a898dcb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
AVAX | 100.00% | $22.47 | 17.2628 | $387.81 |
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.