Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
357 PE
Holders
92
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 PELoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PrideElixer
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-30 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting 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; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // 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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.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: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @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); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * 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) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), 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-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @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 for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @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 transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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 { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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 { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: contracts/PrideElixir.sol //SPDX-License-Identifier: MIT pragma solidity >= 0.8.7; contract PrideElixer is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; //File type string public uriSuffix = '.json'; //Prices uint256 public cost = 0.005 ether; uint256 public whitelistCost = 0.00 ether; //Inventory bytes32 private whitelistRoot; string public baseURI; uint256 public publicSupply = 3000; uint256 public whiteListSupply = 3869; uint256 public RESERVE_SUPPLY = 100; //limits uint256 public maxMintAmountPerWallet = 3; uint256 public maxMintAmountPerWhitelist = 3; //keep track of counts uint256 public reserveMinted; uint256 public minted; uint256 public whitelistMinted; //Utility bool public paused = true; bool public whiteListingSale = true; //mapping mapping(address => uint256) public addressMintedBalance; constructor( string memory _tokenName, string memory _tokenSymbol, uint256 _publicSupply, uint256 _whiteListSupply, uint256 _maxMintAmountPerWallet, uint256 _maxMintAmountPerWhitelist, string memory _initialURI ) ERC721A(_tokenName, _tokenSymbol) { //set publicSupply supply amount setPublicSupply(_publicSupply); //set whiteListSupply supply amount setWhiteListSupply(_whiteListSupply); //set max mint amount per transcation (per wallet) setMaxMintAmountPerWallet(_maxMintAmountPerWallet); setMaxMintAmountPerWhitelist(_maxMintAmountPerWhitelist); //set initial URI baseURI = _initialURI; } // =============================================================================// /** * Do not allow calls from other contracts. */ modifier noBots() { require(msg.sender == tx.origin, "Pride: No bots"); _; } /** * Ensure amount of per wallet is within the mint limit. * Ensure amount of tokens to mint is within the limit. */ modifier mintLimitCompliance(uint256 _mintAmount) { require(_mintAmount > 0, 'Mint amount should be greater than 0'); if(whiteListingSale){ require(addressMintedBalance[msg.sender] + _mintAmount <= maxMintAmountPerWhitelist, "Pride: Whitelist sale allowance Exceeded"); require( whitelistMinted + _mintAmount <= whiteListSupply , "Pride :whitelist supply Exceeded"); } require(addressMintedBalance[msg.sender] + _mintAmount <= maxMintAmountPerWallet, "Pride: Public sale allowance Exceeds"); require( minted + _mintAmount <= publicSupply , "Pride :Max supply Exceeded"); _; } /** * Set the presale Merkle root. * @dev The Merkle root is calculated from [address, allowance] pairs. * @param _root The new merkle roo */ function setWhitelistingRoot(bytes32 _root) public onlyOwner { whitelistRoot = _root; } /** * Verify the Merkle proof is valid. * @param _leafNode The leaf. A [address, availableAmt] pair * @param proof The Merkle proof used to validate the leaf is in the root */ function _verify(bytes32 _leafNode, bytes32[] memory proof) internal view returns (bool) { return MerkleProof.verify(proof, whitelistRoot, _leafNode); } /** * Generate the leaf node * @param account used the hash of tokenID concatenated with the account address */ function _leaf(address account) internal pure returns (bytes32) { return keccak256(abi.encodePacked(account)); } /** * Mint tokens during the presale. * @notice This function is only available to those on the allowlist. * @param _mintAmount The number of tokens to mint. * @param proof The Merkle proof used to validate the leaf is in the root. */ function mintWhitelist(bytes32[] calldata proof, uint256 _mintAmount) external payable noBots mintLimitCompliance(_mintAmount) { require(!paused); require(whiteListingSale, "Pride: Whitelisting not enabled"); require(_verify(_leaf(msg.sender), proof), "Pride: Invalid proof"); require(msg.value >= whitelistCost * _mintAmount, "Pride: Insuffient funds "); _mintLoop(msg.sender, _mintAmount); whitelistMinted += _mintAmount; addressMintedBalance[msg.sender] += _mintAmount; } /** * Public mint. * @param _mintAmount Amount of tokens to mint. */ function mint(uint256 _mintAmount) external payable noBots mintLimitCompliance(_mintAmount) { require(!paused, 'The contract is paused!'); require(!whiteListingSale, "You cant mint on Presale"); //Reamaining whitelist ill be free for public uint256 a = whiteListSupply - whitelistMinted; if(whitelistMinted > a) { //not free require(msg.value >= cost * _mintAmount, "Insuffient funds"); minted +=_mintAmount; }else{ if(whitelistMinted + _mintAmount > whiteListSupply){ uint256 c = _mintAmount - a; //pay only for c require(msg.value >= cost * c, "Insuffient funds"); minted += c; whitelistMinted += a; }else{ whitelistMinted += _mintAmount; } } _mintLoop(msg.sender, _mintAmount); addressMintedBalance[msg.sender] += _mintAmount; } /** * airdrop mint. * @param _mintAmount Amount of tokens to mint. * @param _receiver Address to mint to. */ function mintForAddress(uint256 _mintAmount, address _receiver) external onlyOwner { require(_mintAmount > 0, 'Mint amount should be greater than 0'); uint256 maxSupply = publicSupply + RESERVE_SUPPLY + whiteListSupply; require( totalSupply() + _mintAmount <= maxSupply , "Pride :Max supply Exceeded"); _mintLoop(_receiver, _mintAmount); minted += _mintAmount; } /** * Team reserved mint. * @param to Address to mint to. * @param quantity Amount of tokens to mint. */ function mintReserved(address to, uint256 quantity) external onlyOwner { require(reserveMinted + quantity <= RESERVE_SUPPLY, "Pride: Reseve supply Exceeded"); _mintLoop(to, quantity); reserveMinted += quantity; } /** * Check what are the token ids owned by wallet address * @param _owner account address. */ function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 maxSupply = publicSupply + RESERVE_SUPPLY + whiteListSupply; uint256 currentTokenId = 1; uint256 ownedTokenIndex = 0; while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } /** * Change the starting tokenId to 1. */ function _startTokenId() internal view virtual override returns (uint256) { return 1; } /** * Change the baseURI */ function _baseURI() internal view virtual override returns (string memory) { return baseURI; } /** * @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 currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ''; } /** * Update whitelist token price * @param _cost The new token price */ function setWhitelistCost(uint256 _cost) public onlyOwner { whitelistCost = _cost; } /** * Update token price. * @param _cost The new token price */ function setCost(uint256 _cost) public onlyOwner { cost = _cost; } /** * Update team supply * @param _supply The new token price */ function setReserveSpply(uint256 _supply) public onlyOwner { RESERVE_SUPPLY = _supply; } /** * Update colletion publicSupply. * @param _supply The new token price */ function setPublicSupply(uint256 _supply) public onlyOwner { publicSupply = _supply; } /** * Update colletion publicSupply. * @param _supply The new token price */ function setWhiteListSupply(uint256 _supply) public onlyOwner { whiteListSupply = _supply; } /** * Update whilist mint limit per wallet. * @param _maxMintAmountPerWhitelist The new token price */ function setMaxMintAmountPerWhitelist(uint256 _maxMintAmountPerWhitelist) public onlyOwner { maxMintAmountPerWhitelist = _maxMintAmountPerWhitelist; } /** * Update sales mint limit per wallet. * @param _maxMintAmountPerWallet The new token price */ function setMaxMintAmountPerWallet(uint256 _maxMintAmountPerWallet) public onlyOwner { maxMintAmountPerWallet = _maxMintAmountPerWallet; } /** * Sets base URI. * @param _newBaseURI The base URI */ function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } /** * Sets file type. * @param _uriSuffix The base URI */ function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } /** * On and Off public sales. */ function togglePause() public onlyOwner { paused = !paused; } /** * On and Off whitlist sale. */ function toggleWhitlist() public onlyOwner { whiteListingSale = !whiteListingSale; } // =============================================================================// function _mintLoop(address _receiver, uint256 _mintAmount) internal { _safeMint(_receiver, _mintAmount); } address private constant WALLET_A = 0x9dC7A7D3c4FD55FaC37f62BA311E9759F142c525; function withdraw() public onlyOwner nonReentrant { uint256 balance = address(this).balance; require(balance > 0,"Not have Eth"); // splitting the initial sale funds //5% of initial sale funds will go the A wallet (bool hs, ) = payable(WALLET_A).call{value: balance * 5 / 100}(""); require(hs, "Failed to send to WALLET_A."); // ============================================================================= // remaining funds ill be go to owner // ============================================================================= (bool os, ) = payable(owner()).call{value: balance}(''); require(os,"Failed to send to owner wallet."); // ============================================================================= } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_publicSupply","type":"uint256"},{"internalType":"uint256","name":"_whiteListSupply","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerWallet","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerWhitelist","type":"uint256"},{"internalType":"string","name":"_initialURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"RESERVE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerWallet","type":"uint256"}],"name":"setMaxMintAmountPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerWhitelist","type":"uint256"}],"name":"setMaxMintAmountPerWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setPublicSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setReserveSpply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setWhiteListSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setWhitelistingRoot","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":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitlist","outputs":[],"stateMutability":"nonpayable","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":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListingSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a908051906020019062000051929190620003be565b506611c37937e08000600b556000600c55610bb8600f55610f1d6010556064601155600360125560036013556001601760006101000a81548160ff0219169083151502179055506001601760016101000a81548160ff021916908315150217905550348015620000c057600080fd5b506040516200522a3803806200522a8339818101604052810190620000e6919062000503565b8686816002908051906020019062000100929190620003be565b50806003908051906020019062000119929190620003be565b506200012a620001c460201b60201c565b60008190555050506200015262000146620001cd60201b60201c565b620001d560201b60201c565b60016009819055506200016b856200029b60201b60201c565b6200017c84620002b560201b60201c565b6200018d83620002cf60201b60201c565b6200019e82620002e960201b60201c565b80600e9080519060200190620001b6929190620003be565b50505050505050506200083e565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002ab6200030360201b60201c565b80600f8190555050565b620002c56200030360201b60201c565b8060108190555050565b620002df6200030360201b60201c565b8060128190555050565b620002f96200030360201b60201c565b8060138190555050565b62000313620001cd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003396200039460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000389906200063a565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003cc906200070c565b90600052602060002090601f016020900481019282620003f057600085556200043c565b82601f106200040b57805160ff19168380011785556200043c565b828001600101855582156200043c579182015b828111156200043b5782518255916020019190600101906200041e565b5b5090506200044b91906200044f565b5090565b5b808211156200046a57600081600090555060010162000450565b5090565b6000620004856200047f8462000685565b6200065c565b905082815260208101848484011115620004a457620004a3620007db565b5b620004b1848285620006d6565b509392505050565b600082601f830112620004d157620004d0620007d6565b5b8151620004e38482602086016200046e565b91505092915050565b600081519050620004fd8162000824565b92915050565b600080600080600080600060e0888a031215620005255762000524620007e5565b5b600088015167ffffffffffffffff811115620005465762000545620007e0565b5b620005548a828b01620004b9565b975050602088015167ffffffffffffffff811115620005785762000577620007e0565b5b620005868a828b01620004b9565b9650506040620005998a828b01620004ec565b9550506060620005ac8a828b01620004ec565b9450506080620005bf8a828b01620004ec565b93505060a0620005d28a828b01620004ec565b92505060c088015167ffffffffffffffff811115620005f657620005f5620007e0565b5b620006048a828b01620004b9565b91505092959891949750929550565b600062000622602083620006bb565b91506200062f82620007fb565b602082019050919050565b60006020820190508181036000830152620006558162000613565b9050919050565b6000620006686200067b565b905062000676828262000742565b919050565b6000604051905090565b600067ffffffffffffffff821115620006a357620006a2620007a7565b5b620006ae82620007ea565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b83811015620006f6578082015181840152602081019050620006d9565b8381111562000706576000848401525b50505050565b600060028204905060018216806200072557607f821691505b602082108114156200073c576200073b62000778565b5b50919050565b6200074d82620007ea565b810181811067ffffffffffffffff821117156200076f576200076e620007a7565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200082f81620006cc565b81146200083b57600080fd5b50565b6149dc806200084e6000396000f3fe6080604052600436106102c95760003560e01c806370a0823111610175578063aa66797b116100dc578063d49479eb11610095578063e985e9c51161006f578063e985e9c514610a7a578063ee89121214610ab7578063efbd73f414610ae0578063f2fde38b14610b09576102c9565b8063d49479eb146109fb578063e5a88cdb14610a24578063e7b99ec714610a4f576102c9565b8063aa66797b14610911578063b88d4fde1461093c578063bc951b9114610965578063c4ae316814610990578063c5a6534f146109a7578063c87b56dd146109be576102c9565b80638da5cb5b1161012e5780638da5cb5b14610831578063923e5f5e1461085c57806395d89b4114610885578063a0712d68146108b0578063a22cb465146108cc578063a6d612f9146108f5576102c9565b806370a0823114610737578063715018a614610774578063766b7d091461078b578063772e5748146107b45780637de55fe1146107dd5780638990694f14610806576102c9565b8063381a3506116102345780634f02c420116101ed5780635c975abb116101c75780635c975abb146106795780635e84d723146106a45780636352211e146106cf5780636c0360eb1461070c576102c9565b80634f02c420146105fa5780635503a0e81461062557806355f804b314610650576102c9565b8063381a3506146105005780633ccfd60b1461052957806342842e0e14610540578063438b63001461056957806344a0d68a146105a65780634c81433f146105cf576102c9565b806316ba10e01161028657806316ba10e0146103f257806318160ddd1461041b57806318cae2691461044657806323b872dd1461048357806326aa420a146104ac5780632cefffa7146104d5576102c9565b806301ffc9a7146102ce57806306fdde031461030b578063081812fc146103365780630855ff9a14610373578063095ea7b31461039e57806313faede6146103c7575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f09190613682565b610b32565b6040516103029190613d46565b60405180910390f35b34801561031757600080fd5b50610320610bc4565b60405161032d9190613d61565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190613725565b610c56565b60405161036a9190613cbd565b60405180910390f35b34801561037f57600080fd5b50610388610cd2565b6040516103959190614003565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c091906135b5565b610cd8565b005b3480156103d357600080fd5b506103dc610e19565b6040516103e99190614003565b60405180910390f35b3480156103fe57600080fd5b50610419600480360381019061041491906136dc565b610e1f565b005b34801561042757600080fd5b50610430610e41565b60405161043d9190614003565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190613432565b610e58565b60405161047a9190614003565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a5919061349f565b610e70565b005b3480156104b857600080fd5b506104d360048036038101906104ce9190613725565b611195565b005b3480156104e157600080fd5b506104ea6111a7565b6040516104f79190614003565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190613725565b6111ad565b005b34801561053557600080fd5b5061053e6111bf565b005b34801561054c57600080fd5b506105676004803603810190610562919061349f565b6113f5565b005b34801561057557600080fd5b50610590600480360381019061058b9190613432565b611415565b60405161059d9190613d24565b60405180910390f35b3480156105b257600080fd5b506105cd60048036038101906105c89190613725565b611540565b005b3480156105db57600080fd5b506105e4611552565b6040516105f19190614003565b60405180910390f35b34801561060657600080fd5b5061060f611558565b60405161061c9190614003565b60405180910390f35b34801561063157600080fd5b5061063a61155e565b6040516106479190613d61565b60405180910390f35b34801561065c57600080fd5b50610677600480360381019061067291906136dc565b6115ec565b005b34801561068557600080fd5b5061068e61160e565b60405161069b9190613d46565b60405180910390f35b3480156106b057600080fd5b506106b9611621565b6040516106c69190614003565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f19190613725565b611627565b6040516107039190613cbd565b60405180910390f35b34801561071857600080fd5b50610721611639565b60405161072e9190613d61565b60405180910390f35b34801561074357600080fd5b5061075e60048036038101906107599190613432565b6116c7565b60405161076b9190614003565b60405180910390f35b34801561078057600080fd5b50610789611780565b005b34801561079757600080fd5b506107b260048036038101906107ad9190613725565b611794565b005b3480156107c057600080fd5b506107db60048036038101906107d69190613725565b6117a6565b005b3480156107e957600080fd5b5061080460048036038101906107ff91906135b5565b6117b8565b005b34801561081257600080fd5b5061081b611839565b6040516108289190614003565b60405180910390f35b34801561083d57600080fd5b5061084661183f565b6040516108539190613cbd565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e9190613725565b611869565b005b34801561089157600080fd5b5061089a61187b565b6040516108a79190613d61565b60405180910390f35b6108ca60048036038101906108c59190613725565b61190d565b005b3480156108d857600080fd5b506108f360048036038101906108ee9190613575565b611df2565b005b61090f600480360381019061090a91906135f5565b611f6a565b005b34801561091d57600080fd5b506109266123be565b6040516109339190614003565b60405180910390f35b34801561094857600080fd5b50610963600480360381019061095e91906134f2565b6123c4565b005b34801561097157600080fd5b5061097a612437565b6040516109879190614003565b60405180910390f35b34801561099c57600080fd5b506109a561243d565b005b3480156109b357600080fd5b506109bc612471565b005b3480156109ca57600080fd5b506109e560048036038101906109e09190613725565b6124a5565b6040516109f29190613d61565b60405180910390f35b348015610a0757600080fd5b50610a226004803603810190610a1d9190613725565b61254f565b005b348015610a3057600080fd5b50610a39612561565b604051610a469190613d46565b60405180910390f35b348015610a5b57600080fd5b50610a64612574565b604051610a719190614003565b60405180910390f35b348015610a8657600080fd5b50610aa16004803603810190610a9c919061345f565b61257a565b604051610aae9190613d46565b60405180910390f35b348015610ac357600080fd5b50610ade6004803603810190610ad99190613655565b61260e565b005b348015610aec57600080fd5b50610b076004803603810190610b029190613752565b612620565b005b348015610b1557600080fd5b50610b306004803603810190610b2b9190613432565b612709565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b8d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bbd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610bd390614316565b80601f0160208091040260200160405190810160405280929190818152602001828054610bff90614316565b8015610c4c5780601f10610c2157610100808354040283529160200191610c4c565b820191906000526020600020905b815481529060010190602001808311610c2f57829003601f168201915b5050505050905090565b6000610c618261278d565b610c97576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60105481565b6000610ce382611627565b90508073ffffffffffffffffffffffffffffffffffffffff16610d046127ec565b73ffffffffffffffffffffffffffffffffffffffff1614610d6757610d3081610d2b6127ec565b61257a565b610d66576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b5481565b610e276127f4565b80600a9080519060200190610e3d9291906131db565b5050565b6000610e4b612872565b6001546000540303905090565b60186020528060005260406000206000915090505481565b6000610e7b8261287b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ee2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610eee84612949565b91509150610f048187610eff6127ec565b61296b565b610f5057610f1986610f146127ec565b61257a565b610f4f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610fb7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fc486868660016129af565b8015610fcf57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061109d856110798888876129b5565b7c0200000000000000000000000000000000000000000000000000000000176129dd565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611125576000600185019050600060046000838152602001908152602001600020541415611123576000548114611122578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461118d8686866001612a08565b505050505050565b61119d6127f4565b80600f8190555050565b60135481565b6111b56127f4565b8060108190555050565b6111c76127f4565b6002600954141561120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490613fa3565b60405180910390fd5b600260098190555060004790506000811161125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490613fc3565b60405180910390fd5b6000739dc7a7d3c4fd55fac37f62ba311e9759f142c52573ffffffffffffffffffffffffffffffffffffffff16606460058461129991906141c8565b6112a39190614197565b6040516112af90613ca8565b60006040518083038185875af1925050503d80600081146112ec576040519150601f19603f3d011682016040523d82523d6000602084013e6112f1565b606091505b5050905080611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132c90613fe3565b60405180910390fd5b600061133f61183f565b73ffffffffffffffffffffffffffffffffffffffff168360405161136290613ca8565b60006040518083038185875af1925050503d806000811461139f576040519150601f19603f3d011682016040523d82523d6000602084013e6113a4565b606091505b50509050806113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df90613dc3565b60405180910390fd5b5050506001600981905550565b611410838383604051806020016040528060008152506123c4565b505050565b60606000611422836116c7565b905060008167ffffffffffffffff8111156114405761143f6144d3565b5b60405190808252806020026020018201604052801561146e5781602001602082028036833780820191505090505b5090506000601054601154600f546114869190614141565b6114909190614141565b905060006001905060005b84811080156114aa5750828211155b156115335760006114ba83611627565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561151f5782858381518110611504576115036144a4565b5b602002602001018181525050818061151b90614379565b9250505b828061152a90614379565b9350505061149b565b8395505050505050919050565b6115486127f4565b80600b8190555050565b60145481565b60155481565b600a805461156b90614316565b80601f016020809104026020016040519081016040528092919081815260200182805461159790614316565b80156115e45780601f106115b9576101008083540402835291602001916115e4565b820191906000526020600020905b8154815290600101906020018083116115c757829003601f168201915b505050505081565b6115f46127f4565b80600e908051906020019061160a9291906131db565b5050565b601760009054906101000a900460ff1681565b600f5481565b60006116328261287b565b9050919050565b600e805461164690614316565b80601f016020809104026020016040519081016040528092919081815260200182805461167290614316565b80156116bf5780601f10611694576101008083540402835291602001916116bf565b820191906000526020600020905b8154815290600101906020018083116116a257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561172f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117886127f4565b6117926000612a0e565b565b61179c6127f4565b8060128190555050565b6117ae6127f4565b8060138190555050565b6117c06127f4565b601154816014546117d19190614141565b1115611812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180990613f23565b60405180910390fd5b61181c8282612ad4565b806014600082825461182e9190614141565b925050819055505050565b60165481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118716127f4565b8060118190555050565b60606003805461188a90614316565b80601f01602080910402602001604051908101604052809291908181526020018280546118b690614316565b80156119035780601f106118d857610100808354040283529160200191611903565b820191906000526020600020905b8154815290600101906020018083116118e657829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290613e63565b60405180910390fd5b80600081116119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690613f63565b60405180910390fd5b601760019054906101000a900460ff1615611ab65760135481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a229190614141565b1115611a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5a90613ee3565b60405180910390fd5b60105481601654611a749190614141565b1115611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac90613f03565b60405180910390fd5b5b60125481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b049190614141565b1115611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90613e43565b60405180910390fd5b600f5481601554611b569190614141565b1115611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90613f83565b60405180910390fd5b601760009054906101000a900460ff1615611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde90613ea3565b60405180910390fd5b601760019054906101000a900460ff1615611c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2e90613de3565b60405180910390fd5b6000601654601054611c499190614222565b9050806016541115611cc35782600b54611c6391906141c8565b341015611ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9c90613e03565b60405180910390fd5b8260156000828254611cb79190614141565b92505081905550611d8d565b60105483601654611cd49190614141565b1115611d725760008184611ce89190614222565b905080600b54611cf891906141c8565b341015611d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3190613e03565b60405180910390fd5b8060156000828254611d4c9190614141565b925050819055508160166000828254611d659190614141565b9250508190555050611d8c565b8260166000828254611d849190614141565b925050819055505b5b611d973384612ad4565b82601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611de69190614141565b92505081905550505050565b611dfa6127ec565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e5f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611e6c6127ec565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f196127ec565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f5e9190613d46565b60405180910390a35050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf90613e63565b60405180910390fd5b806000811161201c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201390613f63565b60405180910390fd5b601760019054906101000a900460ff16156121135760135481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461207f9190614141565b11156120c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b790613ee3565b60405180910390fd5b601054816016546120d19190614141565b1115612112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210990613f03565b60405180910390fd5b5b60125481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121619190614141565b11156121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990613e43565b60405180910390fd5b600f54816015546121b39190614141565b11156121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb90613f83565b60405180910390fd5b601760009054906101000a900460ff161561220e57600080fd5b601760019054906101000a900460ff1661225d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225490613d83565b60405180910390fd5b6122b061226933612ae2565b858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612b12565b6122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e690613e23565b60405180910390fd5b81600c546122fd91906141c8565b34101561233f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233690613f43565b60405180910390fd5b6123493383612ad4565b816016600082825461235b9190614141565b9250508190555081601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123b19190614141565b9250508190555050505050565b60115481565b6123cf848484610e70565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612431576123fa84848484612b29565b612430576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60125481565b6124456127f4565b601760009054906101000a900460ff1615601760006101000a81548160ff021916908315150217905550565b6124796127f4565b601760019054906101000a900460ff1615601760016101000a81548160ff021916908315150217905550565b60606124b08261278d565b6124ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e690613ec3565b60405180910390fd5b60006124f9612c89565b905060008151116125195760405180602001604052806000815250612547565b8061252384612d1b565b600a60405160200161253793929190613c77565b6040516020818303038152906040525b915050919050565b6125576127f4565b80600c8190555050565b601760019054906101000a900460ff1681565b600c5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126166127f4565b80600d8190555050565b6126286127f4565b6000821161266b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266290613f63565b60405180910390fd5b6000601054601154600f546126809190614141565b61268a9190614141565b90508083612696610e41565b6126a09190614141565b11156126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d890613f83565b60405180910390fd5b6126eb8284612ad4565b82601560008282546126fd9190614141565b92505081905550505050565b6127116127f4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277890613da3565b60405180910390fd5b61278a81612a0e565b50565b600081612798612872565b111580156127a7575060005482105b80156127e5575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6127fc612e7c565b73ffffffffffffffffffffffffffffffffffffffff1661281a61183f565b73ffffffffffffffffffffffffffffffffffffffff1614612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790613e83565b60405180910390fd5b565b60006001905090565b6000808290508061288a612872565b11612912576000548110156129115760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561290f575b60008114156129055760046000836001900393508381526020019081526020016000205490506128da565b8092505050612944565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129cc868684612e84565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ade8282612e8d565b5050565b600081604051602001612af59190613c5c565b604051602081830303815290604052805190602001209050919050565b6000612b2182600d5485612eab565b905092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b4f6127ec565b8786866040518563ffffffff1660e01b8152600401612b719493929190613cd8565b602060405180830381600087803b158015612b8b57600080fd5b505af1925050508015612bbc57506040513d601f19601f82011682018060405250810190612bb991906136af565b60015b612c36573d8060008114612bec576040519150601f19603f3d011682016040523d82523d6000602084013e612bf1565b606091505b50600081511415612c2e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054612c9890614316565b80601f0160208091040260200160405190810160405280929190818152602001828054612cc490614316565b8015612d115780601f10612ce657610100808354040283529160200191612d11565b820191906000526020600020905b815481529060010190602001808311612cf457829003601f168201915b5050505050905090565b60606000821415612d63576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e77565b600082905060005b60008214612d95578080612d7e90614379565b915050600a82612d8e9190614197565b9150612d6b565b60008167ffffffffffffffff811115612db157612db06144d3565b5b6040519080825280601f01601f191660200182016040528015612de35781602001600182028036833780820191505090505b5090505b60008514612e7057600182612dfc9190614222565b9150600a85612e0b91906143e6565b6030612e179190614141565b60f81b818381518110612e2d57612e2c6144a4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e699190614197565b9450612de7565b8093505050505b919050565b600033905090565b60009392505050565b612ea7828260405180602001604052806000815250612ec2565b5050565b600082612eb88584612f5f565b1490509392505050565b612ecc8383612fb5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f5a57600080549050600083820390505b612f0c6000868380600101945086612b29565b612f42576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612ef9578160005414612f5757600080fd5b50505b505050565b60008082905060005b8451811015612faa57612f9582868381518110612f8857612f876144a4565b5b6020026020010151613189565b91508080612fa290614379565b915050612f68565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613022576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561305d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61306a60008483856129af565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506130e1836130d260008660006129b5565b6130db856131b4565b176129dd565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613105578060008190555050506131846000848385612a08565b505050565b60008183106131a15761319c82846131c4565b6131ac565b6131ab83836131c4565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b8280546131e790614316565b90600052602060002090601f0160209004810192826132095760008555613250565b82601f1061322257805160ff1916838001178555613250565b82800160010185558215613250579182015b8281111561324f578251825591602001919060010190613234565b5b50905061325d9190613261565b5090565b5b8082111561327a576000816000905550600101613262565b5090565b600061329161328c84614043565b61401e565b9050828152602081018484840111156132ad576132ac614511565b5b6132b88482856142d4565b509392505050565b60006132d36132ce84614074565b61401e565b9050828152602081018484840111156132ef576132ee614511565b5b6132fa8482856142d4565b509392505050565b60008135905061331181614933565b92915050565b60008083601f84011261332d5761332c614507565b5b8235905067ffffffffffffffff81111561334a57613349614502565b5b6020830191508360208202830111156133665761336561450c565b5b9250929050565b60008135905061337c8161494a565b92915050565b60008135905061339181614961565b92915050565b6000813590506133a681614978565b92915050565b6000815190506133bb81614978565b92915050565b600082601f8301126133d6576133d5614507565b5b81356133e684826020860161327e565b91505092915050565b600082601f83011261340457613403614507565b5b81356134148482602086016132c0565b91505092915050565b60008135905061342c8161498f565b92915050565b6000602082840312156134485761344761451b565b5b600061345684828501613302565b91505092915050565b600080604083850312156134765761347561451b565b5b600061348485828601613302565b925050602061349585828601613302565b9150509250929050565b6000806000606084860312156134b8576134b761451b565b5b60006134c686828701613302565b93505060206134d786828701613302565b92505060406134e88682870161341d565b9150509250925092565b6000806000806080858703121561350c5761350b61451b565b5b600061351a87828801613302565b945050602061352b87828801613302565b935050604061353c8782880161341d565b925050606085013567ffffffffffffffff81111561355d5761355c614516565b5b613569878288016133c1565b91505092959194509250565b6000806040838503121561358c5761358b61451b565b5b600061359a85828601613302565b92505060206135ab8582860161336d565b9150509250929050565b600080604083850312156135cc576135cb61451b565b5b60006135da85828601613302565b92505060206135eb8582860161341d565b9150509250929050565b60008060006040848603121561360e5761360d61451b565b5b600084013567ffffffffffffffff81111561362c5761362b614516565b5b61363886828701613317565b9350935050602061364b8682870161341d565b9150509250925092565b60006020828403121561366b5761366a61451b565b5b600061367984828501613382565b91505092915050565b6000602082840312156136985761369761451b565b5b60006136a684828501613397565b91505092915050565b6000602082840312156136c5576136c461451b565b5b60006136d3848285016133ac565b91505092915050565b6000602082840312156136f2576136f161451b565b5b600082013567ffffffffffffffff8111156137105761370f614516565b5b61371c848285016133ef565b91505092915050565b60006020828403121561373b5761373a61451b565b5b60006137498482850161341d565b91505092915050565b600080604083850312156137695761376861451b565b5b60006137778582860161341d565b925050602061378885828601613302565b9150509250929050565b600061379e8383613c3e565b60208301905092915050565b6137b381614256565b82525050565b6137ca6137c582614256565b6143c2565b82525050565b60006137db826140ca565b6137e581856140f8565b93506137f0836140a5565b8060005b838110156138215781516138088882613792565b9750613813836140eb565b9250506001810190506137f4565b5085935050505092915050565b61383781614268565b82525050565b6000613848826140d5565b6138528185614109565b93506138628185602086016142e3565b61386b81614520565b840191505092915050565b6000613881826140e0565b61388b8185614125565b935061389b8185602086016142e3565b6138a481614520565b840191505092915050565b60006138ba826140e0565b6138c48185614136565b93506138d48185602086016142e3565b80840191505092915050565b600081546138ed81614316565b6138f78186614136565b94506001821660008114613912576001811461392357613956565b60ff19831686528186019350613956565b61392c856140b5565b60005b8381101561394e5781548189015260018201915060208101905061392f565b838801955050505b50505092915050565b600061396c601f83614125565b91506139778261453e565b602082019050919050565b600061398f602683614125565b915061399a82614567565b604082019050919050565b60006139b2601f83614125565b91506139bd826145b6565b602082019050919050565b60006139d5601883614125565b91506139e0826145df565b602082019050919050565b60006139f8601083614125565b9150613a0382614608565b602082019050919050565b6000613a1b601483614125565b9150613a2682614631565b602082019050919050565b6000613a3e602483614125565b9150613a498261465a565b604082019050919050565b6000613a61600e83614125565b9150613a6c826146a9565b602082019050919050565b6000613a84602083614125565b9150613a8f826146d2565b602082019050919050565b6000613aa7601783614125565b9150613ab2826146fb565b602082019050919050565b6000613aca602f83614125565b9150613ad582614724565b604082019050919050565b6000613aed60008361411a565b9150613af882614773565b600082019050919050565b6000613b10602883614125565b9150613b1b82614776565b604082019050919050565b6000613b33602083614125565b9150613b3e826147c5565b602082019050919050565b6000613b56601d83614125565b9150613b61826147ee565b602082019050919050565b6000613b79601883614125565b9150613b8482614817565b602082019050919050565b6000613b9c602483614125565b9150613ba782614840565b604082019050919050565b6000613bbf601a83614125565b9150613bca8261488f565b602082019050919050565b6000613be2601f83614125565b9150613bed826148b8565b602082019050919050565b6000613c05600c83614125565b9150613c10826148e1565b602082019050919050565b6000613c28601b83614125565b9150613c338261490a565b602082019050919050565b613c47816142ca565b82525050565b613c56816142ca565b82525050565b6000613c6882846137b9565b60148201915081905092915050565b6000613c8382866138af565b9150613c8f82856138af565b9150613c9b82846138e0565b9150819050949350505050565b6000613cb382613ae0565b9150819050919050565b6000602082019050613cd260008301846137aa565b92915050565b6000608082019050613ced60008301876137aa565b613cfa60208301866137aa565b613d076040830185613c4d565b8181036060830152613d19818461383d565b905095945050505050565b60006020820190508181036000830152613d3e81846137d0565b905092915050565b6000602082019050613d5b600083018461382e565b92915050565b60006020820190508181036000830152613d7b8184613876565b905092915050565b60006020820190508181036000830152613d9c8161395f565b9050919050565b60006020820190508181036000830152613dbc81613982565b9050919050565b60006020820190508181036000830152613ddc816139a5565b9050919050565b60006020820190508181036000830152613dfc816139c8565b9050919050565b60006020820190508181036000830152613e1c816139eb565b9050919050565b60006020820190508181036000830152613e3c81613a0e565b9050919050565b60006020820190508181036000830152613e5c81613a31565b9050919050565b60006020820190508181036000830152613e7c81613a54565b9050919050565b60006020820190508181036000830152613e9c81613a77565b9050919050565b60006020820190508181036000830152613ebc81613a9a565b9050919050565b60006020820190508181036000830152613edc81613abd565b9050919050565b60006020820190508181036000830152613efc81613b03565b9050919050565b60006020820190508181036000830152613f1c81613b26565b9050919050565b60006020820190508181036000830152613f3c81613b49565b9050919050565b60006020820190508181036000830152613f5c81613b6c565b9050919050565b60006020820190508181036000830152613f7c81613b8f565b9050919050565b60006020820190508181036000830152613f9c81613bb2565b9050919050565b60006020820190508181036000830152613fbc81613bd5565b9050919050565b60006020820190508181036000830152613fdc81613bf8565b9050919050565b60006020820190508181036000830152613ffc81613c1b565b9050919050565b60006020820190506140186000830184613c4d565b92915050565b6000614028614039565b90506140348282614348565b919050565b6000604051905090565b600067ffffffffffffffff82111561405e5761405d6144d3565b5b61406782614520565b9050602081019050919050565b600067ffffffffffffffff82111561408f5761408e6144d3565b5b61409882614520565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061414c826142ca565b9150614157836142ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561418c5761418b614417565b5b828201905092915050565b60006141a2826142ca565b91506141ad836142ca565b9250826141bd576141bc614446565b5b828204905092915050565b60006141d3826142ca565b91506141de836142ca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561421757614216614417565b5b828202905092915050565b600061422d826142ca565b9150614238836142ca565b92508282101561424b5761424a614417565b5b828203905092915050565b6000614261826142aa565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143015780820151818401526020810190506142e6565b83811115614310576000848401525b50505050565b6000600282049050600182168061432e57607f821691505b6020821081141561434257614341614475565b5b50919050565b61435182614520565b810181811067ffffffffffffffff821117156143705761436f6144d3565b5b80604052505050565b6000614384826142ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143b7576143b6614417565b5b600182019050919050565b60006143cd826143d4565b9050919050565b60006143df82614531565b9050919050565b60006143f1826142ca565b91506143fc836142ca565b92508261440c5761440b614446565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f50726964653a2057686974656c697374696e67206e6f7420656e61626c656400600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e6420746f206f776e65722077616c6c65742e00600082015250565b7f596f752063616e74206d696e74206f6e2050726573616c650000000000000000600082015250565b7f496e7375666669656e742066756e647300000000000000000000000000000000600082015250565b7f50726964653a20496e76616c69642070726f6f66000000000000000000000000600082015250565b7f50726964653a205075626c69632073616c6520616c6c6f77616e63652045786360008201527f6565647300000000000000000000000000000000000000000000000000000000602082015250565b7f50726964653a204e6f20626f7473000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f50726964653a2057686974656c6973742073616c6520616c6c6f77616e63652060008201527f4578636565646564000000000000000000000000000000000000000000000000602082015250565b7f5072696465203a77686974656c69737420737570706c79204578636565646564600082015250565b7f50726964653a2052657365766520737570706c79204578636565646564000000600082015250565b7f50726964653a20496e7375666669656e742066756e6473200000000000000000600082015250565b7f4d696e7420616d6f756e742073686f756c64206265206772656174657220746860008201527f616e203000000000000000000000000000000000000000000000000000000000602082015250565b7f5072696465203a4d617820737570706c79204578636565646564000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4e6f742068617665204574680000000000000000000000000000000000000000600082015250565b7f4661696c656420746f2073656e6420746f2057414c4c45545f412e0000000000600082015250565b61493c81614256565b811461494757600080fd5b50565b61495381614268565b811461495e57600080fd5b50565b61496a81614274565b811461497557600080fd5b50565b6149818161427e565b811461498c57600080fd5b50565b614998816142ca565b81146149a357600080fd5b5056fea2646970667358221220ce19d38505cf859ee60ed9d966760a4bf5c40f74fc98df682a0ac8b52e291b8e64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000f1d000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000b5072696465456c69786972000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000250450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5452364e3572656945556b46344e37446b624a745343704d485332516a515333564d734178596a656e44534c2f00000000000000000000
Deployed Bytecode
0x6080604052600436106102c95760003560e01c806370a0823111610175578063aa66797b116100dc578063d49479eb11610095578063e985e9c51161006f578063e985e9c514610a7a578063ee89121214610ab7578063efbd73f414610ae0578063f2fde38b14610b09576102c9565b8063d49479eb146109fb578063e5a88cdb14610a24578063e7b99ec714610a4f576102c9565b8063aa66797b14610911578063b88d4fde1461093c578063bc951b9114610965578063c4ae316814610990578063c5a6534f146109a7578063c87b56dd146109be576102c9565b80638da5cb5b1161012e5780638da5cb5b14610831578063923e5f5e1461085c57806395d89b4114610885578063a0712d68146108b0578063a22cb465146108cc578063a6d612f9146108f5576102c9565b806370a0823114610737578063715018a614610774578063766b7d091461078b578063772e5748146107b45780637de55fe1146107dd5780638990694f14610806576102c9565b8063381a3506116102345780634f02c420116101ed5780635c975abb116101c75780635c975abb146106795780635e84d723146106a45780636352211e146106cf5780636c0360eb1461070c576102c9565b80634f02c420146105fa5780635503a0e81461062557806355f804b314610650576102c9565b8063381a3506146105005780633ccfd60b1461052957806342842e0e14610540578063438b63001461056957806344a0d68a146105a65780634c81433f146105cf576102c9565b806316ba10e01161028657806316ba10e0146103f257806318160ddd1461041b57806318cae2691461044657806323b872dd1461048357806326aa420a146104ac5780632cefffa7146104d5576102c9565b806301ffc9a7146102ce57806306fdde031461030b578063081812fc146103365780630855ff9a14610373578063095ea7b31461039e57806313faede6146103c7575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f09190613682565b610b32565b6040516103029190613d46565b60405180910390f35b34801561031757600080fd5b50610320610bc4565b60405161032d9190613d61565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190613725565b610c56565b60405161036a9190613cbd565b60405180910390f35b34801561037f57600080fd5b50610388610cd2565b6040516103959190614003565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c091906135b5565b610cd8565b005b3480156103d357600080fd5b506103dc610e19565b6040516103e99190614003565b60405180910390f35b3480156103fe57600080fd5b50610419600480360381019061041491906136dc565b610e1f565b005b34801561042757600080fd5b50610430610e41565b60405161043d9190614003565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190613432565b610e58565b60405161047a9190614003565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a5919061349f565b610e70565b005b3480156104b857600080fd5b506104d360048036038101906104ce9190613725565b611195565b005b3480156104e157600080fd5b506104ea6111a7565b6040516104f79190614003565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190613725565b6111ad565b005b34801561053557600080fd5b5061053e6111bf565b005b34801561054c57600080fd5b506105676004803603810190610562919061349f565b6113f5565b005b34801561057557600080fd5b50610590600480360381019061058b9190613432565b611415565b60405161059d9190613d24565b60405180910390f35b3480156105b257600080fd5b506105cd60048036038101906105c89190613725565b611540565b005b3480156105db57600080fd5b506105e4611552565b6040516105f19190614003565b60405180910390f35b34801561060657600080fd5b5061060f611558565b60405161061c9190614003565b60405180910390f35b34801561063157600080fd5b5061063a61155e565b6040516106479190613d61565b60405180910390f35b34801561065c57600080fd5b50610677600480360381019061067291906136dc565b6115ec565b005b34801561068557600080fd5b5061068e61160e565b60405161069b9190613d46565b60405180910390f35b3480156106b057600080fd5b506106b9611621565b6040516106c69190614003565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f19190613725565b611627565b6040516107039190613cbd565b60405180910390f35b34801561071857600080fd5b50610721611639565b60405161072e9190613d61565b60405180910390f35b34801561074357600080fd5b5061075e60048036038101906107599190613432565b6116c7565b60405161076b9190614003565b60405180910390f35b34801561078057600080fd5b50610789611780565b005b34801561079757600080fd5b506107b260048036038101906107ad9190613725565b611794565b005b3480156107c057600080fd5b506107db60048036038101906107d69190613725565b6117a6565b005b3480156107e957600080fd5b5061080460048036038101906107ff91906135b5565b6117b8565b005b34801561081257600080fd5b5061081b611839565b6040516108289190614003565b60405180910390f35b34801561083d57600080fd5b5061084661183f565b6040516108539190613cbd565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e9190613725565b611869565b005b34801561089157600080fd5b5061089a61187b565b6040516108a79190613d61565b60405180910390f35b6108ca60048036038101906108c59190613725565b61190d565b005b3480156108d857600080fd5b506108f360048036038101906108ee9190613575565b611df2565b005b61090f600480360381019061090a91906135f5565b611f6a565b005b34801561091d57600080fd5b506109266123be565b6040516109339190614003565b60405180910390f35b34801561094857600080fd5b50610963600480360381019061095e91906134f2565b6123c4565b005b34801561097157600080fd5b5061097a612437565b6040516109879190614003565b60405180910390f35b34801561099c57600080fd5b506109a561243d565b005b3480156109b357600080fd5b506109bc612471565b005b3480156109ca57600080fd5b506109e560048036038101906109e09190613725565b6124a5565b6040516109f29190613d61565b60405180910390f35b348015610a0757600080fd5b50610a226004803603810190610a1d9190613725565b61254f565b005b348015610a3057600080fd5b50610a39612561565b604051610a469190613d46565b60405180910390f35b348015610a5b57600080fd5b50610a64612574565b604051610a719190614003565b60405180910390f35b348015610a8657600080fd5b50610aa16004803603810190610a9c919061345f565b61257a565b604051610aae9190613d46565b60405180910390f35b348015610ac357600080fd5b50610ade6004803603810190610ad99190613655565b61260e565b005b348015610aec57600080fd5b50610b076004803603810190610b029190613752565b612620565b005b348015610b1557600080fd5b50610b306004803603810190610b2b9190613432565b612709565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b8d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bbd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610bd390614316565b80601f0160208091040260200160405190810160405280929190818152602001828054610bff90614316565b8015610c4c5780601f10610c2157610100808354040283529160200191610c4c565b820191906000526020600020905b815481529060010190602001808311610c2f57829003601f168201915b5050505050905090565b6000610c618261278d565b610c97576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60105481565b6000610ce382611627565b90508073ffffffffffffffffffffffffffffffffffffffff16610d046127ec565b73ffffffffffffffffffffffffffffffffffffffff1614610d6757610d3081610d2b6127ec565b61257a565b610d66576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b5481565b610e276127f4565b80600a9080519060200190610e3d9291906131db565b5050565b6000610e4b612872565b6001546000540303905090565b60186020528060005260406000206000915090505481565b6000610e7b8261287b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ee2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610eee84612949565b91509150610f048187610eff6127ec565b61296b565b610f5057610f1986610f146127ec565b61257a565b610f4f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610fb7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fc486868660016129af565b8015610fcf57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061109d856110798888876129b5565b7c0200000000000000000000000000000000000000000000000000000000176129dd565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611125576000600185019050600060046000838152602001908152602001600020541415611123576000548114611122578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461118d8686866001612a08565b505050505050565b61119d6127f4565b80600f8190555050565b60135481565b6111b56127f4565b8060108190555050565b6111c76127f4565b6002600954141561120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490613fa3565b60405180910390fd5b600260098190555060004790506000811161125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490613fc3565b60405180910390fd5b6000739dc7a7d3c4fd55fac37f62ba311e9759f142c52573ffffffffffffffffffffffffffffffffffffffff16606460058461129991906141c8565b6112a39190614197565b6040516112af90613ca8565b60006040518083038185875af1925050503d80600081146112ec576040519150601f19603f3d011682016040523d82523d6000602084013e6112f1565b606091505b5050905080611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132c90613fe3565b60405180910390fd5b600061133f61183f565b73ffffffffffffffffffffffffffffffffffffffff168360405161136290613ca8565b60006040518083038185875af1925050503d806000811461139f576040519150601f19603f3d011682016040523d82523d6000602084013e6113a4565b606091505b50509050806113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df90613dc3565b60405180910390fd5b5050506001600981905550565b611410838383604051806020016040528060008152506123c4565b505050565b60606000611422836116c7565b905060008167ffffffffffffffff8111156114405761143f6144d3565b5b60405190808252806020026020018201604052801561146e5781602001602082028036833780820191505090505b5090506000601054601154600f546114869190614141565b6114909190614141565b905060006001905060005b84811080156114aa5750828211155b156115335760006114ba83611627565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561151f5782858381518110611504576115036144a4565b5b602002602001018181525050818061151b90614379565b9250505b828061152a90614379565b9350505061149b565b8395505050505050919050565b6115486127f4565b80600b8190555050565b60145481565b60155481565b600a805461156b90614316565b80601f016020809104026020016040519081016040528092919081815260200182805461159790614316565b80156115e45780601f106115b9576101008083540402835291602001916115e4565b820191906000526020600020905b8154815290600101906020018083116115c757829003601f168201915b505050505081565b6115f46127f4565b80600e908051906020019061160a9291906131db565b5050565b601760009054906101000a900460ff1681565b600f5481565b60006116328261287b565b9050919050565b600e805461164690614316565b80601f016020809104026020016040519081016040528092919081815260200182805461167290614316565b80156116bf5780601f10611694576101008083540402835291602001916116bf565b820191906000526020600020905b8154815290600101906020018083116116a257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561172f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117886127f4565b6117926000612a0e565b565b61179c6127f4565b8060128190555050565b6117ae6127f4565b8060138190555050565b6117c06127f4565b601154816014546117d19190614141565b1115611812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180990613f23565b60405180910390fd5b61181c8282612ad4565b806014600082825461182e9190614141565b925050819055505050565b60165481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118716127f4565b8060118190555050565b60606003805461188a90614316565b80601f01602080910402602001604051908101604052809291908181526020018280546118b690614316565b80156119035780601f106118d857610100808354040283529160200191611903565b820191906000526020600020905b8154815290600101906020018083116118e657829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290613e63565b60405180910390fd5b80600081116119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690613f63565b60405180910390fd5b601760019054906101000a900460ff1615611ab65760135481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a229190614141565b1115611a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5a90613ee3565b60405180910390fd5b60105481601654611a749190614141565b1115611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac90613f03565b60405180910390fd5b5b60125481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b049190614141565b1115611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90613e43565b60405180910390fd5b600f5481601554611b569190614141565b1115611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90613f83565b60405180910390fd5b601760009054906101000a900460ff1615611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde90613ea3565b60405180910390fd5b601760019054906101000a900460ff1615611c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2e90613de3565b60405180910390fd5b6000601654601054611c499190614222565b9050806016541115611cc35782600b54611c6391906141c8565b341015611ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9c90613e03565b60405180910390fd5b8260156000828254611cb79190614141565b92505081905550611d8d565b60105483601654611cd49190614141565b1115611d725760008184611ce89190614222565b905080600b54611cf891906141c8565b341015611d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3190613e03565b60405180910390fd5b8060156000828254611d4c9190614141565b925050819055508160166000828254611d659190614141565b9250508190555050611d8c565b8260166000828254611d849190614141565b925050819055505b5b611d973384612ad4565b82601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611de69190614141565b92505081905550505050565b611dfa6127ec565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e5f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611e6c6127ec565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f196127ec565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f5e9190613d46565b60405180910390a35050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf90613e63565b60405180910390fd5b806000811161201c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201390613f63565b60405180910390fd5b601760019054906101000a900460ff16156121135760135481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461207f9190614141565b11156120c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b790613ee3565b60405180910390fd5b601054816016546120d19190614141565b1115612112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210990613f03565b60405180910390fd5b5b60125481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121619190614141565b11156121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990613e43565b60405180910390fd5b600f54816015546121b39190614141565b11156121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb90613f83565b60405180910390fd5b601760009054906101000a900460ff161561220e57600080fd5b601760019054906101000a900460ff1661225d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225490613d83565b60405180910390fd5b6122b061226933612ae2565b858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612b12565b6122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e690613e23565b60405180910390fd5b81600c546122fd91906141c8565b34101561233f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233690613f43565b60405180910390fd5b6123493383612ad4565b816016600082825461235b9190614141565b9250508190555081601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123b19190614141565b9250508190555050505050565b60115481565b6123cf848484610e70565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612431576123fa84848484612b29565b612430576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60125481565b6124456127f4565b601760009054906101000a900460ff1615601760006101000a81548160ff021916908315150217905550565b6124796127f4565b601760019054906101000a900460ff1615601760016101000a81548160ff021916908315150217905550565b60606124b08261278d565b6124ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e690613ec3565b60405180910390fd5b60006124f9612c89565b905060008151116125195760405180602001604052806000815250612547565b8061252384612d1b565b600a60405160200161253793929190613c77565b6040516020818303038152906040525b915050919050565b6125576127f4565b80600c8190555050565b601760019054906101000a900460ff1681565b600c5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126166127f4565b80600d8190555050565b6126286127f4565b6000821161266b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266290613f63565b60405180910390fd5b6000601054601154600f546126809190614141565b61268a9190614141565b90508083612696610e41565b6126a09190614141565b11156126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d890613f83565b60405180910390fd5b6126eb8284612ad4565b82601560008282546126fd9190614141565b92505081905550505050565b6127116127f4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277890613da3565b60405180910390fd5b61278a81612a0e565b50565b600081612798612872565b111580156127a7575060005482105b80156127e5575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6127fc612e7c565b73ffffffffffffffffffffffffffffffffffffffff1661281a61183f565b73ffffffffffffffffffffffffffffffffffffffff1614612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790613e83565b60405180910390fd5b565b60006001905090565b6000808290508061288a612872565b11612912576000548110156129115760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561290f575b60008114156129055760046000836001900393508381526020019081526020016000205490506128da565b8092505050612944565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129cc868684612e84565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ade8282612e8d565b5050565b600081604051602001612af59190613c5c565b604051602081830303815290604052805190602001209050919050565b6000612b2182600d5485612eab565b905092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b4f6127ec565b8786866040518563ffffffff1660e01b8152600401612b719493929190613cd8565b602060405180830381600087803b158015612b8b57600080fd5b505af1925050508015612bbc57506040513d601f19601f82011682018060405250810190612bb991906136af565b60015b612c36573d8060008114612bec576040519150601f19603f3d011682016040523d82523d6000602084013e612bf1565b606091505b50600081511415612c2e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054612c9890614316565b80601f0160208091040260200160405190810160405280929190818152602001828054612cc490614316565b8015612d115780601f10612ce657610100808354040283529160200191612d11565b820191906000526020600020905b815481529060010190602001808311612cf457829003601f168201915b5050505050905090565b60606000821415612d63576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e77565b600082905060005b60008214612d95578080612d7e90614379565b915050600a82612d8e9190614197565b9150612d6b565b60008167ffffffffffffffff811115612db157612db06144d3565b5b6040519080825280601f01601f191660200182016040528015612de35781602001600182028036833780820191505090505b5090505b60008514612e7057600182612dfc9190614222565b9150600a85612e0b91906143e6565b6030612e179190614141565b60f81b818381518110612e2d57612e2c6144a4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e699190614197565b9450612de7565b8093505050505b919050565b600033905090565b60009392505050565b612ea7828260405180602001604052806000815250612ec2565b5050565b600082612eb88584612f5f565b1490509392505050565b612ecc8383612fb5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f5a57600080549050600083820390505b612f0c6000868380600101945086612b29565b612f42576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612ef9578160005414612f5757600080fd5b50505b505050565b60008082905060005b8451811015612faa57612f9582868381518110612f8857612f876144a4565b5b6020026020010151613189565b91508080612fa290614379565b915050612f68565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613022576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561305d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61306a60008483856129af565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506130e1836130d260008660006129b5565b6130db856131b4565b176129dd565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613105578060008190555050506131846000848385612a08565b505050565b60008183106131a15761319c82846131c4565b6131ac565b6131ab83836131c4565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b8280546131e790614316565b90600052602060002090601f0160209004810192826132095760008555613250565b82601f1061322257805160ff1916838001178555613250565b82800160010185558215613250579182015b8281111561324f578251825591602001919060010190613234565b5b50905061325d9190613261565b5090565b5b8082111561327a576000816000905550600101613262565b5090565b600061329161328c84614043565b61401e565b9050828152602081018484840111156132ad576132ac614511565b5b6132b88482856142d4565b509392505050565b60006132d36132ce84614074565b61401e565b9050828152602081018484840111156132ef576132ee614511565b5b6132fa8482856142d4565b509392505050565b60008135905061331181614933565b92915050565b60008083601f84011261332d5761332c614507565b5b8235905067ffffffffffffffff81111561334a57613349614502565b5b6020830191508360208202830111156133665761336561450c565b5b9250929050565b60008135905061337c8161494a565b92915050565b60008135905061339181614961565b92915050565b6000813590506133a681614978565b92915050565b6000815190506133bb81614978565b92915050565b600082601f8301126133d6576133d5614507565b5b81356133e684826020860161327e565b91505092915050565b600082601f83011261340457613403614507565b5b81356134148482602086016132c0565b91505092915050565b60008135905061342c8161498f565b92915050565b6000602082840312156134485761344761451b565b5b600061345684828501613302565b91505092915050565b600080604083850312156134765761347561451b565b5b600061348485828601613302565b925050602061349585828601613302565b9150509250929050565b6000806000606084860312156134b8576134b761451b565b5b60006134c686828701613302565b93505060206134d786828701613302565b92505060406134e88682870161341d565b9150509250925092565b6000806000806080858703121561350c5761350b61451b565b5b600061351a87828801613302565b945050602061352b87828801613302565b935050604061353c8782880161341d565b925050606085013567ffffffffffffffff81111561355d5761355c614516565b5b613569878288016133c1565b91505092959194509250565b6000806040838503121561358c5761358b61451b565b5b600061359a85828601613302565b92505060206135ab8582860161336d565b9150509250929050565b600080604083850312156135cc576135cb61451b565b5b60006135da85828601613302565b92505060206135eb8582860161341d565b9150509250929050565b60008060006040848603121561360e5761360d61451b565b5b600084013567ffffffffffffffff81111561362c5761362b614516565b5b61363886828701613317565b9350935050602061364b8682870161341d565b9150509250925092565b60006020828403121561366b5761366a61451b565b5b600061367984828501613382565b91505092915050565b6000602082840312156136985761369761451b565b5b60006136a684828501613397565b91505092915050565b6000602082840312156136c5576136c461451b565b5b60006136d3848285016133ac565b91505092915050565b6000602082840312156136f2576136f161451b565b5b600082013567ffffffffffffffff8111156137105761370f614516565b5b61371c848285016133ef565b91505092915050565b60006020828403121561373b5761373a61451b565b5b60006137498482850161341d565b91505092915050565b600080604083850312156137695761376861451b565b5b60006137778582860161341d565b925050602061378885828601613302565b9150509250929050565b600061379e8383613c3e565b60208301905092915050565b6137b381614256565b82525050565b6137ca6137c582614256565b6143c2565b82525050565b60006137db826140ca565b6137e581856140f8565b93506137f0836140a5565b8060005b838110156138215781516138088882613792565b9750613813836140eb565b9250506001810190506137f4565b5085935050505092915050565b61383781614268565b82525050565b6000613848826140d5565b6138528185614109565b93506138628185602086016142e3565b61386b81614520565b840191505092915050565b6000613881826140e0565b61388b8185614125565b935061389b8185602086016142e3565b6138a481614520565b840191505092915050565b60006138ba826140e0565b6138c48185614136565b93506138d48185602086016142e3565b80840191505092915050565b600081546138ed81614316565b6138f78186614136565b94506001821660008114613912576001811461392357613956565b60ff19831686528186019350613956565b61392c856140b5565b60005b8381101561394e5781548189015260018201915060208101905061392f565b838801955050505b50505092915050565b600061396c601f83614125565b91506139778261453e565b602082019050919050565b600061398f602683614125565b915061399a82614567565b604082019050919050565b60006139b2601f83614125565b91506139bd826145b6565b602082019050919050565b60006139d5601883614125565b91506139e0826145df565b602082019050919050565b60006139f8601083614125565b9150613a0382614608565b602082019050919050565b6000613a1b601483614125565b9150613a2682614631565b602082019050919050565b6000613a3e602483614125565b9150613a498261465a565b604082019050919050565b6000613a61600e83614125565b9150613a6c826146a9565b602082019050919050565b6000613a84602083614125565b9150613a8f826146d2565b602082019050919050565b6000613aa7601783614125565b9150613ab2826146fb565b602082019050919050565b6000613aca602f83614125565b9150613ad582614724565b604082019050919050565b6000613aed60008361411a565b9150613af882614773565b600082019050919050565b6000613b10602883614125565b9150613b1b82614776565b604082019050919050565b6000613b33602083614125565b9150613b3e826147c5565b602082019050919050565b6000613b56601d83614125565b9150613b61826147ee565b602082019050919050565b6000613b79601883614125565b9150613b8482614817565b602082019050919050565b6000613b9c602483614125565b9150613ba782614840565b604082019050919050565b6000613bbf601a83614125565b9150613bca8261488f565b602082019050919050565b6000613be2601f83614125565b9150613bed826148b8565b602082019050919050565b6000613c05600c83614125565b9150613c10826148e1565b602082019050919050565b6000613c28601b83614125565b9150613c338261490a565b602082019050919050565b613c47816142ca565b82525050565b613c56816142ca565b82525050565b6000613c6882846137b9565b60148201915081905092915050565b6000613c8382866138af565b9150613c8f82856138af565b9150613c9b82846138e0565b9150819050949350505050565b6000613cb382613ae0565b9150819050919050565b6000602082019050613cd260008301846137aa565b92915050565b6000608082019050613ced60008301876137aa565b613cfa60208301866137aa565b613d076040830185613c4d565b8181036060830152613d19818461383d565b905095945050505050565b60006020820190508181036000830152613d3e81846137d0565b905092915050565b6000602082019050613d5b600083018461382e565b92915050565b60006020820190508181036000830152613d7b8184613876565b905092915050565b60006020820190508181036000830152613d9c8161395f565b9050919050565b60006020820190508181036000830152613dbc81613982565b9050919050565b60006020820190508181036000830152613ddc816139a5565b9050919050565b60006020820190508181036000830152613dfc816139c8565b9050919050565b60006020820190508181036000830152613e1c816139eb565b9050919050565b60006020820190508181036000830152613e3c81613a0e565b9050919050565b60006020820190508181036000830152613e5c81613a31565b9050919050565b60006020820190508181036000830152613e7c81613a54565b9050919050565b60006020820190508181036000830152613e9c81613a77565b9050919050565b60006020820190508181036000830152613ebc81613a9a565b9050919050565b60006020820190508181036000830152613edc81613abd565b9050919050565b60006020820190508181036000830152613efc81613b03565b9050919050565b60006020820190508181036000830152613f1c81613b26565b9050919050565b60006020820190508181036000830152613f3c81613b49565b9050919050565b60006020820190508181036000830152613f5c81613b6c565b9050919050565b60006020820190508181036000830152613f7c81613b8f565b9050919050565b60006020820190508181036000830152613f9c81613bb2565b9050919050565b60006020820190508181036000830152613fbc81613bd5565b9050919050565b60006020820190508181036000830152613fdc81613bf8565b9050919050565b60006020820190508181036000830152613ffc81613c1b565b9050919050565b60006020820190506140186000830184613c4d565b92915050565b6000614028614039565b90506140348282614348565b919050565b6000604051905090565b600067ffffffffffffffff82111561405e5761405d6144d3565b5b61406782614520565b9050602081019050919050565b600067ffffffffffffffff82111561408f5761408e6144d3565b5b61409882614520565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061414c826142ca565b9150614157836142ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561418c5761418b614417565b5b828201905092915050565b60006141a2826142ca565b91506141ad836142ca565b9250826141bd576141bc614446565b5b828204905092915050565b60006141d3826142ca565b91506141de836142ca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561421757614216614417565b5b828202905092915050565b600061422d826142ca565b9150614238836142ca565b92508282101561424b5761424a614417565b5b828203905092915050565b6000614261826142aa565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143015780820151818401526020810190506142e6565b83811115614310576000848401525b50505050565b6000600282049050600182168061432e57607f821691505b6020821081141561434257614341614475565b5b50919050565b61435182614520565b810181811067ffffffffffffffff821117156143705761436f6144d3565b5b80604052505050565b6000614384826142ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143b7576143b6614417565b5b600182019050919050565b60006143cd826143d4565b9050919050565b60006143df82614531565b9050919050565b60006143f1826142ca565b91506143fc836142ca565b92508261440c5761440b614446565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f50726964653a2057686974656c697374696e67206e6f7420656e61626c656400600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e6420746f206f776e65722077616c6c65742e00600082015250565b7f596f752063616e74206d696e74206f6e2050726573616c650000000000000000600082015250565b7f496e7375666669656e742066756e647300000000000000000000000000000000600082015250565b7f50726964653a20496e76616c69642070726f6f66000000000000000000000000600082015250565b7f50726964653a205075626c69632073616c6520616c6c6f77616e63652045786360008201527f6565647300000000000000000000000000000000000000000000000000000000602082015250565b7f50726964653a204e6f20626f7473000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f50726964653a2057686974656c6973742073616c6520616c6c6f77616e63652060008201527f4578636565646564000000000000000000000000000000000000000000000000602082015250565b7f5072696465203a77686974656c69737420737570706c79204578636565646564600082015250565b7f50726964653a2052657365766520737570706c79204578636565646564000000600082015250565b7f50726964653a20496e7375666669656e742066756e6473200000000000000000600082015250565b7f4d696e7420616d6f756e742073686f756c64206265206772656174657220746860008201527f616e203000000000000000000000000000000000000000000000000000000000602082015250565b7f5072696465203a4d617820737570706c79204578636565646564000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4e6f742068617665204574680000000000000000000000000000000000000000600082015250565b7f4661696c656420746f2073656e6420746f2057414c4c45545f412e0000000000600082015250565b61493c81614256565b811461494757600080fd5b50565b61495381614268565b811461495e57600080fd5b50565b61496a81614274565b811461497557600080fd5b50565b6149818161427e565b811461498c57600080fd5b50565b614998816142ca565b81146149a357600080fd5b5056fea2646970667358221220ce19d38505cf859ee60ed9d966760a4bf5c40f74fc98df682a0ac8b52e291b8e64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000f1d000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000b5072696465456c69786972000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000250450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5452364e3572656945556b46344e37446b624a745343704d485332516a515333564d734178596a656e44534c2f00000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): PrideElixir
Arg [1] : _tokenSymbol (string): PE
Arg [2] : _publicSupply (uint256): 3000
Arg [3] : _whiteListSupply (uint256): 3869
Arg [4] : _maxMintAmountPerWallet (uint256): 3
Arg [5] : _maxMintAmountPerWhitelist (uint256): 3
Arg [6] : _initialURI (string): ipfs://QmTR6N5reiEUkF4N7DkbJtSCpMHS2QjQS3VMsAxYjenDSL/
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000bb8
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000f1d
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [8] : 5072696465456c69786972000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 5045000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [12] : 697066733a2f2f516d5452364e3572656945556b46344e37446b624a74534370
Arg [13] : 4d485332516a515333564d734178596a656e44534c2f00000000000000000000
Deployed Bytecode Sourcemap
62409:11856:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32166:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37813:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39759:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62809:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39307:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62593:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72705:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31220:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63252:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49024:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71539:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62959:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71742:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73426:836;;;;;;;;;;;;;:::i;:::-;;40649:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69363:709;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71159:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63040:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63075:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62533:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72515:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63161:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62768:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37602:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62740:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32845:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16757:103;;;;;;;;;;;;;:::i;:::-;;72277:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71983:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68981:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63103:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16109:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71332:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37982:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67099:1166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40035:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66407:592;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62853:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40905:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62911:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72868:79;;;;;;;;;;;;;:::i;:::-;;73003:102;;;;;;;;;;;;;:::i;:::-;;70469:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70965:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63193:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62633:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40414:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65361:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68408:435;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17015:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32166:615;32251:4;32566:10;32551:25;;:11;:25;;;;:102;;;;32643:10;32628:25;;:11;:25;;;;32551:102;:179;;;;32720:10;32705:25;;:11;:25;;;;32551:179;32531:199;;32166:615;;;:::o;37813:100::-;37867:13;37900:5;37893:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37813:100;:::o;39759:204::-;39827:7;39852:16;39860:7;39852;:16::i;:::-;39847:64;;39877:34;;;;;;;;;;;;;;39847:64;39931:15;:24;39947:7;39931:24;;;;;;;;;;;;;;;;;;;;;39924:31;;39759:204;;;:::o;62809:37::-;;;;:::o;39307:386::-;39380:13;39396:16;39404:7;39396;:16::i;:::-;39380:32;;39452:5;39429:28;;:19;:17;:19::i;:::-;:28;;;39425:175;;39477:44;39494:5;39501:19;:17;:19::i;:::-;39477:16;:44::i;:::-;39472:128;;39549:35;;;;;;;;;;;;;;39472:128;39425:175;39639:2;39612:15;:24;39628:7;39612:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39677:7;39673:2;39657:28;;39666:5;39657:28;;;;;;;;;;;;39369:324;39307:386;;:::o;62593:33::-;;;;:::o;72705:106::-;15995:13;:11;:13::i;:::-;72793:10:::1;72781:9;:22;;;;;;;;;;;;:::i;:::-;;72705:106:::0;:::o;31220:315::-;31273:7;31501:15;:13;:15::i;:::-;31486:12;;31470:13;;:28;:46;31463:53;;31220:315;:::o;63252:55::-;;;;;;;;;;;;;;;;;:::o;49024:2800::-;49158:27;49188;49207:7;49188:18;:27::i;:::-;49158:57;;49273:4;49232:45;;49248:19;49232:45;;;49228:86;;49286:28;;;;;;;;;;;;;;49228:86;49328:27;49357:23;49384:28;49404:7;49384:19;:28::i;:::-;49327:85;;;;49512:62;49531:15;49548:4;49554:19;:17;:19::i;:::-;49512:18;:62::i;:::-;49507:174;;49594:43;49611:4;49617:19;:17;:19::i;:::-;49594:16;:43::i;:::-;49589:92;;49646:35;;;;;;;;;;;;;;49589:92;49507:174;49712:1;49698:16;;:2;:16;;;49694:52;;;49723:23;;;;;;;;;;;;;;49694:52;49759:43;49781:4;49787:2;49791:7;49800:1;49759:21;:43::i;:::-;49895:15;49892:160;;;50035:1;50014:19;50007:30;49892:160;50430:18;:24;50449:4;50430:24;;;;;;;;;;;;;;;;50428:26;;;;;;;;;;;;50499:18;:22;50518:2;50499:22;;;;;;;;;;;;;;;;50497:24;;;;;;;;;;;50821:145;50858:2;50906:45;50921:4;50927:2;50931:19;50906:14;:45::i;:::-;28448:8;50879:72;50821:18;:145::i;:::-;50792:17;:26;50810:7;50792:26;;;;;;;;;;;:174;;;;51136:1;28448:8;51086:19;:46;:51;51082:626;;;51158:19;51190:1;51180:7;:11;51158:33;;51347:1;51313:17;:30;51331:11;51313:30;;;;;;;;;;;;:35;51309:384;;;51451:13;;51436:11;:28;51432:242;;51631:19;51598:17;:30;51616:11;51598:30;;;;;;;;;;;:52;;;;51432:242;51309:384;51139:569;51082:626;51755:7;51751:2;51736:27;;51745:4;51736:27;;;;;;;;;;;;51774:42;51795:4;51801:2;51805:7;51814:1;51774:20;:42::i;:::-;49147:2677;;;49024:2800;;;:::o;71539:100::-;15995:13;:11;:13::i;:::-;71624:7:::1;71609:12;:22;;;;71539:100:::0;:::o;62959:44::-;;;;:::o;71742:106::-;15995:13;:11;:13::i;:::-;71833:7:::1;71815:15;:25;;;;71742:106:::0;:::o;73426:836::-;15995:13;:11;:13::i;:::-;1812:1:::1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;73497:15:::2;73515:21;73497:39;;73566:1;73555:7;:12;73547:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;73697:7;73371:42;73710:22;;73754:3;73750:1;73740:7;:11;;;;:::i;:::-;:17;;;;:::i;:::-;73710:52;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73696:66;;;73782:2;73774:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;74055:7;74076;:5;:7::i;:::-;74068:21;;74097:7;74068:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74054:55;;;74128:2;74120:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;73476:786;;;1768:1:::1;2722:7;:22;;;;73426:836::o:0;40649:185::-;40787:39;40804:4;40810:2;40814:7;40787:39;;;;;;;;;;;;:16;:39::i;:::-;40649:185;;;:::o;69363:709::-;69438:16;69466:23;69492:17;69502:6;69492:9;:17::i;:::-;69466:43;;69516:30;69563:15;69549:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69516:63;;69586:17;69638:15;;69621:14;;69606:12;;:29;;;;:::i;:::-;:47;;;;:::i;:::-;69586:67;;69660:22;69685:1;69660:26;;69693:23;69729:309;69754:15;69736;:33;:64;;;;;69791:9;69773:14;:27;;69736:64;69729:309;;;69811:25;69839:23;69847:14;69839:7;:23::i;:::-;69811:51;;69898:6;69877:27;;:17;:27;;;69873:131;;;69950:14;69917:13;69931:15;69917:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;69977:17;;;;;:::i;:::-;;;;69873:131;70014:16;;;;;:::i;:::-;;;;69802:236;69729:309;;;70053:13;70046:20;;;;;;;69363:709;;;:::o;71159:80::-;15995:13;:11;:13::i;:::-;71226:5:::1;71219:4;:12;;;;71159:80:::0;:::o;63040:28::-;;;;:::o;63075:21::-;;;;:::o;62533:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72515:104::-;15995:13;:11;:13::i;:::-;72600:11:::1;72590:7;:21;;;;;;;;;;;;:::i;:::-;;72515:104:::0;:::o;63161:25::-;;;;;;;;;;;;;:::o;62768:34::-;;;;:::o;37602:144::-;37666:7;37709:27;37728:7;37709:18;:27::i;:::-;37686:52;;37602:144;;;:::o;62740:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32845:224::-;32909:7;32950:1;32933:19;;:5;:19;;;32929:60;;;32961:28;;;;;;;;;;;;;;32929:60;27400:13;33007:18;:25;33026:5;33007:25;;;;;;;;;;;;;;;;:54;33000:61;;32845:224;;;:::o;16757:103::-;15995:13;:11;:13::i;:::-;16822:30:::1;16849:1;16822:18;:30::i;:::-;16757:103::o:0;72277:152::-;15995:13;:11;:13::i;:::-;72398:23:::1;72373:22;:48;;;;72277:152:::0;:::o;71983:164::-;15995:13;:11;:13::i;:::-;72113:26:::1;72085:25;:54;;;;71983:164:::0;:::o;68981:263::-;15995:13;:11;:13::i;:::-;69116:14:::1;;69104:8;69088:13;;:24;;;;:::i;:::-;:42;;69080:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;69175:23;69185:2;69189:8;69175:9;:23::i;:::-;69226:8;69209:13;;:25;;;;;;;:::i;:::-;;;;;;;;68981:263:::0;;:::o;63103:30::-;;;;:::o;16109:87::-;16155:7;16182:6;;;;;;;;;;;16175:13;;16109:87;:::o;71332:102::-;15995:13;:11;:13::i;:::-;71419:7:::1;71402:14;:24;;;;71332:102:::0;:::o;37982:104::-;38038:13;38071:7;38064:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37982:104;:::o;67099:1166::-;64294:9;64280:23;;:10;:23;;;64272:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;67208:11:::1;64584:1;64570:11;:15;64562:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;64638:16;;;;;;;;;;;64635:293;;;64724:25;;64709:11;64674:20;:32;64695:10;64674:32;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:75;;64666:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;64862:15;;64847:11;64829:15;;:29;;;;:::i;:::-;:48;;64820:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;64635:293;64998:22;;64983:11;64948:20;:32;64969:10;64948:32;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:72;;64940:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;65120:12;;65105:11;65096:6;;:20;;;;:::i;:::-;:36;;65087:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;67246:6:::2;;;;;;;;;;;67245:7;67237:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;67300:16;;;;;;;;;;;67299:17;67291:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;67416:9;67446:15;;67428;;:33;;;;:::i;:::-;67416:45;;67498:1;67480:15;;:19;67477:668;;;67579:11;67572:4;;:18;;;;:::i;:::-;67559:9;:31;;67551:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;67641:11;67632:6;;:20;;;;;;;:::i;:::-;;;;;;;;67477:668;;;67728:15;;67714:11;67696:15;;:29;;;;:::i;:::-;:47;67693:435;;;67766:9;67792:1;67778:11;:15;;;;:::i;:::-;67766:27;;67883:1;67876:4;;:8;;;;:::i;:::-;67863:9;:21;;67855:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;67962:1;67952:6;;:11;;;;;;;:::i;:::-;;;;;;;;68006:1;67987:15;;:20;;;;;;;:::i;:::-;;;;;;;;67744:305;67693:435;;;68097:11;68078:15;;:30;;;;;;;:::i;:::-;;;;;;;;67693:435;67477:668;68155:34;68165:10;68177:11;68155:9;:34::i;:::-;68236:11;68200:20;:32;68221:10;68200:32;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;67226:1039;64337:1:::1;67099:1166:::0;:::o;40035:308::-;40146:19;:17;:19::i;:::-;40134:31;;:8;:31;;;40130:61;;;40174:17;;;;;;;;;;;;;;40130:61;40256:8;40204:18;:39;40223:19;:17;:19::i;:::-;40204:39;;;;;;;;;;;;;;;:49;40244:8;40204:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;40316:8;40280:55;;40295:19;:17;:19::i;:::-;40280:55;;;40326:8;40280:55;;;;;;:::i;:::-;;;;;;;;40035:308;;:::o;66407:592::-;64294:9;64280:23;;:10;:23;;;64272:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;66557:11:::1;64584:1;64570:11;:15;64562:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;64638:16;;;;;;;;;;;64635:293;;;64724:25;;64709:11;64674:20;:32;64695:10;64674:32;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:75;;64666:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;64862:15;;64847:11;64829:15;;:29;;;;:::i;:::-;:48;;64820:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;64635:293;64998:22;;64983:11;64948:20;:32;64969:10;64948:32;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:72;;64940:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;65120:12;;65105:11;65096:6;;:20;;;;:::i;:::-;:36;;65087:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;66596:6:::2;;;;;;;;;;;66595:7;66587:16;;;::::0;::::2;;66623;;;;;;;;;;;66615:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;66695:33;66703:17;66709:10;66703:5;:17::i;:::-;66722:5;;66695:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:33::i;:::-;66687:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;66803:11;66787:13;;:27;;;;:::i;:::-;66774:9;:40;;66766:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;66855:34;66865:10;66877:11;66855:9;:34::i;:::-;66920:11;66901:15;;:30;;;;;;;:::i;:::-;;;;;;;;66979:11;66943:20;:32;66964:10;66943:32;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;64337:1:::1;66407:592:::0;;;:::o;62853:35::-;;;;:::o;40905:399::-;41072:31;41085:4;41091:2;41095:7;41072:12;:31::i;:::-;41136:1;41118:2;:14;;;:19;41114:183;;41157:56;41188:4;41194:2;41198:7;41207:5;41157:30;:56::i;:::-;41152:145;;41241:40;;;;;;;;;;;;;;41152:145;41114:183;40905:399;;;;:::o;62911:41::-;;;;:::o;72868:79::-;15995:13;:11;:13::i;:::-;72933:6:::1;;;;;;;;;;;72932:7;72923:6;;:16;;;;;;;;;;;;;;;;;;72868:79::o:0;73003:102::-;15995:13;:11;:13::i;:::-;73081:16:::1;;;;;;;;;;;73080:17;73061:16;;:36;;;;;;;;;;;;;;;;;;73003:102::o:0;70469:395::-;70543:13;70577:17;70585:8;70577:7;:17::i;:::-;70569:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;70659:28;70690:10;:8;:10::i;:::-;70659:41;;70749:1;70724:14;70718:28;:32;:138;;;;;;;;;;;;;;;;;70790:14;70806:19;:8;:17;:19::i;:::-;70827:9;70773:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70718:138;70711:145;;;70469:395;;;:::o;70965:98::-;15995:13;:11;:13::i;:::-;71050:5:::1;71034:13;:21;;;;70965:98:::0;:::o;63193:35::-;;;;;;;;;;;;;:::o;62633:41::-;;;;:::o;40414:164::-;40511:4;40535:18;:25;40554:5;40535:25;;;;;;;;;;;;;;;:35;40561:8;40535:35;;;;;;;;;;;;;;;;;;;;;;;;;40528:42;;40414:164;;;;:::o;65361:105::-;15995:13;:11;:13::i;:::-;65453:5:::1;65437:13;:21;;;;65361:105:::0;:::o;68408:435::-;15995:13;:11;:13::i;:::-;68540:1:::1;68526:11;:15;68518:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;68593:17;68645:15;;68628:14;;68613:12;;:29;;;;:::i;:::-;:47;;;;:::i;:::-;68593:67;;68711:9;68696:11;68680:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;68671:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;68764:33;68774:9;68785:11;68764:9;:33::i;:::-;68818:11;68808:6;;:21;;;;;;;:::i;:::-;;;;;;;;68507:336;68408:435:::0;;:::o;17015:201::-;15995:13;:11;:13::i;:::-;17124:1:::1;17104:22;;:8;:22;;;;17096:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17180:28;17199:8;17180:18;:28::i;:::-;17015:201:::0;:::o;41559:273::-;41616:4;41672:7;41653:15;:13;:15::i;:::-;:26;;:66;;;;;41706:13;;41696:7;:23;41653:66;:152;;;;;41804:1;28170:8;41757:17;:26;41775:7;41757:26;;;;;;;;;;;;:43;:48;41653:152;41633:172;;41559:273;;;:::o;60120:105::-;60180:7;60207:10;60200:17;;60120:105;:::o;16274:132::-;16349:12;:10;:12::i;:::-;16338:23;;:7;:5;:7::i;:::-;:23;;;16330:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16274:132::o;70138:101::-;70203:7;70230:1;70223:8;;70138:101;:::o;34519:1129::-;34586:7;34606:12;34621:7;34606:22;;34689:4;34670:15;:13;:15::i;:::-;:23;34666:915;;34723:13;;34716:4;:20;34712:869;;;34761:14;34778:17;:23;34796:4;34778:23;;;;;;;;;;;;34761:40;;34894:1;28170:8;34867:6;:23;:28;34863:699;;;35386:113;35403:1;35393:6;:11;35386:113;;;35446:17;:25;35464:6;;;;;;;35446:25;;;;;;;;;;;;35437:34;;35386:113;;;35532:6;35525:13;;;;;;34863:699;34738:843;34712:869;34666:915;35609:31;;;;;;;;;;;;;;34519:1129;;;;:::o;47360:652::-;47455:27;47484:23;47525:53;47581:15;47525:71;;47767:7;47761:4;47754:21;47802:22;47796:4;47789:36;47878:4;47872;47862:21;47839:44;;47974:19;47968:26;47949:45;;47705:300;47360:652;;;:::o;48125:645::-;48267:11;48429:15;48423:4;48419:26;48411:34;;48588:15;48577:9;48573:31;48560:44;;48735:15;48724:9;48721:30;48714:4;48703:9;48700:19;48697:55;48687:65;;48125:645;;;;;:::o;58953:159::-;;;;;:::o;57265:309::-;57400:7;57420:16;28571:3;57446:19;:40;;57420:67;;28571:3;57513:31;57524:4;57530:2;57534:9;57513:10;:31::i;:::-;57505:40;;:61;;57498:68;;;57265:309;;;;;:::o;37093:447::-;37173:14;37341:15;37334:5;37330:27;37321:36;;37515:5;37501:11;37477:22;37473:40;37470:51;37463:5;37460:62;37450:72;;37093:447;;;;:::o;59771:158::-;;;;;:::o;17376:191::-;17450:16;17469:6;;;;;;;;;;;17450:25;;17495:8;17486:6;;:17;;;;;;;;;;;;;;;;;;17550:8;17519:40;;17540:8;17519:40;;;;;;;;;;;;17439:128;17376:191;:::o;73203:124::-;73286:33;73296:9;73307:11;73286:9;:33::i;:::-;73203:124;;:::o;66002:126::-;66057:7;66111;66094:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;66084:36;;;;;;66077:43;;66002:126;;;:::o;65675:186::-;65773:4;65802:51;65821:5;65828:13;;65843:9;65802:18;:51::i;:::-;65795:58;;65675:186;;;;:::o;55775:716::-;55938:4;55984:2;55959:45;;;56005:19;:17;:19::i;:::-;56026:4;56032:7;56041:5;55959:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55955:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56259:1;56242:6;:13;:18;56238:235;;;56288:40;;;;;;;;;;;;;;56238:235;56431:6;56425:13;56416:6;56412:2;56408:15;56401:38;55955:529;56128:54;;;56118:64;;;:6;:64;;;;56111:71;;;55775:716;;;;;;:::o;70290:108::-;70350:13;70383:7;70376:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70290:108;:::o;3189:723::-;3245:13;3475:1;3466:5;:10;3462:53;;;3493:10;;;;;;;;;;;;;;;;;;;;;3462:53;3525:12;3540:5;3525:20;;3556:14;3581:78;3596:1;3588:4;:9;3581:78;;3614:8;;;;;:::i;:::-;;;;3645:2;3637:10;;;;;:::i;:::-;;;3581:78;;;3669:19;3701:6;3691:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3669:39;;3719:154;3735:1;3726:5;:10;3719:154;;3763:1;3753:11;;;;;:::i;:::-;;;3830:2;3822:5;:10;;;;:::i;:::-;3809:2;:24;;;;:::i;:::-;3796:39;;3779:6;3786;3779:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3859:2;3850:11;;;;;:::i;:::-;;;3719:154;;;3897:6;3883:21;;;;;3189:723;;;;:::o;14660:98::-;14713:7;14740:10;14733:17;;14660:98;:::o;58150:147::-;58287:6;58150:147;;;;;:::o;41916:104::-;41985:27;41995:2;41999:8;41985:27;;;;;;;;;;;;:9;:27::i;:::-;41916:104;;:::o;6475:190::-;6600:4;6653;6624:25;6637:5;6644:4;6624:12;:25::i;:::-;:33;6617:40;;6475:190;;;;;:::o;42436:681::-;42559:19;42565:2;42569:8;42559:5;:19::i;:::-;42638:1;42620:2;:14;;;:19;42616:483;;42660:11;42674:13;;42660:27;;42706:13;42728:8;42722:3;:14;42706:30;;42755:233;42786:62;42825:1;42829:2;42833:7;;;;;;42842:5;42786:30;:62::i;:::-;42781:167;;42884:40;;;;;;;;;;;;;;42781:167;42983:3;42975:5;:11;42755:233;;43070:3;43053:13;;:20;43049:34;;43075:8;;;43049:34;42641:458;;42616:483;42436:681;;;:::o;7342:296::-;7425:7;7445:20;7468:4;7445:27;;7488:9;7483:118;7507:5;:12;7503:1;:16;7483:118;;;7556:33;7566:12;7580:5;7586:1;7580:8;;;;;;;;:::i;:::-;;;;;;;;7556:9;:33::i;:::-;7541:48;;7521:3;;;;;:::i;:::-;;;;7483:118;;;;7618:12;7611:19;;;7342:296;;;;:::o;43390:1529::-;43455:20;43478:13;;43455:36;;43520:1;43506:16;;:2;:16;;;43502:48;;;43531:19;;;;;;;;;;;;;;43502:48;43577:1;43565:8;:13;43561:44;;;43587:18;;;;;;;;;;;;;;43561:44;43618:61;43648:1;43652:2;43656:12;43670:8;43618:21;:61::i;:::-;44161:1;27537:2;44132:1;:25;;44131:31;44119:8;:44;44093:18;:22;44112:2;44093:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;44440:139;44477:2;44531:33;44554:1;44558:2;44562:1;44531:14;:33::i;:::-;44498:30;44519:8;44498:20;:30::i;:::-;:66;44440:18;:139::i;:::-;44406:17;:31;44424:12;44406:31;;;;;;;;;;;:173;;;;44596:15;44614:12;44596:30;;44641:11;44670:8;44655:12;:23;44641:37;;44693:101;44745:9;;;;;;44741:2;44720:35;;44737:1;44720:35;;;;;;;;;;;;44789:3;44779:7;:13;44693:101;;44826:3;44810:13;:19;;;;43867:974;;44851:60;44880:1;44884:2;44888:12;44902:8;44851:20;:60::i;:::-;43444:1475;43390:1529;;:::o;13549:149::-;13612:7;13643:1;13639;:5;:51;;13670:20;13685:1;13688;13670:14;:20::i;:::-;13639:51;;;13647:20;13662:1;13665;13647:14;:20::i;:::-;13639:51;13632:58;;13549:149;;;;:::o;38923:322::-;38993:14;39224:1;39214:8;39211:15;39186:23;39182:45;39172:55;;38923:322;;;:::o;13706:268::-;13774:13;13881:1;13875:4;13868:15;13910:1;13904:4;13897:15;13951:4;13945;13935:21;13926:30;;13706:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:704::-;6451:6;6459;6467;6516:2;6504:9;6495:7;6491:23;6487:32;6484:119;;;6522:79;;:::i;:::-;6484:119;6670:1;6659:9;6655:17;6642:31;6700:18;6692:6;6689:30;6686:117;;;6722:79;;:::i;:::-;6686:117;6835:80;6907:7;6898:6;6887:9;6883:22;6835:80;:::i;:::-;6817:98;;;;6613:312;6964:2;6990:53;7035:7;7026:6;7015:9;7011:22;6990:53;:::i;:::-;6980:63;;6935:118;6356:704;;;;;:::o;7066:329::-;7125:6;7174:2;7162:9;7153:7;7149:23;7145:32;7142:119;;;7180:79;;:::i;:::-;7142:119;7300:1;7325:53;7370:7;7361:6;7350:9;7346:22;7325:53;:::i;:::-;7315:63;;7271:117;7066:329;;;;:::o;7401:327::-;7459:6;7508:2;7496:9;7487:7;7483:23;7479:32;7476:119;;;7514:79;;:::i;:::-;7476:119;7634:1;7659:52;7703:7;7694:6;7683:9;7679:22;7659:52;:::i;:::-;7649:62;;7605:116;7401:327;;;;:::o;7734:349::-;7803:6;7852:2;7840:9;7831:7;7827:23;7823:32;7820:119;;;7858:79;;:::i;:::-;7820:119;7978:1;8003:63;8058:7;8049:6;8038:9;8034:22;8003:63;:::i;:::-;7993:73;;7949:127;7734:349;;;;:::o;8089:509::-;8158:6;8207:2;8195:9;8186:7;8182:23;8178:32;8175:119;;;8213:79;;:::i;:::-;8175:119;8361:1;8350:9;8346:17;8333:31;8391:18;8383:6;8380:30;8377:117;;;8413:79;;:::i;:::-;8377:117;8518:63;8573:7;8564:6;8553:9;8549:22;8518:63;:::i;:::-;8508:73;;8304:287;8089:509;;;;:::o;8604:329::-;8663:6;8712:2;8700:9;8691:7;8687:23;8683:32;8680:119;;;8718:79;;:::i;:::-;8680:119;8838:1;8863:53;8908:7;8899:6;8888:9;8884:22;8863:53;:::i;:::-;8853:63;;8809:117;8604:329;;;;:::o;8939:474::-;9007:6;9015;9064:2;9052:9;9043:7;9039:23;9035:32;9032:119;;;9070:79;;:::i;:::-;9032:119;9190:1;9215:53;9260:7;9251:6;9240:9;9236:22;9215:53;:::i;:::-;9205:63;;9161:117;9317:2;9343:53;9388:7;9379:6;9368:9;9364:22;9343:53;:::i;:::-;9333:63;;9288:118;8939:474;;;;;:::o;9419:179::-;9488:10;9509:46;9551:3;9543:6;9509:46;:::i;:::-;9587:4;9582:3;9578:14;9564:28;;9419:179;;;;:::o;9604:118::-;9691:24;9709:5;9691:24;:::i;:::-;9686:3;9679:37;9604:118;;:::o;9728:157::-;9833:45;9853:24;9871:5;9853:24;:::i;:::-;9833:45;:::i;:::-;9828:3;9821:58;9728:157;;:::o;9921:732::-;10040:3;10069:54;10117:5;10069:54;:::i;:::-;10139:86;10218:6;10213:3;10139:86;:::i;:::-;10132:93;;10249:56;10299:5;10249:56;:::i;:::-;10328:7;10359:1;10344:284;10369:6;10366:1;10363:13;10344:284;;;10445:6;10439:13;10472:63;10531:3;10516:13;10472:63;:::i;:::-;10465:70;;10558:60;10611:6;10558:60;:::i;:::-;10548:70;;10404:224;10391:1;10388;10384:9;10379:14;;10344:284;;;10348:14;10644:3;10637:10;;10045:608;;;9921:732;;;;:::o;10659:109::-;10740:21;10755:5;10740:21;:::i;:::-;10735:3;10728:34;10659:109;;:::o;10774:360::-;10860:3;10888:38;10920:5;10888:38;:::i;:::-;10942:70;11005:6;11000:3;10942:70;:::i;:::-;10935:77;;11021:52;11066:6;11061:3;11054:4;11047:5;11043:16;11021:52;:::i;:::-;11098:29;11120:6;11098:29;:::i;:::-;11093:3;11089:39;11082:46;;10864:270;10774:360;;;;:::o;11140:364::-;11228:3;11256:39;11289:5;11256:39;:::i;:::-;11311:71;11375:6;11370:3;11311:71;:::i;:::-;11304:78;;11391:52;11436:6;11431:3;11424:4;11417:5;11413:16;11391:52;:::i;:::-;11468:29;11490:6;11468:29;:::i;:::-;11463:3;11459:39;11452:46;;11232:272;11140:364;;;;:::o;11510:377::-;11616:3;11644:39;11677:5;11644:39;:::i;:::-;11699:89;11781:6;11776:3;11699:89;:::i;:::-;11692:96;;11797:52;11842:6;11837:3;11830:4;11823:5;11819:16;11797:52;:::i;:::-;11874:6;11869:3;11865:16;11858:23;;11620:267;11510:377;;;;:::o;11917:845::-;12020:3;12057:5;12051:12;12086:36;12112:9;12086:36;:::i;:::-;12138:89;12220:6;12215:3;12138:89;:::i;:::-;12131:96;;12258:1;12247:9;12243:17;12274:1;12269:137;;;;12420:1;12415:341;;;;12236:520;;12269:137;12353:4;12349:9;12338;12334:25;12329:3;12322:38;12389:6;12384:3;12380:16;12373:23;;12269:137;;12415:341;12482:38;12514:5;12482:38;:::i;:::-;12542:1;12556:154;12570:6;12567:1;12564:13;12556:154;;;12644:7;12638:14;12634:1;12629:3;12625:11;12618:35;12694:1;12685:7;12681:15;12670:26;;12592:4;12589:1;12585:12;12580:17;;12556:154;;;12739:6;12734:3;12730:16;12723:23;;12422:334;;12236:520;;12024:738;;11917:845;;;;:::o;12768:366::-;12910:3;12931:67;12995:2;12990:3;12931:67;:::i;:::-;12924:74;;13007:93;13096:3;13007:93;:::i;:::-;13125:2;13120:3;13116:12;13109:19;;12768:366;;;:::o;13140:::-;13282:3;13303:67;13367:2;13362:3;13303:67;:::i;:::-;13296:74;;13379:93;13468:3;13379:93;:::i;:::-;13497:2;13492:3;13488:12;13481:19;;13140:366;;;:::o;13512:::-;13654:3;13675:67;13739:2;13734:3;13675:67;:::i;:::-;13668:74;;13751:93;13840:3;13751:93;:::i;:::-;13869:2;13864:3;13860:12;13853:19;;13512:366;;;:::o;13884:::-;14026:3;14047:67;14111:2;14106:3;14047:67;:::i;:::-;14040:74;;14123:93;14212:3;14123:93;:::i;:::-;14241:2;14236:3;14232:12;14225:19;;13884:366;;;:::o;14256:::-;14398:3;14419:67;14483:2;14478:3;14419:67;:::i;:::-;14412:74;;14495:93;14584:3;14495:93;:::i;:::-;14613:2;14608:3;14604:12;14597:19;;14256:366;;;:::o;14628:::-;14770:3;14791:67;14855:2;14850:3;14791:67;:::i;:::-;14784:74;;14867:93;14956:3;14867:93;:::i;:::-;14985:2;14980:3;14976:12;14969:19;;14628:366;;;:::o;15000:::-;15142:3;15163:67;15227:2;15222:3;15163:67;:::i;:::-;15156:74;;15239:93;15328:3;15239:93;:::i;:::-;15357:2;15352:3;15348:12;15341:19;;15000:366;;;:::o;15372:::-;15514:3;15535:67;15599:2;15594:3;15535:67;:::i;:::-;15528:74;;15611:93;15700:3;15611:93;:::i;:::-;15729:2;15724:3;15720:12;15713:19;;15372:366;;;:::o;15744:::-;15886:3;15907:67;15971:2;15966:3;15907:67;:::i;:::-;15900:74;;15983:93;16072:3;15983:93;:::i;:::-;16101:2;16096:3;16092:12;16085:19;;15744:366;;;:::o;16116:::-;16258:3;16279:67;16343:2;16338:3;16279:67;:::i;:::-;16272:74;;16355:93;16444:3;16355:93;:::i;:::-;16473:2;16468:3;16464:12;16457:19;;16116:366;;;:::o;16488:::-;16630:3;16651:67;16715:2;16710:3;16651:67;:::i;:::-;16644:74;;16727:93;16816:3;16727:93;:::i;:::-;16845:2;16840:3;16836:12;16829:19;;16488:366;;;:::o;16860:398::-;17019:3;17040:83;17121:1;17116:3;17040:83;:::i;:::-;17033:90;;17132:93;17221:3;17132:93;:::i;:::-;17250:1;17245:3;17241:11;17234:18;;16860:398;;;:::o;17264:366::-;17406:3;17427:67;17491:2;17486:3;17427:67;:::i;:::-;17420:74;;17503:93;17592:3;17503:93;:::i;:::-;17621:2;17616:3;17612:12;17605:19;;17264:366;;;:::o;17636:::-;17778:3;17799:67;17863:2;17858:3;17799:67;:::i;:::-;17792:74;;17875:93;17964:3;17875:93;:::i;:::-;17993:2;17988:3;17984:12;17977:19;;17636:366;;;:::o;18008:::-;18150:3;18171:67;18235:2;18230:3;18171:67;:::i;:::-;18164:74;;18247:93;18336:3;18247:93;:::i;:::-;18365:2;18360:3;18356:12;18349:19;;18008:366;;;:::o;18380:::-;18522:3;18543:67;18607:2;18602:3;18543:67;:::i;:::-;18536:74;;18619:93;18708:3;18619:93;:::i;:::-;18737:2;18732:3;18728:12;18721:19;;18380:366;;;:::o;18752:::-;18894:3;18915:67;18979:2;18974:3;18915:67;:::i;:::-;18908:74;;18991:93;19080:3;18991:93;:::i;:::-;19109:2;19104:3;19100:12;19093:19;;18752:366;;;:::o;19124:::-;19266:3;19287:67;19351:2;19346:3;19287:67;:::i;:::-;19280:74;;19363:93;19452:3;19363:93;:::i;:::-;19481:2;19476:3;19472:12;19465:19;;19124:366;;;:::o;19496:::-;19638:3;19659:67;19723:2;19718:3;19659:67;:::i;:::-;19652:74;;19735:93;19824:3;19735:93;:::i;:::-;19853:2;19848:3;19844:12;19837:19;;19496:366;;;:::o;19868:::-;20010:3;20031:67;20095:2;20090:3;20031:67;:::i;:::-;20024:74;;20107:93;20196:3;20107:93;:::i;:::-;20225:2;20220:3;20216:12;20209:19;;19868:366;;;:::o;20240:::-;20382:3;20403:67;20467:2;20462:3;20403:67;:::i;:::-;20396:74;;20479:93;20568:3;20479:93;:::i;:::-;20597:2;20592:3;20588:12;20581:19;;20240:366;;;:::o;20612:108::-;20689:24;20707:5;20689:24;:::i;:::-;20684:3;20677:37;20612:108;;:::o;20726:118::-;20813:24;20831:5;20813:24;:::i;:::-;20808:3;20801:37;20726:118;;:::o;20850:256::-;20962:3;20977:75;21048:3;21039:6;20977:75;:::i;:::-;21077:2;21072:3;21068:12;21061:19;;21097:3;21090:10;;20850:256;;;;:::o;21112:589::-;21337:3;21359:95;21450:3;21441:6;21359:95;:::i;:::-;21352:102;;21471:95;21562:3;21553:6;21471:95;:::i;:::-;21464:102;;21583:92;21671:3;21662:6;21583:92;:::i;:::-;21576:99;;21692:3;21685:10;;21112:589;;;;;;:::o;21707:379::-;21891:3;21913:147;22056:3;21913:147;:::i;:::-;21906:154;;22077:3;22070:10;;21707:379;;;:::o;22092:222::-;22185:4;22223:2;22212:9;22208:18;22200:26;;22236:71;22304:1;22293:9;22289:17;22280:6;22236:71;:::i;:::-;22092:222;;;;:::o;22320:640::-;22515:4;22553:3;22542:9;22538:19;22530:27;;22567:71;22635:1;22624:9;22620:17;22611:6;22567:71;:::i;:::-;22648:72;22716:2;22705:9;22701:18;22692:6;22648:72;:::i;:::-;22730;22798:2;22787:9;22783:18;22774:6;22730:72;:::i;:::-;22849:9;22843:4;22839:20;22834:2;22823:9;22819:18;22812:48;22877:76;22948:4;22939:6;22877:76;:::i;:::-;22869:84;;22320:640;;;;;;;:::o;22966:373::-;23109:4;23147:2;23136:9;23132:18;23124:26;;23196:9;23190:4;23186:20;23182:1;23171:9;23167:17;23160:47;23224:108;23327:4;23318:6;23224:108;:::i;:::-;23216:116;;22966:373;;;;:::o;23345:210::-;23432:4;23470:2;23459:9;23455:18;23447:26;;23483:65;23545:1;23534:9;23530:17;23521:6;23483:65;:::i;:::-;23345:210;;;;:::o;23561:313::-;23674:4;23712:2;23701:9;23697:18;23689:26;;23761:9;23755:4;23751:20;23747:1;23736:9;23732:17;23725:47;23789:78;23862:4;23853:6;23789:78;:::i;:::-;23781:86;;23561:313;;;;:::o;23880:419::-;24046:4;24084:2;24073:9;24069:18;24061:26;;24133:9;24127:4;24123:20;24119:1;24108:9;24104:17;24097:47;24161:131;24287:4;24161:131;:::i;:::-;24153:139;;23880:419;;;:::o;24305:::-;24471:4;24509:2;24498:9;24494:18;24486:26;;24558:9;24552:4;24548:20;24544:1;24533:9;24529:17;24522:47;24586:131;24712:4;24586:131;:::i;:::-;24578:139;;24305:419;;;:::o;24730:::-;24896:4;24934:2;24923:9;24919:18;24911:26;;24983:9;24977:4;24973:20;24969:1;24958:9;24954:17;24947:47;25011:131;25137:4;25011:131;:::i;:::-;25003:139;;24730:419;;;:::o;25155:::-;25321:4;25359:2;25348:9;25344:18;25336:26;;25408:9;25402:4;25398:20;25394:1;25383:9;25379:17;25372:47;25436:131;25562:4;25436:131;:::i;:::-;25428:139;;25155:419;;;:::o;25580:::-;25746:4;25784:2;25773:9;25769:18;25761:26;;25833:9;25827:4;25823:20;25819:1;25808:9;25804:17;25797:47;25861:131;25987:4;25861:131;:::i;:::-;25853:139;;25580:419;;;:::o;26005:::-;26171:4;26209:2;26198:9;26194:18;26186:26;;26258:9;26252:4;26248:20;26244:1;26233:9;26229:17;26222:47;26286:131;26412:4;26286:131;:::i;:::-;26278:139;;26005:419;;;:::o;26430:::-;26596:4;26634:2;26623:9;26619:18;26611:26;;26683:9;26677:4;26673:20;26669:1;26658:9;26654:17;26647:47;26711:131;26837:4;26711:131;:::i;:::-;26703:139;;26430:419;;;:::o;26855:::-;27021:4;27059:2;27048:9;27044:18;27036:26;;27108:9;27102:4;27098:20;27094:1;27083:9;27079:17;27072:47;27136:131;27262:4;27136:131;:::i;:::-;27128:139;;26855:419;;;:::o;27280:::-;27446:4;27484:2;27473:9;27469:18;27461:26;;27533:9;27527:4;27523:20;27519:1;27508:9;27504:17;27497:47;27561:131;27687:4;27561:131;:::i;:::-;27553:139;;27280:419;;;:::o;27705:::-;27871:4;27909:2;27898:9;27894:18;27886:26;;27958:9;27952:4;27948:20;27944:1;27933:9;27929:17;27922:47;27986:131;28112:4;27986:131;:::i;:::-;27978:139;;27705:419;;;:::o;28130:::-;28296:4;28334:2;28323:9;28319:18;28311:26;;28383:9;28377:4;28373:20;28369:1;28358:9;28354:17;28347:47;28411:131;28537:4;28411:131;:::i;:::-;28403:139;;28130:419;;;:::o;28555:::-;28721:4;28759:2;28748:9;28744:18;28736:26;;28808:9;28802:4;28798:20;28794:1;28783:9;28779:17;28772:47;28836:131;28962:4;28836:131;:::i;:::-;28828:139;;28555:419;;;:::o;28980:::-;29146:4;29184:2;29173:9;29169:18;29161:26;;29233:9;29227:4;29223:20;29219:1;29208:9;29204:17;29197:47;29261:131;29387:4;29261:131;:::i;:::-;29253:139;;28980:419;;;:::o;29405:::-;29571:4;29609:2;29598:9;29594:18;29586:26;;29658:9;29652:4;29648:20;29644:1;29633:9;29629:17;29622:47;29686:131;29812:4;29686:131;:::i;:::-;29678:139;;29405:419;;;:::o;29830:::-;29996:4;30034:2;30023:9;30019:18;30011:26;;30083:9;30077:4;30073:20;30069:1;30058:9;30054:17;30047:47;30111:131;30237:4;30111:131;:::i;:::-;30103:139;;29830:419;;;:::o;30255:::-;30421:4;30459:2;30448:9;30444:18;30436:26;;30508:9;30502:4;30498:20;30494:1;30483:9;30479:17;30472:47;30536:131;30662:4;30536:131;:::i;:::-;30528:139;;30255:419;;;:::o;30680:::-;30846:4;30884:2;30873:9;30869:18;30861:26;;30933:9;30927:4;30923:20;30919:1;30908:9;30904:17;30897:47;30961:131;31087:4;30961:131;:::i;:::-;30953:139;;30680:419;;;:::o;31105:::-;31271:4;31309:2;31298:9;31294:18;31286:26;;31358:9;31352:4;31348:20;31344:1;31333:9;31329:17;31322:47;31386:131;31512:4;31386:131;:::i;:::-;31378:139;;31105:419;;;:::o;31530:::-;31696:4;31734:2;31723:9;31719:18;31711:26;;31783:9;31777:4;31773:20;31769:1;31758:9;31754:17;31747:47;31811:131;31937:4;31811:131;:::i;:::-;31803:139;;31530:419;;;:::o;31955:::-;32121:4;32159:2;32148:9;32144:18;32136:26;;32208:9;32202:4;32198:20;32194:1;32183:9;32179:17;32172:47;32236:131;32362:4;32236:131;:::i;:::-;32228:139;;31955:419;;;:::o;32380:222::-;32473:4;32511:2;32500:9;32496:18;32488:26;;32524:71;32592:1;32581:9;32577:17;32568:6;32524:71;:::i;:::-;32380:222;;;;:::o;32608:129::-;32642:6;32669:20;;:::i;:::-;32659:30;;32698:33;32726:4;32718:6;32698:33;:::i;:::-;32608:129;;;:::o;32743:75::-;32776:6;32809:2;32803:9;32793:19;;32743:75;:::o;32824:307::-;32885:4;32975:18;32967:6;32964:30;32961:56;;;32997:18;;:::i;:::-;32961:56;33035:29;33057:6;33035:29;:::i;:::-;33027:37;;33119:4;33113;33109:15;33101:23;;32824:307;;;:::o;33137:308::-;33199:4;33289:18;33281:6;33278:30;33275:56;;;33311:18;;:::i;:::-;33275:56;33349:29;33371:6;33349:29;:::i;:::-;33341:37;;33433:4;33427;33423:15;33415:23;;33137:308;;;:::o;33451:132::-;33518:4;33541:3;33533:11;;33571:4;33566:3;33562:14;33554:22;;33451:132;;;:::o;33589:141::-;33638:4;33661:3;33653:11;;33684:3;33681:1;33674:14;33718:4;33715:1;33705:18;33697:26;;33589:141;;;:::o;33736:114::-;33803:6;33837:5;33831:12;33821:22;;33736:114;;;:::o;33856:98::-;33907:6;33941:5;33935:12;33925:22;;33856:98;;;:::o;33960:99::-;34012:6;34046:5;34040:12;34030:22;;33960:99;;;:::o;34065:113::-;34135:4;34167;34162:3;34158:14;34150:22;;34065:113;;;:::o;34184:184::-;34283:11;34317:6;34312:3;34305:19;34357:4;34352:3;34348:14;34333:29;;34184:184;;;;:::o;34374:168::-;34457:11;34491:6;34486:3;34479:19;34531:4;34526:3;34522:14;34507:29;;34374:168;;;;:::o;34548:147::-;34649:11;34686:3;34671:18;;34548:147;;;;:::o;34701:169::-;34785:11;34819:6;34814:3;34807:19;34859:4;34854:3;34850:14;34835:29;;34701:169;;;;:::o;34876:148::-;34978:11;35015:3;35000:18;;34876:148;;;;:::o;35030:305::-;35070:3;35089:20;35107:1;35089:20;:::i;:::-;35084:25;;35123:20;35141:1;35123:20;:::i;:::-;35118:25;;35277:1;35209:66;35205:74;35202:1;35199:81;35196:107;;;35283:18;;:::i;:::-;35196:107;35327:1;35324;35320:9;35313:16;;35030:305;;;;:::o;35341:185::-;35381:1;35398:20;35416:1;35398:20;:::i;:::-;35393:25;;35432:20;35450:1;35432:20;:::i;:::-;35427:25;;35471:1;35461:35;;35476:18;;:::i;:::-;35461:35;35518:1;35515;35511:9;35506:14;;35341:185;;;;:::o;35532:348::-;35572:7;35595:20;35613:1;35595:20;:::i;:::-;35590:25;;35629:20;35647:1;35629:20;:::i;:::-;35624:25;;35817:1;35749:66;35745:74;35742:1;35739:81;35734:1;35727:9;35720:17;35716:105;35713:131;;;35824:18;;:::i;:::-;35713:131;35872:1;35869;35865:9;35854:20;;35532:348;;;;:::o;35886:191::-;35926:4;35946:20;35964:1;35946:20;:::i;:::-;35941:25;;35980:20;35998:1;35980:20;:::i;:::-;35975:25;;36019:1;36016;36013:8;36010:34;;;36024:18;;:::i;:::-;36010:34;36069:1;36066;36062:9;36054:17;;35886:191;;;;:::o;36083:96::-;36120:7;36149:24;36167:5;36149:24;:::i;:::-;36138:35;;36083:96;;;:::o;36185:90::-;36219:7;36262:5;36255:13;36248:21;36237:32;;36185:90;;;:::o;36281:77::-;36318:7;36347:5;36336:16;;36281:77;;;:::o;36364:149::-;36400:7;36440:66;36433:5;36429:78;36418:89;;36364:149;;;:::o;36519:126::-;36556:7;36596:42;36589:5;36585:54;36574:65;;36519:126;;;:::o;36651:77::-;36688:7;36717:5;36706:16;;36651:77;;;:::o;36734:154::-;36818:6;36813:3;36808;36795:30;36880:1;36871:6;36866:3;36862:16;36855:27;36734:154;;;:::o;36894:307::-;36962:1;36972:113;36986:6;36983:1;36980:13;36972:113;;;37071:1;37066:3;37062:11;37056:18;37052:1;37047:3;37043:11;37036:39;37008:2;37005:1;37001:10;36996:15;;36972:113;;;37103:6;37100:1;37097:13;37094:101;;;37183:1;37174:6;37169:3;37165:16;37158:27;37094:101;36943:258;36894:307;;;:::o;37207:320::-;37251:6;37288:1;37282:4;37278:12;37268:22;;37335:1;37329:4;37325:12;37356:18;37346:81;;37412:4;37404:6;37400:17;37390:27;;37346:81;37474:2;37466:6;37463:14;37443:18;37440:38;37437:84;;;37493:18;;:::i;:::-;37437:84;37258:269;37207:320;;;:::o;37533:281::-;37616:27;37638:4;37616:27;:::i;:::-;37608:6;37604:40;37746:6;37734:10;37731:22;37710:18;37698:10;37695:34;37692:62;37689:88;;;37757:18;;:::i;:::-;37689:88;37797:10;37793:2;37786:22;37576:238;37533:281;;:::o;37820:233::-;37859:3;37882:24;37900:5;37882:24;:::i;:::-;37873:33;;37928:66;37921:5;37918:77;37915:103;;;37998:18;;:::i;:::-;37915:103;38045:1;38038:5;38034:13;38027:20;;37820:233;;;:::o;38059:100::-;38098:7;38127:26;38147:5;38127:26;:::i;:::-;38116:37;;38059:100;;;:::o;38165:94::-;38204:7;38233:20;38247:5;38233:20;:::i;:::-;38222:31;;38165:94;;;:::o;38265:176::-;38297:1;38314:20;38332:1;38314:20;:::i;:::-;38309:25;;38348:20;38366:1;38348:20;:::i;:::-;38343:25;;38387:1;38377:35;;38392:18;;:::i;:::-;38377:35;38433:1;38430;38426:9;38421:14;;38265:176;;;;:::o;38447:180::-;38495:77;38492:1;38485:88;38592:4;38589:1;38582:15;38616:4;38613:1;38606:15;38633:180;38681:77;38678:1;38671:88;38778:4;38775:1;38768:15;38802:4;38799:1;38792:15;38819:180;38867:77;38864:1;38857:88;38964:4;38961:1;38954:15;38988:4;38985:1;38978:15;39005:180;39053:77;39050:1;39043:88;39150:4;39147:1;39140:15;39174:4;39171:1;39164:15;39191:180;39239:77;39236:1;39229:88;39336:4;39333:1;39326:15;39360:4;39357:1;39350:15;39377:117;39486:1;39483;39476:12;39500:117;39609:1;39606;39599:12;39623:117;39732:1;39729;39722:12;39746:117;39855:1;39852;39845:12;39869:117;39978:1;39975;39968:12;39992:117;40101:1;40098;40091:12;40115:102;40156:6;40207:2;40203:7;40198:2;40191:5;40187:14;40183:28;40173:38;;40115:102;;;:::o;40223:94::-;40256:8;40304:5;40300:2;40296:14;40275:35;;40223:94;;;:::o;40323:181::-;40463:33;40459:1;40451:6;40447:14;40440:57;40323:181;:::o;40510:225::-;40650:34;40646:1;40638:6;40634:14;40627:58;40719:8;40714:2;40706:6;40702:15;40695:33;40510:225;:::o;40741:181::-;40881:33;40877:1;40869:6;40865:14;40858:57;40741:181;:::o;40928:174::-;41068:26;41064:1;41056:6;41052:14;41045:50;40928:174;:::o;41108:166::-;41248:18;41244:1;41236:6;41232:14;41225:42;41108:166;:::o;41280:170::-;41420:22;41416:1;41408:6;41404:14;41397:46;41280:170;:::o;41456:223::-;41596:34;41592:1;41584:6;41580:14;41573:58;41665:6;41660:2;41652:6;41648:15;41641:31;41456:223;:::o;41685:164::-;41825:16;41821:1;41813:6;41809:14;41802:40;41685:164;:::o;41855:182::-;41995:34;41991:1;41983:6;41979:14;41972:58;41855:182;:::o;42043:173::-;42183:25;42179:1;42171:6;42167:14;42160:49;42043:173;:::o;42222:234::-;42362:34;42358:1;42350:6;42346:14;42339:58;42431:17;42426:2;42418:6;42414:15;42407:42;42222:234;:::o;42462:114::-;;:::o;42582:227::-;42722:34;42718:1;42710:6;42706:14;42699:58;42791:10;42786:2;42778:6;42774:15;42767:35;42582:227;:::o;42815:182::-;42955:34;42951:1;42943:6;42939:14;42932:58;42815:182;:::o;43003:179::-;43143:31;43139:1;43131:6;43127:14;43120:55;43003:179;:::o;43188:174::-;43328:26;43324:1;43316:6;43312:14;43305:50;43188:174;:::o;43368:223::-;43508:34;43504:1;43496:6;43492:14;43485:58;43577:6;43572:2;43564:6;43560:15;43553:31;43368:223;:::o;43597:176::-;43737:28;43733:1;43725:6;43721:14;43714:52;43597:176;:::o;43779:181::-;43919:33;43915:1;43907:6;43903:14;43896:57;43779:181;:::o;43966:162::-;44106:14;44102:1;44094:6;44090:14;44083:38;43966:162;:::o;44134:177::-;44274:29;44270:1;44262:6;44258:14;44251:53;44134:177;:::o;44317:122::-;44390:24;44408:5;44390:24;:::i;:::-;44383:5;44380:35;44370:63;;44429:1;44426;44419:12;44370:63;44317:122;:::o;44445:116::-;44515:21;44530:5;44515:21;:::i;:::-;44508:5;44505:32;44495:60;;44551:1;44548;44541:12;44495:60;44445:116;:::o;44567:122::-;44640:24;44658:5;44640:24;:::i;:::-;44633:5;44630:35;44620:63;;44679:1;44676;44669:12;44620:63;44567:122;:::o;44695:120::-;44767:23;44784:5;44767:23;:::i;:::-;44760:5;44757:34;44747:62;;44805:1;44802;44795:12;44747:62;44695:120;:::o;44821:122::-;44894:24;44912:5;44894:24;:::i;:::-;44887:5;44884:35;44874:63;;44933:1;44930;44923:12;44874:63;44821:122;:::o
Swarm Source
ipfs://ce19d38505cf859ee60ed9d966760a4bf5c40f74fc98df682a0ac8b52e291b8e
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.