More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
85097946 | 726 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
DogeBonusPool
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2023-04-28 */ // File: @openzeppelin/contracts/utils/math/SafeMath.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ 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) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { 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) { unchecked { // 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) { unchecked { 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) { unchecked { 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) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return 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) { return a * b; } /** * @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. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { 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) { 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) { unchecked { 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. * * 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) { unchecked { 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @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. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @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() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { 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()); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: contracts/pool/DogeBonusPool.sol pragma solidity =0.8.19; contract PoolVault is Ownable { function approve(address token) public onlyOwner returns (uint256) { IERC20(token).approve(msg.sender, type(uint256).max); } } contract DogeBonusPool is Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; struct UserInfo { uint256 amount; // How many tokens the user has provided. uint256 rewardDebt; // Reward debt. } struct PoolInfo { IERC20 token; // Address of erc20 token contract. uint256 allocPoint; // How many allocation points assigned to this pool. Tokens to distribute per second. uint256 totalDeposit; uint256 lastRewardTime; // Last timestamp that Tokens distribution occurs. uint256 accRewardsPerShare; // Accumulated RewardTokens per share, times 1e18. } struct PoolView { uint256 pid; uint256 allocPoint; uint256 lastRewardTime; uint256 rewardsPerSecond; uint256 accRewardPerShare; uint256 totalAmount; address token; string symbol; string name; uint8 decimals; uint256 startTime; uint256 bonusEndTime; } struct UserView { uint256 stakedAmount; uint256 unclaimedRewards; uint256 lpBalance; } IERC20 public rewardToken; uint256 public maxStakingPerUser; uint256 public rewardPerSecond; uint256 public standardRewardInterval = 3 days; PoolVault public poolVault; uint256 public BONUS_MULTIPLIER = 1; PoolInfo[] public poolInfo; mapping(uint256 => mapping(address => UserInfo)) public userInfo; uint256 private totalAllocPoint = 0; uint256 public startTime; uint256 public bonusEndTime; EnumerableSet.AddressSet private _pairs; mapping(address => uint256) public LpOfPid; EnumerableSet.AddressSet private _callers; event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount, uint256 rewards); event EmergencyWithdraw(address indexed user, uint256 amount); constructor( IERC20 _rewardToken, uint256 _rewardPerSecond, uint256 _startTime, uint256 _bonusEndTime, uint256 _maxStakingPerUser ) { rewardToken = _rewardToken; rewardPerSecond = _rewardPerSecond; startTime = _startTime; bonusEndTime = _bonusEndTime; maxStakingPerUser = _maxStakingPerUser; poolVault = new PoolVault(); } function stopReward() public onlyOwner { bonusEndTime = block.timestamp; } function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { if (_to <= bonusEndTime) { return _to.sub(_from).mul(BONUS_MULTIPLIER); } else if (_from >= bonusEndTime) { return 0; } else { return bonusEndTime.sub(_from).mul(BONUS_MULTIPLIER); } } function add(uint256 _allocPoint, address _token) public onlyOwner { require(_token != address(0), "DogeBonusPool: _token is the zero address"); poolVault.approve(address(_token)); require(!EnumerableSet.contains(_pairs, _token), "DogeBonusPool: _token is already added to the pool"); EnumerableSet.add(_pairs, _token); massUpdatePools(); uint256 lastRewardTime = block.timestamp > startTime ? block.timestamp : startTime; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ token: IERC20(_token), allocPoint: _allocPoint, totalDeposit: 0, lastRewardTime: lastRewardTime, accRewardsPerShare: 0 }) ); LpOfPid[_token] = poolInfo.length - 1; } function set(uint256 _pid, uint256 _allocPoint) public onlyOwner { require(_pid <= poolInfo.length - 1, "DogeBonusPool: Can not find this pool"); massUpdatePools(); totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; } function updateMultiplier(uint256 multiplierNumber) public onlyOwner { massUpdatePools(); BONUS_MULTIPLIER = multiplierNumber; } function setMaxStakingPerUser(uint256 amount) public onlyOwner { maxStakingPerUser = amount; } function setStandardRewardInterval(uint256 interval) public onlyOwner { require(interval > 0, "DogeBonusPool: interval must be greater than 0"); standardRewardInterval = interval; } function pendingReward(uint256 _pid, address _user) public view returns (uint256) { require(_pid <= poolInfo.length - 1, "DogeBonusPool: Can not find this pool"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accRewardsPerShare = pool.accRewardsPerShare; uint256 lpSupply = pool.totalDeposit; if (block.timestamp > pool.lastRewardTime && lpSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp); uint256 tokenReward = multiplier.mul(rewardPerSecond).mul(pool.allocPoint).div(totalAllocPoint); accRewardsPerShare = accRewardsPerShare.add(tokenReward.mul(1e18).div(lpSupply)); } return user.amount.mul(accRewardsPerShare).div(1e18).sub(user.rewardDebt); } function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTime) { return; } uint256 lpSupply = pool.totalDeposit; if (lpSupply == 0) { pool.lastRewardTime = block.timestamp; return; } uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp); uint256 tokenReward = multiplier.mul(rewardPerSecond).mul(pool.allocPoint).div(totalAllocPoint); pool.accRewardsPerShare = pool.accRewardsPerShare.add(tokenReward.mul(1e18).div(lpSupply)); pool.lastRewardTime = block.timestamp; } function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } function deposit(uint256 _pid, uint256 _amount) public { require(_pid <= poolInfo.length - 1, "DogeBonusPool: Can not find this pool"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); uint256 reward; if (user.amount > 0) { uint256 pending = user.amount.mul(pool.accRewardsPerShare).div(1e18).sub(user.rewardDebt); if(pending > 0) { uint256 bal = rewardToken.balanceOf(address(this)); if(bal >= pending) { reward = pending; } else { reward = bal; } } } if(_amount > 0) { uint256 oldBal = pool.token.balanceOf(address(poolVault)); pool.token.safeTransferFrom(address(msg.sender), address(poolVault), _amount); _amount = pool.token.balanceOf(address(poolVault)).sub(oldBal); require(_amount.add(user.amount) <= maxStakingPerUser, 'DogeBonusPool: exceed max stake'); user.amount = user.amount.add(_amount); pool.totalDeposit = pool.totalDeposit.add(_amount); } user.rewardDebt = user.amount.mul(pool.accRewardsPerShare).div(1e18); if (reward > 0) { rewardToken.safeTransfer(address(msg.sender), reward); } emit Deposit(msg.sender, _amount); } function injectRewards(uint256 amount) public onlyCaller { uint256 remainingSeconds = bonusEndTime > block.timestamp ? bonusEndTime.sub(block.timestamp) : 0; uint256 rewardsSeconds = standardRewardInterval; if (remainingSeconds < rewardsSeconds) { rewardsSeconds = rewardsSeconds - remainingSeconds; } else { rewardsSeconds = 0; } _injectRewardsWithTime(amount, rewardsSeconds); } function injectRewardsWithTime(uint256 amount, uint256 rewardsSeconds) public onlyCaller { _injectRewardsWithTime(amount, rewardsSeconds); } function _injectRewardsWithTime(uint256 amount, uint256 rewardsSeconds) internal { massUpdatePools(); uint256 oldBal = rewardToken.balanceOf(address(this)); rewardToken.safeTransferFrom(_msgSender(), address(this), amount); uint256 realAmount = rewardToken.balanceOf(address(this)).sub(oldBal); uint256 remainingSeconds = bonusEndTime > block.timestamp ? bonusEndTime.sub(block.timestamp) : 0; uint256 remainingBal = rewardPerSecond.mul(remainingSeconds); rewardsSeconds = rewardsSeconds.add(remainingSeconds); remainingBal = remainingBal.add(realAmount); rewardPerSecond = remainingBal.div(rewardsSeconds); if(block.timestamp >= startTime) { bonusEndTime = block.timestamp.add(rewardsSeconds); } else { bonusEndTime = startTime.add(rewardsSeconds); } } function withdraw(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "DogeBonusPool: Withdraw with insufficient balance"); updatePool(_pid); uint256 pending = user.amount.mul(pool.accRewardsPerShare).div(1e18).sub(user.rewardDebt); if(_amount > 0) { user.amount = user.amount.sub(_amount); pool.totalDeposit = pool.totalDeposit.sub(_amount); pool.token.safeTransferFrom(address(poolVault), address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accRewardsPerShare).div(1e18); uint256 rewards; if(pending > 0) { uint256 bal = rewardToken.balanceOf(address(this)); if(bal >= pending) { rewards = pending; } else { rewards = bal; } } rewardToken.safeTransfer(address(msg.sender), rewards); emit Withdraw(msg.sender, _amount, rewards); } function emergencyWithdraw(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; if(pool.totalDeposit >= user.amount) { pool.totalDeposit = pool.totalDeposit.sub(user.amount); } else { pool.totalDeposit = 0; } user.amount = 0; user.rewardDebt = 0; pool.token.safeTransferFrom(address(poolVault), address(msg.sender), amount); emit EmergencyWithdraw(msg.sender, user.amount); } function emergencyRewardWithdraw(uint256 _amount) public onlyOwner { require(_amount <= rewardToken.balanceOf(address(this)), 'DogeBonusPool: not enough token'); rewardToken.safeTransfer(address(msg.sender), _amount); } function getPoolView(uint256 pid) public view returns (PoolView memory) { require(pid < poolInfo.length, "DogeBonusPool: pid out of range"); PoolInfo memory pool = poolInfo[pid]; IERC20Metadata token = IERC20Metadata(address(pool.token)); uint256 rewardsPerSecond = pool.allocPoint.mul(rewardPerSecond).div(totalAllocPoint); return PoolView({ pid: pid, allocPoint: pool.allocPoint, lastRewardTime: pool.lastRewardTime, accRewardPerShare: pool.accRewardsPerShare, rewardsPerSecond: rewardsPerSecond, totalAmount: pool.totalDeposit, token: address(token), symbol: token.symbol(), name: token.name(), decimals: token.decimals(), startTime: startTime, bonusEndTime: bonusEndTime }); } function getAllPoolViews() external view returns (PoolView[] memory) { PoolView[] memory views = new PoolView[](poolInfo.length); for (uint256 i = 0; i < poolInfo.length; i++) { views[i] = getPoolView(i); } return views; } function getUserView(address token, address account) public view returns (UserView memory) { uint256 pid = LpOfPid[token]; UserInfo memory user = userInfo[pid][account]; uint256 unclaimedRewards = pendingReward(pid, account); uint256 lpBalance = IERC20(token).balanceOf(account); return UserView({ stakedAmount: user.amount, unclaimedRewards: unclaimedRewards, lpBalance: lpBalance }); } function getUserViews(address account) external view returns (UserView[] memory) { address token; UserView[] memory views = new UserView[](poolInfo.length); for (uint256 i = 0; i < poolInfo.length; i++) { token = address(poolInfo[i].token); views[i] = getUserView(token, account); } return views; } function addCaller(address val) public onlyOwner() { require(val != address(0), "DogeBonusPool: val is the zero address"); _callers.add(val); } function delCaller(address caller) public onlyOwner returns (bool) { require(caller != address(0), "DogeBonusPool: caller is the zero address"); return _callers.remove(caller); } function getCallers() public view returns (address[] memory ret) { return _callers.values(); } modifier onlyCaller() { require(_callers.contains(_msgSender()), "onlyCaller"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_bonusEndTime","type":"uint256"},{"internalType":"uint256","name":"_maxStakingPerUser","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewards","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"LpOfPid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"addCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bonusEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"delCaller","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllPoolViews","outputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"rewardsPerSecond","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"bonusEndTime","type":"uint256"}],"internalType":"struct DogeBonusPool.PoolView[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCallers","outputs":[{"internalType":"address[]","name":"ret","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"getPoolView","outputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"rewardsPerSecond","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"bonusEndTime","type":"uint256"}],"internalType":"struct DogeBonusPool.PoolView","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"getUserView","outputs":[{"components":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"unclaimedRewards","type":"uint256"},{"internalType":"uint256","name":"lpBalance","type":"uint256"}],"internalType":"struct DogeBonusPool.UserView","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUserViews","outputs":[{"components":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"unclaimedRewards","type":"uint256"},{"internalType":"uint256","name":"lpBalance","type":"uint256"}],"internalType":"struct DogeBonusPool.UserView[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"injectRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardsSeconds","type":"uint256"}],"name":"injectRewardsWithTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxStakingPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"totalDeposit","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"accRewardsPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolVault","outputs":[{"internalType":"contract PoolVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxStakingPerUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"setStandardRewardInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"standardRewardInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"multiplierNumber","type":"uint256"}],"name":"updateMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526203f480600455600160065560006009553480156200002257600080fd5b5060405162005257380380620052578339818101604052810190620000489190620002cf565b620000686200005c6200013c60201b60201c565b6200014460201b60201c565b84600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360038190555082600a8190555081600b8190555080600281905550604051620000d39062000208565b604051809103906000f080158015620000f0573d6000803e3d6000fd5b50600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505062000357565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61074b8062004b0c83390190565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000248826200021b565b9050919050565b60006200025c826200023b565b9050919050565b6200026e816200024f565b81146200027a57600080fd5b50565b6000815190506200028e8162000263565b92915050565b6000819050919050565b620002a98162000294565b8114620002b557600080fd5b50565b600081519050620002c9816200029e565b92915050565b600080600080600060a08688031215620002ee57620002ed62000216565b5b6000620002fe888289016200027d565b95505060206200031188828901620002b8565b94505060406200032488828901620002b8565b93505060606200033788828901620002b8565b92505060806200034a88828901620002b8565b9150509295509295909350565b6147a580620003676000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c8063747293fb11610130578063a2ea0c10116100b8578063dd8d4c401161007c578063dd8d4c401461063f578063e2bbb1581461065d578063ee1a629514610679578063f2fde38b14610697578063f7c618c1146106b357610227565b8063a2ea0c1014610587578063aa50d351146105a5578063b0c7044b146105c1578063c372e312146105f1578063d0c9bb591461060f57610227565b80638da5cb5b116100ff5780638da5cb5b146104ba5780638dbb1e3a146104d85780638f10369a1461050857806393f1a40b1461052657806398969e821461055757610227565b8063747293fb1461045857806378e979251461047457806380dc0672146104925780638aa285501461049c57610227565b80634b47002c116101b3578063630b5ba111610182578063630b5ba1146103da57806364757332146103e45780636ccdf9ff14610402578063715018a61461043257806373566f021461043c57610227565b80634b47002c1461036857806351eb05a6146103865780635312ea8e146103a25780635ffe6146146103be57610227565b8063231a418c116101fa578063231a418c146102c85780632b8bbbe8146102f85780633279beab146103145780633bdc8a1f14610330578063441a3e701461034c57610227565b8063122058391461022c5780631526fe27146102485780631ab06ee51461027c578063225b87c414610298575b600080fd5b6102466004803603810190610241919061306c565b6106d1565b005b610262600480360381019061025d919061306c565b6106e3565b604051610273959493929190613127565b60405180910390f35b6102966004803603810190610291919061317a565b610749565b005b6102b260048036038101906102ad91906131f8565b61082d565b6040516102bf9190613325565b60405180910390f35b6102e260048036038101906102dd91906131f8565b61092b565b6040516102ef9190613362565b60405180910390f35b610312600480360381019061030d919061337d565b6109bf565b005b61032e6004803603810190610329919061306c565b610c9b565b005b61034a6004803603810190610345919061306c565b610dd1565b005b6103666004803603810190610361919061317a565b610e8b565b005b610370611200565b60405161037d91906133de565b60405180910390f35b6103a0600480360381019061039b919061306c565b611226565b005b6103bc60048036038101906103b7919061306c565b61132f565b005b6103d860048036038101906103d3919061306c565b6114d3565b005b6103e26114ed565b005b6103ec611520565b6040516103f99190613681565b60405180910390f35b61041c600480360381019061041791906136a3565b6115d1565b6040516104299190613725565b60405180910390f35b61043a611747565b005b6104566004803603810190610451919061317a565b61175b565b005b610472600480360381019061046d91906131f8565b6117c3565b005b61047c611852565b6040516104899190613740565b60405180910390f35b61049a611858565b005b6104a4611869565b6040516104b19190613740565b60405180910390f35b6104c261186f565b6040516104cf919061376a565b60405180910390f35b6104f260048036038101906104ed919061317a565b611898565b6040516104ff9190613740565b60405180910390f35b610510611915565b60405161051d9190613740565b60405180910390f35b610540600480360381019061053b919061337d565b61191b565b60405161054e929190613785565b60405180910390f35b610571600480360381019061056c919061337d565b61194c565b60405161057e9190613740565b60405180910390f35b61058f611b33565b60405161059c9190613740565b60405180910390f35b6105bf60048036038101906105ba919061306c565b611b39565b005b6105db60048036038101906105d691906131f8565b611b8e565b6040516105e89190613740565b60405180910390f35b6105f9611ba6565b6040516106069190613740565b60405180910390f35b6106296004803603810190610624919061306c565b611bac565b60405161063691906138b9565b60405180910390f35b610647611ec1565b604051610654919061398a565b60405180910390f35b6106776004803603810190610672919061317a565b611ed2565b005b61068161245e565b60405161068e9190613740565b60405180910390f35b6106b160048036038101906106ac91906131f8565b612464565b005b6106bb6124e7565b6040516106c891906139ac565b60405180910390f35b6106d961250d565b8060028190555050565b600781815481106106f357600080fd5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154905085565b61075161250d565b600160078054905061076391906139f6565b8211156107a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079c90613aad565b60405180910390fd5b6107ad6114ed565b6107f9816107eb600785815481106107c8576107c7613acd565b5b90600052602060002090600502016001015460095461258b90919063ffffffff16565b6125a190919063ffffffff16565b600981905550806007838154811061081457610813613acd565b5b9060005260206000209060050201600101819055505050565b606060008060078054905067ffffffffffffffff81111561085157610850613afc565b5b60405190808252806020026020018201604052801561088a57816020015b610877612f87565b81526020019060019003908161086f5790505b50905060005b60078054905081101561092057600781815481106108b1576108b0613acd565b5b906000526020600020906005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506108ef83866115d1565b82828151811061090257610901613acd565b5b6020026020010181905250808061091890613b2b565b915050610890565b508092505050919050565b600061093561250d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099b90613be5565b60405180910390fd5b6109b882600f6125b790919063ffffffff16565b9050919050565b6109c761250d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d90613c77565b60405180910390fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663daea85c5826040518263ffffffff1660e01b8152600401610a91919061376a565b6020604051808303816000875af1158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad49190613cac565b50610ae0600c826125e7565b15610b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1790613d4b565b60405180910390fd5b610b2b600c82612617565b50610b346114ed565b6000600a544211610b4757600a54610b49565b425b9050610b60836009546125a190919063ffffffff16565b60098190555060076040518060a001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001858152602001600081526020018381526020016000815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015550506001600780549050610c5391906139f6565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b610ca361250d565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cfe919061376a565b602060405180830381865afa158015610d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3f9190613cac565b811115610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7890613db7565b60405180910390fd5b610dce3382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126479092919063ffffffff16565b50565b610dec610ddc6126cd565b600f6125e790919063ffffffff16565b610e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2290613e23565b60405180910390fd5b600042600b5411610e3d576000610e53565b610e5242600b5461258b90919063ffffffff16565b5b90506000600454905080821015610e77578181610e7091906139f6565b9050610e7c565b600090505b610e8683826126d5565b505050565b600060078381548110610ea157610ea0613acd565b5b9060005260206000209060050201905060006008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390613eb5565b60405180910390fd5b610f5584611226565b6000610fa28260010154610f94670de0b6b3a7640000610f868760040154876000015461295690919063ffffffff16565b61296c90919063ffffffff16565b61258b90919063ffffffff16565b9050600084111561105f57610fc484836000015461258b90919063ffffffff16565b8260000181905550610fe384846002015461258b90919063ffffffff16565b836002018190555061105e600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633868660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612982909392919063ffffffff16565b5b611094670de0b6b3a76400006110868560040154856000015461295690919063ffffffff16565b61296c90919063ffffffff16565b826001018190555060008082111561115b576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611103919061376a565b602060405180830381865afa158015611120573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111449190613cac565b905082811061115557829150611159565b8091505b505b6111a83382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126479092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56886836040516111f0929190613785565b60405180910390a2505050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006007828154811061123c5761123b613acd565b5b906000526020600020906005020190508060030154421161125d575061132c565b6000816002015490506000810361127e57428260030181905550505061132c565b600061128e836003015442611898565b905060006112d16009546112c386600101546112b56003548761295690919063ffffffff16565b61295690919063ffffffff16565b61296c90919063ffffffff16565b9050611316611303846112f5670de0b6b3a76400008561295690919063ffffffff16565b61296c90919063ffffffff16565b85600401546125a190919063ffffffff16565b8460040181905550428460030181905550505050505b50565b60006007828154811061134557611344613acd565b5b9060005260206000209060050201905060006008600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905081600001548360020154106113e9576113dc8260000154846002015461258b90919063ffffffff16565b83600201819055506113f4565b600083600201819055505b600082600001819055506000826001018190555061147b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612982909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd969583600001546040516114c59190613740565b60405180910390a250505050565b6114db61250d565b6114e36114ed565b8060068190555050565b6000600780549050905060005b8181101561151c5761150b81611226565b8061151590613b2b565b90506114fa565b5050565b6060600060078054905067ffffffffffffffff81111561154357611542613afc565b5b60405190808252806020026020018201604052801561157c57816020015b611569612fa8565b8152602001906001900390816115615790505b50905060005b6007805490508110156115c95761159881611bac565b8282815181106115ab576115aa613acd565b5b602002602001018190525080806115c190613b2b565b915050611582565b508091505090565b6115d9612f87565b6000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006008600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050600061169c838661194c565b905060008673ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b81526004016116d9919061376a565b602060405180830381865afa1580156116f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171a9190613cac565b90506040518060600160405280846000015181526020018381526020018281525094505050505092915050565b61174f61250d565b6117596000612a0b565b565b6117766117666126cd565b600f6125e790919063ffffffff16565b6117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac90613e23565b60405180910390fd5b6117bf82826126d5565b5050565b6117cb61250d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361183a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183190613f47565b60405180910390fd5b61184e81600f61261790919063ffffffff16565b5050565b600a5481565b61186061250d565b42600b81905550565b60065481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600b5482116118d1576118ca6006546118bc858561258b90919063ffffffff16565b61295690919063ffffffff16565b905061190f565b600b5483106118e3576000905061190f565b61190c6006546118fe85600b5461258b90919063ffffffff16565b61295690919063ffffffff16565b90505b92915050565b60035481565b6008602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b6000600160078054905061196091906139f6565b8311156119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199990613aad565b60405180910390fd5b6000600784815481106119b8576119b7613acd565b5b9060005260206000209060050201905060006008600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600401549050600083600201549050836003015442118015611a42575060008114155b15611ae0576000611a57856003015442611898565b90506000611a9a600954611a8c8860010154611a7e6003548761295690919063ffffffff16565b61295690919063ffffffff16565b61296c90919063ffffffff16565b9050611adb611acc84611abe670de0b6b3a76400008561295690919063ffffffff16565b61296c90919063ffffffff16565b856125a190919063ffffffff16565b935050505b611b278360010154611b19670de0b6b3a7640000611b0b86886000015461295690919063ffffffff16565b61296c90919063ffffffff16565b61258b90919063ffffffff16565b94505050505092915050565b60045481565b611b4161250d565b60008111611b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7b90613fd9565b60405180910390fd5b8060048190555050565b600e6020528060005260406000206000915090505481565b60025481565b611bb4612fa8565b6007805490508210611bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf290614045565b60405180910390fd5b600060078381548110611c1157611c10613acd565b5b90600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000816000015190506000611ce2600954611cd4600354866020015161295690919063ffffffff16565b61296c90919063ffffffff16565b9050604051806101800160405280868152602001846020015181526020018460600151815260200182815260200184608001518152602001846040015181526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611d8b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611db4919061415c565b81526020018373ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611e04573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611e2d919061415c565b81526020018373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea191906141d1565b60ff168152602001600a548152602001600b548152509350505050919050565b6060611ecd600f612acf565b905090565b6001600780549050611ee491906139f6565b821115611f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1d90613aad565b60405180910390fd5b600060078381548110611f3c57611f3b613acd565b5b9060005260206000209060050201905060006008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611fa984611226565b600080826000015411156120c65760006120048360010154611ff6670de0b6b3a7640000611fe88860040154886000015461295690919063ffffffff16565b61296c90919063ffffffff16565b61258b90919063ffffffff16565b905060008111156120c4576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161206c919061376a565b602060405180830381865afa158015612089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ad9190613cac565b90508181106120be578192506120c2565b8092505b505b505b60008411156123755760008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401612150919061376a565b602060405180830381865afa15801561216d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121919190613cac565b905061220633600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16878760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612982909392919063ffffffff16565b6122d8818560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401612289919061376a565b602060405180830381865afa1580156122a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ca9190613cac565b61258b90919063ffffffff16565b94506002546122f48460000154876125a190919063ffffffff16565b1115612335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232c9061424a565b60405180910390fd5b61234c8584600001546125a190919063ffffffff16565b836000018190555061236b8585600201546125a190919063ffffffff16565b8460020181905550505b6123aa670de0b6b3a764000061239c8560040154856000015461295690919063ffffffff16565b61296c90919063ffffffff16565b82600101819055506000811115612409576124083382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126479092919063ffffffff16565b5b3373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8560405161244f9190613740565b60405180910390a25050505050565b600b5481565b61246c61250d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d2906142dc565b60405180910390fd5b6124e481612a0b565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6125156126cd565b73ffffffffffffffffffffffffffffffffffffffff1661253361186f565b73ffffffffffffffffffffffffffffffffffffffff1614612589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258090614348565b60405180910390fd5b565b6000818361259991906139f6565b905092915050565b600081836125af9190614368565b905092915050565b60006125df836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612af0565b905092915050565b600061260f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612c04565b905092915050565b600061263f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612c27565b905092915050565b6126c88363a9059cbb60e01b848460405160240161266692919061439c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612c97565b505050565b600033905090565b6126dd6114ed565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161273a919061376a565b602060405180830381865afa158015612757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277b9190613cac565b90506127d36127886126cd565b3085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612982909392919063ffffffff16565b600061288382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612834919061376a565b602060405180830381865afa158015612851573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128759190613cac565b61258b90919063ffffffff16565b9050600042600b54116128975760006128ad565b6128ac42600b5461258b90919063ffffffff16565b5b905060006128c68260035461295690919063ffffffff16565b90506128db82866125a190919063ffffffff16565b94506128f083826125a190919063ffffffff16565b9050612905858261296c90919063ffffffff16565b600381905550600a5442106129325761292785426125a190919063ffffffff16565b600b8190555061294e565b61294785600a546125a190919063ffffffff16565b600b819055505b505050505050565b6000818361296491906143c5565b905092915050565b6000818361297a9190614436565b905092915050565b612a05846323b872dd60e01b8585856040516024016129a393929190614467565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612c97565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000612adf83600001612d5e565b905060608190508092505050919050565b60008083600101600084815260200190815260200160002054905060008114612bf8576000600182612b2291906139f6565b9050600060018660000180549050612b3a91906139f6565b9050818114612ba9576000866000018281548110612b5b57612b5a613acd565b5b9060005260206000200154905080876000018481548110612b7f57612b7e613acd565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612bbd57612bbc61449e565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612bfe565b60009150505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000612c338383612c04565b612c8c578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612c91565b600090505b92915050565b6000612cf9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612dba9092919063ffffffff16565b9050600081511115612d595780806020019051810190612d1991906144f9565b612d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4f90614598565b60405180910390fd5b5b505050565b606081600001805480602002602001604051908101604052809291908181526020018280548015612dae57602002820191906000526020600020905b815481526020019060010190808311612d9a575b50505050509050919050565b6060612dc98484600085612dd2565b90509392505050565b606082471015612e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0e9061462a565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e409190614691565b60006040518083038185875af1925050503d8060008114612e7d576040519150601f19603f3d011682016040523d82523d6000602084013e612e82565b606091505b5091509150612e9387838387612e9f565b92505050949350505050565b60608315612f01576000835103612ef957612eb985612f14565b612ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eef906146f4565b60405180910390fd5b5b829050612f0c565b612f0b8383612f37565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115612f4a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7e919061474d565b60405180910390fd5b60405180606001604052806000815260200160008152602001600081525090565b604051806101800160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600060ff16815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61304981613036565b811461305457600080fd5b50565b60008135905061306681613040565b92915050565b6000602082840312156130825761308161302c565b5b600061309084828501613057565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006130de6130d96130d484613099565b6130b9565b613099565b9050919050565b60006130f0826130c3565b9050919050565b6000613102826130e5565b9050919050565b613112816130f7565b82525050565b61312181613036565b82525050565b600060a08201905061313c6000830188613109565b6131496020830187613118565b6131566040830186613118565b6131636060830185613118565b6131706080830184613118565b9695505050505050565b600080604083850312156131915761319061302c565b5b600061319f85828601613057565b92505060206131b085828601613057565b9150509250929050565b60006131c582613099565b9050919050565b6131d5816131ba565b81146131e057600080fd5b50565b6000813590506131f2816131cc565b92915050565b60006020828403121561320e5761320d61302c565b5b600061321c848285016131e3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61325a81613036565b82525050565b6060820160008201516132766000850182613251565b5060208201516132896020850182613251565b50604082015161329c6040850182613251565b50505050565b60006132ae8383613260565b60608301905092915050565b6000602082019050919050565b60006132d282613225565b6132dc8185613230565b93506132e783613241565b8060005b838110156133185781516132ff88826132a2565b975061330a836132ba565b9250506001810190506132eb565b5085935050505092915050565b6000602082019050818103600083015261333f81846132c7565b905092915050565b60008115159050919050565b61335c81613347565b82525050565b60006020820190506133776000830184613353565b92915050565b600080604083850312156133945761339361302c565b5b60006133a285828601613057565b92505060206133b3858286016131e3565b9150509250929050565b60006133c8826130e5565b9050919050565b6133d8816133bd565b82525050565b60006020820190506133f360008301846133cf565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61342e816131ba565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561346e578082015181840152602081019050613453565b60008484015250505050565b6000601f19601f8301169050919050565b600061349682613434565b6134a0818561343f565b93506134b0818560208601613450565b6134b98161347a565b840191505092915050565b600060ff82169050919050565b6134da816134c4565b82525050565b6000610180830160008301516134f96000860182613251565b50602083015161350c6020860182613251565b50604083015161351f6040860182613251565b5060608301516135326060860182613251565b5060808301516135456080860182613251565b5060a083015161355860a0860182613251565b5060c083015161356b60c0860182613425565b5060e083015184820360e0860152613583828261348b565b91505061010083015184820361010086015261359f828261348b565b9150506101208301516135b66101208601826134d1565b506101408301516135cb610140860182613251565b506101608301516135e0610160860182613251565b508091505092915050565b60006135f783836134e0565b905092915050565b6000602082019050919050565b6000613617826133f9565b6136218185613404565b93508360208202850161363385613415565b8060005b8581101561366f578484038952815161365085826135eb565b945061365b836135ff565b925060208a01995050600181019050613637565b50829750879550505050505092915050565b6000602082019050818103600083015261369b818461360c565b905092915050565b600080604083850312156136ba576136b961302c565b5b60006136c8858286016131e3565b92505060206136d9858286016131e3565b9150509250929050565b6060820160008201516136f96000850182613251565b50602082015161370c6020850182613251565b50604082015161371f6040850182613251565b50505050565b600060608201905061373a60008301846136e3565b92915050565b60006020820190506137556000830184613118565b92915050565b613764816131ba565b82525050565b600060208201905061377f600083018461375b565b92915050565b600060408201905061379a6000830185613118565b6137a76020830184613118565b9392505050565b6000610180830160008301516137c76000860182613251565b5060208301516137da6020860182613251565b5060408301516137ed6040860182613251565b5060608301516138006060860182613251565b5060808301516138136080860182613251565b5060a083015161382660a0860182613251565b5060c083015161383960c0860182613425565b5060e083015184820360e0860152613851828261348b565b91505061010083015184820361010086015261386d828261348b565b9150506101208301516138846101208601826134d1565b50610140830151613899610140860182613251565b506101608301516138ae610160860182613251565b508091505092915050565b600060208201905081810360008301526138d381846137ae565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006139138383613425565b60208301905092915050565b6000602082019050919050565b6000613937826138db565b61394181856138e6565b935061394c836138f7565b8060005b8381101561397d5781516139648882613907565b975061396f8361391f565b925050600181019050613950565b5085935050505092915050565b600060208201905081810360008301526139a4818461392c565b905092915050565b60006020820190506139c16000830184613109565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a0182613036565b9150613a0c83613036565b9250828203905081811115613a2457613a236139c7565b5b92915050565b600082825260208201905092915050565b7f446f6765426f6e7573506f6f6c3a2043616e206e6f742066696e64207468697360008201527f20706f6f6c000000000000000000000000000000000000000000000000000000602082015250565b6000613a97602583613a2a565b9150613aa282613a3b565b604082019050919050565b60006020820190508181036000830152613ac681613a8a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000613b3682613036565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b6857613b676139c7565b5b600182019050919050565b7f446f6765426f6e7573506f6f6c3a2063616c6c657220697320746865207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b6000613bcf602983613a2a565b9150613bda82613b73565b604082019050919050565b60006020820190508181036000830152613bfe81613bc2565b9050919050565b7f446f6765426f6e7573506f6f6c3a205f746f6b656e20697320746865207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b6000613c61602983613a2a565b9150613c6c82613c05565b604082019050919050565b60006020820190508181036000830152613c9081613c54565b9050919050565b600081519050613ca681613040565b92915050565b600060208284031215613cc257613cc161302c565b5b6000613cd084828501613c97565b91505092915050565b7f446f6765426f6e7573506f6f6c3a205f746f6b656e20697320616c726561647960008201527f20616464656420746f2074686520706f6f6c0000000000000000000000000000602082015250565b6000613d35603283613a2a565b9150613d4082613cd9565b604082019050919050565b60006020820190508181036000830152613d6481613d28565b9050919050565b7f446f6765426f6e7573506f6f6c3a206e6f7420656e6f75676820746f6b656e00600082015250565b6000613da1601f83613a2a565b9150613dac82613d6b565b602082019050919050565b60006020820190508181036000830152613dd081613d94565b9050919050565b7f6f6e6c7943616c6c657200000000000000000000000000000000000000000000600082015250565b6000613e0d600a83613a2a565b9150613e1882613dd7565b602082019050919050565b60006020820190508181036000830152613e3c81613e00565b9050919050565b7f446f6765426f6e7573506f6f6c3a205769746864726177207769746820696e7360008201527f756666696369656e742062616c616e6365000000000000000000000000000000602082015250565b6000613e9f603183613a2a565b9150613eaa82613e43565b604082019050919050565b60006020820190508181036000830152613ece81613e92565b9050919050565b7f446f6765426f6e7573506f6f6c3a2076616c20697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f31602683613a2a565b9150613f3c82613ed5565b604082019050919050565b60006020820190508181036000830152613f6081613f24565b9050919050565b7f446f6765426f6e7573506f6f6c3a20696e74657276616c206d7573742062652060008201527f67726561746572207468616e2030000000000000000000000000000000000000602082015250565b6000613fc3602e83613a2a565b9150613fce82613f67565b604082019050919050565b60006020820190508181036000830152613ff281613fb6565b9050919050565b7f446f6765426f6e7573506f6f6c3a20706964206f7574206f662072616e676500600082015250565b600061402f601f83613a2a565b915061403a82613ff9565b602082019050919050565b6000602082019050818103600083015261405e81614022565b9050919050565b600080fd5b600080fd5b6140788261347a565b810181811067ffffffffffffffff8211171561409757614096613afc565b5b80604052505050565b60006140aa613022565b90506140b6828261406f565b919050565b600067ffffffffffffffff8211156140d6576140d5613afc565b5b6140df8261347a565b9050602081019050919050565b60006140ff6140fa846140bb565b6140a0565b90508281526020810184848401111561411b5761411a61406a565b5b614126848285613450565b509392505050565b600082601f83011261414357614142614065565b5b81516141538482602086016140ec565b91505092915050565b6000602082840312156141725761417161302c565b5b600082015167ffffffffffffffff8111156141905761418f613031565b5b61419c8482850161412e565b91505092915050565b6141ae816134c4565b81146141b957600080fd5b50565b6000815190506141cb816141a5565b92915050565b6000602082840312156141e7576141e661302c565b5b60006141f5848285016141bc565b91505092915050565b7f446f6765426f6e7573506f6f6c3a20657863656564206d6178207374616b6500600082015250565b6000614234601f83613a2a565b915061423f826141fe565b602082019050919050565b6000602082019050818103600083015261426381614227565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142c6602683613a2a565b91506142d18261426a565b604082019050919050565b600060208201905081810360008301526142f5816142b9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614332602083613a2a565b915061433d826142fc565b602082019050919050565b6000602082019050818103600083015261436181614325565b9050919050565b600061437382613036565b915061437e83613036565b9250828201905080821115614396576143956139c7565b5b92915050565b60006040820190506143b1600083018561375b565b6143be6020830184613118565b9392505050565b60006143d082613036565b91506143db83613036565b92508282026143e981613036565b91508282048414831517614400576143ff6139c7565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061444182613036565b915061444c83613036565b92508261445c5761445b614407565b5b828204905092915050565b600060608201905061447c600083018661375b565b614489602083018561375b565b6144966040830184613118565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6144d681613347565b81146144e157600080fd5b50565b6000815190506144f3816144cd565b92915050565b60006020828403121561450f5761450e61302c565b5b600061451d848285016144e4565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614582602a83613a2a565b915061458d82614526565b604082019050919050565b600060208201905081810360008301526145b181614575565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614614602683613a2a565b915061461f826145b8565b604082019050919050565b6000602082019050818103600083015261464381614607565b9050919050565b600081519050919050565b600081905092915050565b600061466b8261464a565b6146758185614655565b9350614685818560208601613450565b80840191505092915050565b600061469d8284614660565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006146de601d83613a2a565b91506146e9826146a8565b602082019050919050565b6000602082019050818103600083015261470d816146d1565b9050919050565b600061471f82613434565b6147298185613a2a565b9350614739818560208601613450565b6147428161347a565b840191505092915050565b600060208201905081810360008301526147678184614714565b90509291505056fea264697066735822122012f272d22a27369ce7df8fd660e44248c7062d078d6415a16d0960e23110e7de64736f6c63430008130033608060405234801561001057600080fd5b5061002d61002261003260201b60201c565b61003a60201b60201c565b6100fe565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61063e8061010d6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063715018a6146100515780638da5cb5b1461005b578063daea85c514610079578063f2fde38b146100a9575b600080fd5b6100596100c5565b005b6100636100d9565b60405161007091906103be565b60405180910390f35b610093600480360381019061008e919061040a565b610102565b6040516100a09190610450565b60405180910390f35b6100c360048036038101906100be919061040a565b6101b0565b005b6100cd610233565b6100d760006102b1565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061010c610233565b8173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161016792919061046b565b6020604051808303816000875af1158015610186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101aa91906104cc565b50919050565b6101b8610233565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021e9061057c565b60405180910390fd5b610230816102b1565b50565b61023b610375565b73ffffffffffffffffffffffffffffffffffffffff166102596100d9565b73ffffffffffffffffffffffffffffffffffffffff16146102af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102a6906105e8565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103a88261037d565b9050919050565b6103b88161039d565b82525050565b60006020820190506103d360008301846103af565b92915050565b600080fd5b6103e78161039d565b81146103f257600080fd5b50565b600081359050610404816103de565b92915050565b6000602082840312156104205761041f6103d9565b5b600061042e848285016103f5565b91505092915050565b6000819050919050565b61044a81610437565b82525050565b60006020820190506104656000830184610441565b92915050565b600060408201905061048060008301856103af565b61048d6020830184610441565b9392505050565b60008115159050919050565b6104a981610494565b81146104b457600080fd5b50565b6000815190506104c6816104a0565b92915050565b6000602082840312156104e2576104e16103d9565b5b60006104f0848285016104b7565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006105666026836104f9565b91506105718261050a565b604082019050919050565b6000602082019050818103600083015261059581610559565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006105d26020836104f9565b91506105dd8261059c565b602082019050919050565b60006020820190508181036000830152610601816105c5565b905091905056fea2646970667358221220ceafb92f1b651b68031319b481dd9b2eefb18c57e22d1ec487c812eeddb8834e64736f6c63430008130033000000000000000000000000912ce59144191c1204e64559fe8253a0e49e6548000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000644d06c000000000000000000000000000000000000000000000000000000000644d06c0000000000000000000000000000fffffffffffffffffffffffffffffffffffff
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c8063747293fb11610130578063a2ea0c10116100b8578063dd8d4c401161007c578063dd8d4c401461063f578063e2bbb1581461065d578063ee1a629514610679578063f2fde38b14610697578063f7c618c1146106b357610227565b8063a2ea0c1014610587578063aa50d351146105a5578063b0c7044b146105c1578063c372e312146105f1578063d0c9bb591461060f57610227565b80638da5cb5b116100ff5780638da5cb5b146104ba5780638dbb1e3a146104d85780638f10369a1461050857806393f1a40b1461052657806398969e821461055757610227565b8063747293fb1461045857806378e979251461047457806380dc0672146104925780638aa285501461049c57610227565b80634b47002c116101b3578063630b5ba111610182578063630b5ba1146103da57806364757332146103e45780636ccdf9ff14610402578063715018a61461043257806373566f021461043c57610227565b80634b47002c1461036857806351eb05a6146103865780635312ea8e146103a25780635ffe6146146103be57610227565b8063231a418c116101fa578063231a418c146102c85780632b8bbbe8146102f85780633279beab146103145780633bdc8a1f14610330578063441a3e701461034c57610227565b8063122058391461022c5780631526fe27146102485780631ab06ee51461027c578063225b87c414610298575b600080fd5b6102466004803603810190610241919061306c565b6106d1565b005b610262600480360381019061025d919061306c565b6106e3565b604051610273959493929190613127565b60405180910390f35b6102966004803603810190610291919061317a565b610749565b005b6102b260048036038101906102ad91906131f8565b61082d565b6040516102bf9190613325565b60405180910390f35b6102e260048036038101906102dd91906131f8565b61092b565b6040516102ef9190613362565b60405180910390f35b610312600480360381019061030d919061337d565b6109bf565b005b61032e6004803603810190610329919061306c565b610c9b565b005b61034a6004803603810190610345919061306c565b610dd1565b005b6103666004803603810190610361919061317a565b610e8b565b005b610370611200565b60405161037d91906133de565b60405180910390f35b6103a0600480360381019061039b919061306c565b611226565b005b6103bc60048036038101906103b7919061306c565b61132f565b005b6103d860048036038101906103d3919061306c565b6114d3565b005b6103e26114ed565b005b6103ec611520565b6040516103f99190613681565b60405180910390f35b61041c600480360381019061041791906136a3565b6115d1565b6040516104299190613725565b60405180910390f35b61043a611747565b005b6104566004803603810190610451919061317a565b61175b565b005b610472600480360381019061046d91906131f8565b6117c3565b005b61047c611852565b6040516104899190613740565b60405180910390f35b61049a611858565b005b6104a4611869565b6040516104b19190613740565b60405180910390f35b6104c261186f565b6040516104cf919061376a565b60405180910390f35b6104f260048036038101906104ed919061317a565b611898565b6040516104ff9190613740565b60405180910390f35b610510611915565b60405161051d9190613740565b60405180910390f35b610540600480360381019061053b919061337d565b61191b565b60405161054e929190613785565b60405180910390f35b610571600480360381019061056c919061337d565b61194c565b60405161057e9190613740565b60405180910390f35b61058f611b33565b60405161059c9190613740565b60405180910390f35b6105bf60048036038101906105ba919061306c565b611b39565b005b6105db60048036038101906105d691906131f8565b611b8e565b6040516105e89190613740565b60405180910390f35b6105f9611ba6565b6040516106069190613740565b60405180910390f35b6106296004803603810190610624919061306c565b611bac565b60405161063691906138b9565b60405180910390f35b610647611ec1565b604051610654919061398a565b60405180910390f35b6106776004803603810190610672919061317a565b611ed2565b005b61068161245e565b60405161068e9190613740565b60405180910390f35b6106b160048036038101906106ac91906131f8565b612464565b005b6106bb6124e7565b6040516106c891906139ac565b60405180910390f35b6106d961250d565b8060028190555050565b600781815481106106f357600080fd5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154905085565b61075161250d565b600160078054905061076391906139f6565b8211156107a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079c90613aad565b60405180910390fd5b6107ad6114ed565b6107f9816107eb600785815481106107c8576107c7613acd565b5b90600052602060002090600502016001015460095461258b90919063ffffffff16565b6125a190919063ffffffff16565b600981905550806007838154811061081457610813613acd565b5b9060005260206000209060050201600101819055505050565b606060008060078054905067ffffffffffffffff81111561085157610850613afc565b5b60405190808252806020026020018201604052801561088a57816020015b610877612f87565b81526020019060019003908161086f5790505b50905060005b60078054905081101561092057600781815481106108b1576108b0613acd565b5b906000526020600020906005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506108ef83866115d1565b82828151811061090257610901613acd565b5b6020026020010181905250808061091890613b2b565b915050610890565b508092505050919050565b600061093561250d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099b90613be5565b60405180910390fd5b6109b882600f6125b790919063ffffffff16565b9050919050565b6109c761250d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d90613c77565b60405180910390fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663daea85c5826040518263ffffffff1660e01b8152600401610a91919061376a565b6020604051808303816000875af1158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad49190613cac565b50610ae0600c826125e7565b15610b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1790613d4b565b60405180910390fd5b610b2b600c82612617565b50610b346114ed565b6000600a544211610b4757600a54610b49565b425b9050610b60836009546125a190919063ffffffff16565b60098190555060076040518060a001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001858152602001600081526020018381526020016000815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015550506001600780549050610c5391906139f6565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b610ca361250d565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cfe919061376a565b602060405180830381865afa158015610d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3f9190613cac565b811115610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7890613db7565b60405180910390fd5b610dce3382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126479092919063ffffffff16565b50565b610dec610ddc6126cd565b600f6125e790919063ffffffff16565b610e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2290613e23565b60405180910390fd5b600042600b5411610e3d576000610e53565b610e5242600b5461258b90919063ffffffff16565b5b90506000600454905080821015610e77578181610e7091906139f6565b9050610e7c565b600090505b610e8683826126d5565b505050565b600060078381548110610ea157610ea0613acd565b5b9060005260206000209060050201905060006008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390613eb5565b60405180910390fd5b610f5584611226565b6000610fa28260010154610f94670de0b6b3a7640000610f868760040154876000015461295690919063ffffffff16565b61296c90919063ffffffff16565b61258b90919063ffffffff16565b9050600084111561105f57610fc484836000015461258b90919063ffffffff16565b8260000181905550610fe384846002015461258b90919063ffffffff16565b836002018190555061105e600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633868660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612982909392919063ffffffff16565b5b611094670de0b6b3a76400006110868560040154856000015461295690919063ffffffff16565b61296c90919063ffffffff16565b826001018190555060008082111561115b576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611103919061376a565b602060405180830381865afa158015611120573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111449190613cac565b905082811061115557829150611159565b8091505b505b6111a83382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126479092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56886836040516111f0929190613785565b60405180910390a2505050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006007828154811061123c5761123b613acd565b5b906000526020600020906005020190508060030154421161125d575061132c565b6000816002015490506000810361127e57428260030181905550505061132c565b600061128e836003015442611898565b905060006112d16009546112c386600101546112b56003548761295690919063ffffffff16565b61295690919063ffffffff16565b61296c90919063ffffffff16565b9050611316611303846112f5670de0b6b3a76400008561295690919063ffffffff16565b61296c90919063ffffffff16565b85600401546125a190919063ffffffff16565b8460040181905550428460030181905550505050505b50565b60006007828154811061134557611344613acd565b5b9060005260206000209060050201905060006008600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905081600001548360020154106113e9576113dc8260000154846002015461258b90919063ffffffff16565b83600201819055506113f4565b600083600201819055505b600082600001819055506000826001018190555061147b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612982909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd969583600001546040516114c59190613740565b60405180910390a250505050565b6114db61250d565b6114e36114ed565b8060068190555050565b6000600780549050905060005b8181101561151c5761150b81611226565b8061151590613b2b565b90506114fa565b5050565b6060600060078054905067ffffffffffffffff81111561154357611542613afc565b5b60405190808252806020026020018201604052801561157c57816020015b611569612fa8565b8152602001906001900390816115615790505b50905060005b6007805490508110156115c95761159881611bac565b8282815181106115ab576115aa613acd565b5b602002602001018190525080806115c190613b2b565b915050611582565b508091505090565b6115d9612f87565b6000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006008600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050600061169c838661194c565b905060008673ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b81526004016116d9919061376a565b602060405180830381865afa1580156116f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171a9190613cac565b90506040518060600160405280846000015181526020018381526020018281525094505050505092915050565b61174f61250d565b6117596000612a0b565b565b6117766117666126cd565b600f6125e790919063ffffffff16565b6117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac90613e23565b60405180910390fd5b6117bf82826126d5565b5050565b6117cb61250d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361183a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183190613f47565b60405180910390fd5b61184e81600f61261790919063ffffffff16565b5050565b600a5481565b61186061250d565b42600b81905550565b60065481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600b5482116118d1576118ca6006546118bc858561258b90919063ffffffff16565b61295690919063ffffffff16565b905061190f565b600b5483106118e3576000905061190f565b61190c6006546118fe85600b5461258b90919063ffffffff16565b61295690919063ffffffff16565b90505b92915050565b60035481565b6008602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b6000600160078054905061196091906139f6565b8311156119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199990613aad565b60405180910390fd5b6000600784815481106119b8576119b7613acd565b5b9060005260206000209060050201905060006008600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600401549050600083600201549050836003015442118015611a42575060008114155b15611ae0576000611a57856003015442611898565b90506000611a9a600954611a8c8860010154611a7e6003548761295690919063ffffffff16565b61295690919063ffffffff16565b61296c90919063ffffffff16565b9050611adb611acc84611abe670de0b6b3a76400008561295690919063ffffffff16565b61296c90919063ffffffff16565b856125a190919063ffffffff16565b935050505b611b278360010154611b19670de0b6b3a7640000611b0b86886000015461295690919063ffffffff16565b61296c90919063ffffffff16565b61258b90919063ffffffff16565b94505050505092915050565b60045481565b611b4161250d565b60008111611b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7b90613fd9565b60405180910390fd5b8060048190555050565b600e6020528060005260406000206000915090505481565b60025481565b611bb4612fa8565b6007805490508210611bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf290614045565b60405180910390fd5b600060078381548110611c1157611c10613acd565b5b90600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000816000015190506000611ce2600954611cd4600354866020015161295690919063ffffffff16565b61296c90919063ffffffff16565b9050604051806101800160405280868152602001846020015181526020018460600151815260200182815260200184608001518152602001846040015181526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611d8b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611db4919061415c565b81526020018373ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611e04573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611e2d919061415c565b81526020018373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea191906141d1565b60ff168152602001600a548152602001600b548152509350505050919050565b6060611ecd600f612acf565b905090565b6001600780549050611ee491906139f6565b821115611f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1d90613aad565b60405180910390fd5b600060078381548110611f3c57611f3b613acd565b5b9060005260206000209060050201905060006008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611fa984611226565b600080826000015411156120c65760006120048360010154611ff6670de0b6b3a7640000611fe88860040154886000015461295690919063ffffffff16565b61296c90919063ffffffff16565b61258b90919063ffffffff16565b905060008111156120c4576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161206c919061376a565b602060405180830381865afa158015612089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ad9190613cac565b90508181106120be578192506120c2565b8092505b505b505b60008411156123755760008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401612150919061376a565b602060405180830381865afa15801561216d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121919190613cac565b905061220633600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16878760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612982909392919063ffffffff16565b6122d8818560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401612289919061376a565b602060405180830381865afa1580156122a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ca9190613cac565b61258b90919063ffffffff16565b94506002546122f48460000154876125a190919063ffffffff16565b1115612335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232c9061424a565b60405180910390fd5b61234c8584600001546125a190919063ffffffff16565b836000018190555061236b8585600201546125a190919063ffffffff16565b8460020181905550505b6123aa670de0b6b3a764000061239c8560040154856000015461295690919063ffffffff16565b61296c90919063ffffffff16565b82600101819055506000811115612409576124083382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126479092919063ffffffff16565b5b3373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8560405161244f9190613740565b60405180910390a25050505050565b600b5481565b61246c61250d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d2906142dc565b60405180910390fd5b6124e481612a0b565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6125156126cd565b73ffffffffffffffffffffffffffffffffffffffff1661253361186f565b73ffffffffffffffffffffffffffffffffffffffff1614612589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258090614348565b60405180910390fd5b565b6000818361259991906139f6565b905092915050565b600081836125af9190614368565b905092915050565b60006125df836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612af0565b905092915050565b600061260f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612c04565b905092915050565b600061263f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612c27565b905092915050565b6126c88363a9059cbb60e01b848460405160240161266692919061439c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612c97565b505050565b600033905090565b6126dd6114ed565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161273a919061376a565b602060405180830381865afa158015612757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277b9190613cac565b90506127d36127886126cd565b3085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612982909392919063ffffffff16565b600061288382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612834919061376a565b602060405180830381865afa158015612851573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128759190613cac565b61258b90919063ffffffff16565b9050600042600b54116128975760006128ad565b6128ac42600b5461258b90919063ffffffff16565b5b905060006128c68260035461295690919063ffffffff16565b90506128db82866125a190919063ffffffff16565b94506128f083826125a190919063ffffffff16565b9050612905858261296c90919063ffffffff16565b600381905550600a5442106129325761292785426125a190919063ffffffff16565b600b8190555061294e565b61294785600a546125a190919063ffffffff16565b600b819055505b505050505050565b6000818361296491906143c5565b905092915050565b6000818361297a9190614436565b905092915050565b612a05846323b872dd60e01b8585856040516024016129a393929190614467565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612c97565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000612adf83600001612d5e565b905060608190508092505050919050565b60008083600101600084815260200190815260200160002054905060008114612bf8576000600182612b2291906139f6565b9050600060018660000180549050612b3a91906139f6565b9050818114612ba9576000866000018281548110612b5b57612b5a613acd565b5b9060005260206000200154905080876000018481548110612b7f57612b7e613acd565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612bbd57612bbc61449e565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612bfe565b60009150505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000612c338383612c04565b612c8c578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612c91565b600090505b92915050565b6000612cf9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612dba9092919063ffffffff16565b9050600081511115612d595780806020019051810190612d1991906144f9565b612d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4f90614598565b60405180910390fd5b5b505050565b606081600001805480602002602001604051908101604052809291908181526020018280548015612dae57602002820191906000526020600020905b815481526020019060010190808311612d9a575b50505050509050919050565b6060612dc98484600085612dd2565b90509392505050565b606082471015612e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0e9061462a565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e409190614691565b60006040518083038185875af1925050503d8060008114612e7d576040519150601f19603f3d011682016040523d82523d6000602084013e612e82565b606091505b5091509150612e9387838387612e9f565b92505050949350505050565b60608315612f01576000835103612ef957612eb985612f14565b612ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eef906146f4565b60405180910390fd5b5b829050612f0c565b612f0b8383612f37565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115612f4a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7e919061474d565b60405180910390fd5b60405180606001604052806000815260200160008152602001600081525090565b604051806101800160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600060ff16815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61304981613036565b811461305457600080fd5b50565b60008135905061306681613040565b92915050565b6000602082840312156130825761308161302c565b5b600061309084828501613057565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006130de6130d96130d484613099565b6130b9565b613099565b9050919050565b60006130f0826130c3565b9050919050565b6000613102826130e5565b9050919050565b613112816130f7565b82525050565b61312181613036565b82525050565b600060a08201905061313c6000830188613109565b6131496020830187613118565b6131566040830186613118565b6131636060830185613118565b6131706080830184613118565b9695505050505050565b600080604083850312156131915761319061302c565b5b600061319f85828601613057565b92505060206131b085828601613057565b9150509250929050565b60006131c582613099565b9050919050565b6131d5816131ba565b81146131e057600080fd5b50565b6000813590506131f2816131cc565b92915050565b60006020828403121561320e5761320d61302c565b5b600061321c848285016131e3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61325a81613036565b82525050565b6060820160008201516132766000850182613251565b5060208201516132896020850182613251565b50604082015161329c6040850182613251565b50505050565b60006132ae8383613260565b60608301905092915050565b6000602082019050919050565b60006132d282613225565b6132dc8185613230565b93506132e783613241565b8060005b838110156133185781516132ff88826132a2565b975061330a836132ba565b9250506001810190506132eb565b5085935050505092915050565b6000602082019050818103600083015261333f81846132c7565b905092915050565b60008115159050919050565b61335c81613347565b82525050565b60006020820190506133776000830184613353565b92915050565b600080604083850312156133945761339361302c565b5b60006133a285828601613057565b92505060206133b3858286016131e3565b9150509250929050565b60006133c8826130e5565b9050919050565b6133d8816133bd565b82525050565b60006020820190506133f360008301846133cf565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61342e816131ba565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561346e578082015181840152602081019050613453565b60008484015250505050565b6000601f19601f8301169050919050565b600061349682613434565b6134a0818561343f565b93506134b0818560208601613450565b6134b98161347a565b840191505092915050565b600060ff82169050919050565b6134da816134c4565b82525050565b6000610180830160008301516134f96000860182613251565b50602083015161350c6020860182613251565b50604083015161351f6040860182613251565b5060608301516135326060860182613251565b5060808301516135456080860182613251565b5060a083015161355860a0860182613251565b5060c083015161356b60c0860182613425565b5060e083015184820360e0860152613583828261348b565b91505061010083015184820361010086015261359f828261348b565b9150506101208301516135b66101208601826134d1565b506101408301516135cb610140860182613251565b506101608301516135e0610160860182613251565b508091505092915050565b60006135f783836134e0565b905092915050565b6000602082019050919050565b6000613617826133f9565b6136218185613404565b93508360208202850161363385613415565b8060005b8581101561366f578484038952815161365085826135eb565b945061365b836135ff565b925060208a01995050600181019050613637565b50829750879550505050505092915050565b6000602082019050818103600083015261369b818461360c565b905092915050565b600080604083850312156136ba576136b961302c565b5b60006136c8858286016131e3565b92505060206136d9858286016131e3565b9150509250929050565b6060820160008201516136f96000850182613251565b50602082015161370c6020850182613251565b50604082015161371f6040850182613251565b50505050565b600060608201905061373a60008301846136e3565b92915050565b60006020820190506137556000830184613118565b92915050565b613764816131ba565b82525050565b600060208201905061377f600083018461375b565b92915050565b600060408201905061379a6000830185613118565b6137a76020830184613118565b9392505050565b6000610180830160008301516137c76000860182613251565b5060208301516137da6020860182613251565b5060408301516137ed6040860182613251565b5060608301516138006060860182613251565b5060808301516138136080860182613251565b5060a083015161382660a0860182613251565b5060c083015161383960c0860182613425565b5060e083015184820360e0860152613851828261348b565b91505061010083015184820361010086015261386d828261348b565b9150506101208301516138846101208601826134d1565b50610140830151613899610140860182613251565b506101608301516138ae610160860182613251565b508091505092915050565b600060208201905081810360008301526138d381846137ae565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006139138383613425565b60208301905092915050565b6000602082019050919050565b6000613937826138db565b61394181856138e6565b935061394c836138f7565b8060005b8381101561397d5781516139648882613907565b975061396f8361391f565b925050600181019050613950565b5085935050505092915050565b600060208201905081810360008301526139a4818461392c565b905092915050565b60006020820190506139c16000830184613109565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a0182613036565b9150613a0c83613036565b9250828203905081811115613a2457613a236139c7565b5b92915050565b600082825260208201905092915050565b7f446f6765426f6e7573506f6f6c3a2043616e206e6f742066696e64207468697360008201527f20706f6f6c000000000000000000000000000000000000000000000000000000602082015250565b6000613a97602583613a2a565b9150613aa282613a3b565b604082019050919050565b60006020820190508181036000830152613ac681613a8a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000613b3682613036565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b6857613b676139c7565b5b600182019050919050565b7f446f6765426f6e7573506f6f6c3a2063616c6c657220697320746865207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b6000613bcf602983613a2a565b9150613bda82613b73565b604082019050919050565b60006020820190508181036000830152613bfe81613bc2565b9050919050565b7f446f6765426f6e7573506f6f6c3a205f746f6b656e20697320746865207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b6000613c61602983613a2a565b9150613c6c82613c05565b604082019050919050565b60006020820190508181036000830152613c9081613c54565b9050919050565b600081519050613ca681613040565b92915050565b600060208284031215613cc257613cc161302c565b5b6000613cd084828501613c97565b91505092915050565b7f446f6765426f6e7573506f6f6c3a205f746f6b656e20697320616c726561647960008201527f20616464656420746f2074686520706f6f6c0000000000000000000000000000602082015250565b6000613d35603283613a2a565b9150613d4082613cd9565b604082019050919050565b60006020820190508181036000830152613d6481613d28565b9050919050565b7f446f6765426f6e7573506f6f6c3a206e6f7420656e6f75676820746f6b656e00600082015250565b6000613da1601f83613a2a565b9150613dac82613d6b565b602082019050919050565b60006020820190508181036000830152613dd081613d94565b9050919050565b7f6f6e6c7943616c6c657200000000000000000000000000000000000000000000600082015250565b6000613e0d600a83613a2a565b9150613e1882613dd7565b602082019050919050565b60006020820190508181036000830152613e3c81613e00565b9050919050565b7f446f6765426f6e7573506f6f6c3a205769746864726177207769746820696e7360008201527f756666696369656e742062616c616e6365000000000000000000000000000000602082015250565b6000613e9f603183613a2a565b9150613eaa82613e43565b604082019050919050565b60006020820190508181036000830152613ece81613e92565b9050919050565b7f446f6765426f6e7573506f6f6c3a2076616c20697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f31602683613a2a565b9150613f3c82613ed5565b604082019050919050565b60006020820190508181036000830152613f6081613f24565b9050919050565b7f446f6765426f6e7573506f6f6c3a20696e74657276616c206d7573742062652060008201527f67726561746572207468616e2030000000000000000000000000000000000000602082015250565b6000613fc3602e83613a2a565b9150613fce82613f67565b604082019050919050565b60006020820190508181036000830152613ff281613fb6565b9050919050565b7f446f6765426f6e7573506f6f6c3a20706964206f7574206f662072616e676500600082015250565b600061402f601f83613a2a565b915061403a82613ff9565b602082019050919050565b6000602082019050818103600083015261405e81614022565b9050919050565b600080fd5b600080fd5b6140788261347a565b810181811067ffffffffffffffff8211171561409757614096613afc565b5b80604052505050565b60006140aa613022565b90506140b6828261406f565b919050565b600067ffffffffffffffff8211156140d6576140d5613afc565b5b6140df8261347a565b9050602081019050919050565b60006140ff6140fa846140bb565b6140a0565b90508281526020810184848401111561411b5761411a61406a565b5b614126848285613450565b509392505050565b600082601f83011261414357614142614065565b5b81516141538482602086016140ec565b91505092915050565b6000602082840312156141725761417161302c565b5b600082015167ffffffffffffffff8111156141905761418f613031565b5b61419c8482850161412e565b91505092915050565b6141ae816134c4565b81146141b957600080fd5b50565b6000815190506141cb816141a5565b92915050565b6000602082840312156141e7576141e661302c565b5b60006141f5848285016141bc565b91505092915050565b7f446f6765426f6e7573506f6f6c3a20657863656564206d6178207374616b6500600082015250565b6000614234601f83613a2a565b915061423f826141fe565b602082019050919050565b6000602082019050818103600083015261426381614227565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142c6602683613a2a565b91506142d18261426a565b604082019050919050565b600060208201905081810360008301526142f5816142b9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614332602083613a2a565b915061433d826142fc565b602082019050919050565b6000602082019050818103600083015261436181614325565b9050919050565b600061437382613036565b915061437e83613036565b9250828201905080821115614396576143956139c7565b5b92915050565b60006040820190506143b1600083018561375b565b6143be6020830184613118565b9392505050565b60006143d082613036565b91506143db83613036565b92508282026143e981613036565b91508282048414831517614400576143ff6139c7565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061444182613036565b915061444c83613036565b92508261445c5761445b614407565b5b828204905092915050565b600060608201905061447c600083018661375b565b614489602083018561375b565b6144966040830184613118565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6144d681613347565b81146144e157600080fd5b50565b6000815190506144f3816144cd565b92915050565b60006020828403121561450f5761450e61302c565b5b600061451d848285016144e4565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614582602a83613a2a565b915061458d82614526565b604082019050919050565b600060208201905081810360008301526145b181614575565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614614602683613a2a565b915061461f826145b8565b604082019050919050565b6000602082019050818103600083015261464381614607565b9050919050565b600081519050919050565b600081905092915050565b600061466b8261464a565b6146758185614655565b9350614685818560208601613450565b80840191505092915050565b600061469d8284614660565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006146de601d83613a2a565b91506146e9826146a8565b602082019050919050565b6000602082019050818103600083015261470d816146d1565b9050919050565b600061471f82613434565b6147298185613a2a565b9350614739818560208601613450565b6147428161347a565b840191505092915050565b600060208201905081810360008301526147678184614714565b90509291505056fea264697066735822122012f272d22a27369ce7df8fd660e44248c7062d078d6415a16d0960e23110e7de64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000912ce59144191c1204e64559fe8253a0e49e6548000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000644d06c000000000000000000000000000000000000000000000000000000000644d06c0000000000000000000000000000fffffffffffffffffffffffffffffffffffff
-----Decoded View---------------
Arg [0] : _rewardToken (address): 0x912CE59144191C1204E64559FE8253a0e49E6548
Arg [1] : _rewardPerSecond (uint256): 0
Arg [2] : _startTime (uint256): 1682769600
Arg [3] : _bonusEndTime (uint256): 1682769600
Arg [4] : _maxStakingPerUser (uint256): 356811923176489970264571492362373784095686655
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000912ce59144191c1204e64559fe8253a0e49e6548
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 00000000000000000000000000000000000000000000000000000000644d06c0
Arg [3] : 00000000000000000000000000000000000000000000000000000000644d06c0
Arg [4] : 000000000000000000000000000fffffffffffffffffffffffffffffffffffff
Deployed Bytecode Sourcemap
59718:14196:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64037:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61195:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;63535:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72923:374;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73479:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62649:878;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70899:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67608:465;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69155:1126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61116:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65226:684;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70289:602;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63878:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65918:180;;;:::i;:::-;;72117:276;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72401:514;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44534:103;;;:::i;:::-;;68081:154;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73305:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61343:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62198:88;;;:::i;:::-;;61151:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43886:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62294:347;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61026:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61228:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;64365:853;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61063:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64153:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61454:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60987:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71149:960;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73688:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66106:1494;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61374:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44792:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60955:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64037:108;43772:13;:11;:13::i;:::-;64131:6:::1;64111:17;:26;;;;64037:108:::0;:::o;61195:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63535:335::-;43772:13;:11;:13::i;:::-;63645:1:::1;63627:8;:15;;;;:19;;;;:::i;:::-;63619:4;:27;;63611:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;63701:17;:15;:17::i;:::-;63749:63;63800:11;63749:46;63769:8;63778:4;63769:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;;63749:15;;:19;;:46;;;;:::i;:::-;:50;;:63;;;;:::i;:::-;63731:15;:81;;;;63851:11;63823:8;63832:4;63823:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;:39;;;;63535:335:::0;;:::o;72923:374::-;72985:17;73015:13;73039:23;73080:8;:15;;;;73065:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;73039:57;;73112:9;73107:160;73131:8;:15;;;;73127:1;:19;73107:160;;;73184:8;73193:1;73184:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:17;;;;;;;;;;;;73168:34;;73228:27;73240:5;73247:7;73228:11;:27::i;:::-;73217:5;73223:1;73217:8;;;;;;;;:::i;:::-;;;;;;;:38;;;;73148:3;;;;;:::i;:::-;;;;73107:160;;;;73284:5;73277:12;;;;72923:374;;;:::o;73479:201::-;73540:4;43772:13;:11;:13::i;:::-;73583:1:::1;73565:20;;:6;:20;;::::0;73557:74:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;73649:23;73665:6;73649:8;:15;;:23;;;;:::i;:::-;73642:30;;73479:201:::0;;;:::o;62649:878::-;43772:13;:11;:13::i;:::-;62753:1:::1;62735:20;;:6;:20;;::::0;62727:74:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;62812:9;;;;;;;;;;;:17;;;62838:6;62812:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;62868:38;62891:6;62899;62868:22;:38::i;:::-;62867:39;62859:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;62972:33;62990:6;62998;62972:17;:33::i;:::-;;63018:17;:15;:17::i;:::-;63048:22;63091:9;;63073:15;:27;:57;;63121:9;;63073:57;;;63103:15;63073:57;63048:82;;63159:32;63179:11;63159:15;;:19;;:32;;;;:::i;:::-;63141:15;:50;;;;63202:8;63230:230;;;;;;;;63272:6;63230:230;;;;;;63310:11;63230:230;;;;63354:1;63230:230;;;;63390:14;63230:230;;;;63443:1;63230:230;;::::0;63202:269:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63518:1;63500:8;:15;;;;:19;;;;:::i;:::-;63482:7;:15;63490:6;63482:15;;;;;;;;;;;;;;;:37;;;;62716:811;62649:878:::0;;:::o;70899:242::-;43772:13;:11;:13::i;:::-;70996:11:::1;;;;;;;;;;;:21;;;71026:4;70996:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70985:7;:47;;70977:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;71079:54;71112:10;71125:7;71079:11;;;;;;;;;;;:24;;;;:54;;;;;:::i;:::-;70899:242:::0;:::o;67608:465::-;73845:31;73863:12;:10;:12::i;:::-;73845:8;:17;;:31;;;;:::i;:::-;73837:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;67676:24:::1;67718:15;67703:12;;:30;:70;;67772:1;67703:70;;;67736:33;67753:15;67736:12;;:16;;:33;;;;:::i;:::-;67703:70;67676:97;;67784:22;67809;;67784:47;;67865:14;67846:16;:33;67842:167;;;67930:16;67913:14;:33;;;;:::i;:::-;67896:50;;67842:167;;;67996:1;67979:18;;67842:167;68019:46;68042:6;68050:14;68019:22;:46::i;:::-;67665:408;;67608:465:::0;:::o;69155:1126::-;69222:21;69246:8;69255:4;69246:14;;;;;;;;:::i;:::-;;;;;;;;;;;;69222:38;;69271:21;69295:8;:14;69304:4;69295:14;;;;;;;;;;;:26;69310:10;69295:26;;;;;;;;;;;;;;;69271:50;;69355:7;69340:4;:11;;;:22;;69332:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;69429:16;69440:4;69429:10;:16::i;:::-;69458:15;69476:71;69531:4;:15;;;69476:50;69521:4;69476:40;69492:4;:23;;;69476:4;:11;;;:15;;:40;;;;:::i;:::-;:44;;:50;;;;:::i;:::-;:54;;:71;;;;:::i;:::-;69458:89;;69581:1;69571:7;:11;69568:238;;;69613:24;69629:7;69613:4;:11;;;:15;;:24;;;;:::i;:::-;69599:4;:11;;:38;;;;69672:30;69694:7;69672:4;:17;;;:21;;:30;;;;:::i;:::-;69652:4;:17;;:50;;;;69717:77;69753:9;;;;;;;;;;;69773:10;69786:7;69717:4;:10;;;;;;;;;;;;:27;;;;:77;;;;;;:::i;:::-;69568:238;69834:50;69879:4;69834:40;69850:4;:23;;;69834:4;:11;;;:15;;:40;;;;:::i;:::-;:44;;:50;;;;:::i;:::-;69816:4;:15;;:68;;;;69897:15;69936:1;69926:7;:11;69923:232;;;69954:11;69968;;;;;;;;;;;:21;;;69998:4;69968:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69954:50;;70029:7;70022:3;:14;70019:125;;70067:7;70057:17;;70019:125;;;70125:3;70115:13;;70019:125;69939:216;69923:232;70165:54;70198:10;70211:7;70165:11;;;;;;;;;;;:24;;;;:54;;;;;:::i;:::-;70244:10;70235:38;;;70256:7;70265;70235:38;;;;;;;:::i;:::-;;;;;;;;69211:1070;;;;69155:1126;;:::o;61116:26::-;;;;;;;;;;;;;:::o;65226:684::-;65278:21;65302:8;65311:4;65302:14;;;;;;;;:::i;:::-;;;;;;;;;;;;65278:38;;65350:4;:19;;;65331:15;:38;65327:77;;65386:7;;;65327:77;65414:16;65433:4;:17;;;65414:36;;65477:1;65465:8;:13;65461:104;;65517:15;65495:4;:19;;:37;;;;65547:7;;;;65461:104;65575:18;65596:51;65610:4;:19;;;65631:15;65596:13;:51::i;:::-;65575:72;;65658:19;65680:73;65737:15;;65680:52;65716:4;:15;;;65680:31;65695:15;;65680:10;:14;;:31;;;;:::i;:::-;:35;;:52;;;;:::i;:::-;:56;;:73;;;;:::i;:::-;65658:95;;65790:64;65818:35;65844:8;65818:21;65834:4;65818:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;65790:4;:23;;;:27;;:64;;;;:::i;:::-;65764:4;:23;;:90;;;;65887:15;65865:4;:19;;:37;;;;65267:643;;;;65226:684;;:::o;70289:602::-;70348:21;70372:8;70381:4;70372:14;;;;;;;;:::i;:::-;;;;;;;;;;;;70348:38;;70397:21;70421:8;:14;70430:4;70421:14;;;;;;;;;;;:26;70436:10;70421:26;;;;;;;;;;;;;;;70397:50;;70460:14;70477:4;:11;;;70460:28;;70533:4;:11;;;70512:4;:17;;;:32;70509:172;;70581:34;70603:4;:11;;;70581:4;:17;;;:21;;:34;;;;:::i;:::-;70561:4;:17;;:54;;;;70509:172;;;70668:1;70648:4;:17;;:21;;;;70509:172;70705:1;70691:4;:11;;:15;;;;70735:1;70717:4;:15;;:19;;;;70749:76;70785:9;;;;;;;;;;;70805:10;70818:6;70749:4;:10;;;;;;;;;;;;:27;;;;:76;;;;;;:::i;:::-;70859:10;70841:42;;;70871:4;:11;;;70841:42;;;;;;:::i;:::-;;;;;;;;70337:554;;;70289:602;:::o;63878:151::-;43772:13;:11;:13::i;:::-;63958:17:::1;:15;:17::i;:::-;64005:16;63986;:35;;;;63878:151:::0;:::o;65918:180::-;65963:14;65980:8;:15;;;;65963:32;;66011:11;66006:85;66034:6;66028:3;:12;66006:85;;;66064:15;66075:3;66064:10;:15::i;:::-;66042:5;;;;:::i;:::-;;;66006:85;;;;65952:146;65918:180::o;72117:276::-;72167:17;72197:23;72238:8;:15;;;;72223:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;72197:57;;72270:9;72265:98;72289:8;:15;;;;72285:1;:19;72265:98;;;72337:14;72349:1;72337:11;:14::i;:::-;72326:5;72332:1;72326:8;;;;;;;;:::i;:::-;;;;;;;:25;;;;72306:3;;;;;:::i;:::-;;;;72265:98;;;;72380:5;72373:12;;;72117:276;:::o;72401:514::-;72475:15;;:::i;:::-;72503:11;72517:7;:14;72525:5;72517:14;;;;;;;;;;;;;;;;72503:28;;72542:20;72565:8;:13;72574:3;72565:13;;;;;;;;;;;:22;72579:7;72565:22;;;;;;;;;;;;;;;72542:45;;;;;;;;;;;;;;;;;;;;;;;;;;;72598:24;72625:27;72639:3;72644:7;72625:13;:27::i;:::-;72598:54;;72663:17;72690:5;72683:23;;;72707:7;72683:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72663:52;;72746:161;;;;;;;;72788:4;:11;;;72746:161;;;;72836:16;72746:161;;;;72882:9;72746:161;;;72726:181;;;;;;72401:514;;;;:::o;44534:103::-;43772:13;:11;:13::i;:::-;44599:30:::1;44626:1;44599:18;:30::i;:::-;44534:103::o:0;68081:154::-;73845:31;73863:12;:10;:12::i;:::-;73845:8;:17;;:31;;;;:::i;:::-;73837:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;68181:46:::1;68204:6;68212:14;68181:22;:46::i;:::-;68081:154:::0;;:::o;73305:166::-;43772:13;:11;:13::i;:::-;73390:1:::1;73375:17;;:3;:17;;::::0;73367:68:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;73446:17;73459:3;73446:8;:12;;:17;;;;:::i;:::-;;73305:166:::0;:::o;61343:24::-;;;;:::o;62198:88::-;43772:13;:11;:13::i;:::-;62263:15:::1;62248:12;:30;;;;62198:88::o:0;61151:35::-;;;;:::o;43886:87::-;43932:7;43959:6;;;;;;;;;;;43952:13;;43886:87;:::o;62294:347::-;62366:7;62397:12;;62390:3;:19;62386:248;;62433:36;62452:16;;62433:14;62441:5;62433:3;:7;;:14;;;;:::i;:::-;:18;;:36;;;;:::i;:::-;62426:43;;;;62386:248;62500:12;;62491:5;:21;62487:147;;62536:1;62529:8;;;;62487:147;62577:45;62605:16;;62577:23;62594:5;62577:12;;:16;;:23;;;;:::i;:::-;:27;;:45;;;;:::i;:::-;62570:52;;62294:347;;;;;:::o;61026:30::-;;;;:::o;61228:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64365:853::-;64438:7;64492:1;64474:8;:15;;;;:19;;;;:::i;:::-;64466:4;:27;;64458:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;64548:21;64572:8;64581:4;64572:14;;;;;;;;:::i;:::-;;;;;;;;;;;;64548:38;;64597:21;64621:8;:14;64630:4;64621:14;;;;;;;;;;;:21;64636:5;64621:21;;;;;;;;;;;;;;;64597:45;;64653:26;64682:4;:23;;;64653:52;;64716:16;64735:4;:17;;;64716:36;;64785:4;:19;;;64767:15;:37;:54;;;;;64820:1;64808:8;:13;;64767:54;64763:364;;;64838:18;64859:51;64873:4;:19;;;64894:15;64859:13;:51::i;:::-;64838:72;;64925:19;64947:73;65004:15;;64947:52;64983:4;:15;;;64947:31;64962:15;;64947:10;:14;;:31;;;;:::i;:::-;:35;;:52;;;;:::i;:::-;:56;;:73;;;;:::i;:::-;64925:95;;65056:59;65079:35;65105:8;65079:21;65095:4;65079:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;65056:18;:22;;:59;;;;:::i;:::-;65035:80;;64823:304;;64763:364;65144:66;65194:4;:15;;;65144:45;65184:4;65144:35;65160:18;65144:4;:11;;;:15;;:35;;;;:::i;:::-;:39;;:45;;;;:::i;:::-;:49;;:66;;;;:::i;:::-;65137:73;;;;;;64365:853;;;;:::o;61063:46::-;;;;:::o;64153:204::-;43772:13;:11;:13::i;:::-;64253:1:::1;64242:8;:12;64234:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;64341:8;64316:22;:33;;;;64153:204:::0;:::o;61454:42::-;;;;;;;;;;;;;;;;;:::o;60987:32::-;;;;:::o;71149:960::-;71204:15;;:::i;:::-;71246:8;:15;;;;71240:3;:21;71232:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;71308:20;71331:8;71340:3;71331:13;;;;;;;;:::i;:::-;;;;;;;;;;;;71308:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71355:20;71401:4;:10;;;71355:58;;71424:24;71451:57;71492:15;;71451:36;71471:15;;71451:4;:15;;;:19;;:36;;;;:::i;:::-;:40;;:57;;;;:::i;:::-;71424:84;;71539:562;;;;;;;;71572:3;71539:562;;;;71606:4;:15;;;71539:562;;;;71656:4;:19;;;71539:562;;;;71773:16;71539:562;;;;71713:4;:23;;;71539:562;;;;71821:4;:17;;;71539:562;;;;71872:5;71539:562;;;;;;71905:5;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71539:562;;;;71944:5;:10;;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71539:562;;;;71985:5;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71539:562;;;;;;72031:9;;71539:562;;;;72073:12;;71539:562;;;71519:582;;;;;71149:960;;;:::o;73688:108::-;73731:20;73771:17;:8;:15;:17::i;:::-;73764:24;;73688:108;:::o;66106:1494::-;66206:1;66188:8;:15;;;;:19;;;;:::i;:::-;66180:4;:27;;66172:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;66262:21;66286:8;66295:4;66286:14;;;;;;;;:::i;:::-;;;;;;;;;;;;66262:38;;66311:21;66335:8;:14;66344:4;66335:14;;;;;;;;;;;:26;66350:10;66335:26;;;;;;;;;;;;;;;66311:50;;66374:16;66385:4;66374:10;:16::i;:::-;66411:14;66454:1;66440:4;:11;;;:15;66436:409;;;66472:15;66490:71;66545:4;:15;;;66490:50;66535:4;66490:40;66506:4;:23;;;66490:4;:11;;;:15;;:40;;;;:::i;:::-;:44;;:50;;;;:::i;:::-;:54;;:71;;;;:::i;:::-;66472:89;;66589:1;66579:7;:11;66576:258;;;66611:11;66625;;;;;;;;;;;:21;;;66655:4;66625:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66611:50;;66690:7;66683:3;:14;66680:139;;66731:7;66722:16;;66680:139;;;66796:3;66787:12;;66680:139;66592:242;66576:258;66457:388;66436:409;66870:1;66860:7;:11;66857:495;;;66888:14;66905:4;:10;;;;;;;;;;;;:20;;;66934:9;;;;;;;;;;;66905:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66888:57;;66960:77;66996:10;67017:9;;;;;;;;;;;67029:7;66960:4;:10;;;;;;;;;;;;:27;;;;:77;;;;;;:::i;:::-;67062:52;67107:6;67062:4;:10;;;;;;;;;;;;:20;;;67091:9;;;;;;;;;;;67062:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;:52;;;;:::i;:::-;67052:62;;67167:17;;67139:24;67151:4;:11;;;67139:7;:11;;:24;;;;:::i;:::-;:45;;67131:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;67251:24;67267:7;67251:4;:11;;;:15;;:24;;;;:::i;:::-;67237:4;:11;;:38;;;;67310:30;67332:7;67310:4;:17;;;:21;;:30;;;;:::i;:::-;67290:4;:17;;:50;;;;66873:479;66857:495;67380:50;67425:4;67380:40;67396:4;:23;;;67380:4;:11;;;:15;;:40;;;;:::i;:::-;:44;;:50;;;;:::i;:::-;67362:4;:15;;:68;;;;67456:1;67447:6;:10;67443:96;;;67474:53;67507:10;67520:6;67474:11;;;;;;;;;;;:24;;;;:53;;;;;:::i;:::-;67443:96;67572:10;67564:28;;;67584:7;67564:28;;;;;;:::i;:::-;;;;;;;;66161:1439;;;66106:1494;;:::o;61374:27::-;;;;:::o;44792:201::-;43772:13;:11;:13::i;:::-;44901:1:::1;44881:22;;:8;:22;;::::0;44873:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;44957:28;44976:8;44957:18;:28::i;:::-;44792:201:::0;:::o;60955:25::-;;;;;;;;;;;;;:::o;44051:132::-;44126:12;:10;:12::i;:::-;44115:23;;:7;:5;:7::i;:::-;:23;;;44107:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44051:132::o;3288:98::-;3346:7;3377:1;3373;:5;;;;:::i;:::-;3366:12;;3288:98;;;;:::o;2907:::-;2965:7;2996:1;2992;:5;;;;:::i;:::-;2985:12;;2907:98;;;;:::o;54253:158::-;54326:4;54350:53;54358:3;:10;;54394:5;54378:23;;54370:32;;54350:7;:53::i;:::-;54343:60;;54253:158;;;;:::o;54497:167::-;54577:4;54601:55;54611:3;:10;;54647:5;54631:23;;54623:32;;54601:9;:55::i;:::-;54594:62;;54497:167;;;;:::o;53925:152::-;53995:4;54019:50;54024:3;:10;;54060:5;54044:23;;54036:32;;54019:4;:50::i;:::-;54012:57;;53925:152;;;;:::o;38865:211::-;38982:86;39002:5;39032:23;;;39057:2;39061:5;39009:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38982:19;:86::i;:::-;38865:211;;;:::o;20624:98::-;20677:7;20704:10;20697:17;;20624:98;:::o;68243:904::-;68337:17;:15;:17::i;:::-;68367:14;68384:11;;;;;;;;;;;:21;;;68414:4;68384:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68367:53;;68431:65;68460:12;:10;:12::i;:::-;68482:4;68489:6;68431:11;;;;;;;;;;;:28;;;;:65;;;;;;:::i;:::-;68507:18;68528:48;68569:6;68528:11;;;;;;;;;;;:21;;;68558:4;68528:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;:48;;;;:::i;:::-;68507:69;;68589:24;68631:15;68616:12;;:30;:70;;68685:1;68616:70;;;68649:33;68666:15;68649:12;;:16;;:33;;;;:::i;:::-;68616:70;68589:97;;68697:20;68720:37;68740:16;68720:15;;:19;;:37;;;;:::i;:::-;68697:60;;68787:36;68806:16;68787:14;:18;;:36;;;;:::i;:::-;68770:53;;68849:28;68866:10;68849:12;:16;;:28;;;;:::i;:::-;68834:43;;68908:32;68925:14;68908:12;:16;;:32;;;;:::i;:::-;68890:15;:50;;;;68975:9;;68956:15;:28;68953:187;;69016:35;69036:14;69016:15;:19;;:35;;;;:::i;:::-;69001:12;:50;;;;68953:187;;;69099:29;69113:14;69099:9;;:13;;:29;;;;:::i;:::-;69084:12;:44;;;;68953:187;68324:823;;;;68243:904;;:::o;3645:98::-;3703:7;3734:1;3730;:5;;;;:::i;:::-;3723:12;;3645:98;;;;:::o;4044:::-;4102:7;4133:1;4129;:5;;;;:::i;:::-;4122:12;;4044:98;;;;:::o;39084:248::-;39228:96;39248:5;39278:27;;;39307:4;39313:2;39317:5;39255:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39228:19;:96::i;:::-;39084:248;;;;:::o;45153:191::-;45227:16;45246:6;;;;;;;;;;;45227:25;;45272:8;45263:6;;:17;;;;;;;;;;;;;;;;;;45327:8;45296:40;;45317:8;45296:40;;;;;;;;;;;;45216:128;45153:191;:::o;55929:310::-;55992:16;56021:22;56046:19;56054:3;:10;;56046:7;:19::i;:::-;56021:44;;56076:23;56190:5;56180:15;;56225:6;56218:13;;;;55929:310;;;:::o;48246:1420::-;48312:4;48430:18;48451:3;:12;;:19;48464:5;48451:19;;;;;;;;;;;;48430:40;;48501:1;48487:10;:15;48483:1176;;48862:21;48899:1;48886:10;:14;;;;:::i;:::-;48862:38;;48915:17;48956:1;48935:3;:11;;:18;;;;:22;;;;:::i;:::-;48915:42;;48991:13;48978:9;:26;48974:405;;49025:17;49045:3;:11;;49057:9;49045:22;;;;;;;;:::i;:::-;;;;;;;;;;49025:42;;49199:9;49170:3;:11;;49182:13;49170:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;49310:10;49284:3;:12;;:23;49297:9;49284:23;;;;;;;;;;;:36;;;;49006:373;48974:405;49460:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49555:3;:12;;:19;49568:5;49555:19;;;;;;;;;;;49548:26;;;49598:4;49591:11;;;;;;;48483:1176;49642:5;49635:12;;;48246:1420;;;;;:::o;49752:129::-;49825:4;49872:1;49849:3;:12;;:19;49862:5;49849:19;;;;;;;;;;;;:24;;49842:31;;49752:129;;;;:::o;47656:414::-;47719:4;47741:21;47751:3;47756:5;47741:9;:21::i;:::-;47736:327;;47779:3;:11;;47796:5;47779:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47962:3;:11;;:18;;;;47940:3;:12;;:19;47953:5;47940:19;;;;;;;;;;;:40;;;;48002:4;47995:11;;;;47736:327;48046:5;48039:12;;47656:414;;;;;:::o;41932:716::-;42356:23;42382:69;42410:4;42382:69;;;;;;;;;;;;;;;;;42390:5;42382:27;;;;:69;;;;;:::i;:::-;42356:95;;42486:1;42466:10;:17;:21;42462:179;;;42563:10;42552:30;;;;;;;;;;;;:::i;:::-;42544:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;42462:179;42002:646;41932:716;;:::o;51100:111::-;51156:16;51192:3;:11;;51185:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51100:111;;;:::o;32717:229::-;32854:12;32886:52;32908:6;32916:4;32922:1;32925:12;32886:21;:52::i;:::-;32879:59;;32717:229;;;;;:::o;33837:455::-;34007:12;34065:5;34040:21;:30;;34032:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34125:12;34139:23;34166:6;:11;;34185:5;34192:4;34166:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34124:73;;;;34215:69;34242:6;34250:7;34259:10;34271:12;34215:26;:69::i;:::-;34208:76;;;;33837:455;;;;;;:::o;36410:644::-;36595:12;36624:7;36620:427;;;36673:1;36652:10;:17;:22;36648:290;;36870:18;36881:6;36870:10;:18::i;:::-;36862:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;36648:290;36959:10;36952:17;;;;36620:427;37002:33;37010:10;37022:12;37002:7;:33::i;:::-;36410:644;;;;;;;:::o;29960:326::-;30020:4;30277:1;30255:7;:19;;;:23;30248:30;;29960:326;;;:::o;37596:552::-;37777:1;37757:10;:17;:21;37753:388;;;37989:10;37983:17;38046:15;38033:10;38029:2;38025:19;38018:44;37753:388;38116:12;38109:20;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:126::-;1062:7;1102:42;1095:5;1091:54;1080:65;;1025:126;;;:::o;1157:60::-;1185:3;1206:5;1199:12;;1157:60;;;:::o;1223:142::-;1273:9;1306:53;1324:34;1333:24;1351:5;1333:24;:::i;:::-;1324:34;:::i;:::-;1306:53;:::i;:::-;1293:66;;1223:142;;;:::o;1371:126::-;1421:9;1454:37;1485:5;1454:37;:::i;:::-;1441:50;;1371:126;;;:::o;1503:141::-;1568:9;1601:37;1632:5;1601:37;:::i;:::-;1588:50;;1503:141;;;:::o;1650:161::-;1752:52;1798:5;1752:52;:::i;:::-;1747:3;1740:65;1650:161;;:::o;1817:118::-;1904:24;1922:5;1904:24;:::i;:::-;1899:3;1892:37;1817:118;;:::o;1941:694::-;2161:4;2199:3;2188:9;2184:19;2176:27;;2213:86;2296:1;2285:9;2281:17;2272:6;2213:86;:::i;:::-;2309:72;2377:2;2366:9;2362:18;2353:6;2309:72;:::i;:::-;2391;2459:2;2448:9;2444:18;2435:6;2391:72;:::i;:::-;2473;2541:2;2530:9;2526:18;2517:6;2473:72;:::i;:::-;2555:73;2623:3;2612:9;2608:19;2599:6;2555:73;:::i;:::-;1941:694;;;;;;;;:::o;2641:474::-;2709:6;2717;2766:2;2754:9;2745:7;2741:23;2737:32;2734:119;;;2772:79;;:::i;:::-;2734:119;2892:1;2917:53;2962:7;2953:6;2942:9;2938:22;2917:53;:::i;:::-;2907:63;;2863:117;3019:2;3045:53;3090:7;3081:6;3070:9;3066:22;3045:53;:::i;:::-;3035:63;;2990:118;2641:474;;;;;:::o;3121:96::-;3158:7;3187:24;3205:5;3187:24;:::i;:::-;3176:35;;3121:96;;;:::o;3223:122::-;3296:24;3314:5;3296:24;:::i;:::-;3289:5;3286:35;3276:63;;3335:1;3332;3325:12;3276:63;3223:122;:::o;3351:139::-;3397:5;3435:6;3422:20;3413:29;;3451:33;3478:5;3451:33;:::i;:::-;3351:139;;;;:::o;3496:329::-;3555:6;3604:2;3592:9;3583:7;3579:23;3575:32;3572:119;;;3610:79;;:::i;:::-;3572:119;3730:1;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3701:117;3496:329;;;;:::o;3831:140::-;3924:6;3958:5;3952:12;3942:22;;3831:140;;;:::o;3977:210::-;4102:11;4136:6;4131:3;4124:19;4176:4;4171:3;4167:14;4152:29;;3977:210;;;;:::o;4193:158::-;4286:4;4309:3;4301:11;;4339:4;4334:3;4330:14;4322:22;;4193:158;;;:::o;4357:108::-;4434:24;4452:5;4434:24;:::i;:::-;4429:3;4422:37;4357:108;;:::o;4541:698::-;4680:4;4675:3;4671:14;4775:4;4768:5;4764:16;4758:23;4794:63;4851:4;4846:3;4842:14;4828:12;4794:63;:::i;:::-;4695:172;4961:4;4954:5;4950:16;4944:23;4980:63;5037:4;5032:3;5028:14;5014:12;4980:63;:::i;:::-;4877:176;5140:4;5133:5;5129:16;5123:23;5159:63;5216:4;5211:3;5207:14;5193:12;5159:63;:::i;:::-;5063:169;4649:590;4541:698;;:::o;5245:283::-;5366:10;5387:98;5481:3;5473:6;5387:98;:::i;:::-;5517:4;5512:3;5508:14;5494:28;;5245:283;;;;:::o;5534:139::-;5630:4;5662;5657:3;5653:14;5645:22;;5534:139;;;:::o;5753:940::-;5924:3;5953:80;6027:5;5953:80;:::i;:::-;6049:112;6154:6;6149:3;6049:112;:::i;:::-;6042:119;;6185:82;6261:5;6185:82;:::i;:::-;6290:7;6321:1;6306:362;6331:6;6328:1;6325:13;6306:362;;;6407:6;6401:13;6434:115;6545:3;6530:13;6434:115;:::i;:::-;6427:122;;6572:86;6651:6;6572:86;:::i;:::-;6562:96;;6366:302;6353:1;6350;6346:9;6341:14;;6306:362;;;6310:14;6684:3;6677:10;;5929:764;;;5753:940;;;;:::o;6699:477::-;6894:4;6932:2;6921:9;6917:18;6909:26;;6981:9;6975:4;6971:20;6967:1;6956:9;6952:17;6945:47;7009:160;7164:4;7155:6;7009:160;:::i;:::-;7001:168;;6699:477;;;;:::o;7182:90::-;7216:7;7259:5;7252:13;7245:21;7234:32;;7182:90;;;:::o;7278:109::-;7359:21;7374:5;7359:21;:::i;:::-;7354:3;7347:34;7278:109;;:::o;7393:210::-;7480:4;7518:2;7507:9;7503:18;7495:26;;7531:65;7593:1;7582:9;7578:17;7569:6;7531:65;:::i;:::-;7393:210;;;;:::o;7609:474::-;7677:6;7685;7734:2;7722:9;7713:7;7709:23;7705:32;7702:119;;;7740:79;;:::i;:::-;7702:119;7860:1;7885:53;7930:7;7921:6;7910:9;7906:22;7885:53;:::i;:::-;7875:63;;7831:117;7987:2;8013:53;8058:7;8049:6;8038:9;8034:22;8013:53;:::i;:::-;8003:63;;7958:118;7609:474;;;;;:::o;8089:144::-;8157:9;8190:37;8221:5;8190:37;:::i;:::-;8177:50;;8089:144;;;:::o;8239:167::-;8344:55;8393:5;8344:55;:::i;:::-;8339:3;8332:68;8239:167;;:::o;8412:258::-;8523:4;8561:2;8550:9;8546:18;8538:26;;8574:89;8660:1;8649:9;8645:17;8636:6;8574:89;:::i;:::-;8412:258;;;;:::o;8676:140::-;8769:6;8803:5;8797:12;8787:22;;8676:140;;;:::o;8822:210::-;8947:11;8981:6;8976:3;8969:19;9021:4;9016:3;9012:14;8997:29;;8822:210;;;;:::o;9038:158::-;9131:4;9154:3;9146:11;;9184:4;9179:3;9175:14;9167:22;;9038:158;;;:::o;9202:108::-;9279:24;9297:5;9279:24;:::i;:::-;9274:3;9267:37;9202:108;;:::o;9316:99::-;9368:6;9402:5;9396:12;9386:22;;9316:99;;;:::o;9421:159::-;9495:11;9529:6;9524:3;9517:19;9569:4;9564:3;9560:14;9545:29;;9421:159;;;;:::o;9586:246::-;9667:1;9677:113;9691:6;9688:1;9685:13;9677:113;;;9776:1;9771:3;9767:11;9761:18;9757:1;9752:3;9748:11;9741:39;9713:2;9710:1;9706:10;9701:15;;9677:113;;;9824:1;9815:6;9810:3;9806:16;9799:27;9648:184;9586:246;;;:::o;9838:102::-;9879:6;9930:2;9926:7;9921:2;9914:5;9910:14;9906:28;9896:38;;9838:102;;;:::o;9946:357::-;10024:3;10052:39;10085:5;10052:39;:::i;:::-;10107:61;10161:6;10156:3;10107:61;:::i;:::-;10100:68;;10177:65;10235:6;10230:3;10223:4;10216:5;10212:16;10177:65;:::i;:::-;10267:29;10289:6;10267:29;:::i;:::-;10262:3;10258:39;10251:46;;10028:275;9946:357;;;;:::o;10309:86::-;10344:7;10384:4;10377:5;10373:16;10362:27;;10309:86;;;:::o;10401:102::-;10474:22;10490:5;10474:22;:::i;:::-;10469:3;10462:35;10401:102;;:::o;10579:2490::-;10690:3;10726:6;10721:3;10717:16;10814:4;10807:5;10803:16;10797:23;10833:63;10890:4;10885:3;10881:14;10867:12;10833:63;:::i;:::-;10743:163;10994:4;10987:5;10983:16;10977:23;11013:63;11070:4;11065:3;11061:14;11047:12;11013:63;:::i;:::-;10916:170;11178:4;11171:5;11167:16;11161:23;11197:63;11254:4;11249:3;11245:14;11231:12;11197:63;:::i;:::-;11096:174;11364:4;11357:5;11353:16;11347:23;11383:63;11440:4;11435:3;11431:14;11417:12;11383:63;:::i;:::-;11280:176;11551:4;11544:5;11540:16;11534:23;11570:63;11627:4;11622:3;11618:14;11604:12;11570:63;:::i;:::-;11466:177;11732:4;11725:5;11721:16;11715:23;11751:63;11808:4;11803:3;11799:14;11785:12;11751:63;:::i;:::-;11653:171;11907:4;11900:5;11896:16;11890:23;11926:63;11983:4;11978:3;11974:14;11960:12;11926:63;:::i;:::-;11834:165;12083:4;12076:5;12072:16;12066:23;12136:3;12130:4;12126:14;12119:4;12114:3;12110:14;12103:38;12162:73;12230:4;12216:12;12162:73;:::i;:::-;12154:81;;12009:237;12328:6;12321:5;12317:18;12311:25;12385:3;12379:4;12375:14;12366:6;12361:3;12357:16;12350:40;12411:73;12479:4;12465:12;12411:73;:::i;:::-;12403:81;;12256:239;12581:6;12574:5;12570:18;12564:25;12602:61;12655:6;12650:3;12646:16;12632:12;12602:61;:::i;:::-;12505:168;12760:6;12753:5;12749:18;12743:25;12781:65;12838:6;12833:3;12829:16;12815:12;12781:65;:::i;:::-;12683:173;12946:6;12939:5;12935:18;12929:25;12967:65;13024:6;13019:3;13015:16;13001:12;12967:65;:::i;:::-;12866:176;13059:4;13052:11;;10695:2374;10579:2490;;;;:::o;13075:260::-;13196:10;13231:98;13325:3;13317:6;13231:98;:::i;:::-;13217:112;;13075:260;;;;:::o;13341:139::-;13437:4;13469;13464:3;13460:14;13452:22;;13341:139;;;:::o;13560:1119::-;13731:3;13760:80;13834:5;13760:80;:::i;:::-;13856:112;13961:6;13956:3;13856:112;:::i;:::-;13849:119;;13994:3;14039:4;14031:6;14027:17;14022:3;14018:27;14069:82;14145:5;14069:82;:::i;:::-;14174:7;14205:1;14190:444;14215:6;14212:1;14209:13;14190:444;;;14286:9;14280:4;14276:20;14271:3;14264:33;14337:6;14331:13;14365:116;14476:4;14461:13;14365:116;:::i;:::-;14357:124;;14504:86;14583:6;14504:86;:::i;:::-;14494:96;;14619:4;14614:3;14610:14;14603:21;;14250:384;14237:1;14234;14230:9;14225:14;;14190:444;;;14194:14;14650:4;14643:11;;14670:3;14663:10;;13736:943;;;;;13560:1119;;;;:::o;14685:477::-;14880:4;14918:2;14907:9;14903:18;14895:26;;14967:9;14961:4;14957:20;14953:1;14942:9;14938:17;14931:47;14995:160;15150:4;15141:6;14995:160;:::i;:::-;14987:168;;14685:477;;;;:::o;15168:474::-;15236:6;15244;15293:2;15281:9;15272:7;15268:23;15264:32;15261:119;;;15299:79;;:::i;:::-;15261:119;15419:1;15444:53;15489:7;15480:6;15469:9;15465:22;15444:53;:::i;:::-;15434:63;;15390:117;15546:2;15572:53;15617:7;15608:6;15597:9;15593:22;15572:53;:::i;:::-;15562:63;;15517:118;15168:474;;;;;:::o;15718:708::-;15867:4;15862:3;15858:14;15962:4;15955:5;15951:16;15945:23;15981:63;16038:4;16033:3;16029:14;16015:12;15981:63;:::i;:::-;15882:172;16148:4;16141:5;16137:16;16131:23;16167:63;16224:4;16219:3;16215:14;16201:12;16167:63;:::i;:::-;16064:176;16327:4;16320:5;16316:16;16310:23;16346:63;16403:4;16398:3;16394:14;16380:12;16346:63;:::i;:::-;16250:169;15836:590;15718:708;;:::o;16432:326::-;16577:4;16615:2;16604:9;16600:18;16592:26;;16628:123;16748:1;16737:9;16733:17;16724:6;16628:123;:::i;:::-;16432:326;;;;:::o;16764:222::-;16857:4;16895:2;16884:9;16880:18;16872:26;;16908:71;16976:1;16965:9;16961:17;16952:6;16908:71;:::i;:::-;16764:222;;;;:::o;16992:118::-;17079:24;17097:5;17079:24;:::i;:::-;17074:3;17067:37;16992:118;;:::o;17116:222::-;17209:4;17247:2;17236:9;17232:18;17224:26;;17260:71;17328:1;17317:9;17313:17;17304:6;17260:71;:::i;:::-;17116:222;;;;:::o;17344:332::-;17465:4;17503:2;17492:9;17488:18;17480:26;;17516:71;17584:1;17573:9;17569:17;17560:6;17516:71;:::i;:::-;17597:72;17665:2;17654:9;17650:18;17641:6;17597:72;:::i;:::-;17344:332;;;;;:::o;17752:2500::-;17873:3;17909:6;17904:3;17900:16;17997:4;17990:5;17986:16;17980:23;18016:63;18073:4;18068:3;18064:14;18050:12;18016:63;:::i;:::-;17926:163;18177:4;18170:5;18166:16;18160:23;18196:63;18253:4;18248:3;18244:14;18230:12;18196:63;:::i;:::-;18099:170;18361:4;18354:5;18350:16;18344:23;18380:63;18437:4;18432:3;18428:14;18414:12;18380:63;:::i;:::-;18279:174;18547:4;18540:5;18536:16;18530:23;18566:63;18623:4;18618:3;18614:14;18600:12;18566:63;:::i;:::-;18463:176;18734:4;18727:5;18723:16;18717:23;18753:63;18810:4;18805:3;18801:14;18787:12;18753:63;:::i;:::-;18649:177;18915:4;18908:5;18904:16;18898:23;18934:63;18991:4;18986:3;18982:14;18968:12;18934:63;:::i;:::-;18836:171;19090:4;19083:5;19079:16;19073:23;19109:63;19166:4;19161:3;19157:14;19143:12;19109:63;:::i;:::-;19017:165;19266:4;19259:5;19255:16;19249:23;19319:3;19313:4;19309:14;19302:4;19297:3;19293:14;19286:38;19345:73;19413:4;19399:12;19345:73;:::i;:::-;19337:81;;19192:237;19511:6;19504:5;19500:18;19494:25;19568:3;19562:4;19558:14;19549:6;19544:3;19540:16;19533:40;19594:73;19662:4;19648:12;19594:73;:::i;:::-;19586:81;;19439:239;19764:6;19757:5;19753:18;19747:25;19785:61;19838:6;19833:3;19829:16;19815:12;19785:61;:::i;:::-;19688:168;19943:6;19936:5;19932:18;19926:25;19964:65;20021:6;20016:3;20012:16;19998:12;19964:65;:::i;:::-;19866:173;20129:6;20122:5;20118:18;20112:25;20150:65;20207:6;20202:3;20198:16;20184:12;20150:65;:::i;:::-;20049:176;20242:4;20235:11;;17878:2374;17752:2500;;;;:::o;20258:377::-;20403:4;20441:2;20430:9;20426:18;20418:26;;20490:9;20484:4;20480:20;20476:1;20465:9;20461:17;20454:47;20518:110;20623:4;20614:6;20518:110;:::i;:::-;20510:118;;20258:377;;;;:::o;20641:114::-;20708:6;20742:5;20736:12;20726:22;;20641:114;;;:::o;20761:184::-;20860:11;20894:6;20889:3;20882:19;20934:4;20929:3;20925:14;20910:29;;20761:184;;;;:::o;20951:132::-;21018:4;21041:3;21033:11;;21071:4;21066:3;21062:14;21054:22;;20951:132;;;:::o;21089:179::-;21158:10;21179:46;21221:3;21213:6;21179:46;:::i;:::-;21257:4;21252:3;21248:14;21234:28;;21089:179;;;;:::o;21274:113::-;21344:4;21376;21371:3;21367:14;21359:22;;21274:113;;;:::o;21423:732::-;21542:3;21571:54;21619:5;21571:54;:::i;:::-;21641:86;21720:6;21715:3;21641:86;:::i;:::-;21634:93;;21751:56;21801:5;21751:56;:::i;:::-;21830:7;21861:1;21846:284;21871:6;21868:1;21865:13;21846:284;;;21947:6;21941:13;21974:63;22033:3;22018:13;21974:63;:::i;:::-;21967:70;;22060:60;22113:6;22060:60;:::i;:::-;22050:70;;21906:224;21893:1;21890;21886:9;21881:14;;21846:284;;;21850:14;22146:3;22139:10;;21547:608;;;21423:732;;;;:::o;22161:373::-;22304:4;22342:2;22331:9;22327:18;22319:26;;22391:9;22385:4;22381:20;22377:1;22366:9;22362:17;22355:47;22419:108;22522:4;22513:6;22419:108;:::i;:::-;22411:116;;22161:373;;;;:::o;22540:252::-;22648:4;22686:2;22675:9;22671:18;22663:26;;22699:86;22782:1;22771:9;22767:17;22758:6;22699:86;:::i;:::-;22540:252;;;;:::o;22798:180::-;22846:77;22843:1;22836:88;22943:4;22940:1;22933:15;22967:4;22964:1;22957:15;22984:194;23024:4;23044:20;23062:1;23044:20;:::i;:::-;23039:25;;23078:20;23096:1;23078:20;:::i;:::-;23073:25;;23122:1;23119;23115:9;23107:17;;23146:1;23140:4;23137:11;23134:37;;;23151:18;;:::i;:::-;23134:37;22984:194;;;;:::o;23184:169::-;23268:11;23302:6;23297:3;23290:19;23342:4;23337:3;23333:14;23318:29;;23184:169;;;;:::o;23359:224::-;23499:34;23495:1;23487:6;23483:14;23476:58;23568:7;23563:2;23555:6;23551:15;23544:32;23359:224;:::o;23589:366::-;23731:3;23752:67;23816:2;23811:3;23752:67;:::i;:::-;23745:74;;23828:93;23917:3;23828:93;:::i;:::-;23946:2;23941:3;23937:12;23930:19;;23589:366;;;:::o;23961:419::-;24127:4;24165:2;24154:9;24150:18;24142:26;;24214:9;24208:4;24204:20;24200:1;24189:9;24185:17;24178:47;24242:131;24368:4;24242:131;:::i;:::-;24234:139;;23961:419;;;:::o;24386:180::-;24434:77;24431:1;24424:88;24531:4;24528:1;24521:15;24555:4;24552:1;24545:15;24572:180;24620:77;24617:1;24610:88;24717:4;24714:1;24707:15;24741:4;24738:1;24731:15;24758:233;24797:3;24820:24;24838:5;24820:24;:::i;:::-;24811:33;;24866:66;24859:5;24856:77;24853:103;;24936:18;;:::i;:::-;24853:103;24983:1;24976:5;24972:13;24965:20;;24758:233;;;:::o;24997:228::-;25137:34;25133:1;25125:6;25121:14;25114:58;25206:11;25201:2;25193:6;25189:15;25182:36;24997:228;:::o;25231:366::-;25373:3;25394:67;25458:2;25453:3;25394:67;:::i;:::-;25387:74;;25470:93;25559:3;25470:93;:::i;:::-;25588:2;25583:3;25579:12;25572:19;;25231:366;;;:::o;25603:419::-;25769:4;25807:2;25796:9;25792:18;25784:26;;25856:9;25850:4;25846:20;25842:1;25831:9;25827:17;25820:47;25884:131;26010:4;25884:131;:::i;:::-;25876:139;;25603:419;;;:::o;26028:228::-;26168:34;26164:1;26156:6;26152:14;26145:58;26237:11;26232:2;26224:6;26220:15;26213:36;26028:228;:::o;26262:366::-;26404:3;26425:67;26489:2;26484:3;26425:67;:::i;:::-;26418:74;;26501:93;26590:3;26501:93;:::i;:::-;26619:2;26614:3;26610:12;26603:19;;26262:366;;;:::o;26634:419::-;26800:4;26838:2;26827:9;26823:18;26815:26;;26887:9;26881:4;26877:20;26873:1;26862:9;26858:17;26851:47;26915:131;27041:4;26915:131;:::i;:::-;26907:139;;26634:419;;;:::o;27059:143::-;27116:5;27147:6;27141:13;27132:22;;27163:33;27190:5;27163:33;:::i;:::-;27059:143;;;;:::o;27208:351::-;27278:6;27327:2;27315:9;27306:7;27302:23;27298:32;27295:119;;;27333:79;;:::i;:::-;27295:119;27453:1;27478:64;27534:7;27525:6;27514:9;27510:22;27478:64;:::i;:::-;27468:74;;27424:128;27208:351;;;;:::o;27565:237::-;27705:34;27701:1;27693:6;27689:14;27682:58;27774:20;27769:2;27761:6;27757:15;27750:45;27565:237;:::o;27808:366::-;27950:3;27971:67;28035:2;28030:3;27971:67;:::i;:::-;27964:74;;28047:93;28136:3;28047:93;:::i;:::-;28165:2;28160:3;28156:12;28149:19;;27808:366;;;:::o;28180:419::-;28346:4;28384:2;28373:9;28369:18;28361:26;;28433:9;28427:4;28423:20;28419:1;28408:9;28404:17;28397:47;28461:131;28587:4;28461:131;:::i;:::-;28453:139;;28180:419;;;:::o;28605:181::-;28745:33;28741:1;28733:6;28729:14;28722:57;28605:181;:::o;28792:366::-;28934:3;28955:67;29019:2;29014:3;28955:67;:::i;:::-;28948:74;;29031:93;29120:3;29031:93;:::i;:::-;29149:2;29144:3;29140:12;29133:19;;28792:366;;;:::o;29164:419::-;29330:4;29368:2;29357:9;29353:18;29345:26;;29417:9;29411:4;29407:20;29403:1;29392:9;29388:17;29381:47;29445:131;29571:4;29445:131;:::i;:::-;29437:139;;29164:419;;;:::o;29589:160::-;29729:12;29725:1;29717:6;29713:14;29706:36;29589:160;:::o;29755:366::-;29897:3;29918:67;29982:2;29977:3;29918:67;:::i;:::-;29911:74;;29994:93;30083:3;29994:93;:::i;:::-;30112:2;30107:3;30103:12;30096:19;;29755:366;;;:::o;30127:419::-;30293:4;30331:2;30320:9;30316:18;30308:26;;30380:9;30374:4;30370:20;30366:1;30355:9;30351:17;30344:47;30408:131;30534:4;30408:131;:::i;:::-;30400:139;;30127:419;;;:::o;30552:236::-;30692:34;30688:1;30680:6;30676:14;30669:58;30761:19;30756:2;30748:6;30744:15;30737:44;30552:236;:::o;30794:366::-;30936:3;30957:67;31021:2;31016:3;30957:67;:::i;:::-;30950:74;;31033:93;31122:3;31033:93;:::i;:::-;31151:2;31146:3;31142:12;31135:19;;30794:366;;;:::o;31166:419::-;31332:4;31370:2;31359:9;31355:18;31347:26;;31419:9;31413:4;31409:20;31405:1;31394:9;31390:17;31383:47;31447:131;31573:4;31447:131;:::i;:::-;31439:139;;31166:419;;;:::o;31591:225::-;31731:34;31727:1;31719:6;31715:14;31708:58;31800:8;31795:2;31787:6;31783:15;31776:33;31591:225;:::o;31822:366::-;31964:3;31985:67;32049:2;32044:3;31985:67;:::i;:::-;31978:74;;32061:93;32150:3;32061:93;:::i;:::-;32179:2;32174:3;32170:12;32163:19;;31822:366;;;:::o;32194:419::-;32360:4;32398:2;32387:9;32383:18;32375:26;;32447:9;32441:4;32437:20;32433:1;32422:9;32418:17;32411:47;32475:131;32601:4;32475:131;:::i;:::-;32467:139;;32194:419;;;:::o;32619:233::-;32759:34;32755:1;32747:6;32743:14;32736:58;32828:16;32823:2;32815:6;32811:15;32804:41;32619:233;:::o;32858:366::-;33000:3;33021:67;33085:2;33080:3;33021:67;:::i;:::-;33014:74;;33097:93;33186:3;33097:93;:::i;:::-;33215:2;33210:3;33206:12;33199:19;;32858:366;;;:::o;33230:419::-;33396:4;33434:2;33423:9;33419:18;33411:26;;33483:9;33477:4;33473:20;33469:1;33458:9;33454:17;33447:47;33511:131;33637:4;33511:131;:::i;:::-;33503:139;;33230:419;;;:::o;33655:181::-;33795:33;33791:1;33783:6;33779:14;33772:57;33655:181;:::o;33842:366::-;33984:3;34005:67;34069:2;34064:3;34005:67;:::i;:::-;33998:74;;34081:93;34170:3;34081:93;:::i;:::-;34199:2;34194:3;34190:12;34183:19;;33842:366;;;:::o;34214:419::-;34380:4;34418:2;34407:9;34403:18;34395:26;;34467:9;34461:4;34457:20;34453:1;34442:9;34438:17;34431:47;34495:131;34621:4;34495:131;:::i;:::-;34487:139;;34214:419;;;:::o;34639:117::-;34748:1;34745;34738:12;34762:117;34871:1;34868;34861:12;34885:281;34968:27;34990:4;34968:27;:::i;:::-;34960:6;34956:40;35098:6;35086:10;35083:22;35062:18;35050:10;35047:34;35044:62;35041:88;;;35109:18;;:::i;:::-;35041:88;35149:10;35145:2;35138:22;34928:238;34885:281;;:::o;35172:129::-;35206:6;35233:20;;:::i;:::-;35223:30;;35262:33;35290:4;35282:6;35262:33;:::i;:::-;35172:129;;;:::o;35307:308::-;35369:4;35459:18;35451:6;35448:30;35445:56;;;35481:18;;:::i;:::-;35445:56;35519:29;35541:6;35519:29;:::i;:::-;35511:37;;35603:4;35597;35593:15;35585:23;;35307:308;;;:::o;35621:434::-;35710:5;35735:66;35751:49;35793:6;35751:49;:::i;:::-;35735:66;:::i;:::-;35726:75;;35824:6;35817:5;35810:21;35862:4;35855:5;35851:16;35900:3;35891:6;35886:3;35882:16;35879:25;35876:112;;;35907:79;;:::i;:::-;35876:112;35997:52;36042:6;36037:3;36032;35997:52;:::i;:::-;35716:339;35621:434;;;;;:::o;36075:355::-;36142:5;36191:3;36184:4;36176:6;36172:17;36168:27;36158:122;;36199:79;;:::i;:::-;36158:122;36309:6;36303:13;36334:90;36420:3;36412:6;36405:4;36397:6;36393:17;36334:90;:::i;:::-;36325:99;;36148:282;36075:355;;;;:::o;36436:524::-;36516:6;36565:2;36553:9;36544:7;36540:23;36536:32;36533:119;;;36571:79;;:::i;:::-;36533:119;36712:1;36701:9;36697:17;36691:24;36742:18;36734:6;36731:30;36728:117;;;36764:79;;:::i;:::-;36728:117;36869:74;36935:7;36926:6;36915:9;36911:22;36869:74;:::i;:::-;36859:84;;36662:291;36436:524;;;;:::o;36966:118::-;37037:22;37053:5;37037:22;:::i;:::-;37030:5;37027:33;37017:61;;37074:1;37071;37064:12;37017:61;36966:118;:::o;37090:139::-;37145:5;37176:6;37170:13;37161:22;;37192:31;37217:5;37192:31;:::i;:::-;37090:139;;;;:::o;37235:347::-;37303:6;37352:2;37340:9;37331:7;37327:23;37323:32;37320:119;;;37358:79;;:::i;:::-;37320:119;37478:1;37503:62;37557:7;37548:6;37537:9;37533:22;37503:62;:::i;:::-;37493:72;;37449:126;37235:347;;;;:::o;37588:181::-;37728:33;37724:1;37716:6;37712:14;37705:57;37588:181;:::o;37775:366::-;37917:3;37938:67;38002:2;37997:3;37938:67;:::i;:::-;37931:74;;38014:93;38103:3;38014:93;:::i;:::-;38132:2;38127:3;38123:12;38116:19;;37775:366;;;:::o;38147:419::-;38313:4;38351:2;38340:9;38336:18;38328:26;;38400:9;38394:4;38390:20;38386:1;38375:9;38371:17;38364:47;38428:131;38554:4;38428:131;:::i;:::-;38420:139;;38147:419;;;:::o;38572:225::-;38712:34;38708:1;38700:6;38696:14;38689:58;38781:8;38776:2;38768:6;38764:15;38757:33;38572:225;:::o;38803:366::-;38945:3;38966:67;39030:2;39025:3;38966:67;:::i;:::-;38959:74;;39042:93;39131:3;39042:93;:::i;:::-;39160:2;39155:3;39151:12;39144:19;;38803:366;;;:::o;39175:419::-;39341:4;39379:2;39368:9;39364:18;39356:26;;39428:9;39422:4;39418:20;39414:1;39403:9;39399:17;39392:47;39456:131;39582:4;39456:131;:::i;:::-;39448:139;;39175:419;;;:::o;39600:182::-;39740:34;39736:1;39728:6;39724:14;39717:58;39600:182;:::o;39788:366::-;39930:3;39951:67;40015:2;40010:3;39951:67;:::i;:::-;39944:74;;40027:93;40116:3;40027:93;:::i;:::-;40145:2;40140:3;40136:12;40129:19;;39788:366;;;:::o;40160:419::-;40326:4;40364:2;40353:9;40349:18;40341:26;;40413:9;40407:4;40403:20;40399:1;40388:9;40384:17;40377:47;40441:131;40567:4;40441:131;:::i;:::-;40433:139;;40160:419;;;:::o;40585:191::-;40625:3;40644:20;40662:1;40644:20;:::i;:::-;40639:25;;40678:20;40696:1;40678:20;:::i;:::-;40673:25;;40721:1;40718;40714:9;40707:16;;40742:3;40739:1;40736:10;40733:36;;;40749:18;;:::i;:::-;40733:36;40585:191;;;;:::o;40782:332::-;40903:4;40941:2;40930:9;40926:18;40918:26;;40954:71;41022:1;41011:9;41007:17;40998:6;40954:71;:::i;:::-;41035:72;41103:2;41092:9;41088:18;41079:6;41035:72;:::i;:::-;40782:332;;;;;:::o;41120:410::-;41160:7;41183:20;41201:1;41183:20;:::i;:::-;41178:25;;41217:20;41235:1;41217:20;:::i;:::-;41212:25;;41272:1;41269;41265:9;41294:30;41312:11;41294:30;:::i;:::-;41283:41;;41473:1;41464:7;41460:15;41457:1;41454:22;41434:1;41427:9;41407:83;41384:139;;41503:18;;:::i;:::-;41384:139;41168:362;41120:410;;;;:::o;41536:180::-;41584:77;41581:1;41574:88;41681:4;41678:1;41671:15;41705:4;41702:1;41695:15;41722:185;41762:1;41779:20;41797:1;41779:20;:::i;:::-;41774:25;;41813:20;41831:1;41813:20;:::i;:::-;41808:25;;41852:1;41842:35;;41857:18;;:::i;:::-;41842:35;41899:1;41896;41892:9;41887:14;;41722:185;;;;:::o;41913:442::-;42062:4;42100:2;42089:9;42085:18;42077:26;;42113:71;42181:1;42170:9;42166:17;42157:6;42113:71;:::i;:::-;42194:72;42262:2;42251:9;42247:18;42238:6;42194:72;:::i;:::-;42276;42344:2;42333:9;42329:18;42320:6;42276:72;:::i;:::-;41913:442;;;;;;:::o;42361:180::-;42409:77;42406:1;42399:88;42506:4;42503:1;42496:15;42530:4;42527:1;42520:15;42547:116;42617:21;42632:5;42617:21;:::i;:::-;42610:5;42607:32;42597:60;;42653:1;42650;42643:12;42597:60;42547:116;:::o;42669:137::-;42723:5;42754:6;42748:13;42739:22;;42770:30;42794:5;42770:30;:::i;:::-;42669:137;;;;:::o;42812:345::-;42879:6;42928:2;42916:9;42907:7;42903:23;42899:32;42896:119;;;42934:79;;:::i;:::-;42896:119;43054:1;43079:61;43132:7;43123:6;43112:9;43108:22;43079:61;:::i;:::-;43069:71;;43025:125;42812:345;;;;:::o;43163:229::-;43303:34;43299:1;43291:6;43287:14;43280:58;43372:12;43367:2;43359:6;43355:15;43348:37;43163:229;:::o;43398:366::-;43540:3;43561:67;43625:2;43620:3;43561:67;:::i;:::-;43554:74;;43637:93;43726:3;43637:93;:::i;:::-;43755:2;43750:3;43746:12;43739:19;;43398:366;;;:::o;43770:419::-;43936:4;43974:2;43963:9;43959:18;43951:26;;44023:9;44017:4;44013:20;44009:1;43998:9;43994:17;43987:47;44051:131;44177:4;44051:131;:::i;:::-;44043:139;;43770:419;;;:::o;44195:225::-;44335:34;44331:1;44323:6;44319:14;44312:58;44404:8;44399:2;44391:6;44387:15;44380:33;44195:225;:::o;44426:366::-;44568:3;44589:67;44653:2;44648:3;44589:67;:::i;:::-;44582:74;;44665:93;44754:3;44665:93;:::i;:::-;44783:2;44778:3;44774:12;44767:19;;44426:366;;;:::o;44798:419::-;44964:4;45002:2;44991:9;44987:18;44979:26;;45051:9;45045:4;45041:20;45037:1;45026:9;45022:17;45015:47;45079:131;45205:4;45079:131;:::i;:::-;45071:139;;44798:419;;;:::o;45223:98::-;45274:6;45308:5;45302:12;45292:22;;45223:98;;;:::o;45327:147::-;45428:11;45465:3;45450:18;;45327:147;;;;:::o;45480:386::-;45584:3;45612:38;45644:5;45612:38;:::i;:::-;45666:88;45747:6;45742:3;45666:88;:::i;:::-;45659:95;;45763:65;45821:6;45816:3;45809:4;45802:5;45798:16;45763:65;:::i;:::-;45853:6;45848:3;45844:16;45837:23;;45588:278;45480:386;;;;:::o;45872:271::-;46002:3;46024:93;46113:3;46104:6;46024:93;:::i;:::-;46017:100;;46134:3;46127:10;;45872:271;;;;:::o;46149:179::-;46289:31;46285:1;46277:6;46273:14;46266:55;46149:179;:::o;46334:366::-;46476:3;46497:67;46561:2;46556:3;46497:67;:::i;:::-;46490:74;;46573:93;46662:3;46573:93;:::i;:::-;46691:2;46686:3;46682:12;46675:19;;46334:366;;;:::o;46706:419::-;46872:4;46910:2;46899:9;46895:18;46887:26;;46959:9;46953:4;46949:20;46945:1;46934:9;46930:17;46923:47;46987:131;47113:4;46987:131;:::i;:::-;46979:139;;46706:419;;;:::o;47131:377::-;47219:3;47247:39;47280:5;47247:39;:::i;:::-;47302:71;47366:6;47361:3;47302:71;:::i;:::-;47295:78;;47382:65;47440:6;47435:3;47428:4;47421:5;47417:16;47382:65;:::i;:::-;47472:29;47494:6;47472:29;:::i;:::-;47467:3;47463:39;47456:46;;47223:285;47131:377;;;;:::o;47514:313::-;47627:4;47665:2;47654:9;47650:18;47642:26;;47714:9;47708:4;47704:20;47700:1;47689:9;47685:17;47678:47;47742:78;47815:4;47806:6;47742:78;:::i;:::-;47734:86;;47514:313;;;;:::o
Swarm Source
ipfs://ceafb92f1b651b68031319b481dd9b2eefb18c57e22d1ec487c812eeddb8834e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ZKSYNC | 100.00% | $1,800.1 | 0.0000106 | $0.019081 |
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.