Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
566 NavySeal
Holders
521
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 NavySealLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
NavySealNFT
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-16 */ // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.20; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the Merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates Merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** *@dev The multiproof provided is not valid. */ error MerkleProofInvalidMultiproof(); /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the Merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the Merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Sorts the pair (a, b) and hashes the result. */ function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } /** * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory. */ function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.20; /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @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 v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the 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 towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (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 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) 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. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 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. uint256 twos = denominator & (0 - denominator); 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 (unsignedRoundsUp(rounding) && 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 * towards zero. * * 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 + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * 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 + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * 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 + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * 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 + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @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), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(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) { uint256 localValue = value; 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] = HEX_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } 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 bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.20; /** * @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 (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @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 (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @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); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.20; /** * @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 address zero. * * 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/IERC721Metadata.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.20; /** * @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/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.20; /** * @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}. */ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors { using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; mapping(uint256 tokenId => address) private _owners; mapping(address owner => uint256) private _balances; mapping(uint256 tokenId => address) private _tokenApprovals; mapping(address owner => mapping(address operator => 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 returns (uint256) { if (owner == address(0)) { revert ERC721InvalidOwner(address(0)); } return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual returns (address) { return _requireOwned(tokenId); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual returns (string memory) { _requireOwned(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string.concat(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 { _approve(to, tokenId, _msgSender()); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual returns (address) { _requireOwned(tokenId); return _getApproved(tokenId); } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here. address previousOwner = _update(to, tokenId, _msgSender()); if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual { transferFrom(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist * * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances * consistent with ownership. The invariant to preserve is 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`. */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted. */ function _getApproved(uint256 tokenId) internal view virtual returns (address) { return _tokenApprovals[tokenId]; } /** * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in * particular (ignoring whether it is owned by `owner`). * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) { return spender != address(0) && (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender); } /** * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner. * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets * the `spender` for the specific `tokenId`. * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual { if (!_isAuthorized(owner, spender, tokenId)) { if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } else { revert ERC721InsufficientApproval(spender, tokenId); } } } /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that * a uint256 would ever overflow from increments when these increments are bounded to uint128 values. * * WARNING: Increasing an account's balance using this function tends to be paired with an override of the * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership * remain consistent with one another. */ function _increaseBalance(address account, uint128 value) internal virtual { unchecked { _balances[account] += value; } } /** * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update. * * The `auth` argument is optional. If the value passed is non 0, then this function will check that * `auth` is either the owner of the token, or approved to operate on the token (by the owner). * * Emits a {Transfer} event. * * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}. */ function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) { address from = _ownerOf(tokenId); // Perform (optional) operator check if (auth != address(0)) { _checkAuthorized(from, auth, tokenId); } // Execute the update if (from != address(0)) { // Clear approval. No need to re-authorize or emit the Approval event _approve(address(0), tokenId, address(0), false); unchecked { _balances[from] -= 1; } } if (to != address(0)) { unchecked { _balances[to] += 1; } } _owners[tokenId] = to; emit Transfer(from, to, tokenId); return from; } /** * @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 { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner != address(0)) { revert ERC721InvalidSender(address(0)); } } /** * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance. * * 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 { _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); _checkOnERC721Received(address(0), to, tokenId, data); } /** * @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 { address previousOwner = _update(address(0), tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } } /** * @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 { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } else if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients * are aware of the ERC721 standard 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 like {safeTransferFrom} in the sense that it invokes * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `tokenId` token must exist and be owned by `from`. * - `to` cannot be the zero address. * - `from` cannot be the zero address. * - 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) internal { _safeTransfer(from, to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Approve `to` to operate on `tokenId` * * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is * either the owner of the token, or approved to operate on all tokens held by this owner. * * Emits an {Approval} event. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address to, uint256 tokenId, address auth) internal { _approve(to, tokenId, auth, true); } /** * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not * emitted in the context of transfers. */ function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual { // Avoid reading the owner unless necessary if (emitEvent || auth != address(0)) { address owner = _requireOwned(tokenId); // We do not use _isAuthorized because single-token approvals should not be able to call approve if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) { revert ERC721InvalidApprover(auth); } if (emitEvent) { emit Approval(owner, to, tokenId); } } _tokenApprovals[tokenId] = to; } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Requirements: * - operator can't be the address zero. * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { if (operator == address(0)) { revert ERC721InvalidOperator(operator); } _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned). * Returns the owner. * * Overrides to ownership logic should be done to {_ownerOf}. */ function _requireOwned(uint256 tokenId) internal view returns (address) { address owner = _ownerOf(tokenId); if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } return owner; } /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the * recipient doesn't accept the token transfer. 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 */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private { if (to.code.length > 0) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { if (retval != IERC721Receiver.onERC721Received.selector) { revert ERC721InvalidReceiver(to); } } catch (bytes memory reason) { if (reason.length == 0) { revert ERC721InvalidReceiver(to); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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: NavySeal.sol // SPDX-License-Identifier: MIT // NAVYSEAL NFT AIRDROP CLAIM pragma solidity ^0.8.20; contract NavySealNFT is ERC721, Ownable { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; string baseURI; bool public saleIsActive = false; bool public publicsaleIsActive = false; bytes32[3] public merkleRoot = [bytes32(0x7241d8c8a5b5b12b0db4ac436356fa0af6d8000dac08809b0c61adec30d4ba34), bytes32(0x447c73654c3338f006a1824eaded0b179238f769bf4764dfa678e0b856339fba), bytes32(0x06b6b1329873934583b9c936d744d343720863287fddaef410ef868be52ced68)]; // The tier struct will keep all the information about the tier struct Tier { uint16 totalSupply; uint16 maxSupply; uint16 startingIndex; uint8 mintsPerAddress; } // Mapping used to limit the mints per tier mapping(uint256 => mapping(address => uint256)) addressCountsPerTier; // Mapping used to limit the mints per tier mapping(address => uint256) addressCountsPublic; // Mapping where Tier structs are saved mapping(uint256 => Tier) tiers; mapping(address => bool) hasMinted; // BaseURI mapping(uint256 => string) private _tokenURIs; modifier isApprovedOrOwner(uint256 tokenId) { require( ownerOf(tokenId) == msg.sender, "ERC 721: Transfer caller not owner or approved" ); _; } constructor( string memory _name, string memory _symbol, string memory _initBaseURI ) ERC721(_name, _symbol) Ownable(msg.sender) { setBaseURI(_initBaseURI); tiers[0] = Tier({ totalSupply: 0, maxSupply: 10, startingIndex: 1, mintsPerAddress: 1 }); tiers[1] = Tier({ totalSupply: 0, maxSupply: 200, startingIndex: 11, mintsPerAddress: 1 }); tiers[2] = Tier({ totalSupply: 0, maxSupply: 357, startingIndex: 211, mintsPerAddress: 1 }); tiers[3] = Tier({ totalSupply: 0, maxSupply: 200, startingIndex: 568, mintsPerAddress: 1 }); tiers[4] = Tier({ totalSupply: 0, maxSupply: 10, startingIndex: 768, mintsPerAddress: 10 }); } 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), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } // @param tokenId The tokenId of token whose URI we are changing function _setTokenURI(uint256 tokenId, string memory _tokenURI) external onlyOwner { _tokenURIs[tokenId] = _tokenURI; } function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURII = _baseURI(); return bytes(baseURII).length > 0 ? string(abi.encodePacked(baseURII, toString(tokenId), ".json")) : ""; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function isValid( bytes32[] memory proof, bytes32 leaf, uint256 tier ) public view returns (bool) { return MerkleProof.verify(proof, merkleRoot[tier], leaf); } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function flipPublicSaleState() public onlyOwner { publicsaleIsActive = !publicsaleIsActive; } function setMerkleRoot(bytes32[3] memory _newMerkleRoot) public onlyOwner { merkleRoot = _newMerkleRoot; } function ownerMint() public payable onlyOwner { uint tier = 4; require( tiers[tier].totalSupply + 1 <= tiers[tier].maxSupply, "Exceeded max limit of allowed token mints" ); handlemint(tier,msg.sender);} // @param tier The tier of the NFT to be minted function mintTier0(bytes32[] memory proof) public payable { require(saleIsActive, "Sale is not active"); uint256 tier = 0; require( isValid(proof, keccak256(abi.encodePacked(msg.sender)), tier), "Not a part of Tier 0" ); require( tiers[tier].totalSupply + 1 <= tiers[tier].maxSupply, "Exceeded max limit of allowed token mints" ); require( addressCountsPerTier[tier][msg.sender] + 1 <= tiers[tier].mintsPerAddress, "Max number of mints per address reached" ); handlemint(tier,msg.sender); } // @param tier The tier of the NFT to be minted function mintTier1(bytes32[] memory proof) public { require(saleIsActive, "Sale is not active"); uint256 tier = 1; require( isValid(proof, keccak256(abi.encodePacked(msg.sender)), tier), "Not a part of Tier 1" ); require( tiers[tier].totalSupply + 1 <= tiers[tier].maxSupply, "Exceeded max limit of allowed token mints" ); require( addressCountsPerTier[tier][msg.sender] + 1 <= tiers[tier].mintsPerAddress, "Max number of mints per address reached" ); handlemint(tier,msg.sender); } function handlemint(uint256 tier, address _address) private{ addressCountsPerTier[tier][_address] = addressCountsPerTier[tier][_address] + 1; uint16 tierTotalSuppy = tiers[tier].totalSupply; tiers[tier].totalSupply = tierTotalSuppy + 1; uint16 tierIndex = tiers[tier].startingIndex; hasMinted[msg.sender] = true; _safeMint(_address, tierTotalSuppy+tierIndex); } // @param tier The tier of the NFT to be minted function mintTier2(bytes32[] memory proof) public { require(saleIsActive, "Sale is not active"); uint256 tier = 2; require( isValid(proof, keccak256(abi.encodePacked(msg.sender)), tier), "Not a part of Tier 3" ); require( tiers[tier].totalSupply + 1 <= tiers[tier].maxSupply, "Exceeded max limit of allowed token mints" ); require( addressCountsPerTier[tier][msg.sender] + 1 <= tiers[tier].mintsPerAddress, "Max number of mints per address reached" ); handlemint(tier,msg.sender); } function mintPublic() public { require(publicsaleIsActive, "Sale is not active"); uint256 tier = getRandomNumber(msg.sender); if (tiers[tier].totalSupply + 1 > tiers[tier].maxSupply) { tier = getRandomNumber(msg.sender); } require( tiers[tier].totalSupply+1 <= tiers[tier].maxSupply, "Exceeded max limit of allowed token mints" ); require( addressCountsPublic[msg.sender]<1, "Max number of mints per address reached" ); addressCountsPublic[msg.sender] = addressCountsPublic[msg.sender] + 1; uint16 tierTotalSuppy = tiers[tier].totalSupply; tiers[tier].totalSupply = tierTotalSuppy + 1; hasMinted[msg.sender] = true; _safeMint(msg.sender, tierTotalSuppy +tiers[tier].startingIndex+ 1); } /* ========== VIEW METHODS ========== */ // @param tier The tier of which the total supply should be returned // @return The total supply of the specified tier function tierTotalSupply(uint256 tier) external view returns (uint256) { return tiers[tier].totalSupply; } // @param tier The tier of which the max supply rice should be returned // @return The max supply of the specified tier function tierMaxSupply(uint256 tier) external view returns (uint256) { return tiers[tier].maxSupply; } //@return if user minted yet function hasUserMinted(address user)external view returns(bool){ return hasMinted[user]; } // @param tier The tier of which the max supply rice should be returned // @return The max supply of the specified tier function tierStartingIndex(uint256 tier) external view returns (uint256) { return tiers[tier].startingIndex; } function totalSupply() public view returns (uint256) { return tiers[0].totalSupply + tiers[1].totalSupply + tiers[2].totalSupply + tiers[3].totalSupply + tiers[4].totalSupply; } function getRandomNumber(address _addy) private view returns (uint) { uint blockValue = uint(blockhash(block.number - 1)); uint random = uint(keccak256(abi.encodePacked(block.timestamp, blockValue, _addy))) % 3; return random; } // @return The max supply of all tiers summed up function totalMaxSupply() external view returns (uint256) { return tiers[0].maxSupply + tiers[1].maxSupply + tiers[2].maxSupply+tiers[3].maxSupply + tiers[4].maxSupply; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","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":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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"_setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":[],"name":"flipPublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"hasUserMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintTier0","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintTier1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintTier2","outputs":[],"stateMutability":"nonpayable","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":[],"name":"ownerMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicsaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[3]","name":"_newMerkleRoot","type":"bytes32[3]"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","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":"tier","type":"uint256"}],"name":"tierMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"tierStartingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"tierTotalSupply","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":"totalMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]
Contract Creation Code
60806040525f60085f6101000a81548160ff0219169083151502179055505f600860016101000a81548160ff02191690831515021790555060405180606001604052807f7241d8c8a5b5b12b0db4ac436356fa0af6d8000dac08809b0c61adec30d4ba345f1b81526020017f447c73654c3338f006a1824eaded0b179238f769bf4764dfa678e0b856339fba5f1b81526020017f06b6b1329873934583b9c936d744d343720863287fddaef410ef868be52ced685f1b8152506009906003620000ca9291906200077b565b50348015620000d7575f80fd5b5060405162005039380380620050398339818101604052810190620000fd919062000962565b338383815f908162000110919062000c4f565b50806001908162000122919062000c4f565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000198575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200018f919062000d76565b60405180910390fd5b620001a981620005c260201b60201c565b50620001bb816200068560201b60201c565b60405180608001604052805f61ffff168152602001600a61ffff168152602001600161ffff168152602001600160ff16815250600e5f8081526020019081526020015f205f820151815f015f6101000a81548161ffff021916908361ffff1602179055506020820151815f0160026101000a81548161ffff021916908361ffff1602179055506040820151815f0160046101000a81548161ffff021916908361ffff1602179055506060820151815f0160066101000a81548160ff021916908360ff16021790555090505060405180608001604052805f61ffff16815260200160c861ffff168152602001600b61ffff168152602001600160ff16815250600e5f600181526020019081526020015f205f820151815f015f6101000a81548161ffff021916908361ffff1602179055506020820151815f0160026101000a81548161ffff021916908361ffff1602179055506040820151815f0160046101000a81548161ffff021916908361ffff1602179055506060820151815f0160066101000a81548160ff021916908360ff16021790555090505060405180608001604052805f61ffff16815260200161016561ffff16815260200160d361ffff168152602001600160ff16815250600e5f600281526020019081526020015f205f820151815f015f6101000a81548161ffff021916908361ffff1602179055506020820151815f0160026101000a81548161ffff021916908361ffff1602179055506040820151815f0160046101000a81548161ffff021916908361ffff1602179055506060820151815f0160066101000a81548160ff021916908360ff16021790555090505060405180608001604052805f61ffff16815260200160c861ffff16815260200161023861ffff168152602001600160ff16815250600e5f600381526020019081526020015f205f820151815f015f6101000a81548161ffff021916908361ffff1602179055506020820151815f0160026101000a81548161ffff021916908361ffff1602179055506040820151815f0160046101000a81548161ffff021916908361ffff1602179055506060820151815f0160066101000a81548160ff021916908360ff16021790555090505060405180608001604052805f61ffff168152602001600a61ffff16815260200161030061ffff168152602001600a60ff16815250600e5f600481526020019081526020015f205f820151815f015f6101000a81548161ffff021916908361ffff1602179055506020820151815f0160026101000a81548161ffff021916908361ffff1602179055506040820151815f0160046101000a81548161ffff021916908361ffff1602179055506060820151815f0160066101000a81548160ff021916908360ff16021790555090505050505062000d91565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000695620006aa60201b60201c565b8060079081620006a6919062000c4f565b5050565b620006ba6200074c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620006e06200075360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200074a576200070c6200074c60201b60201c565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040162000741919062000d76565b60405180910390fd5b565b5f33905090565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8260038101928215620007ad579160200282015b82811115620007ac5782518255916020019190600101906200078f565b5b509050620007bc9190620007c0565b5090565b5b80821115620007d9575f815f905550600101620007c1565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200083e82620007f6565b810181811067ffffffffffffffff8211171562000860576200085f62000806565b5b80604052505050565b5f62000874620007dd565b905062000882828262000833565b919050565b5f67ffffffffffffffff821115620008a457620008a362000806565b5b620008af82620007f6565b9050602081019050919050565b5f5b83811015620008db578082015181840152602081019050620008be565b5f8484015250505050565b5f620008fc620008f68462000887565b62000869565b9050828152602081018484840111156200091b576200091a620007f2565b5b62000928848285620008bc565b509392505050565b5f82601f830112620009475762000946620007ee565b5b815162000959848260208601620008e6565b91505092915050565b5f805f606084860312156200097c576200097b620007e6565b5b5f84015167ffffffffffffffff8111156200099c576200099b620007ea565b5b620009aa8682870162000930565b935050602084015167ffffffffffffffff811115620009ce57620009cd620007ea565b5b620009dc8682870162000930565b925050604084015167ffffffffffffffff81111562000a0057620009ff620007ea565b5b62000a0e8682870162000930565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000a6757607f821691505b60208210810362000a7d5762000a7c62000a22565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000ae17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000aa4565b62000aed868362000aa4565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000b3762000b3162000b2b8462000b05565b62000b0e565b62000b05565b9050919050565b5f819050919050565b62000b528362000b17565b62000b6a62000b618262000b3e565b84845462000ab0565b825550505050565b5f90565b62000b8062000b72565b62000b8d81848462000b47565b505050565b5b8181101562000bb45762000ba85f8262000b76565b60018101905062000b93565b5050565b601f82111562000c035762000bcd8162000a83565b62000bd88462000a95565b8101602085101562000be8578190505b62000c0062000bf78562000a95565b83018262000b92565b50505b505050565b5f82821c905092915050565b5f62000c255f198460080262000c08565b1980831691505092915050565b5f62000c3f838362000c14565b9150826002028217905092915050565b62000c5a8262000a18565b67ffffffffffffffff81111562000c765762000c7562000806565b5b62000c82825462000a4f565b62000c8f82828562000bb8565b5f60209050601f83116001811462000cc5575f841562000cb0578287015190505b62000cbc858262000c32565b86555062000d2b565b601f19841662000cd58662000a83565b5f5b8281101562000cfe5784890151825560018201915060208501945060208101905062000cd7565b8683101562000d1e578489015162000d1a601f89168262000c14565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000d5e8262000d33565b9050919050565b62000d708162000d52565b82525050565b5f60208201905062000d8b5f83018462000d65565b92915050565b61429a8062000d9f5f395ff3fe60806040526004361061020e575f3560e01c80638c874ebd11610117578063adb8e9d81161009f578063de9723571161006e578063de9723571461076a578063e985e9c514610794578063eb8d2444146107d0578063f2fde38b146107fa578063fcb6becb146108225761020e565b8063adb8e9d8146106d4578063b12dc991146106fc578063b88d4fde14610706578063c87b56dd1461072e5761020e565b80639d67f486116100e65780639d67f486146105f4578063a0617ad014610630578063a10866ef1461065a578063a22cb46514610670578063a78bf96e146106985761020e565b80638c874ebd1461054e5780638da5cb5b1461056457806395d89b411461058e578063986f4227146105b85761020e565b80632d7dbbca1161019a5780634fc281f2116101695780634fc281f21461045c57806355f804b3146104985780636352211e146104c057806370a08231146104fc578063715018a6146105385761020e565b80632d7dbbca146103ba57806334918dfd146103e25780633c70b357146103f857806342842e0e146104345761020e565b8063081812fc116101e1578063081812fc146102dc578063095ea7b31461031857806318160ddd1461034057806323b872dd1461036a5780632d21daf1146103925761020e565b8063015388681461021257806301ffc9a71461023a5780630338ee811461027657806306fdde03146102b2575b5f80fd5b34801561021d575f80fd5b5061023860048036038101906102339190613089565b61083e565b005b348015610245575f80fd5b50610260600480360381019061025b9190613138565b610869565b60405161026d919061317d565b60405180910390f35b348015610281575f80fd5b5061029c60048036038101906102979190613196565b61094a565b6040516102a991906131d0565b60405180910390f35b3480156102bd575f80fd5b506102c6610977565b6040516102d39190613263565b60405180910390f35b3480156102e7575f80fd5b5061030260048036038101906102fd9190613196565b610a06565b60405161030f91906132c2565b60405180910390f35b348015610323575f80fd5b5061033e60048036038101906103399190613305565b610a21565b005b34801561034b575f80fd5b50610354610a37565b60405161036191906131d0565b60405180910390f35b348015610375575f80fd5b50610390600480360381019061038b9190613343565b610b12565b005b34801561039d575f80fd5b506103b860048036038101906103b39190613478565b610c11565b005b3480156103c5575f80fd5b506103e060048036038101906103db9190613563565b610c2e565b005b3480156103ed575f80fd5b506103f6610e55565b005b348015610403575f80fd5b5061041e60048036038101906104199190613196565b610e87565b60405161042b91906135b9565b60405180910390f35b34801561043f575f80fd5b5061045a60048036038101906104559190613343565b610ea0565b005b348015610467575f80fd5b50610482600480360381019061047d91906135d2565b610ebf565b60405161048f919061317d565b60405180910390f35b3480156104a3575f80fd5b506104be60048036038101906104b991906135fd565b610f11565b005b3480156104cb575f80fd5b506104e660048036038101906104e19190613196565b610f2c565b6040516104f391906132c2565b60405180910390f35b348015610507575f80fd5b50610522600480360381019061051d91906135d2565b610f3d565b60405161052f91906131d0565b60405180910390f35b348015610543575f80fd5b5061054c610ff3565b005b348015610559575f80fd5b50610562611006565b005b34801561056f575f80fd5b50610578611369565b60405161058591906132c2565b60405180910390f35b348015610599575f80fd5b506105a2611391565b6040516105af9190613263565b60405180910390f35b3480156105c3575f80fd5b506105de60048036038101906105d99190613644565b611421565b6040516105eb919061317d565b60405180910390f35b3480156105ff575f80fd5b5061061a60048036038101906106159190613196565b61144b565b60405161062791906131d0565b60405180910390f35b34801561063b575f80fd5b50610644611479565b60405161065191906131d0565b60405180910390f35b348015610665575f80fd5b5061066e611559565b005b34801561067b575f80fd5b50610696600480360381019061069191906136da565b61158d565b005b3480156106a3575f80fd5b506106be60048036038101906106b99190613196565b6115a3565b6040516106cb91906131d0565b60405180910390f35b3480156106df575f80fd5b506106fa60048036038101906106f59190613563565b6115d1565b005b6107046117f8565b005b348015610711575f80fd5b5061072c600480360381019061072791906137b6565b6118aa565b005b348015610739575f80fd5b50610754600480360381019061074f9190613196565b6118c7565b6040516107619190613263565b60405180910390f35b348015610775575f80fd5b5061077e61192c565b60405161078b919061317d565b60405180910390f35b34801561079f575f80fd5b506107ba60048036038101906107b59190613836565b61193f565b6040516107c7919061317d565b60405180910390f35b3480156107db575f80fd5b506107e46119cd565b6040516107f1919061317d565b60405180910390f35b348015610805575f80fd5b50610820600480360381019061081b91906135d2565b6119df565b005b61083c60048036038101906108379190613563565b611a63565b005b610846611c86565b8060105f8481526020019081526020015f2090816108649190613a6e565b505050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610943575061094282611d0d565b5b9050919050565b5f600e5f8381526020019081526020015f205f015f9054906101000a900461ffff1661ffff169050919050565b60605f8054610985906138a1565b80601f01602080910402602001604051908101604052809291908181526020018280546109b1906138a1565b80156109fc5780601f106109d3576101008083540402835291602001916109fc565b820191905f5260205f20905b8154815290600101906020018083116109df57829003601f168201915b5050505050905090565b5f610a1082611d76565b50610a1a82611dfc565b9050919050565b610a338282610a2e611e35565b611e3c565b5050565b5f600e5f600481526020019081526020015f205f015f9054906101000a900461ffff16600e5f600381526020019081526020015f205f015f9054906101000a900461ffff16600e5f600281526020019081526020015f205f015f9054906101000a900461ffff16600e5f600181526020019081526020015f205f015f9054906101000a900461ffff16600e5f8081526020019081526020015f205f015f9054906101000a900461ffff16610aeb9190613b77565b610af59190613b77565b610aff9190613b77565b610b099190613b77565b61ffff16905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b82575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610b7991906132c2565b60405180910390fd5b5f610b958383610b90611e35565b611e4e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c0b578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610c0293929190613bac565b60405180910390fd5b50505050565b610c19611c86565b806009906003610c2a929190612eae565b5050565b60085f9054906101000a900460ff16610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390613c2b565b60405180910390fd5b5f60029050610cb28233604051602001610c969190613c8e565b6040516020818303038152906040528051906020012083611421565b610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890613cf2565b60405180910390fd5b600e5f8281526020019081526020015f205f0160029054906101000a900461ffff1661ffff166001600e5f8481526020019081526020015f205f015f9054906101000a900461ffff16610d449190613b77565b61ffff161115610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8090613d80565b60405180910390fd5b600e5f8281526020019081526020015f205f0160069054906101000a900460ff1660ff166001600c5f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610e069190613d9e565b1115610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e90613e41565b60405180910390fd5b610e518133612059565b5050565b610e5d611c86565b60085f9054906101000a900460ff161560085f6101000a81548160ff021916908315150217905550565b60098160038110610e96575f80fd5b015f915090505481565b610eba83838360405180602001604052805f8152506118aa565b505050565b5f600f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b610f19611c86565b8060079081610f289190613a6e565b5050565b5f610f3682611d76565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fae575f6040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401610fa591906132c2565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610ffb611c86565b6110045f6121f8565b565b600860019054906101000a900460ff16611055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104c90613c2b565b60405180910390fd5b5f61105f336122bb565b9050600e5f8281526020019081526020015f205f0160029054906101000a900461ffff1661ffff166001600e5f8481526020019081526020015f205f015f9054906101000a900461ffff166110b49190613b77565b61ffff1611156110ca576110c7336122bb565b90505b600e5f8281526020019081526020015f205f0160029054906101000a900461ffff1661ffff166001600e5f8481526020019081526020015f205f015f9054906101000a900461ffff1661111d9190613b77565b61ffff161115611162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115990613d80565b60405180910390fd5b6001600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990613e41565b60405180910390fd5b6001600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461122c9190613d9e565b600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f600e5f8381526020019081526020015f205f015f9054906101000a900461ffff16905060018161129e9190613b77565b600e5f8481526020019081526020015f205f015f6101000a81548161ffff021916908361ffff1602179055506001600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611365336001600e5f8681526020019081526020015f205f0160049054906101000a900461ffff16846113529190613b77565b61135c9190613b77565b61ffff16612315565b5050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113a0906138a1565b80601f01602080910402602001604051908101604052809291908181526020018280546113cc906138a1565b80156114175780601f106113ee57610100808354040283529160200191611417565b820191905f5260205f20905b8154815290600101906020018083116113fa57829003601f168201915b5050505050905090565b5f611442846009846003811061143a57611439613e5f565b5b015485612332565b90509392505050565b5f600e5f8381526020019081526020015f205f0160049054906101000a900461ffff1661ffff169050919050565b5f600e5f600481526020019081526020015f205f0160029054906101000a900461ffff16600e5f600381526020019081526020015f205f0160029054906101000a900461ffff16600e5f600281526020019081526020015f205f0160029054906101000a900461ffff16600e5f600181526020019081526020015f205f0160029054906101000a900461ffff16600e5f8081526020019081526020015f205f0160029054906101000a900461ffff166115329190613b77565b61153c9190613b77565b6115469190613b77565b6115509190613b77565b61ffff16905090565b611561611c86565b600860019054906101000a900460ff1615600860016101000a81548160ff021916908315150217905550565b61159f611598611e35565b8383612348565b5050565b5f600e5f8381526020019081526020015f205f0160029054906101000a900461ffff1661ffff169050919050565b60085f9054906101000a900460ff1661161f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161690613c2b565b60405180910390fd5b5f6001905061165582336040516020016116399190613c8e565b6040516020818303038152906040528051906020012083611421565b611694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168b90613ed6565b60405180910390fd5b600e5f8281526020019081526020015f205f0160029054906101000a900461ffff1661ffff166001600e5f8481526020019081526020015f205f015f9054906101000a900461ffff166116e79190613b77565b61ffff16111561172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390613d80565b60405180910390fd5b600e5f8281526020019081526020015f205f0160069054906101000a900460ff1660ff166001600c5f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546117a99190613d9e565b11156117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e190613e41565b60405180910390fd5b6117f48133612059565b5050565b611800611c86565b5f60049050600e5f8281526020019081526020015f205f0160029054906101000a900461ffff1661ffff166001600e5f8481526020019081526020015f205f015f9054906101000a900461ffff166118589190613b77565b61ffff16111561189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189490613d80565b60405180910390fd5b6118a78133612059565b50565b6118b5848484610b12565b6118c1848484846124b1565b50505050565b60606118d282612663565b5f6118db6126ae565b90505f8151116118f95760405180602001604052805f815250611924565b806119038461273e565b604051602001611914929190613f78565b6040516020818303038152906040525b915050919050565b600860019054906101000a900460ff1681565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60085f9054906101000a900460ff1681565b6119e7611c86565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a57575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611a4e91906132c2565b60405180910390fd5b611a60816121f8565b50565b60085f9054906101000a900460ff16611ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa890613c2b565b60405180910390fd5b5f611ae38233604051602001611ac79190613c8e565b6040516020818303038152906040528051906020012083611421565b611b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1990613ff0565b60405180910390fd5b600e5f8281526020019081526020015f205f0160029054906101000a900461ffff1661ffff166001600e5f8481526020019081526020015f205f015f9054906101000a900461ffff16611b759190613b77565b61ffff161115611bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb190613d80565b60405180910390fd5b600e5f8281526020019081526020015f205f0160069054906101000a900460ff1660ff166001600c5f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611c379190613d9e565b1115611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f90613e41565b60405180910390fd5b611c828133612059565b5050565b611c8e611e35565b73ffffffffffffffffffffffffffffffffffffffff16611cac611369565b73ffffffffffffffffffffffffffffffffffffffff1614611d0b57611ccf611e35565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611d0291906132c2565b60405180910390fd5b565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f80611d8183612808565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611df357826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611dea91906131d0565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b611e498383836001612841565b505050565b5f80611e5984612808565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e9a57611e99818486612a00565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f2557611ed95f855f80612841565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611fa457600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6001600c5f8481526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546120b29190613d9e565b600c5f8481526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f600e5f8481526020019081526020015f205f015f9054906101000a900461ffff1690506001816121339190613b77565b600e5f8581526020019081526020015f205f015f6101000a81548161ffff021916908361ffff1602179055505f600e5f8581526020019081526020015f205f0160049054906101000a900461ffff1690506001600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506121f28382846121e99190613b77565b61ffff16612315565b50505050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f806001436122ca919061400e565b405f1c90505f60034283866040516020016122e793929190614061565b604051602081830303815290604052805190602001205f1c61230991906140ca565b90508092505050919050565b61232e828260405180602001604052805f815250612ac3565b5050565b5f8261233e8584612ade565b1490509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123b857816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016123af91906132c2565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124a4919061317d565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b111561265d578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026124f4611e35565b8685856040518563ffffffff1660e01b8152600401612516949392919061414c565b6020604051808303815f875af192505050801561255157506040513d601f19601f8201168201806040525081019061254e91906141aa565b60015b6125d2573d805f811461257f576040519150601f19603f3d011682016040523d82523d5f602084013e612584565b606091505b505f8151036125ca57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016125c191906132c2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461265b57836040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161265291906132c2565b60405180910390fd5b505b50505050565b61266c81612b2c565b6126ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a29061421f565b60405180910390fd5b50565b6060600780546126bd906138a1565b80601f01602080910402602001604051908101604052809291908181526020018280546126e9906138a1565b80156127345780601f1061270b57610100808354040283529160200191612734565b820191905f5260205f20905b81548152906001019060200180831161271757829003601f168201915b5050505050905090565b60605f600161274c84612b6c565b0190505f8167ffffffffffffffff81111561276a57612769612f65565b5b6040519080825280601f01601f19166020018201604052801561279c5781602001600182028036833780820191505090505b5090505f82602001820190505b6001156127fd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816127f2576127f161409d565b5b0494505f85036127a9575b819350505050919050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b808061287957505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156129ab575f61288884611d76565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156128f257508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156129055750612903818461193f565b155b1561294757826040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815260040161293e91906132c2565b60405180910390fd5b81156129a957838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b612a0b838383612cbd565b612abe575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a7f57806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401612a7691906131d0565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401612ab592919061423d565b60405180910390fd5b505050565b612acd8383612d7d565b612ad95f8484846124b1565b505050565b5f808290505f5b8451811015612b2157612b1282868381518110612b0557612b04613e5f565b5b6020026020010151612e70565b91508080600101915050612ae5565b508091505092915050565b5f8073ffffffffffffffffffffffffffffffffffffffff16612b4d83612808565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612bc8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612bbe57612bbd61409d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612c05576d04ee2d6d415b85acef81000000008381612bfb57612bfa61409d565b5b0492506020810190505b662386f26fc100008310612c3457662386f26fc100008381612c2a57612c2961409d565b5b0492506010810190505b6305f5e1008310612c5d576305f5e1008381612c5357612c5261409d565b5b0492506008810190505b6127108310612c82576127108381612c7857612c7761409d565b5b0492506004810190505b60648310612ca55760648381612c9b57612c9a61409d565b5b0492506002810190505b600a8310612cb4576001810190505b80915050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d7457508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d355750612d34848461193f565b5b80612d7357508273ffffffffffffffffffffffffffffffffffffffff16612d5b83611dfc565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ded575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612de491906132c2565b60405180910390fd5b5f612df983835f611e4e565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e6b575f6040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401612e6291906132c2565b60405180910390fd5b505050565b5f818310612e8757612e828284612e9a565b612e92565b612e918383612e9a565b5b905092915050565b5f825f528160205260405f20905092915050565b8260038101928215612edd579160200282015b82811115612edc578251825591602001919060010190612ec1565b5b509050612eea9190612eee565b5090565b5b80821115612f05575f815f905550600101612eef565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b612f2c81612f1a565b8114612f36575f80fd5b50565b5f81359050612f4781612f23565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612f9b82612f55565b810181811067ffffffffffffffff82111715612fba57612fb9612f65565b5b80604052505050565b5f612fcc612f09565b9050612fd88282612f92565b919050565b5f67ffffffffffffffff821115612ff757612ff6612f65565b5b61300082612f55565b9050602081019050919050565b828183375f83830152505050565b5f61302d61302884612fdd565b612fc3565b90508281526020810184848401111561304957613048612f51565b5b61305484828561300d565b509392505050565b5f82601f8301126130705761306f612f4d565b5b813561308084826020860161301b565b91505092915050565b5f806040838503121561309f5761309e612f12565b5b5f6130ac85828601612f39565b925050602083013567ffffffffffffffff8111156130cd576130cc612f16565b5b6130d98582860161305c565b9150509250929050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613117816130e3565b8114613121575f80fd5b50565b5f813590506131328161310e565b92915050565b5f6020828403121561314d5761314c612f12565b5b5f61315a84828501613124565b91505092915050565b5f8115159050919050565b61317781613163565b82525050565b5f6020820190506131905f83018461316e565b92915050565b5f602082840312156131ab576131aa612f12565b5b5f6131b884828501612f39565b91505092915050565b6131ca81612f1a565b82525050565b5f6020820190506131e35f8301846131c1565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613220578082015181840152602081019050613205565b5f8484015250505050565b5f613235826131e9565b61323f81856131f3565b935061324f818560208601613203565b61325881612f55565b840191505092915050565b5f6020820190508181035f83015261327b818461322b565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6132ac82613283565b9050919050565b6132bc816132a2565b82525050565b5f6020820190506132d55f8301846132b3565b92915050565b6132e4816132a2565b81146132ee575f80fd5b50565b5f813590506132ff816132db565b92915050565b5f806040838503121561331b5761331a612f12565b5b5f613328858286016132f1565b925050602061333985828601612f39565b9150509250929050565b5f805f6060848603121561335a57613359612f12565b5b5f613367868287016132f1565b9350506020613378868287016132f1565b925050604061338986828701612f39565b9150509250925092565b5f67ffffffffffffffff8211156133ad576133ac612f65565b5b602082029050919050565b5f80fd5b5f819050919050565b6133ce816133bc565b81146133d8575f80fd5b50565b5f813590506133e9816133c5565b92915050565b5f6134016133fc84613393565b612fc3565b9050806020840283018581111561341b5761341a6133b8565b5b835b81811015613444578061343088826133db565b84526020840193505060208101905061341d565b5050509392505050565b5f82601f83011261346257613461612f4d565b5b600361346f8482856133ef565b91505092915050565b5f6060828403121561348d5761348c612f12565b5b5f61349a8482850161344e565b91505092915050565b5f67ffffffffffffffff8211156134bd576134bc612f65565b5b602082029050602081019050919050565b5f6134e06134db846134a3565b612fc3565b90508083825260208201905060208402830185811115613503576135026133b8565b5b835b8181101561352c578061351888826133db565b845260208401935050602081019050613505565b5050509392505050565b5f82601f83011261354a57613549612f4d565b5b813561355a8482602086016134ce565b91505092915050565b5f6020828403121561357857613577612f12565b5b5f82013567ffffffffffffffff81111561359557613594612f16565b5b6135a184828501613536565b91505092915050565b6135b3816133bc565b82525050565b5f6020820190506135cc5f8301846135aa565b92915050565b5f602082840312156135e7576135e6612f12565b5b5f6135f4848285016132f1565b91505092915050565b5f6020828403121561361257613611612f12565b5b5f82013567ffffffffffffffff81111561362f5761362e612f16565b5b61363b8482850161305c565b91505092915050565b5f805f6060848603121561365b5761365a612f12565b5b5f84013567ffffffffffffffff81111561367857613677612f16565b5b61368486828701613536565b9350506020613695868287016133db565b92505060406136a686828701612f39565b9150509250925092565b6136b981613163565b81146136c3575f80fd5b50565b5f813590506136d4816136b0565b92915050565b5f80604083850312156136f0576136ef612f12565b5b5f6136fd858286016132f1565b925050602061370e858286016136c6565b9150509250929050565b5f67ffffffffffffffff82111561373257613731612f65565b5b61373b82612f55565b9050602081019050919050565b5f61375a61375584613718565b612fc3565b90508281526020810184848401111561377657613775612f51565b5b61378184828561300d565b509392505050565b5f82601f83011261379d5761379c612f4d565b5b81356137ad848260208601613748565b91505092915050565b5f805f80608085870312156137ce576137cd612f12565b5b5f6137db878288016132f1565b94505060206137ec878288016132f1565b93505060406137fd87828801612f39565b925050606085013567ffffffffffffffff81111561381e5761381d612f16565b5b61382a87828801613789565b91505092959194509250565b5f806040838503121561384c5761384b612f12565b5b5f613859858286016132f1565b925050602061386a858286016132f1565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806138b857607f821691505b6020821081036138cb576138ca613874565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261392d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826138f2565b61393786836138f2565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61397261396d61396884612f1a565b61394f565b612f1a565b9050919050565b5f819050919050565b61398b83613958565b61399f61399782613979565b8484546138fe565b825550505050565b5f90565b6139b36139a7565b6139be818484613982565b505050565b5b818110156139e1576139d65f826139ab565b6001810190506139c4565b5050565b601f821115613a26576139f7816138d1565b613a00846138e3565b81016020851015613a0f578190505b613a23613a1b856138e3565b8301826139c3565b50505b505050565b5f82821c905092915050565b5f613a465f1984600802613a2b565b1980831691505092915050565b5f613a5e8383613a37565b9150826002028217905092915050565b613a77826131e9565b67ffffffffffffffff811115613a9057613a8f612f65565b5b613a9a82546138a1565b613aa58282856139e5565b5f60209050601f831160018114613ad6575f8415613ac4578287015190505b613ace8582613a53565b865550613b35565b601f198416613ae4866138d1565b5f5b82811015613b0b57848901518255600182019150602085019450602081019050613ae6565b86831015613b285784890151613b24601f891682613a37565b8355505b6001600288020188555050505b505050505050565b5f61ffff82169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613b8182613b3d565b9150613b8c83613b3d565b9250828201905061ffff811115613ba657613ba5613b4a565b5b92915050565b5f606082019050613bbf5f8301866132b3565b613bcc60208301856131c1565b613bd960408301846132b3565b949350505050565b7f53616c65206973206e6f742061637469766500000000000000000000000000005f82015250565b5f613c156012836131f3565b9150613c2082613be1565b602082019050919050565b5f6020820190508181035f830152613c4281613c09565b9050919050565b5f8160601b9050919050565b5f613c5f82613c49565b9050919050565b5f613c7082613c55565b9050919050565b613c88613c83826132a2565b613c66565b82525050565b5f613c998284613c77565b60148201915081905092915050565b7f4e6f7420612070617274206f66205469657220330000000000000000000000005f82015250565b5f613cdc6014836131f3565b9150613ce782613ca8565b602082019050919050565b5f6020820190508181035f830152613d0981613cd0565b9050919050565b7f4578636565646564206d6178206c696d6974206f6620616c6c6f77656420746f5f8201527f6b656e206d696e74730000000000000000000000000000000000000000000000602082015250565b5f613d6a6029836131f3565b9150613d7582613d10565b604082019050919050565b5f6020820190508181035f830152613d9781613d5e565b9050919050565b5f613da882612f1a565b9150613db383612f1a565b9250828201905080821115613dcb57613dca613b4a565b5b92915050565b7f4d6178206e756d626572206f66206d696e7473207065722061646472657373205f8201527f7265616368656400000000000000000000000000000000000000000000000000602082015250565b5f613e2b6027836131f3565b9150613e3682613dd1565b604082019050919050565b5f6020820190508181035f830152613e5881613e1f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e6f7420612070617274206f66205469657220310000000000000000000000005f82015250565b5f613ec06014836131f3565b9150613ecb82613e8c565b602082019050919050565b5f6020820190508181035f830152613eed81613eb4565b9050919050565b5f81905092915050565b5f613f08826131e9565b613f128185613ef4565b9350613f22818560208601613203565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f613f62600583613ef4565b9150613f6d82613f2e565b600582019050919050565b5f613f838285613efe565b9150613f8f8284613efe565b9150613f9a82613f56565b91508190509392505050565b7f4e6f7420612070617274206f66205469657220300000000000000000000000005f82015250565b5f613fda6014836131f3565b9150613fe582613fa6565b602082019050919050565b5f6020820190508181035f83015261400781613fce565b9050919050565b5f61401882612f1a565b915061402383612f1a565b925082820390508181111561403b5761403a613b4a565b5b92915050565b5f819050919050565b61405b61405682612f1a565b614041565b82525050565b5f61406c828661404a565b60208201915061407c828561404a565b60208201915061408c8284613c77565b601482019150819050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6140d482612f1a565b91506140df83612f1a565b9250826140ef576140ee61409d565b5b828206905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f61411e826140fa565b6141288185614104565b9350614138818560208601613203565b61414181612f55565b840191505092915050565b5f60808201905061415f5f8301876132b3565b61416c60208301866132b3565b61417960408301856131c1565b818103606083015261418b8184614114565b905095945050505050565b5f815190506141a48161310e565b92915050565b5f602082840312156141bf576141be612f12565b5b5f6141cc84828501614196565b91505092915050565b7f4552433732313a20696e76616c696420746f6b656e20494400000000000000005f82015250565b5f6142096018836131f3565b9150614214826141d5565b602082019050919050565b5f6020820190508181035f830152614236816141fd565b9050919050565b5f6040820190506142505f8301856132b3565b61425d60208301846131c1565b939250505056fea2646970667358221220cdbec5e095e198ae997eec22741e44e5b758c003685f661d9176646182f76f1e64736f6c63430008170033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000084e6176795365616c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084e6176795365616c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696367636f6a776569767a69357179326437776e746977757277706a737473327669636a626965333374646f796d716a6a6c6465752f0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061020e575f3560e01c80638c874ebd11610117578063adb8e9d81161009f578063de9723571161006e578063de9723571461076a578063e985e9c514610794578063eb8d2444146107d0578063f2fde38b146107fa578063fcb6becb146108225761020e565b8063adb8e9d8146106d4578063b12dc991146106fc578063b88d4fde14610706578063c87b56dd1461072e5761020e565b80639d67f486116100e65780639d67f486146105f4578063a0617ad014610630578063a10866ef1461065a578063a22cb46514610670578063a78bf96e146106985761020e565b80638c874ebd1461054e5780638da5cb5b1461056457806395d89b411461058e578063986f4227146105b85761020e565b80632d7dbbca1161019a5780634fc281f2116101695780634fc281f21461045c57806355f804b3146104985780636352211e146104c057806370a08231146104fc578063715018a6146105385761020e565b80632d7dbbca146103ba57806334918dfd146103e25780633c70b357146103f857806342842e0e146104345761020e565b8063081812fc116101e1578063081812fc146102dc578063095ea7b31461031857806318160ddd1461034057806323b872dd1461036a5780632d21daf1146103925761020e565b8063015388681461021257806301ffc9a71461023a5780630338ee811461027657806306fdde03146102b2575b5f80fd5b34801561021d575f80fd5b5061023860048036038101906102339190613089565b61083e565b005b348015610245575f80fd5b50610260600480360381019061025b9190613138565b610869565b60405161026d919061317d565b60405180910390f35b348015610281575f80fd5b5061029c60048036038101906102979190613196565b61094a565b6040516102a991906131d0565b60405180910390f35b3480156102bd575f80fd5b506102c6610977565b6040516102d39190613263565b60405180910390f35b3480156102e7575f80fd5b5061030260048036038101906102fd9190613196565b610a06565b60405161030f91906132c2565b60405180910390f35b348015610323575f80fd5b5061033e60048036038101906103399190613305565b610a21565b005b34801561034b575f80fd5b50610354610a37565b60405161036191906131d0565b60405180910390f35b348015610375575f80fd5b50610390600480360381019061038b9190613343565b610b12565b005b34801561039d575f80fd5b506103b860048036038101906103b39190613478565b610c11565b005b3480156103c5575f80fd5b506103e060048036038101906103db9190613563565b610c2e565b005b3480156103ed575f80fd5b506103f6610e55565b005b348015610403575f80fd5b5061041e60048036038101906104199190613196565b610e87565b60405161042b91906135b9565b60405180910390f35b34801561043f575f80fd5b5061045a60048036038101906104559190613343565b610ea0565b005b348015610467575f80fd5b50610482600480360381019061047d91906135d2565b610ebf565b60405161048f919061317d565b60405180910390f35b3480156104a3575f80fd5b506104be60048036038101906104b991906135fd565b610f11565b005b3480156104cb575f80fd5b506104e660048036038101906104e19190613196565b610f2c565b6040516104f391906132c2565b60405180910390f35b348015610507575f80fd5b50610522600480360381019061051d91906135d2565b610f3d565b60405161052f91906131d0565b60405180910390f35b348015610543575f80fd5b5061054c610ff3565b005b348015610559575f80fd5b50610562611006565b005b34801561056f575f80fd5b50610578611369565b60405161058591906132c2565b60405180910390f35b348015610599575f80fd5b506105a2611391565b6040516105af9190613263565b60405180910390f35b3480156105c3575f80fd5b506105de60048036038101906105d99190613644565b611421565b6040516105eb919061317d565b60405180910390f35b3480156105ff575f80fd5b5061061a60048036038101906106159190613196565b61144b565b60405161062791906131d0565b60405180910390f35b34801561063b575f80fd5b50610644611479565b60405161065191906131d0565b60405180910390f35b348015610665575f80fd5b5061066e611559565b005b34801561067b575f80fd5b50610696600480360381019061069191906136da565b61158d565b005b3480156106a3575f80fd5b506106be60048036038101906106b99190613196565b6115a3565b6040516106cb91906131d0565b60405180910390f35b3480156106df575f80fd5b506106fa60048036038101906106f59190613563565b6115d1565b005b6107046117f8565b005b348015610711575f80fd5b5061072c600480360381019061072791906137b6565b6118aa565b005b348015610739575f80fd5b50610754600480360381019061074f9190613196565b6118c7565b6040516107619190613263565b60405180910390f35b348015610775575f80fd5b5061077e61192c565b60405161078b919061317d565b60405180910390f35b34801561079f575f80fd5b506107ba60048036038101906107b59190613836565b61193f565b6040516107c7919061317d565b60405180910390f35b3480156107db575f80fd5b506107e46119cd565b6040516107f1919061317d565b60405180910390f35b348015610805575f80fd5b50610820600480360381019061081b91906135d2565b6119df565b005b61083c60048036038101906108379190613563565b611a63565b005b610846611c86565b8060105f8481526020019081526020015f2090816108649190613a6e565b505050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610943575061094282611d0d565b5b9050919050565b5f600e5f8381526020019081526020015f205f015f9054906101000a900461ffff1661ffff169050919050565b60605f8054610985906138a1565b80601f01602080910402602001604051908101604052809291908181526020018280546109b1906138a1565b80156109fc5780601f106109d3576101008083540402835291602001916109fc565b820191905f5260205f20905b8154815290600101906020018083116109df57829003601f168201915b5050505050905090565b5f610a1082611d76565b50610a1a82611dfc565b9050919050565b610a338282610a2e611e35565b611e3c565b5050565b5f600e5f600481526020019081526020015f205f015f9054906101000a900461ffff16600e5f600381526020019081526020015f205f015f9054906101000a900461ffff16600e5f600281526020019081526020015f205f015f9054906101000a900461ffff16600e5f600181526020019081526020015f205f015f9054906101000a900461ffff16600e5f8081526020019081526020015f205f015f9054906101000a900461ffff16610aeb9190613b77565b610af59190613b77565b610aff9190613b77565b610b099190613b77565b61ffff16905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b82575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610b7991906132c2565b60405180910390fd5b5f610b958383610b90611e35565b611e4e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c0b578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610c0293929190613bac565b60405180910390fd5b50505050565b610c19611c86565b806009906003610c2a929190612eae565b5050565b60085f9054906101000a900460ff16610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390613c2b565b60405180910390fd5b5f60029050610cb28233604051602001610c969190613c8e565b6040516020818303038152906040528051906020012083611421565b610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890613cf2565b60405180910390fd5b600e5f8281526020019081526020015f205f0160029054906101000a900461ffff1661ffff166001600e5f8481526020019081526020015f205f015f9054906101000a900461ffff16610d449190613b77565b61ffff161115610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8090613d80565b60405180910390fd5b600e5f8281526020019081526020015f205f0160069054906101000a900460ff1660ff166001600c5f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610e069190613d9e565b1115610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e90613e41565b60405180910390fd5b610e518133612059565b5050565b610e5d611c86565b60085f9054906101000a900460ff161560085f6101000a81548160ff021916908315150217905550565b60098160038110610e96575f80fd5b015f915090505481565b610eba83838360405180602001604052805f8152506118aa565b505050565b5f600f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b610f19611c86565b8060079081610f289190613a6e565b5050565b5f610f3682611d76565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fae575f6040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401610fa591906132c2565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610ffb611c86565b6110045f6121f8565b565b600860019054906101000a900460ff16611055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104c90613c2b565b60405180910390fd5b5f61105f336122bb565b9050600e5f8281526020019081526020015f205f0160029054906101000a900461ffff1661ffff166001600e5f8481526020019081526020015f205f015f9054906101000a900461ffff166110b49190613b77565b61ffff1611156110ca576110c7336122bb565b90505b600e5f8281526020019081526020015f205f0160029054906101000a900461ffff1661ffff166001600e5f8481526020019081526020015f205f015f9054906101000a900461ffff1661111d9190613b77565b61ffff161115611162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115990613d80565b60405180910390fd5b6001600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990613e41565b60405180910390fd5b6001600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461122c9190613d9e565b600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f600e5f8381526020019081526020015f205f015f9054906101000a900461ffff16905060018161129e9190613b77565b600e5f8481526020019081526020015f205f015f6101000a81548161ffff021916908361ffff1602179055506001600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611365336001600e5f8681526020019081526020015f205f0160049054906101000a900461ffff16846113529190613b77565b61135c9190613b77565b61ffff16612315565b5050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113a0906138a1565b80601f01602080910402602001604051908101604052809291908181526020018280546113cc906138a1565b80156114175780601f106113ee57610100808354040283529160200191611417565b820191905f5260205f20905b8154815290600101906020018083116113fa57829003601f168201915b5050505050905090565b5f611442846009846003811061143a57611439613e5f565b5b015485612332565b90509392505050565b5f600e5f8381526020019081526020015f205f0160049054906101000a900461ffff1661ffff169050919050565b5f600e5f600481526020019081526020015f205f0160029054906101000a900461ffff16600e5f600381526020019081526020015f205f0160029054906101000a900461ffff16600e5f600281526020019081526020015f205f0160029054906101000a900461ffff16600e5f600181526020019081526020015f205f0160029054906101000a900461ffff16600e5f8081526020019081526020015f205f0160029054906101000a900461ffff166115329190613b77565b61153c9190613b77565b6115469190613b77565b6115509190613b77565b61ffff16905090565b611561611c86565b600860019054906101000a900460ff1615600860016101000a81548160ff021916908315150217905550565b61159f611598611e35565b8383612348565b5050565b5f600e5f8381526020019081526020015f205f0160029054906101000a900461ffff1661ffff169050919050565b60085f9054906101000a900460ff1661161f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161690613c2b565b60405180910390fd5b5f6001905061165582336040516020016116399190613c8e565b6040516020818303038152906040528051906020012083611421565b611694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168b90613ed6565b60405180910390fd5b600e5f8281526020019081526020015f205f0160029054906101000a900461ffff1661ffff166001600e5f8481526020019081526020015f205f015f9054906101000a900461ffff166116e79190613b77565b61ffff16111561172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390613d80565b60405180910390fd5b600e5f8281526020019081526020015f205f0160069054906101000a900460ff1660ff166001600c5f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546117a99190613d9e565b11156117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e190613e41565b60405180910390fd5b6117f48133612059565b5050565b611800611c86565b5f60049050600e5f8281526020019081526020015f205f0160029054906101000a900461ffff1661ffff166001600e5f8481526020019081526020015f205f015f9054906101000a900461ffff166118589190613b77565b61ffff16111561189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189490613d80565b60405180910390fd5b6118a78133612059565b50565b6118b5848484610b12565b6118c1848484846124b1565b50505050565b60606118d282612663565b5f6118db6126ae565b90505f8151116118f95760405180602001604052805f815250611924565b806119038461273e565b604051602001611914929190613f78565b6040516020818303038152906040525b915050919050565b600860019054906101000a900460ff1681565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60085f9054906101000a900460ff1681565b6119e7611c86565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a57575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611a4e91906132c2565b60405180910390fd5b611a60816121f8565b50565b60085f9054906101000a900460ff16611ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa890613c2b565b60405180910390fd5b5f611ae38233604051602001611ac79190613c8e565b6040516020818303038152906040528051906020012083611421565b611b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1990613ff0565b60405180910390fd5b600e5f8281526020019081526020015f205f0160029054906101000a900461ffff1661ffff166001600e5f8481526020019081526020015f205f015f9054906101000a900461ffff16611b759190613b77565b61ffff161115611bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb190613d80565b60405180910390fd5b600e5f8281526020019081526020015f205f0160069054906101000a900460ff1660ff166001600c5f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611c379190613d9e565b1115611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f90613e41565b60405180910390fd5b611c828133612059565b5050565b611c8e611e35565b73ffffffffffffffffffffffffffffffffffffffff16611cac611369565b73ffffffffffffffffffffffffffffffffffffffff1614611d0b57611ccf611e35565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611d0291906132c2565b60405180910390fd5b565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f80611d8183612808565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611df357826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611dea91906131d0565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b611e498383836001612841565b505050565b5f80611e5984612808565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e9a57611e99818486612a00565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f2557611ed95f855f80612841565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611fa457600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6001600c5f8481526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546120b29190613d9e565b600c5f8481526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f600e5f8481526020019081526020015f205f015f9054906101000a900461ffff1690506001816121339190613b77565b600e5f8581526020019081526020015f205f015f6101000a81548161ffff021916908361ffff1602179055505f600e5f8581526020019081526020015f205f0160049054906101000a900461ffff1690506001600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506121f28382846121e99190613b77565b61ffff16612315565b50505050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f806001436122ca919061400e565b405f1c90505f60034283866040516020016122e793929190614061565b604051602081830303815290604052805190602001205f1c61230991906140ca565b90508092505050919050565b61232e828260405180602001604052805f815250612ac3565b5050565b5f8261233e8584612ade565b1490509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123b857816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016123af91906132c2565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124a4919061317d565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b111561265d578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026124f4611e35565b8685856040518563ffffffff1660e01b8152600401612516949392919061414c565b6020604051808303815f875af192505050801561255157506040513d601f19601f8201168201806040525081019061254e91906141aa565b60015b6125d2573d805f811461257f576040519150601f19603f3d011682016040523d82523d5f602084013e612584565b606091505b505f8151036125ca57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016125c191906132c2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461265b57836040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161265291906132c2565b60405180910390fd5b505b50505050565b61266c81612b2c565b6126ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a29061421f565b60405180910390fd5b50565b6060600780546126bd906138a1565b80601f01602080910402602001604051908101604052809291908181526020018280546126e9906138a1565b80156127345780601f1061270b57610100808354040283529160200191612734565b820191905f5260205f20905b81548152906001019060200180831161271757829003601f168201915b5050505050905090565b60605f600161274c84612b6c565b0190505f8167ffffffffffffffff81111561276a57612769612f65565b5b6040519080825280601f01601f19166020018201604052801561279c5781602001600182028036833780820191505090505b5090505f82602001820190505b6001156127fd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816127f2576127f161409d565b5b0494505f85036127a9575b819350505050919050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b808061287957505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156129ab575f61288884611d76565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156128f257508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156129055750612903818461193f565b155b1561294757826040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815260040161293e91906132c2565b60405180910390fd5b81156129a957838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b612a0b838383612cbd565b612abe575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a7f57806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401612a7691906131d0565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401612ab592919061423d565b60405180910390fd5b505050565b612acd8383612d7d565b612ad95f8484846124b1565b505050565b5f808290505f5b8451811015612b2157612b1282868381518110612b0557612b04613e5f565b5b6020026020010151612e70565b91508080600101915050612ae5565b508091505092915050565b5f8073ffffffffffffffffffffffffffffffffffffffff16612b4d83612808565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612bc8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612bbe57612bbd61409d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612c05576d04ee2d6d415b85acef81000000008381612bfb57612bfa61409d565b5b0492506020810190505b662386f26fc100008310612c3457662386f26fc100008381612c2a57612c2961409d565b5b0492506010810190505b6305f5e1008310612c5d576305f5e1008381612c5357612c5261409d565b5b0492506008810190505b6127108310612c82576127108381612c7857612c7761409d565b5b0492506004810190505b60648310612ca55760648381612c9b57612c9a61409d565b5b0492506002810190505b600a8310612cb4576001810190505b80915050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d7457508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d355750612d34848461193f565b5b80612d7357508273ffffffffffffffffffffffffffffffffffffffff16612d5b83611dfc565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ded575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612de491906132c2565b60405180910390fd5b5f612df983835f611e4e565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e6b575f6040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401612e6291906132c2565b60405180910390fd5b505050565b5f818310612e8757612e828284612e9a565b612e92565b612e918383612e9a565b5b905092915050565b5f825f528160205260405f20905092915050565b8260038101928215612edd579160200282015b82811115612edc578251825591602001919060010190612ec1565b5b509050612eea9190612eee565b5090565b5b80821115612f05575f815f905550600101612eef565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b612f2c81612f1a565b8114612f36575f80fd5b50565b5f81359050612f4781612f23565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612f9b82612f55565b810181811067ffffffffffffffff82111715612fba57612fb9612f65565b5b80604052505050565b5f612fcc612f09565b9050612fd88282612f92565b919050565b5f67ffffffffffffffff821115612ff757612ff6612f65565b5b61300082612f55565b9050602081019050919050565b828183375f83830152505050565b5f61302d61302884612fdd565b612fc3565b90508281526020810184848401111561304957613048612f51565b5b61305484828561300d565b509392505050565b5f82601f8301126130705761306f612f4d565b5b813561308084826020860161301b565b91505092915050565b5f806040838503121561309f5761309e612f12565b5b5f6130ac85828601612f39565b925050602083013567ffffffffffffffff8111156130cd576130cc612f16565b5b6130d98582860161305c565b9150509250929050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613117816130e3565b8114613121575f80fd5b50565b5f813590506131328161310e565b92915050565b5f6020828403121561314d5761314c612f12565b5b5f61315a84828501613124565b91505092915050565b5f8115159050919050565b61317781613163565b82525050565b5f6020820190506131905f83018461316e565b92915050565b5f602082840312156131ab576131aa612f12565b5b5f6131b884828501612f39565b91505092915050565b6131ca81612f1a565b82525050565b5f6020820190506131e35f8301846131c1565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613220578082015181840152602081019050613205565b5f8484015250505050565b5f613235826131e9565b61323f81856131f3565b935061324f818560208601613203565b61325881612f55565b840191505092915050565b5f6020820190508181035f83015261327b818461322b565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6132ac82613283565b9050919050565b6132bc816132a2565b82525050565b5f6020820190506132d55f8301846132b3565b92915050565b6132e4816132a2565b81146132ee575f80fd5b50565b5f813590506132ff816132db565b92915050565b5f806040838503121561331b5761331a612f12565b5b5f613328858286016132f1565b925050602061333985828601612f39565b9150509250929050565b5f805f6060848603121561335a57613359612f12565b5b5f613367868287016132f1565b9350506020613378868287016132f1565b925050604061338986828701612f39565b9150509250925092565b5f67ffffffffffffffff8211156133ad576133ac612f65565b5b602082029050919050565b5f80fd5b5f819050919050565b6133ce816133bc565b81146133d8575f80fd5b50565b5f813590506133e9816133c5565b92915050565b5f6134016133fc84613393565b612fc3565b9050806020840283018581111561341b5761341a6133b8565b5b835b81811015613444578061343088826133db565b84526020840193505060208101905061341d565b5050509392505050565b5f82601f83011261346257613461612f4d565b5b600361346f8482856133ef565b91505092915050565b5f6060828403121561348d5761348c612f12565b5b5f61349a8482850161344e565b91505092915050565b5f67ffffffffffffffff8211156134bd576134bc612f65565b5b602082029050602081019050919050565b5f6134e06134db846134a3565b612fc3565b90508083825260208201905060208402830185811115613503576135026133b8565b5b835b8181101561352c578061351888826133db565b845260208401935050602081019050613505565b5050509392505050565b5f82601f83011261354a57613549612f4d565b5b813561355a8482602086016134ce565b91505092915050565b5f6020828403121561357857613577612f12565b5b5f82013567ffffffffffffffff81111561359557613594612f16565b5b6135a184828501613536565b91505092915050565b6135b3816133bc565b82525050565b5f6020820190506135cc5f8301846135aa565b92915050565b5f602082840312156135e7576135e6612f12565b5b5f6135f4848285016132f1565b91505092915050565b5f6020828403121561361257613611612f12565b5b5f82013567ffffffffffffffff81111561362f5761362e612f16565b5b61363b8482850161305c565b91505092915050565b5f805f6060848603121561365b5761365a612f12565b5b5f84013567ffffffffffffffff81111561367857613677612f16565b5b61368486828701613536565b9350506020613695868287016133db565b92505060406136a686828701612f39565b9150509250925092565b6136b981613163565b81146136c3575f80fd5b50565b5f813590506136d4816136b0565b92915050565b5f80604083850312156136f0576136ef612f12565b5b5f6136fd858286016132f1565b925050602061370e858286016136c6565b9150509250929050565b5f67ffffffffffffffff82111561373257613731612f65565b5b61373b82612f55565b9050602081019050919050565b5f61375a61375584613718565b612fc3565b90508281526020810184848401111561377657613775612f51565b5b61378184828561300d565b509392505050565b5f82601f83011261379d5761379c612f4d565b5b81356137ad848260208601613748565b91505092915050565b5f805f80608085870312156137ce576137cd612f12565b5b5f6137db878288016132f1565b94505060206137ec878288016132f1565b93505060406137fd87828801612f39565b925050606085013567ffffffffffffffff81111561381e5761381d612f16565b5b61382a87828801613789565b91505092959194509250565b5f806040838503121561384c5761384b612f12565b5b5f613859858286016132f1565b925050602061386a858286016132f1565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806138b857607f821691505b6020821081036138cb576138ca613874565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261392d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826138f2565b61393786836138f2565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61397261396d61396884612f1a565b61394f565b612f1a565b9050919050565b5f819050919050565b61398b83613958565b61399f61399782613979565b8484546138fe565b825550505050565b5f90565b6139b36139a7565b6139be818484613982565b505050565b5b818110156139e1576139d65f826139ab565b6001810190506139c4565b5050565b601f821115613a26576139f7816138d1565b613a00846138e3565b81016020851015613a0f578190505b613a23613a1b856138e3565b8301826139c3565b50505b505050565b5f82821c905092915050565b5f613a465f1984600802613a2b565b1980831691505092915050565b5f613a5e8383613a37565b9150826002028217905092915050565b613a77826131e9565b67ffffffffffffffff811115613a9057613a8f612f65565b5b613a9a82546138a1565b613aa58282856139e5565b5f60209050601f831160018114613ad6575f8415613ac4578287015190505b613ace8582613a53565b865550613b35565b601f198416613ae4866138d1565b5f5b82811015613b0b57848901518255600182019150602085019450602081019050613ae6565b86831015613b285784890151613b24601f891682613a37565b8355505b6001600288020188555050505b505050505050565b5f61ffff82169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613b8182613b3d565b9150613b8c83613b3d565b9250828201905061ffff811115613ba657613ba5613b4a565b5b92915050565b5f606082019050613bbf5f8301866132b3565b613bcc60208301856131c1565b613bd960408301846132b3565b949350505050565b7f53616c65206973206e6f742061637469766500000000000000000000000000005f82015250565b5f613c156012836131f3565b9150613c2082613be1565b602082019050919050565b5f6020820190508181035f830152613c4281613c09565b9050919050565b5f8160601b9050919050565b5f613c5f82613c49565b9050919050565b5f613c7082613c55565b9050919050565b613c88613c83826132a2565b613c66565b82525050565b5f613c998284613c77565b60148201915081905092915050565b7f4e6f7420612070617274206f66205469657220330000000000000000000000005f82015250565b5f613cdc6014836131f3565b9150613ce782613ca8565b602082019050919050565b5f6020820190508181035f830152613d0981613cd0565b9050919050565b7f4578636565646564206d6178206c696d6974206f6620616c6c6f77656420746f5f8201527f6b656e206d696e74730000000000000000000000000000000000000000000000602082015250565b5f613d6a6029836131f3565b9150613d7582613d10565b604082019050919050565b5f6020820190508181035f830152613d9781613d5e565b9050919050565b5f613da882612f1a565b9150613db383612f1a565b9250828201905080821115613dcb57613dca613b4a565b5b92915050565b7f4d6178206e756d626572206f66206d696e7473207065722061646472657373205f8201527f7265616368656400000000000000000000000000000000000000000000000000602082015250565b5f613e2b6027836131f3565b9150613e3682613dd1565b604082019050919050565b5f6020820190508181035f830152613e5881613e1f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e6f7420612070617274206f66205469657220310000000000000000000000005f82015250565b5f613ec06014836131f3565b9150613ecb82613e8c565b602082019050919050565b5f6020820190508181035f830152613eed81613eb4565b9050919050565b5f81905092915050565b5f613f08826131e9565b613f128185613ef4565b9350613f22818560208601613203565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f613f62600583613ef4565b9150613f6d82613f2e565b600582019050919050565b5f613f838285613efe565b9150613f8f8284613efe565b9150613f9a82613f56565b91508190509392505050565b7f4e6f7420612070617274206f66205469657220300000000000000000000000005f82015250565b5f613fda6014836131f3565b9150613fe582613fa6565b602082019050919050565b5f6020820190508181035f83015261400781613fce565b9050919050565b5f61401882612f1a565b915061402383612f1a565b925082820390508181111561403b5761403a613b4a565b5b92915050565b5f819050919050565b61405b61405682612f1a565b614041565b82525050565b5f61406c828661404a565b60208201915061407c828561404a565b60208201915061408c8284613c77565b601482019150819050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6140d482612f1a565b91506140df83612f1a565b9250826140ef576140ee61409d565b5b828206905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f61411e826140fa565b6141288185614104565b9350614138818560208601613203565b61414181612f55565b840191505092915050565b5f60808201905061415f5f8301876132b3565b61416c60208301866132b3565b61417960408301856131c1565b818103606083015261418b8184614114565b905095945050505050565b5f815190506141a48161310e565b92915050565b5f602082840312156141bf576141be612f12565b5b5f6141cc84828501614196565b91505092915050565b7f4552433732313a20696e76616c696420746f6b656e20494400000000000000005f82015250565b5f6142096018836131f3565b9150614214826141d5565b602082019050919050565b5f6020820190508181035f830152614236816141fd565b9050919050565b5f6040820190506142505f8301856132b3565b61425d60208301846131c1565b939250505056fea2646970667358221220cdbec5e095e198ae997eec22741e44e5b758c003685f661d9176646182f76f1e64736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000084e6176795365616c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084e6176795365616c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696367636f6a776569767a69357179326437776e746977757277706a737473327669636a626965333374646f796d716a6a6c6465752f0000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): NavySeal
Arg [1] : _symbol (string): NavySeal
Arg [2] : _initBaseURI (string): ipfs://bafybeicgcojweivzi5qy2d7wntiwurwpjsts2vicjbie33tdoymqjjldeu/
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [4] : 4e6176795365616c000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 4e6176795365616c000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [8] : 697066733a2f2f626166796265696367636f6a776569767a6935717932643777
Arg [9] : 6e746977757277706a737473327669636a626965333374646f796d716a6a6c64
Arg [10] : 65752f0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
67632:10382:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70872:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47739:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76497:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48570:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49742:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49561:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77286:204;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50411:588;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72365:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74739:664;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72037:89;;;;;;;;;;;;;:::i;:::-;;67920:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51070:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76913:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71712:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48383:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48108:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66665:103;;;;;;;;;;;;;:::i;:::-;;75411:901;;;;;;;;;;;;;:::i;:::-;;65990:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48730:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71824:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77154:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77820:184;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72250:107;;;;;;;;;;;;;:::i;:::-;;49972:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76755:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73559:667;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72493:264;;;:::i;:::-;;51275:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71315:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67872:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50189:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67833:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66923:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72818:680;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70872:156;65876:13;:11;:13::i;:::-;71011:9:::1;70989:10;:19;71000:7;70989:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;70872:156:::0;;:::o;47739:305::-;47841:4;47893:25;47878:40;;;:11;:40;;;;:105;;;;47950:33;47935:48;;;:11;:48;;;;47878:105;:158;;;;48000:36;48024:11;48000:23;:36::i;:::-;47878:158;47858:178;;47739:305;;;:::o;76497:120::-;76559:7;76586:5;:11;76592:4;76586:11;;;;;;;;;;;:23;;;;;;;;;;;;76579:30;;;;76497:120;;;:::o;48570:91::-;48615:13;48648:5;48641:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48570:91;:::o;49742:158::-;49809:7;49829:22;49843:7;49829:13;:22::i;:::-;;49871:21;49884:7;49871:12;:21::i;:::-;49864:28;;49742:158;;;:::o;49561:115::-;49633:35;49642:2;49646:7;49655:12;:10;:12::i;:::-;49633:8;:35::i;:::-;49561:115;;:::o;77286:204::-;77330:7;77462:5;:8;77468:1;77462:8;;;;;;;;;;;:20;;;;;;;;;;;;77439:5;:8;77445:1;77439:8;;;;;;;;;;;:20;;;;;;;;;;;;77416:5;:8;77422:1;77416:8;;;;;;;;;;;:20;;;;;;;;;;;;77393:5;:8;77399:1;77393:8;;;;;;;;;;;:20;;;;;;;;;;;;77370:5;:8;77376:1;77370:8;;;;;;;;;;;:20;;;;;;;;;;;;:43;;;;:::i;:::-;:66;;;;:::i;:::-;:89;;;;:::i;:::-;:112;;;;:::i;:::-;77350:132;;;;77286:204;:::o;50411:588::-;50520:1;50506:16;;:2;:16;;;50502:89;;50576:1;50546:33;;;;;;;;;;;:::i;:::-;;;;;;;;50502:89;50812:21;50836:34;50844:2;50848:7;50857:12;:10;:12::i;:::-;50836:7;:34::i;:::-;50812:58;;50902:4;50885:21;;:13;:21;;;50881:111;;50951:4;50957:7;50966:13;50930:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;50881:111;50491:508;50411:588;;;:::o;72365:120::-;65876:13;:11;:13::i;:::-;72463:14:::1;72450:10;:27;;;;;;;:::i;:::-;;72365:120:::0;:::o;74739:664::-;74808:12;;;;;;;;;;;74800:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;74854:12;74869:1;74854:16;;74903:61;74911:5;74945:10;74928:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;74918:39;;;;;;74959:4;74903:7;:61::i;:::-;74881:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;75076:5;:11;75082:4;75076:11;;;;;;;;;;;:21;;;;;;;;;;;;75045:52;;75071:1;75045:5;:11;75051:4;75045:11;;;;;;;;;;;:23;;;;;;;;;;;;:27;;;;:::i;:::-;:52;;;;75023:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;75262:5;:11;75268:4;75262:11;;;;;;;;;;;:27;;;;;;;;;;;;75199:90;;75240:1;75199:20;:26;75220:4;75199:26;;;;;;;;;;;:38;75226:10;75199:38;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:90;;75177:179;;;;;;;;;;;;:::i;:::-;;;;;;;;;75368:27;75379:4;75384:10;75368;:27::i;:::-;74789:614;74739:664;:::o;72037:89::-;65876:13;:11;:13::i;:::-;72106:12:::1;;;;;;;;;;;72105:13;72090:12;;:28;;;;;;;;;;;;;;;;;;72037:89::o:0;67920:262::-;;;;;;;;;;;;;;;;;;;;:::o;51070:134::-;51157:39;51174:4;51180:2;51184:7;51157:39;;;;;;;;;;;;:16;:39::i;:::-;51070:134;;;:::o;76913:105::-;76971:4;76995:9;:15;77005:4;76995:15;;;;;;;;;;;;;;;;;;;;;;;;;76988:22;;76913:105;;;:::o;71712:104::-;65876:13;:11;:13::i;:::-;71797:11:::1;71787:7;:21;;;;;;:::i;:::-;;71712:104:::0;:::o;48383:120::-;48446:7;48473:22;48487:7;48473:13;:22::i;:::-;48466:29;;48383:120;;;:::o;48108:213::-;48171:7;48212:1;48195:19;;:5;:19;;;48191:89;;48265:1;48238:30;;;;;;;;;;;:::i;:::-;;;;;;;;48191:89;48297:9;:16;48307:5;48297:16;;;;;;;;;;;;;;;;48290:23;;48108:213;;;:::o;66665:103::-;65876:13;:11;:13::i;:::-;66730:30:::1;66757:1;66730:18;:30::i;:::-;66665:103::o:0;75411:901::-;75459:18;;;;;;;;;;;75451:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;75511:12;75526:27;75542:10;75526:15;:27::i;:::-;75511:42;;75598:5;:11;75604:4;75598:11;;;;;;;;;;;:21;;;;;;;;;;;;75568:51;;75594:1;75568:5;:11;75574:4;75568:11;;;;;;;;;;;:23;;;;;;;;;;;;:27;;;;:::i;:::-;:51;;;75564:118;;;75643:27;75659:10;75643:15;:27::i;:::-;75636:34;;75564:118;75743:5;:11;75749:4;75743:11;;;;;;;;;;;:21;;;;;;;;;;;;75714:50;;75738:1;75714:5;:11;75720:4;75714:11;;;;;;;;;;;:23;;;;;;;;;;;;:25;;;;:::i;:::-;:50;;;;75692:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;75898:1;75866:19;:31;75886:10;75866:31;;;;;;;;;;;;;;;;:33;75844:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;76073:1;76026:19;:31;76046:10;76026:31;;;;;;;;;;;;;;;;:48;;;;:::i;:::-;75979:19;:31;75999:10;75979:31;;;;;;;;;;;;;;;:95;;;;76085:21;76109:5;:11;76115:4;76109:11;;;;;;;;;;;:23;;;;;;;;;;;;76085:47;;76186:1;76169:14;:18;;;;:::i;:::-;76143:5;:11;76149:4;76143:11;;;;;;;;;;;:23;;;:44;;;;;;;;;;;;;;;;;;76222:4;76198:9;:21;76208:10;76198:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;76237:67;76247:10;76302:1;76275:5;:11;76281:4;76275:11;;;;;;;;;;;:25;;;;;;;;;;;;76259:14;:41;;;;:::i;:::-;:44;;;;:::i;:::-;76237:67;;:9;:67::i;:::-;75440:872;;75411:901::o;65990:87::-;66036:7;66063:6;;;;;;;;;;;66056:13;;65990:87;:::o;48730:95::-;48777:13;48810:7;48803:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48730:95;:::o;71824:205::-;71948:4;71972:49;71991:5;71998:10;72009:4;71998:16;;;;;;;:::i;:::-;;;;72016:4;71972:18;:49::i;:::-;71965:56;;71824:205;;;;;:::o;77154:124::-;77218:7;77245:5;:11;77251:4;77245:11;;;;;;;;;;;:25;;;;;;;;;;;;77238:32;;;;77154:124;;;:::o;77820:184::-;77869:7;77978:5;:8;77984:1;77978:8;;;;;;;;;;;:18;;;;;;;;;;;;77957:5;:8;77963:1;77957:8;;;;;;;;;;;:18;;;;;;;;;;;;77938:5;:8;77944:1;77938:8;;;;;;;;;;;:18;;;;;;;;;;;;77917:5;:8;77923:1;77917:8;;;;;;;;;;;:18;;;;;;;;;;;;77896:5;:8;77902:1;77896:8;;;;;;;;;;;:18;;;;;;;;;;;;:39;;;;:::i;:::-;:60;;;;:::i;:::-;:79;;;;:::i;:::-;:100;;;;:::i;:::-;77889:107;;;;77820:184;:::o;72250:107::-;65876:13;:11;:13::i;:::-;72331:18:::1;;;;;;;;;;;72330:19;72309:18;;:40;;;;;;;;;;;;;;;;;;72250:107::o:0;49972:146::-;50058:52;50077:12;:10;:12::i;:::-;50091:8;50101;50058:18;:52::i;:::-;49972:146;;:::o;76755:116::-;76815:7;76842:5;:11;76848:4;76842:11;;;;;;;;;;;:21;;;;;;;;;;;;76835:28;;;;76755:116;;;:::o;73559:667::-;73628:12;;;;;;;;;;;73620:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;73674:12;73689:1;73674:16;;73723:61;73731:5;73765:10;73748:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;73738:39;;;;;;73779:4;73723:7;:61::i;:::-;73701:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;73896:5;:11;73902:4;73896:11;;;;;;;;;;;:21;;;;;;;;;;;;73865:52;;73891:1;73865:5;:11;73871:4;73865:11;;;;;;;;;;;:23;;;;;;;;;;;;:27;;;;:::i;:::-;:52;;;;73843:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;74082:5;:11;74088:4;74082:11;;;;;;;;;;;:27;;;;;;;;;;;;74019:90;;74060:1;74019:20;:26;74040:4;74019:26;;;;;;;;;;;:38;74046:10;74019:38;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:90;;73997:179;;;;;;;;;;;;:::i;:::-;;;;;;;;;74189:27;74200:4;74205:10;74189;:27::i;:::-;73609:617;73559:667;:::o;72493:264::-;65876:13;:11;:13::i;:::-;72550:9:::1;72562:1;72550:13;;72627:5;:11;72633:4;72627:11;;;;;;;;;;;:21;;;;;;;;;;;;72596:52;;72622:1;72596:5;:11;72602:4;72596:11;;;;;;;;;;;:23;;;;;;;;;;;;:27;;;;:::i;:::-;:52;;;;72574:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;72728:27;72739:4;72744:10;72728;:27::i;:::-;72539:218;72493:264::o:0;51275:211::-;51389:31;51402:4;51408:2;51412:7;51389:12;:31::i;:::-;51431:47;51454:4;51460:2;51464:7;51473:4;51431:22;:47::i;:::-;51275:211;;;;:::o;71315:389::-;71433:13;71464:23;71479:7;71464:14;:23::i;:::-;71500:22;71525:10;:8;:10::i;:::-;71500:35;;71591:1;71572:8;71566:22;:26;:130;;;;;;;;;;;;;;;;;71636:8;71646:17;71655:7;71646:8;:17::i;:::-;71619:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71566:130;71546:150;;;71315:389;;;:::o;67872:38::-;;;;;;;;;;;;;:::o;50189:155::-;50277:4;50301:18;:25;50320:5;50301:25;;;;;;;;;;;;;;;:35;50327:8;50301:35;;;;;;;;;;;;;;;;;;;;;;;;;50294:42;;50189:155;;;;:::o;67833:32::-;;;;;;;;;;;;;:::o;66923:220::-;65876:13;:11;:13::i;:::-;67028:1:::1;67008:22;;:8;:22;;::::0;67004:93:::1;;67082:1;67054:31;;;;;;;;;;;:::i;:::-;;;;;;;;67004:93;67107:28;67126:8;67107:18;:28::i;:::-;66923:220:::0;:::o;72818:680::-;72895:12;;;;;;;;;;;72887:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;72941:12;72990:61;72998:5;73032:10;73015:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;73005:39;;;;;;73046:4;72990:7;:61::i;:::-;72968:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;73163:5;:11;73169:4;73163:11;;;;;;;;;;;:21;;;;;;;;;;;;73132:52;;73158:1;73132:5;:11;73138:4;73132:11;;;;;;;;;;;:23;;;;;;;;;;;;:27;;;;:::i;:::-;:52;;;;73110:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;73349:5;:11;73355:4;73349:11;;;;;;;;;;;:27;;;;;;;;;;;;73286:90;;73327:1;73286:20;:26;73307:4;73286:26;;;;;;;;;;;:38;73313:10;73286:38;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:90;;73264:179;;;;;;;;;;;;:::i;:::-;;;;;;;;;73461:27;73472:4;73477:10;73461;:27::i;:::-;72876:622;72818:680;:::o;66155:166::-;66226:12;:10;:12::i;:::-;66215:23;;:7;:5;:7::i;:::-;:23;;;66211:103;;66289:12;:10;:12::i;:::-;66262:40;;;;;;;;;;;:::i;:::-;;;;;;;;66211:103;66155:166::o;39571:148::-;39647:4;39686:25;39671:40;;;:11;:40;;;;39664:47;;39571:148;;;:::o;62717:247::-;62780:7;62800:13;62816:17;62825:7;62816:8;:17::i;:::-;62800:33;;62865:1;62848:19;;:5;:19;;;62844:90;;62914:7;62891:31;;;;;;;;;;;:::i;:::-;;;;;;;;62844:90;62951:5;62944:12;;;62717:247;;;:::o;52248:129::-;52318:7;52345:15;:24;52361:7;52345:24;;;;;;;;;;;;;;;;;;;;;52338:31;;52248:129;;;:::o;46279:98::-;46332:7;46359:10;46352:17;;46279:98;:::o;60949:122::-;61030:33;61039:2;61043:7;61052:4;61058;61030:8;:33::i;:::-;60949:122;;;:::o;55210:824::-;55296:7;55316:12;55331:17;55340:7;55331:8;:17::i;:::-;55316:32;;55427:1;55411:18;;:4;:18;;;55407:88;;55446:37;55463:4;55469;55475:7;55446:16;:37::i;:::-;55407:88;55558:1;55542:18;;:4;:18;;;55538:263;;55660:48;55677:1;55681:7;55698:1;55702:5;55660:8;:48::i;:::-;55773:1;55754:9;:15;55764:4;55754:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;55538:263;55831:1;55817:16;;:2;:16;;;55813:111;;55896:1;55879:9;:13;55889:2;55879:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;55813:111;55955:2;55936:7;:16;55944:7;55936:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55994:7;55990:2;55975:27;;55984:4;55975:27;;;;;;;;;;;;56022:4;56015:11;;;55210:824;;;;;:::o;74234:444::-;74402:1;74350:20;:26;74371:4;74350:26;;;;;;;;;;;:36;74377:8;74350:36;;;;;;;;;;;;;;;;:53;;;;:::i;:::-;74298:20;:26;74319:4;74298:26;;;;;;;;;;;:36;74325:8;74298:36;;;;;;;;;;;;;;;:105;;;;74414:21;74438:5;:11;74444:4;74438:11;;;;;;;;;;;:23;;;;;;;;;;;;74414:47;;74515:1;74498:14;:18;;;;:::i;:::-;74472:5;:11;74478:4;74472:11;;;;;;;;;;;:23;;;:44;;;;;;;;;;;;;;;;;;74527:16;74546:5;:11;74552:4;74546:11;;;;;;;;;;;:25;;;;;;;;;;;;74527:44;;74606:4;74582:9;:21;74592:10;74582:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;74621:45;74631:8;74656:9;74641:14;:24;;;;:::i;:::-;74621:45;;:9;:45::i;:::-;74293:385;;74234:444;;:::o;67303:191::-;67377:16;67396:6;;;;;;;;;;;67377:25;;67422:8;67413:6;;:17;;;;;;;;;;;;;;;;;;67477:8;67446:40;;67467:8;67446:40;;;;;;;;;;;;67366:128;67303:191;:::o;77498:260::-;77560:4;77577:15;77625:1;77610:12;:16;;;;:::i;:::-;77600:27;77595:33;;77577:51;;77639:11;77725:1;77685:15;77702:10;77714:5;77668:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77658:63;;;;;;77653:69;;:73;;;;:::i;:::-;77639:87;;77744:6;77737:13;;;;77498:260;;;:::o;57068:102::-;57136:26;57146:2;57150:7;57136:26;;;;;;;;;;;;:9;:26::i;:::-;57068:102;;:::o;1336:156::-;1427:4;1480;1451:25;1464:5;1471:4;1451:12;:25::i;:::-;:33;1444:40;;1336:156;;;;;:::o;62156:318::-;62284:1;62264:22;;:8;:22;;;62260:93;;62332:8;62310:31;;;;;;;;;;;:::i;:::-;;;;;;;;62260:93;62401:8;62363:18;:25;62382:5;62363:25;;;;;;;;;;;;;;;:35;62389:8;62363:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;62447:8;62425:41;;62440:5;62425:41;;;62457:8;62425:41;;;;;;:::i;:::-;;;;;;;;62156:318;;;:::o;63514:799::-;63648:1;63631:2;:14;;;:18;63627:679;;;63686:2;63670:36;;;63707:12;:10;:12::i;:::-;63721:4;63727:7;63736:4;63670:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;63666:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64001:1;63984:6;:13;:18;63980:300;;64056:2;64034:25;;;;;;;;;;;:::i;:::-;;;;;;;;63980:300;64230:6;64224:13;64215:6;64211:2;64207:15;64200:38;63666:629;63799:41;;;63789:51;;;:6;:51;;;;63785:132;;63894:2;63872:25;;;;;;;;;;;:::i;:::-;;;;;;;;63785:132;63742:190;63627:679;63514:799;;;;:::o;71172:135::-;71254:16;71262:7;71254;:16::i;:::-;71246:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;71172:135;:::o;72134:108::-;72194:13;72223:7;72216:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72134:108;:::o;70076:718::-;70132:13;70183:14;70220:1;70200:17;70211:5;70200:10;:17::i;:::-;:21;70183:38;;70236:20;70270:6;70259:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70236:41;;70292:11;70421:6;70417:2;70413:15;70405:6;70401:28;70394:35;;70458:290;70465:4;70458:290;;;70490:5;;;;;;;;70632:10;70627:2;70620:5;70616:14;70611:32;70606:3;70598:46;70690:2;70681:11;;;;;;:::i;:::-;;;;;70724:1;70715:5;:10;70458:290;70711:21;70458:290;70769:6;70762:13;;;;;70076:718;;;:::o;52010:117::-;52076:7;52103;:16;52111:7;52103:16;;;;;;;;;;;;;;;;;;;;;52096:23;;52010:117;;;:::o;61259:678::-;61421:9;:31;;;;61450:1;61434:18;;:4;:18;;;;61421:31;61417:471;;;61469:13;61485:22;61499:7;61485:13;:22::i;:::-;61469:38;;61654:1;61638:18;;:4;:18;;;;:35;;;;;61669:4;61660:13;;:5;:13;;;;61638:35;:69;;;;;61678:29;61695:5;61702:4;61678:16;:29::i;:::-;61677:30;61638:69;61634:144;;;61757:4;61735:27;;;;;;;;;;;:::i;:::-;;;;;;;;61634:144;61798:9;61794:83;;;61853:7;61849:2;61833:28;;61842:5;61833:28;;;;;;;;;;;;61794:83;61454:434;61417:471;61927:2;61900:15;:24;61916:7;61900:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;61259:678;;;;:::o;53417:376::-;53530:38;53544:5;53551:7;53560;53530:13;:38::i;:::-;53525:261;;53606:1;53589:19;;:5;:19;;;53585:190;;53659:7;53636:31;;;;;;;;;;;:::i;:::-;;;;;;;;53585:190;53742:7;53751;53715:44;;;;;;;;;;;;:::i;:::-;;;;;;;;53525:261;53417:376;;;:::o;57397:185::-;57492:18;57498:2;57502:7;57492:5;:18::i;:::-;57521:53;57552:1;57556:2;57560:7;57569:4;57521:22;:53::i;:::-;57397:185;;;:::o;2055:296::-;2138:7;2158:20;2181:4;2158:27;;2201:9;2196:118;2220:5;:12;2216:1;:16;2196:118;;;2269:33;2279:12;2293:5;2299:1;2293:8;;;;;;;;:::i;:::-;;;;;;;;2269:9;:33::i;:::-;2254:48;;2234:3;;;;;;;2196:118;;;;2331:12;2324:19;;;2055:296;;;;:::o;71036:128::-;71101:4;71154:1;71125:31;;:17;71134:7;71125:8;:17::i;:::-;:31;;;;71118:38;;71036:128;;;:::o;30663:948::-;30716:7;30736:14;30753:1;30736:18;;30803:8;30794:5;:17;30790:106;;30841:8;30832:17;;;;;;:::i;:::-;;;;;30878:2;30868:12;;;;30790:106;30923:8;30914:5;:17;30910:106;;30961:8;30952:17;;;;;;:::i;:::-;;;;;30998:2;30988:12;;;;30910:106;31043:8;31034:5;:17;31030:106;;31081:8;31072:17;;;;;;:::i;:::-;;;;;31118:2;31108:12;;;;31030:106;31163:7;31154:5;:16;31150:103;;31200:7;31191:16;;;;;;:::i;:::-;;;;;31236:1;31226:11;;;;31150:103;31280:7;31271:5;:16;31267:103;;31317:7;31308:16;;;;;;:::i;:::-;;;;;31353:1;31343:11;;;;31267:103;31397:7;31388:5;:16;31384:103;;31434:7;31425:16;;;;;;:::i;:::-;;;;;31470:1;31460:11;;;;31384:103;31514:7;31505:5;:16;31501:68;;31552:1;31542:11;;;;31501:68;31597:6;31590:13;;;30663:948;;;:::o;52697:276::-;52800:4;52856:1;52837:21;;:7;:21;;;;:128;;;;;52885:7;52876:16;;:5;:16;;;:52;;;;52896:32;52913:5;52920:7;52896:16;:32::i;:::-;52876:52;:88;;;;52957:7;52932:32;;:21;52945:7;52932:12;:21::i;:::-;:32;;;52876:88;52837:128;52817:148;;52697:276;;;;;:::o;56370:335::-;56452:1;56438:16;;:2;:16;;;56434:89;;56508:1;56478:33;;;;;;;;;;;:::i;:::-;;;;;;;;56434:89;56533:21;56557:32;56565:2;56569:7;56586:1;56557:7;:32::i;:::-;56533:56;;56629:1;56604:27;;:13;:27;;;56600:98;;56683:1;56655:31;;;;;;;;;;;:::i;:::-;;;;;;;;56600:98;56423:282;56370:335;;:::o;9485:149::-;9548:7;9579:1;9575;:5;:51;;9606:20;9621:1;9624;9606:14;:20::i;:::-;9575:51;;;9583:20;9598:1;9601;9583:14;:20::i;:::-;9575:51;9568:58;;9485:149;;;;:::o;9759:268::-;9827:13;9934:1;9928:4;9921:15;9963:1;9957:4;9950:15;10004:4;9998;9988:21;9979:30;;9759:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:117::-;799:1;796;789:12;813:117;922:1;919;912:12;936:102;977:6;1028:2;1024:7;1019:2;1012:5;1008:14;1004:28;994:38;;936:102;;;:::o;1044:180::-;1092:77;1089:1;1082:88;1189:4;1186:1;1179:15;1213:4;1210:1;1203:15;1230:281;1313:27;1335:4;1313:27;:::i;:::-;1305:6;1301:40;1443:6;1431:10;1428:22;1407:18;1395:10;1392:34;1389:62;1386:88;;;1454:18;;:::i;:::-;1386:88;1494:10;1490:2;1483:22;1273:238;1230:281;;:::o;1517:129::-;1551:6;1578:20;;:::i;:::-;1568:30;;1607:33;1635:4;1627:6;1607:33;:::i;:::-;1517:129;;;:::o;1652:308::-;1714:4;1804:18;1796:6;1793:30;1790:56;;;1826:18;;:::i;:::-;1790:56;1864:29;1886:6;1864:29;:::i;:::-;1856:37;;1948:4;1942;1938:15;1930:23;;1652:308;;;:::o;1966:146::-;2063:6;2058:3;2053;2040:30;2104:1;2095:6;2090:3;2086:16;2079:27;1966:146;;;:::o;2118:425::-;2196:5;2221:66;2237:49;2279:6;2237:49;:::i;:::-;2221:66;:::i;:::-;2212:75;;2310:6;2303:5;2296:21;2348:4;2341:5;2337:16;2386:3;2377:6;2372:3;2368:16;2365:25;2362:112;;;2393:79;;:::i;:::-;2362:112;2483:54;2530:6;2525:3;2520;2483:54;:::i;:::-;2202:341;2118:425;;;;;:::o;2563:340::-;2619:5;2668:3;2661:4;2653:6;2649:17;2645:27;2635:122;;2676:79;;:::i;:::-;2635:122;2793:6;2780:20;2818:79;2893:3;2885:6;2878:4;2870:6;2866:17;2818:79;:::i;:::-;2809:88;;2625:278;2563:340;;;;:::o;2909:654::-;2987:6;2995;3044:2;3032:9;3023:7;3019:23;3015:32;3012:119;;;3050:79;;:::i;:::-;3012:119;3170:1;3195:53;3240:7;3231:6;3220:9;3216:22;3195:53;:::i;:::-;3185:63;;3141:117;3325:2;3314:9;3310:18;3297:32;3356:18;3348:6;3345:30;3342:117;;;3378:79;;:::i;:::-;3342:117;3483:63;3538:7;3529:6;3518:9;3514:22;3483:63;:::i;:::-;3473:73;;3268:288;2909:654;;;;;:::o;3569:149::-;3605:7;3645:66;3638:5;3634:78;3623:89;;3569:149;;;:::o;3724:120::-;3796:23;3813:5;3796:23;:::i;:::-;3789:5;3786:34;3776:62;;3834:1;3831;3824:12;3776:62;3724:120;:::o;3850:137::-;3895:5;3933:6;3920:20;3911:29;;3949:32;3975:5;3949:32;:::i;:::-;3850:137;;;;:::o;3993:327::-;4051:6;4100:2;4088:9;4079:7;4075:23;4071:32;4068:119;;;4106:79;;:::i;:::-;4068:119;4226:1;4251:52;4295:7;4286:6;4275:9;4271:22;4251:52;:::i;:::-;4241:62;;4197:116;3993:327;;;;:::o;4326:90::-;4360:7;4403:5;4396:13;4389:21;4378:32;;4326:90;;;:::o;4422:109::-;4503:21;4518:5;4503:21;:::i;:::-;4498:3;4491:34;4422:109;;:::o;4537:210::-;4624:4;4662:2;4651:9;4647:18;4639:26;;4675:65;4737:1;4726:9;4722:17;4713:6;4675:65;:::i;:::-;4537:210;;;;:::o;4753:329::-;4812:6;4861:2;4849:9;4840:7;4836:23;4832:32;4829:119;;;4867:79;;:::i;:::-;4829:119;4987:1;5012:53;5057:7;5048:6;5037:9;5033:22;5012:53;:::i;:::-;5002:63;;4958:117;4753:329;;;;:::o;5088:118::-;5175:24;5193:5;5175:24;:::i;:::-;5170:3;5163:37;5088:118;;:::o;5212:222::-;5305:4;5343:2;5332:9;5328:18;5320:26;;5356:71;5424:1;5413:9;5409:17;5400:6;5356:71;:::i;:::-;5212:222;;;;:::o;5440:99::-;5492:6;5526:5;5520:12;5510:22;;5440:99;;;:::o;5545:169::-;5629:11;5663:6;5658:3;5651:19;5703:4;5698:3;5694:14;5679:29;;5545:169;;;;:::o;5720:246::-;5801:1;5811:113;5825:6;5822:1;5819:13;5811:113;;;5910:1;5905:3;5901:11;5895:18;5891:1;5886:3;5882:11;5875:39;5847:2;5844:1;5840:10;5835:15;;5811:113;;;5958:1;5949:6;5944:3;5940:16;5933:27;5782:184;5720:246;;;:::o;5972:377::-;6060:3;6088:39;6121:5;6088:39;:::i;:::-;6143:71;6207:6;6202:3;6143:71;:::i;:::-;6136:78;;6223:65;6281:6;6276:3;6269:4;6262:5;6258:16;6223:65;:::i;:::-;6313:29;6335:6;6313:29;:::i;:::-;6308:3;6304:39;6297:46;;6064:285;5972:377;;;;:::o;6355:313::-;6468:4;6506:2;6495:9;6491:18;6483:26;;6555:9;6549:4;6545:20;6541:1;6530:9;6526:17;6519:47;6583:78;6656:4;6647:6;6583:78;:::i;:::-;6575:86;;6355:313;;;;:::o;6674:126::-;6711:7;6751:42;6744:5;6740:54;6729:65;;6674:126;;;:::o;6806:96::-;6843:7;6872:24;6890:5;6872:24;:::i;:::-;6861:35;;6806:96;;;:::o;6908:118::-;6995:24;7013:5;6995:24;:::i;:::-;6990:3;6983:37;6908:118;;:::o;7032:222::-;7125:4;7163:2;7152:9;7148:18;7140:26;;7176:71;7244:1;7233:9;7229:17;7220:6;7176:71;:::i;:::-;7032:222;;;;:::o;7260:122::-;7333:24;7351:5;7333:24;:::i;:::-;7326:5;7323:35;7313:63;;7372:1;7369;7362:12;7313:63;7260:122;:::o;7388:139::-;7434:5;7472:6;7459:20;7450:29;;7488:33;7515:5;7488:33;:::i;:::-;7388:139;;;;:::o;7533:474::-;7601:6;7609;7658:2;7646:9;7637:7;7633:23;7629:32;7626:119;;;7664:79;;:::i;:::-;7626:119;7784:1;7809:53;7854:7;7845:6;7834:9;7830:22;7809:53;:::i;:::-;7799:63;;7755:117;7911:2;7937:53;7982:7;7973:6;7962:9;7958:22;7937:53;:::i;:::-;7927:63;;7882:118;7533:474;;;;;:::o;8013:619::-;8090:6;8098;8106;8155:2;8143:9;8134:7;8130:23;8126:32;8123:119;;;8161:79;;:::i;:::-;8123:119;8281:1;8306:53;8351:7;8342:6;8331:9;8327:22;8306:53;:::i;:::-;8296:63;;8252:117;8408:2;8434:53;8479:7;8470:6;8459:9;8455:22;8434:53;:::i;:::-;8424:63;;8379:118;8536:2;8562:53;8607:7;8598:6;8587:9;8583:22;8562:53;:::i;:::-;8552:63;;8507:118;8013:619;;;;;:::o;8638:249::-;8713:4;8803:18;8795:6;8792:30;8789:56;;;8825:18;;:::i;:::-;8789:56;8875:4;8867:6;8863:17;8855:25;;8638:249;;;:::o;8893:117::-;9002:1;8999;8992:12;9016:77;9053:7;9082:5;9071:16;;9016:77;;;:::o;9099:122::-;9172:24;9190:5;9172:24;:::i;:::-;9165:5;9162:35;9152:63;;9211:1;9208;9201:12;9152:63;9099:122;:::o;9227:139::-;9273:5;9311:6;9298:20;9289:29;;9327:33;9354:5;9327:33;:::i;:::-;9227:139;;;;:::o;9390:643::-;9484:5;9509:79;9525:62;9580:6;9525:62;:::i;:::-;9509:79;:::i;:::-;9500:88;;9608:5;9661:4;9653:6;9649:17;9641:6;9637:30;9690:3;9682:6;9679:15;9676:122;;;9709:79;;:::i;:::-;9676:122;9824:6;9807:220;9841:6;9836:3;9833:15;9807:220;;;9916:3;9945:37;9978:3;9966:10;9945:37;:::i;:::-;9940:3;9933:50;10012:4;10007:3;10003:14;9996:21;;9883:144;9867:4;9862:3;9858:14;9851:21;;9807:220;;;9811:21;9490:543;;9390:643;;;;;:::o;10057:339::-;10126:5;10175:3;10168:4;10160:6;10156:17;10152:27;10142:122;;10183:79;;:::i;:::-;10142:122;10287:4;10309:81;10386:3;10378:6;10370;10309:81;:::i;:::-;10300:90;;10132:264;10057:339;;;;:::o;10402:375::-;10484:6;10533:2;10521:9;10512:7;10508:23;10504:32;10501:119;;;10539:79;;:::i;:::-;10501:119;10659:1;10684:76;10752:7;10743:6;10732:9;10728:22;10684:76;:::i;:::-;10674:86;;10630:140;10402:375;;;;:::o;10783:311::-;10860:4;10950:18;10942:6;10939:30;10936:56;;;10972:18;;:::i;:::-;10936:56;11022:4;11014:6;11010:17;11002:25;;11082:4;11076;11072:15;11064:23;;10783:311;;;:::o;11117:710::-;11213:5;11238:81;11254:64;11311:6;11254:64;:::i;:::-;11238:81;:::i;:::-;11229:90;;11339:5;11368:6;11361:5;11354:21;11402:4;11395:5;11391:16;11384:23;;11455:4;11447:6;11443:17;11435:6;11431:30;11484:3;11476:6;11473:15;11470:122;;;11503:79;;:::i;:::-;11470:122;11618:6;11601:220;11635:6;11630:3;11627:15;11601:220;;;11710:3;11739:37;11772:3;11760:10;11739:37;:::i;:::-;11734:3;11727:50;11806:4;11801:3;11797:14;11790:21;;11677:144;11661:4;11656:3;11652:14;11645:21;;11601:220;;;11605:21;11219:608;;11117:710;;;;;:::o;11850:370::-;11921:5;11970:3;11963:4;11955:6;11951:17;11947:27;11937:122;;11978:79;;:::i;:::-;11937:122;12095:6;12082:20;12120:94;12210:3;12202:6;12195:4;12187:6;12183:17;12120:94;:::i;:::-;12111:103;;11927:293;11850:370;;;;:::o;12226:539::-;12310:6;12359:2;12347:9;12338:7;12334:23;12330:32;12327:119;;;12365:79;;:::i;:::-;12327:119;12513:1;12502:9;12498:17;12485:31;12543:18;12535:6;12532:30;12529:117;;;12565:79;;:::i;:::-;12529:117;12670:78;12740:7;12731:6;12720:9;12716:22;12670:78;:::i;:::-;12660:88;;12456:302;12226:539;;;;:::o;12771:118::-;12858:24;12876:5;12858:24;:::i;:::-;12853:3;12846:37;12771:118;;:::o;12895:222::-;12988:4;13026:2;13015:9;13011:18;13003:26;;13039:71;13107:1;13096:9;13092:17;13083:6;13039:71;:::i;:::-;12895:222;;;;:::o;13123:329::-;13182:6;13231:2;13219:9;13210:7;13206:23;13202:32;13199:119;;;13237:79;;:::i;:::-;13199:119;13357:1;13382:53;13427:7;13418:6;13407:9;13403:22;13382:53;:::i;:::-;13372:63;;13328:117;13123:329;;;;:::o;13458:509::-;13527:6;13576:2;13564:9;13555:7;13551:23;13547:32;13544:119;;;13582:79;;:::i;:::-;13544:119;13730:1;13719:9;13715:17;13702:31;13760:18;13752:6;13749:30;13746:117;;;13782:79;;:::i;:::-;13746:117;13887:63;13942:7;13933:6;13922:9;13918:22;13887:63;:::i;:::-;13877:73;;13673:287;13458:509;;;;:::o;13973:829::-;14075:6;14083;14091;14140:2;14128:9;14119:7;14115:23;14111:32;14108:119;;;14146:79;;:::i;:::-;14108:119;14294:1;14283:9;14279:17;14266:31;14324:18;14316:6;14313:30;14310:117;;;14346:79;;:::i;:::-;14310:117;14451:78;14521:7;14512:6;14501:9;14497:22;14451:78;:::i;:::-;14441:88;;14237:302;14578:2;14604:53;14649:7;14640:6;14629:9;14625:22;14604:53;:::i;:::-;14594:63;;14549:118;14706:2;14732:53;14777:7;14768:6;14757:9;14753:22;14732:53;:::i;:::-;14722:63;;14677:118;13973:829;;;;;:::o;14808:116::-;14878:21;14893:5;14878:21;:::i;:::-;14871:5;14868:32;14858:60;;14914:1;14911;14904:12;14858:60;14808:116;:::o;14930:133::-;14973:5;15011:6;14998:20;14989:29;;15027:30;15051:5;15027:30;:::i;:::-;14930:133;;;;:::o;15069:468::-;15134:6;15142;15191:2;15179:9;15170:7;15166:23;15162:32;15159:119;;;15197:79;;:::i;:::-;15159:119;15317:1;15342:53;15387:7;15378:6;15367:9;15363:22;15342:53;:::i;:::-;15332:63;;15288:117;15444:2;15470:50;15512:7;15503:6;15492:9;15488:22;15470:50;:::i;:::-;15460:60;;15415:115;15069:468;;;;;:::o;15543:307::-;15604:4;15694:18;15686:6;15683:30;15680:56;;;15716:18;;:::i;:::-;15680:56;15754:29;15776:6;15754:29;:::i;:::-;15746:37;;15838:4;15832;15828:15;15820:23;;15543:307;;;:::o;15856:423::-;15933:5;15958:65;15974:48;16015:6;15974:48;:::i;:::-;15958:65;:::i;:::-;15949:74;;16046:6;16039:5;16032:21;16084:4;16077:5;16073:16;16122:3;16113:6;16108:3;16104:16;16101:25;16098:112;;;16129:79;;:::i;:::-;16098:112;16219:54;16266:6;16261:3;16256;16219:54;:::i;:::-;15939:340;15856:423;;;;;:::o;16298:338::-;16353:5;16402:3;16395:4;16387:6;16383:17;16379:27;16369:122;;16410:79;;:::i;:::-;16369:122;16527:6;16514:20;16552:78;16626:3;16618:6;16611:4;16603:6;16599:17;16552:78;:::i;:::-;16543:87;;16359:277;16298:338;;;;:::o;16642:943::-;16737:6;16745;16753;16761;16810:3;16798:9;16789:7;16785:23;16781:33;16778:120;;;16817:79;;:::i;:::-;16778:120;16937:1;16962:53;17007:7;16998:6;16987:9;16983:22;16962:53;:::i;:::-;16952:63;;16908:117;17064:2;17090:53;17135:7;17126:6;17115:9;17111:22;17090:53;:::i;:::-;17080:63;;17035:118;17192:2;17218:53;17263:7;17254:6;17243:9;17239:22;17218:53;:::i;:::-;17208:63;;17163:118;17348:2;17337:9;17333:18;17320:32;17379:18;17371:6;17368:30;17365:117;;;17401:79;;:::i;:::-;17365:117;17506:62;17560:7;17551:6;17540:9;17536:22;17506:62;:::i;:::-;17496:72;;17291:287;16642:943;;;;;;;:::o;17591:474::-;17659:6;17667;17716:2;17704:9;17695:7;17691:23;17687:32;17684:119;;;17722:79;;:::i;:::-;17684:119;17842:1;17867:53;17912:7;17903:6;17892:9;17888:22;17867:53;:::i;:::-;17857:63;;17813:117;17969:2;17995:53;18040:7;18031:6;18020:9;18016:22;17995:53;:::i;:::-;17985:63;;17940:118;17591:474;;;;;:::o;18071:180::-;18119:77;18116:1;18109:88;18216:4;18213:1;18206:15;18240:4;18237:1;18230:15;18257:320;18301:6;18338:1;18332:4;18328:12;18318:22;;18385:1;18379:4;18375:12;18406:18;18396:81;;18462:4;18454:6;18450:17;18440:27;;18396:81;18524:2;18516:6;18513:14;18493:18;18490:38;18487:84;;18543:18;;:::i;:::-;18487:84;18308:269;18257:320;;;:::o;18583:141::-;18632:4;18655:3;18647:11;;18678:3;18675:1;18668:14;18712:4;18709:1;18699:18;18691:26;;18583:141;;;:::o;18730:93::-;18767:6;18814:2;18809;18802:5;18798:14;18794:23;18784:33;;18730:93;;;:::o;18829:107::-;18873:8;18923:5;18917:4;18913:16;18892:37;;18829:107;;;;:::o;18942:393::-;19011:6;19061:1;19049:10;19045:18;19084:97;19114:66;19103:9;19084:97;:::i;:::-;19202:39;19232:8;19221:9;19202:39;:::i;:::-;19190:51;;19274:4;19270:9;19263:5;19259:21;19250:30;;19323:4;19313:8;19309:19;19302:5;19299:30;19289:40;;19018:317;;18942:393;;;;;:::o;19341:60::-;19369:3;19390:5;19383:12;;19341:60;;;:::o;19407:142::-;19457:9;19490:53;19508:34;19517:24;19535:5;19517:24;:::i;:::-;19508:34;:::i;:::-;19490:53;:::i;:::-;19477:66;;19407:142;;;:::o;19555:75::-;19598:3;19619:5;19612:12;;19555:75;;;:::o;19636:269::-;19746:39;19777:7;19746:39;:::i;:::-;19807:91;19856:41;19880:16;19856:41;:::i;:::-;19848:6;19841:4;19835:11;19807:91;:::i;:::-;19801:4;19794:105;19712:193;19636:269;;;:::o;19911:73::-;19956:3;19911:73;:::o;19990:189::-;20067:32;;:::i;:::-;20108:65;20166:6;20158;20152:4;20108:65;:::i;:::-;20043:136;19990:189;;:::o;20185:186::-;20245:120;20262:3;20255:5;20252:14;20245:120;;;20316:39;20353:1;20346:5;20316:39;:::i;:::-;20289:1;20282:5;20278:13;20269:22;;20245:120;;;20185:186;;:::o;20377:543::-;20478:2;20473:3;20470:11;20467:446;;;20512:38;20544:5;20512:38;:::i;:::-;20596:29;20614:10;20596:29;:::i;:::-;20586:8;20582:44;20779:2;20767:10;20764:18;20761:49;;;20800:8;20785:23;;20761:49;20823:80;20879:22;20897:3;20879:22;:::i;:::-;20869:8;20865:37;20852:11;20823:80;:::i;:::-;20482:431;;20467:446;20377:543;;;:::o;20926:117::-;20980:8;21030:5;21024:4;21020:16;20999:37;;20926:117;;;;:::o;21049:169::-;21093:6;21126:51;21174:1;21170:6;21162:5;21159:1;21155:13;21126:51;:::i;:::-;21122:56;21207:4;21201;21197:15;21187:25;;21100:118;21049:169;;;;:::o;21223:295::-;21299:4;21445:29;21470:3;21464:4;21445:29;:::i;:::-;21437:37;;21507:3;21504:1;21500:11;21494:4;21491:21;21483:29;;21223:295;;;;:::o;21523:1395::-;21640:37;21673:3;21640:37;:::i;:::-;21742:18;21734:6;21731:30;21728:56;;;21764:18;;:::i;:::-;21728:56;21808:38;21840:4;21834:11;21808:38;:::i;:::-;21893:67;21953:6;21945;21939:4;21893:67;:::i;:::-;21987:1;22011:4;21998:17;;22043:2;22035:6;22032:14;22060:1;22055:618;;;;22717:1;22734:6;22731:77;;;22783:9;22778:3;22774:19;22768:26;22759:35;;22731:77;22834:67;22894:6;22887:5;22834:67;:::i;:::-;22828:4;22821:81;22690:222;22025:887;;22055:618;22107:4;22103:9;22095:6;22091:22;22141:37;22173:4;22141:37;:::i;:::-;22200:1;22214:208;22228:7;22225:1;22222:14;22214:208;;;22307:9;22302:3;22298:19;22292:26;22284:6;22277:42;22358:1;22350:6;22346:14;22336:24;;22405:2;22394:9;22390:18;22377:31;;22251:4;22248:1;22244:12;22239:17;;22214:208;;;22450:6;22441:7;22438:19;22435:179;;;22508:9;22503:3;22499:19;22493:26;22551:48;22593:4;22585:6;22581:17;22570:9;22551:48;:::i;:::-;22543:6;22536:64;22458:156;22435:179;22660:1;22656;22648:6;22644:14;22640:22;22634:4;22627:36;22062:611;;;22025:887;;21615:1303;;;21523:1395;;:::o;22924:89::-;22960:7;23000:6;22993:5;22989:18;22978:29;;22924:89;;;:::o;23019:180::-;23067:77;23064:1;23057:88;23164:4;23161:1;23154:15;23188:4;23185:1;23178:15;23205:193;23244:3;23263:19;23280:1;23263:19;:::i;:::-;23258:24;;23296:19;23313:1;23296:19;:::i;:::-;23291:24;;23338:1;23335;23331:9;23324:16;;23361:6;23356:3;23353:15;23350:41;;;23371:18;;:::i;:::-;23350:41;23205:193;;;;:::o;23404:442::-;23553:4;23591:2;23580:9;23576:18;23568:26;;23604:71;23672:1;23661:9;23657:17;23648:6;23604:71;:::i;:::-;23685:72;23753:2;23742:9;23738:18;23729:6;23685:72;:::i;:::-;23767;23835:2;23824:9;23820:18;23811:6;23767:72;:::i;:::-;23404:442;;;;;;:::o;23852:168::-;23992:20;23988:1;23980:6;23976:14;23969:44;23852:168;:::o;24026:366::-;24168:3;24189:67;24253:2;24248:3;24189:67;:::i;:::-;24182:74;;24265:93;24354:3;24265:93;:::i;:::-;24383:2;24378:3;24374:12;24367:19;;24026:366;;;:::o;24398:419::-;24564:4;24602:2;24591:9;24587:18;24579:26;;24651:9;24645:4;24641:20;24637:1;24626:9;24622:17;24615:47;24679:131;24805:4;24679:131;:::i;:::-;24671:139;;24398:419;;;:::o;24823:94::-;24856:8;24904:5;24900:2;24896:14;24875:35;;24823:94;;;:::o;24923:::-;24962:7;24991:20;25005:5;24991:20;:::i;:::-;24980:31;;24923:94;;;:::o;25023:100::-;25062:7;25091:26;25111:5;25091:26;:::i;:::-;25080:37;;25023:100;;;:::o;25129:157::-;25234:45;25254:24;25272:5;25254:24;:::i;:::-;25234:45;:::i;:::-;25229:3;25222:58;25129:157;;:::o;25292:256::-;25404:3;25419:75;25490:3;25481:6;25419:75;:::i;:::-;25519:2;25514:3;25510:12;25503:19;;25539:3;25532:10;;25292:256;;;;:::o;25554:170::-;25694:22;25690:1;25682:6;25678:14;25671:46;25554:170;:::o;25730:366::-;25872:3;25893:67;25957:2;25952:3;25893:67;:::i;:::-;25886:74;;25969:93;26058:3;25969:93;:::i;:::-;26087:2;26082:3;26078:12;26071:19;;25730:366;;;:::o;26102:419::-;26268:4;26306:2;26295:9;26291:18;26283:26;;26355:9;26349:4;26345:20;26341:1;26330:9;26326:17;26319:47;26383:131;26509:4;26383:131;:::i;:::-;26375:139;;26102:419;;;:::o;26527:228::-;26667:34;26663:1;26655:6;26651:14;26644:58;26736:11;26731:2;26723:6;26719:15;26712:36;26527:228;:::o;26761:366::-;26903:3;26924:67;26988:2;26983:3;26924:67;:::i;:::-;26917:74;;27000:93;27089:3;27000:93;:::i;:::-;27118:2;27113:3;27109:12;27102:19;;26761:366;;;:::o;27133:419::-;27299:4;27337:2;27326:9;27322:18;27314:26;;27386:9;27380:4;27376:20;27372:1;27361:9;27357:17;27350:47;27414:131;27540:4;27414:131;:::i;:::-;27406:139;;27133:419;;;:::o;27558:191::-;27598:3;27617:20;27635:1;27617:20;:::i;:::-;27612:25;;27651:20;27669:1;27651:20;:::i;:::-;27646:25;;27694:1;27691;27687:9;27680:16;;27715:3;27712:1;27709:10;27706:36;;;27722:18;;:::i;:::-;27706:36;27558:191;;;;:::o;27755:226::-;27895:34;27891:1;27883:6;27879:14;27872:58;27964:9;27959:2;27951:6;27947:15;27940:34;27755:226;:::o;27987:366::-;28129:3;28150:67;28214:2;28209:3;28150:67;:::i;:::-;28143:74;;28226:93;28315:3;28226:93;:::i;:::-;28344:2;28339:3;28335:12;28328:19;;27987:366;;;:::o;28359:419::-;28525:4;28563:2;28552:9;28548:18;28540:26;;28612:9;28606:4;28602:20;28598:1;28587:9;28583:17;28576:47;28640:131;28766:4;28640:131;:::i;:::-;28632:139;;28359:419;;;:::o;28784:180::-;28832:77;28829:1;28822:88;28929:4;28926:1;28919:15;28953:4;28950:1;28943:15;28970:170;29110:22;29106:1;29098:6;29094:14;29087:46;28970:170;:::o;29146:366::-;29288:3;29309:67;29373:2;29368:3;29309:67;:::i;:::-;29302:74;;29385:93;29474:3;29385:93;:::i;:::-;29503:2;29498:3;29494:12;29487:19;;29146:366;;;:::o;29518:419::-;29684:4;29722:2;29711:9;29707:18;29699:26;;29771:9;29765:4;29761:20;29757:1;29746:9;29742:17;29735:47;29799:131;29925:4;29799:131;:::i;:::-;29791:139;;29518:419;;;:::o;29943:148::-;30045:11;30082:3;30067:18;;29943:148;;;;:::o;30097:390::-;30203:3;30231:39;30264:5;30231:39;:::i;:::-;30286:89;30368:6;30363:3;30286:89;:::i;:::-;30279:96;;30384:65;30442:6;30437:3;30430:4;30423:5;30419:16;30384:65;:::i;:::-;30474:6;30469:3;30465:16;30458:23;;30207:280;30097:390;;;;:::o;30493:155::-;30633:7;30629:1;30621:6;30617:14;30610:31;30493:155;:::o;30654:400::-;30814:3;30835:84;30917:1;30912:3;30835:84;:::i;:::-;30828:91;;30928:93;31017:3;30928:93;:::i;:::-;31046:1;31041:3;31037:11;31030:18;;30654:400;;;:::o;31060:701::-;31341:3;31363:95;31454:3;31445:6;31363:95;:::i;:::-;31356:102;;31475:95;31566:3;31557:6;31475:95;:::i;:::-;31468:102;;31587:148;31731:3;31587:148;:::i;:::-;31580:155;;31752:3;31745:10;;31060:701;;;;;:::o;31767:170::-;31907:22;31903:1;31895:6;31891:14;31884:46;31767:170;:::o;31943:366::-;32085:3;32106:67;32170:2;32165:3;32106:67;:::i;:::-;32099:74;;32182:93;32271:3;32182:93;:::i;:::-;32300:2;32295:3;32291:12;32284:19;;31943:366;;;:::o;32315:419::-;32481:4;32519:2;32508:9;32504:18;32496:26;;32568:9;32562:4;32558:20;32554:1;32543:9;32539:17;32532:47;32596:131;32722:4;32596:131;:::i;:::-;32588:139;;32315:419;;;:::o;32740:194::-;32780:4;32800:20;32818:1;32800:20;:::i;:::-;32795:25;;32834:20;32852:1;32834:20;:::i;:::-;32829:25;;32878:1;32875;32871:9;32863:17;;32902:1;32896:4;32893:11;32890:37;;;32907:18;;:::i;:::-;32890:37;32740:194;;;;:::o;32940:79::-;32979:7;33008:5;32997:16;;32940:79;;;:::o;33025:157::-;33130:45;33150:24;33168:5;33150:24;:::i;:::-;33130:45;:::i;:::-;33125:3;33118:58;33025:157;;:::o;33188:538::-;33356:3;33371:75;33442:3;33433:6;33371:75;:::i;:::-;33471:2;33466:3;33462:12;33455:19;;33484:75;33555:3;33546:6;33484:75;:::i;:::-;33584:2;33579:3;33575:12;33568:19;;33597:75;33668:3;33659:6;33597:75;:::i;:::-;33697:2;33692:3;33688:12;33681:19;;33717:3;33710:10;;33188:538;;;;;;:::o;33732:180::-;33780:77;33777:1;33770:88;33877:4;33874:1;33867:15;33901:4;33898:1;33891:15;33918:176;33950:1;33967:20;33985:1;33967:20;:::i;:::-;33962:25;;34001:20;34019:1;34001:20;:::i;:::-;33996:25;;34040:1;34030:35;;34045:18;;:::i;:::-;34030:35;34086:1;34083;34079:9;34074:14;;33918:176;;;;:::o;34100:98::-;34151:6;34185:5;34179:12;34169:22;;34100:98;;;:::o;34204:168::-;34287:11;34321:6;34316:3;34309:19;34361:4;34356:3;34352:14;34337:29;;34204:168;;;;:::o;34378:373::-;34464:3;34492:38;34524:5;34492:38;:::i;:::-;34546:70;34609:6;34604:3;34546:70;:::i;:::-;34539:77;;34625:65;34683:6;34678:3;34671:4;34664:5;34660:16;34625:65;:::i;:::-;34715:29;34737:6;34715:29;:::i;:::-;34710:3;34706:39;34699:46;;34468:283;34378:373;;;;:::o;34757:640::-;34952:4;34990:3;34979:9;34975:19;34967:27;;35004:71;35072:1;35061:9;35057:17;35048:6;35004:71;:::i;:::-;35085:72;35153:2;35142:9;35138:18;35129:6;35085:72;:::i;:::-;35167;35235:2;35224:9;35220:18;35211:6;35167:72;:::i;:::-;35286:9;35280:4;35276:20;35271:2;35260:9;35256:18;35249:48;35314:76;35385:4;35376:6;35314:76;:::i;:::-;35306:84;;34757:640;;;;;;;:::o;35403:141::-;35459:5;35490:6;35484:13;35475:22;;35506:32;35532:5;35506:32;:::i;:::-;35403:141;;;;:::o;35550:349::-;35619:6;35668:2;35656:9;35647:7;35643:23;35639:32;35636:119;;;35674:79;;:::i;:::-;35636:119;35794:1;35819:63;35874:7;35865:6;35854:9;35850:22;35819:63;:::i;:::-;35809:73;;35765:127;35550:349;;;;:::o;35905:174::-;36045:26;36041:1;36033:6;36029:14;36022:50;35905:174;:::o;36085:366::-;36227:3;36248:67;36312:2;36307:3;36248:67;:::i;:::-;36241:74;;36324:93;36413:3;36324:93;:::i;:::-;36442:2;36437:3;36433:12;36426:19;;36085:366;;;:::o;36457:419::-;36623:4;36661:2;36650:9;36646:18;36638:26;;36710:9;36704:4;36700:20;36696:1;36685:9;36681:17;36674:47;36738:131;36864:4;36738:131;:::i;:::-;36730:139;;36457:419;;;:::o;36882:332::-;37003:4;37041:2;37030:9;37026:18;37018:26;;37054:71;37122:1;37111:9;37107:17;37098:6;37054:71;:::i;:::-;37135:72;37203:2;37192:9;37188:18;37179:6;37135:72;:::i;:::-;36882:332;;;;;:::o
Swarm Source
ipfs://cdbec5e095e198ae997eec22741e44e5b758c003685f661d9176646182f76f1e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.