Feature Tip: Add private address tag to any address under My Name Tag !
Overview
TokenID
36
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CarrotBond
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-12 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.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/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.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) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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 256, 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 << 3) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // 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/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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/Address.sol // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/CarrotBond.sol pragma solidity ^0.8.9; /// @notice Simple staking contract /// @author Inspired by (https://github.com/Synthetixio/synthetix/blob/develop/contracts/StakingRewards.sol) contract CarrotBond is ERC721, ERC721Enumerable, Ownable { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTANTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev This is the Staking Token (PETER) IERC20 constant PETER = IERC20(0xB34Ad97E33A06a44e0eF28337A07Bfc1f3224f8c); //Mainnet /// @dev This is the Reward Token (CARROT) IERC20 constant CARROT = IERC20(0x87A9347A1a16A5C86242367FCd5bD5c3DC0e2DC6); /// @dev dead address to burn tokens address constant DEATH = 0x000000000000000000000000000000000000dEaD; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Staking amount can not be zero. error AmountIsZero(); /// @dev Admin can not use a fee higher than 20%. error FeeTooHigh(); /// @dev Admin can not set a lock period longer than 90 days. error LockTooLong(); /// @dev Token ID does not exist. error TokenDoesNotExist(); /// @dev Token ID is not owned by the caller or approved. error NotOwnerNorApproved(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Emitted when a user stakes event Staked(address indexed user, uint216 amount, uint256 tokenId); /// @dev Emitted when a bond staking position is increased event Increased(uint256 indexed tokenId, uint216 amount); /// @dev Emitted when a user unstakes event Unstaked(address indexed user, uint216 amount, uint256 tokenId); /// @dev Emitted when a user claims rewards event Claimed(address indexed user, uint256 amount, uint256 tokenId); /// @dev Emitted when owner change Fee event UnstakeLockSet(uint256 _unstakeLock); /// @dev Emitted when owner change Fee event UnstakeFeeSet(uint256 _unstakeFee); /// @dev Emitted when owner change BaseURI event BaseURISet(string baseURI_); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Token ID counter uint256 private _tokenIdCounter; /// @dev Base URI for every token string private baseURI; /// @dev Unstake lock period uint256 public unstakeLock; /// @dev Unstake fee percentage uint16 public unstakeFee; /// @dev Timestamp of when the rewards finish uint40 private immutable finishAt; /// @dev Minimum of last updated time and reward finish time uint40 public updatedAt; /// @dev Reward to be paid out per second uint256 public immutable rewardRate; /// @dev Sum of (reward rate * dt * 1e18 / total supply) uint256 public rewardPerTokenStored; /// @dev Bond tokenId => rewardPerTokenStored mapping(uint256 tokenId => uint256) public bondRewardPerTokenPaid; /// @dev Bond tokenId => rewards to be claimed mapping(uint256 tokenId => uint256) public rewards; /// @dev Total staked uint216 public totalStaked; /// @dev Holds the staking position (balance and timestamp of when it was created) struct StakingBond { uint216 balanceOf; // PETER balance of the staking position uint40 stakedAt; // Timestamp of when the staking position was created } /// @dev Bond tokenId => staking position mapping(uint256 tokenId => StakingBond) public stakingBonds; /// @param _duration of the rewards distribution constructor(uint40 _duration) ERC721("Carrot Bond", "POCBOND") { unstakeLock = 28 days; unstakeFee = 10_00; // 10% rewardRate = 1882980 ether / _duration; finishAt = uint40(block.timestamp) + _duration; updatedAt = uint40(block.timestamp); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* USER FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Stake PETER to earn rewards, and mint a bond NFT. function stake_f96d5a(uint216 _amount) external { if (_amount == 0) revert AmountIsZero(); PETER.transferFrom(msg.sender, address(this), _amount); // Mint a bond NFT uint256 tokenId = _tokenIdCounter++; updateReward(tokenId); stakingBonds[tokenId].balanceOf = _amount; stakingBonds[tokenId].stakedAt = uint40(block.timestamp); unchecked { totalStaked += _amount; } _safeMint(msg.sender, tokenId); emit Staked(msg.sender, _amount, tokenId); } /// @dev Increase the staking position of a bond NFT. function increaseStake_9f4c06(uint256 _tokenId, uint216 _amount) external { if (_amount == 0) revert AmountIsZero(); if (ownerOf(_tokenId) == address(0)) revert TokenDoesNotExist(); updateReward(_tokenId); PETER.transferFrom(msg.sender, address(this), _amount); unchecked { stakingBonds[_tokenId].stakedAt = uint40(block.timestamp); stakingBonds[_tokenId].balanceOf += _amount; totalStaked += _amount; } emit Increased(_tokenId, _amount); } /// @dev Claim rewards for a bond NFT, withdraw staking token and burn the bond NFT. function unstake_39c37c(uint256 tokenId) external { address bondOwner = ownerOf(tokenId); if (bondOwner != msg.sender) revert NotOwnerNorApproved(); StakingBond memory stakingBond = stakingBonds[tokenId]; updateReward(tokenId); payReward(tokenId); _burn(tokenId); if (stakingBond.stakedAt + unstakeLock > block.timestamp) { uint256 fee = stakingBond.balanceOf * unstakeFee / 100_00; PETER.transfer(DEATH, fee); PETER.transfer(bondOwner, stakingBond.balanceOf - fee); } else { PETER.transfer(bondOwner, stakingBond.balanceOf); } unchecked { totalStaked -= stakingBond.balanceOf; } delete stakingBonds[tokenId]; emit Unstaked(msg.sender, stakingBond.balanceOf, tokenId); } /// @dev Claim rewards for a bond NFT. function getReward_0bfb78(uint256 tokenId) external { updateReward(tokenId); payReward(tokenId); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* OWNER FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev sets period of time where unstaking is punished function setUnstakingLock(uint256 _unstakeLock) external onlyOwner { if (_unstakeLock > 90 days) revert LockTooLong(); unstakeLock = _unstakeLock; emit UnstakeLockSet(_unstakeLock); } /// @dev sets fee for unstaking during lock period function setUnstakingFee(uint16 _unstakeFee) external onlyOwner { if (_unstakeFee > 20_00) revert FeeTooHigh(); unstakeFee = _unstakeFee; emit UnstakeFeeSet(_unstakeFee); } /// @dev sets a new base URI for the tokenURI function setBaseURI(string memory baseURI_) external onlyOwner { baseURI = baseURI_; emit BaseURISet(baseURI_); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Updates the reward for a bond NFT. function updateReward(uint256 _tokenId) internal { rewardPerTokenStored = rewardPerToken(); updatedAt = lastTimeRewardApplicable(); rewards[_tokenId] = earned(_tokenId); bondRewardPerTokenPaid[_tokenId] = rewardPerTokenStored; } /// @dev transfer the reward tokens to the owner of the bond NFT. function payReward(uint256 tokenId) internal { uint256 reward = rewards[tokenId]; if (reward > 0) { rewards[tokenId] = 0; CARROT.transfer(ownerOf(tokenId), reward); } emit Claimed(ownerOf(tokenId), reward, tokenId); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* VIEW FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns token URI. function _baseURI() internal view virtual override returns (string memory) { return baseURI; } /// @dev Returns the amount of staked tokens, the timestamp of the stake and the rewards for a bond NFT. function bondData(uint256 tokenId) public view returns (uint216, uint40, uint256) { return ( stakingBonds[tokenId].balanceOf, stakingBonds[tokenId].stakedAt, earned(tokenId) ); } /// @dev Returns the amount of reward tokens for a bond NFT. function earned(uint256 tokenId) public view returns (uint256) { return ( ( stakingBonds[tokenId].balanceOf * (rewardPerToken() - bondRewardPerTokenPaid[tokenId]) ) / 1e18 ) + rewards[tokenId]; } function lastTimeRewardApplicable() public view returns (uint40) { uint40 _now = uint40(block.timestamp); return finishAt >= _now ? _now : finishAt; } function rewardPerToken() public view returns (uint256) { if (totalStaked == 0) { return rewardPerTokenStored; } return rewardPerTokenStored + (rewardRate * (lastTimeRewardApplicable() - updatedAt) * 1e18) / totalStaked; } // The following functions are overrides required by Solidity. function _beforeTokenTransfer( address from, address to, uint256 tokenId, uint256 batchSize ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId, batchSize); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint40","name":"_duration","type":"uint40"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountIsZero","type":"error"},{"inputs":[],"name":"FeeTooHigh","type":"error"},{"inputs":[],"name":"LockTooLong","type":"error"},{"inputs":[],"name":"NotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TokenDoesNotExist","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI_","type":"string"}],"name":"BaseURISet","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":"tokenId","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint216","name":"amount","type":"uint216"}],"name":"Increased","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":"uint216","name":"amount","type":"uint216"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_unstakeFee","type":"uint256"}],"name":"UnstakeFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_unstakeLock","type":"uint256"}],"name":"UnstakeLockSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint216","name":"amount","type":"uint216"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"bondData","outputs":[{"internalType":"uint216","name":"","type":"uint216"},{"internalType":"uint40","name":"","type":"uint40"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"bondRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getReward_0bfb78","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint216","name":"_amount","type":"uint216"}],"name":"increaseStake_9f4c06","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_unstakeFee","type":"uint16"}],"name":"setUnstakingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_unstakeLock","type":"uint256"}],"name":"setUnstakingLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint216","name":"_amount","type":"uint216"}],"name":"stake_f96d5a","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakingBonds","outputs":[{"internalType":"uint216","name":"balanceOf","type":"uint216"},{"internalType":"uint40","name":"stakedAt","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint216","name":"","type":"uint216"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unstakeLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unstake_39c37c","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updatedAt","outputs":[{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c060405234801562000010575f80fd5b50604051620056173803806200561783398181016040528101906200003691906200029d565b6040518060400160405280600b81526020017f436172726f7420426f6e640000000000000000000000000000000000000000008152506040518060400160405280600781526020017f504f43424f4e4400000000000000000000000000000000000000000000000000815250815f9081620000b2919062000531565b508060019081620000c4919062000531565b505050620000e7620000db6200019060201b60201c565b6200019760201b60201c565b6224ea00600d819055506103e8600e5f6101000a81548161ffff021916908361ffff1602179055508064ffffffffff166a018ebc8ce2e8636f1000006200012f919062000685565b6affffffffffffffffffffff1660a081815250508042620001519190620006bc565b64ffffffffff1660808164ffffffffff168152505042600e60026101000a81548164ffffffffff021916908364ffffffffff16021790555050620006fb565b5f33905090565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f64ffffffffff82169050919050565b62000279816200025e565b811462000284575f80fd5b50565b5f8151905062000297816200026e565b92915050565b5f60208284031215620002b557620002b46200025a565b5b5f620002c48482850162000287565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200034957607f821691505b6020821081036200035f576200035e62000304565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620003c37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000386565b620003cf868362000386565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000419620004136200040d84620003e7565b620003f0565b620003e7565b9050919050565b5f819050919050565b6200043483620003f9565b6200044c620004438262000420565b84845462000392565b825550505050565b5f90565b6200046262000454565b6200046f81848462000429565b505050565b5b8181101562000496576200048a5f8262000458565b60018101905062000475565b5050565b601f821115620004e557620004af8162000365565b620004ba8462000377565b81016020851015620004ca578190505b620004e2620004d98562000377565b83018262000474565b50505b505050565b5f82821c905092915050565b5f620005075f1984600802620004ea565b1980831691505092915050565b5f620005218383620004f6565b9150826002028217905092915050565b6200053c82620002cd565b67ffffffffffffffff811115620005585762000557620002d7565b5b62000564825462000331565b620005718282856200049a565b5f60209050601f831160018114620005a7575f841562000592578287015190505b6200059e858262000514565b8655506200060d565b601f198416620005b78662000365565b5f5b82811015620005e057848901518255600182019150602085019450602081019050620005b9565b86831015620006005784890151620005fc601f891682620004f6565b8355505b6001600288020188555050505b505050505050565b5f6affffffffffffffffffffff82169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f620006918262000615565b91506200069e8362000615565b925082620006b157620006b06200062b565b5b828204905092915050565b5f620006c8826200025e565b9150620006d5836200025e565b9250828201905064ffffffffff811115620006f557620006f462000658565b5b92915050565b60805160a051614eec6200072b5f395f81816115700152611ce901525f81816115a101526115cf0152614eec5ff3fe608060405234801561000f575f80fd5b5060043610610235575f3560e01c80637519ab5011610139578063a22cb465116100b6578063cd3daf9d1161007a578063cd3daf9d146106d2578063df136d65146106f0578063e985e9c51461070e578063f2fde38b1461073e578063f301af421461075a57610235565b8063a22cb46514610632578063ad6d59601461064e578063b88d4fde1461066a578063c347b28614610686578063c87b56dd146106a257610235565b80638ea97d26116100fd5780638ea97d2614610575578063913a64d81461059357806395d89b41146105b1578063997ecf69146105cf5780639eade4811461060057610235565b80637519ab50146104df5780637b0a47ee146104fd57806380faa57d1461051b578063817b1cd2146105395780638da5cb5b1461055757610235565b806323b872dd116101c757806355f804b31161018b57806355f804b3146104295780636352211e1461044557806370a0823114610475578063715018a6146104a55780637365c104146104af57610235565b806323b872dd146103615780632f745c591461037d57806342842e0e146103ad5780634d6ed8c4146103c95780634f6ccce7146103f957610235565b8063081812fc1161020e578063081812fc146102bf578063095ea7b3146102ef57806309d2f0d71461030b5780631026f1b51461032757806318160ddd1461034357610235565b80606714610239578060df1461025557806301ffc9a71461027157806306fdde03146102a1575b5f80fd5b610253600480360381019061024e919061366e565b61078a565b005b61026f600480360381019061026a919061366e565b61079f565b005b61028b600480360381019061028691906136ee565b610c5d565b6040516102989190613733565b60405180910390f35b6102a9610c6e565b6040516102b691906137d6565b60405180910390f35b6102d960048036038101906102d4919061366e565b610cfd565b6040516102e69190613835565b60405180910390f35b61030960048036038101906103049190613878565b610d3f565b005b61032560048036038101906103209190613906565b610e55565b005b610341600480360381019061033c919061366e565b6110ca565b005b61034b611150565b6040516103589190613940565b60405180910390f35b61037b60048036038101906103769190613959565b61115c565b005b61039760048036038101906103929190613878565b6111bc565b6040516103a49190613940565b60405180910390f35b6103c760048036038101906103c29190613959565b61125c565b005b6103e360048036038101906103de919061366e565b61127b565b6040516103f09190613940565b60405180910390f35b610413600480360381019061040e919061366e565b611337565b6040516104209190613940565b60405180910390f35b610443600480360381019061043e9190613ad5565b6113a5565b005b61045f600480360381019061045a919061366e565b6113f7565b60405161046c9190613835565b60405180910390f35b61048f600480360381019061048a9190613b1c565b61147b565b60405161049c9190613940565b60405180910390f35b6104ad61152f565b005b6104c960048036038101906104c4919061366e565b611542565b6040516104d69190613940565b60405180910390f35b6104e7611557565b6040516104f49190613b66565b60405180910390f35b61050561156e565b6040516105129190613940565b60405180910390f35b610523611592565b6040516105309190613b66565b60405180910390f35b6105416115fb565b60405161054e9190613b8e565b60405180910390f35b61055f611627565b60405161056c9190613835565b60405180910390f35b61057d61164f565b60405161058a9190613bc3565b60405180910390f35b61059b611662565b6040516105a89190613940565b60405180910390f35b6105b9611668565b6040516105c691906137d6565b60405180910390f35b6105e960048036038101906105e4919061366e565b6116f8565b6040516105f7929190613bdc565b60405180910390f35b61061a6004803603810190610615919061366e565b61174e565b60405161062993929190613c03565b60405180910390f35b61064c60048036038101906106479190613c62565b6117c6565b005b61066860048036038101906106639190613cca565b6117dc565b005b610684600480360381019061067f9190613d93565b61187a565b005b6106a0600480360381019061069b9190613e13565b6118dc565b005b6106bc60048036038101906106b7919061366e565b611baf565b6040516106c991906137d6565b60405180910390f35b6106da611c14565b6040516106e79190613940565b60405180910390f35b6106f8611d39565b6040516107059190613940565b60405180910390f35b61072860048036038101906107239190613e51565b611d3f565b6040516107359190613733565b60405180910390f35b61075860048036038101906107539190613b1c565b611dcd565b005b610774600480360381019061076f919061366e565b611e4f565b6040516107819190613940565b60405180910390f35b61079381611e64565b61079c81611ed5565b50565b5f6107a9826113f7565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610810576040517f4b6e7f1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60135f8481526020019081526020015f206040518060400160405290815f82015f9054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff167affffffffffffffffffffffffffffffffffffffffffffffffffffff167affffffffffffffffffffffffffffffffffffffffffffffffffffff1681526020015f8201601b9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff168152505090506108c983611e64565b6108d283611ed5565b6108db83611ffd565b42600d54826020015164ffffffffff166108f59190613ebc565b1115610a9d575f612710600e5f9054906101000a900461ffff1661ffff16835f01516109219190613eef565b61092b9190613f5d565b7affffffffffffffffffffffffffffffffffffffffffffffffffffff16905073b34ad97e33a06a44e0ef28337a07bfc1f3224f8c73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61dead836040518363ffffffff1660e01b815260040161099b929190613f8d565b6020604051808303815f875af11580156109b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109db9190613fc8565b5073b34ad97e33a06a44e0ef28337a07bfc1f3224f8c73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8483855f01517affffffffffffffffffffffffffffffffffffffffffffffffffffff16610a399190613ff3565b6040518363ffffffff1660e01b8152600401610a56929190613f8d565b6020604051808303815f875af1158015610a72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a969190613fc8565b5050610b31565b73b34ad97e33a06a44e0ef28337a07bfc1f3224f8c73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83835f01516040518363ffffffff1660e01b8152600401610aef92919061405f565b6020604051808303815f875af1158015610b0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2f9190613fc8565b505b805f015160125f8282829054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff160392506101000a8154817affffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837affffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555060135f8481526020019081526020015f205f8082015f6101000a8154907affffffffffffffffffffffffffffffffffffffffffffffffffffff02191690555f8201601b6101000a81549064ffffffffff021916905550503373ffffffffffffffffffffffffffffffffffffffff167fbff27493fea407618d129a6dee32bb181cb41090c097461449eea3c751fbb496825f015185604051610c50929190614086565b60405180910390a2505050565b5f610c678261213e565b9050919050565b60605f8054610c7c906140da565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca8906140da565b8015610cf35780601f10610cca57610100808354040283529160200191610cf3565b820191905f5260205f20905b815481529060010190602001808311610cd657829003601f168201915b5050505050905090565b5f610d07826121b7565b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610d49826113f7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db09061417a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dd8612202565b73ffffffffffffffffffffffffffffffffffffffff161480610e075750610e0681610e01612202565b611d3f565b5b610e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3d90614208565b60405180910390fd5b610e508383612209565b505050565b5f817affffffffffffffffffffffffffffffffffffffffffffffffffffff1603610eab576040517f43ad20fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73b34ad97e33a06a44e0ef28337a07bfc1f3224f8c73ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401610efc93929190614226565b6020604051808303815f875af1158015610f18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3c9190613fc8565b505f600b5f815480929190610f509061425b565b919050559050610f5f81611e64565b8160135f8381526020019081526020015f205f015f6101000a8154817affffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837affffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055504260135f8381526020019081526020015f205f01601b6101000a81548164ffffffffff021916908364ffffffffff1602179055508160125f8282829054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff160192506101000a8154817affffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837affffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555061107633826122bf565b3373ffffffffffffffffffffffffffffffffffffffff167ffc6a6ecc972fac6eec3610d6d71dd34c1a35e357c84b627a1e72d97b8386424383836040516110be929190614086565b60405180910390a25050565b6110d26122dc565b6276a70081111561110f576040517fd6946a4300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d819055507f9c8c15871385a80640b282653afb7bf46e89000c347c160cc8f2fe9b1c8b1ff8816040516111459190613940565b60405180910390a150565b5f600880549050905090565b61116d611167612202565b8261235a565b6111ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a390614312565b60405180910390fd5b6111b78383836123ee565b505050565b5f6111c68361147b565b8210611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fe906143a0565b60405180910390fd5b60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f2054905092915050565b61127683838360405180602001604052805f81525061187a565b505050565b5f60115f8381526020019081526020015f2054670de0b6b3a764000060105f8581526020019081526020015f20546112b1611c14565b6112bb9190613ff3565b60135f8681526020019081526020015f205f015f9054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff167affffffffffffffffffffffffffffffffffffffffffffffffffffff1661131c91906143be565b61132691906143ff565b6113309190613ebc565b9050919050565b5f611340611150565b8210611381576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113789061449f565b60405180910390fd5b60088281548110611395576113946144bd565b5b905f5260205f2001549050919050565b6113ad6122dc565b80600c90816113bc919061467e565b507ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f6816040516113ec91906137d6565b60405180910390a150565b5f80611402836126da565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146990614797565b60405180910390fd5b80915050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190614825565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6115376122dc565b6115405f612713565b565b6010602052805f5260405f205f915090505481565b600e60029054906101000a900464ffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f804290508064ffffffffff167f000000000000000000000000000000000000000000000000000000000000000064ffffffffff1610156115f3577f00000000000000000000000000000000000000000000000000000000000000006115f5565b805b91505090565b60125f9054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff1681565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5f9054906101000a900461ffff1681565b600d5481565b606060018054611677906140da565b80601f01602080910402602001604051908101604052809291908181526020018280546116a3906140da565b80156116ee5780601f106116c5576101008083540402835291602001916116ee565b820191905f5260205f20905b8154815290600101906020018083116116d157829003601f168201915b5050505050905090565b6013602052805f5260405f205f91509050805f015f9054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff1690805f01601b9054906101000a900464ffffffffff16905082565b5f805f60135f8581526020019081526020015f205f015f9054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff1660135f8681526020019081526020015f205f01601b9054906101000a900464ffffffffff166117b98661127b565b9250925092509193909250565b6117d86117d1612202565b83836127d6565b5050565b6117e46122dc565b6107d08161ffff161115611824576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e5f6101000a81548161ffff021916908361ffff1602179055507fcde066df81929c6d35910e532fa34cf5efe1c072c641747530749c389ae225e48160405161186f9190614873565b60405180910390a150565b61188b611885612202565b8361235a565b6118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614312565b60405180910390fd5b6118d68484848461293d565b50505050565b5f817affffffffffffffffffffffffffffffffffffffffffffffffffffff1603611932576040517f43ad20fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16611952836113f7565b73ffffffffffffffffffffffffffffffffffffffff160361199f576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119a882611e64565b73b34ad97e33a06a44e0ef28337a07bfc1f3224f8c73ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016119f993929190614226565b6020604051808303815f875af1158015611a15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a399190613fc8565b504260135f8481526020019081526020015f205f01601b6101000a81548164ffffffffff021916908364ffffffffff1602179055508060135f8481526020019081526020015f205f015f8282829054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff160192506101000a8154817affffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837affffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055508060125f8282829054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff160192506101000a8154817affffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837affffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550817faa442a1362c3c03f3897342cf7d87788575f77ba7f79161b08eca8c8b62bea2082604051611ba39190613b8e565b60405180910390a25050565b6060611bba826121b7565b5f611bc3612999565b90505f815111611be15760405180602001604052805f815250611c0c565b80611beb84612a29565b604051602001611bfc9291906148c6565b6040516020818303038152906040525b915050919050565b5f8060125f9054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff167affffffffffffffffffffffffffffffffffffffffffffffffffffff1603611c6b57600f549050611d36565b60125f9054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff167affffffffffffffffffffffffffffffffffffffffffffffffffffff16670de0b6b3a7640000600e60029054906101000a900464ffffffffff16611cd6611592565b611ce091906148e9565b64ffffffffff167f0000000000000000000000000000000000000000000000000000000000000000611d1291906143be565b611d1c91906143be565b611d2691906143ff565b600f54611d339190613ebc565b90505b90565b600f5481565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611dd56122dc565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3a90614991565b60405180910390fd5b611e4c81612713565b50565b6011602052805f5260405f205f915090505481565b611e6c611c14565b600f81905550611e7a611592565b600e60026101000a81548164ffffffffff021916908364ffffffffff160217905550611ea58161127b565b60115f8381526020019081526020015f2081905550600f5460105f8381526020019081526020015f208190555050565b5f60115f8381526020019081526020015f205490505f811115611fa1575f60115f8481526020019081526020015f20819055507387a9347a1a16a5c86242367fcd5bd5c3dc0e2dc673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611f41846113f7565b836040518363ffffffff1660e01b8152600401611f5f929190613f8d565b6020604051808303815f875af1158015611f7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9f9190613fc8565b505b611faa826113f7565b73ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a8284604051611ff19291906149af565b60405180910390a25050565b5f612007826113f7565b9050612016815f846001612af3565b61201f826113f7565b905060045f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254039250508190555060025f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055815f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461213a815f846001612b05565b5050565b5f7f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121b057506121af82612b0b565b5b9050919050565b6121c081612bec565b6121ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f690614797565b60405180910390fd5b50565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612279836113f7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6122d8828260405180602001604052805f815250612c2c565b5050565b6122e4612202565b73ffffffffffffffffffffffffffffffffffffffff16612302611627565b73ffffffffffffffffffffffffffffffffffffffff1614612358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234f90614a20565b60405180910390fd5b565b5f80612365836113f7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123a757506123a68185611d3f565b5b806123e557508373ffffffffffffffffffffffffffffffffffffffff166123cd84610cfd565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661240e826113f7565b73ffffffffffffffffffffffffffffffffffffffff1614612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245b90614aae565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c990614b3c565b60405180910390fd5b6124df8383836001612af3565b8273ffffffffffffffffffffffffffffffffffffffff166124ff826113f7565b73ffffffffffffffffffffffffffffffffffffffff1614612555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254c90614aae565b60405180910390fd5b60045f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540392505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126d58383836001612b05565b505050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283b90614ba4565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129309190613733565b60405180910390a3505050565b6129488484846123ee565b61295484848484612c86565b612993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298a90614c32565b60405180910390fd5b50505050565b6060600c80546129a8906140da565b80601f01602080910402602001604051908101604052809291908181526020018280546129d4906140da565b8015612a1f5780601f106129f657610100808354040283529160200191612a1f565b820191905f5260205f20905b815481529060010190602001808311612a0257829003601f168201915b5050505050905090565b60605f6001612a3784612e08565b0190505f8167ffffffffffffffff811115612a5557612a546139b1565b5b6040519080825280601f01601f191660200182016040528015612a875781602001600182028036833780820191505090505b5090505f82602001820190505b600115612ae8578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612add57612adc613f30565b5b0494505f8503612a94575b819350505050919050565b612aff84848484612f59565b50505050565b50505050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bd557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612be55750612be4826130b4565b5b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff16612c0d836126da565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612c36838361311d565b612c425f848484612c86565b612c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7890614c32565b60405180910390fd5b505050565b5f612ca68473ffffffffffffffffffffffffffffffffffffffff16613330565b15612dfb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ccf612202565b8786866040518563ffffffff1660e01b8152600401612cf19493929190614ca2565b6020604051808303815f875af1925050508015612d2c57506040513d601f19601f82011682018060405250810190612d299190614d00565b60015b612dab573d805f8114612d5a576040519150601f19603f3d011682016040523d82523d5f602084013e612d5f565b606091505b505f815103612da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9a90614c32565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e00565b600190505b949350505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612e64577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612e5a57612e59613f30565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ea1576d04ee2d6d415b85acef81000000008381612e9757612e96613f30565b5b0492506020810190505b662386f26fc100008310612ed057662386f26fc100008381612ec657612ec5613f30565b5b0492506010810190505b6305f5e1008310612ef9576305f5e1008381612eef57612eee613f30565b5b0492506008810190505b6127108310612f1e576127108381612f1457612f13613f30565b5b0492506004810190505b60648310612f415760648381612f3757612f36613f30565b5b0492506002810190505b600a8310612f50576001810190505b80915050919050565b612f6584848484613352565b6001811115612fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa090614d9b565b60405180910390fd5b5f8290505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612fee57612fe981613358565b61302d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461302c5761302b858261339c565b5b5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361306e57613069816134f2565b6130ad565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146130ac576130ab84826135b2565b5b5b5050505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361318b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318290614e03565b60405180910390fd5b61319481612bec565b156131d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cb90614e6b565b60405180910390fd5b6131e15f83836001612af3565b6131ea81612bec565b1561322a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322190614e6b565b60405180910390fd5b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461332c5f83836001612b05565b5050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b60088054905060095f8381526020019081526020015f2081905550600881908060018154018082558091505060019003905f5260205f20015f909190919091505550565b5f60016133a88461147b565b6133b29190613ff3565b90505f60075f8481526020019081526020015f20549050818114613489575f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205490508060065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f20819055508160075f8381526020019081526020015f2081905550505b60075f8481526020019081526020015f205f905560065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f905550505050565b5f60016008805490506135059190613ff3565b90505f60095f8481526020019081526020015f205490505f60088381548110613531576135306144bd565b5b905f5260205f20015490508060088381548110613551576135506144bd565b5b905f5260205f2001819055508160095f8381526020019081526020015f208190555060095f8581526020019081526020015f205f9055600880548061359957613598614e89565b5b600190038181905f5260205f20015f9055905550505050565b5f6135bc8361147b565b90508160065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20819055508060075f8481526020019081526020015f2081905550505050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61364d8161363b565b8114613657575f80fd5b50565b5f8135905061366881613644565b92915050565b5f6020828403121561368357613682613633565b5b5f6136908482850161365a565b91505092915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136cd81613699565b81146136d7575f80fd5b50565b5f813590506136e8816136c4565b92915050565b5f6020828403121561370357613702613633565b5b5f613710848285016136da565b91505092915050565b5f8115159050919050565b61372d81613719565b82525050565b5f6020820190506137465f830184613724565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613783578082015181840152602081019050613768565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6137a88261374c565b6137b28185613756565b93506137c2818560208601613766565b6137cb8161378e565b840191505092915050565b5f6020820190508181035f8301526137ee818461379e565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61381f826137f6565b9050919050565b61382f81613815565b82525050565b5f6020820190506138485f830184613826565b92915050565b61385781613815565b8114613861575f80fd5b50565b5f813590506138728161384e565b92915050565b5f806040838503121561388e5761388d613633565b5b5f61389b85828601613864565b92505060206138ac8582860161365a565b9150509250929050565b5f7affffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6138e5816138b6565b81146138ef575f80fd5b50565b5f81359050613900816138dc565b92915050565b5f6020828403121561391b5761391a613633565b5b5f613928848285016138f2565b91505092915050565b61393a8161363b565b82525050565b5f6020820190506139535f830184613931565b92915050565b5f805f606084860312156139705761396f613633565b5b5f61397d86828701613864565b935050602061398e86828701613864565b925050604061399f8682870161365a565b9150509250925092565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6139e78261378e565b810181811067ffffffffffffffff82111715613a0657613a056139b1565b5b80604052505050565b5f613a1861362a565b9050613a2482826139de565b919050565b5f67ffffffffffffffff821115613a4357613a426139b1565b5b613a4c8261378e565b9050602081019050919050565b828183375f83830152505050565b5f613a79613a7484613a29565b613a0f565b905082815260208101848484011115613a9557613a946139ad565b5b613aa0848285613a59565b509392505050565b5f82601f830112613abc57613abb6139a9565b5b8135613acc848260208601613a67565b91505092915050565b5f60208284031215613aea57613ae9613633565b5b5f82013567ffffffffffffffff811115613b0757613b06613637565b5b613b1384828501613aa8565b91505092915050565b5f60208284031215613b3157613b30613633565b5b5f613b3e84828501613864565b91505092915050565b5f64ffffffffff82169050919050565b613b6081613b47565b82525050565b5f602082019050613b795f830184613b57565b92915050565b613b88816138b6565b82525050565b5f602082019050613ba15f830184613b7f565b92915050565b5f61ffff82169050919050565b613bbd81613ba7565b82525050565b5f602082019050613bd65f830184613bb4565b92915050565b5f604082019050613bef5f830185613b7f565b613bfc6020830184613b57565b9392505050565b5f606082019050613c165f830186613b7f565b613c236020830185613b57565b613c306040830184613931565b949350505050565b613c4181613719565b8114613c4b575f80fd5b50565b5f81359050613c5c81613c38565b92915050565b5f8060408385031215613c7857613c77613633565b5b5f613c8585828601613864565b9250506020613c9685828601613c4e565b9150509250929050565b613ca981613ba7565b8114613cb3575f80fd5b50565b5f81359050613cc481613ca0565b92915050565b5f60208284031215613cdf57613cde613633565b5b5f613cec84828501613cb6565b91505092915050565b5f67ffffffffffffffff821115613d0f57613d0e6139b1565b5b613d188261378e565b9050602081019050919050565b5f613d37613d3284613cf5565b613a0f565b905082815260208101848484011115613d5357613d526139ad565b5b613d5e848285613a59565b509392505050565b5f82601f830112613d7a57613d796139a9565b5b8135613d8a848260208601613d25565b91505092915050565b5f805f8060808587031215613dab57613daa613633565b5b5f613db887828801613864565b9450506020613dc987828801613864565b9350506040613dda8782880161365a565b925050606085013567ffffffffffffffff811115613dfb57613dfa613637565b5b613e0787828801613d66565b91505092959194509250565b5f8060408385031215613e2957613e28613633565b5b5f613e368582860161365a565b9250506020613e47858286016138f2565b9150509250929050565b5f8060408385031215613e6757613e66613633565b5b5f613e7485828601613864565b9250506020613e8585828601613864565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613ec68261363b565b9150613ed18361363b565b9250828201905080821115613ee957613ee8613e8f565b5b92915050565b5f613ef9826138b6565b9150613f04836138b6565b9250828202613f12816138b6565b91508282048414831517613f2957613f28613e8f565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613f67826138b6565b9150613f72836138b6565b925082613f8257613f81613f30565b5b828204905092915050565b5f604082019050613fa05f830185613826565b613fad6020830184613931565b9392505050565b5f81519050613fc281613c38565b92915050565b5f60208284031215613fdd57613fdc613633565b5b5f613fea84828501613fb4565b91505092915050565b5f613ffd8261363b565b91506140088361363b565b92508282039050818111156140205761401f613e8f565b5b92915050565b5f819050919050565b5f61404961404461403f846138b6565b614026565b61363b565b9050919050565b6140598161402f565b82525050565b5f6040820190506140725f830185613826565b61407f6020830184614050565b9392505050565b5f6040820190506140995f830185613b7f565b6140a66020830184613931565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806140f157607f821691505b602082108103614104576141036140ad565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f614164602183613756565b915061416f8261410a565b604082019050919050565b5f6020820190508181035f83015261419181614158565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f5f8201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b5f6141f2603d83613756565b91506141fd82614198565b604082019050919050565b5f6020820190508181035f83015261421f816141e6565b9050919050565b5f6060820190506142395f830186613826565b6142466020830185613826565b6142536040830184614050565b949350505050565b5f6142658261363b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361429757614296613e8f565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e655f8201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b5f6142fc602d83613756565b9150614307826142a2565b604082019050919050565b5f6020820190508181035f830152614329816142f0565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f755f8201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b5f61438a602b83613756565b915061439582614330565b604082019050919050565b5f6020820190508181035f8301526143b78161437e565b9050919050565b5f6143c88261363b565b91506143d38361363b565b92508282026143e18161363b565b915082820484148315176143f8576143f7613e8f565b5b5092915050565b5f6144098261363b565b91506144148361363b565b92508261442457614423613f30565b5b828204905092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f5f8201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b5f614489602c83613756565b91506144948261442f565b604082019050919050565b5f6020820190508181035f8301526144b68161447d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026145467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261450b565b614550868361450b565b95508019841693508086168417925050509392505050565b5f61458261457d6145788461363b565b614026565b61363b565b9050919050565b5f819050919050565b61459b83614568565b6145af6145a782614589565b848454614517565b825550505050565b5f90565b6145c36145b7565b6145ce818484614592565b505050565b5b818110156145f1576145e65f826145bb565b6001810190506145d4565b5050565b601f82111561463657614607816144ea565b614610846144fc565b8101602085101561461f578190505b61463361462b856144fc565b8301826145d3565b50505b505050565b5f82821c905092915050565b5f6146565f198460080261463b565b1980831691505092915050565b5f61466e8383614647565b9150826002028217905092915050565b6146878261374c565b67ffffffffffffffff8111156146a05761469f6139b1565b5b6146aa82546140da565b6146b58282856145f5565b5f60209050601f8311600181146146e6575f84156146d4578287015190505b6146de8582614663565b865550614745565b601f1984166146f4866144ea565b5f5b8281101561471b578489015182556001820191506020850194506020810190506146f6565b868310156147385784890151614734601f891682614647565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e20494400000000000000005f82015250565b5f614781601883613756565b915061478c8261474d565b602082019050919050565b5f6020820190508181035f8301526147ae81614775565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f7420612076615f8201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b5f61480f602983613756565b915061481a826147b5565b604082019050919050565b5f6020820190508181035f83015261483c81614803565b9050919050565b5f61485d61485861485384613ba7565b614026565b61363b565b9050919050565b61486d81614843565b82525050565b5f6020820190506148865f830184614864565b92915050565b5f81905092915050565b5f6148a08261374c565b6148aa818561488c565b93506148ba818560208601613766565b80840191505092915050565b5f6148d18285614896565b91506148dd8284614896565b91508190509392505050565b5f6148f382613b47565b91506148fe83613b47565b9250828203905064ffffffffff81111561491b5761491a613e8f565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61497b602683613756565b915061498682614921565b604082019050919050565b5f6020820190508181035f8301526149a88161496f565b9050919050565b5f6040820190506149c25f830185613931565b6149cf6020830184613931565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f614a0a602083613756565b9150614a15826149d6565b602082019050919050565b5f6020820190508181035f830152614a37816149fe565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f7272656374205f8201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b5f614a98602583613756565b9150614aa382614a3e565b604082019050919050565b5f6020820190508181035f830152614ac581614a8c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f614b26602483613756565b9150614b3182614acc565b604082019050919050565b5f6020820190508181035f830152614b5381614b1a565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f614b8e601983613756565b9150614b9982614b5a565b602082019050919050565b5f6020820190508181035f830152614bbb81614b82565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f614c1c603283613756565b9150614c2782614bc2565b604082019050919050565b5f6020820190508181035f830152614c4981614c10565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f614c7482614c50565b614c7e8185614c5a565b9350614c8e818560208601613766565b614c978161378e565b840191505092915050565b5f608082019050614cb55f830187613826565b614cc26020830186613826565b614ccf6040830185613931565b8181036060830152614ce18184614c6a565b905095945050505050565b5f81519050614cfa816136c4565b92915050565b5f60208284031215614d1557614d14613633565b5b5f614d2284828501614cec565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e73656375746976652074725f8201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b5f614d85603583613756565b9150614d9082614d2b565b604082019050919050565b5f6020820190508181035f830152614db281614d79565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f614ded602083613756565b9150614df882614db9565b602082019050919050565b5f6020820190508181035f830152614e1a81614de1565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f614e55601c83613756565b9150614e6082614e21565b602082019050919050565b5f6020820190508181035f830152614e8281614e49565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea26469706673582212206a2d66b8b802939966f3111b43efa4dc2c6fe6f5c36725a120ac51b57e900d0964736f6c634300081400330000000000000000000000000000000000000000000000000000000003c26700
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610235575f3560e01c80637519ab5011610139578063a22cb465116100b6578063cd3daf9d1161007a578063cd3daf9d146106d2578063df136d65146106f0578063e985e9c51461070e578063f2fde38b1461073e578063f301af421461075a57610235565b8063a22cb46514610632578063ad6d59601461064e578063b88d4fde1461066a578063c347b28614610686578063c87b56dd146106a257610235565b80638ea97d26116100fd5780638ea97d2614610575578063913a64d81461059357806395d89b41146105b1578063997ecf69146105cf5780639eade4811461060057610235565b80637519ab50146104df5780637b0a47ee146104fd57806380faa57d1461051b578063817b1cd2146105395780638da5cb5b1461055757610235565b806323b872dd116101c757806355f804b31161018b57806355f804b3146104295780636352211e1461044557806370a0823114610475578063715018a6146104a55780637365c104146104af57610235565b806323b872dd146103615780632f745c591461037d57806342842e0e146103ad5780634d6ed8c4146103c95780634f6ccce7146103f957610235565b8063081812fc1161020e578063081812fc146102bf578063095ea7b3146102ef57806309d2f0d71461030b5780631026f1b51461032757806318160ddd1461034357610235565b80606714610239578060df1461025557806301ffc9a71461027157806306fdde03146102a1575b5f80fd5b610253600480360381019061024e919061366e565b61078a565b005b61026f600480360381019061026a919061366e565b61079f565b005b61028b600480360381019061028691906136ee565b610c5d565b6040516102989190613733565b60405180910390f35b6102a9610c6e565b6040516102b691906137d6565b60405180910390f35b6102d960048036038101906102d4919061366e565b610cfd565b6040516102e69190613835565b60405180910390f35b61030960048036038101906103049190613878565b610d3f565b005b61032560048036038101906103209190613906565b610e55565b005b610341600480360381019061033c919061366e565b6110ca565b005b61034b611150565b6040516103589190613940565b60405180910390f35b61037b60048036038101906103769190613959565b61115c565b005b61039760048036038101906103929190613878565b6111bc565b6040516103a49190613940565b60405180910390f35b6103c760048036038101906103c29190613959565b61125c565b005b6103e360048036038101906103de919061366e565b61127b565b6040516103f09190613940565b60405180910390f35b610413600480360381019061040e919061366e565b611337565b6040516104209190613940565b60405180910390f35b610443600480360381019061043e9190613ad5565b6113a5565b005b61045f600480360381019061045a919061366e565b6113f7565b60405161046c9190613835565b60405180910390f35b61048f600480360381019061048a9190613b1c565b61147b565b60405161049c9190613940565b60405180910390f35b6104ad61152f565b005b6104c960048036038101906104c4919061366e565b611542565b6040516104d69190613940565b60405180910390f35b6104e7611557565b6040516104f49190613b66565b60405180910390f35b61050561156e565b6040516105129190613940565b60405180910390f35b610523611592565b6040516105309190613b66565b60405180910390f35b6105416115fb565b60405161054e9190613b8e565b60405180910390f35b61055f611627565b60405161056c9190613835565b60405180910390f35b61057d61164f565b60405161058a9190613bc3565b60405180910390f35b61059b611662565b6040516105a89190613940565b60405180910390f35b6105b9611668565b6040516105c691906137d6565b60405180910390f35b6105e960048036038101906105e4919061366e565b6116f8565b6040516105f7929190613bdc565b60405180910390f35b61061a6004803603810190610615919061366e565b61174e565b60405161062993929190613c03565b60405180910390f35b61064c60048036038101906106479190613c62565b6117c6565b005b61066860048036038101906106639190613cca565b6117dc565b005b610684600480360381019061067f9190613d93565b61187a565b005b6106a0600480360381019061069b9190613e13565b6118dc565b005b6106bc60048036038101906106b7919061366e565b611baf565b6040516106c991906137d6565b60405180910390f35b6106da611c14565b6040516106e79190613940565b60405180910390f35b6106f8611d39565b6040516107059190613940565b60405180910390f35b61072860048036038101906107239190613e51565b611d3f565b6040516107359190613733565b60405180910390f35b61075860048036038101906107539190613b1c565b611dcd565b005b610774600480360381019061076f919061366e565b611e4f565b6040516107819190613940565b60405180910390f35b61079381611e64565b61079c81611ed5565b50565b5f6107a9826113f7565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610810576040517f4b6e7f1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60135f8481526020019081526020015f206040518060400160405290815f82015f9054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff167affffffffffffffffffffffffffffffffffffffffffffffffffffff167affffffffffffffffffffffffffffffffffffffffffffffffffffff1681526020015f8201601b9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff168152505090506108c983611e64565b6108d283611ed5565b6108db83611ffd565b42600d54826020015164ffffffffff166108f59190613ebc565b1115610a9d575f612710600e5f9054906101000a900461ffff1661ffff16835f01516109219190613eef565b61092b9190613f5d565b7affffffffffffffffffffffffffffffffffffffffffffffffffffff16905073b34ad97e33a06a44e0ef28337a07bfc1f3224f8c73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61dead836040518363ffffffff1660e01b815260040161099b929190613f8d565b6020604051808303815f875af11580156109b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109db9190613fc8565b5073b34ad97e33a06a44e0ef28337a07bfc1f3224f8c73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8483855f01517affffffffffffffffffffffffffffffffffffffffffffffffffffff16610a399190613ff3565b6040518363ffffffff1660e01b8152600401610a56929190613f8d565b6020604051808303815f875af1158015610a72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a969190613fc8565b5050610b31565b73b34ad97e33a06a44e0ef28337a07bfc1f3224f8c73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83835f01516040518363ffffffff1660e01b8152600401610aef92919061405f565b6020604051808303815f875af1158015610b0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2f9190613fc8565b505b805f015160125f8282829054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff160392506101000a8154817affffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837affffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555060135f8481526020019081526020015f205f8082015f6101000a8154907affffffffffffffffffffffffffffffffffffffffffffffffffffff02191690555f8201601b6101000a81549064ffffffffff021916905550503373ffffffffffffffffffffffffffffffffffffffff167fbff27493fea407618d129a6dee32bb181cb41090c097461449eea3c751fbb496825f015185604051610c50929190614086565b60405180910390a2505050565b5f610c678261213e565b9050919050565b60605f8054610c7c906140da565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca8906140da565b8015610cf35780601f10610cca57610100808354040283529160200191610cf3565b820191905f5260205f20905b815481529060010190602001808311610cd657829003601f168201915b5050505050905090565b5f610d07826121b7565b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610d49826113f7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db09061417a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dd8612202565b73ffffffffffffffffffffffffffffffffffffffff161480610e075750610e0681610e01612202565b611d3f565b5b610e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3d90614208565b60405180910390fd5b610e508383612209565b505050565b5f817affffffffffffffffffffffffffffffffffffffffffffffffffffff1603610eab576040517f43ad20fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73b34ad97e33a06a44e0ef28337a07bfc1f3224f8c73ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401610efc93929190614226565b6020604051808303815f875af1158015610f18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3c9190613fc8565b505f600b5f815480929190610f509061425b565b919050559050610f5f81611e64565b8160135f8381526020019081526020015f205f015f6101000a8154817affffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837affffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055504260135f8381526020019081526020015f205f01601b6101000a81548164ffffffffff021916908364ffffffffff1602179055508160125f8282829054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff160192506101000a8154817affffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837affffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555061107633826122bf565b3373ffffffffffffffffffffffffffffffffffffffff167ffc6a6ecc972fac6eec3610d6d71dd34c1a35e357c84b627a1e72d97b8386424383836040516110be929190614086565b60405180910390a25050565b6110d26122dc565b6276a70081111561110f576040517fd6946a4300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d819055507f9c8c15871385a80640b282653afb7bf46e89000c347c160cc8f2fe9b1c8b1ff8816040516111459190613940565b60405180910390a150565b5f600880549050905090565b61116d611167612202565b8261235a565b6111ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a390614312565b60405180910390fd5b6111b78383836123ee565b505050565b5f6111c68361147b565b8210611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fe906143a0565b60405180910390fd5b60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f2054905092915050565b61127683838360405180602001604052805f81525061187a565b505050565b5f60115f8381526020019081526020015f2054670de0b6b3a764000060105f8581526020019081526020015f20546112b1611c14565b6112bb9190613ff3565b60135f8681526020019081526020015f205f015f9054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff167affffffffffffffffffffffffffffffffffffffffffffffffffffff1661131c91906143be565b61132691906143ff565b6113309190613ebc565b9050919050565b5f611340611150565b8210611381576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113789061449f565b60405180910390fd5b60088281548110611395576113946144bd565b5b905f5260205f2001549050919050565b6113ad6122dc565b80600c90816113bc919061467e565b507ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f6816040516113ec91906137d6565b60405180910390a150565b5f80611402836126da565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146990614797565b60405180910390fd5b80915050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190614825565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6115376122dc565b6115405f612713565b565b6010602052805f5260405f205f915090505481565b600e60029054906101000a900464ffffffffff1681565b7f000000000000000000000000000000000000000000000000006a107749b0a11881565b5f804290508064ffffffffff167f000000000000000000000000000000000000000000000000000000006849d67364ffffffffff1610156115f3577f000000000000000000000000000000000000000000000000000000006849d6736115f5565b805b91505090565b60125f9054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff1681565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5f9054906101000a900461ffff1681565b600d5481565b606060018054611677906140da565b80601f01602080910402602001604051908101604052809291908181526020018280546116a3906140da565b80156116ee5780601f106116c5576101008083540402835291602001916116ee565b820191905f5260205f20905b8154815290600101906020018083116116d157829003601f168201915b5050505050905090565b6013602052805f5260405f205f91509050805f015f9054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff1690805f01601b9054906101000a900464ffffffffff16905082565b5f805f60135f8581526020019081526020015f205f015f9054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff1660135f8681526020019081526020015f205f01601b9054906101000a900464ffffffffff166117b98661127b565b9250925092509193909250565b6117d86117d1612202565b83836127d6565b5050565b6117e46122dc565b6107d08161ffff161115611824576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e5f6101000a81548161ffff021916908361ffff1602179055507fcde066df81929c6d35910e532fa34cf5efe1c072c641747530749c389ae225e48160405161186f9190614873565b60405180910390a150565b61188b611885612202565b8361235a565b6118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614312565b60405180910390fd5b6118d68484848461293d565b50505050565b5f817affffffffffffffffffffffffffffffffffffffffffffffffffffff1603611932576040517f43ad20fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16611952836113f7565b73ffffffffffffffffffffffffffffffffffffffff160361199f576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119a882611e64565b73b34ad97e33a06a44e0ef28337a07bfc1f3224f8c73ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016119f993929190614226565b6020604051808303815f875af1158015611a15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a399190613fc8565b504260135f8481526020019081526020015f205f01601b6101000a81548164ffffffffff021916908364ffffffffff1602179055508060135f8481526020019081526020015f205f015f8282829054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff160192506101000a8154817affffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837affffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055508060125f8282829054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff160192506101000a8154817affffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837affffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550817faa442a1362c3c03f3897342cf7d87788575f77ba7f79161b08eca8c8b62bea2082604051611ba39190613b8e565b60405180910390a25050565b6060611bba826121b7565b5f611bc3612999565b90505f815111611be15760405180602001604052805f815250611c0c565b80611beb84612a29565b604051602001611bfc9291906148c6565b6040516020818303038152906040525b915050919050565b5f8060125f9054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff167affffffffffffffffffffffffffffffffffffffffffffffffffffff1603611c6b57600f549050611d36565b60125f9054906101000a90047affffffffffffffffffffffffffffffffffffffffffffffffffffff167affffffffffffffffffffffffffffffffffffffffffffffffffffff16670de0b6b3a7640000600e60029054906101000a900464ffffffffff16611cd6611592565b611ce091906148e9565b64ffffffffff167f000000000000000000000000000000000000000000000000006a107749b0a118611d1291906143be565b611d1c91906143be565b611d2691906143ff565b600f54611d339190613ebc565b90505b90565b600f5481565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611dd56122dc565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3a90614991565b60405180910390fd5b611e4c81612713565b50565b6011602052805f5260405f205f915090505481565b611e6c611c14565b600f81905550611e7a611592565b600e60026101000a81548164ffffffffff021916908364ffffffffff160217905550611ea58161127b565b60115f8381526020019081526020015f2081905550600f5460105f8381526020019081526020015f208190555050565b5f60115f8381526020019081526020015f205490505f811115611fa1575f60115f8481526020019081526020015f20819055507387a9347a1a16a5c86242367fcd5bd5c3dc0e2dc673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611f41846113f7565b836040518363ffffffff1660e01b8152600401611f5f929190613f8d565b6020604051808303815f875af1158015611f7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9f9190613fc8565b505b611faa826113f7565b73ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a8284604051611ff19291906149af565b60405180910390a25050565b5f612007826113f7565b9050612016815f846001612af3565b61201f826113f7565b905060045f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254039250508190555060025f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055815f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461213a815f846001612b05565b5050565b5f7f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121b057506121af82612b0b565b5b9050919050565b6121c081612bec565b6121ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f690614797565b60405180910390fd5b50565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612279836113f7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6122d8828260405180602001604052805f815250612c2c565b5050565b6122e4612202565b73ffffffffffffffffffffffffffffffffffffffff16612302611627565b73ffffffffffffffffffffffffffffffffffffffff1614612358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234f90614a20565b60405180910390fd5b565b5f80612365836113f7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123a757506123a68185611d3f565b5b806123e557508373ffffffffffffffffffffffffffffffffffffffff166123cd84610cfd565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661240e826113f7565b73ffffffffffffffffffffffffffffffffffffffff1614612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245b90614aae565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c990614b3c565b60405180910390fd5b6124df8383836001612af3565b8273ffffffffffffffffffffffffffffffffffffffff166124ff826113f7565b73ffffffffffffffffffffffffffffffffffffffff1614612555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254c90614aae565b60405180910390fd5b60045f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540392505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126d58383836001612b05565b505050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283b90614ba4565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129309190613733565b60405180910390a3505050565b6129488484846123ee565b61295484848484612c86565b612993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298a90614c32565b60405180910390fd5b50505050565b6060600c80546129a8906140da565b80601f01602080910402602001604051908101604052809291908181526020018280546129d4906140da565b8015612a1f5780601f106129f657610100808354040283529160200191612a1f565b820191905f5260205f20905b815481529060010190602001808311612a0257829003601f168201915b5050505050905090565b60605f6001612a3784612e08565b0190505f8167ffffffffffffffff811115612a5557612a546139b1565b5b6040519080825280601f01601f191660200182016040528015612a875781602001600182028036833780820191505090505b5090505f82602001820190505b600115612ae8578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612add57612adc613f30565b5b0494505f8503612a94575b819350505050919050565b612aff84848484612f59565b50505050565b50505050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bd557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612be55750612be4826130b4565b5b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff16612c0d836126da565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612c36838361311d565b612c425f848484612c86565b612c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7890614c32565b60405180910390fd5b505050565b5f612ca68473ffffffffffffffffffffffffffffffffffffffff16613330565b15612dfb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ccf612202565b8786866040518563ffffffff1660e01b8152600401612cf19493929190614ca2565b6020604051808303815f875af1925050508015612d2c57506040513d601f19601f82011682018060405250810190612d299190614d00565b60015b612dab573d805f8114612d5a576040519150601f19603f3d011682016040523d82523d5f602084013e612d5f565b606091505b505f815103612da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9a90614c32565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e00565b600190505b949350505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612e64577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612e5a57612e59613f30565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ea1576d04ee2d6d415b85acef81000000008381612e9757612e96613f30565b5b0492506020810190505b662386f26fc100008310612ed057662386f26fc100008381612ec657612ec5613f30565b5b0492506010810190505b6305f5e1008310612ef9576305f5e1008381612eef57612eee613f30565b5b0492506008810190505b6127108310612f1e576127108381612f1457612f13613f30565b5b0492506004810190505b60648310612f415760648381612f3757612f36613f30565b5b0492506002810190505b600a8310612f50576001810190505b80915050919050565b612f6584848484613352565b6001811115612fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa090614d9b565b60405180910390fd5b5f8290505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612fee57612fe981613358565b61302d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461302c5761302b858261339c565b5b5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361306e57613069816134f2565b6130ad565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146130ac576130ab84826135b2565b5b5b5050505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361318b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318290614e03565b60405180910390fd5b61319481612bec565b156131d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cb90614e6b565b60405180910390fd5b6131e15f83836001612af3565b6131ea81612bec565b1561322a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322190614e6b565b60405180910390fd5b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461332c5f83836001612b05565b5050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b60088054905060095f8381526020019081526020015f2081905550600881908060018154018082558091505060019003905f5260205f20015f909190919091505550565b5f60016133a88461147b565b6133b29190613ff3565b90505f60075f8481526020019081526020015f20549050818114613489575f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205490508060065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f20819055508160075f8381526020019081526020015f2081905550505b60075f8481526020019081526020015f205f905560065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f905550505050565b5f60016008805490506135059190613ff3565b90505f60095f8481526020019081526020015f205490505f60088381548110613531576135306144bd565b5b905f5260205f20015490508060088381548110613551576135506144bd565b5b905f5260205f2001819055508160095f8381526020019081526020015f208190555060095f8581526020019081526020015f205f9055600880548061359957613598614e89565b5b600190038181905f5260205f20015f9055905550505050565b5f6135bc8361147b565b90508160065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20819055508060075f8481526020019081526020015f2081905550505050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61364d8161363b565b8114613657575f80fd5b50565b5f8135905061366881613644565b92915050565b5f6020828403121561368357613682613633565b5b5f6136908482850161365a565b91505092915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136cd81613699565b81146136d7575f80fd5b50565b5f813590506136e8816136c4565b92915050565b5f6020828403121561370357613702613633565b5b5f613710848285016136da565b91505092915050565b5f8115159050919050565b61372d81613719565b82525050565b5f6020820190506137465f830184613724565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613783578082015181840152602081019050613768565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6137a88261374c565b6137b28185613756565b93506137c2818560208601613766565b6137cb8161378e565b840191505092915050565b5f6020820190508181035f8301526137ee818461379e565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61381f826137f6565b9050919050565b61382f81613815565b82525050565b5f6020820190506138485f830184613826565b92915050565b61385781613815565b8114613861575f80fd5b50565b5f813590506138728161384e565b92915050565b5f806040838503121561388e5761388d613633565b5b5f61389b85828601613864565b92505060206138ac8582860161365a565b9150509250929050565b5f7affffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6138e5816138b6565b81146138ef575f80fd5b50565b5f81359050613900816138dc565b92915050565b5f6020828403121561391b5761391a613633565b5b5f613928848285016138f2565b91505092915050565b61393a8161363b565b82525050565b5f6020820190506139535f830184613931565b92915050565b5f805f606084860312156139705761396f613633565b5b5f61397d86828701613864565b935050602061398e86828701613864565b925050604061399f8682870161365a565b9150509250925092565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6139e78261378e565b810181811067ffffffffffffffff82111715613a0657613a056139b1565b5b80604052505050565b5f613a1861362a565b9050613a2482826139de565b919050565b5f67ffffffffffffffff821115613a4357613a426139b1565b5b613a4c8261378e565b9050602081019050919050565b828183375f83830152505050565b5f613a79613a7484613a29565b613a0f565b905082815260208101848484011115613a9557613a946139ad565b5b613aa0848285613a59565b509392505050565b5f82601f830112613abc57613abb6139a9565b5b8135613acc848260208601613a67565b91505092915050565b5f60208284031215613aea57613ae9613633565b5b5f82013567ffffffffffffffff811115613b0757613b06613637565b5b613b1384828501613aa8565b91505092915050565b5f60208284031215613b3157613b30613633565b5b5f613b3e84828501613864565b91505092915050565b5f64ffffffffff82169050919050565b613b6081613b47565b82525050565b5f602082019050613b795f830184613b57565b92915050565b613b88816138b6565b82525050565b5f602082019050613ba15f830184613b7f565b92915050565b5f61ffff82169050919050565b613bbd81613ba7565b82525050565b5f602082019050613bd65f830184613bb4565b92915050565b5f604082019050613bef5f830185613b7f565b613bfc6020830184613b57565b9392505050565b5f606082019050613c165f830186613b7f565b613c236020830185613b57565b613c306040830184613931565b949350505050565b613c4181613719565b8114613c4b575f80fd5b50565b5f81359050613c5c81613c38565b92915050565b5f8060408385031215613c7857613c77613633565b5b5f613c8585828601613864565b9250506020613c9685828601613c4e565b9150509250929050565b613ca981613ba7565b8114613cb3575f80fd5b50565b5f81359050613cc481613ca0565b92915050565b5f60208284031215613cdf57613cde613633565b5b5f613cec84828501613cb6565b91505092915050565b5f67ffffffffffffffff821115613d0f57613d0e6139b1565b5b613d188261378e565b9050602081019050919050565b5f613d37613d3284613cf5565b613a0f565b905082815260208101848484011115613d5357613d526139ad565b5b613d5e848285613a59565b509392505050565b5f82601f830112613d7a57613d796139a9565b5b8135613d8a848260208601613d25565b91505092915050565b5f805f8060808587031215613dab57613daa613633565b5b5f613db887828801613864565b9450506020613dc987828801613864565b9350506040613dda8782880161365a565b925050606085013567ffffffffffffffff811115613dfb57613dfa613637565b5b613e0787828801613d66565b91505092959194509250565b5f8060408385031215613e2957613e28613633565b5b5f613e368582860161365a565b9250506020613e47858286016138f2565b9150509250929050565b5f8060408385031215613e6757613e66613633565b5b5f613e7485828601613864565b9250506020613e8585828601613864565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613ec68261363b565b9150613ed18361363b565b9250828201905080821115613ee957613ee8613e8f565b5b92915050565b5f613ef9826138b6565b9150613f04836138b6565b9250828202613f12816138b6565b91508282048414831517613f2957613f28613e8f565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613f67826138b6565b9150613f72836138b6565b925082613f8257613f81613f30565b5b828204905092915050565b5f604082019050613fa05f830185613826565b613fad6020830184613931565b9392505050565b5f81519050613fc281613c38565b92915050565b5f60208284031215613fdd57613fdc613633565b5b5f613fea84828501613fb4565b91505092915050565b5f613ffd8261363b565b91506140088361363b565b92508282039050818111156140205761401f613e8f565b5b92915050565b5f819050919050565b5f61404961404461403f846138b6565b614026565b61363b565b9050919050565b6140598161402f565b82525050565b5f6040820190506140725f830185613826565b61407f6020830184614050565b9392505050565b5f6040820190506140995f830185613b7f565b6140a66020830184613931565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806140f157607f821691505b602082108103614104576141036140ad565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f614164602183613756565b915061416f8261410a565b604082019050919050565b5f6020820190508181035f83015261419181614158565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f5f8201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b5f6141f2603d83613756565b91506141fd82614198565b604082019050919050565b5f6020820190508181035f83015261421f816141e6565b9050919050565b5f6060820190506142395f830186613826565b6142466020830185613826565b6142536040830184614050565b949350505050565b5f6142658261363b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361429757614296613e8f565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e655f8201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b5f6142fc602d83613756565b9150614307826142a2565b604082019050919050565b5f6020820190508181035f830152614329816142f0565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f755f8201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b5f61438a602b83613756565b915061439582614330565b604082019050919050565b5f6020820190508181035f8301526143b78161437e565b9050919050565b5f6143c88261363b565b91506143d38361363b565b92508282026143e18161363b565b915082820484148315176143f8576143f7613e8f565b5b5092915050565b5f6144098261363b565b91506144148361363b565b92508261442457614423613f30565b5b828204905092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f5f8201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b5f614489602c83613756565b91506144948261442f565b604082019050919050565b5f6020820190508181035f8301526144b68161447d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026145467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261450b565b614550868361450b565b95508019841693508086168417925050509392505050565b5f61458261457d6145788461363b565b614026565b61363b565b9050919050565b5f819050919050565b61459b83614568565b6145af6145a782614589565b848454614517565b825550505050565b5f90565b6145c36145b7565b6145ce818484614592565b505050565b5b818110156145f1576145e65f826145bb565b6001810190506145d4565b5050565b601f82111561463657614607816144ea565b614610846144fc565b8101602085101561461f578190505b61463361462b856144fc565b8301826145d3565b50505b505050565b5f82821c905092915050565b5f6146565f198460080261463b565b1980831691505092915050565b5f61466e8383614647565b9150826002028217905092915050565b6146878261374c565b67ffffffffffffffff8111156146a05761469f6139b1565b5b6146aa82546140da565b6146b58282856145f5565b5f60209050601f8311600181146146e6575f84156146d4578287015190505b6146de8582614663565b865550614745565b601f1984166146f4866144ea565b5f5b8281101561471b578489015182556001820191506020850194506020810190506146f6565b868310156147385784890151614734601f891682614647565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e20494400000000000000005f82015250565b5f614781601883613756565b915061478c8261474d565b602082019050919050565b5f6020820190508181035f8301526147ae81614775565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f7420612076615f8201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b5f61480f602983613756565b915061481a826147b5565b604082019050919050565b5f6020820190508181035f83015261483c81614803565b9050919050565b5f61485d61485861485384613ba7565b614026565b61363b565b9050919050565b61486d81614843565b82525050565b5f6020820190506148865f830184614864565b92915050565b5f81905092915050565b5f6148a08261374c565b6148aa818561488c565b93506148ba818560208601613766565b80840191505092915050565b5f6148d18285614896565b91506148dd8284614896565b91508190509392505050565b5f6148f382613b47565b91506148fe83613b47565b9250828203905064ffffffffff81111561491b5761491a613e8f565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61497b602683613756565b915061498682614921565b604082019050919050565b5f6020820190508181035f8301526149a88161496f565b9050919050565b5f6040820190506149c25f830185613931565b6149cf6020830184613931565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f614a0a602083613756565b9150614a15826149d6565b602082019050919050565b5f6020820190508181035f830152614a37816149fe565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f7272656374205f8201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b5f614a98602583613756565b9150614aa382614a3e565b604082019050919050565b5f6020820190508181035f830152614ac581614a8c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f614b26602483613756565b9150614b3182614acc565b604082019050919050565b5f6020820190508181035f830152614b5381614b1a565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f614b8e601983613756565b9150614b9982614b5a565b602082019050919050565b5f6020820190508181035f830152614bbb81614b82565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f614c1c603283613756565b9150614c2782614bc2565b604082019050919050565b5f6020820190508181035f830152614c4981614c10565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f614c7482614c50565b614c7e8185614c5a565b9350614c8e818560208601613766565b614c978161378e565b840191505092915050565b5f608082019050614cb55f830187613826565b614cc26020830186613826565b614ccf6040830185613931565b8181036060830152614ce18184614c6a565b905095945050505050565b5f81519050614cfa816136c4565b92915050565b5f60208284031215614d1557614d14613633565b5b5f614d2284828501614cec565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e73656375746976652074725f8201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b5f614d85603583613756565b9150614d9082614d2b565b604082019050919050565b5f6020820190508181035f830152614db281614d79565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f614ded602083613756565b9150614df882614db9565b602082019050919050565b5f6020820190508181035f830152614e1a81614de1565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f614e55601c83613756565b9150614e6082614e21565b602082019050919050565b5f6020820190508181035f830152614e8281614e49565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea26469706673582212206a2d66b8b802939966f3111b43efa4dc2c6fe6f5c36725a120ac51b57e900d0964736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000003c26700
-----Decoded View---------------
Arg [0] : _duration (uint40): 63072000
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000003c26700
Deployed Bytecode Sourcemap
67705:11481:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74773:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73848:873;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78971:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45606:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47118:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46636:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72560:568;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75251:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62197:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47818:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61865:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48190:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77863:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62387:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75797:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45316:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45047:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22936:103;;;:::i;:::-;;71222:65;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70942:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71021:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78153:173;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71434:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22295:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70750:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70678:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45775:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71788:59;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;77517:272;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;47361:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75532:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48412:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73195:555;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45950:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78334:297;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71127:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47587:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23194:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71348:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74773:121;74836:21;74849:7;74836:12;:21::i;:::-;74868:18;74878:7;74868:9;:18::i;:::-;74773:121;:::o;73848:873::-;73909:17;73929:16;73937:7;73929;:16::i;:::-;73909:36;;73973:10;73960:23;;:9;:23;;;73956:57;;73992:21;;;;;;;;;;;;;;73956:57;74026:30;74059:12;:21;74072:7;74059:21;;;;;;;;;;;74026:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74093:21;74106:7;74093:12;:21::i;:::-;74127:18;74137:7;74127:9;:18::i;:::-;74158:14;74164:7;74158:5;:14::i;:::-;74226:15;74212:11;;74189;:20;;;:34;;;;;;:::i;:::-;:52;74185:333;;;74258:11;74309:6;74296:10;;;;;;;;;;;74272:34;;:11;:21;;;:34;;;;:::i;:::-;:43;;;;:::i;:::-;74258:57;;;;68135:42;74330:14;;;68396:42;74352:3;74330:26;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68135:42;74371:14;;;74386:9;74421:3;74397:11;:21;;;:27;;;;;;:::i;:::-;74371:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;74243:194;74185:333;;;68135:42;74458:14;;;74473:9;74484:11;:21;;;74458:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;74185:333;74570:11;:21;;;74555:11;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74622:12;:21;74635:7;74622:21;;;;;;;;;;;;74615:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74670:10;74661:52;;;74682:11;:21;;;74705:7;74661:52;;;;;;;:::i;:::-;;;;;;;;73898:823;;73848:873;:::o;78971:212::-;79110:4;79139:36;79163:11;79139:23;:36::i;:::-;79132:43;;78971:212;;;:::o;45606:100::-;45660:13;45693:5;45686:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45606:100;:::o;47118:171::-;47194:7;47214:23;47229:7;47214:14;:23::i;:::-;47257:15;:24;47273:7;47257:24;;;;;;;;;;;;;;;;;;;;;47250:31;;47118:171;;;:::o;46636:416::-;46717:13;46733:23;46748:7;46733:14;:23::i;:::-;46717:39;;46781:5;46775:11;;:2;:11;;;46767:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;46875:5;46859:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;46884:37;46901:5;46908:12;:10;:12::i;:::-;46884:16;:37::i;:::-;46859:62;46837:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;47023:21;47032:2;47036:7;47023:8;:21::i;:::-;46706:346;46636:416;;:::o;72560:568::-;72634:1;72623:7;:12;;;72619:39;;72644:14;;;;;;;;;;;;;;72619:39;68135:42;72669:18;;;72688:10;72708:4;72715:7;72669:54;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72764:15;72782;;:17;;;;;;;;;:::i;:::-;;;;;72764:35;;72812:21;72825:7;72812:12;:21::i;:::-;72880:7;72846:12;:21;72859:7;72846:21;;;;;;;;;;;:31;;;:41;;;;;;;;;;;;;;;;;;72938:15;72898:12;:21;72911:7;72898:21;;;;;;;;;;;:30;;;:56;;;;;;;;;;;;;;;;;;73005:7;72990:11;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73036:30;73046:10;73058:7;73036:9;:30::i;:::-;73091:10;73084:36;;;73103:7;73112;73084:36;;;;;;;:::i;:::-;;;;;;;;72608:520;72560:568;:::o;75251:217::-;22181:13;:11;:13::i;:::-;75348:7:::1;75333:12;:22;75329:48;;;75364:13;;;;;;;;;;;;;;75329:48;75402:12;75388:11;:26;;;;75432:28;75447:12;75432:28;;;;;;:::i;:::-;;;;;;;;75251:217:::0;:::o;62197:113::-;62258:7;62285:10;:17;;;;62278:24;;62197:113;:::o;47818:301::-;47979:41;47998:12;:10;:12::i;:::-;48012:7;47979:18;:41::i;:::-;47971:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;48083:28;48093:4;48099:2;48103:7;48083:9;:28::i;:::-;47818:301;;;:::o;61865:256::-;61962:7;61998:23;62015:5;61998:16;:23::i;:::-;61990:5;:31;61982:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;62087:12;:19;62100:5;62087:19;;;;;;;;;;;;;;;:26;62107:5;62087:26;;;;;;;;;;;;62080:33;;61865:256;;;;:::o;48190:151::-;48294:39;48311:4;48317:2;48321:7;48294:39;;;;;;;;;;;;:16;:39::i;:::-;48190:151;;;:::o;77863:282::-;77917:7;78121;:16;78129:7;78121:16;;;;;;;;;;;;78103:4;78053:22;:31;78076:7;78053:31;;;;;;;;;;;;78034:16;:14;:16::i;:::-;:50;;;;:::i;:::-;77978:12;:21;77991:7;77978:21;;;;;;;;;;;:31;;;;;;;;;;;;:107;;;;;;:::i;:::-;77959:148;;;;:::i;:::-;77944:193;;;;:::i;:::-;77937:200;;77863:282;;;:::o;62387:233::-;62462:7;62498:30;:28;:30::i;:::-;62490:5;:38;62482:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;62595:10;62606:5;62595:17;;;;;;;;:::i;:::-;;;;;;;;;;62588:24;;62387:233;;;:::o;75797:138::-;22181:13;:11;:13::i;:::-;75881:8:::1;75871:7;:18;;;;;;:::i;:::-;;75907:20;75918:8;75907:20;;;;;;:::i;:::-;;;;;;;;75797:138:::0;:::o;45316:223::-;45388:7;45408:13;45424:17;45433:7;45424:8;:17::i;:::-;45408:33;;45477:1;45460:19;;:5;:19;;;45452:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;45526:5;45519:12;;;45316:223;;;:::o;45047:207::-;45119:7;45164:1;45147:19;;:5;:19;;;45139:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45230:9;:16;45240:5;45230:16;;;;;;;;;;;;;;;;45223:23;;45047:207;;;:::o;22936:103::-;22181:13;:11;:13::i;:::-;23001:30:::1;23028:1;23001:18;:30::i;:::-;22936:103::o:0;71222:65::-;;;;;;;;;;;;;;;;;:::o;70942:23::-;;;;;;;;;;;;;:::o;71021:35::-;;;:::o;78153:173::-;78210:6;78229:11;78250:15;78229:37;;78296:4;78284:16;;:8;:16;;;;:34;;78310:8;78284:34;;;78303:4;78284:34;78277:41;;;78153:173;:::o;71434:26::-;;;;;;;;;;;;;:::o;22295:87::-;22341:7;22368:6;;;;;;;;;;;22361:13;;22295:87;:::o;70750:24::-;;;;;;;;;;;;;:::o;70678:26::-;;;;:::o;45775:104::-;45831:13;45864:7;45857:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45775:104;:::o;71788:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77517:272::-;77600:7;77609:6;77617:7;77664:12;:21;77677:7;77664:21;;;;;;;;;;;:31;;;;;;;;;;;;77710:12;:21;77723:7;77710:21;;;;;;;;;;;:30;;;;;;;;;;;;77755:15;77762:7;77755:6;:15::i;:::-;77642:139;;;;;;77517:272;;;;;:::o;47361:155::-;47456:52;47475:12;:10;:12::i;:::-;47489:8;47499;47456:18;:52::i;:::-;47361:155;;:::o;75532:206::-;22181:13;:11;:13::i;:::-;75625:5:::1;75611:11;:19;;;75607:44;;;75639:12;;;;;;;;;;;;;;75607:44;75675:11;75662:10;;:24;;;;;;;;;;;;;;;;;;75704:26;75718:11;75704:26;;;;;;:::i;:::-;;;;;;;;75532:206:::0;:::o;48412:279::-;48543:41;48562:12;:10;:12::i;:::-;48576:7;48543:18;:41::i;:::-;48535:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;48645:38;48659:4;48665:2;48669:7;48678:4;48645:13;:38::i;:::-;48412:279;;;;:::o;73195:555::-;73295:1;73284:7;:12;;;73280:39;;73305:14;;;;;;;;;;;;;;73280:39;73363:1;73334:31;;:17;73342:8;73334:7;:17::i;:::-;:31;;;73330:63;;73374:19;;;;;;;;;;;;;;73330:63;73406:22;73419:8;73406:12;:22::i;:::-;68135:42;73441:18;;;73460:10;73480:4;73487:7;73441:54;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;73574:15;73533:12;:22;73546:8;73533:22;;;;;;;;;;;:31;;;:57;;;;;;;;;;;;;;;;;;73641:7;73605:12;:22;73618:8;73605:22;;;;;;;;;;;:32;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73678:7;73663:11;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73724:8;73714:28;73734:7;73714:28;;;;;;:::i;:::-;;;;;;;;73195:555;;:::o;45950:281::-;46023:13;46049:23;46064:7;46049:14;:23::i;:::-;46085:21;46109:10;:8;:10::i;:::-;46085:34;;46161:1;46143:7;46137:21;:25;:86;;;;;;;;;;;;;;;;;46189:7;46198:18;:7;:16;:18::i;:::-;46172:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46137:86;46130:93;;;45950:281;;;:::o;78334:297::-;78381:7;78420:1;78405:11;;;;;;;;;;;:16;;;78401:76;;78445:20;;78438:27;;;;78401:76;78612:11;;;;;;;;;;;78530:93;;78587:4;78574:9;;;;;;;;;;;78545:26;:24;:26::i;:::-;:38;;;;:::i;:::-;78531:53;;:10;:53;;;;:::i;:::-;:60;;;;:::i;:::-;78530:93;;;;:::i;:::-;78494:20;;:129;;;;:::i;:::-;78487:136;;78334:297;;:::o;71127:35::-;;;;:::o;47587:164::-;47684:4;47708:18;:25;47727:5;47708:25;;;;;;;;;;;;;;;:35;47734:8;47708:35;;;;;;;;;;;;;;;;;;;;;;;;;47701:42;;47587:164;;;;:::o;23194:201::-;22181:13;:11;:13::i;:::-;23303:1:::1;23283:22;;:8;:22;;::::0;23275:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;23359:28;23378:8;23359:18;:28::i;:::-;23194:201:::0;:::o;71348:50::-;;;;;;;;;;;;;;;;;:::o;76279:271::-;76362:16;:14;:16::i;:::-;76339:20;:39;;;;76401:26;:24;:26::i;:::-;76389:9;;:38;;;;;;;;;;;;;;;;;;76460:16;76467:8;76460:6;:16::i;:::-;76440:7;:17;76448:8;76440:17;;;;;;;;;;;:36;;;;76522:20;;76487:22;:32;76510:8;76487:32;;;;;;;;;;;:55;;;;76279:271;:::o;76629:284::-;76685:14;76702:7;:16;76710:7;76702:16;;;;;;;;;;;;76685:33;;76742:1;76733:6;:10;76729:119;;;76779:1;76760:7;:16;76768:7;76760:16;;;;;;;;;;;:20;;;;68277:42;76795:15;;;76811:16;76819:7;76811;:16::i;:::-;76829:6;76795:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;76729:119;76871:16;76879:7;76871;:16::i;:::-;76863:42;;;76889:6;76897:7;76863:42;;;;;;;:::i;:::-;;;;;;;;76674:239;76629:284;:::o;53526:783::-;53586:13;53602:23;53617:7;53602:14;:23::i;:::-;53586:39;;53638:51;53659:5;53674:1;53678:7;53687:1;53638:20;:51::i;:::-;53802:23;53817:7;53802:14;:23::i;:::-;53794:31;;53873:15;:24;53889:7;53873:24;;;;;;;;;;;;53866:31;;;;;;;;;;;54138:1;54118:9;:16;54128:5;54118:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;54168:7;:16;54176:7;54168:16;;;;;;;;;;;;54161:23;;;;;;;;;;;54230:7;54226:1;54202:36;;54211:5;54202:36;;;;;;;;;;;;54251:50;54271:5;54286:1;54290:7;54299:1;54251:19;:50::i;:::-;53575:734;53526:783;:::o;61557:224::-;61659:4;61698:35;61683:50;;;:11;:50;;;;:90;;;;61737:36;61761:11;61737:23;:36::i;:::-;61683:90;61676:97;;61557:224;;;:::o;56681:135::-;56763:16;56771:7;56763;:16::i;:::-;56755:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;56681:135;:::o;20846:98::-;20899:7;20926:10;20919:17;;20846:98;:::o;55994:174::-;56096:2;56069:15;:24;56085:7;56069:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56152:7;56148:2;56114:46;;56123:23;56138:7;56123:14;:23::i;:::-;56114:46;;;;;;;;;;;;55994:174;;:::o;51287:110::-;51363:26;51373:2;51377:7;51363:26;;;;;;;;;;;;:9;:26::i;:::-;51287:110;;:::o;22460:132::-;22535:12;:10;:12::i;:::-;22524:23;;:7;:5;:7::i;:::-;:23;;;22516:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22460:132::o;50681:264::-;50774:4;50791:13;50807:23;50822:7;50807:14;:23::i;:::-;50791:39;;50860:5;50849:16;;:7;:16;;;:52;;;;50869:32;50886:5;50893:7;50869:16;:32::i;:::-;50849:52;:87;;;;50929:7;50905:31;;:20;50917:7;50905:11;:20::i;:::-;:31;;;50849:87;50841:96;;;50681:264;;;;:::o;54646:1229::-;54771:4;54744:31;;:23;54759:7;54744:14;:23::i;:::-;:31;;;54736:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54850:1;54836:16;;:2;:16;;;54828:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54906:42;54927:4;54933:2;54937:7;54946:1;54906:20;:42::i;:::-;55078:4;55051:31;;:23;55066:7;55051:14;:23::i;:::-;:31;;;55043:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55196:15;:24;55212:7;55196:24;;;;;;;;;;;;55189:31;;;;;;;;;;;55691:1;55672:9;:15;55682:4;55672:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;55724:1;55707:9;:13;55717:2;55707:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;55766:2;55747:7;:16;55755:7;55747:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55805:7;55801:2;55786:27;;55795:4;55786:27;;;;;;;;;;;;55826:41;55846:4;55852:2;55856:7;55865:1;55826:19;:41::i;:::-;54646:1229;;;:::o;49956:117::-;50022:7;50049;:16;50057:7;50049:16;;;;;;;;;;;;;;;;;;;;;50042:23;;49956:117;;;:::o;23555:191::-;23629:16;23648:6;;;;;;;;;;;23629:25;;23674:8;23665:6;;:17;;;;;;;;;;;;;;;;;;23729:8;23698:40;;23719:8;23698:40;;;;;;;;;;;;23618:128;23555:191;:::o;56311:281::-;56432:8;56423:17;;:5;:17;;;56415:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;56519:8;56481:18;:25;56500:5;56481:25;;;;;;;;;;;;;;;:35;56507:8;56481:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;56565:8;56543:41;;56558:5;56543:41;;;56575:8;56543:41;;;;;;:::i;:::-;;;;;;;;56311:281;;;:::o;49572:270::-;49685:28;49695:4;49701:2;49705:7;49685:9;:28::i;:::-;49732:47;49755:4;49761:2;49765:7;49774:4;49732:22;:47::i;:::-;49724:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;49572:270;;;;:::o;77241:158::-;77346:13;77384:7;77377:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77241:158;:::o;17765:716::-;17821:13;17872:14;17909:1;17889:17;17900:5;17889:10;:17::i;:::-;:21;17872:38;;17925:20;17959:6;17948:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17925:41;;17981:11;18110:6;18106:2;18102:15;18094:6;18090:28;18083:35;;18147:288;18154:4;18147:288;;;18179:5;;;;;;;;18321:8;18316:2;18309:5;18305:14;18300:30;18295:3;18287:44;18377:2;18368:11;;;;;;:::i;:::-;;;;;18411:1;18402:5;:10;18147:288;18398:21;18147:288;18456:6;18449:13;;;;;17765:716;;;:::o;78709:254::-;78899:56;78926:4;78932:2;78936:7;78945:9;78899:26;:56::i;:::-;78709:254;;;;:::o;59803:115::-;;;;;:::o;44678:305::-;44780:4;44832:25;44817:40;;;:11;:40;;;;:105;;;;44889:33;44874:48;;;:11;:48;;;;44817:105;:158;;;;44939:36;44963:11;44939:23;:36::i;:::-;44817:158;44797:178;;44678:305;;;:::o;50386:128::-;50451:4;50504:1;50475:31;;:17;50484:7;50475:8;:17::i;:::-;:31;;;;50468:38;;50386:128;;;:::o;51624:285::-;51719:18;51725:2;51729:7;51719:5;:18::i;:::-;51770:53;51801:1;51805:2;51809:7;51818:4;51770:22;:53::i;:::-;51748:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;51624:285;;;:::o;57380:853::-;57534:4;57555:15;:2;:13;;;:15::i;:::-;57551:675;;;57607:2;57591:36;;;57628:12;:10;:12::i;:::-;57642:4;57648:7;57657:4;57591:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57587:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57849:1;57832:6;:13;:18;57828:328;;57875:60;;;;;;;;;;:::i;:::-;;;;;;;;57828:328;58106:6;58100:13;58091:6;58087:2;58083:15;58076:38;57587:584;57723:41;;;57713:51;;;:6;:51;;;;57706:58;;;;;57551:675;58210:4;58203:11;;57380:853;;;;;;;:::o;14599:948::-;14652:7;14672:14;14689:1;14672:18;;14739:8;14730:5;:17;14726:106;;14777:8;14768:17;;;;;;:::i;:::-;;;;;14814:2;14804:12;;;;14726:106;14859:8;14850:5;:17;14846:106;;14897:8;14888:17;;;;;;:::i;:::-;;;;;14934:2;14924:12;;;;14846:106;14979:8;14970:5;:17;14966:106;;15017:8;15008:17;;;;;;:::i;:::-;;;;;15054:2;15044:12;;;;14966:106;15099:7;15090:5;:16;15086:103;;15136:7;15127:16;;;;;;:::i;:::-;;;;;15172:1;15162:11;;;;15086:103;15216:7;15207:5;:16;15203:103;;15253:7;15244:16;;;;;;:::i;:::-;;;;;15289:1;15279:11;;;;15203:103;15333:7;15324:5;:16;15320:103;;15370:7;15361:16;;;;;;:::i;:::-;;;;;15406:1;15396:11;;;;15320:103;15450:7;15441:5;:16;15437:68;;15488:1;15478:11;;;;15437:68;15533:6;15526:13;;;14599:948;;;:::o;62694:915::-;62871:61;62898:4;62904:2;62908:12;62922:9;62871:26;:61::i;:::-;62961:1;62949:9;:13;62945:222;;;63092:63;;;;;;;;;;:::i;:::-;;;;;;;;62945:222;63179:15;63197:12;63179:30;;63242:1;63226:18;;:4;:18;;;63222:187;;63261:40;63293:7;63261:31;:40::i;:::-;63222:187;;;63331:2;63323:10;;:4;:10;;;63319:90;;63350:47;63383:4;63389:7;63350:32;:47::i;:::-;63319:90;63222:187;63437:1;63423:16;;:2;:16;;;63419:183;;63456:45;63493:7;63456:36;:45::i;:::-;63419:183;;;63529:4;63523:10;;:2;:10;;;63519:83;;63550:40;63578:2;63582:7;63550:27;:40::i;:::-;63519:83;63419:183;62860:749;62694:915;;;;:::o;36222:157::-;36307:4;36346:25;36331:40;;;:11;:40;;;;36324:47;;36222:157;;;:::o;52245:942::-;52339:1;52325:16;;:2;:16;;;52317:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;52398:16;52406:7;52398;:16::i;:::-;52397:17;52389:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52460:48;52489:1;52493:2;52497:7;52506:1;52460:20;:48::i;:::-;52607:16;52615:7;52607;:16::i;:::-;52606:17;52598:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53022:1;53005:9;:13;53015:2;53005:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;53066:2;53047:7;:16;53055:7;53047:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;53111:7;53107:2;53086:33;;53103:1;53086:33;;;;;;;;;;;;53132:47;53160:1;53164:2;53168:7;53177:1;53132:19;:47::i;:::-;52245:942;;:::o;25227:326::-;25287:4;25544:1;25522:7;:19;;;:23;25515:30;;25227:326;;;:::o;58965:116::-;;;;;:::o;64332:164::-;64436:10;:17;;;;64409:15;:24;64425:7;64409:24;;;;;;;;;;;:44;;;;64464:10;64480:7;64464:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64332:164;:::o;65123:988::-;65389:22;65439:1;65414:22;65431:4;65414:16;:22::i;:::-;:26;;;;:::i;:::-;65389:51;;65451:18;65472:17;:26;65490:7;65472:26;;;;;;;;;;;;65451:47;;65619:14;65605:10;:28;65601:328;;65650:19;65672:12;:18;65685:4;65672:18;;;;;;;;;;;;;;;:34;65691:14;65672:34;;;;;;;;;;;;65650:56;;65756:11;65723:12;:18;65736:4;65723:18;;;;;;;;;;;;;;;:30;65742:10;65723:30;;;;;;;;;;;:44;;;;65873:10;65840:17;:30;65858:11;65840:30;;;;;;;;;;;:43;;;;65635:294;65601:328;66025:17;:26;66043:7;66025:26;;;;;;;;;;;66018:33;;;66069:12;:18;66082:4;66069:18;;;;;;;;;;;;;;;:34;66088:14;66069:34;;;;;;;;;;;66062:41;;;65204:907;;65123:988;;:::o;66406:1079::-;66659:22;66704:1;66684:10;:17;;;;:21;;;;:::i;:::-;66659:46;;66716:18;66737:15;:24;66753:7;66737:24;;;;;;;;;;;;66716:45;;67088:19;67110:10;67121:14;67110:26;;;;;;;;:::i;:::-;;;;;;;;;;67088:48;;67174:11;67149:10;67160;67149:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;67285:10;67254:15;:28;67270:11;67254:28;;;;;;;;;;;:41;;;;67426:15;:24;67442:7;67426:24;;;;;;;;;;;67419:31;;;67461:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66477:1008;;;66406:1079;:::o;63910:221::-;63995:14;64012:20;64029:2;64012:16;:20::i;:::-;63995:37;;64070:7;64043:12;:16;64056:2;64043:16;;;;;;;;;;;;;;;:24;64060:6;64043:24;;;;;;;;;;;:34;;;;64117:6;64088:17;:26;64106:7;64088:26;;;;;;;;;;;:35;;;;63984:147;63910:221;;:::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:149::-;1061:7;1101:66;1094:5;1090:78;1079:89;;1025:149;;;:::o;1180:120::-;1252:23;1269:5;1252:23;:::i;:::-;1245:5;1242:34;1232:62;;1290:1;1287;1280:12;1232:62;1180:120;:::o;1306:137::-;1351:5;1389:6;1376:20;1367:29;;1405:32;1431:5;1405:32;:::i;:::-;1306:137;;;;:::o;1449:327::-;1507:6;1556:2;1544:9;1535:7;1531:23;1527:32;1524:119;;;1562:79;;:::i;:::-;1524:119;1682:1;1707:52;1751:7;1742:6;1731:9;1727:22;1707:52;:::i;:::-;1697:62;;1653:116;1449:327;;;;:::o;1782:90::-;1816:7;1859:5;1852:13;1845:21;1834:32;;1782:90;;;:::o;1878:109::-;1959:21;1974:5;1959:21;:::i;:::-;1954:3;1947:34;1878:109;;:::o;1993:210::-;2080:4;2118:2;2107:9;2103:18;2095:26;;2131:65;2193:1;2182:9;2178:17;2169:6;2131:65;:::i;:::-;1993:210;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:246::-;2570:1;2580:113;2594:6;2591:1;2588:13;2580:113;;;2679:1;2674:3;2670:11;2664:18;2660:1;2655:3;2651:11;2644:39;2616:2;2613:1;2609:10;2604:15;;2580:113;;;2727:1;2718:6;2713:3;2709:16;2702:27;2551:184;2489:246;;;:::o;2741:102::-;2782:6;2833:2;2829:7;2824:2;2817:5;2813:14;2809:28;2799:38;;2741:102;;;:::o;2849:377::-;2937:3;2965:39;2998:5;2965:39;:::i;:::-;3020:71;3084:6;3079:3;3020:71;:::i;:::-;3013:78;;3100:65;3158:6;3153:3;3146:4;3139:5;3135:16;3100:65;:::i;:::-;3190:29;3212:6;3190:29;:::i;:::-;3185:3;3181:39;3174:46;;2941:285;2849:377;;;;:::o;3232:313::-;3345:4;3383:2;3372:9;3368:18;3360:26;;3432:9;3426:4;3422:20;3418:1;3407:9;3403:17;3396:47;3460:78;3533:4;3524:6;3460:78;:::i;:::-;3452:86;;3232:313;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:140::-;4927:7;4967:56;4960:5;4956:68;4945:79;;4890:140;;;:::o;5036:122::-;5109:24;5127:5;5109:24;:::i;:::-;5102:5;5099:35;5089:63;;5148:1;5145;5138:12;5089:63;5036:122;:::o;5164:139::-;5210:5;5248:6;5235:20;5226:29;;5264:33;5291:5;5264:33;:::i;:::-;5164:139;;;;:::o;5309:329::-;5368:6;5417:2;5405:9;5396:7;5392:23;5388:32;5385:119;;;5423:79;;:::i;:::-;5385:119;5543:1;5568:53;5613:7;5604:6;5593:9;5589:22;5568:53;:::i;:::-;5558:63;;5514:117;5309:329;;;;:::o;5644:118::-;5731:24;5749:5;5731:24;:::i;:::-;5726:3;5719:37;5644:118;;:::o;5768:222::-;5861:4;5899:2;5888:9;5884:18;5876:26;;5912:71;5980:1;5969:9;5965:17;5956:6;5912:71;:::i;:::-;5768:222;;;;:::o;5996:619::-;6073:6;6081;6089;6138:2;6126:9;6117:7;6113:23;6109:32;6106:119;;;6144:79;;:::i;:::-;6106:119;6264:1;6289:53;6334:7;6325:6;6314:9;6310:22;6289:53;:::i;:::-;6279:63;;6235:117;6391:2;6417:53;6462:7;6453:6;6442:9;6438:22;6417:53;:::i;:::-;6407:63;;6362:118;6519:2;6545:53;6590:7;6581:6;6570:9;6566:22;6545:53;:::i;:::-;6535:63;;6490:118;5996:619;;;;;:::o;6621:117::-;6730:1;6727;6720:12;6744:117;6853:1;6850;6843:12;6867:180;6915:77;6912:1;6905:88;7012:4;7009:1;7002:15;7036:4;7033:1;7026:15;7053:281;7136:27;7158:4;7136:27;:::i;:::-;7128:6;7124:40;7266:6;7254:10;7251:22;7230:18;7218:10;7215:34;7212:62;7209:88;;;7277:18;;:::i;:::-;7209:88;7317:10;7313:2;7306:22;7096:238;7053:281;;:::o;7340:129::-;7374:6;7401:20;;:::i;:::-;7391:30;;7430:33;7458:4;7450:6;7430:33;:::i;:::-;7340:129;;;:::o;7475:308::-;7537:4;7627:18;7619:6;7616:30;7613:56;;;7649:18;;:::i;:::-;7613:56;7687:29;7709:6;7687:29;:::i;:::-;7679:37;;7771:4;7765;7761:15;7753:23;;7475:308;;;:::o;7789:146::-;7886:6;7881:3;7876;7863:30;7927:1;7918:6;7913:3;7909:16;7902:27;7789:146;;;:::o;7941:425::-;8019:5;8044:66;8060:49;8102:6;8060:49;:::i;:::-;8044:66;:::i;:::-;8035:75;;8133:6;8126:5;8119:21;8171:4;8164:5;8160:16;8209:3;8200:6;8195:3;8191:16;8188:25;8185:112;;;8216:79;;:::i;:::-;8185:112;8306:54;8353:6;8348:3;8343;8306:54;:::i;:::-;8025:341;7941:425;;;;;:::o;8386:340::-;8442:5;8491:3;8484:4;8476:6;8472:17;8468:27;8458:122;;8499:79;;:::i;:::-;8458:122;8616:6;8603:20;8641:79;8716:3;8708:6;8701:4;8693:6;8689:17;8641:79;:::i;:::-;8632:88;;8448:278;8386:340;;;;:::o;8732:509::-;8801:6;8850:2;8838:9;8829:7;8825:23;8821:32;8818:119;;;8856:79;;:::i;:::-;8818:119;9004:1;8993:9;8989:17;8976:31;9034:18;9026:6;9023:30;9020:117;;;9056:79;;:::i;:::-;9020:117;9161:63;9216:7;9207:6;9196:9;9192:22;9161:63;:::i;:::-;9151:73;;8947:287;8732:509;;;;:::o;9247:329::-;9306:6;9355:2;9343:9;9334:7;9330:23;9326:32;9323:119;;;9361:79;;:::i;:::-;9323:119;9481:1;9506:53;9551:7;9542:6;9531:9;9527:22;9506:53;:::i;:::-;9496:63;;9452:117;9247:329;;;;:::o;9582:95::-;9618:7;9658:12;9651:5;9647:24;9636:35;;9582:95;;;:::o;9683:115::-;9768:23;9785:5;9768:23;:::i;:::-;9763:3;9756:36;9683:115;;:::o;9804:218::-;9895:4;9933:2;9922:9;9918:18;9910:26;;9946:69;10012:1;10001:9;9997:17;9988:6;9946:69;:::i;:::-;9804:218;;;;:::o;10028:118::-;10115:24;10133:5;10115:24;:::i;:::-;10110:3;10103:37;10028:118;;:::o;10152:222::-;10245:4;10283:2;10272:9;10268:18;10260:26;;10296:71;10364:1;10353:9;10349:17;10340:6;10296:71;:::i;:::-;10152:222;;;;:::o;10380:89::-;10416:7;10456:6;10449:5;10445:18;10434:29;;10380:89;;;:::o;10475:115::-;10560:23;10577:5;10560:23;:::i;:::-;10555:3;10548:36;10475:115;;:::o;10596:218::-;10687:4;10725:2;10714:9;10710:18;10702:26;;10738:69;10804:1;10793:9;10789:17;10780:6;10738:69;:::i;:::-;10596:218;;;;:::o;10820:328::-;10939:4;10977:2;10966:9;10962:18;10954:26;;10990:71;11058:1;11047:9;11043:17;11034:6;10990:71;:::i;:::-;11071:70;11137:2;11126:9;11122:18;11113:6;11071:70;:::i;:::-;10820:328;;;;;:::o;11154:438::-;11301:4;11339:2;11328:9;11324:18;11316:26;;11352:71;11420:1;11409:9;11405:17;11396:6;11352:71;:::i;:::-;11433:70;11499:2;11488:9;11484:18;11475:6;11433:70;:::i;:::-;11513:72;11581:2;11570:9;11566:18;11557:6;11513:72;:::i;:::-;11154:438;;;;;;:::o;11598:116::-;11668:21;11683:5;11668:21;:::i;:::-;11661:5;11658:32;11648:60;;11704:1;11701;11694:12;11648:60;11598:116;:::o;11720:133::-;11763:5;11801:6;11788:20;11779:29;;11817:30;11841:5;11817:30;:::i;:::-;11720:133;;;;:::o;11859:468::-;11924:6;11932;11981:2;11969:9;11960:7;11956:23;11952:32;11949:119;;;11987:79;;:::i;:::-;11949:119;12107:1;12132:53;12177:7;12168:6;12157:9;12153:22;12132:53;:::i;:::-;12122:63;;12078:117;12234:2;12260:50;12302:7;12293:6;12282:9;12278:22;12260:50;:::i;:::-;12250:60;;12205:115;11859:468;;;;;:::o;12333:120::-;12405:23;12422:5;12405:23;:::i;:::-;12398:5;12395:34;12385:62;;12443:1;12440;12433:12;12385:62;12333:120;:::o;12459:137::-;12504:5;12542:6;12529:20;12520:29;;12558:32;12584:5;12558:32;:::i;:::-;12459:137;;;;:::o;12602:327::-;12660:6;12709:2;12697:9;12688:7;12684:23;12680:32;12677:119;;;12715:79;;:::i;:::-;12677:119;12835:1;12860:52;12904:7;12895:6;12884:9;12880:22;12860:52;:::i;:::-;12850:62;;12806:116;12602:327;;;;:::o;12935:307::-;12996:4;13086:18;13078:6;13075:30;13072:56;;;13108:18;;:::i;:::-;13072:56;13146:29;13168:6;13146:29;:::i;:::-;13138:37;;13230:4;13224;13220:15;13212:23;;12935:307;;;:::o;13248:423::-;13325:5;13350:65;13366:48;13407:6;13366:48;:::i;:::-;13350:65;:::i;:::-;13341:74;;13438:6;13431:5;13424:21;13476:4;13469:5;13465:16;13514:3;13505:6;13500:3;13496:16;13493:25;13490:112;;;13521:79;;:::i;:::-;13490:112;13611:54;13658:6;13653:3;13648;13611:54;:::i;:::-;13331:340;13248:423;;;;;:::o;13690:338::-;13745:5;13794:3;13787:4;13779:6;13775:17;13771:27;13761:122;;13802:79;;:::i;:::-;13761:122;13919:6;13906:20;13944:78;14018:3;14010:6;14003:4;13995:6;13991:17;13944:78;:::i;:::-;13935:87;;13751:277;13690:338;;;;:::o;14034:943::-;14129:6;14137;14145;14153;14202:3;14190:9;14181:7;14177:23;14173:33;14170:120;;;14209:79;;:::i;:::-;14170:120;14329:1;14354:53;14399:7;14390:6;14379:9;14375:22;14354:53;:::i;:::-;14344:63;;14300:117;14456:2;14482:53;14527:7;14518:6;14507:9;14503:22;14482:53;:::i;:::-;14472:63;;14427:118;14584:2;14610:53;14655:7;14646:6;14635:9;14631:22;14610:53;:::i;:::-;14600:63;;14555:118;14740:2;14729:9;14725:18;14712:32;14771:18;14763:6;14760:30;14757:117;;;14793:79;;:::i;:::-;14757:117;14898:62;14952:7;14943:6;14932:9;14928:22;14898:62;:::i;:::-;14888:72;;14683:287;14034:943;;;;;;;:::o;14983:474::-;15051:6;15059;15108:2;15096:9;15087:7;15083:23;15079:32;15076:119;;;15114:79;;:::i;:::-;15076:119;15234:1;15259:53;15304:7;15295:6;15284:9;15280:22;15259:53;:::i;:::-;15249:63;;15205:117;15361:2;15387:53;15432:7;15423:6;15412:9;15408:22;15387:53;:::i;:::-;15377:63;;15332:118;14983:474;;;;;:::o;15463:::-;15531:6;15539;15588:2;15576:9;15567:7;15563:23;15559:32;15556:119;;;15594:79;;:::i;:::-;15556:119;15714:1;15739:53;15784:7;15775:6;15764:9;15760:22;15739:53;:::i;:::-;15729:63;;15685:117;15841:2;15867:53;15912:7;15903:6;15892:9;15888:22;15867:53;:::i;:::-;15857:63;;15812:118;15463:474;;;;;:::o;15943:180::-;15991:77;15988:1;15981:88;16088:4;16085:1;16078:15;16112:4;16109:1;16102:15;16129:191;16169:3;16188:20;16206:1;16188:20;:::i;:::-;16183:25;;16222:20;16240:1;16222:20;:::i;:::-;16217:25;;16265:1;16262;16258:9;16251:16;;16286:3;16283:1;16280:10;16277:36;;;16293:18;;:::i;:::-;16277:36;16129:191;;;;:::o;16326:410::-;16366:7;16389:20;16407:1;16389:20;:::i;:::-;16384:25;;16423:20;16441:1;16423:20;:::i;:::-;16418:25;;16478:1;16475;16471:9;16500:30;16518:11;16500:30;:::i;:::-;16489:41;;16679:1;16670:7;16666:15;16663:1;16660:22;16640:1;16633:9;16613:83;16590:139;;16709:18;;:::i;:::-;16590:139;16374:362;16326:410;;;;:::o;16742:180::-;16790:77;16787:1;16780:88;16887:4;16884:1;16877:15;16911:4;16908:1;16901:15;16928:185;16968:1;16985:20;17003:1;16985:20;:::i;:::-;16980:25;;17019:20;17037:1;17019:20;:::i;:::-;17014:25;;17058:1;17048:35;;17063:18;;:::i;:::-;17048:35;17105:1;17102;17098:9;17093:14;;16928:185;;;;:::o;17119:332::-;17240:4;17278:2;17267:9;17263:18;17255:26;;17291:71;17359:1;17348:9;17344:17;17335:6;17291:71;:::i;:::-;17372:72;17440:2;17429:9;17425:18;17416:6;17372:72;:::i;:::-;17119:332;;;;;:::o;17457:137::-;17511:5;17542:6;17536:13;17527:22;;17558:30;17582:5;17558:30;:::i;:::-;17457:137;;;;:::o;17600:345::-;17667:6;17716:2;17704:9;17695:7;17691:23;17687:32;17684:119;;;17722:79;;:::i;:::-;17684:119;17842:1;17867:61;17920:7;17911:6;17900:9;17896:22;17867:61;:::i;:::-;17857:71;;17813:125;17600:345;;;;:::o;17951:194::-;17991:4;18011:20;18029:1;18011:20;:::i;:::-;18006:25;;18045:20;18063:1;18045:20;:::i;:::-;18040:25;;18089:1;18086;18082:9;18074:17;;18113:1;18107:4;18104:11;18101:37;;;18118:18;;:::i;:::-;18101:37;17951:194;;;;:::o;18151:60::-;18179:3;18200:5;18193:12;;18151:60;;;:::o;18217:142::-;18267:9;18300:53;18318:34;18327:24;18345:5;18327:24;:::i;:::-;18318:34;:::i;:::-;18300:53;:::i;:::-;18287:66;;18217:142;;;:::o;18365:131::-;18452:37;18483:5;18452:37;:::i;:::-;18447:3;18440:50;18365:131;;:::o;18502:332::-;18623:4;18661:2;18650:9;18646:18;18638:26;;18674:71;18742:1;18731:9;18727:17;18718:6;18674:71;:::i;:::-;18755:72;18823:2;18812:9;18808:18;18799:6;18755:72;:::i;:::-;18502:332;;;;;:::o;18840:::-;18961:4;18999:2;18988:9;18984:18;18976:26;;19012:71;19080:1;19069:9;19065:17;19056:6;19012:71;:::i;:::-;19093:72;19161:2;19150:9;19146:18;19137:6;19093:72;:::i;:::-;18840:332;;;;;:::o;19178:180::-;19226:77;19223:1;19216:88;19323:4;19320:1;19313:15;19347:4;19344:1;19337:15;19364:320;19408:6;19445:1;19439:4;19435:12;19425:22;;19492:1;19486:4;19482:12;19513:18;19503:81;;19569:4;19561:6;19557:17;19547:27;;19503:81;19631:2;19623:6;19620:14;19600:18;19597:38;19594:84;;19650:18;;:::i;:::-;19594:84;19415:269;19364:320;;;:::o;19690:220::-;19830:34;19826:1;19818:6;19814:14;19807:58;19899:3;19894:2;19886:6;19882:15;19875:28;19690:220;:::o;19916:366::-;20058:3;20079:67;20143:2;20138:3;20079:67;:::i;:::-;20072:74;;20155:93;20244:3;20155:93;:::i;:::-;20273:2;20268:3;20264:12;20257:19;;19916:366;;;:::o;20288:419::-;20454:4;20492:2;20481:9;20477:18;20469:26;;20541:9;20535:4;20531:20;20527:1;20516:9;20512:17;20505:47;20569:131;20695:4;20569:131;:::i;:::-;20561:139;;20288:419;;;:::o;20713:248::-;20853:34;20849:1;20841:6;20837:14;20830:58;20922:31;20917:2;20909:6;20905:15;20898:56;20713:248;:::o;20967:366::-;21109:3;21130:67;21194:2;21189:3;21130:67;:::i;:::-;21123:74;;21206:93;21295:3;21206:93;:::i;:::-;21324:2;21319:3;21315:12;21308:19;;20967:366;;;:::o;21339:419::-;21505:4;21543:2;21532:9;21528:18;21520:26;;21592:9;21586:4;21582:20;21578:1;21567:9;21563:17;21556:47;21620:131;21746:4;21620:131;:::i;:::-;21612:139;;21339:419;;;:::o;21764:442::-;21913:4;21951:2;21940:9;21936:18;21928:26;;21964:71;22032:1;22021:9;22017:17;22008:6;21964:71;:::i;:::-;22045:72;22113:2;22102:9;22098:18;22089:6;22045:72;:::i;:::-;22127;22195:2;22184:9;22180:18;22171:6;22127:72;:::i;:::-;21764:442;;;;;;:::o;22212:233::-;22251:3;22274:24;22292:5;22274:24;:::i;:::-;22265:33;;22320:66;22313:5;22310:77;22307:103;;22390:18;;:::i;:::-;22307:103;22437:1;22430:5;22426:13;22419:20;;22212:233;;;:::o;22451:232::-;22591:34;22587:1;22579:6;22575:14;22568:58;22660:15;22655:2;22647:6;22643:15;22636:40;22451:232;:::o;22689:366::-;22831:3;22852:67;22916:2;22911:3;22852:67;:::i;:::-;22845:74;;22928:93;23017:3;22928:93;:::i;:::-;23046:2;23041:3;23037:12;23030:19;;22689:366;;;:::o;23061:419::-;23227:4;23265:2;23254:9;23250:18;23242:26;;23314:9;23308:4;23304:20;23300:1;23289:9;23285:17;23278:47;23342:131;23468:4;23342:131;:::i;:::-;23334:139;;23061:419;;;:::o;23486:230::-;23626:34;23622:1;23614:6;23610:14;23603:58;23695:13;23690:2;23682:6;23678:15;23671:38;23486:230;:::o;23722:366::-;23864:3;23885:67;23949:2;23944:3;23885:67;:::i;:::-;23878:74;;23961:93;24050:3;23961:93;:::i;:::-;24079:2;24074:3;24070:12;24063:19;;23722:366;;;:::o;24094:419::-;24260:4;24298:2;24287:9;24283:18;24275:26;;24347:9;24341:4;24337:20;24333:1;24322:9;24318:17;24311:47;24375:131;24501:4;24375:131;:::i;:::-;24367:139;;24094:419;;;:::o;24519:410::-;24559:7;24582:20;24600:1;24582:20;:::i;:::-;24577:25;;24616:20;24634:1;24616:20;:::i;:::-;24611:25;;24671:1;24668;24664:9;24693:30;24711:11;24693:30;:::i;:::-;24682:41;;24872:1;24863:7;24859:15;24856:1;24853:22;24833:1;24826:9;24806:83;24783:139;;24902:18;;:::i;:::-;24783:139;24567:362;24519:410;;;;:::o;24935:185::-;24975:1;24992:20;25010:1;24992:20;:::i;:::-;24987:25;;25026:20;25044:1;25026:20;:::i;:::-;25021:25;;25065:1;25055:35;;25070:18;;:::i;:::-;25055:35;25112:1;25109;25105:9;25100:14;;24935:185;;;;:::o;25126:231::-;25266:34;25262:1;25254:6;25250:14;25243:58;25335:14;25330:2;25322:6;25318:15;25311:39;25126:231;:::o;25363:366::-;25505:3;25526:67;25590:2;25585:3;25526:67;:::i;:::-;25519:74;;25602:93;25691:3;25602:93;:::i;:::-;25720:2;25715:3;25711:12;25704:19;;25363:366;;;:::o;25735:419::-;25901:4;25939:2;25928:9;25924:18;25916:26;;25988:9;25982:4;25978:20;25974:1;25963:9;25959:17;25952:47;26016:131;26142:4;26016:131;:::i;:::-;26008:139;;25735:419;;;:::o;26160:180::-;26208:77;26205:1;26198:88;26305:4;26302:1;26295:15;26329:4;26326:1;26319:15;26346:141;26395:4;26418:3;26410:11;;26441:3;26438:1;26431:14;26475:4;26472:1;26462:18;26454:26;;26346:141;;;:::o;26493:93::-;26530:6;26577:2;26572;26565:5;26561:14;26557:23;26547:33;;26493:93;;;:::o;26592:107::-;26636:8;26686:5;26680:4;26676:16;26655:37;;26592:107;;;;:::o;26705:393::-;26774:6;26824:1;26812:10;26808:18;26847:97;26877:66;26866:9;26847:97;:::i;:::-;26965:39;26995:8;26984:9;26965:39;:::i;:::-;26953:51;;27037:4;27033:9;27026:5;27022:21;27013:30;;27086:4;27076:8;27072:19;27065:5;27062:30;27052:40;;26781:317;;26705:393;;;;;:::o;27104:142::-;27154:9;27187:53;27205:34;27214:24;27232:5;27214:24;:::i;:::-;27205:34;:::i;:::-;27187:53;:::i;:::-;27174:66;;27104:142;;;:::o;27252:75::-;27295:3;27316:5;27309:12;;27252:75;;;:::o;27333:269::-;27443:39;27474:7;27443:39;:::i;:::-;27504:91;27553:41;27577:16;27553:41;:::i;:::-;27545:6;27538:4;27532:11;27504:91;:::i;:::-;27498:4;27491:105;27409:193;27333:269;;;:::o;27608:73::-;27653:3;27608:73;:::o;27687:189::-;27764:32;;:::i;:::-;27805:65;27863:6;27855;27849:4;27805:65;:::i;:::-;27740:136;27687:189;;:::o;27882:186::-;27942:120;27959:3;27952:5;27949:14;27942:120;;;28013:39;28050:1;28043:5;28013:39;:::i;:::-;27986:1;27979:5;27975:13;27966:22;;27942:120;;;27882:186;;:::o;28074:543::-;28175:2;28170:3;28167:11;28164:446;;;28209:38;28241:5;28209:38;:::i;:::-;28293:29;28311:10;28293:29;:::i;:::-;28283:8;28279:44;28476:2;28464:10;28461:18;28458:49;;;28497:8;28482:23;;28458:49;28520:80;28576:22;28594:3;28576:22;:::i;:::-;28566:8;28562:37;28549:11;28520:80;:::i;:::-;28179:431;;28164:446;28074:543;;;:::o;28623:117::-;28677:8;28727:5;28721:4;28717:16;28696:37;;28623:117;;;;:::o;28746:169::-;28790:6;28823:51;28871:1;28867:6;28859:5;28856:1;28852:13;28823:51;:::i;:::-;28819:56;28904:4;28898;28894:15;28884:25;;28797:118;28746:169;;;;:::o;28920:295::-;28996:4;29142:29;29167:3;29161:4;29142:29;:::i;:::-;29134:37;;29204:3;29201:1;29197:11;29191:4;29188:21;29180:29;;28920:295;;;;:::o;29220:1395::-;29337:37;29370:3;29337:37;:::i;:::-;29439:18;29431:6;29428:30;29425:56;;;29461:18;;:::i;:::-;29425:56;29505:38;29537:4;29531:11;29505:38;:::i;:::-;29590:67;29650:6;29642;29636:4;29590:67;:::i;:::-;29684:1;29708:4;29695:17;;29740:2;29732:6;29729:14;29757:1;29752:618;;;;30414:1;30431:6;30428:77;;;30480:9;30475:3;30471:19;30465:26;30456:35;;30428:77;30531:67;30591:6;30584:5;30531:67;:::i;:::-;30525:4;30518:81;30387:222;29722:887;;29752:618;29804:4;29800:9;29792:6;29788:22;29838:37;29870:4;29838:37;:::i;:::-;29897:1;29911:208;29925:7;29922:1;29919:14;29911:208;;;30004:9;29999:3;29995:19;29989:26;29981:6;29974:42;30055:1;30047:6;30043:14;30033:24;;30102:2;30091:9;30087:18;30074:31;;29948:4;29945:1;29941:12;29936:17;;29911:208;;;30147:6;30138:7;30135:19;30132:179;;;30205:9;30200:3;30196:19;30190:26;30248:48;30290:4;30282:6;30278:17;30267:9;30248:48;:::i;:::-;30240:6;30233:64;30155:156;30132:179;30357:1;30353;30345:6;30341:14;30337:22;30331:4;30324:36;29759:611;;;29722:887;;29312:1303;;;29220:1395;;:::o;30621:174::-;30761:26;30757:1;30749:6;30745:14;30738:50;30621:174;:::o;30801:366::-;30943:3;30964:67;31028:2;31023:3;30964:67;:::i;:::-;30957:74;;31040:93;31129:3;31040:93;:::i;:::-;31158:2;31153:3;31149:12;31142:19;;30801:366;;;:::o;31173:419::-;31339:4;31377:2;31366:9;31362:18;31354:26;;31426:9;31420:4;31416:20;31412:1;31401:9;31397:17;31390:47;31454:131;31580:4;31454:131;:::i;:::-;31446:139;;31173:419;;;:::o;31598:228::-;31738:34;31734:1;31726:6;31722:14;31715:58;31807:11;31802:2;31794:6;31790:15;31783:36;31598:228;:::o;31832:366::-;31974:3;31995:67;32059:2;32054:3;31995:67;:::i;:::-;31988:74;;32071:93;32160:3;32071:93;:::i;:::-;32189:2;32184:3;32180:12;32173:19;;31832:366;;;:::o;32204:419::-;32370:4;32408:2;32397:9;32393:18;32385:26;;32457:9;32451:4;32447:20;32443:1;32432:9;32428:17;32421:47;32485:131;32611:4;32485:131;:::i;:::-;32477:139;;32204:419;;;:::o;32629:140::-;32678:9;32711:52;32729:33;32738:23;32755:5;32738:23;:::i;:::-;32729:33;:::i;:::-;32711:52;:::i;:::-;32698:65;;32629:140;;;:::o;32775:129::-;32861:36;32891:5;32861:36;:::i;:::-;32856:3;32849:49;32775:129;;:::o;32910:220::-;33002:4;33040:2;33029:9;33025:18;33017:26;;33053:70;33120:1;33109:9;33105:17;33096:6;33053:70;:::i;:::-;32910:220;;;;:::o;33136:148::-;33238:11;33275:3;33260:18;;33136:148;;;;:::o;33290:390::-;33396:3;33424:39;33457:5;33424:39;:::i;:::-;33479:89;33561:6;33556:3;33479:89;:::i;:::-;33472:96;;33577:65;33635:6;33630:3;33623:4;33616:5;33612:16;33577:65;:::i;:::-;33667:6;33662:3;33658:16;33651:23;;33400:280;33290:390;;;;:::o;33686:435::-;33866:3;33888:95;33979:3;33970:6;33888:95;:::i;:::-;33881:102;;34000:95;34091:3;34082:6;34000:95;:::i;:::-;33993:102;;34112:3;34105:10;;33686:435;;;;;:::o;34127:202::-;34166:4;34186:19;34203:1;34186:19;:::i;:::-;34181:24;;34219:19;34236:1;34219:19;:::i;:::-;34214:24;;34262:1;34259;34255:9;34247:17;;34286:12;34280:4;34277:22;34274:48;;;34302:18;;:::i;:::-;34274:48;34127:202;;;;:::o;34335:225::-;34475:34;34471:1;34463:6;34459:14;34452:58;34544:8;34539:2;34531:6;34527:15;34520:33;34335:225;:::o;34566:366::-;34708:3;34729:67;34793:2;34788:3;34729:67;:::i;:::-;34722:74;;34805:93;34894:3;34805:93;:::i;:::-;34923:2;34918:3;34914:12;34907:19;;34566:366;;;:::o;34938:419::-;35104:4;35142:2;35131:9;35127:18;35119:26;;35191:9;35185:4;35181:20;35177:1;35166:9;35162:17;35155:47;35219:131;35345:4;35219:131;:::i;:::-;35211:139;;34938:419;;;:::o;35363:332::-;35484:4;35522:2;35511:9;35507:18;35499:26;;35535:71;35603:1;35592:9;35588:17;35579:6;35535:71;:::i;:::-;35616:72;35684:2;35673:9;35669:18;35660:6;35616:72;:::i;:::-;35363:332;;;;;:::o;35701:182::-;35841:34;35837:1;35829:6;35825:14;35818:58;35701:182;:::o;35889:366::-;36031:3;36052:67;36116:2;36111:3;36052:67;:::i;:::-;36045:74;;36128:93;36217:3;36128:93;:::i;:::-;36246:2;36241:3;36237:12;36230:19;;35889:366;;;:::o;36261:419::-;36427:4;36465:2;36454:9;36450:18;36442:26;;36514:9;36508:4;36504:20;36500:1;36489:9;36485:17;36478:47;36542:131;36668:4;36542:131;:::i;:::-;36534:139;;36261:419;;;:::o;36686:224::-;36826:34;36822:1;36814:6;36810:14;36803:58;36895:7;36890:2;36882:6;36878:15;36871:32;36686:224;:::o;36916:366::-;37058:3;37079:67;37143:2;37138:3;37079:67;:::i;:::-;37072:74;;37155:93;37244:3;37155:93;:::i;:::-;37273:2;37268:3;37264:12;37257:19;;36916:366;;;:::o;37288:419::-;37454:4;37492:2;37481:9;37477:18;37469:26;;37541:9;37535:4;37531:20;37527:1;37516:9;37512:17;37505:47;37569:131;37695:4;37569:131;:::i;:::-;37561:139;;37288:419;;;:::o;37713:223::-;37853:34;37849:1;37841:6;37837:14;37830:58;37922:6;37917:2;37909:6;37905:15;37898:31;37713:223;:::o;37942:366::-;38084:3;38105:67;38169:2;38164:3;38105:67;:::i;:::-;38098:74;;38181:93;38270:3;38181:93;:::i;:::-;38299:2;38294:3;38290:12;38283:19;;37942:366;;;:::o;38314:419::-;38480:4;38518:2;38507:9;38503:18;38495:26;;38567:9;38561:4;38557:20;38553:1;38542:9;38538:17;38531:47;38595:131;38721:4;38595:131;:::i;:::-;38587:139;;38314:419;;;:::o;38739:175::-;38879:27;38875:1;38867:6;38863:14;38856:51;38739:175;:::o;38920:366::-;39062:3;39083:67;39147:2;39142:3;39083:67;:::i;:::-;39076:74;;39159:93;39248:3;39159:93;:::i;:::-;39277:2;39272:3;39268:12;39261:19;;38920:366;;;:::o;39292:419::-;39458:4;39496:2;39485:9;39481:18;39473:26;;39545:9;39539:4;39535:20;39531:1;39520:9;39516:17;39509:47;39573:131;39699:4;39573:131;:::i;:::-;39565:139;;39292:419;;;:::o;39717:237::-;39857:34;39853:1;39845:6;39841:14;39834:58;39926:20;39921:2;39913:6;39909:15;39902:45;39717:237;:::o;39960:366::-;40102:3;40123:67;40187:2;40182:3;40123:67;:::i;:::-;40116:74;;40199:93;40288:3;40199:93;:::i;:::-;40317:2;40312:3;40308:12;40301:19;;39960:366;;;:::o;40332:419::-;40498:4;40536:2;40525:9;40521:18;40513:26;;40585:9;40579:4;40575:20;40571:1;40560:9;40556:17;40549:47;40613:131;40739:4;40613:131;:::i;:::-;40605:139;;40332:419;;;:::o;40757:98::-;40808:6;40842:5;40836:12;40826:22;;40757:98;;;:::o;40861:168::-;40944:11;40978:6;40973:3;40966:19;41018:4;41013:3;41009:14;40994:29;;40861:168;;;;:::o;41035:373::-;41121:3;41149:38;41181:5;41149:38;:::i;:::-;41203:70;41266:6;41261:3;41203:70;:::i;:::-;41196:77;;41282:65;41340:6;41335:3;41328:4;41321:5;41317:16;41282:65;:::i;:::-;41372:29;41394:6;41372:29;:::i;:::-;41367:3;41363:39;41356:46;;41125:283;41035:373;;;;:::o;41414:640::-;41609:4;41647:3;41636:9;41632:19;41624:27;;41661:71;41729:1;41718:9;41714:17;41705:6;41661:71;:::i;:::-;41742:72;41810:2;41799:9;41795:18;41786:6;41742:72;:::i;:::-;41824;41892:2;41881:9;41877:18;41868:6;41824:72;:::i;:::-;41943:9;41937:4;41933:20;41928:2;41917:9;41913:18;41906:48;41971:76;42042:4;42033:6;41971:76;:::i;:::-;41963:84;;41414:640;;;;;;;:::o;42060:141::-;42116:5;42147:6;42141:13;42132:22;;42163:32;42189:5;42163:32;:::i;:::-;42060:141;;;;:::o;42207:349::-;42276:6;42325:2;42313:9;42304:7;42300:23;42296:32;42293:119;;;42331:79;;:::i;:::-;42293:119;42451:1;42476:63;42531:7;42522:6;42511:9;42507:22;42476:63;:::i;:::-;42466:73;;42422:127;42207:349;;;;:::o;42562:240::-;42702:34;42698:1;42690:6;42686:14;42679:58;42771:23;42766:2;42758:6;42754:15;42747:48;42562:240;:::o;42808:366::-;42950:3;42971:67;43035:2;43030:3;42971:67;:::i;:::-;42964:74;;43047:93;43136:3;43047:93;:::i;:::-;43165:2;43160:3;43156:12;43149:19;;42808:366;;;:::o;43180:419::-;43346:4;43384:2;43373:9;43369:18;43361:26;;43433:9;43427:4;43423:20;43419:1;43408:9;43404:17;43397:47;43461:131;43587:4;43461:131;:::i;:::-;43453:139;;43180:419;;;:::o;43605:182::-;43745:34;43741:1;43733:6;43729:14;43722:58;43605:182;:::o;43793:366::-;43935:3;43956:67;44020:2;44015:3;43956:67;:::i;:::-;43949:74;;44032:93;44121:3;44032:93;:::i;:::-;44150:2;44145:3;44141:12;44134:19;;43793:366;;;:::o;44165:419::-;44331:4;44369:2;44358:9;44354:18;44346:26;;44418:9;44412:4;44408:20;44404:1;44393:9;44389:17;44382:47;44446:131;44572:4;44446:131;:::i;:::-;44438:139;;44165:419;;;:::o;44590:178::-;44730:30;44726:1;44718:6;44714:14;44707:54;44590:178;:::o;44774:366::-;44916:3;44937:67;45001:2;44996:3;44937:67;:::i;:::-;44930:74;;45013:93;45102:3;45013:93;:::i;:::-;45131:2;45126:3;45122:12;45115:19;;44774:366;;;:::o;45146:419::-;45312:4;45350:2;45339:9;45335:18;45327:26;;45399:9;45393:4;45389:20;45385:1;45374:9;45370:17;45363:47;45427:131;45553:4;45427:131;:::i;:::-;45419:139;;45146:419;;;:::o;45571:180::-;45619:77;45616:1;45609:88;45716:4;45713:1;45706:15;45740:4;45737:1;45730:15
Swarm Source
ipfs://6a2d66b8b802939966f3111b43efa4dc2c6fe6f5c36725a120ac51b57e900d09
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.