ERC-721
Overview
Max Total Supply
2,222 WAZA
Holders
676
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 WAZALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
wazzup
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-06 */ // File: contracts/whazzza.sol //////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////// ///////////////////////////////////////////////// /////////////////////////////////// ///////////////////////////////////////////////// ///////////////////////////////// /////////////////////////////////////////////// /////////////////////////////// ///////////////////////////////////////////// ///////////////////////////// /// // //////////////////////////////////////////// /////////////////////////// ////// //// /////////////////////////////////////////// ////////////////////////// //// ///// ////////////////////////////////////////// ////////////////////////// ///// ////////////////////////////////////////// /////////////////////////// /// //// ////////////////////////////////////////// //////////////////////////// ///// ////////////////////////////////////////// ///////////////////////////// ///////////////////////////////////////////// ////////////////////////////// ////// ///////////////////////////////////////////////// ////////////////////////////// //////// //////////////////////////////////////////////////// //////////////////////////// /////// ////////////////////////////////////////////////////// //////////////////////////// /////// //////////////////////////////////////////////////////// //////////////////////////// ////// ////////////////////////////////////////////////////////// //////////////////////////// ///// /////////////////////////////////////////////////////////// //////////////////////////// //// //////////////////////////////////////////////////////////// //////////////////////////// /// /////////////////////////////////////////////////////////////// //////////////////////////// /// /////////////////////////////////////////////////////////////// /////////////////////////////……………//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol 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); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @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] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: ECDSA.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ 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 proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _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} * * _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 the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild 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 for 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) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild 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 for 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) { 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) } } } // File: Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: Payment.sol // OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract Payment is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File: IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, 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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; // function _burn(uint256 tokenId) external; // function _isApprovedOrOwner(address spender, uint256 tokenId) external view returns (bool); } // File: IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: ERC721A.sol pragma solidity ^0.8.0; contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable, Ownable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 internal currentIndex; // 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_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), 'ERC721A: global index out of bounds'); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), 'ERC721A: owner index out of bounds'); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert('ERC721A: unable to get token of owner by index'); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), 'ERC721A: balance query for the zero address'); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require(owner != address(0), 'ERC721A: number minted query for the zero address'); return uint256(_addressData[owner].numberMinted); } /** * 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) { require(_exists(tokenId), 'ERC721A: owner query for nonexistent token'); unchecked { for (uint256 curr = tokenId; curr >= 0; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } revert('ERC721A: unable to determine the owner of token'); } /** * @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) { require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString(),".json")) : ''; } /** * @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); require(to != owner, 'ERC721A: approval to current owner'); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721A: approve caller is not owner nor approved for all' ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), 'ERC721A: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), 'ERC721A: approve to caller'); _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 override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } /** * @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 tokenId < currentIndex; } 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 { _mint(to, quantity, _data, true); } /** * @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, bytes memory _data, bool safe ) internal { uint256 startTokenId = currentIndex; require(to != address(0), 'ERC721A: mint to the zero address'); require(quantity != 0, 'ERC721A: quantity must be greater than 0'); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1 unchecked { _addressData[to].balance += uint128(quantity); _addressData[to].numberMinted += uint128(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { require( _checkOnERC721Received(address(0), to, updatedIndex, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } updatedIndex++; } 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); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved'); require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner'); require(to != address(0), 'ERC721A: transfer to the zero address'); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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; _ownerships[tokenId].addr = to; _ownerships[tokenId].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; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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 address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert('ERC721A: transfer to non ERC721Receiver implementer'); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * 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`. */ 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. * * 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` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721A.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function _burn(uint256 tokenId) internal virtual { address owner = ownerOf(tokenId); _beforeTokenTransfers(owner, address(0), tokenId, 1); // Clear approvals _approve(address(0), tokenId, owner); // _balances[owner] -= 1; // ERC721 // delete _owners[tokenId]; // ERC721 _addressData[owner].balance -= 1; _ownerships[tokenId].addr = address(0); _ownerships[tokenId].startTimestamp = uint64(block.timestamp); delete _ownerships[tokenId]; emit Transfer(owner, address(0), tokenId); } } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ /* abstract contract ERC721Burnable is Context, ERC721A { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - T* // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inhezriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _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() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } pragma solidity ^0.8.0; contract AccessControl { mapping(bytes32 => mapping(address => bool)) public roles; bytes32 internal constant ADMIN = keccak256(abi.encodePacked("ADMIN")); // 0xdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42 bytes32 internal constant TEAM = keccak256(abi.encodePacked("TEAM")); // 0x9b82d2f38fbdf13006bfa741767f793d917e063392737837b580c1c2b1e0bab3 modifier onlyRole(bytes32 _role) { require(roles[_role][msg.sender], " not authorized"); _; } constructor(){ _grantRole(ADMIN, msg.sender); } function _grantRole(bytes32 _role, address _account) internal { roles[_role][_account] = true; } function grantRole(bytes32 _role, address _account) external onlyRole(ADMIN){ _grantRole(_role, _account); } function revokeRole(bytes32 _role, address _account) external onlyRole(ADMIN){ roles[_role][_account] = false; } } pragma solidity ^0.8.2; contract wazzup is ERC721A, ReentrancyGuard, AccessControl { using Strings for uint256; string public _partslink; string public _goldlink; string public _diamondlink; string public unrevealedTokenUri; address treasury = 0x1405A3B36E7dc20c53541F4078Da28652Bf2A3Ad; bool public isOpen = false; bool public isOpen1 = false; bool public isOpen5 = false; bool public isRevealed = false; uint256 public maxSupply = 2222; uint256 public newmaxSupply = 3222; uint256 public maxToMint = 3; uint256 public maxForList5 = 5; uint256 public price = 0.10 ether; mapping(address => uint256) public howmany; mapping(address => uint256) public howmanyList1; mapping(address => uint256) public howmanyList5; mapping(address => uint256) public howmanyNew; mapping(uint256 => bool) public isGold; mapping(uint256 => bool) public isDiamond; bytes32 public root1; bytes32 public root5; constructor() ERC721A("wazzzup.wtf", "WAZA") { unrevealedTokenUri = "ar://icjZER6w3kMqmtX3jqQ6JiE4kCfpzvUSYMRnyNRQKSc"; } function _baseURI() internal view virtual override returns (string memory) { return _partslink; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory baseURI; baseURI = _partslink; if (isGold[tokenId]) { baseURI = _goldlink; } if (isDiamond[tokenId]) { baseURI = _diamondlink; } if (isRevealed) { return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString(),".json")) : ''; } else { return unrevealedTokenUri; } } function isWhiteListed5(address account, bytes32[] calldata proof) internal view returns(bool) { return _verify5(_leaf(account), proof); } function isWhiteListed1(address account, bytes32[] calldata proof) internal view returns(bool) { return _verify1(_leaf(account), proof); } function mintList5(uint256 _amount, bytes32[] calldata proof) external payable { require(isOpen5,"whitelist mint not open"); require(isWhiteListed5(msg.sender, proof), "Not on the whitelist"); uint256 totSupply = totalSupply(); require(totSupply + _amount <= maxSupply); require(msg.sender == tx.origin); require(howmanyList5[msg.sender] + _amount <= maxForList5,"mint limit reach"); _safeMint(msg.sender, _amount); howmanyList5[msg.sender] += _amount; } function mintList1(uint256 _amount, bytes32[] calldata proof) external payable { require(isOpen1,"whitelist mint not open"); require(isWhiteListed1(msg.sender, proof), "Not on the whitelist"); uint256 totSupply = totalSupply(); require(totSupply + _amount <= maxSupply); require(msg.sender == tx.origin); require(howmanyList1[msg.sender] + _amount <= 1,"mint limit reach"); _safeMint(msg.sender, _amount); howmanyList1[msg.sender] += _amount; } function setRoot5(bytes32 _root) external onlyOwner { root5 = _root; } function setRoot1(bytes32 _root) external onlyOwner { root1 = _root; } function _leaf(address account) internal pure returns(bytes32) { return keccak256(abi.encodePacked(account)); } function _verify5(bytes32 leaf, bytes32[] memory proof) internal view returns(bool) { return MerkleProof.verify(proof, root5, leaf); } function _verify1(bytes32 leaf, bytes32[] memory proof) internal view returns(bool) { return MerkleProof.verify(proof, root1, leaf); } function mintWazza(uint256 _amount) external nonReentrant { uint256 totSupply = totalSupply(); require(isOpen,"mint not open"); require(totSupply + _amount <= maxSupply,"sold out"); require(msg.sender == tx.origin); require(howmany[msg.sender] + _amount <= maxToMint,"mint limit reach"); _safeMint(msg.sender, _amount); howmany[msg.sender] += _amount; } function makeItFly(address happyfew, uint256 _amount) public onlyOwner { uint256 totSupply = totalSupply(); require(totSupply + _amount <= maxSupply); _safeMint(happyfew, _amount); } function mintNewOnes(uint256 _amount) external payable nonReentrant { uint256 totSupply = totalSupply(); require(isOpen, "mint not open"); require(totSupply + _amount > maxSupply); require(totSupply + _amount <= newmaxSupply,"sold out"); require(price * _amount <= msg.value,"not enough eth sent"); require(msg.sender == tx.origin); require(howmanyNew[msg.sender] + _amount <= maxToMint,"mint limit reach"); _safeMint(msg.sender, _amount); howmanyNew[msg.sender] += _amount; } function setMaxSupply(uint256 _max) external onlyOwner { maxSupply = _max; } function setNewSupply(uint256 _max) external onlyOwner { newmaxSupply = _max; } function setMaxForList5(uint256 _max) external onlyOwner { maxForList5 = _max; } function addToGoldList(uint256 _id) external onlyRole(TEAM) { isGold[_id] = true; } function addToDiamondList(uint256 _id) external onlyRole(TEAM) { isDiamond[_id] = true; } function cancelfromGoldList(uint256 _id) external onlyRole(TEAM) { isGold[_id] = false; } function cancelfromDiamondList(uint256 _id) external onlyRole(TEAM) { isDiamond[_id] = false; } function toggleOpen() external onlyOwner { isOpen = !isOpen; } function toggleOpen1() external onlyOwner { isOpen1 = !isOpen1; } function toggleOpen5() external onlyOwner { isOpen5 = !isOpen5; } function togglereveal() external onlyOwner { isRevealed = !isRevealed; } function increaseMintLimit(uint256 _limit) external onlyOwner { maxToMint = _limit; } function setMintPriceinCents(uint256 _pricecents) external onlyOwner { price = _pricecents * 1e16; } function seturi(string memory uri_) external onlyOwner { _partslink = uri_; } function setGolduri(string memory uri_) external onlyOwner { _goldlink = uri_; } function setDiamonduri(string memory uri_) external onlyOwner { _diamondlink = uri_; } function setUnrevealuri(string memory uri_) external onlyOwner { unrevealedTokenUri = uri_; } function setTreasury(address _addr) external onlyOwner { treasury = _addr; } function getfundsToOwner() public payable onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success); } function withdraw() external { require(address(this).balance > 0, "0 balance"); uint256 balance = address(this).balance; Address.sendValue(payable(treasury), balance); } function burn(uint256 tokenId) public virtual onlyOwner { //solhint-disable-next-line max-line-length // require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_diamondlink","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_goldlink","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_partslink","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"addToDiamondList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"addToGoldList","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":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"cancelfromDiamondList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"cancelfromGoldList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getfundsToOwner","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"howmany","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"howmanyList1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"howmanyList5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"howmanyNew","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"increaseMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isDiamond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isGold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOpen1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOpen5","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"happyfew","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"makeItFly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxForList5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintList1","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintList5","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintNewOnes","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintWazza","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newmaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"roles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"root1","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"root5","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setDiamonduri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setGolduri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxForList5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pricecents","type":"uint256"}],"name":"setMintPriceinCents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setNewSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setUnrevealuri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"seturi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleOpen1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleOpen5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglereveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600e80546001600160c01b031916731405a3b36e7dc20c53541f4078da28652bf2a3ad1790556108ae600f55610c966010556003601155600560125567016345785d8a00006013553480156200005957600080fd5b506040518060400160405280600b81526020016a3bb0bd3d3d3ab8173bba3360a91b8152506040518060400160405280600481526020016357415a4160e01b815250620000b5620000af6200015b60201b60201c565b6200015f565b8151620000ca906002906020850190620001df565b508051620000e0906003906020840190620001df565b50506001600855506040516420a226a4a760d91b602082015262000124906025016040516020818303038152906040528051906020012033620001af60201b60201c565b60405180606001604052806030815260200162003b876030913980516200015491600d91602090910190620001df565b50620002c2565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60009182526009602090815260408084206001600160a01b0390931684529190529020805460ff19166001179055565b828054620001ed9062000285565b90600052602060002090601f0160209004810192826200021157600085556200025c565b82601f106200022c57805160ff19168380011785556200025c565b828001600101855582156200025c579182015b828111156200025c5782518255916020019190600101906200023f565b506200026a9291506200026e565b5090565b5b808211156200026a57600081556001016200026f565b600181811c908216806200029a57607f821691505b60208210811415620002bc57634e487b7160e01b600052602260045260246000fd5b50919050565b6138b580620002d26000396000f3fe6080604052600436106104105760003560e01c806369040b441161021e578063b88d4fde11610123578063e36928f9116100ab578063f2fde38b1161007a578063f2fde38b14610bfa578063f56257d414610c1a578063f648498014610c4a578063f8fc08b914610c6a578063fc865a6314610ca557600080fd5b8063e36928f914610b51578063e985e9c514610b71578063eef6ed5414610bba578063f0f4426014610bda57600080fd5b8063d40697cf116100f2578063d40697cf14610ab8578063d547741f14610ae5578063d5abeb0114610b05578063e19be67214610b1b578063e28942a014610b3157600080fd5b8063b88d4fde14610a50578063beef729214610a70578063c4ae75e514610a78578063c87b56dd14610a9857600080fd5b8063940c70d5116101a6578063a22cb46511610175578063a22cb465146109d1578063a58c203f146109f1578063a6fb9c9c14610a06578063a7b7229414610a1b578063a7cc27d914610a3057600080fd5b8063940c70d51461097057806395d89b41146109905780639b81eb43146109a5578063a035b1fe146109bb57600080fd5b8063715018a6116101ed578063715018a6146108e75780637a19ff96146108fc5780638b4feb6a1461091c5780638da5cb5b146109325780638ec40a541461095057600080fd5b806369040b441461087f5780636e4d56e5146108945780636f8b44b0146108a757806370a08231146108c757600080fd5b8063323bf8ec116103245780634f6ccce7116102ac5780635be2d7371161027b5780635be2d737146107ec57806361f12ee9146107ff578063628e87351461081f5780636352211e1461083f57806368b568151461085f57600080fd5b80634f6ccce71461076a57806351c4998e1461078a578063540020d6146107aa57806354214f69146107cb57600080fd5b806342966c68116102f357806342966c68146106ab578063436380aa146106cb57806347535d7b146106ec5780634878f78f1461070d5780634d336ad71461073d57600080fd5b8063323bf8ec1461063457806339189d97146106615780633ccfd60b1461067657806342842e0e1461068b57600080fd5b806317823623116103a757806323b872dd1161037657806323b872dd1461059f5780632bf2e635146105bf5780632f2ff15d146105df5780632f745c59146105ff5780633232deeb1461061f57600080fd5b8063178236231461053457806318160ddd146105475780631f8d5ce01461055c57806323066b5f1461057257600080fd5b8063081812fc116103e3578063081812fc146104a3578063095ea7b3146104db5780630ba133c5146104fb5780630dc982991461051f57600080fd5b806301ffc9a714610415578063027f979a1461044a57806306c536ab1461046c57806306fdde031461048e575b600080fd5b34801561042157600080fd5b5061043561043036600461323b565b610cc5565b60405190151581526020015b60405180910390f35b34801561045657600080fd5b5061046a610465366004613258565b610d32565b005b34801561047857600080fd5b50610481610d6a565b60405161044191906132c9565b34801561049a57600080fd5b50610481610df8565b3480156104af57600080fd5b506104c36104be366004613258565b610e8a565b6040516001600160a01b039091168152602001610441565b3480156104e757600080fd5b5061046a6104f63660046132f8565b610f15565b34801561050757600080fd5b5061051160115481565b604051908152602001610441565b34801561052b57600080fd5b5061046a61102d565b61046a610542366004613258565b611078565b34801561055357600080fd5b50600154610511565b34801561056857600080fd5b5061051160105481565b34801561057e57600080fd5b5061051161058d366004613322565b60166020526000908152604090205481565b3480156105ab57600080fd5b5061046a6105ba36600461333d565b611256565b3480156105cb57600080fd5b5061046a6105da366004613405565b611261565b3480156105eb57600080fd5b5061046a6105fa36600461344e565b6112a2565b34801561060b57600080fd5b5061051161061a3660046132f8565b611334565b34801561062b57600080fd5b5061048161149c565b34801561064057600080fd5b5061051161064f366004613322565b60156020526000908152604090205481565b34801561066d57600080fd5b5061046a6114a9565b34801561068257600080fd5b5061046a6114f4565b34801561069757600080fd5b5061046a6106a636600461333d565b61154b565b3480156106b757600080fd5b5061046a6106c6366004613258565b611566565b3480156106d757600080fd5b50600e5461043590600160a81b900460ff1681565b3480156106f857600080fd5b50600e5461043590600160a01b900460ff1681565b34801561071957600080fd5b50610435610728366004613258565b60186020526000908152604090205460ff1681565b34801561074957600080fd5b50610511610758366004613322565b60146020526000908152604090205481565b34801561077657600080fd5b50610511610785366004613258565b611599565b34801561079657600080fd5b5061046a6107a5366004613258565b611602565b3480156107b657600080fd5b50600e5461043590600160b01b900460ff1681565b3480156107d757600080fd5b50600e5461043590600160b81b900460ff1681565b61046a6107fa36600461347a565b611631565b34801561080b57600080fd5b5061046a61081a366004613258565b611774565b34801561082b57600080fd5b5061046a61083a366004613258565b6117ec565b34801561084b57600080fd5b506104c361085a366004613258565b61181b565b34801561086b57600080fd5b5061046a61087a366004613258565b61182d565b34801561088b57600080fd5b5061046a6118a8565b61046a6108a236600461347a565b6118f3565b3480156108b357600080fd5b5061046a6108c2366004613258565b611a2b565b3480156108d357600080fd5b506105116108e2366004613322565b611a5a565b3480156108f357600080fd5b5061046a611aeb565b34801561090857600080fd5b5061046a610917366004613258565b611b21565b34801561092857600080fd5b50610511601a5481565b34801561093e57600080fd5b506000546001600160a01b03166104c3565b34801561095c57600080fd5b5061046a61096b366004613258565b611b50565b34801561097c57600080fd5b5061046a61098b366004613405565b611bc8565b34801561099c57600080fd5b50610481611c05565b3480156109b157600080fd5b50610511601b5481565b3480156109c757600080fd5b5061051160135481565b3480156109dd57600080fd5b5061046a6109ec3660046134f9565b611c14565b3480156109fd57600080fd5b50610481611cd9565b348015610a1257600080fd5b50610481611ce6565b348015610a2757600080fd5b5061046a611cf3565b348015610a3c57600080fd5b5061046a610a4b366004613258565b611d3e565b348015610a5c57600080fd5b5061046a610a6b366004613535565b611db9565b61046a611df2565b348015610a8457600080fd5b5061046a610a933660046132f8565b611e71565b348015610aa457600080fd5b50610481610ab3366004613258565b611ecb565b348015610ac457600080fd5b50610511610ad3366004613322565b60176020526000908152604090205481565b348015610af157600080fd5b5061046a610b0036600461344e565b61220e565b348015610b1157600080fd5b50610511600f5481565b348015610b2757600080fd5b5061051160125481565b348015610b3d57600080fd5b5061046a610b4c366004613258565b61229c565b348015610b5d57600080fd5b5061046a610b6c366004613258565b6122dd565b348015610b7d57600080fd5b50610435610b8c3660046135b1565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610bc657600080fd5b5061046a610bd5366004613405565b61230c565b348015610be657600080fd5b5061046a610bf5366004613322565b612349565b348015610c0657600080fd5b5061046a610c15366004613322565b612395565b348015610c2657600080fd5b50610435610c35366004613258565b60196020526000908152604090205460ff1681565b348015610c5657600080fd5b5061046a610c65366004613405565b61242d565b348015610c7657600080fd5b50610435610c8536600461344e565b600960209081526000928352604080842090915290825290205460ff1681565b348015610cb157600080fd5b5061046a610cc0366004613258565b61246a565b60006001600160e01b031982166380ac58cd60e01b1480610cf657506001600160e01b03198216635b5e139f60e01b145b80610d1157506001600160e01b0319821663780e9d6360e01b145b80610d2c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b03163314610d655760405162461bcd60e51b8152600401610d5c906135db565b60405180910390fd5b601055565b600d8054610d7790613610565b80601f0160208091040260200160405190810160405280929190818152602001828054610da390613610565b8015610df05780601f10610dc557610100808354040283529160200191610df0565b820191906000526020600020905b815481529060010190602001808311610dd357829003601f168201915b505050505081565b606060028054610e0790613610565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3390613610565b8015610e805780601f10610e5557610100808354040283529160200191610e80565b820191906000526020600020905b815481529060010190602001808311610e6357829003601f168201915b5050505050905090565b6000610e97826001541190565b610ef95760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610d5c565b506000908152600660205260409020546001600160a01b031690565b6000610f208261181b565b9050806001600160a01b0316836001600160a01b03161415610f8f5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610d5c565b336001600160a01b0382161480610fab5750610fab8133610b8c565b61101d5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610d5c565b6110288383836125d0565b505050565b6000546001600160a01b031633146110575760405162461bcd60e51b8152600401610d5c906135db565b600e805460ff60a81b198116600160a81b9182900460ff1615909102179055565b600260085414156110cb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d5c565b600260085560006110db60015490565b600e54909150600160a01b900460ff166111275760405162461bcd60e51b815260206004820152600d60248201526c36b4b73a103737ba1037b832b760991b6044820152606401610d5c565b600f54611134838361365b565b1161113e57600080fd5b60105461114b838361365b565b11156111845760405162461bcd60e51b81526020600482015260086024820152671cdbdb19081bdd5d60c21b6044820152606401610d5c565b34826013546111939190613673565b11156111d75760405162461bcd60e51b81526020600482015260136024820152721b9bdd08195b9bdd59da08195d1a081cd95b9d606a1b6044820152606401610d5c565b3332146111e357600080fd5b6011543360009081526017602052604090205461120190849061365b565b111561121f5760405162461bcd60e51b8152600401610d5c90613692565b611229338361262c565b336000908152601760205260408120805484929061124890849061365b565b909155505060016008555050565b611028838383612646565b6000546001600160a01b0316331461128b5760405162461bcd60e51b8152600401610d5c906135db565b805161129e90600d906020840190613195565b5050565b6040516420a226a4a760d91b602082015260250160408051601f19818403018152918152815160209283012060008181526009845282812033825290935291205460ff166113025760405162461bcd60e51b8152600401610d5c906136bc565b5060009182526009602090815260408084206001600160a01b039390931684529190529020805460ff19166001179055565b600061133f83611a5a565b82106113985760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610d5c565b60006113a360015490565b905060008060005b8381101561143c576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156113fe57805192505b876001600160a01b0316836001600160a01b03161415611433578684141561142c57509350610d2c92505050565b6001909301925b506001016113ab565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610d5c565b600a8054610d7790613610565b6000546001600160a01b031633146114d35760405162461bcd60e51b8152600401610d5c906135db565b600e805460ff60b81b198116600160b81b9182900460ff1615909102179055565b600047116115305760405162461bcd60e51b8152602060048201526009602482015268302062616c616e636560b81b6044820152606401610d5c565b600e544790611548906001600160a01b03168261292b565b50565b61102883838360405180602001604052806000815250611db9565b6000546001600160a01b031633146115905760405162461bcd60e51b8152600401610d5c906135db565b61154881612a44565b60006115a460015490565b82106115fe5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610d5c565b5090565b6000546001600160a01b0316331461162c5760405162461bcd60e51b8152600401610d5c906135db565b601a55565b600e54600160a81b900460ff166116845760405162461bcd60e51b81526020600482015260176024820152763bb434ba32b634b9ba1036b4b73a103737ba1037b832b760491b6044820152606401610d5c565b61168f338383612b1d565b6116d25760405162461bcd60e51b8152602060048201526014602482015273139bdd081bdb881d1a19481dda1a5d195b1a5cdd60621b6044820152606401610d5c565b60006116dd60015490565b600f549091506116ed858361365b565b11156116f857600080fd5b33321461170457600080fd5b3360009081526015602052604090205460019061172290869061365b565b11156117405760405162461bcd60e51b8152600401610d5c90613692565b61174a338561262c565b336000908152601560205260408120805486929061176990849061365b565b909155505050505050565b604051635445414d60e01b602082015260240160408051601f19818403018152918152815160209283012060008181526009845282812033825290935291205460ff166117d35760405162461bcd60e51b8152600401610d5c906136bc565b506000908152601960205260409020805460ff19169055565b6000546001600160a01b031633146118165760405162461bcd60e51b8152600401610d5c906135db565b601155565b600061182682612b6c565b5192915050565b604051635445414d60e01b602082015260240160408051601f19818403018152918152815160209283012060008181526009845282812033825290935291205460ff1661188c5760405162461bcd60e51b8152600401610d5c906136bc565b506000908152601860205260409020805460ff19166001179055565b6000546001600160a01b031633146118d25760405162461bcd60e51b8152600401610d5c906135db565b600e805460ff60b01b198116600160b01b9182900460ff1615909102179055565b600e54600160b01b900460ff166119465760405162461bcd60e51b81526020600482015260176024820152763bb434ba32b634b9ba1036b4b73a103737ba1037b832b760491b6044820152606401610d5c565b611951338383612c43565b6119945760405162461bcd60e51b8152602060048201526014602482015273139bdd081bdb881d1a19481dda1a5d195b1a5cdd60621b6044820152606401610d5c565b600061199f60015490565b600f549091506119af858361365b565b11156119ba57600080fd5b3332146119c657600080fd5b601254336000908152601660205260409020546119e490869061365b565b1115611a025760405162461bcd60e51b8152600401610d5c90613692565b611a0c338561262c565b336000908152601660205260408120805486929061176990849061365b565b6000546001600160a01b03163314611a555760405162461bcd60e51b8152600401610d5c906135db565b600f55565b60006001600160a01b038216611ac65760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610d5c565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b03163314611b155760405162461bcd60e51b8152600401610d5c906135db565b611b1f6000612c8a565b565b6000546001600160a01b03163314611b4b5760405162461bcd60e51b8152600401610d5c906135db565b601255565b604051635445414d60e01b602082015260240160408051601f19818403018152918152815160209283012060008181526009845282812033825290935291205460ff16611baf5760405162461bcd60e51b8152600401610d5c906136bc565b506000908152601860205260409020805460ff19169055565b6000546001600160a01b03163314611bf25760405162461bcd60e51b8152600401610d5c906135db565b805161129e90600c906020840190613195565b606060038054610e0790613610565b6001600160a01b038216331415611c6d5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610d5c565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c8054610d7790613610565b600b8054610d7790613610565b6000546001600160a01b03163314611d1d5760405162461bcd60e51b8152600401610d5c906135db565b600e805460ff60a01b198116600160a01b9182900460ff1615909102179055565b604051635445414d60e01b602082015260240160408051601f19818403018152918152815160209283012060008181526009845282812033825290935291205460ff16611d9d5760405162461bcd60e51b8152600401610d5c906136bc565b506000908152601960205260409020805460ff19166001179055565b611dc4848484612646565b611dd084848484612cda565b611dec5760405162461bcd60e51b8152600401610d5c906136e5565b50505050565b6000546001600160a01b03163314611e1c5760405162461bcd60e51b8152600401610d5c906135db565b604051600090339047908381818185875af1925050503d8060008114611e5e576040519150601f19603f3d011682016040523d82523d6000602084013e611e63565b606091505b505090508061154857600080fd5b6000546001600160a01b03163314611e9b5760405162461bcd60e51b8152600401610d5c906135db565b6000611ea660015490565b600f54909150611eb6838361365b565b1115611ec157600080fd5b611028838361262c565b6060611ed8826001541190565b611f3c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d5c565b6060600a8054611f4b90613610565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7790613610565b8015611fc45780601f10611f9957610100808354040283529160200191611fc4565b820191906000526020600020905b815481529060010190602001808311611fa757829003601f168201915b505050600086815260186020526040902054929350505060ff161561207157600b8054611ff090613610565b80601f016020809104026020016040519081016040528092919081815260200182805461201c90613610565b80156120695780601f1061203e57610100808354040283529160200191612069565b820191906000526020600020905b81548152906001019060200180831161204c57829003601f168201915b505050505090505b60008381526019602052604090205460ff161561211657600c805461209590613610565b80601f01602080910402602001604051908101604052809291908181526020018280546120c190613610565b801561210e5780601f106120e35761010080835404028352916020019161210e565b820191906000526020600020905b8154815290600101906020018083116120f157829003601f168201915b505050505090505b600e54600160b81b900460ff1615612175578051612143576040518060200160405280600081525061216e565b8061214d84612dd8565b60405160200161215e929190613738565b6040516020818303038152906040525b9392505050565b600d805461218290613610565b80601f01602080910402602001604051908101604052809291908181526020018280546121ae90613610565b80156121fb5780601f106121d0576101008083540402835291602001916121fb565b820191906000526020600020905b8154815290600101906020018083116121de57829003601f168201915b5050505050915050919050565b50919050565b6040516420a226a4a760d91b602082015260250160408051601f19818403018152918152815160209283012060008181526009845282812033825290935291205460ff1661226e5760405162461bcd60e51b8152600401610d5c906136bc565b5060009182526009602090815260408084206001600160a01b0390931684529190529020805460ff19169055565b6000546001600160a01b031633146122c65760405162461bcd60e51b8152600401610d5c906135db565b6122d781662386f26fc10000613673565b60135550565b6000546001600160a01b031633146123075760405162461bcd60e51b8152600401610d5c906135db565b601b55565b6000546001600160a01b031633146123365760405162461bcd60e51b8152600401610d5c906135db565b805161129e90600b906020840190613195565b6000546001600160a01b031633146123735760405162461bcd60e51b8152600401610d5c906135db565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146123bf5760405162461bcd60e51b8152600401610d5c906135db565b6001600160a01b0381166124245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d5c565b61154881612c8a565b6000546001600160a01b031633146124575760405162461bcd60e51b8152600401610d5c906135db565b805161129e90600a906020840190613195565b600260085414156124bd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d5c565b600260085560006124cd60015490565b600e54909150600160a01b900460ff166125195760405162461bcd60e51b815260206004820152600d60248201526c36b4b73a103737ba1037b832b760991b6044820152606401610d5c565b600f54612526838361365b565b111561255f5760405162461bcd60e51b81526020600482015260086024820152671cdbdb19081bdd5d60c21b6044820152606401610d5c565b33321461256b57600080fd5b6011543360009081526014602052604090205461258990849061365b565b11156125a75760405162461bcd60e51b8152600401610d5c90613692565b6125b1338361262c565b336000908152601460205260408120805484929061124890849061365b565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61129e828260405180602001604052806000815250612ed6565b600061265182612b6c565b80519091506000906001600160a01b0316336001600160a01b0316148061268857503361267d84610e8a565b6001600160a01b0316145b8061269a5750815161269a9033610b8c565b9050806127045760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610d5c565b846001600160a01b031682600001516001600160a01b0316146127785760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610d5c565b6001600160a01b0384166127dc5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610d5c565b6127ec60008484600001516125d0565b6001600160a01b03858116600090815260056020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600490935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff16021790559086018083529120549091166128e157612894816001541190565b156128e1578251600082815260046020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b8047101561297b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d5c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146129c8576040519150601f19603f3d011682016040523d82523d6000602084013e6129cd565b606091505b50509050806110285760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d5c565b6000612a4f8261181b565b9050612a5d600083836125d0565b6001600160a01b0381166000908152600560205260408120805460019290612a8f9084906001600160801b0316613777565b82546001600160801b039182166101009390930a928302919092021990911617905550600082815260046020526040808220805467ffffffffffffffff4216600160a01b026001600160e01b03199081169116179055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000612b64612b2b85612ee3565b848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612f2292505050565b949350505050565b6040805180820190915260008082526020820152612b8b826001541190565b612bea5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610d5c565b815b6000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612c39579392505050565b5060001901612bec565b6000612b64612c5185612ee3565b848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612f3192505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b15612dcd57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d1e90339089908890889060040161379f565b6020604051808303816000875af1925050508015612d59575060408051601f3d908101601f19168201909252612d56918101906137dc565b60015b612db3573d808015612d87576040519150601f19603f3d011682016040523d82523d6000602084013e612d8c565b606091505b508051612dab5760405162461bcd60e51b8152600401610d5c906136e5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612b64565b506001949350505050565b606081612dfc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e265780612e10816137f9565b9150612e1f9050600a8361382a565b9150612e00565b60008167ffffffffffffffff811115612e4157612e41613379565b6040519080825280601f01601f191660200182016040528015612e6b576020820181803683370190505b5090505b8415612b6457612e8060018361383e565b9150612e8d600a86613855565b612e9890603061365b565b60f81b818381518110612ead57612ead613869565b60200101906001600160f81b031916908160001a905350612ecf600a8661382a565b9450612e6f565b6110288383836001612f40565b6040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b600061216e82601a5485613103565b600061216e82601b5485613103565b6001546001600160a01b038516612fa35760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610d5c565b836130015760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610d5c565b6001600160a01b03851660008181526005602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526004909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b858110156130fa5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483156130ee576130d26000888488612cda565b6130ee5760405162461bcd60e51b8152600401610d5c906136e5565b6001918201910161307f565b50600155612924565b6000826131108584613119565b14949350505050565b600081815b845181101561315e5761314a8286838151811061313d5761313d613869565b6020026020010151613166565b915080613156816137f9565b91505061311e565b509392505050565b600081831061318257600082815260208490526040902061216e565b600083815260208390526040902061216e565b8280546131a190613610565b90600052602060002090601f0160209004810192826131c35760008555613209565b82601f106131dc57805160ff1916838001178555613209565b82800160010185558215613209579182015b828111156132095782518255916020019190600101906131ee565b506115fe9291505b808211156115fe5760008155600101613211565b6001600160e01b03198116811461154857600080fd5b60006020828403121561324d57600080fd5b813561216e81613225565b60006020828403121561326a57600080fd5b5035919050565b60005b8381101561328c578181015183820152602001613274565b83811115611dec5750506000910152565b600081518084526132b5816020860160208601613271565b601f01601f19169290920160200192915050565b60208152600061216e602083018461329d565b80356001600160a01b03811681146132f357600080fd5b919050565b6000806040838503121561330b57600080fd5b613314836132dc565b946020939093013593505050565b60006020828403121561333457600080fd5b61216e826132dc565b60008060006060848603121561335257600080fd5b61335b846132dc565b9250613369602085016132dc565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156133aa576133aa613379565b604051601f8501601f19908116603f011681019082821181831017156133d2576133d2613379565b816040528093508581528686860111156133eb57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561341757600080fd5b813567ffffffffffffffff81111561342e57600080fd5b8201601f8101841361343f57600080fd5b612b648482356020840161338f565b6000806040838503121561346157600080fd5b82359150613471602084016132dc565b90509250929050565b60008060006040848603121561348f57600080fd5b83359250602084013567ffffffffffffffff808211156134ae57600080fd5b818601915086601f8301126134c257600080fd5b8135818111156134d157600080fd5b8760208260051b85010111156134e657600080fd5b6020830194508093505050509250925092565b6000806040838503121561350c57600080fd5b613515836132dc565b91506020830135801515811461352a57600080fd5b809150509250929050565b6000806000806080858703121561354b57600080fd5b613554856132dc565b9350613562602086016132dc565b925060408501359150606085013567ffffffffffffffff81111561358557600080fd5b8501601f8101871361359657600080fd5b6135a58782356020840161338f565b91505092959194509250565b600080604083850312156135c457600080fd5b6135cd836132dc565b9150613471602084016132dc565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061362457607f821691505b6020821081141561220857634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561366e5761366e613645565b500190565b600081600019048311821515161561368d5761368d613645565b500290565b60208082526010908201526f0dad2dce840d8d2dad2e840e4cac2c6d60831b604082015260600190565b6020808252600f908201526e081b9bdd08185d5d1a1bdc9a5e9959608a1b604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6000835161374a818460208801613271565b83519083019061375e818360208801613271565b64173539b7b760d91b9101908152600501949350505050565b60006001600160801b038381169083168181101561379757613797613645565b039392505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137d29083018461329d565b9695505050505050565b6000602082840312156137ee57600080fd5b815161216e81613225565b600060001982141561380d5761380d613645565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261383957613839613814565b500490565b60008282101561385057613850613645565b500390565b60008261386457613864613814565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220ca37819d6340e150e33b89f89d2fc0ec23b3897f2c0659aee909af17234872a264736f6c634300080b003361723a2f2f69636a5a45523677336b4d716d7458336a7151364a6945346b4366707a765553594d526e794e52514b5363
Deployed Bytecode
0x6080604052600436106104105760003560e01c806369040b441161021e578063b88d4fde11610123578063e36928f9116100ab578063f2fde38b1161007a578063f2fde38b14610bfa578063f56257d414610c1a578063f648498014610c4a578063f8fc08b914610c6a578063fc865a6314610ca557600080fd5b8063e36928f914610b51578063e985e9c514610b71578063eef6ed5414610bba578063f0f4426014610bda57600080fd5b8063d40697cf116100f2578063d40697cf14610ab8578063d547741f14610ae5578063d5abeb0114610b05578063e19be67214610b1b578063e28942a014610b3157600080fd5b8063b88d4fde14610a50578063beef729214610a70578063c4ae75e514610a78578063c87b56dd14610a9857600080fd5b8063940c70d5116101a6578063a22cb46511610175578063a22cb465146109d1578063a58c203f146109f1578063a6fb9c9c14610a06578063a7b7229414610a1b578063a7cc27d914610a3057600080fd5b8063940c70d51461097057806395d89b41146109905780639b81eb43146109a5578063a035b1fe146109bb57600080fd5b8063715018a6116101ed578063715018a6146108e75780637a19ff96146108fc5780638b4feb6a1461091c5780638da5cb5b146109325780638ec40a541461095057600080fd5b806369040b441461087f5780636e4d56e5146108945780636f8b44b0146108a757806370a08231146108c757600080fd5b8063323bf8ec116103245780634f6ccce7116102ac5780635be2d7371161027b5780635be2d737146107ec57806361f12ee9146107ff578063628e87351461081f5780636352211e1461083f57806368b568151461085f57600080fd5b80634f6ccce71461076a57806351c4998e1461078a578063540020d6146107aa57806354214f69146107cb57600080fd5b806342966c68116102f357806342966c68146106ab578063436380aa146106cb57806347535d7b146106ec5780634878f78f1461070d5780634d336ad71461073d57600080fd5b8063323bf8ec1461063457806339189d97146106615780633ccfd60b1461067657806342842e0e1461068b57600080fd5b806317823623116103a757806323b872dd1161037657806323b872dd1461059f5780632bf2e635146105bf5780632f2ff15d146105df5780632f745c59146105ff5780633232deeb1461061f57600080fd5b8063178236231461053457806318160ddd146105475780631f8d5ce01461055c57806323066b5f1461057257600080fd5b8063081812fc116103e3578063081812fc146104a3578063095ea7b3146104db5780630ba133c5146104fb5780630dc982991461051f57600080fd5b806301ffc9a714610415578063027f979a1461044a57806306c536ab1461046c57806306fdde031461048e575b600080fd5b34801561042157600080fd5b5061043561043036600461323b565b610cc5565b60405190151581526020015b60405180910390f35b34801561045657600080fd5b5061046a610465366004613258565b610d32565b005b34801561047857600080fd5b50610481610d6a565b60405161044191906132c9565b34801561049a57600080fd5b50610481610df8565b3480156104af57600080fd5b506104c36104be366004613258565b610e8a565b6040516001600160a01b039091168152602001610441565b3480156104e757600080fd5b5061046a6104f63660046132f8565b610f15565b34801561050757600080fd5b5061051160115481565b604051908152602001610441565b34801561052b57600080fd5b5061046a61102d565b61046a610542366004613258565b611078565b34801561055357600080fd5b50600154610511565b34801561056857600080fd5b5061051160105481565b34801561057e57600080fd5b5061051161058d366004613322565b60166020526000908152604090205481565b3480156105ab57600080fd5b5061046a6105ba36600461333d565b611256565b3480156105cb57600080fd5b5061046a6105da366004613405565b611261565b3480156105eb57600080fd5b5061046a6105fa36600461344e565b6112a2565b34801561060b57600080fd5b5061051161061a3660046132f8565b611334565b34801561062b57600080fd5b5061048161149c565b34801561064057600080fd5b5061051161064f366004613322565b60156020526000908152604090205481565b34801561066d57600080fd5b5061046a6114a9565b34801561068257600080fd5b5061046a6114f4565b34801561069757600080fd5b5061046a6106a636600461333d565b61154b565b3480156106b757600080fd5b5061046a6106c6366004613258565b611566565b3480156106d757600080fd5b50600e5461043590600160a81b900460ff1681565b3480156106f857600080fd5b50600e5461043590600160a01b900460ff1681565b34801561071957600080fd5b50610435610728366004613258565b60186020526000908152604090205460ff1681565b34801561074957600080fd5b50610511610758366004613322565b60146020526000908152604090205481565b34801561077657600080fd5b50610511610785366004613258565b611599565b34801561079657600080fd5b5061046a6107a5366004613258565b611602565b3480156107b657600080fd5b50600e5461043590600160b01b900460ff1681565b3480156107d757600080fd5b50600e5461043590600160b81b900460ff1681565b61046a6107fa36600461347a565b611631565b34801561080b57600080fd5b5061046a61081a366004613258565b611774565b34801561082b57600080fd5b5061046a61083a366004613258565b6117ec565b34801561084b57600080fd5b506104c361085a366004613258565b61181b565b34801561086b57600080fd5b5061046a61087a366004613258565b61182d565b34801561088b57600080fd5b5061046a6118a8565b61046a6108a236600461347a565b6118f3565b3480156108b357600080fd5b5061046a6108c2366004613258565b611a2b565b3480156108d357600080fd5b506105116108e2366004613322565b611a5a565b3480156108f357600080fd5b5061046a611aeb565b34801561090857600080fd5b5061046a610917366004613258565b611b21565b34801561092857600080fd5b50610511601a5481565b34801561093e57600080fd5b506000546001600160a01b03166104c3565b34801561095c57600080fd5b5061046a61096b366004613258565b611b50565b34801561097c57600080fd5b5061046a61098b366004613405565b611bc8565b34801561099c57600080fd5b50610481611c05565b3480156109b157600080fd5b50610511601b5481565b3480156109c757600080fd5b5061051160135481565b3480156109dd57600080fd5b5061046a6109ec3660046134f9565b611c14565b3480156109fd57600080fd5b50610481611cd9565b348015610a1257600080fd5b50610481611ce6565b348015610a2757600080fd5b5061046a611cf3565b348015610a3c57600080fd5b5061046a610a4b366004613258565b611d3e565b348015610a5c57600080fd5b5061046a610a6b366004613535565b611db9565b61046a611df2565b348015610a8457600080fd5b5061046a610a933660046132f8565b611e71565b348015610aa457600080fd5b50610481610ab3366004613258565b611ecb565b348015610ac457600080fd5b50610511610ad3366004613322565b60176020526000908152604090205481565b348015610af157600080fd5b5061046a610b0036600461344e565b61220e565b348015610b1157600080fd5b50610511600f5481565b348015610b2757600080fd5b5061051160125481565b348015610b3d57600080fd5b5061046a610b4c366004613258565b61229c565b348015610b5d57600080fd5b5061046a610b6c366004613258565b6122dd565b348015610b7d57600080fd5b50610435610b8c3660046135b1565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610bc657600080fd5b5061046a610bd5366004613405565b61230c565b348015610be657600080fd5b5061046a610bf5366004613322565b612349565b348015610c0657600080fd5b5061046a610c15366004613322565b612395565b348015610c2657600080fd5b50610435610c35366004613258565b60196020526000908152604090205460ff1681565b348015610c5657600080fd5b5061046a610c65366004613405565b61242d565b348015610c7657600080fd5b50610435610c8536600461344e565b600960209081526000928352604080842090915290825290205460ff1681565b348015610cb157600080fd5b5061046a610cc0366004613258565b61246a565b60006001600160e01b031982166380ac58cd60e01b1480610cf657506001600160e01b03198216635b5e139f60e01b145b80610d1157506001600160e01b0319821663780e9d6360e01b145b80610d2c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b03163314610d655760405162461bcd60e51b8152600401610d5c906135db565b60405180910390fd5b601055565b600d8054610d7790613610565b80601f0160208091040260200160405190810160405280929190818152602001828054610da390613610565b8015610df05780601f10610dc557610100808354040283529160200191610df0565b820191906000526020600020905b815481529060010190602001808311610dd357829003601f168201915b505050505081565b606060028054610e0790613610565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3390613610565b8015610e805780601f10610e5557610100808354040283529160200191610e80565b820191906000526020600020905b815481529060010190602001808311610e6357829003601f168201915b5050505050905090565b6000610e97826001541190565b610ef95760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610d5c565b506000908152600660205260409020546001600160a01b031690565b6000610f208261181b565b9050806001600160a01b0316836001600160a01b03161415610f8f5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610d5c565b336001600160a01b0382161480610fab5750610fab8133610b8c565b61101d5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610d5c565b6110288383836125d0565b505050565b6000546001600160a01b031633146110575760405162461bcd60e51b8152600401610d5c906135db565b600e805460ff60a81b198116600160a81b9182900460ff1615909102179055565b600260085414156110cb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d5c565b600260085560006110db60015490565b600e54909150600160a01b900460ff166111275760405162461bcd60e51b815260206004820152600d60248201526c36b4b73a103737ba1037b832b760991b6044820152606401610d5c565b600f54611134838361365b565b1161113e57600080fd5b60105461114b838361365b565b11156111845760405162461bcd60e51b81526020600482015260086024820152671cdbdb19081bdd5d60c21b6044820152606401610d5c565b34826013546111939190613673565b11156111d75760405162461bcd60e51b81526020600482015260136024820152721b9bdd08195b9bdd59da08195d1a081cd95b9d606a1b6044820152606401610d5c565b3332146111e357600080fd5b6011543360009081526017602052604090205461120190849061365b565b111561121f5760405162461bcd60e51b8152600401610d5c90613692565b611229338361262c565b336000908152601760205260408120805484929061124890849061365b565b909155505060016008555050565b611028838383612646565b6000546001600160a01b0316331461128b5760405162461bcd60e51b8152600401610d5c906135db565b805161129e90600d906020840190613195565b5050565b6040516420a226a4a760d91b602082015260250160408051601f19818403018152918152815160209283012060008181526009845282812033825290935291205460ff166113025760405162461bcd60e51b8152600401610d5c906136bc565b5060009182526009602090815260408084206001600160a01b039390931684529190529020805460ff19166001179055565b600061133f83611a5a565b82106113985760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610d5c565b60006113a360015490565b905060008060005b8381101561143c576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156113fe57805192505b876001600160a01b0316836001600160a01b03161415611433578684141561142c57509350610d2c92505050565b6001909301925b506001016113ab565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610d5c565b600a8054610d7790613610565b6000546001600160a01b031633146114d35760405162461bcd60e51b8152600401610d5c906135db565b600e805460ff60b81b198116600160b81b9182900460ff1615909102179055565b600047116115305760405162461bcd60e51b8152602060048201526009602482015268302062616c616e636560b81b6044820152606401610d5c565b600e544790611548906001600160a01b03168261292b565b50565b61102883838360405180602001604052806000815250611db9565b6000546001600160a01b031633146115905760405162461bcd60e51b8152600401610d5c906135db565b61154881612a44565b60006115a460015490565b82106115fe5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610d5c565b5090565b6000546001600160a01b0316331461162c5760405162461bcd60e51b8152600401610d5c906135db565b601a55565b600e54600160a81b900460ff166116845760405162461bcd60e51b81526020600482015260176024820152763bb434ba32b634b9ba1036b4b73a103737ba1037b832b760491b6044820152606401610d5c565b61168f338383612b1d565b6116d25760405162461bcd60e51b8152602060048201526014602482015273139bdd081bdb881d1a19481dda1a5d195b1a5cdd60621b6044820152606401610d5c565b60006116dd60015490565b600f549091506116ed858361365b565b11156116f857600080fd5b33321461170457600080fd5b3360009081526015602052604090205460019061172290869061365b565b11156117405760405162461bcd60e51b8152600401610d5c90613692565b61174a338561262c565b336000908152601560205260408120805486929061176990849061365b565b909155505050505050565b604051635445414d60e01b602082015260240160408051601f19818403018152918152815160209283012060008181526009845282812033825290935291205460ff166117d35760405162461bcd60e51b8152600401610d5c906136bc565b506000908152601960205260409020805460ff19169055565b6000546001600160a01b031633146118165760405162461bcd60e51b8152600401610d5c906135db565b601155565b600061182682612b6c565b5192915050565b604051635445414d60e01b602082015260240160408051601f19818403018152918152815160209283012060008181526009845282812033825290935291205460ff1661188c5760405162461bcd60e51b8152600401610d5c906136bc565b506000908152601860205260409020805460ff19166001179055565b6000546001600160a01b031633146118d25760405162461bcd60e51b8152600401610d5c906135db565b600e805460ff60b01b198116600160b01b9182900460ff1615909102179055565b600e54600160b01b900460ff166119465760405162461bcd60e51b81526020600482015260176024820152763bb434ba32b634b9ba1036b4b73a103737ba1037b832b760491b6044820152606401610d5c565b611951338383612c43565b6119945760405162461bcd60e51b8152602060048201526014602482015273139bdd081bdb881d1a19481dda1a5d195b1a5cdd60621b6044820152606401610d5c565b600061199f60015490565b600f549091506119af858361365b565b11156119ba57600080fd5b3332146119c657600080fd5b601254336000908152601660205260409020546119e490869061365b565b1115611a025760405162461bcd60e51b8152600401610d5c90613692565b611a0c338561262c565b336000908152601660205260408120805486929061176990849061365b565b6000546001600160a01b03163314611a555760405162461bcd60e51b8152600401610d5c906135db565b600f55565b60006001600160a01b038216611ac65760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610d5c565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b03163314611b155760405162461bcd60e51b8152600401610d5c906135db565b611b1f6000612c8a565b565b6000546001600160a01b03163314611b4b5760405162461bcd60e51b8152600401610d5c906135db565b601255565b604051635445414d60e01b602082015260240160408051601f19818403018152918152815160209283012060008181526009845282812033825290935291205460ff16611baf5760405162461bcd60e51b8152600401610d5c906136bc565b506000908152601860205260409020805460ff19169055565b6000546001600160a01b03163314611bf25760405162461bcd60e51b8152600401610d5c906135db565b805161129e90600c906020840190613195565b606060038054610e0790613610565b6001600160a01b038216331415611c6d5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610d5c565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c8054610d7790613610565b600b8054610d7790613610565b6000546001600160a01b03163314611d1d5760405162461bcd60e51b8152600401610d5c906135db565b600e805460ff60a01b198116600160a01b9182900460ff1615909102179055565b604051635445414d60e01b602082015260240160408051601f19818403018152918152815160209283012060008181526009845282812033825290935291205460ff16611d9d5760405162461bcd60e51b8152600401610d5c906136bc565b506000908152601960205260409020805460ff19166001179055565b611dc4848484612646565b611dd084848484612cda565b611dec5760405162461bcd60e51b8152600401610d5c906136e5565b50505050565b6000546001600160a01b03163314611e1c5760405162461bcd60e51b8152600401610d5c906135db565b604051600090339047908381818185875af1925050503d8060008114611e5e576040519150601f19603f3d011682016040523d82523d6000602084013e611e63565b606091505b505090508061154857600080fd5b6000546001600160a01b03163314611e9b5760405162461bcd60e51b8152600401610d5c906135db565b6000611ea660015490565b600f54909150611eb6838361365b565b1115611ec157600080fd5b611028838361262c565b6060611ed8826001541190565b611f3c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d5c565b6060600a8054611f4b90613610565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7790613610565b8015611fc45780601f10611f9957610100808354040283529160200191611fc4565b820191906000526020600020905b815481529060010190602001808311611fa757829003601f168201915b505050600086815260186020526040902054929350505060ff161561207157600b8054611ff090613610565b80601f016020809104026020016040519081016040528092919081815260200182805461201c90613610565b80156120695780601f1061203e57610100808354040283529160200191612069565b820191906000526020600020905b81548152906001019060200180831161204c57829003601f168201915b505050505090505b60008381526019602052604090205460ff161561211657600c805461209590613610565b80601f01602080910402602001604051908101604052809291908181526020018280546120c190613610565b801561210e5780601f106120e35761010080835404028352916020019161210e565b820191906000526020600020905b8154815290600101906020018083116120f157829003601f168201915b505050505090505b600e54600160b81b900460ff1615612175578051612143576040518060200160405280600081525061216e565b8061214d84612dd8565b60405160200161215e929190613738565b6040516020818303038152906040525b9392505050565b600d805461218290613610565b80601f01602080910402602001604051908101604052809291908181526020018280546121ae90613610565b80156121fb5780601f106121d0576101008083540402835291602001916121fb565b820191906000526020600020905b8154815290600101906020018083116121de57829003601f168201915b5050505050915050919050565b50919050565b6040516420a226a4a760d91b602082015260250160408051601f19818403018152918152815160209283012060008181526009845282812033825290935291205460ff1661226e5760405162461bcd60e51b8152600401610d5c906136bc565b5060009182526009602090815260408084206001600160a01b0390931684529190529020805460ff19169055565b6000546001600160a01b031633146122c65760405162461bcd60e51b8152600401610d5c906135db565b6122d781662386f26fc10000613673565b60135550565b6000546001600160a01b031633146123075760405162461bcd60e51b8152600401610d5c906135db565b601b55565b6000546001600160a01b031633146123365760405162461bcd60e51b8152600401610d5c906135db565b805161129e90600b906020840190613195565b6000546001600160a01b031633146123735760405162461bcd60e51b8152600401610d5c906135db565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146123bf5760405162461bcd60e51b8152600401610d5c906135db565b6001600160a01b0381166124245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d5c565b61154881612c8a565b6000546001600160a01b031633146124575760405162461bcd60e51b8152600401610d5c906135db565b805161129e90600a906020840190613195565b600260085414156124bd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d5c565b600260085560006124cd60015490565b600e54909150600160a01b900460ff166125195760405162461bcd60e51b815260206004820152600d60248201526c36b4b73a103737ba1037b832b760991b6044820152606401610d5c565b600f54612526838361365b565b111561255f5760405162461bcd60e51b81526020600482015260086024820152671cdbdb19081bdd5d60c21b6044820152606401610d5c565b33321461256b57600080fd5b6011543360009081526014602052604090205461258990849061365b565b11156125a75760405162461bcd60e51b8152600401610d5c90613692565b6125b1338361262c565b336000908152601460205260408120805484929061124890849061365b565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61129e828260405180602001604052806000815250612ed6565b600061265182612b6c565b80519091506000906001600160a01b0316336001600160a01b0316148061268857503361267d84610e8a565b6001600160a01b0316145b8061269a5750815161269a9033610b8c565b9050806127045760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610d5c565b846001600160a01b031682600001516001600160a01b0316146127785760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610d5c565b6001600160a01b0384166127dc5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610d5c565b6127ec60008484600001516125d0565b6001600160a01b03858116600090815260056020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600490935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff16021790559086018083529120549091166128e157612894816001541190565b156128e1578251600082815260046020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b8047101561297b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d5c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146129c8576040519150601f19603f3d011682016040523d82523d6000602084013e6129cd565b606091505b50509050806110285760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d5c565b6000612a4f8261181b565b9050612a5d600083836125d0565b6001600160a01b0381166000908152600560205260408120805460019290612a8f9084906001600160801b0316613777565b82546001600160801b039182166101009390930a928302919092021990911617905550600082815260046020526040808220805467ffffffffffffffff4216600160a01b026001600160e01b03199081169116179055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000612b64612b2b85612ee3565b848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612f2292505050565b949350505050565b6040805180820190915260008082526020820152612b8b826001541190565b612bea5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610d5c565b815b6000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612c39579392505050565b5060001901612bec565b6000612b64612c5185612ee3565b848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612f3192505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b15612dcd57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d1e90339089908890889060040161379f565b6020604051808303816000875af1925050508015612d59575060408051601f3d908101601f19168201909252612d56918101906137dc565b60015b612db3573d808015612d87576040519150601f19603f3d011682016040523d82523d6000602084013e612d8c565b606091505b508051612dab5760405162461bcd60e51b8152600401610d5c906136e5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612b64565b506001949350505050565b606081612dfc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e265780612e10816137f9565b9150612e1f9050600a8361382a565b9150612e00565b60008167ffffffffffffffff811115612e4157612e41613379565b6040519080825280601f01601f191660200182016040528015612e6b576020820181803683370190505b5090505b8415612b6457612e8060018361383e565b9150612e8d600a86613855565b612e9890603061365b565b60f81b818381518110612ead57612ead613869565b60200101906001600160f81b031916908160001a905350612ecf600a8661382a565b9450612e6f565b6110288383836001612f40565b6040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b600061216e82601a5485613103565b600061216e82601b5485613103565b6001546001600160a01b038516612fa35760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610d5c565b836130015760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610d5c565b6001600160a01b03851660008181526005602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526004909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b858110156130fa5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483156130ee576130d26000888488612cda565b6130ee5760405162461bcd60e51b8152600401610d5c906136e5565b6001918201910161307f565b50600155612924565b6000826131108584613119565b14949350505050565b600081815b845181101561315e5761314a8286838151811061313d5761313d613869565b6020026020010151613166565b915080613156816137f9565b91505061311e565b509392505050565b600081831061318257600082815260208490526040902061216e565b600083815260208390526040902061216e565b8280546131a190613610565b90600052602060002090601f0160209004810192826131c35760008555613209565b82601f106131dc57805160ff1916838001178555613209565b82800160010185558215613209579182015b828111156132095782518255916020019190600101906131ee565b506115fe9291505b808211156115fe5760008155600101613211565b6001600160e01b03198116811461154857600080fd5b60006020828403121561324d57600080fd5b813561216e81613225565b60006020828403121561326a57600080fd5b5035919050565b60005b8381101561328c578181015183820152602001613274565b83811115611dec5750506000910152565b600081518084526132b5816020860160208601613271565b601f01601f19169290920160200192915050565b60208152600061216e602083018461329d565b80356001600160a01b03811681146132f357600080fd5b919050565b6000806040838503121561330b57600080fd5b613314836132dc565b946020939093013593505050565b60006020828403121561333457600080fd5b61216e826132dc565b60008060006060848603121561335257600080fd5b61335b846132dc565b9250613369602085016132dc565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156133aa576133aa613379565b604051601f8501601f19908116603f011681019082821181831017156133d2576133d2613379565b816040528093508581528686860111156133eb57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561341757600080fd5b813567ffffffffffffffff81111561342e57600080fd5b8201601f8101841361343f57600080fd5b612b648482356020840161338f565b6000806040838503121561346157600080fd5b82359150613471602084016132dc565b90509250929050565b60008060006040848603121561348f57600080fd5b83359250602084013567ffffffffffffffff808211156134ae57600080fd5b818601915086601f8301126134c257600080fd5b8135818111156134d157600080fd5b8760208260051b85010111156134e657600080fd5b6020830194508093505050509250925092565b6000806040838503121561350c57600080fd5b613515836132dc565b91506020830135801515811461352a57600080fd5b809150509250929050565b6000806000806080858703121561354b57600080fd5b613554856132dc565b9350613562602086016132dc565b925060408501359150606085013567ffffffffffffffff81111561358557600080fd5b8501601f8101871361359657600080fd5b6135a58782356020840161338f565b91505092959194509250565b600080604083850312156135c457600080fd5b6135cd836132dc565b9150613471602084016132dc565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061362457607f821691505b6020821081141561220857634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561366e5761366e613645565b500190565b600081600019048311821515161561368d5761368d613645565b500290565b60208082526010908201526f0dad2dce840d8d2dad2e840e4cac2c6d60831b604082015260600190565b6020808252600f908201526e081b9bdd08185d5d1a1bdc9a5e9959608a1b604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6000835161374a818460208801613271565b83519083019061375e818360208801613271565b64173539b7b760d91b9101908152600501949350505050565b60006001600160801b038381169083168181101561379757613797613645565b039392505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137d29083018461329d565b9695505050505050565b6000602082840312156137ee57600080fd5b815161216e81613225565b600060001982141561380d5761380d613645565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261383957613839613814565b500490565b60008282101561385057613850613645565b500390565b60008261386457613864613814565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220ca37819d6340e150e33b89f89d2fc0ec23b3897f2c0659aee909af17234872a264736f6c634300080b0033
Deployed Bytecode Sourcemap
69923:7617:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51680:372;;;;;;;;;;-1:-1:-1;51680:372:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;51680:372:0;;;;;;;;75147:95;;;;;;;;;;-1:-1:-1;75147:95:0;;;;;:::i;:::-;;:::i;:::-;;70118:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;53566:100::-;;;;;;;;;;;;;:::i;55140:214::-;;;;;;;;;;-1:-1:-1;55140:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;55140:214:0;1528:203:1;54661:413:0;;;;;;;;;;-1:-1:-1;54661:413:0;;;;;:::i;:::-;;:::i;70442:28::-;;;;;;;;;;;;;;;;;;;2319:25:1;;;2307:2;2292:18;70442:28:0;2173:177:1;75882:79:0;;;;;;;;;;;;;:::i;74477:562::-;;;;;;:::i;:::-;;:::i;49937:100::-;;;;;;;;;;-1:-1:-1;50017:12:0;;49937:100;;70401:34;;;;;;;;;;;;;;;;70657:47;;;;;;;;;;-1:-1:-1;70657:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;56016:162;;;;;;;;;;-1:-1:-1;56016:162:0;;;;;:::i;:::-;;:::i;76688:107::-;;;;;;;;;;-1:-1:-1;76688:107:0;;;;;:::i;:::-;;:::i;69628:122::-;;;;;;;;;;-1:-1:-1;69628:122:0;;;;;:::i;:::-;;:::i;50601:1007::-;;;;;;;;;;-1:-1:-1;50601:1007:0;;;;;:::i;:::-;;:::i;70024:24::-;;;;;;;;;;;;;:::i;70603:47::-;;;;;;;;;;-1:-1:-1;70603:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;76056:86;;;;;;;;;;;;;:::i;77068:202::-;;;;;;;;;;;;;:::i;56249:177::-;;;;;;;;;;-1:-1:-1;56249:177:0;;;;;:::i;:::-;;:::i;77280:257::-;;;;;;;;;;-1:-1:-1;77280:257:0;;;;;:::i;:::-;;:::i;70258:27::-;;;;;;;;;;-1:-1:-1;70258:27:0;;;;-1:-1:-1;;;70258:27:0;;;;;;70225:26;;;;;;;;;;-1:-1:-1;70225:26:0;;;;-1:-1:-1;;;70225:26:0;;;;;;70763:38;;;;;;;;;;-1:-1:-1;70763:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;70554:42;;;;;;;;;;-1:-1:-1;70554:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;50114:187;;;;;;;;;;-1:-1:-1;50114:187:0;;;;;:::i;:::-;;:::i;73301:84::-;;;;;;;;;;-1:-1:-1;73301:84:0;;;;;:::i;:::-;;:::i;70292:27::-;;;;;;;;;;-1:-1:-1;70292:27:0;;;;-1:-1:-1;;;70292:27:0;;;;;;70326:30;;;;;;;;;;-1:-1:-1;70326:30:0;;;;-1:-1:-1;;;70326:30:0;;;;;;72682:518;;;;;;:::i;:::-;;:::i;75681:109::-;;;;;;;;;;-1:-1:-1;75681:109:0;;;;;:::i;:::-;;:::i;76150:99::-;;;;;;;;;;-1:-1:-1;76150:99:0;;;;;:::i;:::-;;:::i;53375:124::-;;;;;;;;;;-1:-1:-1;53375:124:0;;;;;:::i;:::-;;:::i;75354:97::-;;;;;;;;;;-1:-1:-1;75354:97:0;;;;;:::i;:::-;;:::i;75969:79::-;;;;;;;;;;;;;:::i;72146:528::-;;;;;;:::i;:::-;;:::i;75047:92::-;;;;;;;;;;-1:-1:-1;75047:92:0;;;;;:::i;:::-;;:::i;52116:221::-;;;;;;;;;;-1:-1:-1;52116:221:0;;;;;:::i;:::-;;:::i;25104:94::-;;;;;;;;;;;;;:::i;75250:96::-;;;;;;;;;;-1:-1:-1;75250:96:0;;;;;:::i;:::-;;:::i;70864:20::-;;;;;;;;;;;;;;;;24453:87;;;;;;;;;;-1:-1:-1;24499:7:0;24526:6;-1:-1:-1;;;;;24526:6:0;24453:87;;75570:103;;;;;;;;;;-1:-1:-1;75570:103:0;;;;;:::i;:::-;;:::i;76580:100::-;;;;;;;;;;-1:-1:-1;76580:100:0;;;;;:::i;:::-;;:::i;53735:104::-;;;;;;;;;;;;;:::i;70891:20::-;;;;;;;;;;;;;;;;70514:33;;;;;;;;;;;;;;;;55426:288;;;;;;;;;;-1:-1:-1;55426:288:0;;;;;:::i;:::-;;:::i;70085:26::-;;;;;;;;;;;;;:::i;70055:23::-;;;;;;;;;;;;;:::i;75798:76::-;;;;;;;;;;;;;:::i;75459:103::-;;;;;;;;;;-1:-1:-1;75459:103:0;;;;;:::i;:::-;;:::i;56497:355::-;;;;;;;;;;-1:-1:-1;56497:355:0;;;;;:::i;:::-;;:::i;76901:159::-;;;:::i;74259:210::-;;;;;;;;;;-1:-1:-1;74259:210:0;;;;;:::i;:::-;;:::i;71182:636::-;;;;;;;;;;-1:-1:-1;71182:636:0;;;;;:::i;:::-;;:::i;70711:45::-;;;;;;;;;;-1:-1:-1;70711:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;69758:127;;;;;;;;;;-1:-1:-1;69758:127:0;;;;;:::i;:::-;;:::i;70363:31::-;;;;;;;;;;;;;;;;70477:30;;;;;;;;;;;;;;;;76257:114;;;;;;;;;;-1:-1:-1;76257:114:0;;;;;:::i;:::-;;:::i;73208:84::-;;;;;;;;;;-1:-1:-1;73208:84:0;;;;;:::i;:::-;;:::i;55785:164::-;;;;;;;;;;-1:-1:-1;55785:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;55906:25:0;;;55882:4;55906:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;55785:164;76478:94;;;;;;;;;;-1:-1:-1;76478:94:0;;;;;:::i;:::-;;:::i;76803:90::-;;;;;;;;;;-1:-1:-1;76803:90:0;;;;;:::i;:::-;;:::i;25353:192::-;;;;;;;;;;-1:-1:-1;25353:192:0;;;;;:::i;:::-;;:::i;70808:41::-;;;;;;;;;;-1:-1:-1;70808:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;76379:91;;;;;;;;;;-1:-1:-1;76379:91:0;;;;;:::i;:::-;;:::i;68946:57::-;;;;;;;;;;-1:-1:-1;68946:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;73836:417;;;;;;;;;;-1:-1:-1;73836:417:0;;;;;:::i;:::-;;:::i;51680:372::-;51782:4;-1:-1:-1;;;;;;51819:40:0;;-1:-1:-1;;;51819:40:0;;:105;;-1:-1:-1;;;;;;;51876:48:0;;-1:-1:-1;;;51876:48:0;51819:105;:172;;;-1:-1:-1;;;;;;;51941:50:0;;-1:-1:-1;;;51941:50:0;51819:172;:225;;;-1:-1:-1;;;;;;;;;;42014:40:0;;;52008:36;51799:245;51680:372;-1:-1:-1;;51680:372:0:o;75147:95::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;;;;;;;;;75213:12:::1;:19:::0;75147:95::o;70118:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53566:100::-;53620:13;53653:5;53646:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53566:100;:::o;55140:214::-;55208:7;55236:16;55244:7;57198:12;;-1:-1:-1;57188:22:0;57107:111;55236:16;55228:74;;;;-1:-1:-1;;;55228:74:0;;7655:2:1;55228:74:0;;;7637:21:1;7694:2;7674:18;;;7667:30;7733:34;7713:18;;;7706:62;-1:-1:-1;;;7784:18:1;;;7777:43;7837:19;;55228:74:0;7453:409:1;55228:74:0;-1:-1:-1;55322:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;55322:24:0;;55140:214::o;54661:413::-;54734:13;54750:24;54766:7;54750:15;:24::i;:::-;54734:40;;54799:5;-1:-1:-1;;;;;54793:11:0;:2;-1:-1:-1;;;;;54793:11:0;;;54785:58;;;;-1:-1:-1;;;54785:58:0;;8069:2:1;54785:58:0;;;8051:21:1;8108:2;8088:18;;;8081:30;8147:34;8127:18;;;8120:62;-1:-1:-1;;;8198:18:1;;;8191:32;8240:19;;54785:58:0;7867:398:1;54785:58:0;23354:10;-1:-1:-1;;;;;54878:21:0;;;;:62;;-1:-1:-1;54903:37:0;54920:5;23354:10;55785:164;:::i;54903:37::-;54856:169;;;;-1:-1:-1;;;54856:169:0;;8472:2:1;54856:169:0;;;8454:21:1;8511:2;8491:18;;;8484:30;8550:34;8530:18;;;8523:62;8621:27;8601:18;;;8594:55;8666:19;;54856:169:0;8270:421:1;54856:169:0;55038:28;55047:2;55051:7;55060:5;55038:8;:28::i;:::-;54723:351;54661:413;;:::o;75882:79::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;75946:7:::1;::::0;;-1:-1:-1;;;;75935:18:0;::::1;-1:-1:-1::0;;;75946:7:0;;;::::1;;;75945:8;75935:18:::0;;::::1;;::::0;;75882:79::o;74477:562::-;67942:1;68540:7;;:19;;68532:63;;;;-1:-1:-1;;;68532:63:0;;8898:2:1;68532:63:0;;;8880:21:1;8937:2;8917:18;;;8910:30;8976:33;8956:18;;;8949:61;9027:18;;68532:63:0;8696:355:1;68532:63:0;67942:1;68673:7;:18;74556:17:::1;74576:13;50017:12:::0;;;49937:100;74576:13:::1;74608:6;::::0;74556:33;;-1:-1:-1;;;;74608:6:0;::::1;;;74600:32;;;::::0;-1:-1:-1;;;74600:32:0;;9258:2:1;74600:32:0::1;::::0;::::1;9240:21:1::0;9297:2;9277:18;;;9270:30;-1:-1:-1;;;9316:18:1;;;9309:43;9369:18;;74600:32:0::1;9056:337:1::0;74600:32:0::1;74673:9;::::0;74651:19:::1;74663:7:::0;74651:9;:19:::1;:::i;:::-;:31;74643:40;;;::::0;::::1;;74725:12;::::0;74702:19:::1;74714:7:::0;74702:9;:19:::1;:::i;:::-;:35;;74694:55;;;::::0;-1:-1:-1;;;74694:55:0;;9865:2:1;74694:55:0::1;::::0;::::1;9847:21:1::0;9904:1;9884:18;;;9877:29;-1:-1:-1;;;9922:18:1;;;9915:38;9970:18;;74694:55:0::1;9663:331:1::0;74694:55:0::1;74787:9;74776:7;74768:5;;:15;;;;:::i;:::-;:28;;74760:59;;;::::0;-1:-1:-1;;;74760:59:0;;10374:2:1;74760:59:0::1;::::0;::::1;10356:21:1::0;10413:2;10393:18;;;10386:30;-1:-1:-1;;;10432:18:1;;;10425:49;10491:18;;74760:59:0::1;10172:343:1::0;74760:59:0::1;74838:10;74852:9;74838:23;74830:32;;;::::0;::::1;;74917:9;::::0;74892:10:::1;74881:22;::::0;;;:10:::1;:22;::::0;;;;;:32:::1;::::0;74906:7;;74881:32:::1;:::i;:::-;:45;;74873:73;;;;-1:-1:-1::0;;;74873:73:0::1;;;;;;;:::i;:::-;74957:30;74967:10;74979:7;74957:9;:30::i;:::-;75009:10;74998:22;::::0;;;:10:::1;:22;::::0;;;;:33;;75024:7;;74998:22;:33:::1;::::0;75024:7;;74998:33:::1;:::i;:::-;::::0;;;-1:-1:-1;;67898:1:0;68852:7;:22;-1:-1:-1;;74477:562:0:o;56016:162::-;56142:28;56152:4;56158:2;56162:7;56142:9;:28::i;76688:107::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;76762:25;;::::1;::::0;:18:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;:::-;;76688:107:::0;:::o;69628:122::-;69057:25;;-1:-1:-1;;;69057:25:0;;;11067:20:1;11103:11;;69057:25:0;;;-1:-1:-1;;69057:25:0;;;;;;;;;69047:36;;69057:25;69047:36;;;;69369:12;;;;:5;:12;;;;;69382:10;69369:24;;;;;;;;;;69361:52;;;;-1:-1:-1;;;69361:52:0;;;;;;;:::i;:::-;-1:-1:-1;69583:12:0;;;;:5;:12;;;;;;;;-1:-1:-1;;;;;69583:22:0;;;;;;;;;;;:29;;-1:-1:-1;;69583:29:0;69608:4;69583:29;;;54661:413::o;50601:1007::-;50690:7;50726:16;50736:5;50726:9;:16::i;:::-;50718:5;:24;50710:71;;;;-1:-1:-1;;;50710:71:0;;11671:2:1;50710:71:0;;;11653:21:1;11710:2;11690:18;;;11683:30;11749:34;11729:18;;;11722:62;-1:-1:-1;;;11800:18:1;;;11793:32;11842:19;;50710:71:0;11469:398:1;50710:71:0;50792:22;50817:13;50017:12;;;49937:100;50817:13;50792:38;;50841:19;50871:25;51060:9;51055:466;51075:14;51071:1;:18;51055:466;;;51115:31;51149:14;;;:11;:14;;;;;;;;;51115:48;;;;;;;;;-1:-1:-1;;;;;51115:48:0;;;;;-1:-1:-1;;;51115:48:0;;;;;;;;;;;;51186:28;51182:111;;51259:14;;;-1:-1:-1;51182:111:0;51336:5;-1:-1:-1;;;;;51315:26:0;:17;-1:-1:-1;;;;;51315:26:0;;51311:195;;;51385:5;51370:11;:20;51366:85;;;-1:-1:-1;51426:1:0;-1:-1:-1;51419:8:0;;-1:-1:-1;;;51419:8:0;51366:85;51473:13;;;;;51311:195;-1:-1:-1;51091:3:0;;51055:466;;;-1:-1:-1;51544:56:0;;-1:-1:-1;;;51544:56:0;;12074:2:1;51544:56:0;;;12056:21:1;12113:2;12093:18;;;12086:30;12152:34;12132:18;;;12125:62;-1:-1:-1;;;12203:18:1;;;12196:44;12257:19;;51544:56:0;11872:410:1;70024:24:0;;;;;;;:::i;76056:86::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;76124:10:::1;::::0;;-1:-1:-1;;;;76110:24:0;::::1;-1:-1:-1::0;;;76124:10:0;;;::::1;;;76123:11;76110:24:::0;;::::1;;::::0;;76056:86::o;77068:202::-;77141:1;77117:21;:25;77109:47;;;;-1:-1:-1;;;77109:47:0;;12489:2:1;77109:47:0;;;12471:21:1;12528:1;12508:18;;;12501:29;-1:-1:-1;;;12546:18:1;;;12539:39;12595:18;;77109:47:0;12287:332:1;77109:47:0;77243:8;;77185:21;;77217:45;;-1:-1:-1;;;;;77243:8:0;77185:21;77217:17;:45::i;:::-;77098:172;77068:202::o;56249:177::-;56379:39;56396:4;56402:2;56406:7;56379:39;;;;;;;;;;;;:16;:39::i;77280:257::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;77515:14:::1;77521:7;77515:5;:14::i;50114:187::-:0;50181:7;50217:13;50017:12;;;49937:100;50217:13;50209:5;:21;50201:69;;;;-1:-1:-1;;;50201:69:0;;12826:2:1;50201:69:0;;;12808:21:1;12865:2;12845:18;;;12838:30;12904:34;12884:18;;;12877:62;-1:-1:-1;;;12955:18:1;;;12948:33;12998:19;;50201:69:0;12624:399:1;50201:69:0;-1:-1:-1;50288:5:0;50114:187::o;73301:84::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;73364:5:::1;:13:::0;73301:84::o;72682:518::-;72780:7;;-1:-1:-1;;;72780:7:0;;;;72772:42;;;;-1:-1:-1;;;72772:42:0;;13230:2:1;72772:42:0;;;13212:21:1;13269:2;13249:18;;;13242:30;-1:-1:-1;;;13288:18:1;;;13281:53;13351:18;;72772:42:0;13028:347:1;72772:42:0;72833:33;72848:10;72860:5;;72833:14;:33::i;:::-;72825:66;;;;-1:-1:-1;;;72825:66:0;;13582:2:1;72825:66:0;;;13564:21:1;13621:2;13601:18;;;13594:30;-1:-1:-1;;;13640:18:1;;;13633:50;13700:18;;72825:66:0;13380:344:1;72825:66:0;72902:17;72922:13;50017:12;;;49937:100;72922:13;72977:9;;72902:33;;-1:-1:-1;72954:19:0;72966:7;72902:33;72954:19;:::i;:::-;:32;;72946:41;;;;;;73006:10;73020:9;73006:23;72998:32;;;;;;73059:10;73046:24;;;;:12;:24;;;;;;73084:1;;73046:34;;73073:7;;73046:34;:::i;:::-;:39;;73038:67;;;;-1:-1:-1;;;73038:67:0;;;;;;;:::i;:::-;73116:30;73126:10;73138:7;73116:9;:30::i;:::-;73170:10;73157:24;;;;:12;:24;;;;;:35;;73185:7;;73157:24;:35;;73185:7;;73157:35;:::i;:::-;;;;-1:-1:-1;;;;;;72682:518:0:o;75681:109::-;69208:24;;-1:-1:-1;;;69208:24:0;;;13931:19:1;13966:11;;69208:24:0;;;-1:-1:-1;;69208:24:0;;;;;;;;;69198:35;;69208:24;69198:35;;;;69369:12;;;;:5;:12;;;;;69382:10;69369:24;;;;;;;;;;69361:52;;;;-1:-1:-1;;;69361:52:0;;;;;;;:::i;:::-;-1:-1:-1;75777:5:0::1;75760:14:::0;;;:9:::1;:14;::::0;;;;:22;;-1:-1:-1;;75760:22:0::1;::::0;;75681:109::o;76150:99::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;76223:9:::1;:18:::0;76150:99::o;53375:124::-;53439:7;53466:20;53478:7;53466:11;:20::i;:::-;:25;;53375:124;-1:-1:-1;;53375:124:0:o;75354:97::-;69208:24;;-1:-1:-1;;;69208:24:0;;;13931:19:1;13966:11;;69208:24:0;;;-1:-1:-1;;69208:24:0;;;;;;;;;69198:35;;69208:24;69198:35;;;;69369:12;;;;:5;:12;;;;;69382:10;69369:24;;;;;;;;;;69361:52;;;;-1:-1:-1;;;69361:52:0;;;;;;;:::i;:::-;-1:-1:-1;75425:11:0::1;::::0;;;:6:::1;:11;::::0;;;;:18;;-1:-1:-1;;75425:18:0::1;75439:4;75425:18;::::0;;75354:97::o;75969:79::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;76033:7:::1;::::0;;-1:-1:-1;;;;76022:18:0;::::1;-1:-1:-1::0;;;76033:7:0;;;::::1;;;76032:8;76022:18:::0;;::::1;;::::0;;75969:79::o;72146:528::-;72244:7;;-1:-1:-1;;;72244:7:0;;;;72236:42;;;;-1:-1:-1;;;72236:42:0;;13230:2:1;72236:42:0;;;13212:21:1;13269:2;13249:18;;;13242:30;-1:-1:-1;;;13288:18:1;;;13281:53;13351:18;;72236:42:0;13028:347:1;72236:42:0;72297:33;72312:10;72324:5;;72297:14;:33::i;:::-;72289:66;;;;-1:-1:-1;;;72289:66:0;;13582:2:1;72289:66:0;;;13564:21:1;13621:2;13601:18;;;13594:30;-1:-1:-1;;;13640:18:1;;;13633:50;13700:18;;72289:66:0;13380:344:1;72289:66:0;72366:17;72386:13;50017:12;;;49937:100;72386:13;72441:9;;72366:33;;-1:-1:-1;72418:19:0;72430:7;72366:33;72418:19;:::i;:::-;:32;;72410:41;;;;;;72470:10;72484:9;72470:23;72462:32;;;;;;72548:11;;72523:10;72510:24;;;;:12;:24;;;;;;:34;;72537:7;;72510:34;:::i;:::-;:49;;72502:77;;;;-1:-1:-1;;;72502:77:0;;;;;;;:::i;:::-;72590:30;72600:10;72612:7;72590:9;:30::i;:::-;72644:10;72631:24;;;;:12;:24;;;;;:35;;72659:7;;72631:24;:35;;72659:7;;72631:35;:::i;75047:92::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;75113:9:::1;:16:::0;75047:92::o;52116:221::-;52180:7;-1:-1:-1;;;;;52208:19:0;;52200:75;;;;-1:-1:-1;;;52200:75:0;;14190:2:1;52200:75:0;;;14172:21:1;14229:2;14209:18;;;14202:30;14268:34;14248:18;;;14241:62;-1:-1:-1;;;14319:18:1;;;14312:41;14370:19;;52200:75:0;13988:407:1;52200:75:0;-1:-1:-1;;;;;;52301:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;52301:27:0;;52116:221::o;25104:94::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;25169:21:::1;25187:1;25169:9;:21::i;:::-;25104:94::o:0;75250:96::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;75318:11:::1;:18:::0;75250:96::o;75570:103::-;69208:24;;-1:-1:-1;;;69208:24:0;;;13931:19:1;13966:11;;69208:24:0;;;-1:-1:-1;;69208:24:0;;;;;;;;;69198:35;;69208:24;69198:35;;;;69369:12;;;;:5;:12;;;;;69382:10;69369:24;;;;;;;;;;69361:52;;;;-1:-1:-1;;;69361:52:0;;;;;;;:::i;:::-;-1:-1:-1;75660:5:0::1;75646:11:::0;;;:6:::1;:11;::::0;;;;:19;;-1:-1:-1;;75646:19:0::1;::::0;;75570:103::o;76580:100::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;76653:19;;::::1;::::0;:12:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;53735:104::-:0;53791:13;53824:7;53817:14;;;;;:::i;55426:288::-;-1:-1:-1;;;;;55521:24:0;;23354:10;55521:24;;55513:63;;;;-1:-1:-1;;;55513:63:0;;14602:2:1;55513:63:0;;;14584:21:1;14641:2;14621:18;;;14614:30;14680:28;14660:18;;;14653:56;14726:18;;55513:63:0;14400:350:1;55513:63:0;23354:10;55589:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;55589:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;55589:53:0;;;;;;;;;;55658:48;;540:41:1;;;55589:42:0;;23354:10;55658:48;;513:18:1;55658:48:0;;;;;;;55426:288;;:::o;70085:26::-;;;;;;;:::i;70055:23::-;;;;;;;:::i;75798:76::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;75860:6:::1;::::0;;-1:-1:-1;;;;75850:16:0;::::1;-1:-1:-1::0;;;75860:6:0;;;::::1;;;75859:7;75850:16:::0;;::::1;;::::0;;75798:76::o;75459:103::-;69208:24;;-1:-1:-1;;;69208:24:0;;;13931:19:1;13966:11;;69208:24:0;;;-1:-1:-1;;69208:24:0;;;;;;;;;69198:35;;69208:24;69198:35;;;;69369:12;;;;:5;:12;;;;;69382:10;69369:24;;;;;;;;;;69361:52;;;;-1:-1:-1;;;69361:52:0;;;;;;;:::i;:::-;-1:-1:-1;75533:14:0::1;::::0;;;:9:::1;:14;::::0;;;;:21;;-1:-1:-1;;75533:21:0::1;75550:4;75533:21;::::0;;75459:103::o;56497:355::-;56656:28;56666:4;56672:2;56676:7;56656:9;:28::i;:::-;56717:48;56740:4;56746:2;56750:7;56759:5;56717:22;:48::i;:::-;56695:149;;;;-1:-1:-1;;;56695:149:0;;;;;;;:::i;:::-;56497:355;;;;:::o;76901:159::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;76976:58:::1;::::0;76958:12:::1;::::0;76984:10:::1;::::0;77008:21:::1;::::0;76958:12;76976:58;76958:12;76976:58;77008:21;76984:10;76976:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76957:77;;;77047:7;77039:16;;;::::0;::::1;74259:210:::0;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;74340:17:::1;74360:13;50017:12:::0;;;49937:100;74360:13:::1;74412:9;::::0;74340:33;;-1:-1:-1;74389:19:0::1;74401:7:::0;74340:33;74389:19:::1;:::i;:::-;:32;;74381:41;;;::::0;::::1;;74433:28;74443:8;74453:7;74433:9;:28::i;71182:636::-:0;71255:13;71289:16;71297:7;57198:12;;-1:-1:-1;57188:22:0;57107:111;71289:16;71281:76;;;;-1:-1:-1;;;71281:76:0;;15587:2:1;71281:76:0;;;15569:21:1;15626:2;15606:18;;;15599:30;15665:34;15645:18;;;15638:62;-1:-1:-1;;;15716:18:1;;;15709:45;15771:19;;71281:76:0;15385:411:1;71281:76:0;71370:21;71412:10;71402:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;71447:15:0;;;;:6;:15;;;;;;71402:20;;-1:-1:-1;;;71447:15:0;;71443:67;;;71489:9;71479:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71443:67;71524:18;;;;:9;:18;;;;;;;;71520:73;;;71569:12;71559:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71520:73;71607:10;;-1:-1:-1;;;71607:10:0;;;;71603:208;;;71637:21;;:95;;;;;;;;;;;;;;;;;71690:7;71699:18;:7;:16;:18::i;:::-;71673:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71637:95;71630:102;71182:636;-1:-1:-1;;;71182:636:0:o;71603:208::-;71781:18;71774:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71182:636;;;:::o;71603:208::-;71270:548;71182:636;;;:::o;69758:127::-;69057:25;;-1:-1:-1;;;69057:25:0;;;11067:20:1;11103:11;;69057:25:0;;;-1:-1:-1;;69057:25:0;;;;;;;;;69047:36;;69057:25;69047:36;;;;69369:12;;;;:5;:12;;;;;69382:10;69369:24;;;;;;;;;;69361:52;;;;-1:-1:-1;;;69361:52:0;;;;;;;:::i;:::-;-1:-1:-1;69872:5:0::1;69847:12:::0;;;:5:::1;:12;::::0;;;;;;;-1:-1:-1;;;;;69847:22:0;;::::1;::::0;;;;;;;:30;;-1:-1:-1;;69847:30:0::1;::::0;;69758:127::o;76257:114::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;76345:18:::1;:11:::0;76359:4:::1;76345:18;:::i;:::-;76337:5;:26:::0;-1:-1:-1;76257:114:0:o;73208:84::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;73271:5:::1;:13:::0;73208:84::o;76478:94::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;76548:16;;::::1;::::0;:9:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;76803:90::-:0;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;76869:8:::1;:16:::0;;-1:-1:-1;;;;;;76869:16:0::1;-1:-1:-1::0;;;;;76869:16:0;;;::::1;::::0;;;::::1;::::0;;76803:90::o;25353:192::-;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25442:22:0;::::1;25434:73;;;::::0;-1:-1:-1;;;25434:73:0;;16645:2:1;25434:73:0::1;::::0;::::1;16627:21:1::0;16684:2;16664:18;;;16657:30;16723:34;16703:18;;;16696:62;-1:-1:-1;;;16774:18:1;;;16767:36;16820:19;;25434:73:0::1;16443:402:1::0;25434:73:0::1;25518:19;25528:8;25518:9;:19::i;76379:91::-:0;24499:7;24526:6;-1:-1:-1;;;;;24526:6:0;23354:10;24673:23;24665:68;;;;-1:-1:-1;;;24665:68:0;;;;;;;:::i;:::-;76445:17;;::::1;::::0;:10:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;73836:417::-:0;67942:1;68540:7;;:19;;68532:63;;;;-1:-1:-1;;;68532:63:0;;8898:2:1;68532:63:0;;;8880:21:1;8937:2;8917:18;;;8910:30;8976:33;8956:18;;;8949:61;9027:18;;68532:63:0;8696:355:1;68532:63:0;67942:1;68673:7;:18;73904:17:::1;73924:13;50017:12:::0;;;49937:100;73924:13:::1;73956:6;::::0;73904:33;;-1:-1:-1;;;;73956:6:0;::::1;;;73948:31;;;::::0;-1:-1:-1;;;73948:31:0;;9258:2:1;73948:31:0::1;::::0;::::1;9240:21:1::0;9297:2;9277:18;;;9270:30;-1:-1:-1;;;9316:18:1;;;9309:43;9369:18;;73948:31:0::1;9056:337:1::0;73948:31:0::1;74021:9;::::0;73998:19:::1;74010:7:::0;73998:9;:19:::1;:::i;:::-;:32;;73990:52;;;::::0;-1:-1:-1;;;73990:52:0;;9865:2:1;73990:52:0::1;::::0;::::1;9847:21:1::0;9904:1;9884:18;;;9877:29;-1:-1:-1;;;9922:18:1;;;9915:38;9970:18;;73990:52:0::1;9663:331:1::0;73990:52:0::1;74061:10;74075:9;74061:23;74053:32;;;::::0;::::1;;74134:9;::::0;74109:10:::1;74101:19;::::0;;;:7:::1;:19;::::0;;;;;:29:::1;::::0;74123:7;;74101:29:::1;:::i;:::-;:42;;74093:70;;;;-1:-1:-1::0;;;74093:70:0::1;;;;;;;:::i;:::-;74174:30;74184:10;74196:7;74174:9;:30::i;:::-;74223:10;74215:19;::::0;;;:7:::1;:19;::::0;;;;:30;;74238:7;;74215:19;:30:::1;::::0;74238:7;;74215:30:::1;:::i;62027:196::-:0;62142:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;62142:29:0;-1:-1:-1;;;;;62142:29:0;;;;;;;;;62187:28;;62142:24;;62187:28;;;;;;;62027:196;;;:::o;57226:104::-;57295:27;57305:2;57309:8;57295:27;;;;;;;;;;;;:9;:27::i;59907:2002::-;60022:35;60060:20;60072:7;60060:11;:20::i;:::-;60135:18;;60022:58;;-1:-1:-1;60093:22:0;;-1:-1:-1;;;;;60119:34:0;23354:10;-1:-1:-1;;;;;60119:34:0;;:87;;;-1:-1:-1;23354:10:0;60170:20;60182:7;60170:11;:20::i;:::-;-1:-1:-1;;;;;60170:36:0;;60119:87;:154;;;-1:-1:-1;60240:18:0;;60223:50;;23354:10;55785:164;:::i;60223:50::-;60093:181;;60295:17;60287:80;;;;-1:-1:-1;;;60287:80:0;;17052:2:1;60287:80:0;;;17034:21:1;17091:2;17071:18;;;17064:30;17130:34;17110:18;;;17103:62;-1:-1:-1;;;17181:18:1;;;17174:48;17239:19;;60287:80:0;16850:414:1;60287:80:0;60410:4;-1:-1:-1;;;;;60388:26:0;:13;:18;;;-1:-1:-1;;;;;60388:26:0;;60380:77;;;;-1:-1:-1;;;60380:77:0;;17471:2:1;60380:77:0;;;17453:21:1;17510:2;17490:18;;;17483:30;17549:34;17529:18;;;17522:62;-1:-1:-1;;;17600:18:1;;;17593:36;17646:19;;60380:77:0;17269:402:1;60380:77:0;-1:-1:-1;;;;;60476:16:0;;60468:66;;;;-1:-1:-1;;;60468:66:0;;17878:2:1;60468:66:0;;;17860:21:1;17917:2;17897:18;;;17890:30;17956:34;17936:18;;;17929:62;-1:-1:-1;;;18007:18:1;;;18000:35;18052:19;;60468:66:0;17676:401:1;60468:66:0;60655:49;60672:1;60676:7;60685:13;:18;;;60655:8;:49::i;:::-;-1:-1:-1;;;;;61000:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;61000:31:0;;;-1:-1:-1;;;;;61000:31:0;;;-1:-1:-1;;61000:31:0;;;;;;;61046:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;61046:29:0;;;;;;;;;;;;;61092:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;61137:61:0;;;;-1:-1:-1;;;61182:15:0;61137:61;;;;;;61472:11;;;61502:24;;;;;:29;61472:11;;61502:29;61498:295;;61570:20;61578:11;57198:12;;-1:-1:-1;57188:22:0;57107:111;61570:20;61566:212;;;61647:18;;;61615:24;;;:11;:24;;;;;;;;:50;;61730:28;;;;61688:70;;-1:-1:-1;;;61688:70:0;-1:-1:-1;;;;;;61688:70:0;;;-1:-1:-1;;;;;61615:50:0;;;61688:70;;;;;;;61566:212;60975:829;61840:7;61836:2;-1:-1:-1;;;;;61821:27:0;61830:4;-1:-1:-1;;;;;61821:27:0;;;;;;;;;;;61859:42;60011:1898;;59907:2002;;;:::o;27789:317::-;27904:6;27879:21;:31;;27871:73;;;;-1:-1:-1;;;27871:73:0;;18284:2:1;27871:73:0;;;18266:21:1;18323:2;18303:18;;;18296:30;18362:31;18342:18;;;18335:59;18411:18;;27871:73:0;18082:353:1;27871:73:0;27958:12;27976:9;-1:-1:-1;;;;;27976:14:0;27998:6;27976:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27957:52;;;28028:7;28020:78;;;;-1:-1:-1;;;28020:78:0;;18642:2:1;28020:78:0;;;18624:21:1;18681:2;18661:18;;;18654:30;18720:34;18700:18;;;18693:62;18791:28;18771:18;;;18764:56;18837:19;;28020:78:0;18440:422:1;65174:614:0;65234:13;65250:16;65258:7;65250;:16::i;:::-;65234:32;;65372:36;65389:1;65393:7;65402:5;65372:8;:36::i;:::-;-1:-1:-1;;;;;65514:19:0;;;;;;:12;:19;;;;;:32;;65545:1;;65514:19;:32;;65545:1;;-1:-1:-1;;;;;65514:32:0;;:::i;:::-;;;-1:-1:-1;;;;;65514:32:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65567:20:0;;;:11;:20;;;;;;:38;;65616:61;65661:15;65616:61;-1:-1:-1;;;65616:61:0;-1:-1:-1;;;;;;65698:28:0;;;65616:61;;65698:28;;;65744:36;65579:7;;-1:-1:-1;;;;;;65744:36:0;;;;;-1:-1:-1;;65744:36:0;65223:565;65174:614;:::o;71986:152::-;72075:4;72099:31;72108:14;72114:7;72108:5;:14::i;:::-;72124:5;;72099:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72099:8:0;;-1:-1:-1;;;72099:31:0:i;:::-;72092:38;71986:152;-1:-1:-1;;;;71986:152:0:o;52776:537::-;-1:-1:-1;;;;;;;;;;;;;;;;;52879:16:0;52887:7;57198:12;;-1:-1:-1;57188:22:0;57107:111;52879:16;52871:71;;;;-1:-1:-1;;;52871:71:0;;19320:2:1;52871:71:0;;;19302:21:1;19359:2;19339:18;;;19332:30;19398:34;19378:18;;;19371:62;-1:-1:-1;;;19449:18:1;;;19442:40;19499:19;;52871:71:0;19118:406:1;52871:71:0;53000:7;52980:245;53047:31;53081:17;;;:11;:17;;;;;;;;;53047:51;;;;;;;;;-1:-1:-1;;;;;53047:51:0;;;;;-1:-1:-1;;;53047:51:0;;;;;;;;;;;;53121:28;53117:93;;53181:9;52776:537;-1:-1:-1;;;52776:537:0:o;53117:93::-;-1:-1:-1;;;53020:6:0;52980:245;;71826:152;71915:4;71939:31;71948:14;71954:7;71948:5;:14::i;:::-;71964:5;;71939:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71939:8:0;;-1:-1:-1;;;71939:31:0:i;25553:173::-;25609:16;25628:6;;-1:-1:-1;;;;;25645:17:0;;;-1:-1:-1;;;;;;25645:17:0;;;;;;25678:40;;25628:6;;;;;;;25678:40;;25609:16;25678:40;25598:128;25553:173;:::o;62788:804::-;62943:4;-1:-1:-1;;;;;62964:13:0;;26790:20;26838:8;62960:625;;63000:72;;-1:-1:-1;;;63000:72:0;;-1:-1:-1;;;;;63000:36:0;;;;;:72;;23354:10;;63051:4;;63057:7;;63066:5;;63000:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63000:72:0;;;;;;;;-1:-1:-1;;63000:72:0;;;;;;;;;;;;:::i;:::-;;;62996:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63246:13:0;;63242:273;;63289:61;;-1:-1:-1;;;63289:61:0;;;;;;;:::i;63242:273::-;63465:6;63459:13;63450:6;63446:2;63442:15;63435:38;62996:534;-1:-1:-1;;;;;;63123:55:0;-1:-1:-1;;;63123:55:0;;-1:-1:-1;63116:62:0;;62960:625;-1:-1:-1;63569:4:0;62788:804;;;;;;:::o;2790:723::-;2846:13;3067:10;3063:53;;-1:-1:-1;;3094:10:0;;;;;;;;;;;;-1:-1:-1;;;3094:10:0;;;;;2790:723::o;3063:53::-;3141:5;3126:12;3182:78;3189:9;;3182:78;;3215:8;;;;:::i;:::-;;-1:-1:-1;3238:10:0;;-1:-1:-1;3246:2:0;3238:10;;:::i;:::-;;;3182:78;;;3270:19;3302:6;3292:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3292:17:0;;3270:39;;3320:154;3327:10;;3320:154;;3354:11;3364:1;3354:11;;:::i;:::-;;-1:-1:-1;3423:10:0;3431:2;3423:5;:10;:::i;:::-;3410:24;;:2;:24;:::i;:::-;3397:39;;3380:6;3387;3380:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3380:56:0;;;;;;;;-1:-1:-1;3451:11:0;3460:2;3451:11;;:::i;:::-;;;3320:154;;57693:163;57816:32;57822:2;57826:8;57836:5;57843:4;57816:5;:32::i;73393:125::-;73484:25;;-1:-1:-1;;21618:2:1;21614:15;;;21610:53;73484:25:0;;;21598:66:1;73447:7:0;;21680:12:1;;73484:25:0;;;;;;;;;;;;73474:36;;;;;;73467:43;;73393:125;;;:::o;73682:148::-;73760:4;73784:38;73803:5;73810;;73817:4;73784:18;:38::i;73526:148::-;73604:4;73628:38;73647:5;73654;;73661:4;73628:18;:38::i;58115:1538::-;58277:12;;-1:-1:-1;;;;;58308:16:0;;58300:62;;;;-1:-1:-1;;;58300:62:0;;21905:2:1;58300:62:0;;;21887:21:1;21944:2;21924:18;;;21917:30;21983:34;21963:18;;;21956:62;-1:-1:-1;;;22034:18:1;;;22027:31;22075:19;;58300:62:0;21703:397:1;58300:62:0;58381:13;58373:66;;;;-1:-1:-1;;;58373:66:0;;22307:2:1;58373:66:0;;;22289:21:1;22346:2;22326:18;;;22319:30;22385:34;22365:18;;;22358:62;-1:-1:-1;;;22436:18:1;;;22429:38;22484:19;;58373:66:0;22105:404:1;58373:66:0;-1:-1:-1;;;;;58791:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;58791:45:0;;-1:-1:-1;;;;;58791:45:0;;;;;;;;;;58851:50;;;;;;;;;;;;;;58918:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;58968:66:0;;;;-1:-1:-1;;;59018:15:0;58968:66;;;;;;;58918:25;;59103:415;59123:8;59119:1;:12;59103:415;;;59162:38;;59187:12;;-1:-1:-1;;;;;59162:38:0;;;59179:1;;59162:38;;59179:1;;59162:38;59223:4;59219:249;;;59286:59;59317:1;59321:2;59325:12;59339:5;59286:22;:59::i;:::-;59252:196;;;;-1:-1:-1;;;59252:196:0;;;;;;;:::i;:::-;59488:14;;;;;59133:3;59103:415;;;-1:-1:-1;59534:12:0;:27;59585:60;56497:355;15171:190;15296:4;15349;15320:25;15333:5;15340:4;15320:12;:25::i;:::-;:33;;15171:190;-1:-1:-1;;;;15171:190:0:o;16038:296::-;16121:7;16164:4;16121:7;16179:118;16203:5;:12;16199:1;:16;16179:118;;;16252:33;16262:12;16276:5;16282:1;16276:8;;;;;;;;:::i;:::-;;;;;;;16252:9;:33::i;:::-;16237:48;-1:-1:-1;16217:3:0;;;;:::i;:::-;;;;16179:118;;;-1:-1:-1;16314:12:0;16038:296;-1:-1:-1;;;16038:296:0:o;22245:149::-;22308:7;22339:1;22335;:5;:51;;22470:13;22564:15;;;22600:4;22593:15;;;22647:4;22631:21;;22335:51;;;22470:13;22564:15;;;22600:4;22593:15;;;22647:4;22631:21;;22343:20;22402:268;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:180::-;651:6;704:2;692:9;683:7;679:23;675:32;672:52;;;720:1;717;710:12;672:52;-1:-1:-1;743:23:1;;592:180;-1:-1:-1;592:180:1:o;777:258::-;849:1;859:113;873:6;870:1;867:13;859:113;;;949:11;;;943:18;930:11;;;923:39;895:2;888:10;859:113;;;990:6;987:1;984:13;981:48;;;-1:-1:-1;;1025:1:1;1007:16;;1000:27;777:258::o;1040:::-;1082:3;1120:5;1114:12;1147:6;1142:3;1135:19;1163:63;1219:6;1212:4;1207:3;1203:14;1196:4;1189:5;1185:16;1163:63;:::i;:::-;1280:2;1259:15;-1:-1:-1;;1255:29:1;1246:39;;;;1287:4;1242:50;;1040:258;-1:-1:-1;;1040:258:1:o;1303:220::-;1452:2;1441:9;1434:21;1415:4;1472:45;1513:2;1502:9;1498:18;1490:6;1472:45;:::i;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:186::-;2414:6;2467:2;2455:9;2446:7;2442:23;2438:32;2435:52;;;2483:1;2480;2473:12;2435:52;2506:29;2525:9;2506:29;:::i;2546:328::-;2623:6;2631;2639;2692:2;2680:9;2671:7;2667:23;2663:32;2660:52;;;2708:1;2705;2698:12;2660:52;2731:29;2750:9;2731:29;:::i;:::-;2721:39;;2779:38;2813:2;2802:9;2798:18;2779:38;:::i;:::-;2769:48;;2864:2;2853:9;2849:18;2836:32;2826:42;;2546:328;;;;;:::o;2879:127::-;2940:10;2935:3;2931:20;2928:1;2921:31;2971:4;2968:1;2961:15;2995:4;2992:1;2985:15;3011:632;3076:5;3106:18;3147:2;3139:6;3136:14;3133:40;;;3153:18;;:::i;:::-;3228:2;3222:9;3196:2;3282:15;;-1:-1:-1;;3278:24:1;;;3304:2;3274:33;3270:42;3258:55;;;3328:18;;;3348:22;;;3325:46;3322:72;;;3374:18;;:::i;:::-;3414:10;3410:2;3403:22;3443:6;3434:15;;3473:6;3465;3458:22;3513:3;3504:6;3499:3;3495:16;3492:25;3489:45;;;3530:1;3527;3520:12;3489:45;3580:6;3575:3;3568:4;3560:6;3556:17;3543:44;3635:1;3628:4;3619:6;3611;3607:19;3603:30;3596:41;;;;3011:632;;;;;:::o;3648:451::-;3717:6;3770:2;3758:9;3749:7;3745:23;3741:32;3738:52;;;3786:1;3783;3776:12;3738:52;3826:9;3813:23;3859:18;3851:6;3848:30;3845:50;;;3891:1;3888;3881:12;3845:50;3914:22;;3967:4;3959:13;;3955:27;-1:-1:-1;3945:55:1;;3996:1;3993;3986:12;3945:55;4019:74;4085:7;4080:2;4067:16;4062:2;4058;4054:11;4019:74;:::i;4104:254::-;4172:6;4180;4233:2;4221:9;4212:7;4208:23;4204:32;4201:52;;;4249:1;4246;4239:12;4201:52;4285:9;4272:23;4262:33;;4314:38;4348:2;4337:9;4333:18;4314:38;:::i;:::-;4304:48;;4104:254;;;;;:::o;4548:683::-;4643:6;4651;4659;4712:2;4700:9;4691:7;4687:23;4683:32;4680:52;;;4728:1;4725;4718:12;4680:52;4764:9;4751:23;4741:33;;4825:2;4814:9;4810:18;4797:32;4848:18;4889:2;4881:6;4878:14;4875:34;;;4905:1;4902;4895:12;4875:34;4943:6;4932:9;4928:22;4918:32;;4988:7;4981:4;4977:2;4973:13;4969:27;4959:55;;5010:1;5007;5000:12;4959:55;5050:2;5037:16;5076:2;5068:6;5065:14;5062:34;;;5092:1;5089;5082:12;5062:34;5145:7;5140:2;5130:6;5127:1;5123:14;5119:2;5115:23;5111:32;5108:45;5105:65;;;5166:1;5163;5156:12;5105:65;5197:2;5193;5189:11;5179:21;;5219:6;5209:16;;;;;4548:683;;;;;:::o;5418:347::-;5483:6;5491;5544:2;5532:9;5523:7;5519:23;5515:32;5512:52;;;5560:1;5557;5550:12;5512:52;5583:29;5602:9;5583:29;:::i;:::-;5573:39;;5662:2;5651:9;5647:18;5634:32;5709:5;5702:13;5695:21;5688:5;5685:32;5675:60;;5731:1;5728;5721:12;5675:60;5754:5;5744:15;;;5418:347;;;;;:::o;5770:667::-;5865:6;5873;5881;5889;5942:3;5930:9;5921:7;5917:23;5913:33;5910:53;;;5959:1;5956;5949:12;5910:53;5982:29;6001:9;5982:29;:::i;:::-;5972:39;;6030:38;6064:2;6053:9;6049:18;6030:38;:::i;:::-;6020:48;;6115:2;6104:9;6100:18;6087:32;6077:42;;6170:2;6159:9;6155:18;6142:32;6197:18;6189:6;6186:30;6183:50;;;6229:1;6226;6219:12;6183:50;6252:22;;6305:4;6297:13;;6293:27;-1:-1:-1;6283:55:1;;6334:1;6331;6324:12;6283:55;6357:74;6423:7;6418:2;6405:16;6400:2;6396;6392:11;6357:74;:::i;:::-;6347:84;;;5770:667;;;;;;;:::o;6442:260::-;6510:6;6518;6571:2;6559:9;6550:7;6546:23;6542:32;6539:52;;;6587:1;6584;6577:12;6539:52;6610:29;6629:9;6610:29;:::i;:::-;6600:39;;6658:38;6692:2;6681:9;6677:18;6658:38;:::i;6707:356::-;6909:2;6891:21;;;6928:18;;;6921:30;6987:34;6982:2;6967:18;;6960:62;7054:2;7039:18;;6707:356::o;7068:380::-;7147:1;7143:12;;;;7190;;;7211:61;;7265:4;7257:6;7253:17;7243:27;;7211:61;7318:2;7310:6;7307:14;7287:18;7284:38;7281:161;;;7364:10;7359:3;7355:20;7352:1;7345:31;7399:4;7396:1;7389:15;7427:4;7424:1;7417:15;9398:127;9459:10;9454:3;9450:20;9447:1;9440:31;9490:4;9487:1;9480:15;9514:4;9511:1;9504:15;9530:128;9570:3;9601:1;9597:6;9594:1;9591:13;9588:39;;;9607:18;;:::i;:::-;-1:-1:-1;9643:9:1;;9530:128::o;9999:168::-;10039:7;10105:1;10101;10097:6;10093:14;10090:1;10087:21;10082:1;10075:9;10068:17;10064:45;10061:71;;;10112:18;;:::i;:::-;-1:-1:-1;10152:9:1;;9999:168::o;10520:340::-;10722:2;10704:21;;;10761:2;10741:18;;;10734:30;-1:-1:-1;;;10795:2:1;10780:18;;10773:46;10851:2;10836:18;;10520:340::o;11125:339::-;11327:2;11309:21;;;11366:2;11346:18;;;11339:30;-1:-1:-1;;;11400:2:1;11385:18;;11378:45;11455:2;11440:18;;11125:339::o;14755:415::-;14957:2;14939:21;;;14996:2;14976:18;;;14969:30;15035:34;15030:2;15015:18;;15008:62;-1:-1:-1;;;15101:2:1;15086:18;;15079:49;15160:3;15145:19;;14755:415::o;15801:637::-;16081:3;16119:6;16113:13;16135:53;16181:6;16176:3;16169:4;16161:6;16157:17;16135:53;:::i;:::-;16251:13;;16210:16;;;;16273:57;16251:13;16210:16;16307:4;16295:17;;16273:57;:::i;:::-;-1:-1:-1;;;16352:20:1;;16381:22;;;16430:1;16419:13;;15801:637;-1:-1:-1;;;;15801:637:1:o;18867:246::-;18907:4;-1:-1:-1;;;;;19020:10:1;;;;18990;;19042:12;;;19039:38;;;19057:18;;:::i;:::-;19094:13;;18867:246;-1:-1:-1;;;18867:246:1:o;19945:489::-;-1:-1:-1;;;;;20214:15:1;;;20196:34;;20266:15;;20261:2;20246:18;;20239:43;20313:2;20298:18;;20291:34;;;20361:3;20356:2;20341:18;;20334:31;;;20139:4;;20382:46;;20408:19;;20400:6;20382:46;:::i;:::-;20374:54;19945:489;-1:-1:-1;;;;;;19945:489:1:o;20439:249::-;20508:6;20561:2;20549:9;20540:7;20536:23;20532:32;20529:52;;;20577:1;20574;20567:12;20529:52;20609:9;20603:16;20628:30;20652:5;20628:30;:::i;20693:135::-;20732:3;-1:-1:-1;;20753:17:1;;20750:43;;;20773:18;;:::i;:::-;-1:-1:-1;20820:1:1;20809:13;;20693:135::o;20833:127::-;20894:10;20889:3;20885:20;20882:1;20875:31;20925:4;20922:1;20915:15;20949:4;20946:1;20939:15;20965:120;21005:1;21031;21021:35;;21036:18;;:::i;:::-;-1:-1:-1;21070:9:1;;20965:120::o;21090:125::-;21130:4;21158:1;21155;21152:8;21149:34;;;21163:18;;:::i;:::-;-1:-1:-1;21200:9:1;;21090:125::o;21220:112::-;21252:1;21278;21268:35;;21283:18;;:::i;:::-;-1:-1:-1;21317:9:1;;21220:112::o;21337:127::-;21398:10;21393:3;21389:20;21386:1;21379:31;21429:4;21426:1;21419:15;21453:4;21450:1;21443:15
Swarm Source
ipfs://ca37819d6340e150e33b89f89d2fc0ec23b3897f2c0659aee909af17234872a2
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.