ERC-721
Overview
Max Total Supply
2,500 Pocket with Love
Holders
2,054
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 Pocket with LoveLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PocketWithLove
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-10-29 */ /** *Submitted for verification at basescan.org on 2024-10-16 */ pragma solidity ^0.8.20; // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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); } // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @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); } // ERC721A Contracts v3.3.0 // Creator: Chiru Labs /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) /** * @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); } // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) /** * @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); } } } // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } contract ERC721A is Context, ERC165, IERC721A { using Address for address; using Strings for uint256; // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } library MerkleProof { /** * @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} * * _Available since v4.7._ */ 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. * * _Available since v4.4._ */ 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} * * _Available since v4.7._ */ 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. * * _Available since v4.7._ */ 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. * * _Available since v4.7._ */ 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). * * _Available since v4.7._ */ 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 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // 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) { 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. * * _Available since v4.7._ */ 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 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // 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) { unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } 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) } } } // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) // a16z Contracts v0.0.1 (ICantBeEvil.sol) interface ICantBeEvil { function getLicenseURI() external view returns (string memory); function getLicenseName() external view returns (string memory); } enum LicenseVersion { PUBLIC, EXCLUSIVE, COMMERCIAL, COMMERCIAL_NO_HATE, PERSONAL, PERSONAL_NO_HATE } contract CantBeEvil is ERC165, ICantBeEvil { using Strings for uint; string internal constant _BASE_LICENSE_URI = "ar://zmc1WTspIhFyVY82bwfAIcIExLFH5lUcHHUN0wXg4W8/"; LicenseVersion internal licenseVersion; constructor(LicenseVersion _licenseVersion) { licenseVersion = _licenseVersion; } function getLicenseURI() public view returns (string memory) { return string.concat(_BASE_LICENSE_URI, uint(licenseVersion).toString()); } function getLicenseName() public view returns (string memory) { return _getLicenseVersionKeyByValue(licenseVersion); } // conflict with ERC721A function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165) returns (bool) { return interfaceId == type(ICantBeEvil).interfaceId || super.supportsInterface(interfaceId); } function _getLicenseVersionKeyByValue(LicenseVersion _licenseVersion) internal pure returns (string memory) { require(uint8(_licenseVersion) <= 6); if (LicenseVersion.PUBLIC == _licenseVersion) return "PUBLIC"; if (LicenseVersion.EXCLUSIVE == _licenseVersion) return "EXCLUSIVE"; if (LicenseVersion.COMMERCIAL == _licenseVersion) return "COMMERCIAL"; if (LicenseVersion.COMMERCIAL_NO_HATE == _licenseVersion) return "COMMERCIAL_NO_HATE"; if (LicenseVersion.PERSONAL == _licenseVersion) return "PERSONAL"; else return "PERSONAL_NO_HATE"; } } interface IERC6551Registry { /** * @dev The registry MUST emit the ERC6551AccountCreated event upon successful account creation. */ event ERC6551AccountCreated( address account, address indexed implementation, bytes32 salt, uint256 chainId, address indexed tokenContract, uint256 indexed tokenId ); /** * @dev The registry MUST revert with AccountCreationFailed error if the create2 operation fails. */ error AccountCreationFailed(); /** * @dev Creates a token bound account for a non-fungible token. * * If account has already been created, returns the account address without calling create2. * * Emits ERC6551AccountCreated event. * * @return account The address of the token bound account */ function createAccount( address implementation, bytes32 salt, uint256 chainId, address tokenContract, uint256 tokenId ) external returns (address account); /** * @dev Returns the computed token bound account address for a non-fungible token. * * @return account The address of the token bound account */ function account( address implementation, bytes32 salt, uint256 chainId, address tokenContract, uint256 tokenId ) external view returns (address account); } interface IOperatorAccessControl { event RoleGranted( bytes32 indexed role, address indexed account, address indexed sender ); event RoleRevoked( bytes32 indexed role, address indexed account, address indexed sender ); function hasRole( bytes32 role, address account ) external view returns (bool); function isOperator(address account) external view returns (bool); function addOperator(address account) external; function revokeOperator(address account) external; } abstract contract OperatorAccessControl is IOperatorAccessControl, Ownable { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); function hasRole( bytes32 role, address account ) public view override returns (bool) { return _roles[role].members[account]; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } modifier isOperatorOrOwner() { address _sender = _msgSender(); require( isOperator(_sender) || owner() == _sender, "OperatorAccessControl: caller is not operator or owner" ); _; } modifier onlyOperator() { require( isOperator(_msgSender()), "OperatorAccessControl: caller is not operator" ); _; } function isOperator(address account) public view override returns (bool) { return hasRole(OPERATOR_ROLE, account); } function _addOperator(address account) internal virtual { _grantRole(OPERATOR_ROLE, account); } function addOperator(address account) public override onlyOperator { _grantRole(OPERATOR_ROLE, account); } function revokeOperator(address account) public override onlyOperator { _revokeRole(OPERATOR_ROLE, account); } } interface IAccountProxy { function initialize(address implementation) external; } contract PocketWithLove is ERC721A, OperatorAccessControl, ReentrancyGuard, CantBeEvil { bytes32 public _kycMintMerkleRoot; bytes32 public _preMintMerkleRoot; mapping(uint256 => uint256) private stakeStarted; mapping(uint256 => uint256) private stakeTotal; mapping(address => uint256) private addressMintCount; uint256 private _kycMintLimit = 0; uint256 private _preMintLimit = 0; uint256 private _publicMintLimit = 0; uint256 private _superMintLimit = 0; uint256 private _addressMintLimit = 0; uint256 private _kycMintCount; uint256 private _preMintCount; uint256 private _publicMintCount; uint256 private _superMintCount; uint256 private _kycMintPrice = 0; uint256 private _preMintPrice = 0; uint256 private _publicMintPrice = 0; bool private _kycMintOpen = false; bool private _preMintOpen = false; bool private _publicMintOpen = false; bool private _superMintOpen = false; uint256 _totalSupply = 2500; uint256 _totalTokens; bool private _transferOpen = false; string private _nftName = "Pocket with Love"; string private _baseUri = "https://s3.ap-southeast-1.amazonaws.com/traditionow-assets/traditionow-assets/PocketWithLove"; address erc6551RegistryAddress; address erc6551AccountProxyAddress; address erc6551ImplementationAddress; uint256 erc6551ChainId; constructor() ERC721A(_nftName, _nftName) Ownable() CantBeEvil(LicenseVersion.PUBLIC) { _addOperator(_msgSender()); } function setERC6551Config( address _erc6551RegistryAddress, address _erc6551AccountProxyAddress, address _erc6551ImplementationAddress, uint256 chainID ) public onlyOperator { erc6551RegistryAddress = _erc6551RegistryAddress; erc6551AccountProxyAddress = _erc6551AccountProxyAddress; erc6551ImplementationAddress = _erc6551ImplementationAddress; erc6551ChainId = chainID; } function createTBA(uint256 tokenId) public returns (address) { require( _ownershipOf(tokenId).addr == _msgSender(), "error:10005 Not owner" ); address tba = IERC6551Registry(erc6551RegistryAddress).createAccount( erc6551AccountProxyAddress, 0, erc6551ChainId, address(this), tokenId ); IAccountProxy(tba).initialize(erc6551ImplementationAddress); return tba; } function getMintCount() public view returns ( uint256 kycMintCount, uint256 preMintCount, uint256 publicMintCount, uint256 superMintCount ) { kycMintCount = _kycMintCount; preMintCount = _preMintCount; publicMintCount = _publicMintCount; superMintCount = _superMintCount; } function setMerkleRoot( bytes32 kycMintMerkleRoot, bytes32 preMintMerkleRoot ) public onlyOperator { _kycMintMerkleRoot = kycMintMerkleRoot; _preMintMerkleRoot = preMintMerkleRoot; } function isWhitelist( bytes32[] calldata kycMerkleProof, bytes32[] calldata preMerkleProof ) public view returns (bool isKycWhitelist, bool isPreWhitelist) { isKycWhitelist = MerkleProof.verify( kycMerkleProof, _kycMintMerkleRoot, keccak256(abi.encodePacked(msg.sender)) ); isPreWhitelist = MerkleProof.verify( preMerkleProof, _preMintMerkleRoot, keccak256(abi.encodePacked(msg.sender)) ); } function setMintLimit( uint256 kycMintLimit, uint256 preMintLimit, uint256 publicMintLimit, uint256 addressMintLimit, uint256 superMintLimit ) public onlyOperator { _kycMintLimit = kycMintLimit; _preMintLimit = preMintLimit; _publicMintLimit = publicMintLimit; _addressMintLimit = addressMintLimit; _superMintLimit = superMintLimit; } function getMintLimit() public view returns ( uint256 kycMintLimit, uint256 preMintLimit, uint256 publicMintLimit, uint256 addressMintLimit, uint256 superMintLimit ) { kycMintLimit = _kycMintLimit; preMintLimit = _preMintLimit; publicMintLimit = _publicMintLimit; addressMintLimit = _addressMintLimit; superMintLimit = _superMintLimit; } function setMintPrice( uint256 kycMintPrice, uint256 preMintPrice, uint256 publicMintPrice ) public onlyOperator { _kycMintPrice = kycMintPrice; _preMintPrice = preMintPrice; _publicMintPrice = publicMintPrice; } function getMintPrice() public view returns ( uint256 kycMintPrice, uint256 preMintPrice, uint256 publicMintPrice ) { kycMintPrice = _kycMintPrice; preMintPrice = _preMintPrice; publicMintPrice = _publicMintPrice; } function setSwith( bool kycMintOpen, bool preMintOpen, bool publicMintOpen, bool transferOpen, bool superMintOpen ) public onlyOperator { _kycMintOpen = kycMintOpen; _preMintOpen = preMintOpen; _publicMintOpen = publicMintOpen; _transferOpen = transferOpen; _superMintOpen = superMintOpen; } function getSwith() public view returns ( bool kycMintOpen, bool preMintOpen, bool publicMintOpen, bool transferOpen, bool superMintOpen ) { kycMintOpen = _kycMintOpen; preMintOpen = _preMintOpen; publicMintOpen = _publicMintOpen; transferOpen = _transferOpen; superMintOpen = _superMintOpen; } function _handleMint(address to) internal { require( addressMintCount[to] < _addressMintLimit, "error:10003 already claimed" ); require( _totalTokens < _totalSupply, "error:10010 Exceeding the total amount" ); _safeMint(to, 1); addressMintCount[to] = addressMintCount[to] + 1; _totalTokens = _totalTokens + 1; } function kycMint( bytes32[] calldata merkleProof, uint256 count ) public payable nonReentrant { require(count >= 1, "error:10010 Must be greater than 1"); require( msg.value == _kycMintPrice * count, "error:10000 msg.value is incorrect" ); require(_kycMintOpen, "error:10001 switch off"); require( MerkleProof.verify( merkleProof, _kycMintMerkleRoot, keccak256(abi.encodePacked(msg.sender)) ), "error:10002 not in the whitelist" ); for (uint256 i = 0; i < count; i++) { require( _kycMintCount < _kycMintLimit, "error:10004 Reach the limit" ); _handleMint(_msgSender()); _kycMintCount = _kycMintCount + 1; } } function preMint( bytes32[] calldata merkleProof, uint256 count ) public payable nonReentrant { require(count >= 1, "error:10010 Must be greater than 1"); require( msg.value == _preMintPrice * count, "error:10000 msg.value is incorrect" ); require(_preMintOpen, "error:10001 switch off"); require( MerkleProof.verify( merkleProof, _preMintMerkleRoot, keccak256(abi.encodePacked(msg.sender)) ), "error:10002 not in the whitelist" ); for (uint256 i = 0; i < count; i++) { require( _preMintCount < _preMintLimit, "error:10004 Reach the limit" ); _handleMint(_msgSender()); _preMintCount = _preMintCount + 1; } } function publicMint(uint256 count) public payable nonReentrant { require(count >= 1, "error:10010 Must be greater than 1"); require( msg.value == _publicMintPrice * count, "error:10000 msg.value is incorrect" ); require(_publicMintOpen, "error:10001 switch off"); for (uint256 i = 0; i < count; i++) { require( _publicMintCount < _publicMintLimit, "error:10004 Reach the limit" ); _handleMint(_msgSender()); _publicMintCount = _publicMintCount + 1; } } function operatorMint( address[] memory toAddresses, uint256[] memory amounts ) public onlyOperator { require( toAddresses.length == amounts.length, "error:10033 toAddresses length does not match amounts length" ); uint256 _len = toAddresses.length; for (uint256 _i; _i < _len; _i++) { address to = toAddresses[_i]; uint256 amount = amounts[_i]; for (uint256 j = 0; j < amount; j++) { require( _totalTokens < _totalSupply, "error:10010 Exceeding the total amount" ); _safeMint(to, 1); _totalTokens = _totalTokens + 1; } } } function getCanMintCount(address user) external view returns (uint256) { return _addressMintLimit - addressMintCount[user]; } function stakePeriod( uint256 tokenId ) external view returns (bool isStake, uint256 current, uint256 total) { uint256 start = stakeStarted[tokenId]; if (start != 0) { isStake = true; current = block.timestamp - start; } total = current + stakeTotal[tokenId]; } function getStakeTime(uint256 tokenId) public view returns (uint256) { return stakeStarted[tokenId]; } bool public stakeOpen = false; function setStakeOpen(bool open) external onlyOperator { stakeOpen = open; } event Staked(uint256 indexed tokenId, uint256 indexed time); event UnStaked(uint256 indexed tokenId, uint256 indexed time); function stake(uint256[] calldata tokenIds) external { require(stakeOpen, "error:10006 stake closed"); uint256 n = tokenIds.length; for (uint256 i = 0; i < n; ++i) { uint256 tokenId = tokenIds[i]; require( _ownershipOf(tokenId).addr == _msgSender(), "error:10005 Not owner" ); uint256 start = stakeStarted[tokenId]; if (start == 0) { stakeStarted[tokenId] = block.timestamp; emit Staked(tokenId, block.timestamp); } } } function unStake(uint256[] calldata tokenIds) external { uint256 n = tokenIds.length; for (uint256 i = 0; i < n; ++i) { uint256 tokenId = tokenIds[i]; require( _ownershipOf(tokenId).addr == _msgSender(), "error:10005 Not owner" ); uint256 start = stakeStarted[tokenId]; if (start > 0) { stakeTotal[tokenId] += block.timestamp - start; stakeStarted[tokenId] = 0; emit UnStaked(tokenId, block.timestamp); } } } function operatorUnStake( uint256[] calldata tokenIds ) external onlyOperator { uint256 n = tokenIds.length; for (uint256 i = 0; i < n; ++i) { uint256 tokenId = tokenIds[i]; uint256 start = stakeStarted[tokenId]; if (start > 0) { stakeTotal[tokenId] += block.timestamp - start; stakeStarted[tokenId] = 0; emit UnStaked(tokenId, block.timestamp); } } } uint256 private stakeTransfer = 1; function safeTransferWhileStake( address from, address to, uint256 tokenId ) external { require(ownerOf(tokenId) == _msgSender(), "error:10005 Not owner"); stakeTransfer = 2; safeTransferFrom(from, to, tokenId); stakeTransfer = 1; } function _beforeTokenTransfers( address, address, uint256 startTokenId, uint256 quantity ) internal view override { uint256 tokenId = startTokenId; for (uint256 end = tokenId + quantity; tokenId < end; ++tokenId) { require( stakeStarted[tokenId] == 0 || stakeTransfer == 2 || _transferOpen, "error:10007 Stake can't transfer" ); } } function setBaseUri(string memory baseUri) public onlyOperator { _baseUri = baseUri; } function tokenURI( uint256 tokenId ) public view override returns (string memory) { return string(abi.encodePacked(_baseUri, "/", toString(tokenId), ".json")); } function supply() public view returns (uint256) { return _totalSupply; } function totalMinted() public view returns (uint256) { return _totalTokens; } function withdraw( address[] memory tokens, address _to ) public onlyOperator { for (uint8 i; i < tokens.length; i++) { IERC20 token = IERC20(tokens[i]); uint256 b = token.balanceOf(address(this)); if (b > 0) { token.transfer(_to, b); } } uint256 balance = address(this).balance; payable(_to).transfer(balance); } function toString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } mapping(address => mapping(uint256 => uint256)) private superAddressToken; uint256 private _superMintPrice = 0; function setSuperMintPrice(uint256 superMintPrice) public onlyOperator { _superMintPrice = superMintPrice; } function getSuperMintPrice() public view returns (uint256) { return _superMintPrice; } mapping(address => uint256) private superAddress; function setSuperAddress( address contractAddress, uint256 count ) public onlyOperator { superAddress[contractAddress] = count; } function getSuperAddress( address contractAddress ) public view returns (uint256) { return superAddress[contractAddress]; } function getTokenCanMintCount( address contractAddress, uint256 tokenId ) public view returns (uint256) { if (superAddress[contractAddress] == 0) { return 0; } return superAddress[contractAddress] - superAddressToken[contractAddress][tokenId]; } function superMint( address[] memory contracts, uint256[] memory tokenIds, uint256[] memory counts ) public payable nonReentrant { require( contracts.length == tokenIds.length, "error: 10000 contracts length does not match tokenIds length" ); require( tokenIds.length == counts.length, "error: 10001 tokenIds length does not match counts length" ); require(_superMintOpen, "error:10002 switch off"); uint256 totalMintCount = 0; for (uint256 i = 0; i < tokenIds.length; i++) { totalMintCount = totalMintCount + counts[i]; } require(totalMintCount < 30, "error: 10003 Limit 30"); require( msg.value == _superMintPrice * totalMintCount, "error:10004 msg.value is incorrect" ); for (uint256 i = 0; i < tokenIds.length; i++) { address contractAddress = contracts[i]; uint256 tokenId = tokenIds[i]; uint256 mintCount = counts[i]; require( IERC721(contractAddress).ownerOf(tokenId) == msg.sender, "error:10005 No owner" ); require( superAddress[contractAddress] > 0, "error:10006 Contract cannot mint" ); require( superAddressToken[contractAddress][tokenId] + mintCount <= superAddress[contractAddress], "error:10007 Greater than maximum quantity" ); require( _totalTokens + mintCount <= _totalSupply, "error:10008 Exceeding the total amount" ); require( _superMintCount + mintCount <= _superMintLimit, "error:10009 Reach the limit" ); for (uint256 j = 0; j < mintCount; j++) { _safeMint(msg.sender, 1); } _superMintCount = _superMintCount + mintCount; _totalTokens = _totalTokens + mintCount; superAddressToken[contractAddress][tokenId] = superAddressToken[contractAddress][tokenId] + mintCount; } } function supportsInterface( bytes4 interfaceId ) public view virtual override(CantBeEvil, ERC721A) returns (bool) { return super.supportsInterface(interfaceId); } function batchTransfer( address to, uint256[] memory tokenIds ) public virtual { for (uint256 i = 0; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; transferFrom(msg.sender, to, tokenId); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"time","type":"uint256"}],"name":"UnStaked","type":"event"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_kycMintMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_preMintMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addOperator","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"createTBA","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"getCanMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLicenseName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLicenseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintCount","outputs":[{"internalType":"uint256","name":"kycMintCount","type":"uint256"},{"internalType":"uint256","name":"preMintCount","type":"uint256"},{"internalType":"uint256","name":"publicMintCount","type":"uint256"},{"internalType":"uint256","name":"superMintCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintLimit","outputs":[{"internalType":"uint256","name":"kycMintLimit","type":"uint256"},{"internalType":"uint256","name":"preMintLimit","type":"uint256"},{"internalType":"uint256","name":"publicMintLimit","type":"uint256"},{"internalType":"uint256","name":"addressMintLimit","type":"uint256"},{"internalType":"uint256","name":"superMintLimit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"kycMintPrice","type":"uint256"},{"internalType":"uint256","name":"preMintPrice","type":"uint256"},{"internalType":"uint256","name":"publicMintPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStakeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"getSuperAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSuperMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwith","outputs":[{"internalType":"bool","name":"kycMintOpen","type":"bool"},{"internalType":"bool","name":"preMintOpen","type":"bool"},{"internalType":"bool","name":"publicMintOpen","type":"bool"},{"internalType":"bool","name":"transferOpen","type":"bool"},{"internalType":"bool","name":"superMintOpen","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenCanMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","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":"address","name":"account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"kycMerkleProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"preMerkleProof","type":"bytes32[]"}],"name":"isWhitelist","outputs":[{"internalType":"bool","name":"isKycWhitelist","type":"bool"},{"internalType":"bool","name":"isPreWhitelist","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"kycMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"toAddresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"operatorMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"operatorUnStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"revokeOperator","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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferWhileStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc6551RegistryAddress","type":"address"},{"internalType":"address","name":"_erc6551AccountProxyAddress","type":"address"},{"internalType":"address","name":"_erc6551ImplementationAddress","type":"address"},{"internalType":"uint256","name":"chainID","type":"uint256"}],"name":"setERC6551Config","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"kycMintMerkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"preMintMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"kycMintLimit","type":"uint256"},{"internalType":"uint256","name":"preMintLimit","type":"uint256"},{"internalType":"uint256","name":"publicMintLimit","type":"uint256"},{"internalType":"uint256","name":"addressMintLimit","type":"uint256"},{"internalType":"uint256","name":"superMintLimit","type":"uint256"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"kycMintPrice","type":"uint256"},{"internalType":"uint256","name":"preMintPrice","type":"uint256"},{"internalType":"uint256","name":"publicMintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"open","type":"bool"}],"name":"setStakeOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setSuperAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"superMintPrice","type":"uint256"}],"name":"setSuperMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"kycMintOpen","type":"bool"},{"internalType":"bool","name":"preMintOpen","type":"bool"},{"internalType":"bool","name":"publicMintOpen","type":"bool"},{"internalType":"bool","name":"transferOpen","type":"bool"},{"internalType":"bool","name":"superMintOpen","type":"bool"}],"name":"setSwith","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakePeriod","outputs":[{"internalType":"bool","name":"isStake","type":"bool"},{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"counts","type":"uint256[]"}],"name":"superMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","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"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600060118190556012819055601381905560148190556015819055601a819055601b819055601c55601d805463ffffffff191690556109c4601e556020805460ff1916905560c0604052601060809081526f506f636b65742077697468204c6f766560801b60a05260219062000076908262000429565b506040518060800160405280605c815260200162005183605c9139602290620000a0908262000429565b506027805460ff1916905560016028556000602a55348015620000c257600080fd5b50600060218054620000d4906200039a565b80601f016020809104026020016040519081016040528092919081815260200182805462000102906200039a565b8015620001535780601f10620001275761010080835404028352916020019162000153565b820191906000526020600020905b8154815290600101906020018083116200013557829003601f168201915b50505050506021805462000167906200039a565b80601f016020809104026020016040519081016040528092919081815260200182805462000195906200039a565b8015620001e65780601f10620001ba57610100808354040283529160200191620001e6565b820191906000526020600020905b815481529060010190602001808311620001c857829003601f168201915b50505050508160029081620001fc919062000429565b5060036200020b828262000429565b505060008055506200021d336200025e565b6001600a819055600b8054839260ff1990911690836005811115620002465762000246620004f5565b021790555062000258905033620002b0565b6200050b565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002dc7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92982620002df565b50565b60008281526009602090815260408083206001600160a01b038516845290915290205460ff16620003805760008281526009602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200033f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003af57607f821691505b602082108103620003d057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200042457600081815260208120601f850160051c81016020861015620003ff5750805b601f850160051c820191505b8181101562000420578281556001016200040b565b5050505b505050565b81516001600160401b0381111562000445576200044562000384565b6200045d816200045684546200039a565b84620003d6565b602080601f8311600181146200049557600084156200047c5750858301515b600019600386901b1c1916600185901b17855562000420565b600085815260208120601f198616915b82811015620004c657888601518255948401946001909101908401620004a5565b5085821015620004e55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b614c68806200051b6000396000f3fe6080604052600436106103a25760003560e01c80638da5cb5b116101e7578063b4e78ea41161010d578063db6f2906116100a0578063f01288521161006f578063f012885214610ba3578063f2fde38b14610bb6578063f5b541a614610bd6578063fad8b32a14610c0a57600080fd5b8063db6f290614610b05578063e0e6389314610b25578063e985e9c514610b3a578063eeb86e7814610b8357600080fd5b8063c3e30196116100dc578063c3e3019614610a9d578063c7db289314610ab0578063c87b56dd14610ac5578063cf2bde3b14610ae557600080fd5b8063b4e78ea414610a06578063b824c19d14610a20578063b8323fc214610a40578063b88d4fde14610a7d57600080fd5b8063a22cb46511610185578063a89370e711610154578063a89370e714610942578063ab2cb8e9146109a6578063ac3c9952146109c6578063b10dcc93146109e657600080fd5b8063a22cb465146108c7578063a2309ff8146108e7578063a341793b146108fc578063a7f93ebd1461091157600080fd5b806395d89b41116101c157806395d89b41146108525780639870d7fe146108675780639ead7a1914610887578063a0bcfc7f146108a757600080fd5b80638da5cb5b146107b55780638fc3b549146107d357806391d148541461080c57600080fd5b80632db11544116102cc5780636352211e1161026a578063715018a611610239578063715018a61461071c57806375edcbe01461073157806381c8d149146107515780638ceb45a91461077e57600080fd5b80636352211e146106865780636d70f7ae146106a65780636dc25b93146106c657806370a08231146106fc57600080fd5b80634ad7b025116102a65780634ad7b025146105e25780634b3ed3721461060257806356bda4a2146106225780636102664a1461066657600080fd5b80632db115441461058f578063319948ba146105a257806342842e0e146105c257600080fd5b8063157620ab116103445780631d39191d116103135780631d39191d1461051957806323b872dd146105395780632a7ce051146105595780632bd19b771461056f57600080fd5b8063157620ab146104b75780631649698b146104d757806316504c0a146104ea57806318160ddd1461050057600080fd5b8063081812fc11610380578063081812fc1461041d578063095ea7b3146104555780630af2b562146104775780630fbf0a931461049757600080fd5b806301ffc9a7146103a7578063047fc9aa146103dc57806306fdde03146103fb575b600080fd5b3480156103b357600080fd5b506103c76103c2366004613fa3565b610c2a565b60405190151581526020015b60405180910390f35b3480156103e857600080fd5b50601e545b6040519081526020016103d3565b34801561040757600080fd5b50610410610c3b565b6040516103d39190614010565b34801561042957600080fd5b5061043d610438366004614023565b610ccd565b6040516001600160a01b0390911681526020016103d3565b34801561046157600080fd5b50610475610470366004614051565b610d2a565b005b34801561048357600080fd5b506103ed610492366004614051565b610de2565b3480156104a357600080fd5b506104756104b23660046140c9565b610e49565b3480156104c357600080fd5b506104756104d23660046141ea565b610fa0565b6104756104e536600461423c565b611195565b3480156104f657600080fd5b506103ed600c5481565b34801561050c57600080fd5b50600154600054036103ed565b34801561052557600080fd5b50610475610534366004614288565b611409565b34801561054557600080fd5b506104756105543660046142c3565b611479565b34801561056557600080fd5b506103ed600d5481565b34801561057b57600080fd5b5061047561058a366004614304565b611484565b61047561059d366004614023565b61152c565b3480156105ae57600080fd5b506104756105bd366004614355565b6116e7565b3480156105ce57600080fd5b506104756105dd3660046142c3565b61174e565b3480156105ee57600080fd5b506104756105fd366004614051565b611769565b34801561060e57600080fd5b5061047561061d3660046140c9565b6117de565b34801561062e57600080fd5b50601154601254601354601554601454604080519586526020860194909452928401919091526060830152608082015260a0016103d3565b34801561067257600080fd5b5061047561068136600461438f565b6118f7565b34801561069257600080fd5b5061043d6106a1366004614023565b6119b5565b3480156106b257600080fd5b506103c76106c1366004614400565b6119c7565b3480156106d257600080fd5b506103ed6106e1366004614400565b6001600160a01b03166000908152602b602052604090205490565b34801561070857600080fd5b506103ed610717366004614400565b611a07565b34801561072857600080fd5b50610475611a6f565b34801561073d57600080fd5b5061047561074c36600461441d565b611a83565b34801561075d57600080fd5b506103ed61076c366004614023565b6000908152600e602052604090205490565b34801561078a57600080fd5b5061079e61079936600461443f565b611ae7565b6040805192151583529015156020830152016103d3565b3480156107c157600080fd5b506008546001600160a01b031661043d565b3480156107df57600080fd5b506016546017546018546019546040805194855260208501939093529183015260608201526080016103d3565b34801561081857600080fd5b506103c76108273660046144ab565b60009182526009602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561085e57600080fd5b50610410611bb5565b34801561087357600080fd5b50610475610882366004614400565b611bc4565b34801561089357600080fd5b506104756108a23660046142c3565b611c47565b3480156108b357600080fd5b506104756108c2366004614528565b611cb9565b3480156108d357600080fd5b506104756108e2366004614571565b611d22565b3480156108f357600080fd5b50601f546103ed565b34801561090857600080fd5b50610410611dd0565b34801561091d57600080fd5b50601a54601b54601c54604080519384526020840192909252908201526060016103d3565b34801561094e57600080fd5b50601d54602080546040805160ff80861615158252610100860481161515948201949094526201000085048416151591810191909152908216151560608201526301000000909204161515608082015260a0016103d3565b3480156109b257600080fd5b5061043d6109c1366004614023565b611de7565b3480156109d257600080fd5b506104756109e13660046145fa565b611f70565b3480156109f257600080fd5b50610475610a013660046140c9565b611fb8565b348015610a1257600080fd5b506027546103c79060ff1681565b348015610a2c57600080fd5b50610475610a3b366004614023565b6120da565b348015610a4c57600080fd5b50610a60610a5b366004614023565b612138565b6040805193151584526020840192909252908201526060016103d3565b348015610a8957600080fd5b50610475610a9836600461464a565b612184565b610475610aab36600461423c565b6121c8565b348015610abc57600080fd5b5061041061241f565b348015610ad157600080fd5b50610410610ae0366004614023565b61247f565b348015610af157600080fd5b50610475610b003660046146ca565b6124b3565b348015610b1157600080fd5b50610475610b20366004614724565b61267d565b348015610b3157600080fd5b50602a546103ed565b348015610b4657600080fd5b506103c7610b55366004614741565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b8f57600080fd5b506103ed610b9e366004614400565b6126e9565b610475610bb136600461476f565b61270f565b348015610bc257600080fd5b50610475610bd1366004614400565b612d32565b348015610be257600080fd5b506103ed7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b348015610c1657600080fd5b50610475610c25366004614400565b612dbf565b6000610c3582612e42565b92915050565b606060028054610c4a906147f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c76906147f7565b8015610cc35780601f10610c9857610100808354040283529160200191610cc3565b820191906000526020600020905b815481529060010190602001808311610ca657829003601f168201915b5050505050905090565b6000610cd882612e80565b610d0e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d35826119b5565b9050806001600160a01b0316836001600160a01b031603610d82576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614610dd257610d9c8133610b55565b610dd2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ddd838383612eab565b505050565b6001600160a01b0382166000908152602b60205260408120548103610e0957506000610c35565b6001600160a01b0383166000818152602960209081526040808320868452825280832054938352602b909152902054610e429190614847565b9392505050565b60275460ff16610ea05760405162461bcd60e51b815260206004820152601860248201527f6572726f723a3130303036207374616b6520636c6f736564000000000000000060448201526064015b60405180910390fd5b8060005b81811015610f9a576000848483818110610ec057610ec061485a565b905060200201359050610ed03390565b6001600160a01b0316610ee282612f14565b516001600160a01b031614610f315760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b6000818152600e602052604081205490819003610f87576000828152600e602052604080822042908190559051909184917f925435fa7e37e5d9555bb18ce0d62bb9627d0846942e58e5291e9a2dded462ed9190a35b505080610f9390614870565b9050610ea4565b50505050565b610fa9336119c7565b610ff95760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b60005b82518160ff16101561115c576000838260ff168151811061101f5761101f61485a565b60209081029190910101516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561108d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b19190614889565b90508015611147576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526024820183905283169063a9059cbb906044016020604051808303816000875af1158015611121573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114591906148a2565b505b50508080611154906148bf565b915050610ffc565b5060405147906001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610f9a573d6000803e3d6000fd5b61119d613049565b60018110156111f95760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303130204d7573742062652067726561746572207468616e604482015261203160f01b6064820152608401610e97565b80601a5461120791906148de565b34146112605760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303030206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b601d5460ff166112b25760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303120737769746368206f6666000000000000000000006044820152606401610e97565b61132883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c546040516bffffffffffffffffffffffff193360601b16602082015290925060340190505b604051602081830303815290604052805190602001206130a2565b6113745760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303032206e6f7420696e207468652077686974656c6973746044820152606401610e97565b60005b818110156113fe57601154601654106113d25760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303420526561636820746865206c696d697400000000006044820152606401610e97565b6113db336130b8565b6016546113e99060016148f5565b601655806113f681614870565b915050611377565b50610ddd6001600a55565b611412336119c7565b6114625760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b601194909455601292909255601355601555601455565b610ddd8383836131df565b61148d336119c7565b6114dd5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6023805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b0396871617909155602480548216948616949094179093556025805490931691909316179055602655565b611534613049565b60018110156115905760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303130204d7573742062652067726561746572207468616e604482015261203160f01b6064820152608401610e97565b80601c5461159e91906148de565b34146115f75760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303030206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b601d5462010000900460ff1661164f5760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303120737769746368206f6666000000000000000000006044820152606401610e97565b60005b818110156116d957601354601854106116ad5760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303420526561636820746865206c696d697400000000006044820152606401610e97565b6116b6336130b8565b6018546116c49060016148f5565b601855806116d181614870565b915050611652565b506116e46001600a55565b50565b6116f0336119c7565b6117405760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b601a92909255601b55601c55565b610ddd83838360405180602001604052806000815250612184565b611772336119c7565b6117c25760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6001600160a01b039091166000908152602b6020526040902055565b6117e7336119c7565b6118375760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b8060005b81811015610f9a5760008484838181106118575761185761485a565b602090810292909201356000818152600e9093526040909220549192505080156118e4576118858142614847565b6000838152600f6020526040812080549091906118a39084906148f5565b90915550506000828152600e602052604080822082905551429184917f69f6d6e6926b6914c628cca5ab19879a4099facaba2b44626e07d8e38ebd189b9190a35b5050806118f090614870565b905061183b565b611900336119c7565b6119505760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b601d80546020805460ff19169415159490941790935561ffff1990921694151561ff00191694909417610100931515939093029290921763ffff00001916620100009115159190910263ff000000191617630100000092151592909202919091179055565b60006119c082612f14565b5192915050565b6001600160a01b03811660009081527f84e70a45dc3cad9f831e8a7d9f4327701c9df1c790bfeaa7b6cb95e200be6733602052604081205460ff16610c35565b60006001600160a01b038216611a49576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b611a77613427565b611a816000613481565b565b611a8c336119c7565b611adc5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b600c91909155600d55565b600080611b4986868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c546040516bffffffffffffffffffffffff193360601b166020820152909250603401905061130d565b9150611baa84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d546040516bffffffffffffffffffffffff193360601b166020820152909250603401905061130d565b905094509492505050565b606060038054610c4a906147f7565b611bcd336119c7565b611c1d5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6116e47f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929826134e0565b33611c51826119b5565b6001600160a01b031614611c9f5760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b6002602855611caf83838361174e565b5050600160285550565b611cc2336119c7565b611d125760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6022611d1e828261494e565b5050565b336001600160a01b03831603611d64576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b54606090611de29060ff16613582565b905090565b600033611df383612f14565b516001600160a01b031614611e425760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b602354602480546026546040517f8a54c52f0000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152600093810184905260448101919091523060648201526084810186905291921690638a54c52f9060a4016020604051808303816000875af1158015611ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eef9190614a0e565b6025546040517fc4d66de80000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291925082169063c4d66de890602401600060405180830381600087803b158015611f5157600080fd5b505af1158015611f65573d6000803e3d6000fd5b509295945050505050565b60005b8151811015610ddd576000828281518110611f9057611f9061485a565b60200260200101519050611fa5338583611479565b5080611fb081614870565b915050611f73565b8060005b81811015610f9a576000848483818110611fd857611fd861485a565b905060200201359050611fe83390565b6001600160a01b0316611ffa82612f14565b516001600160a01b0316146120495760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b6000818152600e602052604090205480156120c7576120688142614847565b6000838152600f6020526040812080549091906120869084906148f5565b90915550506000828152600e602052604080822082905551429184917f69f6d6e6926b6914c628cca5ab19879a4099facaba2b44626e07d8e38ebd189b9190a35b5050806120d390614870565b9050611fbc565b6120e3336119c7565b6121335760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b602a55565b6000818152600e6020526040812054819081908015612162576001935061215f8142614847565b92505b6000858152600f602052604090205461217b90846148f5565b93959294505050565b61218f8484846131df565b6001600160a01b0383163b15610f9a576121ab84848484613779565b610f9a576040516368d2bf6b60e11b815260040160405180910390fd5b6121d0613049565b600181101561222c5760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303130204d7573742062652067726561746572207468616e604482015261203160f01b6064820152608401610e97565b80601b5461223a91906148de565b34146122935760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303030206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b601d54610100900460ff166122ea5760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303120737769746368206f6666000000000000000000006044820152606401610e97565b61234983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d546040516bffffffffffffffffffffffff193360601b166020820152909250603401905061130d565b6123955760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303032206e6f7420696e207468652077686974656c6973746044820152606401610e97565b60005b818110156113fe57601254601754106123f35760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303420526561636820746865206c696d697400000000006044820152606401610e97565b6123fc336130b8565b60175461240a9060016148f5565b6017558061241781614870565b915050612398565b6060604051806060016040528060318152602001614be260319139600b5461245a9060ff16600581111561245557612455614a2b565b613865565b60405160200161246b929190614a41565b604051602081830303815290604052905090565b6060602261248c83613905565b60405160200161249d929190614a70565b6040516020818303038152906040529050919050565b6124bc336119c7565b61250c5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b80518251146125835760405162461bcd60e51b815260206004820152603c60248201527f6572726f723a313030333320746f416464726573736573206c656e677468206460448201527f6f6573206e6f74206d6174636820616d6f756e7473206c656e677468000000006064820152608401610e97565b815160005b81811015610f9a5760008482815181106125a4576125a461485a565b6020026020010151905060008483815181106125c2576125c261485a565b6020026020010151905060005b8181101561266757601e54601f54106126395760405162461bcd60e51b815260206004820152602660248201527f6572726f723a313030313020457863656564696e672074686520746f74616c20604482015265185b5bdd5b9d60d21b6064820152608401610e97565b612644836001613a3a565b601f546126529060016148f5565b601f558061265f81614870565b9150506125cf565b505050808061267590614870565b915050612588565b612686336119c7565b6126d65760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6027805460ff1916911515919091179055565b6001600160a01b038116600090815260106020526040812054601554610c359190614847565b612717613049565b815183511461278e5760405162461bcd60e51b815260206004820152603c60248201527f6572726f723a20313030303020636f6e747261637473206c656e67746820646f60448201527f6573206e6f74206d6174636820746f6b656e496473206c656e677468000000006064820152608401610e97565b80518251146128055760405162461bcd60e51b815260206004820152603960248201527f6572726f723a20313030303120746f6b656e496473206c656e67746820646f6560448201527f73206e6f74206d6174636820636f756e7473206c656e677468000000000000006064820152608401610e97565b601d546301000000900460ff1661285e5760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303220737769746368206f6666000000000000000000006044820152606401610e97565b6000805b83518110156128a45782818151811061287d5761287d61485a565b60200260200101518261289091906148f5565b91508061289c81614870565b915050612862565b50601e81106128f55760405162461bcd60e51b815260206004820152601560248201527f6572726f723a203130303033204c696d697420333000000000000000000000006044820152606401610e97565b80602a5461290391906148de565b341461295c5760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303034206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b60005b8351811015612d2657600085828151811061297c5761297c61485a565b60200260200101519050600085838151811061299a5761299a61485a565b6020026020010151905060008584815181106129b8576129b861485a565b60200260200101519050336001600160a01b0316836001600160a01b0316636352211e846040518263ffffffff1660e01b81526004016129fa91815260200190565b602060405180830381865afa158015612a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3b9190614a0e565b6001600160a01b031614612a915760405162461bcd60e51b815260206004820152601460248201527f6572726f723a3130303035204e6f206f776e65720000000000000000000000006044820152606401610e97565b6001600160a01b0383166000908152602b6020526040902054612af65760405162461bcd60e51b815260206004820181905260248201527f6572726f723a313030303620436f6e74726163742063616e6e6f74206d696e746044820152606401610e97565b6001600160a01b0383166000908152602b60209081526040808320546029835281842086855290925290912054612b2e9083906148f5565b1115612ba25760405162461bcd60e51b815260206004820152602960248201527f6572726f723a31303030372047726561746572207468616e206d6178696d756d60448201527f207175616e7469747900000000000000000000000000000000000000000000006064820152608401610e97565b601e5481601f54612bb391906148f5565b1115612c105760405162461bcd60e51b815260206004820152602660248201527f6572726f723a313030303820457863656564696e672074686520746f74616c20604482015265185b5bdd5b9d60d21b6064820152608401610e97565b60145481601954612c2191906148f5565b1115612c6f5760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303920526561636820746865206c696d697400000000006044820152606401610e97565b60005b81811015612c9757612c85336001613a3a565b80612c8f81614870565b915050612c72565b5080601954612ca691906148f5565b601955601f54612cb79082906148f5565b601f556001600160a01b0383166000908152602960209081526040808320858452909152902054612ce99082906148f5565b6001600160a01b03909316600090815260296020908152604080832094835293905291909120919091555080612d1e81614870565b91505061295f565b5050610ddd6001600a55565b612d3a613427565b6001600160a01b038116612db65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610e97565b6116e481613481565b612dc8336119c7565b612e185760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6116e47f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92982613a54565b60006001600160e01b031982167f649a51a8000000000000000000000000000000000000000000000000000000001480610c355750610c3582613ad7565b6000805482108015610c35575050600090815260046020526040902054600160e01b900460ff161590565b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60408051606081018252600080825260208201819052918101919091528160005481101561301757600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906130155780516001600160a01b031615612fab579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215613010579392505050565b612fab565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600a540361309b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e97565b6002600a55565b6000826130af8584613b72565b14949350505050565b6015546001600160a01b038216600090815260106020526040902054106131215760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303320616c726561647920636c61696d656400000000006044820152606401610e97565b601e54601f54106131835760405162461bcd60e51b815260206004820152602660248201527f6572726f723a313030313020457863656564696e672074686520746f74616c20604482015265185b5bdd5b9d60d21b6064820152608401610e97565b61318e816001613a3a565b6001600160a01b0381166000908152601060205260409020546131b29060016148f5565b6001600160a01b038216600090815260106020526040902055601f546131d99060016148f5565b601f5550565b60006131ea82612f14565b9050836001600160a01b031681600001516001600160a01b03161461323b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b038616148061325957506132598533610b55565b8061327457503361326984610ccd565b6001600160a01b0316145b9050806132ad576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166132ed576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132fa8585856001613bbf565b61330660008487612eab565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166133dc5760005482146133dc578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6008546001600160a01b03163314611a815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e97565b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008281526009602090815260408083206001600160a01b038516845290915290205460ff16611d1e5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561353e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6060600682600581111561359857613598614a2b565b60ff1611156135a657600080fd5b8160058111156135b8576135b8614a2b565b6000036135f857505060408051808201909152600681527f5055424c49430000000000000000000000000000000000000000000000000000602082015290565b81600581111561360a5761360a614a2b565b60010361364a57505060408051808201909152600981527f4558434c55534956450000000000000000000000000000000000000000000000602082015290565b81600581111561365c5761365c614a2b565b60020361369c57505060408051808201909152600a81527f434f4d4d45524349414c00000000000000000000000000000000000000000000602082015290565b8160058111156136ae576136ae614a2b565b6003036136ee57505060408051808201909152601281527f434f4d4d45524349414c5f4e4f5f484154450000000000000000000000000000602082015290565b81600581111561370057613700614a2b565b60040361374057505060408051808201909152600881527f504552534f4e414c000000000000000000000000000000000000000000000000602082015290565b505060408051808201909152601081527f504552534f4e414c5f4e4f5f4841544500000000000000000000000000000000602082015290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906137ae903390899088908890600401614b4a565b6020604051808303816000875af19250505080156137e9575060408051601f3d908101601f191682019092526137e691810190614b86565b60015b613847573d808015613817576040519150601f19603f3d011682016040523d82523d6000602084013e61381c565b606091505b50805160000361383f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600061387283613c65565b600101905060008167ffffffffffffffff8111156138925761389261410b565b6040519080825280601f01601f1916602001820160405280156138bc576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846138c657509392505050565b60608160000361394857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613972578061395c81614870565b915061396b9050600a83614bb9565b915061394c565b60008167ffffffffffffffff81111561398d5761398d61410b565b6040519080825280601f01601f1916602001820160405280156139b7576020820181803683370190505b5090505b841561385d576139cc600183614847565b91506139d9600a86614bcd565b6139e49060306148f5565b60f81b8183815181106139f9576139f961485a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613a33600a86614bb9565b94506139bb565b611d1e828260405180602001604052806000815250613d47565b60008281526009602090815260408083206001600160a01b038516845290915290205460ff1615611d1e5760008281526009602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480613b3a57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610c3557507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610c35565b600081815b8451811015613bb757613ba382868381518110613b9657613b9661485a565b6020026020010151613f5e565b915080613baf81614870565b915050613b77565b509392505050565b816000613bcc83836148f5565b90505b80821015613c5d576000828152600e60205260409020541580613bf457506028546002145b80613c01575060205460ff165b613c4d5760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303037205374616b652063616e2774207472616e736665726044820152606401610e97565b613c5682614870565b9150613bcf565b505050505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613cae577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310613cda576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310613cf857662386f26fc10000830492506010015b6305f5e1008310613d10576305f5e100830492506008015b6127108310613d2457612710830492506004015b60648310613d36576064830492506002015b600a8310610c355760010192915050565b6000546001600160a01b038416613d8a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003613dc4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dd16000858386613bbf565b6001600160a01b038416600081815260056020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613f09575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4613ed26000878480600101955087613779565b613eef576040516368d2bf6b60e11b815260040160405180910390fd5b808210613e87578260005414613f0457600080fd5b613f4e565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210613f0a575b506000908155610f9a9085838684565b6000818310613f7a576000828152602084905260409020610e42565b6000838152602083905260409020610e42565b6001600160e01b0319811681146116e457600080fd5b600060208284031215613fb557600080fd5b8135610e4281613f8d565b60005b83811015613fdb578181015183820152602001613fc3565b50506000910152565b60008151808452613ffc816020860160208601613fc0565b601f01601f19169290920160200192915050565b602081526000610e426020830184613fe4565b60006020828403121561403557600080fd5b5035919050565b6001600160a01b03811681146116e457600080fd5b6000806040838503121561406457600080fd5b823561406f8161403c565b946020939093013593505050565b60008083601f84011261408f57600080fd5b50813567ffffffffffffffff8111156140a757600080fd5b6020830191508360208260051b85010111156140c257600080fd5b9250929050565b600080602083850312156140dc57600080fd5b823567ffffffffffffffff8111156140f357600080fd5b6140ff8582860161407d565b90969095509350505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561414a5761414a61410b565b604052919050565b600067ffffffffffffffff82111561416c5761416c61410b565b5060051b60200190565b600082601f83011261418757600080fd5b8135602061419c61419783614152565b614121565b82815260059290921b840181019181810190868411156141bb57600080fd5b8286015b848110156141df5780356141d28161403c565b83529183019183016141bf565b509695505050505050565b600080604083850312156141fd57600080fd5b823567ffffffffffffffff81111561421457600080fd5b61422085828601614176565b92505060208301356142318161403c565b809150509250929050565b60008060006040848603121561425157600080fd5b833567ffffffffffffffff81111561426857600080fd5b6142748682870161407d565b909790965060209590950135949350505050565b600080600080600060a086880312156142a057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806000606084860312156142d857600080fd5b83356142e38161403c565b925060208401356142f38161403c565b929592945050506040919091013590565b6000806000806080858703121561431a57600080fd5b84356143258161403c565b935060208501356143358161403c565b925060408501356143458161403c565b9396929550929360600135925050565b60008060006060848603121561436a57600080fd5b505081359360208301359350604090920135919050565b80151581146116e457600080fd5b600080600080600060a086880312156143a757600080fd5b85356143b281614381565b945060208601356143c281614381565b935060408601356143d281614381565b925060608601356143e281614381565b915060808601356143f281614381565b809150509295509295909350565b60006020828403121561441257600080fd5b8135610e428161403c565b6000806040838503121561443057600080fd5b50508035926020909101359150565b6000806000806040858703121561445557600080fd5b843567ffffffffffffffff8082111561446d57600080fd5b6144798883890161407d565b9096509450602087013591508082111561449257600080fd5b5061449f8782880161407d565b95989497509550505050565b600080604083850312156144be57600080fd5b8235915060208301356142318161403c565b600067ffffffffffffffff8311156144ea576144ea61410b565b6144fd601f8401601f1916602001614121565b905082815283838301111561451157600080fd5b828260208301376000602084830101529392505050565b60006020828403121561453a57600080fd5b813567ffffffffffffffff81111561455157600080fd5b8201601f8101841361456257600080fd5b61385d848235602084016144d0565b6000806040838503121561458457600080fd5b823561458f8161403c565b9150602083013561423181614381565b600082601f8301126145b057600080fd5b813560206145c061419783614152565b82815260059290921b840181019181810190868411156145df57600080fd5b8286015b848110156141df57803583529183019183016145e3565b6000806040838503121561460d57600080fd5b82356146188161403c565b9150602083013567ffffffffffffffff81111561463457600080fd5b6146408582860161459f565b9150509250929050565b6000806000806080858703121561466057600080fd5b843561466b8161403c565b9350602085013561467b8161403c565b925060408501359150606085013567ffffffffffffffff81111561469e57600080fd5b8501601f810187136146af57600080fd5b6146be878235602084016144d0565b91505092959194509250565b600080604083850312156146dd57600080fd5b823567ffffffffffffffff808211156146f557600080fd5b61470186838701614176565b9350602085013591508082111561471757600080fd5b506146408582860161459f565b60006020828403121561473657600080fd5b8135610e4281614381565b6000806040838503121561475457600080fd5b823561475f8161403c565b915060208301356142318161403c565b60008060006060848603121561478457600080fd5b833567ffffffffffffffff8082111561479c57600080fd5b6147a887838801614176565b945060208601359150808211156147be57600080fd5b6147ca8783880161459f565b935060408601359150808211156147e057600080fd5b506147ed8682870161459f565b9150509250925092565b600181811c9082168061480b57607f821691505b60208210810361482b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c3557610c35614831565b634e487b7160e01b600052603260045260246000fd5b60006001820161488257614882614831565b5060010190565b60006020828403121561489b57600080fd5b5051919050565b6000602082840312156148b457600080fd5b8151610e4281614381565b600060ff821660ff81036148d5576148d5614831565b60010192915050565b8082028115828204841417610c3557610c35614831565b80820180821115610c3557610c35614831565b601f821115610ddd57600081815260208120601f850160051c8101602086101561492f5750805b601f850160051c820191505b81811015613c5d5782815560010161493b565b815167ffffffffffffffff8111156149685761496861410b565b61497c8161497684546147f7565b84614908565b602080601f8311600181146149b157600084156149995750858301515b600019600386901b1c1916600185901b178555613c5d565b600085815260208120601f198616915b828110156149e0578886015182559484019460019091019084016149c1565b50858210156149fe5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215614a2057600080fd5b8151610e428161403c565b634e487b7160e01b600052602160045260246000fd5b60008351614a53818460208801613fc0565b835190830190614a67818360208801613fc0565b01949350505050565b6000808454614a7e816147f7565b60018281168015614a965760018114614aab57614ada565b60ff1984168752821515830287019450614ada565b8860005260208060002060005b85811015614ad15781548a820152908401908201614ab8565b50505082870194505b507f2f00000000000000000000000000000000000000000000000000000000000000845286519250614b128382860160208a01613fc0565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000939092019182019290925260060195945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152614b7c6080830184613fe4565b9695505050505050565b600060208284031215614b9857600080fd5b8151610e4281613f8d565b634e487b7160e01b600052601260045260246000fd5b600082614bc857614bc8614ba3565b500490565b600082614bdc57614bdc614ba3565b50069056fe61723a2f2f7a6d63315754737049684679565938326277664149634945784c4648356c55634848554e307758673457382f4f70657261746f72416363657373436f6e74726f6c3a2063616c6c6572206973a2646970667358221220cee70ac57e621b75181506f217f9b9cdcabb3bf0cbae8b9c80d270d67adf1efa64736f6c6343000814003368747470733a2f2f73332e61702d736f757468656173742d312e616d617a6f6e6177732e636f6d2f747261646974696f6e6f772d6173736574732f747261646974696f6e6f772d6173736574732f506f636b6574576974684c6f7665
Deployed Bytecode
0x6080604052600436106103a25760003560e01c80638da5cb5b116101e7578063b4e78ea41161010d578063db6f2906116100a0578063f01288521161006f578063f012885214610ba3578063f2fde38b14610bb6578063f5b541a614610bd6578063fad8b32a14610c0a57600080fd5b8063db6f290614610b05578063e0e6389314610b25578063e985e9c514610b3a578063eeb86e7814610b8357600080fd5b8063c3e30196116100dc578063c3e3019614610a9d578063c7db289314610ab0578063c87b56dd14610ac5578063cf2bde3b14610ae557600080fd5b8063b4e78ea414610a06578063b824c19d14610a20578063b8323fc214610a40578063b88d4fde14610a7d57600080fd5b8063a22cb46511610185578063a89370e711610154578063a89370e714610942578063ab2cb8e9146109a6578063ac3c9952146109c6578063b10dcc93146109e657600080fd5b8063a22cb465146108c7578063a2309ff8146108e7578063a341793b146108fc578063a7f93ebd1461091157600080fd5b806395d89b41116101c157806395d89b41146108525780639870d7fe146108675780639ead7a1914610887578063a0bcfc7f146108a757600080fd5b80638da5cb5b146107b55780638fc3b549146107d357806391d148541461080c57600080fd5b80632db11544116102cc5780636352211e1161026a578063715018a611610239578063715018a61461071c57806375edcbe01461073157806381c8d149146107515780638ceb45a91461077e57600080fd5b80636352211e146106865780636d70f7ae146106a65780636dc25b93146106c657806370a08231146106fc57600080fd5b80634ad7b025116102a65780634ad7b025146105e25780634b3ed3721461060257806356bda4a2146106225780636102664a1461066657600080fd5b80632db115441461058f578063319948ba146105a257806342842e0e146105c257600080fd5b8063157620ab116103445780631d39191d116103135780631d39191d1461051957806323b872dd146105395780632a7ce051146105595780632bd19b771461056f57600080fd5b8063157620ab146104b75780631649698b146104d757806316504c0a146104ea57806318160ddd1461050057600080fd5b8063081812fc11610380578063081812fc1461041d578063095ea7b3146104555780630af2b562146104775780630fbf0a931461049757600080fd5b806301ffc9a7146103a7578063047fc9aa146103dc57806306fdde03146103fb575b600080fd5b3480156103b357600080fd5b506103c76103c2366004613fa3565b610c2a565b60405190151581526020015b60405180910390f35b3480156103e857600080fd5b50601e545b6040519081526020016103d3565b34801561040757600080fd5b50610410610c3b565b6040516103d39190614010565b34801561042957600080fd5b5061043d610438366004614023565b610ccd565b6040516001600160a01b0390911681526020016103d3565b34801561046157600080fd5b50610475610470366004614051565b610d2a565b005b34801561048357600080fd5b506103ed610492366004614051565b610de2565b3480156104a357600080fd5b506104756104b23660046140c9565b610e49565b3480156104c357600080fd5b506104756104d23660046141ea565b610fa0565b6104756104e536600461423c565b611195565b3480156104f657600080fd5b506103ed600c5481565b34801561050c57600080fd5b50600154600054036103ed565b34801561052557600080fd5b50610475610534366004614288565b611409565b34801561054557600080fd5b506104756105543660046142c3565b611479565b34801561056557600080fd5b506103ed600d5481565b34801561057b57600080fd5b5061047561058a366004614304565b611484565b61047561059d366004614023565b61152c565b3480156105ae57600080fd5b506104756105bd366004614355565b6116e7565b3480156105ce57600080fd5b506104756105dd3660046142c3565b61174e565b3480156105ee57600080fd5b506104756105fd366004614051565b611769565b34801561060e57600080fd5b5061047561061d3660046140c9565b6117de565b34801561062e57600080fd5b50601154601254601354601554601454604080519586526020860194909452928401919091526060830152608082015260a0016103d3565b34801561067257600080fd5b5061047561068136600461438f565b6118f7565b34801561069257600080fd5b5061043d6106a1366004614023565b6119b5565b3480156106b257600080fd5b506103c76106c1366004614400565b6119c7565b3480156106d257600080fd5b506103ed6106e1366004614400565b6001600160a01b03166000908152602b602052604090205490565b34801561070857600080fd5b506103ed610717366004614400565b611a07565b34801561072857600080fd5b50610475611a6f565b34801561073d57600080fd5b5061047561074c36600461441d565b611a83565b34801561075d57600080fd5b506103ed61076c366004614023565b6000908152600e602052604090205490565b34801561078a57600080fd5b5061079e61079936600461443f565b611ae7565b6040805192151583529015156020830152016103d3565b3480156107c157600080fd5b506008546001600160a01b031661043d565b3480156107df57600080fd5b506016546017546018546019546040805194855260208501939093529183015260608201526080016103d3565b34801561081857600080fd5b506103c76108273660046144ab565b60009182526009602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561085e57600080fd5b50610410611bb5565b34801561087357600080fd5b50610475610882366004614400565b611bc4565b34801561089357600080fd5b506104756108a23660046142c3565b611c47565b3480156108b357600080fd5b506104756108c2366004614528565b611cb9565b3480156108d357600080fd5b506104756108e2366004614571565b611d22565b3480156108f357600080fd5b50601f546103ed565b34801561090857600080fd5b50610410611dd0565b34801561091d57600080fd5b50601a54601b54601c54604080519384526020840192909252908201526060016103d3565b34801561094e57600080fd5b50601d54602080546040805160ff80861615158252610100860481161515948201949094526201000085048416151591810191909152908216151560608201526301000000909204161515608082015260a0016103d3565b3480156109b257600080fd5b5061043d6109c1366004614023565b611de7565b3480156109d257600080fd5b506104756109e13660046145fa565b611f70565b3480156109f257600080fd5b50610475610a013660046140c9565b611fb8565b348015610a1257600080fd5b506027546103c79060ff1681565b348015610a2c57600080fd5b50610475610a3b366004614023565b6120da565b348015610a4c57600080fd5b50610a60610a5b366004614023565b612138565b6040805193151584526020840192909252908201526060016103d3565b348015610a8957600080fd5b50610475610a9836600461464a565b612184565b610475610aab36600461423c565b6121c8565b348015610abc57600080fd5b5061041061241f565b348015610ad157600080fd5b50610410610ae0366004614023565b61247f565b348015610af157600080fd5b50610475610b003660046146ca565b6124b3565b348015610b1157600080fd5b50610475610b20366004614724565b61267d565b348015610b3157600080fd5b50602a546103ed565b348015610b4657600080fd5b506103c7610b55366004614741565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b8f57600080fd5b506103ed610b9e366004614400565b6126e9565b610475610bb136600461476f565b61270f565b348015610bc257600080fd5b50610475610bd1366004614400565b612d32565b348015610be257600080fd5b506103ed7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b348015610c1657600080fd5b50610475610c25366004614400565b612dbf565b6000610c3582612e42565b92915050565b606060028054610c4a906147f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c76906147f7565b8015610cc35780601f10610c9857610100808354040283529160200191610cc3565b820191906000526020600020905b815481529060010190602001808311610ca657829003601f168201915b5050505050905090565b6000610cd882612e80565b610d0e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d35826119b5565b9050806001600160a01b0316836001600160a01b031603610d82576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614610dd257610d9c8133610b55565b610dd2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ddd838383612eab565b505050565b6001600160a01b0382166000908152602b60205260408120548103610e0957506000610c35565b6001600160a01b0383166000818152602960209081526040808320868452825280832054938352602b909152902054610e429190614847565b9392505050565b60275460ff16610ea05760405162461bcd60e51b815260206004820152601860248201527f6572726f723a3130303036207374616b6520636c6f736564000000000000000060448201526064015b60405180910390fd5b8060005b81811015610f9a576000848483818110610ec057610ec061485a565b905060200201359050610ed03390565b6001600160a01b0316610ee282612f14565b516001600160a01b031614610f315760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b6000818152600e602052604081205490819003610f87576000828152600e602052604080822042908190559051909184917f925435fa7e37e5d9555bb18ce0d62bb9627d0846942e58e5291e9a2dded462ed9190a35b505080610f9390614870565b9050610ea4565b50505050565b610fa9336119c7565b610ff95760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b60005b82518160ff16101561115c576000838260ff168151811061101f5761101f61485a565b60209081029190910101516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561108d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b19190614889565b90508015611147576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526024820183905283169063a9059cbb906044016020604051808303816000875af1158015611121573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114591906148a2565b505b50508080611154906148bf565b915050610ffc565b5060405147906001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610f9a573d6000803e3d6000fd5b61119d613049565b60018110156111f95760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303130204d7573742062652067726561746572207468616e604482015261203160f01b6064820152608401610e97565b80601a5461120791906148de565b34146112605760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303030206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b601d5460ff166112b25760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303120737769746368206f6666000000000000000000006044820152606401610e97565b61132883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c546040516bffffffffffffffffffffffff193360601b16602082015290925060340190505b604051602081830303815290604052805190602001206130a2565b6113745760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303032206e6f7420696e207468652077686974656c6973746044820152606401610e97565b60005b818110156113fe57601154601654106113d25760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303420526561636820746865206c696d697400000000006044820152606401610e97565b6113db336130b8565b6016546113e99060016148f5565b601655806113f681614870565b915050611377565b50610ddd6001600a55565b611412336119c7565b6114625760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b601194909455601292909255601355601555601455565b610ddd8383836131df565b61148d336119c7565b6114dd5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6023805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b0396871617909155602480548216948616949094179093556025805490931691909316179055602655565b611534613049565b60018110156115905760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303130204d7573742062652067726561746572207468616e604482015261203160f01b6064820152608401610e97565b80601c5461159e91906148de565b34146115f75760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303030206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b601d5462010000900460ff1661164f5760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303120737769746368206f6666000000000000000000006044820152606401610e97565b60005b818110156116d957601354601854106116ad5760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303420526561636820746865206c696d697400000000006044820152606401610e97565b6116b6336130b8565b6018546116c49060016148f5565b601855806116d181614870565b915050611652565b506116e46001600a55565b50565b6116f0336119c7565b6117405760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b601a92909255601b55601c55565b610ddd83838360405180602001604052806000815250612184565b611772336119c7565b6117c25760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6001600160a01b039091166000908152602b6020526040902055565b6117e7336119c7565b6118375760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b8060005b81811015610f9a5760008484838181106118575761185761485a565b602090810292909201356000818152600e9093526040909220549192505080156118e4576118858142614847565b6000838152600f6020526040812080549091906118a39084906148f5565b90915550506000828152600e602052604080822082905551429184917f69f6d6e6926b6914c628cca5ab19879a4099facaba2b44626e07d8e38ebd189b9190a35b5050806118f090614870565b905061183b565b611900336119c7565b6119505760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b601d80546020805460ff19169415159490941790935561ffff1990921694151561ff00191694909417610100931515939093029290921763ffff00001916620100009115159190910263ff000000191617630100000092151592909202919091179055565b60006119c082612f14565b5192915050565b6001600160a01b03811660009081527f84e70a45dc3cad9f831e8a7d9f4327701c9df1c790bfeaa7b6cb95e200be6733602052604081205460ff16610c35565b60006001600160a01b038216611a49576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b611a77613427565b611a816000613481565b565b611a8c336119c7565b611adc5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b600c91909155600d55565b600080611b4986868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c546040516bffffffffffffffffffffffff193360601b166020820152909250603401905061130d565b9150611baa84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d546040516bffffffffffffffffffffffff193360601b166020820152909250603401905061130d565b905094509492505050565b606060038054610c4a906147f7565b611bcd336119c7565b611c1d5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6116e47f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929826134e0565b33611c51826119b5565b6001600160a01b031614611c9f5760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b6002602855611caf83838361174e565b5050600160285550565b611cc2336119c7565b611d125760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6022611d1e828261494e565b5050565b336001600160a01b03831603611d64576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b54606090611de29060ff16613582565b905090565b600033611df383612f14565b516001600160a01b031614611e425760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b602354602480546026546040517f8a54c52f0000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152600093810184905260448101919091523060648201526084810186905291921690638a54c52f9060a4016020604051808303816000875af1158015611ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eef9190614a0e565b6025546040517fc4d66de80000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291925082169063c4d66de890602401600060405180830381600087803b158015611f5157600080fd5b505af1158015611f65573d6000803e3d6000fd5b509295945050505050565b60005b8151811015610ddd576000828281518110611f9057611f9061485a565b60200260200101519050611fa5338583611479565b5080611fb081614870565b915050611f73565b8060005b81811015610f9a576000848483818110611fd857611fd861485a565b905060200201359050611fe83390565b6001600160a01b0316611ffa82612f14565b516001600160a01b0316146120495760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b6000818152600e602052604090205480156120c7576120688142614847565b6000838152600f6020526040812080549091906120869084906148f5565b90915550506000828152600e602052604080822082905551429184917f69f6d6e6926b6914c628cca5ab19879a4099facaba2b44626e07d8e38ebd189b9190a35b5050806120d390614870565b9050611fbc565b6120e3336119c7565b6121335760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b602a55565b6000818152600e6020526040812054819081908015612162576001935061215f8142614847565b92505b6000858152600f602052604090205461217b90846148f5565b93959294505050565b61218f8484846131df565b6001600160a01b0383163b15610f9a576121ab84848484613779565b610f9a576040516368d2bf6b60e11b815260040160405180910390fd5b6121d0613049565b600181101561222c5760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303130204d7573742062652067726561746572207468616e604482015261203160f01b6064820152608401610e97565b80601b5461223a91906148de565b34146122935760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303030206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b601d54610100900460ff166122ea5760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303120737769746368206f6666000000000000000000006044820152606401610e97565b61234983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d546040516bffffffffffffffffffffffff193360601b166020820152909250603401905061130d565b6123955760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303032206e6f7420696e207468652077686974656c6973746044820152606401610e97565b60005b818110156113fe57601254601754106123f35760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303420526561636820746865206c696d697400000000006044820152606401610e97565b6123fc336130b8565b60175461240a9060016148f5565b6017558061241781614870565b915050612398565b6060604051806060016040528060318152602001614be260319139600b5461245a9060ff16600581111561245557612455614a2b565b613865565b60405160200161246b929190614a41565b604051602081830303815290604052905090565b6060602261248c83613905565b60405160200161249d929190614a70565b6040516020818303038152906040529050919050565b6124bc336119c7565b61250c5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b80518251146125835760405162461bcd60e51b815260206004820152603c60248201527f6572726f723a313030333320746f416464726573736573206c656e677468206460448201527f6f6573206e6f74206d6174636820616d6f756e7473206c656e677468000000006064820152608401610e97565b815160005b81811015610f9a5760008482815181106125a4576125a461485a565b6020026020010151905060008483815181106125c2576125c261485a565b6020026020010151905060005b8181101561266757601e54601f54106126395760405162461bcd60e51b815260206004820152602660248201527f6572726f723a313030313020457863656564696e672074686520746f74616c20604482015265185b5bdd5b9d60d21b6064820152608401610e97565b612644836001613a3a565b601f546126529060016148f5565b601f558061265f81614870565b9150506125cf565b505050808061267590614870565b915050612588565b612686336119c7565b6126d65760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6027805460ff1916911515919091179055565b6001600160a01b038116600090815260106020526040812054601554610c359190614847565b612717613049565b815183511461278e5760405162461bcd60e51b815260206004820152603c60248201527f6572726f723a20313030303020636f6e747261637473206c656e67746820646f60448201527f6573206e6f74206d6174636820746f6b656e496473206c656e677468000000006064820152608401610e97565b80518251146128055760405162461bcd60e51b815260206004820152603960248201527f6572726f723a20313030303120746f6b656e496473206c656e67746820646f6560448201527f73206e6f74206d6174636820636f756e7473206c656e677468000000000000006064820152608401610e97565b601d546301000000900460ff1661285e5760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303220737769746368206f6666000000000000000000006044820152606401610e97565b6000805b83518110156128a45782818151811061287d5761287d61485a565b60200260200101518261289091906148f5565b91508061289c81614870565b915050612862565b50601e81106128f55760405162461bcd60e51b815260206004820152601560248201527f6572726f723a203130303033204c696d697420333000000000000000000000006044820152606401610e97565b80602a5461290391906148de565b341461295c5760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303034206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b60005b8351811015612d2657600085828151811061297c5761297c61485a565b60200260200101519050600085838151811061299a5761299a61485a565b6020026020010151905060008584815181106129b8576129b861485a565b60200260200101519050336001600160a01b0316836001600160a01b0316636352211e846040518263ffffffff1660e01b81526004016129fa91815260200190565b602060405180830381865afa158015612a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3b9190614a0e565b6001600160a01b031614612a915760405162461bcd60e51b815260206004820152601460248201527f6572726f723a3130303035204e6f206f776e65720000000000000000000000006044820152606401610e97565b6001600160a01b0383166000908152602b6020526040902054612af65760405162461bcd60e51b815260206004820181905260248201527f6572726f723a313030303620436f6e74726163742063616e6e6f74206d696e746044820152606401610e97565b6001600160a01b0383166000908152602b60209081526040808320546029835281842086855290925290912054612b2e9083906148f5565b1115612ba25760405162461bcd60e51b815260206004820152602960248201527f6572726f723a31303030372047726561746572207468616e206d6178696d756d60448201527f207175616e7469747900000000000000000000000000000000000000000000006064820152608401610e97565b601e5481601f54612bb391906148f5565b1115612c105760405162461bcd60e51b815260206004820152602660248201527f6572726f723a313030303820457863656564696e672074686520746f74616c20604482015265185b5bdd5b9d60d21b6064820152608401610e97565b60145481601954612c2191906148f5565b1115612c6f5760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303920526561636820746865206c696d697400000000006044820152606401610e97565b60005b81811015612c9757612c85336001613a3a565b80612c8f81614870565b915050612c72565b5080601954612ca691906148f5565b601955601f54612cb79082906148f5565b601f556001600160a01b0383166000908152602960209081526040808320858452909152902054612ce99082906148f5565b6001600160a01b03909316600090815260296020908152604080832094835293905291909120919091555080612d1e81614870565b91505061295f565b5050610ddd6001600a55565b612d3a613427565b6001600160a01b038116612db65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610e97565b6116e481613481565b612dc8336119c7565b612e185760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6116e47f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92982613a54565b60006001600160e01b031982167f649a51a8000000000000000000000000000000000000000000000000000000001480610c355750610c3582613ad7565b6000805482108015610c35575050600090815260046020526040902054600160e01b900460ff161590565b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60408051606081018252600080825260208201819052918101919091528160005481101561301757600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906130155780516001600160a01b031615612fab579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215613010579392505050565b612fab565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600a540361309b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e97565b6002600a55565b6000826130af8584613b72565b14949350505050565b6015546001600160a01b038216600090815260106020526040902054106131215760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303320616c726561647920636c61696d656400000000006044820152606401610e97565b601e54601f54106131835760405162461bcd60e51b815260206004820152602660248201527f6572726f723a313030313020457863656564696e672074686520746f74616c20604482015265185b5bdd5b9d60d21b6064820152608401610e97565b61318e816001613a3a565b6001600160a01b0381166000908152601060205260409020546131b29060016148f5565b6001600160a01b038216600090815260106020526040902055601f546131d99060016148f5565b601f5550565b60006131ea82612f14565b9050836001600160a01b031681600001516001600160a01b03161461323b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b038616148061325957506132598533610b55565b8061327457503361326984610ccd565b6001600160a01b0316145b9050806132ad576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166132ed576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132fa8585856001613bbf565b61330660008487612eab565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166133dc5760005482146133dc578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6008546001600160a01b03163314611a815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e97565b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008281526009602090815260408083206001600160a01b038516845290915290205460ff16611d1e5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561353e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6060600682600581111561359857613598614a2b565b60ff1611156135a657600080fd5b8160058111156135b8576135b8614a2b565b6000036135f857505060408051808201909152600681527f5055424c49430000000000000000000000000000000000000000000000000000602082015290565b81600581111561360a5761360a614a2b565b60010361364a57505060408051808201909152600981527f4558434c55534956450000000000000000000000000000000000000000000000602082015290565b81600581111561365c5761365c614a2b565b60020361369c57505060408051808201909152600a81527f434f4d4d45524349414c00000000000000000000000000000000000000000000602082015290565b8160058111156136ae576136ae614a2b565b6003036136ee57505060408051808201909152601281527f434f4d4d45524349414c5f4e4f5f484154450000000000000000000000000000602082015290565b81600581111561370057613700614a2b565b60040361374057505060408051808201909152600881527f504552534f4e414c000000000000000000000000000000000000000000000000602082015290565b505060408051808201909152601081527f504552534f4e414c5f4e4f5f4841544500000000000000000000000000000000602082015290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906137ae903390899088908890600401614b4a565b6020604051808303816000875af19250505080156137e9575060408051601f3d908101601f191682019092526137e691810190614b86565b60015b613847573d808015613817576040519150601f19603f3d011682016040523d82523d6000602084013e61381c565b606091505b50805160000361383f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600061387283613c65565b600101905060008167ffffffffffffffff8111156138925761389261410b565b6040519080825280601f01601f1916602001820160405280156138bc576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846138c657509392505050565b60608160000361394857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613972578061395c81614870565b915061396b9050600a83614bb9565b915061394c565b60008167ffffffffffffffff81111561398d5761398d61410b565b6040519080825280601f01601f1916602001820160405280156139b7576020820181803683370190505b5090505b841561385d576139cc600183614847565b91506139d9600a86614bcd565b6139e49060306148f5565b60f81b8183815181106139f9576139f961485a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613a33600a86614bb9565b94506139bb565b611d1e828260405180602001604052806000815250613d47565b60008281526009602090815260408083206001600160a01b038516845290915290205460ff1615611d1e5760008281526009602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480613b3a57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610c3557507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610c35565b600081815b8451811015613bb757613ba382868381518110613b9657613b9661485a565b6020026020010151613f5e565b915080613baf81614870565b915050613b77565b509392505050565b816000613bcc83836148f5565b90505b80821015613c5d576000828152600e60205260409020541580613bf457506028546002145b80613c01575060205460ff165b613c4d5760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303037205374616b652063616e2774207472616e736665726044820152606401610e97565b613c5682614870565b9150613bcf565b505050505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613cae577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310613cda576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310613cf857662386f26fc10000830492506010015b6305f5e1008310613d10576305f5e100830492506008015b6127108310613d2457612710830492506004015b60648310613d36576064830492506002015b600a8310610c355760010192915050565b6000546001600160a01b038416613d8a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003613dc4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dd16000858386613bbf565b6001600160a01b038416600081815260056020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613f09575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4613ed26000878480600101955087613779565b613eef576040516368d2bf6b60e11b815260040160405180910390fd5b808210613e87578260005414613f0457600080fd5b613f4e565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210613f0a575b506000908155610f9a9085838684565b6000818310613f7a576000828152602084905260409020610e42565b6000838152602083905260409020610e42565b6001600160e01b0319811681146116e457600080fd5b600060208284031215613fb557600080fd5b8135610e4281613f8d565b60005b83811015613fdb578181015183820152602001613fc3565b50506000910152565b60008151808452613ffc816020860160208601613fc0565b601f01601f19169290920160200192915050565b602081526000610e426020830184613fe4565b60006020828403121561403557600080fd5b5035919050565b6001600160a01b03811681146116e457600080fd5b6000806040838503121561406457600080fd5b823561406f8161403c565b946020939093013593505050565b60008083601f84011261408f57600080fd5b50813567ffffffffffffffff8111156140a757600080fd5b6020830191508360208260051b85010111156140c257600080fd5b9250929050565b600080602083850312156140dc57600080fd5b823567ffffffffffffffff8111156140f357600080fd5b6140ff8582860161407d565b90969095509350505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561414a5761414a61410b565b604052919050565b600067ffffffffffffffff82111561416c5761416c61410b565b5060051b60200190565b600082601f83011261418757600080fd5b8135602061419c61419783614152565b614121565b82815260059290921b840181019181810190868411156141bb57600080fd5b8286015b848110156141df5780356141d28161403c565b83529183019183016141bf565b509695505050505050565b600080604083850312156141fd57600080fd5b823567ffffffffffffffff81111561421457600080fd5b61422085828601614176565b92505060208301356142318161403c565b809150509250929050565b60008060006040848603121561425157600080fd5b833567ffffffffffffffff81111561426857600080fd5b6142748682870161407d565b909790965060209590950135949350505050565b600080600080600060a086880312156142a057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806000606084860312156142d857600080fd5b83356142e38161403c565b925060208401356142f38161403c565b929592945050506040919091013590565b6000806000806080858703121561431a57600080fd5b84356143258161403c565b935060208501356143358161403c565b925060408501356143458161403c565b9396929550929360600135925050565b60008060006060848603121561436a57600080fd5b505081359360208301359350604090920135919050565b80151581146116e457600080fd5b600080600080600060a086880312156143a757600080fd5b85356143b281614381565b945060208601356143c281614381565b935060408601356143d281614381565b925060608601356143e281614381565b915060808601356143f281614381565b809150509295509295909350565b60006020828403121561441257600080fd5b8135610e428161403c565b6000806040838503121561443057600080fd5b50508035926020909101359150565b6000806000806040858703121561445557600080fd5b843567ffffffffffffffff8082111561446d57600080fd5b6144798883890161407d565b9096509450602087013591508082111561449257600080fd5b5061449f8782880161407d565b95989497509550505050565b600080604083850312156144be57600080fd5b8235915060208301356142318161403c565b600067ffffffffffffffff8311156144ea576144ea61410b565b6144fd601f8401601f1916602001614121565b905082815283838301111561451157600080fd5b828260208301376000602084830101529392505050565b60006020828403121561453a57600080fd5b813567ffffffffffffffff81111561455157600080fd5b8201601f8101841361456257600080fd5b61385d848235602084016144d0565b6000806040838503121561458457600080fd5b823561458f8161403c565b9150602083013561423181614381565b600082601f8301126145b057600080fd5b813560206145c061419783614152565b82815260059290921b840181019181810190868411156145df57600080fd5b8286015b848110156141df57803583529183019183016145e3565b6000806040838503121561460d57600080fd5b82356146188161403c565b9150602083013567ffffffffffffffff81111561463457600080fd5b6146408582860161459f565b9150509250929050565b6000806000806080858703121561466057600080fd5b843561466b8161403c565b9350602085013561467b8161403c565b925060408501359150606085013567ffffffffffffffff81111561469e57600080fd5b8501601f810187136146af57600080fd5b6146be878235602084016144d0565b91505092959194509250565b600080604083850312156146dd57600080fd5b823567ffffffffffffffff808211156146f557600080fd5b61470186838701614176565b9350602085013591508082111561471757600080fd5b506146408582860161459f565b60006020828403121561473657600080fd5b8135610e4281614381565b6000806040838503121561475457600080fd5b823561475f8161403c565b915060208301356142318161403c565b60008060006060848603121561478457600080fd5b833567ffffffffffffffff8082111561479c57600080fd5b6147a887838801614176565b945060208601359150808211156147be57600080fd5b6147ca8783880161459f565b935060408601359150808211156147e057600080fd5b506147ed8682870161459f565b9150509250925092565b600181811c9082168061480b57607f821691505b60208210810361482b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c3557610c35614831565b634e487b7160e01b600052603260045260246000fd5b60006001820161488257614882614831565b5060010190565b60006020828403121561489b57600080fd5b5051919050565b6000602082840312156148b457600080fd5b8151610e4281614381565b600060ff821660ff81036148d5576148d5614831565b60010192915050565b8082028115828204841417610c3557610c35614831565b80820180821115610c3557610c35614831565b601f821115610ddd57600081815260208120601f850160051c8101602086101561492f5750805b601f850160051c820191505b81811015613c5d5782815560010161493b565b815167ffffffffffffffff8111156149685761496861410b565b61497c8161497684546147f7565b84614908565b602080601f8311600181146149b157600084156149995750858301515b600019600386901b1c1916600185901b178555613c5d565b600085815260208120601f198616915b828110156149e0578886015182559484019460019091019084016149c1565b50858210156149fe5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215614a2057600080fd5b8151610e428161403c565b634e487b7160e01b600052602160045260246000fd5b60008351614a53818460208801613fc0565b835190830190614a67818360208801613fc0565b01949350505050565b6000808454614a7e816147f7565b60018281168015614a965760018114614aab57614ada565b60ff1984168752821515830287019450614ada565b8860005260208060002060005b85811015614ad15781548a820152908401908201614ab8565b50505082870194505b507f2f00000000000000000000000000000000000000000000000000000000000000845286519250614b128382860160208a01613fc0565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000939092019182019290925260060195945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152614b7c6080830184613fe4565b9695505050505050565b600060208284031215614b9857600080fd5b8151610e4281613f8d565b634e487b7160e01b600052601260045260246000fd5b600082614bc857614bc8614ba3565b500490565b600082614bdc57614bdc614ba3565b50069056fe61723a2f2f7a6d63315754737049684679565938326277664149634945784c4648356c55634848554e307758673457382f4f70657261746f72416363657373436f6e74726f6c3a2063616c6c6572206973a2646970667358221220cee70ac57e621b75181506f217f9b9cdcabb3bf0cbae8b9c80d270d67adf1efa64736f6c63430008140033
Deployed Bytecode Sourcemap
82302:18945:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100772:190;;;;;;;;;;-1:-1:-1;100772:190:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;100772:190:0;;;;;;;;96132:86;;;;;;;;;;-1:-1:-1;96198:12:0;;96132:86;;;784:25:1;;;772:2;757:18;96132:86:0;638:177:1;44045:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45549:204::-;;;;;;;;;;-1:-1:-1;45549:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1925:55:1;;;1907:74;;1895:2;1880:18;45549:204:0;1761:226:1;45111:372:0;;;;;;;;;;-1:-1:-1;45111:372:0;;;;;:::i;:::-;;:::i;:::-;;98073:339;;;;;;;;;;-1:-1:-1;98073:339:0;;;;;:::i;:::-;;:::i;93205:610::-;;;;;;;;;;-1:-1:-1;93205:610:0;;;;;:::i;:::-;;:::i;96325:446::-;;;;;;;;;;-1:-1:-1;96325:446:0;;;;;:::i;:::-;;:::i;89009:922::-;;;;;;:::i;:::-;;:::i;82417:33::-;;;;;;;;;;;;;;;;40170:312;;;;;;;;;;-1:-1:-1;40433:12:0;;40223:7;40417:13;:28;40170:312;;86145:434;;;;;;;;;;-1:-1:-1;86145:434:0;;;;;:::i;:::-;;:::i;46414:170::-;;;;;;;;;;-1:-1:-1;46414:170:0;;;;;:::i;:::-;;:::i;82457:33::-;;;;;;;;;;;;;;;;83970:455;;;;;;;;;;-1:-1:-1;83970:455:0;;;;;:::i;:::-;;:::i;90869:633::-;;;;;;:::i;:::-;;:::i;87088:276::-;;;;;;;;;;-1:-1:-1;87088:276:0;;;;;:::i;:::-;;:::i;46655:185::-;;;;;;;;;;-1:-1:-1;46655:185:0;;;;;:::i;:::-;;:::i;97740:166::-;;;;;;;;;;-1:-1:-1;97740:166:0;;;;;:::i;:::-;;:::i;94436:500::-;;;;;;;;;;-1:-1:-1;94436:500:0;;;;;:::i;:::-;;:::i;86587:493::-;;;;;;;;;;-1:-1:-1;86885:13:0;;86924;;86966:16;;87012:17;;87057:15;;86587:493;;;7967:25:1;;;8023:2;8008:18;;8001:34;;;;8051:18;;;8044:34;;;;8109:2;8094:18;;8087:34;8152:3;8137:19;;8130:35;7954:3;7939:19;86587:493:0;7708:463:1;87707:391:0;;;;;;;;;;-1:-1:-1;87707:391:0;;;;;:::i;:::-;;:::i;43853:125::-;;;;;;;;;;-1:-1:-1;43853:125:0;;;;;:::i;:::-;;:::i;81697:130::-;;;;;;;;;;-1:-1:-1;81697:130:0;;;;;:::i;:::-;;:::i;97914:151::-;;;;;;;;;;-1:-1:-1;97914:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;98028:29:0;98001:7;98028:29;;;:12;:29;;;;;;;97914:151;41299:206;;;;;;;;;;-1:-1:-1;41299:206:0;;;;;:::i;:::-;;:::i;72625:103::-;;;;;;;;;;;;;:::i;85366:228::-;;;;;;;;;;-1:-1:-1;85366:228:0;;;;;:::i;:::-;;:::i;92807:116::-;;;;;;;;;;-1:-1:-1;92807:116:0;;;;;:::i;:::-;92867:7;92894:21;;;:12;:21;;;;;;;92807:116;85602:535;;;;;;;;;;-1:-1:-1;85602:535:0;;;;;:::i;:::-;;:::i;:::-;;;;10557:14:1;;10550:22;10532:41;;10616:14;;10609:22;10604:2;10589:18;;10582:50;10505:18;85602:535:0;10370:268:1;71984:87:0;;;;;;;;;;-1:-1:-1;72057:6:0;;-1:-1:-1;;;;;72057:6:0;71984:87;;84951:407;;;;;;;;;;-1:-1:-1;85210:13:0;;85249;;85291:16;;85335:15;;84951:407;;;10874:25:1;;;10930:2;10915:18;;10908:34;;;;10958:18;;;10951:34;11016:2;11001:18;;10994:34;10861:3;10846:19;84951:407:0;10643:391:1;80494:164:0;;;;;;;;;;-1:-1:-1;80494:164:0;;;;;:::i;:::-;80597:4;80621:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;80621:29:0;;;;;;;;;;;;;;;80494:164;44214:104;;;;;;;;;;;;;:::i;81952:120::-;;;;;;;;;;-1:-1:-1;81952:120:0;;;;;:::i;:::-;;:::i;94986:305::-;;;;;;;;;;-1:-1:-1;94986:305:0;;;;;:::i;:::-;;:::i;95814:100::-;;;;;;;;;;-1:-1:-1;95814:100:0;;;;;:::i;:::-;;:::i;45825:287::-;;;;;;;;;;-1:-1:-1;45825:287:0;;;;;:::i;:::-;;:::i;96226:91::-;;;;;;;;;;-1:-1:-1;96297:12:0;;96226:91;;77096:132;;;;;;;;;;;;;:::i;87372:327::-;;;;;;;;;;-1:-1:-1;87594:13:0;;87633;;87675:16;;87372:327;;;12816:25:1;;;12872:2;12857:18;;12850:34;;;;12900:18;;;12893:34;12804:2;12789:18;87372:327:0;12614:319:1;88106:450:0;;;;;;;;;;-1:-1:-1;88376:12:0;;88494:13;;;88106:450;;;88376:12;;;;13192:14:1;13185:22;13167:41;;88376:12:0;88413;;;;13251:14:1;13244:22;13224:18;;;13217:50;;;;88453:15:0;;;;;13310:14:1;13303:22;13283:18;;;13276:50;;;;88494:13:0;;;13369:14:1;13362:22;13357:2;13342:18;;13335:50;88534:14:0;;;;;13429::1;13422:22;13416:3;13401:19;;13394:51;13154:3;13139:19;88106:450:0;12938:513:1;84433:510:0;;;;;;;;;;-1:-1:-1;84433:510:0;;;;;:::i;:::-;;:::i;100970:274::-;;;;;;;;;;-1:-1:-1;100970:274:0;;;;;:::i;:::-;;:::i;93823:605::-;;;;;;;;;;-1:-1:-1;93823:605:0;;;;;:::i;:::-;;:::i;92931:29::-;;;;;;;;;;-1:-1:-1;92931:29:0;;;;;;;;97445:122;;;;;;;;;;-1:-1:-1;97445:122:0;;;;;:::i;:::-;;:::i;92457:342::-;;;;;;;;;;-1:-1:-1;92457:342:0;;;;;:::i;:::-;;:::i;:::-;;;;14832:14:1;;14825:22;14807:41;;14879:2;14864:18;;14857:34;;;;14907:18;;;14900:34;14795:2;14780:18;92457:342:0;14611:329:1;46911:370:0;;;;;;;;;;-1:-1:-1;46911:370:0;;;;;:::i;:::-;;:::i;89939:922::-;;;;;;:::i;:::-;;:::i;76936:152::-;;;;;;;;;;;;;:::i;95922:202::-;;;;;;;;;;-1:-1:-1;95922:202:0;;;;;:::i;:::-;;:::i;91510:792::-;;;;;;;;;;-1:-1:-1;91510:792:0;;;;;:::i;:::-;;:::i;92969:90::-;;;;;;;;;;-1:-1:-1;92969:90:0;;;;;:::i;:::-;;:::i;97575:100::-;;;;;;;;;;-1:-1:-1;97652:15:0;;97575:100;;46183:164;;;;;;;;;;-1:-1:-1;46183:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;46304:25:0;;;46280:4;46304:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;46183:164;92310:139;;;;;;;;;;-1:-1:-1;92310:139:0;;;;;:::i;:::-;;:::i;98420:2344::-;;;;;;:::i;:::-;;:::i;72883:201::-;;;;;;;;;;-1:-1:-1;72883:201:0;;;;;:::i;:::-;;:::i;80419:66::-;;;;;;;;;;;;80459:26;80419:66;;82080:124;;;;;;;;;;-1:-1:-1;82080:124:0;;;;;:::i;:::-;;:::i;100772:190::-;100894:4;100918:36;100942:11;100918:23;:36::i;:::-;100911:43;100772:190;-1:-1:-1;;100772:190:0:o;44045:100::-;44099:13;44132:5;44125:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44045:100;:::o;45549:204::-;45617:7;45642:16;45650:7;45642;:16::i;:::-;45637:64;;45667:34;;;;;;;;;;;;;;45637:64;-1:-1:-1;45721:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45721:24:0;;45549:204::o;45111:372::-;45184:13;45200:24;45216:7;45200:15;:24::i;:::-;45184:40;;45245:5;-1:-1:-1;;;;;45239:11:0;:2;-1:-1:-1;;;;;45239:11:0;;45235:48;;45259:24;;;;;;;;;;;;;;45235:48;20604:10;-1:-1:-1;;;;;45300:21:0;;;45296:139;;45327:37;45344:5;20604:10;46183:164;:::i;45327:37::-;45323:112;;45388:35;;;;;;;;;;;;;;45323:112;45447:28;45456:2;45460:7;45469:5;45447:8;:28::i;:::-;45173:310;45111:372;;:::o;98073:339::-;-1:-1:-1;;;;;98215:29:0;;98191:7;98215:29;;;:12;:29;;;;;;:34;;98211:75;;-1:-1:-1;98273:1:0;98266:8;;98211:75;-1:-1:-1;;;;;98361:34:0;;;;;;:17;:34;;;;;;;;:43;;;;;;;;;98316:29;;;:12;:29;;;;;;:88;;98361:43;98316:88;:::i;:::-;98296:108;98073:339;-1:-1:-1;;;98073:339:0:o;93205:610::-;93277:9;;;;93269:46;;;;-1:-1:-1;;;93269:46:0;;18776:2:1;93269:46:0;;;18758:21:1;18815:2;18795:18;;;18788:30;18854:26;18834:18;;;18827:54;18898:18;;93269:46:0;;;;;;;;;93340:8;93328:9;93366:442;93390:1;93386;:5;93366:442;;;93413:15;93431:8;;93440:1;93431:11;;;;;;;:::i;:::-;;;;;;;93413:29;;93513:12;20604:10;;20524:98;93513:12;-1:-1:-1;;;;;93483:42:0;:21;93496:7;93483:12;:21::i;:::-;:26;-1:-1:-1;;;;;93483:42:0;;93457:125;;;;-1:-1:-1;;;93457:125:0;;19318:2:1;93457:125:0;;;19300:21:1;19357:2;19337:18;;;19330:30;-1:-1:-1;;;19376:18:1;;;19369:51;19437:18;;93457:125:0;19116:345:1;93457:125:0;93599:13;93615:21;;;:12;:21;;;;;;;93655:10;;;93651:146;;93686:21;;;;:12;:21;;;;;;93710:15;93686:39;;;;93749:32;;93710:15;;93699:7;;93749:32;;93686:21;93749:32;93651:146;93398:410;;93393:3;;;;:::i;:::-;;;93366:442;;;;93258:557;93205:610;;:::o;96325:446::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;96442:7:::1;96437:236;96455:6;:13;96451:1;:17;;;96437:236;;;96490:12;96512:6;96519:1;96512:9;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;96549:30:::1;::::0;;;;96573:4:::1;96549:30;::::0;::::1;1907:74:1::0;96512:9:0;;-1:-1:-1;96537:9:0::1;::::0;-1:-1:-1;;;;;96549:15:0;::::1;::::0;::::1;::::0;1880:18:1;;96549:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;96537:42:::0;-1:-1:-1;96598:5:0;;96594:68:::1;;96624:22;::::0;;;;-1:-1:-1;;;;;20401:55:1;;;96624:22:0::1;::::0;::::1;20383:74:1::0;20473:18;;;20466:34;;;96624:14:0;::::1;::::0;::::1;::::0;20356:18:1;;96624:22:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;96594:68;96475:198;;96470:3;;;;;:::i;:::-;;;;96437:236;;;-1:-1:-1::0;96733:30:0::1;::::0;96701:21:::1;::::0;-1:-1:-1;;;;;96733:21:0;::::1;::::0;:30;::::1;;;::::0;96701:21;;96683:15:::1;96733:30:::0;96683:15;96733:30;96701:21;96733;:30;::::1;;;;;;;;;;;;;::::0;::::1;;;;89009:922:::0;61146:21;:19;:21::i;:::-;89154:1:::1;89145:5;:10;;89137:57;;;::::0;-1:-1:-1;;;89137:57:0;;21143:2:1;89137:57:0::1;::::0;::::1;21125:21:1::0;21182:2;21162:18;;;21155:30;21221:34;21201:18;;;21194:62;-1:-1:-1;;;21272:18:1;;;21265:32;21314:19;;89137:57:0::1;20941:398:1::0;89137:57:0::1;89258:5;89242:13;;:21;;;;:::i;:::-;89229:9;:34;89207:118;;;::::0;-1:-1:-1;;;89207:118:0;;21719:2:1;89207:118:0::1;::::0;::::1;21701:21:1::0;21758:2;21738:18;;;21731:30;21797:34;21777:18;;;21770:62;-1:-1:-1;;;21848:18:1;;;21841:32;21890:19;;89207:118:0::1;21517:398:1::0;89207:118:0::1;89346:12;::::0;::::1;;89338:47;;;::::0;-1:-1:-1;;;89338:47:0;;22122:2:1;89338:47:0::1;::::0;::::1;22104:21:1::0;22161:2;22141:18;;;22134:30;22200:24;22180:18;;;22173:52;22242:18;;89338:47:0::1;21920:346:1::0;89338:47:0::1;89420:158;89457:11;;89420:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;89487:18:0::1;::::0;89534:28:::1;::::0;-1:-1:-1;;89551:10:0::1;22420:2:1::0;22416:15;22412:53;89534:28:0::1;::::0;::::1;22400:66:1::0;89487:18:0;;-1:-1:-1;22482:12:1;;;-1:-1:-1;89534:28:0::1;;;;;;;;;;;;;89524:39;;;;;;89420:18;:158::i;:::-;89398:240;;;::::0;-1:-1:-1;;;89398:240:0;;22707:2:1;89398:240:0::1;::::0;::::1;22689:21:1::0;;;22726:18;;;22719:30;22785:34;22765:18;;;22758:62;22837:18;;89398:240:0::1;22505:356:1::0;89398:240:0::1;89656:9;89651:273;89675:5;89671:1;:9;89651:273;;;89744:13;;89728;;:29;89702:118;;;::::0;-1:-1:-1;;;89702:118:0;;23068:2:1;89702:118:0::1;::::0;::::1;23050:21:1::0;23107:2;23087:18;;;23080:30;23146:29;23126:18;;;23119:57;23193:18;;89702:118:0::1;22866:351:1::0;89702:118:0::1;89837:25;20604:10:::0;89837:11:::1;:25::i;:::-;89895:13;::::0;:17:::1;::::0;89911:1:::1;89895:17;:::i;:::-;89879:13;:33:::0;89682:3;::::1;::::0;::::1;:::i;:::-;;;;89651:273;;;;61190:20:::0;60584:1;61710:7;:22;61527:213;86145:434;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;86369:13:::1;:28:::0;;;;86408:13:::1;:28:::0;;;;86447:16:::1;:34:::0;86492:17:::1;:36:::0;86539:15:::1;:32:::0;86145:434::o;46414:170::-;46548:28;46558:4;46564:2;46568:7;46548:9;:28::i;83970:455::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;84196:22:::1;:48:::0;;-1:-1:-1;;84196:48:0;;::::1;-1:-1:-1::0;;;;;84196:48:0;;::::1;;::::0;;;84255:26:::1;:56:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;84322:28:::1;:60:::0;;;;::::1;::::0;;;::::1;;::::0;;84393:14:::1;:24:::0;83970:455::o;90869:633::-;61146:21;:19;:21::i;:::-;90960:1:::1;90951:5;:10;;90943:57;;;::::0;-1:-1:-1;;;90943:57:0;;21143:2:1;90943:57:0::1;::::0;::::1;21125:21:1::0;21182:2;21162:18;;;21155:30;21221:34;21201:18;;;21194:62;-1:-1:-1;;;21272:18:1;;;21265:32;21314:19;;90943:57:0::1;20941:398:1::0;90943:57:0::1;91067:5;91048:16;;:24;;;;:::i;:::-;91035:9;:37;91013:121;;;::::0;-1:-1:-1;;;91013:121:0;;21719:2:1;91013:121:0::1;::::0;::::1;21701:21:1::0;21758:2;21738:18;;;21731:30;21797:34;21777:18;;;21770:62;-1:-1:-1;;;21848:18:1;;;21841:32;21890:19;;91013:121:0::1;21517:398:1::0;91013:121:0::1;91155:15;::::0;;;::::1;;;91147:50;;;::::0;-1:-1:-1;;;91147:50:0;;22122:2:1;91147:50:0::1;::::0;::::1;22104:21:1::0;22161:2;22141:18;;;22134:30;22200:24;22180:18;;;22173:52;22242:18;;91147:50:0::1;21920:346:1::0;91147:50:0::1;91215:9;91210:285;91234:5;91230:1;:9;91210:285;;;91306:16;;91287;;:35;91261:124;;;::::0;-1:-1:-1;;;91261:124:0;;23068:2:1;91261:124:0::1;::::0;::::1;23050:21:1::0;23107:2;23087:18;;;23080:30;23146:29;23126:18;;;23119:57;23193:18;;91261:124:0::1;22866:351:1::0;91261:124:0::1;91402:25;20604:10:::0;89837:11:::1;:25::i;91402:::-;91463:16;::::0;:20:::1;::::0;91482:1:::1;91463:20;:::i;:::-;91444:16;:39:::0;91241:3;::::1;::::0;::::1;:::i;:::-;;;;91210:285;;;;61190:20:::0;60584:1;61710:7;:22;61527:213;61190:20;90869:633;:::o;87088:276::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;87244:13:::1;:28:::0;;;;87283:13:::1;:28:::0;87322:16:::1;:34:::0;87088:276::o;46655:185::-;46793:39;46810:4;46816:2;46820:7;46793:39;;;;;;;;;;;;:16;:39::i;97740:166::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;-1:-1:-1;;;;;97861:29:0;;::::1;;::::0;;;:12:::1;:29;::::0;;;;:37;97740:166::o;94436:500::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;94551:8;94539:9:::1;94577:352;94601:1;94597;:5;94577:352;;;94624:15;94642:8;;94651:1;94642:11;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;94668:13;94684:21:::0;;;:12:::1;:21:::0;;;;;;;;94642:11;;-1:-1:-1;;94724:9:0;;94720:198:::1;;94777:23;94795:5:::0;94777:15:::1;:23;:::i;:::-;94754:19;::::0;;;:10:::1;:19;::::0;;;;:46;;:19;;;:46:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;94843:1:0::1;94819:21:::0;;;:12:::1;:21;::::0;;;;;:25;;;94868:34;94886:15:::1;::::0;94832:7;;94868:34:::1;::::0;94843:1;94868:34:::1;94720:198;94609:320;;94604:3;;;;:::i;:::-;;;94577:352;;87707:391:::0;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;87904:12:::1;:26:::0;;88021:13:::1;:28:::0;;-1:-1:-1;;88021:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;87941:26:0;;;87904;::::1;;-1:-1:-1::0;;87941:26:0;;;;;87904::::1;87941::::0;::::1;;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;88060:30:0;87978:32;;::::1;;::::0;;;::::1;-1:-1:-1::0;;88060:30:0;;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;87707:391::o;43853:125::-;43917:7;43944:21;43957:7;43944:12;:21::i;:::-;:26;;43853:125;-1:-1:-1;;43853:125:0:o;81697:130::-;-1:-1:-1;;;;;80621:29:0;;81764:4;80621:29;;;:12;;:29;:12;:29;;;;;81788:31;80494:164;41299:206;41363:7;-1:-1:-1;;;;;41387:19:0;;41383:60;;41415:28;;;;;;;;;;;;;;41383:60;-1:-1:-1;;;;;;41469:19:0;;;;;:12;:19;;;;;:27;;;;41299:206::o;72625:103::-;71870:13;:11;:13::i;:::-;72690:30:::1;72717:1;72690:18;:30::i;:::-;72625:103::o:0;85366:228::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;85499:18:::1;:38:::0;;;;85548:18:::1;:38:::0;85366:228::o;85602:535::-;85739:19;85760;85809:145;85842:14;;85809:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;85871:18:0;;85914:28;;-1:-1:-1;;85931:10:0;22420:2:1;22416:15;22412:53;85914:28:0;;;22400:66:1;85871:18:0;;-1:-1:-1;22482:12:1;;;-1:-1:-1;85914:28:0;22271:229:1;85809:145:0;85792:162;;85984:145;86017:14;;85984:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86046:18:0;;86089:28;;-1:-1:-1;;86106:10:0;22420:2:1;22416:15;22412:53;86089:28:0;;;22400:66:1;86046:18:0;;-1:-1:-1;22482:12:1;;;-1:-1:-1;86089:28:0;22271:229:1;85984:145:0;85967:162;;85602:535;;;;;;;:::o;44214:104::-;44270:13;44303:7;44296:14;;;;;:::i;81952:120::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;82030:34:::1;80459:26;82056:7;82030:10;:34::i;94986:305::-:0;20604:10;95123:16;95131:7;95123;:16::i;:::-;-1:-1:-1;;;;;95123:32:0;;95115:66;;;;-1:-1:-1;;;95115:66:0;;19318:2:1;95115:66:0;;;19300:21:1;19357:2;19337:18;;;19330:30;-1:-1:-1;;;19376:18:1;;;19369:51;19437:18;;95115:66:0;19116:345:1;95115:66:0;95208:1;95192:13;:17;95220:35;95237:4;95243:2;95247:7;95220:16;:35::i;:::-;-1:-1:-1;;95282:1:0;95266:13;:17;-1:-1:-1;94986:305:0:o;95814:100::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;95888:8:::1;:18;95899:7:::0;95888:8;:18:::1;:::i;:::-;;95814:100:::0;:::o;45825:287::-;20604:10;-1:-1:-1;;;;;45924:24:0;;;45920:54;;45957:17;;;;;;;;;;;;;;45920:54;20604:10;45987:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;45987:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;45987:53:0;;;;;;;;;;46056:48;;586:41:1;;;45987:42:0;;20604:10;46056:48;;559:18:1;46056:48:0;;;;;;;45825:287;;:::o;77096:132::-;77205:14;;77143:13;;77176:44;;77205:14;;77176:28;:44::i;:::-;77169:51;;77096:132;:::o;84433:510::-;84485:7;20604:10;84527:21;84540:7;84527:12;:21::i;:::-;:26;-1:-1:-1;;;;;84527:42:0;;84505:113;;;;-1:-1:-1;;;84505:113:0;;19318:2:1;84505:113:0;;;19300:21:1;19357:2;19337:18;;;19330:30;-1:-1:-1;;;19376:18:1;;;19369:51;19437:18;;84505:113:0;19116:345:1;84505:113:0;84660:22;;84712:26;;;84769:14;;84643:201;;;;;-1:-1:-1;;;;;84712:26:0;;;84643:201;;;25884:34:1;84629:11:0;25934:18:1;;;25927:34;;;25977:18;;;25970:34;;;;84806:4:0;26020:18:1;;;26013:43;26072:19;;;26065:35;;;84629:11:0;;84660:22;;84643:54;;25795:19:1;;84643:201:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84885:28;;84855:59;;;;;-1:-1:-1;;;;;84885:28:0;;;84855:59;;;1907:74:1;84629:215:0;;-1:-1:-1;84855:29:0;;;;;1880:18:1;;84855:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84932:3:0;;84433:510;-1:-1:-1;;;;;84433:510:0:o;100970:274::-;101088:9;101083:154;101107:8;:15;101103:1;:19;101083:154;;;101144:15;101162:8;101171:1;101162:11;;;;;;;;:::i;:::-;;;;;;;101144:29;;101188:37;101201:10;101213:2;101217:7;101188:12;:37::i;:::-;-1:-1:-1;101124:3:0;;;;:::i;:::-;;;;101083:154;;93823:605;93901:8;93889:9;93927:494;93951:1;93947;:5;93927:494;;;93974:15;93992:8;;94001:1;93992:11;;;;;;;:::i;:::-;;;;;;;93974:29;;94074:12;20604:10;;20524:98;94074:12;-1:-1:-1;;;;;94044:42:0;:21;94057:7;94044:12;:21::i;:::-;:26;-1:-1:-1;;;;;94044:42:0;;94018:125;;;;-1:-1:-1;;;94018:125:0;;19318:2:1;94018:125:0;;;19300:21:1;19357:2;19337:18;;;19330:30;-1:-1:-1;;;19376:18:1;;;19369:51;19437:18;;94018:125:0;19116:345:1;94018:125:0;94160:13;94176:21;;;:12;:21;;;;;;94216:9;;94212:198;;94269:23;94287:5;94269:15;:23;:::i;:::-;94246:19;;;;:10;:19;;;;;:46;;:19;;;:46;;;;;:::i;:::-;;;;-1:-1:-1;;94335:1:0;94311:21;;;:12;:21;;;;;;:25;;;94360:34;94378:15;;94324:7;;94360:34;;94335:1;94360:34;94212:198;93959:462;;93954:3;;;;:::i;:::-;;;93927:494;;97445:122;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;97527:15:::1;:32:::0;97445:122::o;92457:342::-;92534:12;92607:21;;;:12;:21;;;;;;92534:12;;;;92643:10;;92639:105;;92680:4;;-1:-1:-1;92709:23:0;92727:5;92709:15;:23;:::i;:::-;92699:33;;92639:105;92772:19;;;;:10;:19;;;;;;92762:29;;:7;:29;:::i;:::-;92457:342;;;;-1:-1:-1;;;92457:342:0:o;46911:370::-;47078:28;47088:4;47094:2;47098:7;47078:9;:28::i;:::-;-1:-1:-1;;;;;47121:13:0;;12066:19;:23;47117:157;;47142:56;47173:4;47179:2;47183:7;47192:5;47142:30;:56::i;:::-;47138:136;;47222:40;;-1:-1:-1;;;47222:40:0;;;;;;;;;;;89939:922;61146:21;:19;:21::i;:::-;90084:1:::1;90075:5;:10;;90067:57;;;::::0;-1:-1:-1;;;90067:57:0;;21143:2:1;90067:57:0::1;::::0;::::1;21125:21:1::0;21182:2;21162:18;;;21155:30;21221:34;21201:18;;;21194:62;-1:-1:-1;;;21272:18:1;;;21265:32;21314:19;;90067:57:0::1;20941:398:1::0;90067:57:0::1;90188:5;90172:13;;:21;;;;:::i;:::-;90159:9;:34;90137:118;;;::::0;-1:-1:-1;;;90137:118:0;;21719:2:1;90137:118:0::1;::::0;::::1;21701:21:1::0;21758:2;21738:18;;;21731:30;21797:34;21777:18;;;21770:62;-1:-1:-1;;;21848:18:1;;;21841:32;21890:19;;90137:118:0::1;21517:398:1::0;90137:118:0::1;90276:12;::::0;::::1;::::0;::::1;;;90268:47;;;::::0;-1:-1:-1;;;90268:47:0;;22122:2:1;90268:47:0::1;::::0;::::1;22104:21:1::0;22161:2;22141:18;;;22134:30;22200:24;22180:18;;;22173:52;22242:18;;90268:47:0::1;21920:346:1::0;90268:47:0::1;90350:158;90387:11;;90350:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;90417:18:0::1;::::0;90464:28:::1;::::0;-1:-1:-1;;90481:10:0::1;22420:2:1::0;22416:15;22412:53;90464:28:0::1;::::0;::::1;22400:66:1::0;90417:18:0;;-1:-1:-1;22482:12:1;;;-1:-1:-1;90464:28:0::1;22271:229:1::0;90350:158:0::1;90328:240;;;::::0;-1:-1:-1;;;90328:240:0;;22707:2:1;90328:240:0::1;::::0;::::1;22689:21:1::0;;;22726:18;;;22719:30;22785:34;22765:18;;;22758:62;22837:18;;90328:240:0::1;22505:356:1::0;90328:240:0::1;90586:9;90581:273;90605:5;90601:1;:9;90581:273;;;90674:13;;90658;;:29;90632:118;;;::::0;-1:-1:-1;;;90632:118:0;;23068:2:1;90632:118:0::1;::::0;::::1;23050:21:1::0;23107:2;23087:18;;;23080:30;23146:29;23126:18;;;23119:57;23193:18;;90632:118:0::1;22866:351:1::0;90632:118:0::1;90767:25;20604:10:::0;89837:11:::1;:25::i;90767:::-;90825:13;::::0;:17:::1;::::0;90841:1:::1;90825:17;:::i;:::-;90809:13;:33:::0;90612:3;::::1;::::0;::::1;:::i;:::-;;;;90581:273;;76936:152:::0;76982:13;77029:17;;;;;;;;;;;;;;;;;77053:14;;77048:31;;77053:14;;77048:20;;;;;;;;:::i;:::-;:29;:31::i;:::-;77015:65;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77008:72;;76936:152;:::o;95922:202::-;96003:13;96073:8;96088:17;96097:7;96088:8;:17::i;:::-;96056:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;96029:87;;95922:202;;;:::o;91510:792::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;91688:7:::1;:14;91666:11;:18;:36;91644:146;;;::::0;-1:-1:-1;;;91644:146:0;;28586:2:1;91644:146:0::1;::::0;::::1;28568:21:1::0;28625:2;28605:18;;;28598:30;28664:34;28644:18;;;28637:62;28735:30;28715:18;;;28708:58;28783:19;;91644:146:0::1;28384:424:1::0;91644:146:0::1;91818:18:::0;;91803:12:::1;91847:448;91869:4;91864:2;:9;91847:448;;;91896:10;91909:11;91921:2;91909:15;;;;;;;;:::i;:::-;;;;;;;91896:28;;91939:14;91956:7;91964:2;91956:11;;;;;;;;:::i;:::-;;;;;;;91939:28;;91989:9;91984:300;92008:6;92004:1;:10;91984:300;;;92085:12;;92070;;:27;92040:139;;;::::0;-1:-1:-1;;;92040:139:0;;29015:2:1;92040:139:0::1;::::0;::::1;28997:21:1::0;29054:2;29034:18;;;29027:30;29093:34;29073:18;;;29066:62;-1:-1:-1;;;29144:18:1;;;29137:36;29190:19;;92040:139:0::1;28813:402:1::0;92040:139:0::1;92200:16;92210:2;92214:1;92200:9;:16::i;:::-;92252:12;::::0;:16:::1;::::0;92267:1:::1;92252:16;:::i;:::-;92237:12;:31:::0;92016:3;::::1;::::0;::::1;:::i;:::-;;;;91984:300;;;;91881:414;;91875:4;;;;;:::i;:::-;;;;91847:448;;92969:90:::0;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;93035:9:::1;:16:::0;;-1:-1:-1;;93035:16:0::1;::::0;::::1;;::::0;;;::::1;::::0;;92969:90::o;92310:139::-;-1:-1:-1;;;;;92419:22:0;;92372:7;92419:22;;;:16;:22;;;;;;92399:17;;:42;;92419:22;92399:42;:::i;98420:2344::-;61146:21;:19;:21::i;:::-;98634:8:::1;:15;98614:9;:16;:35;98592:145;;;::::0;-1:-1:-1;;;98592:145:0;;29422:2:1;98592:145:0::1;::::0;::::1;29404:21:1::0;29461:2;29441:18;;;29434:30;29500:34;29480:18;;;29473:62;29571:30;29551:18;;;29544:58;29619:19;;98592:145:0::1;29220:424:1::0;98592:145:0::1;98791:6;:13;98772:8;:15;:32;98750:139;;;::::0;-1:-1:-1;;;98750:139:0;;29851:2:1;98750:139:0::1;::::0;::::1;29833:21:1::0;29890:2;29870:18;;;29863:30;29929:34;29909:18;;;29902:62;30000:27;29980:18;;;29973:55;30045:19;;98750:139:0::1;29649:421:1::0;98750:139:0::1;98910:14;::::0;;;::::1;;;98902:49;;;::::0;-1:-1:-1;;;98902:49:0;;30277:2:1;98902:49:0::1;::::0;::::1;30259:21:1::0;30316:2;30296:18;;;30289:30;30355:24;30335:18;;;30328:52;30397:18;;98902:49:0::1;30075:346:1::0;98902:49:0::1;98964:22;99006:9:::0;99001:116:::1;99025:8;:15;99021:1;:19;99001:116;;;99096:6;99103:1;99096:9;;;;;;;;:::i;:::-;;;;;;;99079:14;:26;;;;:::i;:::-;99062:43:::0;-1:-1:-1;99042:3:0;::::1;::::0;::::1;:::i;:::-;;;;99001:116;;;;99154:2;99137:14;:19;99129:53;;;::::0;-1:-1:-1;;;99129:53:0;;30628:2:1;99129:53:0::1;::::0;::::1;30610:21:1::0;30667:2;30647:18;;;30640:30;30706:23;30686:18;;;30679:51;30747:18;;99129:53:0::1;30426:345:1::0;99129:53:0::1;99248:14;99230:15;;:32;;;;:::i;:::-;99217:9;:45;99195:129;;;::::0;-1:-1:-1;;;99195:129:0;;30978:2:1;99195:129:0::1;::::0;::::1;30960:21:1::0;31017:2;30997:18;;;30990:30;31056:34;31036:18;;;31029:62;-1:-1:-1;;;31107:18:1;;;31100:32;31149:19;;99195:129:0::1;30776:398:1::0;99195:129:0::1;99342:9;99337:1420;99361:8;:15;99357:1;:19;99337:1420;;;99398:23;99424:9;99434:1;99424:12;;;;;;;;:::i;:::-;;;;;;;99398:38;;99451:15;99469:8;99478:1;99469:11;;;;;;;;:::i;:::-;;;;;;;99451:29;;99495:17;99515:6;99522:1;99515:9;;;;;;;;:::i;:::-;;;;;;;99495:29;;99612:10;-1:-1:-1::0;;;;;99567:55:0::1;99575:15;-1:-1:-1::0;;;;;99567:32:0::1;;99600:7;99567:41;;;;;;;;;;;;;784:25:1::0;;772:2;757:18;;638:177;99567:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;99567:55:0::1;;99541:137;;;::::0;-1:-1:-1;;;99541:137:0;;31381:2:1;99541:137:0::1;::::0;::::1;31363:21:1::0;31420:2;31400:18;;;31393:30;31459:22;31439:18;;;31432:50;31499:18;;99541:137:0::1;31179:344:1::0;99541:137:0::1;-1:-1:-1::0;;;;;99721:29:0;::::1;99753:1;99721:29:::0;;;:12:::1;:29;::::0;;;;;99695:127:::1;;;::::0;-1:-1:-1;;;99695:127:0;;31730:2:1;99695:127:0::1;::::0;::::1;31712:21:1::0;;;31749:18;;;31742:30;31808:34;31788:18;;;31781:62;31860:18;;99695:127:0::1;31528:356:1::0;99695:127:0::1;-1:-1:-1::0;;;;;99945:29:0;::::1;;::::0;;;:12:::1;:29;::::0;;;;;;;;99865:17:::1;:34:::0;;;;;:43;;;;;;;;;;:55:::1;::::0;99911:9;;99865:55:::1;:::i;:::-;:109;;99839:212;;;::::0;-1:-1:-1;;;99839:212:0;;32091:2:1;99839:212:0::1;::::0;::::1;32073:21:1::0;32130:2;32110:18;;;32103:30;32169:34;32149:18;;;32142:62;32240:11;32220:18;;;32213:39;32269:19;;99839:212:0::1;31889:405:1::0;99839:212:0::1;100122:12;;100109:9;100094:12;;:24;;;;:::i;:::-;:40;;100068:140;;;::::0;-1:-1:-1;;;100068:140:0;;32501:2:1;100068:140:0::1;::::0;::::1;32483:21:1::0;32540:2;32520:18;;;32513:30;32579:34;32559:18;;;32552:62;-1:-1:-1;;;32630:18:1;;;32623:36;32676:19;;100068:140:0::1;32299:402:1::0;100068:140:0::1;100282:15;;100269:9;100251:15;;:27;;;;:::i;:::-;:46;;100225:135;;;::::0;-1:-1:-1;;;100225:135:0;;32908:2:1;100225:135:0::1;::::0;::::1;32890:21:1::0;32947:2;32927:18;;;32920:30;32986:29;32966:18;;;32959:57;33033:18;;100225:135:0::1;32706:351:1::0;100225:135:0::1;100382:9;100377:99;100401:9;100397:1;:13;100377:99;;;100436:24;100446:10;100458:1;100436:9;:24::i;:::-;100412:3:::0;::::1;::::0;::::1;:::i;:::-;;;;100377:99;;;;100528:9;100510:15;;:27;;;;:::i;:::-;100492:15;:45:::0;100569:12:::1;::::0;:24:::1;::::0;100584:9;;100569:24:::1;:::i;:::-;100554:12;:39:::0;-1:-1:-1;;;;;100673:34:0;::::1;;::::0;;;:17:::1;:34;::::0;;;;;;;:43;;;;;;;;;:72:::1;::::0;100736:9;;100673:72:::1;:::i;:::-;-1:-1:-1::0;;;;;100610:34:0;;::::1;;::::0;;;:17:::1;:34;::::0;;;;;;;:43;;;;;;;;;;:135;;;;-1:-1:-1;99378:3:0;::::1;::::0;::::1;:::i;:::-;;;;99337:1420;;;;98581:2183;61190:20:::0;60584:1;61710:7;:22;61527:213;72883:201;71870:13;:11;:13::i;:::-;-1:-1:-1;;;;;72972:22:0;::::1;72964:73;;;::::0;-1:-1:-1;;;72964:73:0;;33264:2:1;72964:73:0::1;::::0;::::1;33246:21:1::0;33303:2;33283:18;;;33276:30;33342:34;33322:18;;;33315:62;33413:8;33393:18;;;33386:36;33439:19;;72964:73:0::1;33062:402:1::0;72964:73:0::1;73048:28;73067:8;73048:18;:28::i;82080:124::-:0;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;82161:35:::1;80459:26;82188:7;82161:11;:35::i;77266:235::-:0;77359:4;-1:-1:-1;;;;;;77396:44:0;;77411:29;77396:44;;:97;;;77457:36;77481:11;77457:23;:36::i;47536:174::-;47593:4;47657:13;;47647:7;:23;47617:85;;;;-1:-1:-1;;47675:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;47675:27:0;;;;47674:28;;47536:174::o;56758:196::-;56873:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;56873:29:0;-1:-1:-1;;;;;56873:29:0;;;;;;;;;56918:28;;56873:24;;56918:28;;;;;;;56758:196;;;:::o;42680:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;42791:7:0;42876:13;;42869:4;:20;42865:859;;;42910:31;42944:17;;;:11;:17;;;;;;;;;42910:51;;;;;;;;;-1:-1:-1;;;;;42910:51:0;;;;-1:-1:-1;;;42910:51:0;;;;;;;;;;;-1:-1:-1;;;42910:51:0;;;;;;;;;;;;;;42980:729;;43030:14;;-1:-1:-1;;;;;43030:28:0;;43026:101;;43094:9;42680:1111;-1:-1:-1;;;42680:1111:0:o;43026:101::-;-1:-1:-1;;;43469:6:0;43514:17;;;;:11;:17;;;;;;;;;43502:29;;;;;;;;;-1:-1:-1;;;;;43502:29:0;;;;;-1:-1:-1;;;43502:29:0;;;;;;;;;;;-1:-1:-1;;;43502:29:0;;;;;;;;;;;;;43562:28;43558:109;;43630:9;42680:1111;-1:-1:-1;;;42680:1111:0:o;43558:109::-;43429:261;;;42891:833;42865:859;43752:31;;;;;;;;;;;;;;61226:293;60628:1;61360:7;;:19;61352:63;;;;-1:-1:-1;;;61352:63:0;;33671:2:1;61352:63:0;;;33653:21:1;33710:2;33690:18;;;33683:30;33749:33;33729:18;;;33722:61;33800:18;;61352:63:0;33469:355:1;61352:63:0;60628:1;61493:7;:18;61226:293::o;62402:156::-;62493:4;62546;62517:25;62530:5;62537:4;62517:12;:25::i;:::-;:33;;62402:156;-1:-1:-1;;;;62402:156:0:o;88564:437::-;88662:17;;-1:-1:-1;;;;;88639:20:0;;;;;;:16;:20;;;;;;:40;88617:117;;;;-1:-1:-1;;;88617:117:0;;34031:2:1;88617:117:0;;;34013:21:1;34070:2;34050:18;;;34043:30;34109:29;34089:18;;;34082:57;34156:18;;88617:117:0;33829:351:1;88617:117:0;88782:12;;88767;;:27;88745:115;;;;-1:-1:-1;;;88745:115:0;;29015:2:1;88745:115:0;;;28997:21:1;29054:2;29034:18;;;29027:30;29093:34;29073:18;;;29066:62;-1:-1:-1;;;29144:18:1;;;29137:36;29190:19;;88745:115:0;28813:402:1;88745:115:0;88873:16;88883:2;88887:1;88873:9;:16::i;:::-;-1:-1:-1;;;;;88925:20:0;;;;;;:16;:20;;;;;;:24;;88948:1;88925:24;:::i;:::-;-1:-1:-1;;;;;88902:20:0;;;;;;:16;:20;;;;;:47;88977:12;;:16;;88992:1;88977:16;:::i;:::-;88962:12;:31;-1:-1:-1;88564:437:0:o;51706:2130::-;51821:35;51859:21;51872:7;51859:12;:21::i;:::-;51821:59;;51919:4;-1:-1:-1;;;;;51897:26:0;:13;:18;;;-1:-1:-1;;;;;51897:26:0;;51893:67;;51932:28;;;;;;;;;;;;;;51893:67;51973:22;20604:10;-1:-1:-1;;;;;51999:20:0;;;;:73;;-1:-1:-1;52036:36:0;52053:4;20604:10;46183:164;:::i;52036:36::-;51999:126;;;-1:-1:-1;20604:10:0;52089:20;52101:7;52089:11;:20::i;:::-;-1:-1:-1;;;;;52089:36:0;;51999:126;51973:153;;52144:17;52139:66;;52170:35;;;;;;;;;;;;;;52139:66;-1:-1:-1;;;;;52220:16:0;;52216:52;;52245:23;;;;;;;;;;;;;;52216:52;52281:43;52303:4;52309:2;52313:7;52322:1;52281:21;:43::i;:::-;52389:35;52406:1;52410:7;52419:4;52389:8;:35::i;:::-;-1:-1:-1;;;;;52720:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;52720:31:0;;;;;;;-1:-1:-1;;52720:31:0;;;;;;;52766:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;52766:29:0;;;;;;;;;;;52846:20;;;:11;:20;;;;;;52881:18;;-1:-1:-1;;;;;;52914:49:0;;;;-1:-1:-1;;;52947:15:0;52914:49;;;;;;;;;;53237:11;;53297:24;;;;;53340:13;;52846:20;;53297:24;;53340:13;53336:384;;53550:13;;53535:11;:28;53531:174;;53588:20;;53657:28;;;;53631:54;;-1:-1:-1;;;53631:54:0;-1:-1:-1;;;;;;53631:54:0;;;-1:-1:-1;;;;;53588:20:0;;53631:54;;;;53531:174;52695:1036;;;53767:7;53763:2;-1:-1:-1;;;;;53748:27:0;53757:4;-1:-1:-1;;;;;53748:27:0;;;;;;;;;;;51810:2026;;51706:2130;;;:::o;72149:132::-;72057:6;;-1:-1:-1;;;;;72057:6:0;20604:10;72213:23;72205:68;;;;-1:-1:-1;;;72205:68:0;;34387:2:1;72205:68:0;;;34369:21:1;;;34406:18;;;34399:30;34465:34;34445:18;;;34438:62;34517:18;;72205:68:0;34185:356:1;73244:191:0;73337:6;;;-1:-1:-1;;;;;73354:17:0;;;-1:-1:-1;;73354:17:0;;;;;;;73387:40;;73337:6;;;73354:17;73337:6;;73387:40;;73318:16;;73387:40;73307:128;73244:191;:::o;80666:229::-;80597:4;80621:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;80621:29:0;;;;;;;;;;;;80736:152;;80780:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;80780:29:0;;;;;;;;;:36;;-1:-1:-1;;80780:36:0;80812:4;80780:36;;;80863:12;20604:10;;20524:98;80863:12;-1:-1:-1;;;;;80836:40:0;80854:7;-1:-1:-1;;;;;80836:40:0;80848:4;80836:40;;;;;;;;;;80666:229;;:::o;77509:606::-;77602:13;77662:1;77642:15;77636:22;;;;;;;;:::i;:::-;:27;;;;77628:36;;;;;;77704:15;77679:40;;;;;;;;:::i;:::-;:21;:40;77675:61;;-1:-1:-1;;77721:15:0;;;;;;;;;;;;;;;;;;77509:606::o;77675:61::-;77779:15;77751:43;;;;;;;;:::i;:::-;:24;:43;77747:67;;-1:-1:-1;;77796:18:0;;;;;;;;;;;;;;;;;;77509:606::o;77747:67::-;77858:15;77829:44;;;;;;;;:::i;:::-;:25;:44;77825:69;;-1:-1:-1;;77875:19:0;;;;;;;;;;;;;;;;;;77509:606::o;77825:69::-;77946:15;77909:52;;;;;;;;:::i;:::-;:33;:52;77905:85;;-1:-1:-1;;77963:27:0;;;;;;;;;;;;;;;;;;77509:606::o;77905:85::-;78032:15;78005:42;;;;;;;;:::i;:::-;:23;:42;78001:106;;-1:-1:-1;;78049:17:0;;;;;;;;;;;;;;;;;;77509:606::o;78001:106::-;-1:-1:-1;;78082:25:0;;;;;;;;;;;;;;;;;;77509:606::o;57446:667::-;57630:72;;-1:-1:-1;;;57630:72:0;;57609:4;;-1:-1:-1;;;;;57630:36:0;;;;;:72;;20604:10;;57681:4;;57687:7;;57696:5;;57630:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57630:72:0;;;;;;;;-1:-1:-1;;57630:72:0;;;;;;;;;;;;:::i;:::-;;;57626:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57864:6;:13;57881:1;57864:18;57860:235;;57910:40;;-1:-1:-1;;;57910:40:0;;;;;;;;;;;57860:235;58053:6;58047:13;58038:6;58034:2;58030:15;58023:38;57626:480;-1:-1:-1;;;;;;57749:55:0;-1:-1:-1;;;57749:55:0;;-1:-1:-1;57626:480:0;57446:667;;;;;;:::o;35389:716::-;35445:13;35496:14;35513:17;35524:5;35513:10;:17::i;:::-;35533:1;35513:21;35496:38;;35549:20;35583:6;35572:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35572:18:0;-1:-1:-1;35549:41:0;-1:-1:-1;35714:28:0;;;35730:2;35714:28;35771:288;-1:-1:-1;;35803:5:0;35945:8;35940:2;35929:14;;35924:30;35803:5;35911:44;36001:2;35992:11;;;-1:-1:-1;36022:21:0;35771:288;36022:21;-1:-1:-1;36080:6:0;35389:716;-1:-1:-1;;;35389:716:0:o;96779:532::-;96835:13;96865:5;96874:1;96865:10;96861:53;;-1:-1:-1;;96892:10:0;;;;;;;;;;;;;;;;;;96779:532::o;96861:53::-;96939:5;96924:12;96980:78;96987:9;;96980:78;;97013:8;;;;:::i;:::-;;-1:-1:-1;97036:10:0;;-1:-1:-1;97044:2:0;97036:10;;:::i;:::-;;;96980:78;;;97068:19;97100:6;97090:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;97090:17:0;;97068:39;;97118:154;97125:10;;97118:154;;97152:11;97162:1;97152:11;;:::i;:::-;;-1:-1:-1;97221:10:0;97229:2;97221:5;:10;:::i;:::-;97208:24;;:2;:24;:::i;:::-;97195:39;;97178:6;97185;97178:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;97249:11:0;97258:2;97249:11;;:::i;:::-;;;97118:154;;47794:104;47863:27;47873:2;47877:8;47863:27;;;;;;;;;;;;:9;:27::i;81023:230::-;80597:4;80621:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;80621:29:0;;;;;;;;;;;;81094:152;;;81169:5;81137:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;81137:29:0;;;;;;;;;;:37;;-1:-1:-1;;81137:37:0;;;81194:40;20604:10;;81137:12;;81194:40;;81169:5;81194:40;81023:230;;:::o;40930:305::-;41032:4;-1:-1:-1;;;;;;41069:40:0;;41084:25;41069:40;;:105;;-1:-1:-1;;;;;;;41126:48:0;;41141:33;41126:48;41069:105;:158;;;-1:-1:-1;38680:25:0;-1:-1:-1;;;;;;38665:40:0;;;41191:36;38556:157;63201:296;63284:7;63327:4;63284:7;63342:118;63366:5;:12;63362:1;:16;63342:118;;;63415:33;63425:12;63439:5;63445:1;63439:8;;;;;;;;:::i;:::-;;;;;;;63415:9;:33::i;:::-;63400:48;-1:-1:-1;63380:3:0;;;;:::i;:::-;;;;63342:118;;;-1:-1:-1;63477:12:0;63201:296;-1:-1:-1;;;63201:296:0:o;95299:507::-;95483:12;95465:15;95525:18;95535:8;95483:12;95525:18;:::i;:::-;95511:32;;95506:293;95555:3;95545:7;:13;95506:293;;;95612:21;;;;:12;:21;;;;;;:26;;:69;;;95663:13;;95680:1;95663:18;95612:69;:107;;;-1:-1:-1;95706:13:0;;;;95612:107;95586:201;;;;-1:-1:-1;;;95586:201:0;;35950:2:1;95586:201:0;;;35932:21:1;;;35969:18;;;35962:30;36028:34;36008:18;;;36001:62;36080:18;;95586:201:0;35748:356:1;95586:201:0;95560:9;;;:::i;:::-;;;95506:293;;;;95454:352;95299:507;;;;:::o;31066:948::-;31119:7;;31206:8;31197:17;;31193:106;;31244:8;31235:17;;;-1:-1:-1;31281:2:0;31271:12;31193:106;31326:8;31317:5;:17;31313:106;;31364:8;31355:17;;;-1:-1:-1;31401:2:0;31391:12;31313:106;31446:8;31437:5;:17;31433:106;;31484:8;31475:17;;;-1:-1:-1;31521:2:0;31511:12;31433:106;31566:7;31557:5;:16;31553:103;;31603:7;31594:16;;;-1:-1:-1;31639:1:0;31629:11;31553:103;31683:7;31674:5;:16;31670:103;;31720:7;31711:16;;;-1:-1:-1;31756:1:0;31746:11;31670:103;31800:7;31791:5;:16;31787:103;;31837:7;31828:16;;;-1:-1:-1;31873:1:0;31863:11;31787:103;31917:7;31908:5;:16;31904:68;;31955:1;31945:11;32000:6;31066:948;-1:-1:-1;;31066:948:0:o;48271:1749::-;48394:20;48417:13;-1:-1:-1;;;;;48445:16:0;;48441:48;;48470:19;;;;;;;;;;;;;;48441:48;48504:8;48516:1;48504:13;48500:44;;48526:18;;;;;;;;;;;;;;48500:44;48557:61;48587:1;48591:2;48595:12;48609:8;48557:21;:61::i;:::-;-1:-1:-1;;;;;48895:16:0;;;;;;:12;:16;;;;;;;;:44;;48954:49;;;48895:44;;;;;;;;48954:49;;;;-1:-1:-1;;48895:44:0;;;;;;48954:49;;;;;;;;;;;;;;;;49020:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;49070:66:0;;;-1:-1:-1;;;49120:15:0;49070:66;;;;;;;;;;;;;49020:25;;49217:23;;;;12066:19;:23;49257:631;;49297:313;49328:38;;49353:12;;-1:-1:-1;;;;;49328:38:0;;;49345:1;;49328:38;;49345:1;;49328:38;49394:69;49433:1;49437:2;49441:14;;;;;;49457:5;49394:30;:69::i;:::-;49389:174;;49499:40;;-1:-1:-1;;;49499:40:0;;;;;;;;;;;49389:174;49605:3;49590:12;:18;49297:313;;49691:12;49674:13;;:29;49670:43;;49705:8;;;49670:43;49257:631;;;49754:119;49785:40;;49810:14;;;;;-1:-1:-1;;;;;49785:40:0;;;49802:1;;49785:40;;49802:1;;49785:40;49868:3;49853:12;:18;49754:119;;49257:631;-1:-1:-1;49902:13:0;:28;;;49952:60;;49985:2;49989:12;50003:8;49952:60;:::i;70405:149::-;70468:7;70499:1;70495;:5;:51;;70630:13;70724:15;;;70760:4;70753:15;;;70807:4;70791:21;;70495:51;;;70630:13;70724:15;;;70760:4;70753:15;;;70807:4;70791:21;;70503:20;70562:268;14:177:1;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;820:250::-;905:1;915:113;929:6;926:1;923:13;915:113;;;1005:11;;;999:18;986:11;;;979:39;951:2;944:10;915:113;;;-1:-1:-1;;1062:1:1;1044:16;;1037:27;820:250::o;1075:271::-;1117:3;1155:5;1149:12;1182:6;1177:3;1170:19;1198:76;1267:6;1260:4;1255:3;1251:14;1244:4;1237:5;1233:16;1198:76;:::i;:::-;1328:2;1307:15;-1:-1:-1;;1303:29:1;1294:39;;;;1335:4;1290:50;;1075:271;-1:-1:-1;;1075:271:1:o;1351:220::-;1500:2;1489:9;1482:21;1463:4;1520:45;1561:2;1550:9;1546:18;1538:6;1520:45;:::i;1576:180::-;1635:6;1688:2;1676:9;1667:7;1663:23;1659:32;1656:52;;;1704:1;1701;1694:12;1656:52;-1:-1:-1;1727:23:1;;1576:180;-1:-1:-1;1576:180:1:o;1992:154::-;-1:-1:-1;;;;;2071:5:1;2067:54;2060:5;2057:65;2047:93;;2136:1;2133;2126:12;2151:315;2219:6;2227;2280:2;2268:9;2259:7;2255:23;2251:32;2248:52;;;2296:1;2293;2286:12;2248:52;2335:9;2322:23;2354:31;2379:5;2354:31;:::i;:::-;2404:5;2456:2;2441:18;;;;2428:32;;-1:-1:-1;;;2151:315:1:o;2471:367::-;2534:8;2544:6;2598:3;2591:4;2583:6;2579:17;2575:27;2565:55;;2616:1;2613;2606:12;2565:55;-1:-1:-1;2639:20:1;;2682:18;2671:30;;2668:50;;;2714:1;2711;2704:12;2668:50;2751:4;2743:6;2739:17;2727:29;;2811:3;2804:4;2794:6;2791:1;2787:14;2779:6;2775:27;2771:38;2768:47;2765:67;;;2828:1;2825;2818:12;2765:67;2471:367;;;;;:::o;2843:437::-;2929:6;2937;2990:2;2978:9;2969:7;2965:23;2961:32;2958:52;;;3006:1;3003;2996:12;2958:52;3046:9;3033:23;3079:18;3071:6;3068:30;3065:50;;;3111:1;3108;3101:12;3065:50;3150:70;3212:7;3203:6;3192:9;3188:22;3150:70;:::i;:::-;3239:8;;3124:96;;-1:-1:-1;2843:437:1;-1:-1:-1;;;;2843:437:1:o;3285:184::-;-1:-1:-1;;;3334:1:1;3327:88;3434:4;3431:1;3424:15;3458:4;3455:1;3448:15;3474:275;3545:2;3539:9;3610:2;3591:13;;-1:-1:-1;;3587:27:1;3575:40;;3645:18;3630:34;;3666:22;;;3627:62;3624:88;;;3692:18;;:::i;:::-;3728:2;3721:22;3474:275;;-1:-1:-1;3474:275:1:o;3754:183::-;3814:4;3847:18;3839:6;3836:30;3833:56;;;3869:18;;:::i;:::-;-1:-1:-1;3914:1:1;3910:14;3926:4;3906:25;;3754:183::o;3942:737::-;3996:5;4049:3;4042:4;4034:6;4030:17;4026:27;4016:55;;4067:1;4064;4057:12;4016:55;4103:6;4090:20;4129:4;4153:60;4169:43;4209:2;4169:43;:::i;:::-;4153:60;:::i;:::-;4247:15;;;4333:1;4329:10;;;;4317:23;;4313:32;;;4278:12;;;;4357:15;;;4354:35;;;4385:1;4382;4375:12;4354:35;4421:2;4413:6;4409:15;4433:217;4449:6;4444:3;4441:15;4433:217;;;4529:3;4516:17;4546:31;4571:5;4546:31;:::i;:::-;4590:18;;4628:12;;;;4466;;4433:217;;;-1:-1:-1;4668:5:1;3942:737;-1:-1:-1;;;;;;3942:737:1:o;4684:483::-;4777:6;4785;4838:2;4826:9;4817:7;4813:23;4809:32;4806:52;;;4854:1;4851;4844:12;4806:52;4894:9;4881:23;4927:18;4919:6;4916:30;4913:50;;;4959:1;4956;4949:12;4913:50;4982:61;5035:7;5026:6;5015:9;5011:22;4982:61;:::i;:::-;4972:71;;;5093:2;5082:9;5078:18;5065:32;5106:31;5131:5;5106:31;:::i;:::-;5156:5;5146:15;;;4684:483;;;;;:::o;5172:505::-;5267:6;5275;5283;5336:2;5324:9;5315:7;5311:23;5307:32;5304:52;;;5352:1;5349;5342:12;5304:52;5392:9;5379:23;5425:18;5417:6;5414:30;5411:50;;;5457:1;5454;5447:12;5411:50;5496:70;5558:7;5549:6;5538:9;5534:22;5496:70;:::i;:::-;5585:8;;5470:96;;-1:-1:-1;5667:2:1;5652:18;;;;5639:32;;5172:505;-1:-1:-1;;;;5172:505:1:o;5864:454::-;5959:6;5967;5975;5983;5991;6044:3;6032:9;6023:7;6019:23;6015:33;6012:53;;;6061:1;6058;6051:12;6012:53;-1:-1:-1;;6084:23:1;;;6154:2;6139:18;;6126:32;;-1:-1:-1;6205:2:1;6190:18;;6177:32;;6256:2;6241:18;;6228:32;;-1:-1:-1;6307:3:1;6292:19;6279:33;;-1:-1:-1;5864:454:1;-1:-1:-1;5864:454:1:o;6323:456::-;6400:6;6408;6416;6469:2;6457:9;6448:7;6444:23;6440:32;6437:52;;;6485:1;6482;6475:12;6437:52;6524:9;6511:23;6543:31;6568:5;6543:31;:::i;:::-;6593:5;-1:-1:-1;6650:2:1;6635:18;;6622:32;6663:33;6622:32;6663:33;:::i;:::-;6323:456;;6715:7;;-1:-1:-1;;;6769:2:1;6754:18;;;;6741:32;;6323:456::o;6784:598::-;6870:6;6878;6886;6894;6947:3;6935:9;6926:7;6922:23;6918:33;6915:53;;;6964:1;6961;6954:12;6915:53;7003:9;6990:23;7022:31;7047:5;7022:31;:::i;:::-;7072:5;-1:-1:-1;7129:2:1;7114:18;;7101:32;7142:33;7101:32;7142:33;:::i;:::-;7194:7;-1:-1:-1;7253:2:1;7238:18;;7225:32;7266:33;7225:32;7266:33;:::i;:::-;6784:598;;;;-1:-1:-1;7318:7:1;;7372:2;7357:18;7344:32;;-1:-1:-1;;6784:598:1:o;7387:316::-;7464:6;7472;7480;7533:2;7521:9;7512:7;7508:23;7504:32;7501:52;;;7549:1;7546;7539:12;7501:52;-1:-1:-1;;7572:23:1;;;7642:2;7627:18;;7614:32;;-1:-1:-1;7693:2:1;7678:18;;;7665:32;;7387:316;-1:-1:-1;7387:316:1:o;8176:118::-;8262:5;8255:13;8248:21;8241:5;8238:32;8228:60;;8284:1;8281;8274:12;8299:783;8379:6;8387;8395;8403;8411;8464:3;8452:9;8443:7;8439:23;8435:33;8432:53;;;8481:1;8478;8471:12;8432:53;8520:9;8507:23;8539:28;8561:5;8539:28;:::i;:::-;8586:5;-1:-1:-1;8643:2:1;8628:18;;8615:32;8656:30;8615:32;8656:30;:::i;:::-;8705:7;-1:-1:-1;8764:2:1;8749:18;;8736:32;8777:30;8736:32;8777:30;:::i;:::-;8826:7;-1:-1:-1;8885:2:1;8870:18;;8857:32;8898:30;8857:32;8898:30;:::i;:::-;8947:7;-1:-1:-1;9006:3:1;8991:19;;8978:33;9020:30;8978:33;9020:30;:::i;:::-;9069:7;9059:17;;;8299:783;;;;;;;;:::o;9087:247::-;9146:6;9199:2;9187:9;9178:7;9174:23;9170:32;9167:52;;;9215:1;9212;9205:12;9167:52;9254:9;9241:23;9273:31;9298:5;9273:31;:::i;9339:248::-;9407:6;9415;9468:2;9456:9;9447:7;9443:23;9439:32;9436:52;;;9484:1;9481;9474:12;9436:52;-1:-1:-1;;9507:23:1;;;9577:2;9562:18;;;9549:32;;-1:-1:-1;9339:248:1:o;9592:773::-;9714:6;9722;9730;9738;9791:2;9779:9;9770:7;9766:23;9762:32;9759:52;;;9807:1;9804;9797:12;9759:52;9847:9;9834:23;9876:18;9917:2;9909:6;9906:14;9903:34;;;9933:1;9930;9923:12;9903:34;9972:70;10034:7;10025:6;10014:9;10010:22;9972:70;:::i;:::-;10061:8;;-1:-1:-1;9946:96:1;-1:-1:-1;10149:2:1;10134:18;;10121:32;;-1:-1:-1;10165:16:1;;;10162:36;;;10194:1;10191;10184:12;10162:36;;10233:72;10297:7;10286:8;10275:9;10271:24;10233:72;:::i;:::-;9592:773;;;;-1:-1:-1;10324:8:1;-1:-1:-1;;;;9592:773:1:o;11039:315::-;11107:6;11115;11168:2;11156:9;11147:7;11143:23;11139:32;11136:52;;;11184:1;11181;11174:12;11136:52;11220:9;11207:23;11197:33;;11280:2;11269:9;11265:18;11252:32;11293:31;11318:5;11293:31;:::i;11359:407::-;11424:5;11458:18;11450:6;11447:30;11444:56;;;11480:18;;:::i;:::-;11518:57;11563:2;11542:15;;-1:-1:-1;;11538:29:1;11569:4;11534:40;11518:57;:::i;:::-;11509:66;;11598:6;11591:5;11584:21;11638:3;11629:6;11624:3;11620:16;11617:25;11614:45;;;11655:1;11652;11645:12;11614:45;11704:6;11699:3;11692:4;11685:5;11681:16;11668:43;11758:1;11751:4;11742:6;11735:5;11731:18;11727:29;11720:40;11359:407;;;;;:::o;11771:451::-;11840:6;11893:2;11881:9;11872:7;11868:23;11864:32;11861:52;;;11909:1;11906;11899:12;11861:52;11949:9;11936:23;11982:18;11974:6;11971:30;11968:50;;;12014:1;12011;12004:12;11968:50;12037:22;;12090:4;12082:13;;12078:27;-1:-1:-1;12068:55:1;;12119:1;12116;12109:12;12068:55;12142:74;12208:7;12203:2;12190:16;12185:2;12181;12177:11;12142:74;:::i;12227:382::-;12292:6;12300;12353:2;12341:9;12332:7;12328:23;12324:32;12321:52;;;12369:1;12366;12359:12;12321:52;12408:9;12395:23;12427:31;12452:5;12427:31;:::i;:::-;12477:5;-1:-1:-1;12534:2:1;12519:18;;12506:32;12547:30;12506:32;12547:30;:::i;13456:662::-;13510:5;13563:3;13556:4;13548:6;13544:17;13540:27;13530:55;;13581:1;13578;13571:12;13530:55;13617:6;13604:20;13643:4;13667:60;13683:43;13723:2;13683:43;:::i;13667:60::-;13761:15;;;13847:1;13843:10;;;;13831:23;;13827:32;;;13792:12;;;;13871:15;;;13868:35;;;13899:1;13896;13889:12;13868:35;13935:2;13927:6;13923:15;13947:142;13963:6;13958:3;13955:15;13947:142;;;14029:17;;14017:30;;14067:12;;;;13980;;13947:142;;14123:483;14216:6;14224;14277:2;14265:9;14256:7;14252:23;14248:32;14245:52;;;14293:1;14290;14283:12;14245:52;14332:9;14319:23;14351:31;14376:5;14351:31;:::i;:::-;14401:5;-1:-1:-1;14457:2:1;14442:18;;14429:32;14484:18;14473:30;;14470:50;;;14516:1;14513;14506:12;14470:50;14539:61;14592:7;14583:6;14572:9;14568:22;14539:61;:::i;:::-;14529:71;;;14123:483;;;;;:::o;14945:795::-;15040:6;15048;15056;15064;15117:3;15105:9;15096:7;15092:23;15088:33;15085:53;;;15134:1;15131;15124:12;15085:53;15173:9;15160:23;15192:31;15217:5;15192:31;:::i;:::-;15242:5;-1:-1:-1;15299:2:1;15284:18;;15271:32;15312:33;15271:32;15312:33;:::i;:::-;15364:7;-1:-1:-1;15418:2:1;15403:18;;15390:32;;-1:-1:-1;15473:2:1;15458:18;;15445:32;15500:18;15489:30;;15486:50;;;15532:1;15529;15522:12;15486:50;15555:22;;15608:4;15600:13;;15596:27;-1:-1:-1;15586:55:1;;15637:1;15634;15627:12;15586:55;15660:74;15726:7;15721:2;15708:16;15703:2;15699;15695:11;15660:74;:::i;:::-;15650:84;;;14945:795;;;;;;;:::o;15745:595::-;15863:6;15871;15924:2;15912:9;15903:7;15899:23;15895:32;15892:52;;;15940:1;15937;15930:12;15892:52;15980:9;15967:23;16009:18;16050:2;16042:6;16039:14;16036:34;;;16066:1;16063;16056:12;16036:34;16089:61;16142:7;16133:6;16122:9;16118:22;16089:61;:::i;:::-;16079:71;;16203:2;16192:9;16188:18;16175:32;16159:48;;16232:2;16222:8;16219:16;16216:36;;;16248:1;16245;16238:12;16216:36;;16271:63;16326:7;16315:8;16304:9;16300:24;16271:63;:::i;16345:241::-;16401:6;16454:2;16442:9;16433:7;16429:23;16425:32;16422:52;;;16470:1;16467;16460:12;16422:52;16509:9;16496:23;16528:28;16550:5;16528:28;:::i;16591:388::-;16659:6;16667;16720:2;16708:9;16699:7;16695:23;16691:32;16688:52;;;16736:1;16733;16726:12;16688:52;16775:9;16762:23;16794:31;16819:5;16794:31;:::i;:::-;16844:5;-1:-1:-1;16901:2:1;16886:18;;16873:32;16914:33;16873:32;16914:33;:::i;16984:821::-;17136:6;17144;17152;17205:2;17193:9;17184:7;17180:23;17176:32;17173:52;;;17221:1;17218;17211:12;17173:52;17261:9;17248:23;17290:18;17331:2;17323:6;17320:14;17317:34;;;17347:1;17344;17337:12;17317:34;17370:61;17423:7;17414:6;17403:9;17399:22;17370:61;:::i;:::-;17360:71;;17484:2;17473:9;17469:18;17456:32;17440:48;;17513:2;17503:8;17500:16;17497:36;;;17529:1;17526;17519:12;17497:36;17552:63;17607:7;17596:8;17585:9;17581:24;17552:63;:::i;:::-;17542:73;;17668:2;17657:9;17653:18;17640:32;17624:48;;17697:2;17687:8;17684:16;17681:36;;;17713:1;17710;17703:12;17681:36;;17736:63;17791:7;17780:8;17769:9;17765:24;17736:63;:::i;:::-;17726:73;;;16984:821;;;;;:::o;17810:437::-;17889:1;17885:12;;;;17932;;;17953:61;;18007:4;17999:6;17995:17;17985:27;;17953:61;18060:2;18052:6;18049:14;18029:18;18026:38;18023:218;;-1:-1:-1;;;18094:1:1;18087:88;18198:4;18195:1;18188:15;18226:4;18223:1;18216:15;18023:218;;17810:437;;;:::o;18252:184::-;-1:-1:-1;;;18301:1:1;18294:88;18401:4;18398:1;18391:15;18425:4;18422:1;18415:15;18441:128;18508:9;;;18529:11;;;18526:37;;;18543:18;;:::i;18927:184::-;-1:-1:-1;;;18976:1:1;18969:88;19076:4;19073:1;19066:15;19100:4;19097:1;19090:15;19466:135;19505:3;19526:17;;;19523:43;;19546:18;;:::i;:::-;-1:-1:-1;19593:1:1;19582:13;;19466:135::o;20020:184::-;20090:6;20143:2;20131:9;20122:7;20118:23;20114:32;20111:52;;;20159:1;20156;20149:12;20111:52;-1:-1:-1;20182:16:1;;20020:184;-1:-1:-1;20020:184:1:o;20511:245::-;20578:6;20631:2;20619:9;20610:7;20606:23;20602:32;20599:52;;;20647:1;20644;20637:12;20599:52;20679:9;20673:16;20698:28;20720:5;20698:28;:::i;20761:175::-;20798:3;20842:4;20835:5;20831:16;20871:4;20862:7;20859:17;20856:43;;20879:18;;:::i;:::-;20928:1;20915:15;;20761:175;-1:-1:-1;;20761:175:1:o;21344:168::-;21417:9;;;21448;;21465:15;;;21459:22;;21445:37;21435:71;;21486:18;;:::i;23222:125::-;23287:9;;;23308:10;;;23305:36;;;23321:18;;:::i;23478:545::-;23580:2;23575:3;23572:11;23569:448;;;23616:1;23641:5;23637:2;23630:17;23686:4;23682:2;23672:19;23756:2;23744:10;23740:19;23737:1;23733:27;23727:4;23723:38;23792:4;23780:10;23777:20;23774:47;;;-1:-1:-1;23815:4:1;23774:47;23870:2;23865:3;23861:12;23858:1;23854:20;23848:4;23844:31;23834:41;;23925:82;23943:2;23936:5;23933:13;23925:82;;;23988:17;;;23969:1;23958:13;23925:82;;24199:1352;24325:3;24319:10;24352:18;24344:6;24341:30;24338:56;;;24374:18;;:::i;:::-;24403:97;24493:6;24453:38;24485:4;24479:11;24453:38;:::i;:::-;24447:4;24403:97;:::i;:::-;24555:4;;24619:2;24608:14;;24636:1;24631:663;;;;25338:1;25355:6;25352:89;;;-1:-1:-1;25407:19:1;;;25401:26;25352:89;-1:-1:-1;;24156:1:1;24152:11;;;24148:24;24144:29;24134:40;24180:1;24176:11;;;24131:57;25454:81;;24601:944;;24631:663;23425:1;23418:14;;;23462:4;23449:18;;-1:-1:-1;;24667:20:1;;;24785:236;24799:7;24796:1;24793:14;24785:236;;;24888:19;;;24882:26;24867:42;;24980:27;;;;24948:1;24936:14;;;;24815:19;;24785:236;;;24789:3;25049:6;25040:7;25037:19;25034:201;;;25110:19;;;25104:26;-1:-1:-1;;25193:1:1;25189:14;;;25205:3;25185:24;25181:37;25177:42;25162:58;25147:74;;25034:201;-1:-1:-1;;;;;25281:1:1;25265:14;;;25261:22;25248:36;;-1:-1:-1;24199:1352:1:o;26111:251::-;26181:6;26234:2;26222:9;26213:7;26209:23;26205:32;26202:52;;;26250:1;26247;26240:12;26202:52;26282:9;26276:16;26301:31;26326:5;26301:31;:::i;26367:184::-;-1:-1:-1;;;26416:1:1;26409:88;26516:4;26513:1;26506:15;26540:4;26537:1;26530:15;26556:496;26735:3;26773:6;26767:13;26789:66;26848:6;26843:3;26836:4;26828:6;26824:17;26789:66;:::i;:::-;26918:13;;26877:16;;;;26940:70;26918:13;26877:16;26987:4;26975:17;;26940:70;:::i;:::-;27026:20;;26556:496;-1:-1:-1;;;;26556:496:1:o;27057:1322::-;27435:3;27464:1;27497:6;27491:13;27527:36;27553:9;27527:36;:::i;:::-;27582:1;27599:18;;;27626:133;;;;27773:1;27768:356;;;;27592:532;;27626:133;-1:-1:-1;;27659:24:1;;27647:37;;27732:14;;27725:22;27713:35;;27704:45;;;-1:-1:-1;27626:133:1;;27768:356;27799:6;27796:1;27789:17;27829:4;27874:2;27871:1;27861:16;27899:1;27913:165;27927:6;27924:1;27921:13;27913:165;;;28005:14;;27992:11;;;27985:35;28048:16;;;;27942:10;;27913:165;;;27917:3;;;28107:6;28102:3;28098:16;28091:23;;27592:532;;28145:3;28140;28133:16;28180:6;28174:13;28158:29;;28196:77;28264:8;28259:2;28254:3;28250:12;28243:4;28235:6;28231:17;28196:77;:::i;:::-;28339:7;28292:18;;;;28326:11;;;28319:28;;;;28371:1;28363:10;;27057:1322;-1:-1:-1;;;;;27057:1322:1:o;34546:512::-;34740:4;-1:-1:-1;;;;;34850:2:1;34842:6;34838:15;34827:9;34820:34;34902:2;34894:6;34890:15;34885:2;34874:9;34870:18;34863:43;;34942:6;34937:2;34926:9;34922:18;34915:34;34985:3;34980:2;34969:9;34965:18;34958:31;35006:46;35047:3;35036:9;35032:19;35024:6;35006:46;:::i;:::-;34998:54;34546:512;-1:-1:-1;;;;;;34546:512:1:o;35063:249::-;35132:6;35185:2;35173:9;35164:7;35160:23;35156:32;35153:52;;;35201:1;35198;35191:12;35153:52;35233:9;35227:16;35252:30;35276:5;35252:30;:::i;35317:184::-;-1:-1:-1;;;35366:1:1;35359:88;35466:4;35463:1;35456:15;35490:4;35487:1;35480:15;35506:120;35546:1;35572;35562:35;;35577:18;;:::i;:::-;-1:-1:-1;35611:9:1;;35506:120::o;35631:112::-;35663:1;35689;35679:35;;35694:18;;:::i;:::-;-1:-1:-1;35728:9:1;;35631:112::o
Swarm Source
ipfs://cee70ac57e621b75181506f217f9b9cdcabb3bf0cbae8b9c80d270d67adf1efa
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.