ERC-721
Overview
Max Total Supply
6,660 RVNGBRD
Holders
5,171
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 RVNGBRDLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
RevengeBirds
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.8.9 <0.9.0; import 'erc721a/contracts/extensions/ERC721AQueryable.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/utils/cryptography/MerkleProof.sol'; import '@openzeppelin/contracts/utils/Strings.sol'; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; contract RevengeBirds is ERC721AQueryable, Ownable, ReentrancyGuard { using Strings for uint256; string public tokenName = "Revenge Birds"; string public tokenSymbol = "RVNGBRD"; uint256 public maxSupply = 6660; uint256 public maxReservedSupply = 0; uint256 public maxMintAddress = 3; bytes32 public merkleRoot; mapping(address => bool) public mintClaimed; bool public paused = false; bool public whitelistMintEnabled = true; bool public revealed = false; string public uriPrefix = ''; string public uriSuffix = '.json'; string public hiddenMetadataUri = ""; uint256 public cost = 0.00666 ether; constructor(string memory _hiddenMetadataUri) ERC721A(tokenName, tokenSymbol) { setHiddenMetadataUri(_hiddenMetadataUri); } modifier mintPriceCompliance(uint256 _mintAmount) { require(msg.value >= updateMintCost(_mintAmount), 'Insufficient funds!'); _; } function mint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable mintPriceCompliance(_mintAmount) { if (whitelistMintEnabled == true){ bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid proof!'); } require(!paused, 'The contract is paused!'); require(_mintAmount > 0 && _mintAmount <= maxMintAddress, 'Invalid mint amount!'); require(totalSupply() + _mintAmount <= (maxSupply - maxReservedSupply), 'Max supply exceeded!'); require(!mintClaimed[_msgSender()], 'Address already claimed!'); mintClaimed[_msgSender()] = true; _safeMint(_msgSender(), _mintAmount); } function mintOwner(uint256 _mintAmount, address _receiver) public onlyOwner { require((totalSupply() + _mintAmount) <= maxSupply, 'Max supply exceeded!'); _safeMint(_receiver, _mintAmount); } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token'); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ''; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setMaxReservedSupply(uint256 _newMaxReservedSupply) public onlyOwner { require(_newMaxReservedSupply <= (maxSupply - totalSupply())); maxReservedSupply = _newMaxReservedSupply; } function setmaxMintAddress(uint256 _maxMintAddress) public onlyOwner { maxMintAddress = _maxMintAddress; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function setWhitelistMintEnabled(bool _state) public onlyOwner { whitelistMintEnabled = _state; } // A function of hope -> function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } // Internal -> function _startTokenId() internal view virtual override returns (uint256) { return 1; } function updateMintCost(uint256 _amount) internal view returns (uint256 _cost) { if (_amount == 1){ return 0 ether; } else { return cost * (_amount -1); } } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // 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); } }
// SPDX-License-Identifier: MIT // 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) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions 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); } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721AQueryable.sol'; import '../ERC721A.sol'; /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * - `extraData` = `0` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * - `extraData` = `<Extra data when token was burned>` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` * - `extraData` = `<Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @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) } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import '../IERC721A.sol'; /** * @dev Interface of an ERC721AQueryable compliant contract. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // 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); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","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":"InvalidQueryRange","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":[{"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":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxMintAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReservedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxReservedSupply","type":"uint256"}],"name":"setMaxReservedSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAddress","type":"uint256"}],"name":"setmaxMintAddress","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":"tokenName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSymbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600d81526020017f526576656e676520426972647300000000000000000000000000000000000000815250600a9080519060200190620000519291906200054b565b506040518060400160405280600781526020017f52564e4742524400000000000000000000000000000000000000000000000000815250600b90805190602001906200009f9291906200054b565b50611a04600c556000600d556003600e556000601160006101000a81548160ff0219169083151502179055506001601160016101000a81548160ff0219169083151502179055506000601160026101000a81548160ff0219169083151502179055506040518060200160405280600081525060129080519060200190620001289291906200054b565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060139080519060200190620001769291906200054b565b5060405180602001604052806000815250601490805190602001906200019e9291906200054b565b506617a93c16344000601555348015620001b757600080fd5b506040516200503b3803806200503b8339818101604052810190620001dd919062000798565b600a8054620001ec9062000818565b80601f01602080910402602001604051908101604052809291908181526020018280546200021a9062000818565b80156200026b5780601f106200023f576101008083540402835291602001916200026b565b820191906000526020600020905b8154815290600101906020018083116200024d57829003601f168201915b5050505050600b80546200027f9062000818565b80601f0160208091040260200160405190810160405280929190818152602001828054620002ad9062000818565b8015620002fe5780601f10620002d257610100808354040283529160200191620002fe565b820191906000526020600020905b815481529060010190602001808311620002e057829003601f168201915b505050505081600290805190602001906200031b9291906200054b565b508060039080519060200190620003349291906200054b565b50620003456200038d60201b60201c565b60008190555050506200036d620003616200039660201b60201c565b6200039e60201b60201c565b600160098190555062000386816200046460201b60201c565b50620008d1565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004746200049060201b60201c565b80601490805190602001906200048c9291906200054b565b5050565b620004a06200039660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004c66200052160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200051f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200051690620008af565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620005599062000818565b90600052602060002090601f0160209004810192826200057d5760008555620005c9565b82601f106200059857805160ff1916838001178555620005c9565b82800160010185558215620005c9579182015b82811115620005c8578251825591602001919060010190620005ab565b5b509050620005d89190620005dc565b5090565b5b80821115620005f7576000816000905550600101620005dd565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006648262000619565b810181811067ffffffffffffffff821117156200068657620006856200062a565b5b80604052505050565b60006200069b620005fb565b9050620006a9828262000659565b919050565b600067ffffffffffffffff821115620006cc57620006cb6200062a565b5b620006d78262000619565b9050602081019050919050565b60005b8381101562000704578082015181840152602081019050620006e7565b8381111562000714576000848401525b50505050565b6000620007316200072b84620006ae565b6200068f565b90508281526020810184848401111562000750576200074f62000614565b5b6200075d848285620006e4565b509392505050565b600082601f8301126200077d576200077c6200060f565b5b81516200078f8482602086016200071a565b91505092915050565b600060208284031215620007b157620007b062000605565b5b600082015167ffffffffffffffff811115620007d257620007d16200060a565b5b620007e08482850162000765565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200083157607f821691505b60208210811415620008485762000847620007e9565b5b50919050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620008976020836200084e565b9150620008a4826200085f565b602082019050919050565b60006020820190508181036000830152620008ca8162000888565b9050919050565b61475a80620008e16000396000f3fe6080604052600436106102935760003560e01c806370a082311161015a578063a54ef38a116100c1578063c87b56dd1161007a578063c87b56dd146109f3578063d5abeb0114610a30578063e0a8085314610a5b578063e985e9c514610a84578063f2fde38b14610ac1578063f4010ea614610aea57610293565b8063a54ef38a146108f4578063b767a0981461091d578063b88d4fde14610946578063ba41b0c61461096f578063c1fad42c1461098b578063c23dc68f146109b657610293565b80638da5cb5b116101135780638da5cb5b146107e457806395d89b411461080f57806399a2557a1461083a5780639f15df1214610877578063a22cb465146108a0578063a45ba8e7146108c957610293565b806370a08231146106d6578063715018a6146107135780637b61c3201461072a5780637cb64759146107555780637ec4a6591461077e5780638462151c146107a757610293565b80633ccfd60b116101fe5780635bbb2177116101b75780635bbb2177146105b05780635c975abb146105ed57806362b99ad4146106185780636352211e146106435780636c02a931146106805780636caede3d146106ab57610293565b80633ccfd60b146104c857806342842e0e146104df57806344a0d68a146105085780634fdd43cb14610531578063518302271461055a5780635503a0e81461058557610293565b806316ba10e01161025057806316ba10e0146103ce57806316c38b3c146103f757806318160ddd1461042057806323b872dd1461044b578063271b2fcc146104745780632eb4a7ab1461049d57610293565b806301ffc9a71461029857806306fdde03146102d5578063081812fc14610300578063095ea7b31461033d5780631237e5e81461036657806313faede6146103a3575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190613167565b610b15565b6040516102cc91906131af565b60405180910390f35b3480156102e157600080fd5b506102ea610ba7565b6040516102f79190613263565b60405180910390f35b34801561030c57600080fd5b50610327600480360381019061032291906132bb565b610c39565b6040516103349190613329565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f9190613370565b610cb5565b005b34801561037257600080fd5b5061038d600480360381019061038891906133b0565b610df6565b60405161039a91906131af565b60405180910390f35b3480156103af57600080fd5b506103b8610e16565b6040516103c591906133ec565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f0919061353c565b610e1c565b005b34801561040357600080fd5b5061041e600480360381019061041991906135b1565b610e3e565b005b34801561042c57600080fd5b50610435610e63565b60405161044291906133ec565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d91906135de565b610e7a565b005b34801561048057600080fd5b5061049b600480360381019061049691906132bb565b61119f565b005b3480156104a957600080fd5b506104b26111d2565b6040516104bf919061364a565b60405180910390f35b3480156104d457600080fd5b506104dd6111d8565b005b3480156104eb57600080fd5b50610506600480360381019061050191906135de565b6112b6565b005b34801561051457600080fd5b5061052f600480360381019061052a91906132bb565b6112d6565b005b34801561053d57600080fd5b506105586004803603810190610553919061353c565b6112e8565b005b34801561056657600080fd5b5061056f61130a565b60405161057c91906131af565b60405180910390f35b34801561059157600080fd5b5061059a61131d565b6040516105a79190613263565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d2919061372d565b6113ab565b6040516105e491906138d9565b60405180910390f35b3480156105f957600080fd5b5061060261146c565b60405161060f91906131af565b60405180910390f35b34801561062457600080fd5b5061062d61147f565b60405161063a9190613263565b60405180910390f35b34801561064f57600080fd5b5061066a600480360381019061066591906132bb565b61150d565b6040516106779190613329565b60405180910390f35b34801561068c57600080fd5b5061069561151f565b6040516106a29190613263565b60405180910390f35b3480156106b757600080fd5b506106c06115ad565b6040516106cd91906131af565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f891906133b0565b6115c0565b60405161070a91906133ec565b60405180910390f35b34801561071f57600080fd5b50610728611679565b005b34801561073657600080fd5b5061073f61168d565b60405161074c9190613263565b60405180910390f35b34801561076157600080fd5b5061077c60048036038101906107779190613927565b61171b565b005b34801561078a57600080fd5b506107a560048036038101906107a0919061353c565b61172d565b005b3480156107b357600080fd5b506107ce60048036038101906107c991906133b0565b61174f565b6040516107db9190613a12565b60405180910390f35b3480156107f057600080fd5b506107f9611899565b6040516108069190613329565b60405180910390f35b34801561081b57600080fd5b506108246118c3565b6040516108319190613263565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c9190613a34565b611955565b60405161086e9190613a12565b60405180910390f35b34801561088357600080fd5b5061089e60048036038101906108999190613a87565b611b69565b005b3480156108ac57600080fd5b506108c760048036038101906108c29190613ac7565b611bd6565b005b3480156108d557600080fd5b506108de611d4e565b6040516108eb9190613263565b60405180910390f35b34801561090057600080fd5b5061091b600480360381019061091691906132bb565b611ddc565b005b34801561092957600080fd5b50610944600480360381019061093f91906135b1565b611dee565b005b34801561095257600080fd5b5061096d60048036038101906109689190613ba8565b611e13565b005b61098960048036038101906109849190613c86565b611e86565b005b34801561099757600080fd5b506109a06121be565b6040516109ad91906133ec565b60405180910390f35b3480156109c257600080fd5b506109dd60048036038101906109d891906132bb565b6121c4565b6040516109ea9190613d3b565b60405180910390f35b3480156109ff57600080fd5b50610a1a6004803603810190610a1591906132bb565b61222e565b604051610a279190613263565b60405180910390f35b348015610a3c57600080fd5b50610a45612387565b604051610a5291906133ec565b60405180910390f35b348015610a6757600080fd5b50610a826004803603810190610a7d91906135b1565b61238d565b005b348015610a9057600080fd5b50610aab6004803603810190610aa69190613d56565b6123b2565b604051610ab891906131af565b60405180910390f35b348015610acd57600080fd5b50610ae86004803603810190610ae391906133b0565b612446565b005b348015610af657600080fd5b50610aff6124ca565b604051610b0c91906133ec565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b7057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ba05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610bb690613dc5565b80601f0160208091040260200160405190810160405280929190818152602001828054610be290613dc5565b8015610c2f5780601f10610c0457610100808354040283529160200191610c2f565b820191906000526020600020905b815481529060010190602001808311610c1257829003601f168201915b5050505050905090565b6000610c44826124d0565b610c7a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc08261150d565b90508073ffffffffffffffffffffffffffffffffffffffff16610ce161252f565b73ffffffffffffffffffffffffffffffffffffffff1614610d4457610d0d81610d0861252f565b6123b2565b610d43576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60106020528060005260406000206000915054906101000a900460ff1681565b60155481565b610e24612537565b8060139080519060200190610e3a929190613009565b5050565b610e46612537565b80601160006101000a81548160ff02191690831515021790555050565b6000610e6d6125b5565b6001546000540303905090565b6000610e85826125be565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610eec576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ef88461268c565b91509150610f0e8187610f0961252f565b6126ae565b610f5a57610f2386610f1e61252f565b6123b2565b610f59576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610fc1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fce86868660016126f2565b8015610fd957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506110a7856110838888876126f8565b7c020000000000000000000000000000000000000000000000000000000017612720565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561112f57600060018501905060006004600083815260200190815260200160002054141561112d57600054811461112c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611197868686600161274b565b505050505050565b6111a7612537565b6111af610e63565b600c546111bc9190613e26565b8111156111c857600080fd5b80600d8190555050565b600f5481565b6111e0612537565b60026009541415611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d90613ea6565b60405180910390fd5b60026009819055506000611238611899565b73ffffffffffffffffffffffffffffffffffffffff164760405161125b90613ef7565b60006040518083038185875af1925050503d8060008114611298576040519150601f19603f3d011682016040523d82523d6000602084013e61129d565b606091505b50509050806112ab57600080fd5b506001600981905550565b6112d183838360405180602001604052806000815250611e13565b505050565b6112de612537565b8060158190555050565b6112f0612537565b8060149080519060200190611306929190613009565b5050565b601160029054906101000a900460ff1681565b6013805461132a90613dc5565b80601f016020809104026020016040519081016040528092919081815260200182805461135690613dc5565b80156113a35780601f10611378576101008083540402835291602001916113a3565b820191906000526020600020905b81548152906001019060200180831161138657829003601f168201915b505050505081565b606060008251905060008167ffffffffffffffff8111156113cf576113ce613411565b5b60405190808252806020026020018201604052801561140857816020015b6113f561308f565b8152602001906001900390816113ed5790505b50905060005b8281146114615761143885828151811061142b5761142a613f0c565b5b60200260200101516121c4565b82828151811061144b5761144a613f0c565b5b602002602001018190525080600101905061140e565b508092505050919050565b601160009054906101000a900460ff1681565b6012805461148c90613dc5565b80601f01602080910402602001604051908101604052809291908181526020018280546114b890613dc5565b80156115055780601f106114da57610100808354040283529160200191611505565b820191906000526020600020905b8154815290600101906020018083116114e857829003601f168201915b505050505081565b6000611518826125be565b9050919050565b600a805461152c90613dc5565b80601f016020809104026020016040519081016040528092919081815260200182805461155890613dc5565b80156115a55780601f1061157a576101008083540402835291602001916115a5565b820191906000526020600020905b81548152906001019060200180831161158857829003601f168201915b505050505081565b601160019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611628576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611681612537565b61168b6000612751565b565b600b805461169a90613dc5565b80601f01602080910402602001604051908101604052809291908181526020018280546116c690613dc5565b80156117135780601f106116e857610100808354040283529160200191611713565b820191906000526020600020905b8154815290600101906020018083116116f657829003601f168201915b505050505081565b611723612537565b80600f8190555050565b611735612537565b806012908051906020019061174b929190613009565b5050565b6060600080600061175f856115c0565b905060008167ffffffffffffffff81111561177d5761177c613411565b5b6040519080825280602002602001820160405280156117ab5781602001602082028036833780820191505090505b5090506117b661308f565b60006117c06125b5565b90505b83861461188b576117d381612817565b91508160400151156117e457611880565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461182457816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561187f578083878060010198508151811061187257611871613f0c565b5b6020026020010181815250505b5b8060010190506117c3565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546118d290613dc5565b80601f01602080910402602001604051908101604052809291908181526020018280546118fe90613dc5565b801561194b5780601f106119205761010080835404028352916020019161194b565b820191906000526020600020905b81548152906001019060200180831161192e57829003601f168201915b5050505050905090565b6060818310611990576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061199b612842565b90506119a56125b5565b8510156119b7576119b46125b5565b94505b808411156119c3578093505b60006119ce876115c0565b9050848610156119f15760008686039050818110156119eb578091505b506119f6565b600090505b60008167ffffffffffffffff811115611a1257611a11613411565b5b604051908082528060200260200182016040528015611a405781602001602082028036833780820191505090505b5090506000821415611a585780945050505050611b62565b6000611a63886121c4565b905060008160400151611a7857816000015190505b60008990505b888114158015611a8e5750848714155b15611b5457611a9c81612817565b9250826040015115611aad57611b49565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611aed57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b485780848880600101995081518110611b3b57611b3a613f0c565b5b6020026020010181815250505b5b806001019050611a7e565b508583528296505050505050505b9392505050565b611b71612537565b600c5482611b7d610e63565b611b879190613f3b565b1115611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf90613fdd565b60405180910390fd5b611bd2818361284b565b5050565b611bde61252f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c43576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611c5061252f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cfd61252f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d4291906131af565b60405180910390a35050565b60148054611d5b90613dc5565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8790613dc5565b8015611dd45780601f10611da957610100808354040283529160200191611dd4565b820191906000526020600020905b815481529060010190602001808311611db757829003601f168201915b505050505081565b611de4612537565b80600e8190555050565b611df6612537565b80601160016101000a81548160ff02191690831515021790555050565b611e1e848484610e7a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e8057611e4984848484612869565b611e7f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b82611e90816129c9565b341015611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec990614049565b60405180910390fd5b60011515601160019054906101000a900460ff1615151415611faf576000611ef86129ff565b604051602001611f0891906140b1565b604051602081830303815290604052805190602001209050611f6e848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f5483612a07565b611fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa490614118565b60405180910390fd5b505b601160009054906101000a900460ff1615611fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff690614184565b60405180910390fd5b6000841180156120115750600e548411155b612050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612047906141f0565b60405180910390fd5b600d54600c546120609190613e26565b84612069610e63565b6120739190613f3b565b11156120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab90613fdd565b60405180910390fd5b601060006120c06129ff565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213f9061425c565b60405180910390fd5b6001601060006121566129ff565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506121b86121b26129ff565b8561284b565b50505050565b600d5481565b6121cc61308f565b6121d461308f565b6121dc6125b5565b8310806121f057506121ec612842565b8310155b156121fe5780915050612229565b61220783612817565b905080604001511561221c5780915050612229565b61222583612a1e565b9150505b919050565b6060612239826124d0565b612278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226f906142ee565b60405180910390fd5b60001515601160029054906101000a900460ff161515141561232657601480546122a190613dc5565b80601f01602080910402602001604051908101604052809291908181526020018280546122cd90613dc5565b801561231a5780601f106122ef5761010080835404028352916020019161231a565b820191906000526020600020905b8154815290600101906020018083116122fd57829003601f168201915b50505050509050612382565b6000612330612a3e565b90506000815111612350576040518060200160405280600081525061237e565b8061235a84612ad0565b601360405160200161236e939291906143de565b6040516020818303038152906040525b9150505b919050565b600c5481565b612395612537565b80601160026101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61244e612537565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b590614481565b60405180910390fd5b6124c781612751565b50565b600e5481565b6000816124db6125b5565b111580156124ea575060005482105b8015612528575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b61253f6129ff565b73ffffffffffffffffffffffffffffffffffffffff1661255d611899565b73ffffffffffffffffffffffffffffffffffffffff16146125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa906144ed565b60405180910390fd5b565b60006001905090565b600080829050806125cd6125b5565b11612655576000548110156126545760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612652575b600081141561264857600460008360019003935083815260200190815260200160002054905061261d565b8092505050612687565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861270f868684612c31565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61281f61308f565b61283b6004600084815260200190815260200160002054612c3a565b9050919050565b60008054905090565b612865828260405180602001604052806000815250612cf0565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261288f61252f565b8786866040518563ffffffff1660e01b81526004016128b19493929190614562565b602060405180830381600087803b1580156128cb57600080fd5b505af19250505080156128fc57506040513d601f19601f820116820180604052508101906128f991906145c3565b60015b612976573d806000811461292c576040519150601f19603f3d011682016040523d82523d6000602084013e612931565b606091505b5060008151141561296e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600060018214156129dd57600090506129fa565b6001826129ea9190613e26565b6015546129f791906145f0565b90505b919050565b600033905090565b600082612a148584612d8d565b1490509392505050565b612a2661308f565b612a37612a32836125be565b612c3a565b9050919050565b606060128054612a4d90613dc5565b80601f0160208091040260200160405190810160405280929190818152602001828054612a7990613dc5565b8015612ac65780601f10612a9b57610100808354040283529160200191612ac6565b820191906000526020600020905b815481529060010190602001808311612aa957829003601f168201915b5050505050905090565b60606000821415612b18576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c2c565b600082905060005b60008214612b4a578080612b339061464a565b915050600a82612b4391906146c2565b9150612b20565b60008167ffffffffffffffff811115612b6657612b65613411565b5b6040519080825280601f01601f191660200182016040528015612b985781602001600182028036833780820191505090505b5090505b60008514612c2557600182612bb19190613e26565b9150600a85612bc091906146f3565b6030612bcc9190613f3b565b60f81b818381518110612be257612be1613f0c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c1e91906146c2565b9450612b9c565b8093505050505b919050565b60009392505050565b612c4261308f565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b612cfa8383612de3565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612d8857600080549050600083820390505b612d3a6000868380600101945086612869565b612d70576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612d27578160005414612d8557600080fd5b50505b505050565b60008082905060005b8451811015612dd857612dc382868381518110612db657612db5613f0c565b5b6020026020010151612fb7565b91508080612dd09061464a565b915050612d96565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e50576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612e8b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e9860008483856126f2565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612f0f83612f0060008660006126f8565b612f0985612fe2565b17612720565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612f3357806000819055505050612fb2600084838561274b565b505050565b6000818310612fcf57612fca8284612ff2565b612fda565b612fd98383612ff2565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b82805461301590613dc5565b90600052602060002090601f016020900481019282613037576000855561307e565b82601f1061305057805160ff191683800117855561307e565b8280016001018555821561307e579182015b8281111561307d578251825591602001919060010190613062565b5b50905061308b91906130de565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b808211156130f75760008160009055506001016130df565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131448161310f565b811461314f57600080fd5b50565b6000813590506131618161313b565b92915050565b60006020828403121561317d5761317c613105565b5b600061318b84828501613152565b91505092915050565b60008115159050919050565b6131a981613194565b82525050565b60006020820190506131c460008301846131a0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132045780820151818401526020810190506131e9565b83811115613213576000848401525b50505050565b6000601f19601f8301169050919050565b6000613235826131ca565b61323f81856131d5565b935061324f8185602086016131e6565b61325881613219565b840191505092915050565b6000602082019050818103600083015261327d818461322a565b905092915050565b6000819050919050565b61329881613285565b81146132a357600080fd5b50565b6000813590506132b58161328f565b92915050565b6000602082840312156132d1576132d0613105565b5b60006132df848285016132a6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613313826132e8565b9050919050565b61332381613308565b82525050565b600060208201905061333e600083018461331a565b92915050565b61334d81613308565b811461335857600080fd5b50565b60008135905061336a81613344565b92915050565b6000806040838503121561338757613386613105565b5b60006133958582860161335b565b92505060206133a6858286016132a6565b9150509250929050565b6000602082840312156133c6576133c5613105565b5b60006133d48482850161335b565b91505092915050565b6133e681613285565b82525050565b600060208201905061340160008301846133dd565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61344982613219565b810181811067ffffffffffffffff8211171561346857613467613411565b5b80604052505050565b600061347b6130fb565b90506134878282613440565b919050565b600067ffffffffffffffff8211156134a7576134a6613411565b5b6134b082613219565b9050602081019050919050565b82818337600083830152505050565b60006134df6134da8461348c565b613471565b9050828152602081018484840111156134fb576134fa61340c565b5b6135068482856134bd565b509392505050565b600082601f83011261352357613522613407565b5b81356135338482602086016134cc565b91505092915050565b60006020828403121561355257613551613105565b5b600082013567ffffffffffffffff8111156135705761356f61310a565b5b61357c8482850161350e565b91505092915050565b61358e81613194565b811461359957600080fd5b50565b6000813590506135ab81613585565b92915050565b6000602082840312156135c7576135c6613105565b5b60006135d58482850161359c565b91505092915050565b6000806000606084860312156135f7576135f6613105565b5b60006136058682870161335b565b93505060206136168682870161335b565b9250506040613627868287016132a6565b9150509250925092565b6000819050919050565b61364481613631565b82525050565b600060208201905061365f600083018461363b565b92915050565b600067ffffffffffffffff8211156136805761367f613411565b5b602082029050602081019050919050565b600080fd5b60006136a96136a484613665565b613471565b905080838252602082019050602084028301858111156136cc576136cb613691565b5b835b818110156136f557806136e188826132a6565b8452602084019350506020810190506136ce565b5050509392505050565b600082601f83011261371457613713613407565b5b8135613724848260208601613696565b91505092915050565b60006020828403121561374357613742613105565b5b600082013567ffffffffffffffff8111156137615761376061310a565b5b61376d848285016136ff565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137ab81613308565b82525050565b600067ffffffffffffffff82169050919050565b6137ce816137b1565b82525050565b6137dd81613194565b82525050565b600062ffffff82169050919050565b6137fb816137e3565b82525050565b60808201600082015161381760008501826137a2565b50602082015161382a60208501826137c5565b50604082015161383d60408501826137d4565b50606082015161385060608501826137f2565b50505050565b60006138628383613801565b60808301905092915050565b6000602082019050919050565b600061388682613776565b6138908185613781565b935061389b83613792565b8060005b838110156138cc5781516138b38882613856565b97506138be8361386e565b92505060018101905061389f565b5085935050505092915050565b600060208201905081810360008301526138f3818461387b565b905092915050565b61390481613631565b811461390f57600080fd5b50565b600081359050613921816138fb565b92915050565b60006020828403121561393d5761393c613105565b5b600061394b84828501613912565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61398981613285565b82525050565b600061399b8383613980565b60208301905092915050565b6000602082019050919050565b60006139bf82613954565b6139c9818561395f565b93506139d483613970565b8060005b83811015613a055781516139ec888261398f565b97506139f7836139a7565b9250506001810190506139d8565b5085935050505092915050565b60006020820190508181036000830152613a2c81846139b4565b905092915050565b600080600060608486031215613a4d57613a4c613105565b5b6000613a5b8682870161335b565b9350506020613a6c868287016132a6565b9250506040613a7d868287016132a6565b9150509250925092565b60008060408385031215613a9e57613a9d613105565b5b6000613aac858286016132a6565b9250506020613abd8582860161335b565b9150509250929050565b60008060408385031215613ade57613add613105565b5b6000613aec8582860161335b565b9250506020613afd8582860161359c565b9150509250929050565b600067ffffffffffffffff821115613b2257613b21613411565b5b613b2b82613219565b9050602081019050919050565b6000613b4b613b4684613b07565b613471565b905082815260208101848484011115613b6757613b6661340c565b5b613b728482856134bd565b509392505050565b600082601f830112613b8f57613b8e613407565b5b8135613b9f848260208601613b38565b91505092915050565b60008060008060808587031215613bc257613bc1613105565b5b6000613bd08782880161335b565b9450506020613be18782880161335b565b9350506040613bf2878288016132a6565b925050606085013567ffffffffffffffff811115613c1357613c1261310a565b5b613c1f87828801613b7a565b91505092959194509250565b600080fd5b60008083601f840112613c4657613c45613407565b5b8235905067ffffffffffffffff811115613c6357613c62613c2b565b5b602083019150836020820283011115613c7f57613c7e613691565b5b9250929050565b600080600060408486031215613c9f57613c9e613105565b5b6000613cad868287016132a6565b935050602084013567ffffffffffffffff811115613cce57613ccd61310a565b5b613cda86828701613c30565b92509250509250925092565b608082016000820151613cfc60008501826137a2565b506020820151613d0f60208501826137c5565b506040820151613d2260408501826137d4565b506060820151613d3560608501826137f2565b50505050565b6000608082019050613d506000830184613ce6565b92915050565b60008060408385031215613d6d57613d6c613105565b5b6000613d7b8582860161335b565b9250506020613d8c8582860161335b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ddd57607f821691505b60208210811415613df157613df0613d96565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e3182613285565b9150613e3c83613285565b925082821015613e4f57613e4e613df7565b5b828203905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613e90601f836131d5565b9150613e9b82613e5a565b602082019050919050565b60006020820190508181036000830152613ebf81613e83565b9050919050565b600081905092915050565b50565b6000613ee1600083613ec6565b9150613eec82613ed1565b600082019050919050565b6000613f0282613ed4565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613f4682613285565b9150613f5183613285565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f8657613f85613df7565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613fc76014836131d5565b9150613fd282613f91565b602082019050919050565b60006020820190508181036000830152613ff681613fba565b9050919050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006140336013836131d5565b915061403e82613ffd565b602082019050919050565b6000602082019050818103600083015261406281614026565b9050919050565b60008160601b9050919050565b600061408182614069565b9050919050565b600061409382614076565b9050919050565b6140ab6140a682613308565b614088565b82525050565b60006140bd828461409a565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614102600e836131d5565b915061410d826140cc565b602082019050919050565b60006020820190508181036000830152614131816140f5565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b600061416e6017836131d5565b915061417982614138565b602082019050919050565b6000602082019050818103600083015261419d81614161565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006141da6014836131d5565b91506141e5826141a4565b602082019050919050565b60006020820190508181036000830152614209816141cd565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b60006142466018836131d5565b915061425182614210565b602082019050919050565b6000602082019050818103600083015261427581614239565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142d8602f836131d5565b91506142e38261427c565b604082019050919050565b60006020820190508181036000830152614307816142cb565b9050919050565b600081905092915050565b6000614324826131ca565b61432e818561430e565b935061433e8185602086016131e6565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461436c81613dc5565b614376818661430e565b9450600182166000811461439157600181146143a2576143d5565b60ff198316865281860193506143d5565b6143ab8561434a565b60005b838110156143cd578154818901526001820191506020810190506143ae565b838801955050505b50505092915050565b60006143ea8286614319565b91506143f68285614319565b9150614402828461435f565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061446b6026836131d5565b91506144768261440f565b604082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144d76020836131d5565b91506144e2826144a1565b602082019050919050565b60006020820190508181036000830152614506816144ca565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006145348261450d565b61453e8185614518565b935061454e8185602086016131e6565b61455781613219565b840191505092915050565b6000608082019050614577600083018761331a565b614584602083018661331a565b61459160408301856133dd565b81810360608301526145a38184614529565b905095945050505050565b6000815190506145bd8161313b565b92915050565b6000602082840312156145d9576145d8613105565b5b60006145e7848285016145ae565b91505092915050565b60006145fb82613285565b915061460683613285565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561463f5761463e613df7565b5b828202905092915050565b600061465582613285565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561468857614687613df7565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146cd82613285565b91506146d883613285565b9250826146e8576146e7614693565b5b828204905092915050565b60006146fe82613285565b915061470983613285565b92508261471957614718614693565b5b82820690509291505056fea2646970667358221220e18e13aae23dea0b4429f07f494f8805617989dbaf3d34967af835c451bfbd0d64736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d51414d3157664867544235697442565035624e41574c33315965747056734b525773466b625479706f4459470000000000000000000000
Deployed Bytecode
0x6080604052600436106102935760003560e01c806370a082311161015a578063a54ef38a116100c1578063c87b56dd1161007a578063c87b56dd146109f3578063d5abeb0114610a30578063e0a8085314610a5b578063e985e9c514610a84578063f2fde38b14610ac1578063f4010ea614610aea57610293565b8063a54ef38a146108f4578063b767a0981461091d578063b88d4fde14610946578063ba41b0c61461096f578063c1fad42c1461098b578063c23dc68f146109b657610293565b80638da5cb5b116101135780638da5cb5b146107e457806395d89b411461080f57806399a2557a1461083a5780639f15df1214610877578063a22cb465146108a0578063a45ba8e7146108c957610293565b806370a08231146106d6578063715018a6146107135780637b61c3201461072a5780637cb64759146107555780637ec4a6591461077e5780638462151c146107a757610293565b80633ccfd60b116101fe5780635bbb2177116101b75780635bbb2177146105b05780635c975abb146105ed57806362b99ad4146106185780636352211e146106435780636c02a931146106805780636caede3d146106ab57610293565b80633ccfd60b146104c857806342842e0e146104df57806344a0d68a146105085780634fdd43cb14610531578063518302271461055a5780635503a0e81461058557610293565b806316ba10e01161025057806316ba10e0146103ce57806316c38b3c146103f757806318160ddd1461042057806323b872dd1461044b578063271b2fcc146104745780632eb4a7ab1461049d57610293565b806301ffc9a71461029857806306fdde03146102d5578063081812fc14610300578063095ea7b31461033d5780631237e5e81461036657806313faede6146103a3575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190613167565b610b15565b6040516102cc91906131af565b60405180910390f35b3480156102e157600080fd5b506102ea610ba7565b6040516102f79190613263565b60405180910390f35b34801561030c57600080fd5b50610327600480360381019061032291906132bb565b610c39565b6040516103349190613329565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f9190613370565b610cb5565b005b34801561037257600080fd5b5061038d600480360381019061038891906133b0565b610df6565b60405161039a91906131af565b60405180910390f35b3480156103af57600080fd5b506103b8610e16565b6040516103c591906133ec565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f0919061353c565b610e1c565b005b34801561040357600080fd5b5061041e600480360381019061041991906135b1565b610e3e565b005b34801561042c57600080fd5b50610435610e63565b60405161044291906133ec565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d91906135de565b610e7a565b005b34801561048057600080fd5b5061049b600480360381019061049691906132bb565b61119f565b005b3480156104a957600080fd5b506104b26111d2565b6040516104bf919061364a565b60405180910390f35b3480156104d457600080fd5b506104dd6111d8565b005b3480156104eb57600080fd5b50610506600480360381019061050191906135de565b6112b6565b005b34801561051457600080fd5b5061052f600480360381019061052a91906132bb565b6112d6565b005b34801561053d57600080fd5b506105586004803603810190610553919061353c565b6112e8565b005b34801561056657600080fd5b5061056f61130a565b60405161057c91906131af565b60405180910390f35b34801561059157600080fd5b5061059a61131d565b6040516105a79190613263565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d2919061372d565b6113ab565b6040516105e491906138d9565b60405180910390f35b3480156105f957600080fd5b5061060261146c565b60405161060f91906131af565b60405180910390f35b34801561062457600080fd5b5061062d61147f565b60405161063a9190613263565b60405180910390f35b34801561064f57600080fd5b5061066a600480360381019061066591906132bb565b61150d565b6040516106779190613329565b60405180910390f35b34801561068c57600080fd5b5061069561151f565b6040516106a29190613263565b60405180910390f35b3480156106b757600080fd5b506106c06115ad565b6040516106cd91906131af565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f891906133b0565b6115c0565b60405161070a91906133ec565b60405180910390f35b34801561071f57600080fd5b50610728611679565b005b34801561073657600080fd5b5061073f61168d565b60405161074c9190613263565b60405180910390f35b34801561076157600080fd5b5061077c60048036038101906107779190613927565b61171b565b005b34801561078a57600080fd5b506107a560048036038101906107a0919061353c565b61172d565b005b3480156107b357600080fd5b506107ce60048036038101906107c991906133b0565b61174f565b6040516107db9190613a12565b60405180910390f35b3480156107f057600080fd5b506107f9611899565b6040516108069190613329565b60405180910390f35b34801561081b57600080fd5b506108246118c3565b6040516108319190613263565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c9190613a34565b611955565b60405161086e9190613a12565b60405180910390f35b34801561088357600080fd5b5061089e60048036038101906108999190613a87565b611b69565b005b3480156108ac57600080fd5b506108c760048036038101906108c29190613ac7565b611bd6565b005b3480156108d557600080fd5b506108de611d4e565b6040516108eb9190613263565b60405180910390f35b34801561090057600080fd5b5061091b600480360381019061091691906132bb565b611ddc565b005b34801561092957600080fd5b50610944600480360381019061093f91906135b1565b611dee565b005b34801561095257600080fd5b5061096d60048036038101906109689190613ba8565b611e13565b005b61098960048036038101906109849190613c86565b611e86565b005b34801561099757600080fd5b506109a06121be565b6040516109ad91906133ec565b60405180910390f35b3480156109c257600080fd5b506109dd60048036038101906109d891906132bb565b6121c4565b6040516109ea9190613d3b565b60405180910390f35b3480156109ff57600080fd5b50610a1a6004803603810190610a1591906132bb565b61222e565b604051610a279190613263565b60405180910390f35b348015610a3c57600080fd5b50610a45612387565b604051610a5291906133ec565b60405180910390f35b348015610a6757600080fd5b50610a826004803603810190610a7d91906135b1565b61238d565b005b348015610a9057600080fd5b50610aab6004803603810190610aa69190613d56565b6123b2565b604051610ab891906131af565b60405180910390f35b348015610acd57600080fd5b50610ae86004803603810190610ae391906133b0565b612446565b005b348015610af657600080fd5b50610aff6124ca565b604051610b0c91906133ec565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b7057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ba05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610bb690613dc5565b80601f0160208091040260200160405190810160405280929190818152602001828054610be290613dc5565b8015610c2f5780601f10610c0457610100808354040283529160200191610c2f565b820191906000526020600020905b815481529060010190602001808311610c1257829003601f168201915b5050505050905090565b6000610c44826124d0565b610c7a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc08261150d565b90508073ffffffffffffffffffffffffffffffffffffffff16610ce161252f565b73ffffffffffffffffffffffffffffffffffffffff1614610d4457610d0d81610d0861252f565b6123b2565b610d43576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60106020528060005260406000206000915054906101000a900460ff1681565b60155481565b610e24612537565b8060139080519060200190610e3a929190613009565b5050565b610e46612537565b80601160006101000a81548160ff02191690831515021790555050565b6000610e6d6125b5565b6001546000540303905090565b6000610e85826125be565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610eec576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ef88461268c565b91509150610f0e8187610f0961252f565b6126ae565b610f5a57610f2386610f1e61252f565b6123b2565b610f59576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610fc1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fce86868660016126f2565b8015610fd957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506110a7856110838888876126f8565b7c020000000000000000000000000000000000000000000000000000000017612720565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561112f57600060018501905060006004600083815260200190815260200160002054141561112d57600054811461112c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611197868686600161274b565b505050505050565b6111a7612537565b6111af610e63565b600c546111bc9190613e26565b8111156111c857600080fd5b80600d8190555050565b600f5481565b6111e0612537565b60026009541415611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d90613ea6565b60405180910390fd5b60026009819055506000611238611899565b73ffffffffffffffffffffffffffffffffffffffff164760405161125b90613ef7565b60006040518083038185875af1925050503d8060008114611298576040519150601f19603f3d011682016040523d82523d6000602084013e61129d565b606091505b50509050806112ab57600080fd5b506001600981905550565b6112d183838360405180602001604052806000815250611e13565b505050565b6112de612537565b8060158190555050565b6112f0612537565b8060149080519060200190611306929190613009565b5050565b601160029054906101000a900460ff1681565b6013805461132a90613dc5565b80601f016020809104026020016040519081016040528092919081815260200182805461135690613dc5565b80156113a35780601f10611378576101008083540402835291602001916113a3565b820191906000526020600020905b81548152906001019060200180831161138657829003601f168201915b505050505081565b606060008251905060008167ffffffffffffffff8111156113cf576113ce613411565b5b60405190808252806020026020018201604052801561140857816020015b6113f561308f565b8152602001906001900390816113ed5790505b50905060005b8281146114615761143885828151811061142b5761142a613f0c565b5b60200260200101516121c4565b82828151811061144b5761144a613f0c565b5b602002602001018190525080600101905061140e565b508092505050919050565b601160009054906101000a900460ff1681565b6012805461148c90613dc5565b80601f01602080910402602001604051908101604052809291908181526020018280546114b890613dc5565b80156115055780601f106114da57610100808354040283529160200191611505565b820191906000526020600020905b8154815290600101906020018083116114e857829003601f168201915b505050505081565b6000611518826125be565b9050919050565b600a805461152c90613dc5565b80601f016020809104026020016040519081016040528092919081815260200182805461155890613dc5565b80156115a55780601f1061157a576101008083540402835291602001916115a5565b820191906000526020600020905b81548152906001019060200180831161158857829003601f168201915b505050505081565b601160019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611628576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611681612537565b61168b6000612751565b565b600b805461169a90613dc5565b80601f01602080910402602001604051908101604052809291908181526020018280546116c690613dc5565b80156117135780601f106116e857610100808354040283529160200191611713565b820191906000526020600020905b8154815290600101906020018083116116f657829003601f168201915b505050505081565b611723612537565b80600f8190555050565b611735612537565b806012908051906020019061174b929190613009565b5050565b6060600080600061175f856115c0565b905060008167ffffffffffffffff81111561177d5761177c613411565b5b6040519080825280602002602001820160405280156117ab5781602001602082028036833780820191505090505b5090506117b661308f565b60006117c06125b5565b90505b83861461188b576117d381612817565b91508160400151156117e457611880565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461182457816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561187f578083878060010198508151811061187257611871613f0c565b5b6020026020010181815250505b5b8060010190506117c3565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546118d290613dc5565b80601f01602080910402602001604051908101604052809291908181526020018280546118fe90613dc5565b801561194b5780601f106119205761010080835404028352916020019161194b565b820191906000526020600020905b81548152906001019060200180831161192e57829003601f168201915b5050505050905090565b6060818310611990576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061199b612842565b90506119a56125b5565b8510156119b7576119b46125b5565b94505b808411156119c3578093505b60006119ce876115c0565b9050848610156119f15760008686039050818110156119eb578091505b506119f6565b600090505b60008167ffffffffffffffff811115611a1257611a11613411565b5b604051908082528060200260200182016040528015611a405781602001602082028036833780820191505090505b5090506000821415611a585780945050505050611b62565b6000611a63886121c4565b905060008160400151611a7857816000015190505b60008990505b888114158015611a8e5750848714155b15611b5457611a9c81612817565b9250826040015115611aad57611b49565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611aed57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b485780848880600101995081518110611b3b57611b3a613f0c565b5b6020026020010181815250505b5b806001019050611a7e565b508583528296505050505050505b9392505050565b611b71612537565b600c5482611b7d610e63565b611b879190613f3b565b1115611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf90613fdd565b60405180910390fd5b611bd2818361284b565b5050565b611bde61252f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c43576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611c5061252f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cfd61252f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d4291906131af565b60405180910390a35050565b60148054611d5b90613dc5565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8790613dc5565b8015611dd45780601f10611da957610100808354040283529160200191611dd4565b820191906000526020600020905b815481529060010190602001808311611db757829003601f168201915b505050505081565b611de4612537565b80600e8190555050565b611df6612537565b80601160016101000a81548160ff02191690831515021790555050565b611e1e848484610e7a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e8057611e4984848484612869565b611e7f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b82611e90816129c9565b341015611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec990614049565b60405180910390fd5b60011515601160019054906101000a900460ff1615151415611faf576000611ef86129ff565b604051602001611f0891906140b1565b604051602081830303815290604052805190602001209050611f6e848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f5483612a07565b611fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa490614118565b60405180910390fd5b505b601160009054906101000a900460ff1615611fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff690614184565b60405180910390fd5b6000841180156120115750600e548411155b612050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612047906141f0565b60405180910390fd5b600d54600c546120609190613e26565b84612069610e63565b6120739190613f3b565b11156120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab90613fdd565b60405180910390fd5b601060006120c06129ff565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213f9061425c565b60405180910390fd5b6001601060006121566129ff565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506121b86121b26129ff565b8561284b565b50505050565b600d5481565b6121cc61308f565b6121d461308f565b6121dc6125b5565b8310806121f057506121ec612842565b8310155b156121fe5780915050612229565b61220783612817565b905080604001511561221c5780915050612229565b61222583612a1e565b9150505b919050565b6060612239826124d0565b612278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226f906142ee565b60405180910390fd5b60001515601160029054906101000a900460ff161515141561232657601480546122a190613dc5565b80601f01602080910402602001604051908101604052809291908181526020018280546122cd90613dc5565b801561231a5780601f106122ef5761010080835404028352916020019161231a565b820191906000526020600020905b8154815290600101906020018083116122fd57829003601f168201915b50505050509050612382565b6000612330612a3e565b90506000815111612350576040518060200160405280600081525061237e565b8061235a84612ad0565b601360405160200161236e939291906143de565b6040516020818303038152906040525b9150505b919050565b600c5481565b612395612537565b80601160026101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61244e612537565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b590614481565b60405180910390fd5b6124c781612751565b50565b600e5481565b6000816124db6125b5565b111580156124ea575060005482105b8015612528575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b61253f6129ff565b73ffffffffffffffffffffffffffffffffffffffff1661255d611899565b73ffffffffffffffffffffffffffffffffffffffff16146125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa906144ed565b60405180910390fd5b565b60006001905090565b600080829050806125cd6125b5565b11612655576000548110156126545760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612652575b600081141561264857600460008360019003935083815260200190815260200160002054905061261d565b8092505050612687565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861270f868684612c31565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61281f61308f565b61283b6004600084815260200190815260200160002054612c3a565b9050919050565b60008054905090565b612865828260405180602001604052806000815250612cf0565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261288f61252f565b8786866040518563ffffffff1660e01b81526004016128b19493929190614562565b602060405180830381600087803b1580156128cb57600080fd5b505af19250505080156128fc57506040513d601f19601f820116820180604052508101906128f991906145c3565b60015b612976573d806000811461292c576040519150601f19603f3d011682016040523d82523d6000602084013e612931565b606091505b5060008151141561296e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600060018214156129dd57600090506129fa565b6001826129ea9190613e26565b6015546129f791906145f0565b90505b919050565b600033905090565b600082612a148584612d8d565b1490509392505050565b612a2661308f565b612a37612a32836125be565b612c3a565b9050919050565b606060128054612a4d90613dc5565b80601f0160208091040260200160405190810160405280929190818152602001828054612a7990613dc5565b8015612ac65780601f10612a9b57610100808354040283529160200191612ac6565b820191906000526020600020905b815481529060010190602001808311612aa957829003601f168201915b5050505050905090565b60606000821415612b18576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c2c565b600082905060005b60008214612b4a578080612b339061464a565b915050600a82612b4391906146c2565b9150612b20565b60008167ffffffffffffffff811115612b6657612b65613411565b5b6040519080825280601f01601f191660200182016040528015612b985781602001600182028036833780820191505090505b5090505b60008514612c2557600182612bb19190613e26565b9150600a85612bc091906146f3565b6030612bcc9190613f3b565b60f81b818381518110612be257612be1613f0c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c1e91906146c2565b9450612b9c565b8093505050505b919050565b60009392505050565b612c4261308f565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b612cfa8383612de3565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612d8857600080549050600083820390505b612d3a6000868380600101945086612869565b612d70576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612d27578160005414612d8557600080fd5b50505b505050565b60008082905060005b8451811015612dd857612dc382868381518110612db657612db5613f0c565b5b6020026020010151612fb7565b91508080612dd09061464a565b915050612d96565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e50576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612e8b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e9860008483856126f2565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612f0f83612f0060008660006126f8565b612f0985612fe2565b17612720565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612f3357806000819055505050612fb2600084838561274b565b505050565b6000818310612fcf57612fca8284612ff2565b612fda565b612fd98383612ff2565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b82805461301590613dc5565b90600052602060002090601f016020900481019282613037576000855561307e565b82601f1061305057805160ff191683800117855561307e565b8280016001018555821561307e579182015b8281111561307d578251825591602001919060010190613062565b5b50905061308b91906130de565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b808211156130f75760008160009055506001016130df565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131448161310f565b811461314f57600080fd5b50565b6000813590506131618161313b565b92915050565b60006020828403121561317d5761317c613105565b5b600061318b84828501613152565b91505092915050565b60008115159050919050565b6131a981613194565b82525050565b60006020820190506131c460008301846131a0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132045780820151818401526020810190506131e9565b83811115613213576000848401525b50505050565b6000601f19601f8301169050919050565b6000613235826131ca565b61323f81856131d5565b935061324f8185602086016131e6565b61325881613219565b840191505092915050565b6000602082019050818103600083015261327d818461322a565b905092915050565b6000819050919050565b61329881613285565b81146132a357600080fd5b50565b6000813590506132b58161328f565b92915050565b6000602082840312156132d1576132d0613105565b5b60006132df848285016132a6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613313826132e8565b9050919050565b61332381613308565b82525050565b600060208201905061333e600083018461331a565b92915050565b61334d81613308565b811461335857600080fd5b50565b60008135905061336a81613344565b92915050565b6000806040838503121561338757613386613105565b5b60006133958582860161335b565b92505060206133a6858286016132a6565b9150509250929050565b6000602082840312156133c6576133c5613105565b5b60006133d48482850161335b565b91505092915050565b6133e681613285565b82525050565b600060208201905061340160008301846133dd565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61344982613219565b810181811067ffffffffffffffff8211171561346857613467613411565b5b80604052505050565b600061347b6130fb565b90506134878282613440565b919050565b600067ffffffffffffffff8211156134a7576134a6613411565b5b6134b082613219565b9050602081019050919050565b82818337600083830152505050565b60006134df6134da8461348c565b613471565b9050828152602081018484840111156134fb576134fa61340c565b5b6135068482856134bd565b509392505050565b600082601f83011261352357613522613407565b5b81356135338482602086016134cc565b91505092915050565b60006020828403121561355257613551613105565b5b600082013567ffffffffffffffff8111156135705761356f61310a565b5b61357c8482850161350e565b91505092915050565b61358e81613194565b811461359957600080fd5b50565b6000813590506135ab81613585565b92915050565b6000602082840312156135c7576135c6613105565b5b60006135d58482850161359c565b91505092915050565b6000806000606084860312156135f7576135f6613105565b5b60006136058682870161335b565b93505060206136168682870161335b565b9250506040613627868287016132a6565b9150509250925092565b6000819050919050565b61364481613631565b82525050565b600060208201905061365f600083018461363b565b92915050565b600067ffffffffffffffff8211156136805761367f613411565b5b602082029050602081019050919050565b600080fd5b60006136a96136a484613665565b613471565b905080838252602082019050602084028301858111156136cc576136cb613691565b5b835b818110156136f557806136e188826132a6565b8452602084019350506020810190506136ce565b5050509392505050565b600082601f83011261371457613713613407565b5b8135613724848260208601613696565b91505092915050565b60006020828403121561374357613742613105565b5b600082013567ffffffffffffffff8111156137615761376061310a565b5b61376d848285016136ff565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137ab81613308565b82525050565b600067ffffffffffffffff82169050919050565b6137ce816137b1565b82525050565b6137dd81613194565b82525050565b600062ffffff82169050919050565b6137fb816137e3565b82525050565b60808201600082015161381760008501826137a2565b50602082015161382a60208501826137c5565b50604082015161383d60408501826137d4565b50606082015161385060608501826137f2565b50505050565b60006138628383613801565b60808301905092915050565b6000602082019050919050565b600061388682613776565b6138908185613781565b935061389b83613792565b8060005b838110156138cc5781516138b38882613856565b97506138be8361386e565b92505060018101905061389f565b5085935050505092915050565b600060208201905081810360008301526138f3818461387b565b905092915050565b61390481613631565b811461390f57600080fd5b50565b600081359050613921816138fb565b92915050565b60006020828403121561393d5761393c613105565b5b600061394b84828501613912565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61398981613285565b82525050565b600061399b8383613980565b60208301905092915050565b6000602082019050919050565b60006139bf82613954565b6139c9818561395f565b93506139d483613970565b8060005b83811015613a055781516139ec888261398f565b97506139f7836139a7565b9250506001810190506139d8565b5085935050505092915050565b60006020820190508181036000830152613a2c81846139b4565b905092915050565b600080600060608486031215613a4d57613a4c613105565b5b6000613a5b8682870161335b565b9350506020613a6c868287016132a6565b9250506040613a7d868287016132a6565b9150509250925092565b60008060408385031215613a9e57613a9d613105565b5b6000613aac858286016132a6565b9250506020613abd8582860161335b565b9150509250929050565b60008060408385031215613ade57613add613105565b5b6000613aec8582860161335b565b9250506020613afd8582860161359c565b9150509250929050565b600067ffffffffffffffff821115613b2257613b21613411565b5b613b2b82613219565b9050602081019050919050565b6000613b4b613b4684613b07565b613471565b905082815260208101848484011115613b6757613b6661340c565b5b613b728482856134bd565b509392505050565b600082601f830112613b8f57613b8e613407565b5b8135613b9f848260208601613b38565b91505092915050565b60008060008060808587031215613bc257613bc1613105565b5b6000613bd08782880161335b565b9450506020613be18782880161335b565b9350506040613bf2878288016132a6565b925050606085013567ffffffffffffffff811115613c1357613c1261310a565b5b613c1f87828801613b7a565b91505092959194509250565b600080fd5b60008083601f840112613c4657613c45613407565b5b8235905067ffffffffffffffff811115613c6357613c62613c2b565b5b602083019150836020820283011115613c7f57613c7e613691565b5b9250929050565b600080600060408486031215613c9f57613c9e613105565b5b6000613cad868287016132a6565b935050602084013567ffffffffffffffff811115613cce57613ccd61310a565b5b613cda86828701613c30565b92509250509250925092565b608082016000820151613cfc60008501826137a2565b506020820151613d0f60208501826137c5565b506040820151613d2260408501826137d4565b506060820151613d3560608501826137f2565b50505050565b6000608082019050613d506000830184613ce6565b92915050565b60008060408385031215613d6d57613d6c613105565b5b6000613d7b8582860161335b565b9250506020613d8c8582860161335b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ddd57607f821691505b60208210811415613df157613df0613d96565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e3182613285565b9150613e3c83613285565b925082821015613e4f57613e4e613df7565b5b828203905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613e90601f836131d5565b9150613e9b82613e5a565b602082019050919050565b60006020820190508181036000830152613ebf81613e83565b9050919050565b600081905092915050565b50565b6000613ee1600083613ec6565b9150613eec82613ed1565b600082019050919050565b6000613f0282613ed4565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613f4682613285565b9150613f5183613285565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f8657613f85613df7565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613fc76014836131d5565b9150613fd282613f91565b602082019050919050565b60006020820190508181036000830152613ff681613fba565b9050919050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006140336013836131d5565b915061403e82613ffd565b602082019050919050565b6000602082019050818103600083015261406281614026565b9050919050565b60008160601b9050919050565b600061408182614069565b9050919050565b600061409382614076565b9050919050565b6140ab6140a682613308565b614088565b82525050565b60006140bd828461409a565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614102600e836131d5565b915061410d826140cc565b602082019050919050565b60006020820190508181036000830152614131816140f5565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b600061416e6017836131d5565b915061417982614138565b602082019050919050565b6000602082019050818103600083015261419d81614161565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006141da6014836131d5565b91506141e5826141a4565b602082019050919050565b60006020820190508181036000830152614209816141cd565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b60006142466018836131d5565b915061425182614210565b602082019050919050565b6000602082019050818103600083015261427581614239565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142d8602f836131d5565b91506142e38261427c565b604082019050919050565b60006020820190508181036000830152614307816142cb565b9050919050565b600081905092915050565b6000614324826131ca565b61432e818561430e565b935061433e8185602086016131e6565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461436c81613dc5565b614376818661430e565b9450600182166000811461439157600181146143a2576143d5565b60ff198316865281860193506143d5565b6143ab8561434a565b60005b838110156143cd578154818901526001820191506020810190506143ae565b838801955050505b50505092915050565b60006143ea8286614319565b91506143f68285614319565b9150614402828461435f565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061446b6026836131d5565b91506144768261440f565b604082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144d76020836131d5565b91506144e2826144a1565b602082019050919050565b60006020820190508181036000830152614506816144ca565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006145348261450d565b61453e8185614518565b935061454e8185602086016131e6565b61455781613219565b840191505092915050565b6000608082019050614577600083018761331a565b614584602083018661331a565b61459160408301856133dd565b81810360608301526145a38184614529565b905095945050505050565b6000815190506145bd8161313b565b92915050565b6000602082840312156145d9576145d8613105565b5b60006145e7848285016145ae565b91505092915050565b60006145fb82613285565b915061460683613285565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561463f5761463e613df7565b5b828202905092915050565b600061465582613285565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561468857614687613df7565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146cd82613285565b91506146d883613285565b9250826146e8576146e7614693565b5b828204905092915050565b60006146fe82613285565b915061470983613285565b92508261471957614718614693565b5b82820690509291505056fea2646970667358221220e18e13aae23dea0b4429f07f494f8805617989dbaf3d34967af835c451bfbd0d64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d51414d3157664867544235697442565035624e41574c33315965747056734b525773466b625479706f4459470000000000000000000000
-----Decoded View---------------
Arg [0] : _hiddenMetadataUri (string): ipfs://QmQAM1WfHgTB5itBVP5bNAWL31YetpVsKRWsFkbTypoDYG
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [2] : 697066733a2f2f516d51414d3157664867544235697442565035624e41574c33
Arg [3] : 315965747056734b525773466b625479706f4459470000000000000000000000
Deployed Bytecode Sourcemap
364:3931:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5653:607:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11161:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13048:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12611:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;694:43:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;959:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3406:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2615:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4736:309:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22055:2739;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2853:197:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;665:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3742:145;;;;;;;;;;;;;:::i;:::-;;13912:179:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2777:72:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3170:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;816:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;881:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1655:459:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;743:26:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;849:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10957:142:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;466:41:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;773:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6319:221:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;511:37:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3508:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3304:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5373:871:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1201:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11323:102:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2490:2446:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1974:200:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13315:303:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;918:36:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3054:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3608:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14157:388:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1276:694:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;587:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1092:410:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2178:434:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;552:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2694:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13684:162:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;628:33:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5653:607:6;5738:4;6048:10;6033:25;;:11;:25;;;;:101;;;;6124:10;6109:25;;:11;:25;;;;6033:101;:177;;;;6200:10;6185:25;;:11;:25;;;;6033:177;6014:196;;5653:607;;;:::o;11161:98::-;11215:13;11247:5;11240:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11161:98;:::o;13048:200::-;13116:7;13140:16;13148:7;13140;:16::i;:::-;13135:64;;13165:34;;;;;;;;;;;;;;13135:64;13217:15;:24;13233:7;13217:24;;;;;;;;;;;;;;;;;;;;;13210:31;;13048:200;;;:::o;12611:376::-;12683:13;12699:16;12707:7;12699;:16::i;:::-;12683:32;;12753:5;12730:28;;:19;:17;:19::i;:::-;:28;;;12726:172;;12777:44;12794:5;12801:19;:17;:19::i;:::-;12777:16;:44::i;:::-;12772:126;;12848:35;;;;;;;;;;;;;;12772:126;12726:172;12935:2;12908:15;:24;12924:7;12908:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12972:7;12968:2;12952:28;;12961:5;12952:28;;;;;;;;;;;;12673:314;12611:376;;:::o;694:43:5:-;;;;;;;;;;;;;;;;;;;;;;:::o;959:35::-;;;;:::o;3406:98::-;1094:13:0;:11;:13::i;:::-;3489:10:5::1;3477:9;:22;;;;;;;;;;;;:::i;:::-;;3406:98:::0;:::o;2615:75::-;1094:13:0;:11;:13::i;:::-;2679:6:5::1;2670;;:15;;;;;;;;;;;;;;;;;;2615:75:::0;:::o;4736:309:6:-;4789:7;5013:15;:13;:15::i;:::-;4998:12;;4982:13;;:28;:46;4975:53;;4736:309;:::o;22055:2739::-;22184:27;22214;22233:7;22214:18;:27::i;:::-;22184:57;;22297:4;22256:45;;22272:19;22256:45;;;22252:86;;22310:28;;;;;;;;;;;;;;22252:86;22350:27;22379:23;22406:28;22426:7;22406:19;:28::i;:::-;22349:85;;;;22531:62;22550:15;22567:4;22573:19;:17;:19::i;:::-;22531:18;:62::i;:::-;22526:173;;22612:43;22629:4;22635:19;:17;:19::i;:::-;22612:16;:43::i;:::-;22607:92;;22664:35;;;;;;;;;;;;;;22607:92;22526:173;22728:1;22714:16;;:2;:16;;;22710:52;;;22739:23;;;;;;;;;;;;;;22710:52;22773:43;22795:4;22801:2;22805:7;22814:1;22773:21;:43::i;:::-;22905:15;22902:157;;;23043:1;23022:19;23015:30;22902:157;23429:18;:24;23448:4;23429:24;;;;;;;;;;;;;;;;23427:26;;;;;;;;;;;;23497:18;:22;23516:2;23497:22;;;;;;;;;;;;;;;;23495:24;;;;;;;;;;;23812:142;23848:2;23895:45;23910:4;23916:2;23920:19;23895:14;:45::i;:::-;2046:8;23868:72;23812:18;:142::i;:::-;23783:17;:26;23801:7;23783:26;;;;;;;;;;;:171;;;;24121:1;2046:8;24071:19;:46;:51;24067:616;;;24142:19;24174:1;24164:7;:11;24142:33;;24329:1;24295:17;:30;24313:11;24295:30;;;;;;;;;;;;:35;24291:378;;;24431:13;;24416:11;:28;24412:239;;24609:19;24576:17;:30;24594:11;24576:30;;;;;;;;;;;:52;;;;24412:239;24291:378;24124:559;24067:616;24727:7;24723:2;24708:27;;24717:4;24708:27;;;;;;;;;;;;24745:42;24766:4;24772:2;24776:7;24785:1;24745:20;:42::i;:::-;22174:2620;;;22055:2739;;;:::o;2853:197:5:-;1094:13:0;:11;:13::i;:::-;2983::5::1;:11;:13::i;:::-;2971:9;;:25;;;;:::i;:::-;2945:21;:52;;2937:61;;;::::0;::::1;;3024:21;3004:17;:41;;;;2853:197:::0;:::o;665:25::-;;;;:::o;3742:145::-;1094:13:0;:11;:13::i;:::-;1744:1:1::1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;3798:7:5::2;3819;:5;:7::i;:::-;3811:21;;3840;3811:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3797:69;;;3879:2;3871:11;;;::::0;::::2;;3792:95;1701:1:1::1;2628:7;:22;;;;3742:145:5:o:0;13912:179:6:-;14045:39;14062:4;14068:2;14072:7;14045:39;;;;;;;;;;;;:16;:39::i;:::-;13912:179;;;:::o;2777:72:5:-;1094:13:0;:11;:13::i;:::-;2839:5:5::1;2832:4;:12;;;;2777:72:::0;:::o;3170:130::-;1094:13:0;:11;:13::i;:::-;3277:18:5::1;3257:17;:38;;;;;;;;;;;;:::i;:::-;;3170:130:::0;:::o;816:28::-;;;;;;;;;;;;;:::o;881:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1655:459:8:-;1744:23;1803:22;1828:8;:15;1803:40;;1857:34;1915:14;1894:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1857:73;;1949:9;1944:123;1965:14;1960:1;:19;1944:123;;2020:32;2040:8;2049:1;2040:11;;;;;;;;:::i;:::-;;;;;;;;2020:19;:32::i;:::-;2004:10;2015:1;2004:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;1981:3;;;;;1944:123;;;;2087:10;2080:17;;;;1655:459;;;:::o;743:26:5:-;;;;;;;;;;;;;:::o;849:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10957:142:6:-;11021:7;11063:27;11082:7;11063:18;:27::i;:::-;11040:52;;10957:142;;;:::o;466:41:5:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;773:39::-;;;;;;;;;;;;;:::o;6319:221:6:-;6383:7;6423:1;6406:19;;:5;:19;;;6402:60;;;6434:28;;;;;;;;;;;;;;6402:60;1022:13;6479:18;:25;6498:5;6479:25;;;;;;;;;;;;;;;;:54;6472:61;;6319:221;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;511:37:5:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3508:96::-;1094:13:0;:11;:13::i;:::-;3588:11:5::1;3575:10;:24;;;;3508:96:::0;:::o;3304:98::-;1094:13:0;:11;:13::i;:::-;3387:10:5::1;3375:9;:22;;;;;;;;;;;;:::i;:::-;;3304:98:::0;:::o;5373:871:8:-;5443:16;5495:19;5528:25;5567:22;5592:16;5602:5;5592:9;:16::i;:::-;5567:41;;5622:25;5664:14;5650:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5622:57;;5693:31;;:::i;:::-;5743:9;5755:15;:13;:15::i;:::-;5743:27;;5738:461;5787:14;5772:11;:29;5738:461;;5838:15;5851:1;5838:12;:15::i;:::-;5826:27;;5875:9;:16;;;5871:71;;;5915:8;;5871:71;5989:1;5963:28;;:9;:14;;;:28;;;5959:109;;6035:9;:14;;;6015:34;;5959:109;6110:5;6089:26;;:17;:26;;;6085:100;;;6165:1;6139:8;6148:13;;;;;;6139:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;6085:100;5738:461;5803:3;;;;;5738:461;;;;6219:8;6212:15;;;;;;;5373:871;;;:::o;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;11323:102:6:-;11379:13;11411:7;11404:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11323:102;:::o;2490:2446:8:-;2621:16;2686:4;2677:5;:13;2673:45;;2699:19;;;;;;;;;;;;;;2673:45;2732:19;2765:17;2785:14;:12;:14::i;:::-;2765:34;;2883:15;:13;:15::i;:::-;2875:5;:23;2871:85;;;2926:15;:13;:15::i;:::-;2918:23;;2871:85;3030:9;3023:4;:16;3019:71;;;3066:9;3059:16;;3019:71;3103:25;3131:16;3141:5;3131:9;:16::i;:::-;3103:44;;3322:4;3314:5;:12;3310:271;;;3346:19;3375:5;3368:4;:12;3346:34;;3416:17;3402:11;:31;3398:109;;;3477:11;3457:31;;3398:109;3328:193;3310:271;;;3565:1;3545:21;;3310:271;3594:25;3636:17;3622:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3594:60;;3693:1;3672:17;:22;3668:76;;;3721:8;3714:15;;;;;;;;3668:76;3885:31;3919:26;3939:5;3919:19;:26::i;:::-;3885:60;;3959:25;4201:9;:16;;;4196:90;;4257:9;:14;;;4237:34;;4196:90;4304:9;4316:5;4304:17;;4299:467;4328:4;4323:1;:9;;:45;;;;;4351:17;4336:11;:32;;4323:45;4299:467;;;4405:15;4418:1;4405:12;:15::i;:::-;4393:27;;4442:9;:16;;;4438:71;;;4482:8;;4438:71;4556:1;4530:28;;:9;:14;;;:28;;;4526:109;;4602:9;:14;;;4582:34;;4526:109;4677:5;4656:26;;:17;:26;;;4652:100;;;4732:1;4706:8;4715:13;;;;;;4706:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;4652:100;4299:467;4370:3;;;;;4299:467;;;;4865:11;4855:8;4848:29;4911:8;4904:15;;;;;;;;2490:2446;;;;;;:::o;1974:200:5:-;1094:13:0;:11;:13::i;:::-;2095:9:5::1;;2079:11;2063:13;:11;:13::i;:::-;:27;;;;:::i;:::-;2062:42;;2054:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2136:33;2146:9;2157:11;2136:9;:33::i;:::-;1974:200:::0;;:::o;13315:303:6:-;13425:19;:17;:19::i;:::-;13413:31;;:8;:31;;;13409:61;;;13453:17;;;;;;;;;;;;;;13409:61;13533:8;13481:18;:39;13500:19;:17;:19::i;:::-;13481:39;;;;;;;;;;;;;;;:49;13521:8;13481:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;13592:8;13556:55;;13571:19;:17;:19::i;:::-;13556:55;;;13602:8;13556:55;;;;;;:::i;:::-;;;;;;;;13315:303;;:::o;918:36:5:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3054:112::-;1094:13:0;:11;:13::i;:::-;3146:15:5::1;3129:14;:32;;;;3054:112:::0;:::o;3608:103::-;1094:13:0;:11;:13::i;:::-;3700:6:5::1;3677:20;;:29;;;;;;;;;;;;;;;;;;3608:103:::0;:::o;14157:388:6:-;14318:31;14331:4;14337:2;14341:7;14318:12;:31::i;:::-;14381:1;14363:2;:14;;;:19;14359:180;;14401:56;14432:4;14438:2;14442:7;14451:5;14401:30;:56::i;:::-;14396:143;;14484:40;;;;;;;;;;;;;;14396:143;14359:180;14157:388;;;;:::o;1276:694:5:-;1379:11;1209:27;1224:11;1209:14;:27::i;:::-;1196:9;:40;;1188:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;1424:4:::1;1400:28;;:20;;;;;;;;;;;:28;;;1396:186;;;1434:12;1476;:10;:12::i;:::-;1459:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;1449:41;;;;;;1434:56;;1506:50;1525:12;;1506:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1539:10;;1551:4;1506:18;:50::i;:::-;1498:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;1429:153;1396:186;1597:6;;;;;;;;;;;1596:7;1588:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;1657:1;1643:11;:15;:48;;;;;1677:14;;1662:11;:29;;1643:48;1635:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;1774:17;;1762:9;;:29;;;;:::i;:::-;1746:11;1730:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:62;;1722:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1830:11;:25;1842:12;:10;:12::i;:::-;1830:25;;;;;;;;;;;;;;;;;;;;;;;;;1829:26;1821:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1919:4;1891:11;:25;1903:12;:10;:12::i;:::-;1891:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;1929:36;1939:12;:10;:12::i;:::-;1953:11;1929:9;:36::i;:::-;1276:694:::0;;;;:::o;587:36::-;;;;:::o;1092:410:8:-;1168:21;;:::i;:::-;1201:31;;:::i;:::-;1256:15;:13;:15::i;:::-;1246:7;:25;:54;;;;1286:14;:12;:14::i;:::-;1275:7;:25;;1246:54;1242:101;;;1323:9;1316:16;;;;;1242:101;1364:21;1377:7;1364:12;:21::i;:::-;1352:33;;1399:9;:16;;;1395:63;;;1438:9;1431:16;;;;;1395:63;1474:21;1487:7;1474:12;:21::i;:::-;1467:28;;;1092:410;;;;:::o;2178:434:5:-;2252:13;2281:17;2289:8;2281:7;:17::i;:::-;2273:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;2373:5;2361:17;;:8;;;;;;;;;;;:17;;;2357:62;;;2395:17;2388:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2357:62;2425:28;2456:10;:8;:10::i;:::-;2425:41;;2510:1;2485:14;2479:28;:32;:128;;;;;;;;;;;;;;;;;2546:14;2562:19;:8;:17;:19::i;:::-;2583:9;2529:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2479:128;2472:135;;;2178:434;;;;:::o;552:31::-;;;;:::o;2694:79::-;1094:13:0;:11;:13::i;:::-;2762:6:5::1;2751:8;;:17;;;;;;;;;;;;;;;;;;2694:79:::0;:::o;13684:162:6:-;13781:4;13804:18;:25;13823:5;13804:25;;;;;;;;;;;;;;;:35;13830:8;13804:35;;;;;;;;;;;;;;;;;;;;;;;;;13797:42;;13684:162;;;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;;;2161:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;628:33:5:-;;;;:::o;14791:268:6:-;14848:4;14902:7;14883:15;:13;:15::i;:::-;:26;;:65;;;;;14935:13;;14925:7;:23;14883:65;:150;;;;;15032:1;1774:8;14985:17;:26;15003:7;14985:26;;;;;;;;;;;;:43;:48;14883:150;14864:169;;14791:268;;;:::o;32874:103::-;32934:7;32960:10;32953:17;;32874:103;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;3908:93:5:-;3973:7;3995:1;3988:8;;3908:93;:::o;7949:1105:6:-;8016:7;8035:12;8050:7;8035:22;;8115:4;8096:15;:13;:15::i;:::-;:23;8092:898;;8148:13;;8141:4;:20;8137:853;;;8185:14;8202:17;:23;8220:4;8202:23;;;;;;;;;;;;8185:40;;8316:1;1774:8;8289:6;:23;:28;8285:687;;;8800:111;8817:1;8807:6;:11;8800:111;;;8859:17;:25;8877:6;;;;;;;8859:25;;;;;;;;;;;;8850:34;;8800:111;;;8943:6;8936:13;;;;;;8285:687;8163:827;8137:853;8092:898;9016:31;;;;;;;;;;;;;;7949:1105;;;;:::o;20436:637::-;20528:27;20557:23;20596:53;20652:15;20596:71;;20834:7;20828:4;20821:21;20868:22;20862:4;20855:36;20943:4;20937;20927:21;20904:44;;21037:19;21031:26;21012:45;;20774:293;20436:637;;;:::o;21181:632::-;21319:11;21478:15;21472:4;21468:26;21460:34;;21635:15;21624:9;21620:31;21607:44;;21780:15;21769:9;21766:30;21759:4;21748:9;21745:19;21742:55;21732:65;;21181:632;;;;;:::o;31742:154::-;;;;;:::o;30099:302::-;30230:7;30249:16;2166:3;30275:19;:40;;30249:67;;2166:3;30341:31;30352:4;30358:2;30362:9;30341:10;:31::i;:::-;30333:40;;:61;;30326:68;;;30099:302;;;;;:::o;10460:440::-;10540:14;10705:15;10698:5;10694:27;10685:36;;10877:5;10863:11;10839:22;10835:40;10832:51;10825:5;10822:62;10812:72;;10460:440;;;;:::o;32537:153::-;;;;;:::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;9587:151:6:-;9647:21;;:::i;:::-;9687:44;9706:17;:24;9724:5;9706:24;;;;;;;;;;;;9687:18;:44::i;:::-;9680:51;;9587:151;;;:::o;4440:93::-;4487:7;4513:13;;4506:20;;4440:93;:::o;15138:102::-;15206:27;15216:2;15220:8;15206:27;;;;;;;;;;;;:9;:27::i;:::-;15138:102;;:::o;28649:697::-;28807:4;28852:2;28827:45;;;28873:19;:17;:19::i;:::-;28894:4;28900:7;28909:5;28827:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;28823:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29122:1;29105:6;:13;:18;29101:229;;;29150:40;;;;;;;;;;;;;;29101:229;29290:6;29284:13;29275:6;29271:2;29267:15;29260:38;28823:517;28993:54;;;28983:64;;;:6;:64;;;;28976:71;;;28649:697;;;;;;:::o;4005:182:5:-;4069:13;4105:1;4094:7;:12;4090:93;;;4122:7;4115:14;;;;4090:93;4174:1;4165:7;:10;;;;:::i;:::-;4157:4;;:19;;;;:::i;:::-;4150:26;;4005:182;;;;:::o;640:96:2:-;693:7;719:10;712:17;;640:96;:::o;1153:184:4:-;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;1290:40;;1153:184;;;;;:::o;10226:156:6:-;10288:21;;:::i;:::-;10328:47;10347:27;10366:7;10347:18;:27::i;:::-;10328:18;:47::i;:::-;10321:54;;10226:156;;;:::o;4191:102:5:-;4251:13;4279:9;4272:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4191:102;:::o;392:703:3:-;448:13;674:1;665:5;:10;661:51;;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;30961:143:6:-;31094:6;30961:143;;;;;:::o;9143:358::-;9209:31;;:::i;:::-;9285:6;9252:9;:14;;:41;;;;;;;;;;;1661:3;9337:6;:32;;9303:9;:24;;:67;;;;;;;;;;;9426:1;1774:8;9399:6;:23;:28;;9380:9;:16;;:47;;;;;;;;;;;2166:3;9466:6;:27;;9437:9;:19;;:57;;;;;;;;;;;9143:358;;;:::o;15641:661::-;15759:19;15765:2;15769:8;15759:5;:19::i;:::-;15835:1;15817:2;:14;;;:19;15813:473;;15856:11;15870:13;;15856:27;;15901:13;15923:8;15917:3;:14;15901:30;;15949:229;15979:62;16018:1;16022:2;16026:7;;;;;;16035:5;15979:30;:62::i;:::-;15974:165;;16076:40;;;;;;;;;;;;;;15974:165;16173:3;16165:5;:11;15949:229;;16258:3;16241:13;;:20;16237:34;;16263:8;;;16237:34;15838:448;;15813:473;15641:661;;;:::o;1991:290:4:-;2074:7;2093:20;2116:4;2093:27;;2135:9;2130:116;2154:5;:12;2150:1;:16;2130:116;;;2202:33;2212:12;2226:5;2232:1;2226:8;;;;;;;;:::i;:::-;;;;;;;;2202:9;:33::i;:::-;2187:48;;2168:3;;;;;:::i;:::-;;;;2130:116;;;;2262:12;2255:19;;;1991:290;;;;:::o;16563:1492:6:-;16627:20;16650:13;;16627:36;;16691:1;16677:16;;:2;:16;;;16673:48;;;16702:19;;;;;;;;;;;;;;16673:48;16747:1;16735:8;:13;16731:44;;;16757:18;;;;;;;;;;;;;;16731:44;16786:61;16816:1;16820:2;16824:12;16838:8;16786:21;:61::i;:::-;17318:1;1156:2;17289:1;:25;;17288:31;17276:8;:44;17250:18;:22;17269:2;17250:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;17590:136;17626:2;17679:33;17702:1;17706:2;17710:1;17679:14;:33::i;:::-;17646:30;17667:8;17646:20;:30::i;:::-;:66;17590:18;:136::i;:::-;17556:17;:31;17574:12;17556:31;;;;;;;;;;;:170;;;;17741:15;17759:12;17741:30;;17785:11;17814:8;17799:12;:23;17785:37;;17836:99;17887:9;;;;;;17883:2;17862:35;;17879:1;17862:35;;;;;;;;;;;;17930:3;17920:7;:13;17836:99;;17965:3;17949:13;:19;;;;17030:949;;17988:60;18017:1;18021:2;18025:12;18039:8;17988:20;:60::i;:::-;16617:1438;16563:1492;;:::o;8054:147:4:-;8117:7;8147:1;8143;:5;:51;;8174:20;8189:1;8192;8174:14;:20::i;:::-;8143:51;;;8151:20;8166:1;8169;8151:14;:20::i;:::-;8143:51;8136:58;;8054:147;;;;:::o;12238:316:6:-;12308:14;12535:1;12525:8;12522:15;12497:23;12493:45;12483:55;;12238:316;;;:::o;8207:261:4:-;8275:13;8379:1;8373:4;8366:15;8407:1;8401:4;8394:15;8447:4;8441;8431:21;8422:30;;8207:261;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:10:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:329::-;4997:6;5046:2;5034:9;5025:7;5021:23;5017:32;5014:119;;;5052:79;;:::i;:::-;5014:119;5172:1;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5143:117;4938:329;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:117::-;5734:1;5731;5724:12;5748:117;5857:1;5854;5847:12;5871:180;5919:77;5916:1;5909:88;6016:4;6013:1;6006:15;6040:4;6037:1;6030:15;6057:281;6140:27;6162:4;6140:27;:::i;:::-;6132:6;6128:40;6270:6;6258:10;6255:22;6234:18;6222:10;6219:34;6216:62;6213:88;;;6281:18;;:::i;:::-;6213:88;6321:10;6317:2;6310:22;6100:238;6057:281;;:::o;6344:129::-;6378:6;6405:20;;:::i;:::-;6395:30;;6434:33;6462:4;6454:6;6434:33;:::i;:::-;6344:129;;;:::o;6479:308::-;6541:4;6631:18;6623:6;6620:30;6617:56;;;6653:18;;:::i;:::-;6617:56;6691:29;6713:6;6691:29;:::i;:::-;6683:37;;6775:4;6769;6765:15;6757:23;;6479:308;;;:::o;6793:154::-;6877:6;6872:3;6867;6854:30;6939:1;6930:6;6925:3;6921:16;6914:27;6793:154;;;:::o;6953:412::-;7031:5;7056:66;7072:49;7114:6;7072:49;:::i;:::-;7056:66;:::i;:::-;7047:75;;7145:6;7138:5;7131:21;7183:4;7176:5;7172:16;7221:3;7212:6;7207:3;7203:16;7200:25;7197:112;;;7228:79;;:::i;:::-;7197:112;7318:41;7352:6;7347:3;7342;7318:41;:::i;:::-;7037:328;6953:412;;;;;:::o;7385:340::-;7441:5;7490:3;7483:4;7475:6;7471:17;7467:27;7457:122;;7498:79;;:::i;:::-;7457:122;7615:6;7602:20;7640:79;7715:3;7707:6;7700:4;7692:6;7688:17;7640:79;:::i;:::-;7631:88;;7447:278;7385:340;;;;:::o;7731:509::-;7800:6;7849:2;7837:9;7828:7;7824:23;7820:32;7817:119;;;7855:79;;:::i;:::-;7817:119;8003:1;7992:9;7988:17;7975:31;8033:18;8025:6;8022:30;8019:117;;;8055:79;;:::i;:::-;8019:117;8160:63;8215:7;8206:6;8195:9;8191:22;8160:63;:::i;:::-;8150:73;;7946:287;7731:509;;;;:::o;8246:116::-;8316:21;8331:5;8316:21;:::i;:::-;8309:5;8306:32;8296:60;;8352:1;8349;8342:12;8296:60;8246:116;:::o;8368:133::-;8411:5;8449:6;8436:20;8427:29;;8465:30;8489:5;8465:30;:::i;:::-;8368:133;;;;:::o;8507:323::-;8563:6;8612:2;8600:9;8591:7;8587:23;8583:32;8580:119;;;8618:79;;:::i;:::-;8580:119;8738:1;8763:50;8805:7;8796:6;8785:9;8781:22;8763:50;:::i;:::-;8753:60;;8709:114;8507:323;;;;:::o;8836:619::-;8913:6;8921;8929;8978:2;8966:9;8957:7;8953:23;8949:32;8946:119;;;8984:79;;:::i;:::-;8946:119;9104:1;9129:53;9174:7;9165:6;9154:9;9150:22;9129:53;:::i;:::-;9119:63;;9075:117;9231:2;9257:53;9302:7;9293:6;9282:9;9278:22;9257:53;:::i;:::-;9247:63;;9202:118;9359:2;9385:53;9430:7;9421:6;9410:9;9406:22;9385:53;:::i;:::-;9375:63;;9330:118;8836:619;;;;;:::o;9461:77::-;9498:7;9527:5;9516:16;;9461:77;;;:::o;9544:118::-;9631:24;9649:5;9631:24;:::i;:::-;9626:3;9619:37;9544:118;;:::o;9668:222::-;9761:4;9799:2;9788:9;9784:18;9776:26;;9812:71;9880:1;9869:9;9865:17;9856:6;9812:71;:::i;:::-;9668:222;;;;:::o;9896:311::-;9973:4;10063:18;10055:6;10052:30;10049:56;;;10085:18;;:::i;:::-;10049:56;10135:4;10127:6;10123:17;10115:25;;10195:4;10189;10185:15;10177:23;;9896:311;;;:::o;10213:117::-;10322:1;10319;10312:12;10353:710;10449:5;10474:81;10490:64;10547:6;10490:64;:::i;:::-;10474:81;:::i;:::-;10465:90;;10575:5;10604:6;10597:5;10590:21;10638:4;10631:5;10627:16;10620:23;;10691:4;10683:6;10679:17;10671:6;10667:30;10720:3;10712:6;10709:15;10706:122;;;10739:79;;:::i;:::-;10706:122;10854:6;10837:220;10871:6;10866:3;10863:15;10837:220;;;10946:3;10975:37;11008:3;10996:10;10975:37;:::i;:::-;10970:3;10963:50;11042:4;11037:3;11033:14;11026:21;;10913:144;10897:4;10892:3;10888:14;10881:21;;10837:220;;;10841:21;10455:608;;10353:710;;;;;:::o;11086:370::-;11157:5;11206:3;11199:4;11191:6;11187:17;11183:27;11173:122;;11214:79;;:::i;:::-;11173:122;11331:6;11318:20;11356:94;11446:3;11438:6;11431:4;11423:6;11419:17;11356:94;:::i;:::-;11347:103;;11163:293;11086:370;;;;:::o;11462:539::-;11546:6;11595:2;11583:9;11574:7;11570:23;11566:32;11563:119;;;11601:79;;:::i;:::-;11563:119;11749:1;11738:9;11734:17;11721:31;11779:18;11771:6;11768:30;11765:117;;;11801:79;;:::i;:::-;11765:117;11906:78;11976:7;11967:6;11956:9;11952:22;11906:78;:::i;:::-;11896:88;;11692:302;11462:539;;;;:::o;12007:146::-;12106:6;12140:5;12134:12;12124:22;;12007:146;;;:::o;12159:216::-;12290:11;12324:6;12319:3;12312:19;12364:4;12359:3;12355:14;12340:29;;12159:216;;;;:::o;12381:164::-;12480:4;12503:3;12495:11;;12533:4;12528:3;12524:14;12516:22;;12381:164;;;:::o;12551:108::-;12628:24;12646:5;12628:24;:::i;:::-;12623:3;12616:37;12551:108;;:::o;12665:101::-;12701:7;12741:18;12734:5;12730:30;12719:41;;12665:101;;;:::o;12772:105::-;12847:23;12864:5;12847:23;:::i;:::-;12842:3;12835:36;12772:105;;:::o;12883:99::-;12954:21;12969:5;12954:21;:::i;:::-;12949:3;12942:34;12883:99;;:::o;12988:91::-;13024:7;13064:8;13057:5;13053:20;13042:31;;12988:91;;;:::o;13085:105::-;13160:23;13177:5;13160:23;:::i;:::-;13155:3;13148:36;13085:105;;:::o;13268:866::-;13419:4;13414:3;13410:14;13506:4;13499:5;13495:16;13489:23;13525:63;13582:4;13577:3;13573:14;13559:12;13525:63;:::i;:::-;13434:164;13690:4;13683:5;13679:16;13673:23;13709:61;13764:4;13759:3;13755:14;13741:12;13709:61;:::i;:::-;13608:172;13864:4;13857:5;13853:16;13847:23;13883:57;13934:4;13929:3;13925:14;13911:12;13883:57;:::i;:::-;13790:160;14037:4;14030:5;14026:16;14020:23;14056:61;14111:4;14106:3;14102:14;14088:12;14056:61;:::i;:::-;13960:167;13388:746;13268:866;;:::o;14140:307::-;14273:10;14294:110;14400:3;14392:6;14294:110;:::i;:::-;14436:4;14431:3;14427:14;14413:28;;14140:307;;;;:::o;14453:145::-;14555:4;14587;14582:3;14578:14;14570:22;;14453:145;;;:::o;14680:988::-;14863:3;14892:86;14972:5;14892:86;:::i;:::-;14994:118;15105:6;15100:3;14994:118;:::i;:::-;14987:125;;15136:88;15218:5;15136:88;:::i;:::-;15247:7;15278:1;15263:380;15288:6;15285:1;15282:13;15263:380;;;15364:6;15358:13;15391:127;15514:3;15499:13;15391:127;:::i;:::-;15384:134;;15541:92;15626:6;15541:92;:::i;:::-;15531:102;;15323:320;15310:1;15307;15303:9;15298:14;;15263:380;;;15267:14;15659:3;15652:10;;14868:800;;;14680:988;;;;:::o;15674:501::-;15881:4;15919:2;15908:9;15904:18;15896:26;;15968:9;15962:4;15958:20;15954:1;15943:9;15939:17;15932:47;15996:172;16163:4;16154:6;15996:172;:::i;:::-;15988:180;;15674:501;;;;:::o;16181:122::-;16254:24;16272:5;16254:24;:::i;:::-;16247:5;16244:35;16234:63;;16293:1;16290;16283:12;16234:63;16181:122;:::o;16309:139::-;16355:5;16393:6;16380:20;16371:29;;16409:33;16436:5;16409:33;:::i;:::-;16309:139;;;;:::o;16454:329::-;16513:6;16562:2;16550:9;16541:7;16537:23;16533:32;16530:119;;;16568:79;;:::i;:::-;16530:119;16688:1;16713:53;16758:7;16749:6;16738:9;16734:22;16713:53;:::i;:::-;16703:63;;16659:117;16454:329;;;;:::o;16789:114::-;16856:6;16890:5;16884:12;16874:22;;16789:114;;;:::o;16909:184::-;17008:11;17042:6;17037:3;17030:19;17082:4;17077:3;17073:14;17058:29;;16909:184;;;;:::o;17099:132::-;17166:4;17189:3;17181:11;;17219:4;17214:3;17210:14;17202:22;;17099:132;;;:::o;17237:108::-;17314:24;17332:5;17314:24;:::i;:::-;17309:3;17302:37;17237:108;;:::o;17351:179::-;17420:10;17441:46;17483:3;17475:6;17441:46;:::i;:::-;17519:4;17514:3;17510:14;17496:28;;17351:179;;;;:::o;17536:113::-;17606:4;17638;17633:3;17629:14;17621:22;;17536:113;;;:::o;17685:732::-;17804:3;17833:54;17881:5;17833:54;:::i;:::-;17903:86;17982:6;17977:3;17903:86;:::i;:::-;17896:93;;18013:56;18063:5;18013:56;:::i;:::-;18092:7;18123:1;18108:284;18133:6;18130:1;18127:13;18108:284;;;18209:6;18203:13;18236:63;18295:3;18280:13;18236:63;:::i;:::-;18229:70;;18322:60;18375:6;18322:60;:::i;:::-;18312:70;;18168:224;18155:1;18152;18148:9;18143:14;;18108:284;;;18112:14;18408:3;18401:10;;17809:608;;;17685:732;;;;:::o;18423:373::-;18566:4;18604:2;18593:9;18589:18;18581:26;;18653:9;18647:4;18643:20;18639:1;18628:9;18624:17;18617:47;18681:108;18784:4;18775:6;18681:108;:::i;:::-;18673:116;;18423:373;;;;:::o;18802:619::-;18879:6;18887;18895;18944:2;18932:9;18923:7;18919:23;18915:32;18912:119;;;18950:79;;:::i;:::-;18912:119;19070:1;19095:53;19140:7;19131:6;19120:9;19116:22;19095:53;:::i;:::-;19085:63;;19041:117;19197:2;19223:53;19268:7;19259:6;19248:9;19244:22;19223:53;:::i;:::-;19213:63;;19168:118;19325:2;19351:53;19396:7;19387:6;19376:9;19372:22;19351:53;:::i;:::-;19341:63;;19296:118;18802:619;;;;;:::o;19427:474::-;19495:6;19503;19552:2;19540:9;19531:7;19527:23;19523:32;19520:119;;;19558:79;;:::i;:::-;19520:119;19678:1;19703:53;19748:7;19739:6;19728:9;19724:22;19703:53;:::i;:::-;19693:63;;19649:117;19805:2;19831:53;19876:7;19867:6;19856:9;19852:22;19831:53;:::i;:::-;19821:63;;19776:118;19427:474;;;;;:::o;19907:468::-;19972:6;19980;20029:2;20017:9;20008:7;20004:23;20000:32;19997:119;;;20035:79;;:::i;:::-;19997:119;20155:1;20180:53;20225:7;20216:6;20205:9;20201:22;20180:53;:::i;:::-;20170:63;;20126:117;20282:2;20308:50;20350:7;20341:6;20330:9;20326:22;20308:50;:::i;:::-;20298:60;;20253:115;19907:468;;;;;:::o;20381:307::-;20442:4;20532:18;20524:6;20521:30;20518:56;;;20554:18;;:::i;:::-;20518:56;20592:29;20614:6;20592:29;:::i;:::-;20584:37;;20676:4;20670;20666:15;20658:23;;20381:307;;;:::o;20694:410::-;20771:5;20796:65;20812:48;20853:6;20812:48;:::i;:::-;20796:65;:::i;:::-;20787:74;;20884:6;20877:5;20870:21;20922:4;20915:5;20911:16;20960:3;20951:6;20946:3;20942:16;20939:25;20936:112;;;20967:79;;:::i;:::-;20936:112;21057:41;21091:6;21086:3;21081;21057:41;:::i;:::-;20777:327;20694:410;;;;;:::o;21123:338::-;21178:5;21227:3;21220:4;21212:6;21208:17;21204:27;21194:122;;21235:79;;:::i;:::-;21194:122;21352:6;21339:20;21377:78;21451:3;21443:6;21436:4;21428:6;21424:17;21377:78;:::i;:::-;21368:87;;21184:277;21123:338;;;;:::o;21467:943::-;21562:6;21570;21578;21586;21635:3;21623:9;21614:7;21610:23;21606:33;21603:120;;;21642:79;;:::i;:::-;21603:120;21762:1;21787:53;21832:7;21823:6;21812:9;21808:22;21787:53;:::i;:::-;21777:63;;21733:117;21889:2;21915:53;21960:7;21951:6;21940:9;21936:22;21915:53;:::i;:::-;21905:63;;21860:118;22017:2;22043:53;22088:7;22079:6;22068:9;22064:22;22043:53;:::i;:::-;22033:63;;21988:118;22173:2;22162:9;22158:18;22145:32;22204:18;22196:6;22193:30;22190:117;;;22226:79;;:::i;:::-;22190:117;22331:62;22385:7;22376:6;22365:9;22361:22;22331:62;:::i;:::-;22321:72;;22116:287;21467:943;;;;;;;:::o;22416:117::-;22525:1;22522;22515:12;22556:568;22629:8;22639:6;22689:3;22682:4;22674:6;22670:17;22666:27;22656:122;;22697:79;;:::i;:::-;22656:122;22810:6;22797:20;22787:30;;22840:18;22832:6;22829:30;22826:117;;;22862:79;;:::i;:::-;22826:117;22976:4;22968:6;22964:17;22952:29;;23030:3;23022:4;23014:6;23010:17;23000:8;22996:32;22993:41;22990:128;;;23037:79;;:::i;:::-;22990:128;22556:568;;;;;:::o;23130:704::-;23225:6;23233;23241;23290:2;23278:9;23269:7;23265:23;23261:32;23258:119;;;23296:79;;:::i;:::-;23258:119;23416:1;23441:53;23486:7;23477:6;23466:9;23462:22;23441:53;:::i;:::-;23431:63;;23387:117;23571:2;23560:9;23556:18;23543:32;23602:18;23594:6;23591:30;23588:117;;;23624:79;;:::i;:::-;23588:117;23737:80;23809:7;23800:6;23789:9;23785:22;23737:80;:::i;:::-;23719:98;;;;23514:313;23130:704;;;;;:::o;23912:876::-;24073:4;24068:3;24064:14;24160:4;24153:5;24149:16;24143:23;24179:63;24236:4;24231:3;24227:14;24213:12;24179:63;:::i;:::-;24088:164;24344:4;24337:5;24333:16;24327:23;24363:61;24418:4;24413:3;24409:14;24395:12;24363:61;:::i;:::-;24262:172;24518:4;24511:5;24507:16;24501:23;24537:57;24588:4;24583:3;24579:14;24565:12;24537:57;:::i;:::-;24444:160;24691:4;24684:5;24680:16;24674:23;24710:61;24765:4;24760:3;24756:14;24742:12;24710:61;:::i;:::-;24614:167;24042:746;23912:876;;:::o;24794:351::-;24951:4;24989:3;24978:9;24974:19;24966:27;;25003:135;25135:1;25124:9;25120:17;25111:6;25003:135;:::i;:::-;24794:351;;;;:::o;25151:474::-;25219:6;25227;25276:2;25264:9;25255:7;25251:23;25247:32;25244:119;;;25282:79;;:::i;:::-;25244:119;25402:1;25427:53;25472:7;25463:6;25452:9;25448:22;25427:53;:::i;:::-;25417:63;;25373:117;25529:2;25555:53;25600:7;25591:6;25580:9;25576:22;25555:53;:::i;:::-;25545:63;;25500:118;25151:474;;;;;:::o;25631:180::-;25679:77;25676:1;25669:88;25776:4;25773:1;25766:15;25800:4;25797:1;25790:15;25817:320;25861:6;25898:1;25892:4;25888:12;25878:22;;25945:1;25939:4;25935:12;25966:18;25956:81;;26022:4;26014:6;26010:17;26000:27;;25956:81;26084:2;26076:6;26073:14;26053:18;26050:38;26047:84;;;26103:18;;:::i;:::-;26047:84;25868:269;25817:320;;;:::o;26143:180::-;26191:77;26188:1;26181:88;26288:4;26285:1;26278:15;26312:4;26309:1;26302:15;26329:191;26369:4;26389:20;26407:1;26389:20;:::i;:::-;26384:25;;26423:20;26441:1;26423:20;:::i;:::-;26418:25;;26462:1;26459;26456:8;26453:34;;;26467:18;;:::i;:::-;26453:34;26512:1;26509;26505:9;26497:17;;26329:191;;;;:::o;26526:181::-;26666:33;26662:1;26654:6;26650:14;26643:57;26526:181;:::o;26713:366::-;26855:3;26876:67;26940:2;26935:3;26876:67;:::i;:::-;26869:74;;26952:93;27041:3;26952:93;:::i;:::-;27070:2;27065:3;27061:12;27054:19;;26713:366;;;:::o;27085:419::-;27251:4;27289:2;27278:9;27274:18;27266:26;;27338:9;27332:4;27328:20;27324:1;27313:9;27309:17;27302:47;27366:131;27492:4;27366:131;:::i;:::-;27358:139;;27085:419;;;:::o;27510:147::-;27611:11;27648:3;27633:18;;27510:147;;;;:::o;27663:114::-;;:::o;27783:398::-;27942:3;27963:83;28044:1;28039:3;27963:83;:::i;:::-;27956:90;;28055:93;28144:3;28055:93;:::i;:::-;28173:1;28168:3;28164:11;28157:18;;27783:398;;;:::o;28187:379::-;28371:3;28393:147;28536:3;28393:147;:::i;:::-;28386:154;;28557:3;28550:10;;28187:379;;;:::o;28572:180::-;28620:77;28617:1;28610:88;28717:4;28714:1;28707:15;28741:4;28738:1;28731:15;28758:305;28798:3;28817:20;28835:1;28817:20;:::i;:::-;28812:25;;28851:20;28869:1;28851:20;:::i;:::-;28846:25;;29005:1;28937:66;28933:74;28930:1;28927:81;28924:107;;;29011:18;;:::i;:::-;28924:107;29055:1;29052;29048:9;29041:16;;28758:305;;;;:::o;29069:170::-;29209:22;29205:1;29197:6;29193:14;29186:46;29069:170;:::o;29245:366::-;29387:3;29408:67;29472:2;29467:3;29408:67;:::i;:::-;29401:74;;29484:93;29573:3;29484:93;:::i;:::-;29602:2;29597:3;29593:12;29586:19;;29245:366;;;:::o;29617:419::-;29783:4;29821:2;29810:9;29806:18;29798:26;;29870:9;29864:4;29860:20;29856:1;29845:9;29841:17;29834:47;29898:131;30024:4;29898:131;:::i;:::-;29890:139;;29617:419;;;:::o;30042:169::-;30182:21;30178:1;30170:6;30166:14;30159:45;30042:169;:::o;30217:366::-;30359:3;30380:67;30444:2;30439:3;30380:67;:::i;:::-;30373:74;;30456:93;30545:3;30456:93;:::i;:::-;30574:2;30569:3;30565:12;30558:19;;30217:366;;;:::o;30589:419::-;30755:4;30793:2;30782:9;30778:18;30770:26;;30842:9;30836:4;30832:20;30828:1;30817:9;30813:17;30806:47;30870:131;30996:4;30870:131;:::i;:::-;30862:139;;30589:419;;;:::o;31014:94::-;31047:8;31095:5;31091:2;31087:14;31066:35;;31014:94;;;:::o;31114:::-;31153:7;31182:20;31196:5;31182:20;:::i;:::-;31171:31;;31114:94;;;:::o;31214:100::-;31253:7;31282:26;31302:5;31282:26;:::i;:::-;31271:37;;31214:100;;;:::o;31320:157::-;31425:45;31445:24;31463:5;31445:24;:::i;:::-;31425:45;:::i;:::-;31420:3;31413:58;31320:157;;:::o;31483:256::-;31595:3;31610:75;31681:3;31672:6;31610:75;:::i;:::-;31710:2;31705:3;31701:12;31694:19;;31730:3;31723:10;;31483:256;;;;:::o;31745:164::-;31885:16;31881:1;31873:6;31869:14;31862:40;31745:164;:::o;31915:366::-;32057:3;32078:67;32142:2;32137:3;32078:67;:::i;:::-;32071:74;;32154:93;32243:3;32154:93;:::i;:::-;32272:2;32267:3;32263:12;32256:19;;31915:366;;;:::o;32287:419::-;32453:4;32491:2;32480:9;32476:18;32468:26;;32540:9;32534:4;32530:20;32526:1;32515:9;32511:17;32504:47;32568:131;32694:4;32568:131;:::i;:::-;32560:139;;32287:419;;;:::o;32712:173::-;32852:25;32848:1;32840:6;32836:14;32829:49;32712:173;:::o;32891:366::-;33033:3;33054:67;33118:2;33113:3;33054:67;:::i;:::-;33047:74;;33130:93;33219:3;33130:93;:::i;:::-;33248:2;33243:3;33239:12;33232:19;;32891:366;;;:::o;33263:419::-;33429:4;33467:2;33456:9;33452:18;33444:26;;33516:9;33510:4;33506:20;33502:1;33491:9;33487:17;33480:47;33544:131;33670:4;33544:131;:::i;:::-;33536:139;;33263:419;;;:::o;33688:170::-;33828:22;33824:1;33816:6;33812:14;33805:46;33688:170;:::o;33864:366::-;34006:3;34027:67;34091:2;34086:3;34027:67;:::i;:::-;34020:74;;34103:93;34192:3;34103:93;:::i;:::-;34221:2;34216:3;34212:12;34205:19;;33864:366;;;:::o;34236:419::-;34402:4;34440:2;34429:9;34425:18;34417:26;;34489:9;34483:4;34479:20;34475:1;34464:9;34460:17;34453:47;34517:131;34643:4;34517:131;:::i;:::-;34509:139;;34236:419;;;:::o;34661:174::-;34801:26;34797:1;34789:6;34785:14;34778:50;34661:174;:::o;34841:366::-;34983:3;35004:67;35068:2;35063:3;35004:67;:::i;:::-;34997:74;;35080:93;35169:3;35080:93;:::i;:::-;35198:2;35193:3;35189:12;35182:19;;34841:366;;;:::o;35213:419::-;35379:4;35417:2;35406:9;35402:18;35394:26;;35466:9;35460:4;35456:20;35452:1;35441:9;35437:17;35430:47;35494:131;35620:4;35494:131;:::i;:::-;35486:139;;35213:419;;;:::o;35638:234::-;35778:34;35774:1;35766:6;35762:14;35755:58;35847:17;35842:2;35834:6;35830:15;35823:42;35638:234;:::o;35878:366::-;36020:3;36041:67;36105:2;36100:3;36041:67;:::i;:::-;36034:74;;36117:93;36206:3;36117:93;:::i;:::-;36235:2;36230:3;36226:12;36219:19;;35878:366;;;:::o;36250:419::-;36416:4;36454:2;36443:9;36439:18;36431:26;;36503:9;36497:4;36493:20;36489:1;36478:9;36474:17;36467:47;36531:131;36657:4;36531:131;:::i;:::-;36523:139;;36250:419;;;:::o;36675:148::-;36777:11;36814:3;36799:18;;36675:148;;;;:::o;36829:377::-;36935:3;36963:39;36996:5;36963:39;:::i;:::-;37018:89;37100:6;37095:3;37018:89;:::i;:::-;37011:96;;37116:52;37161:6;37156:3;37149:4;37142:5;37138:16;37116:52;:::i;:::-;37193:6;37188:3;37184:16;37177:23;;36939:267;36829:377;;;;:::o;37212:141::-;37261:4;37284:3;37276:11;;37307:3;37304:1;37297:14;37341:4;37338:1;37328:18;37320:26;;37212:141;;;:::o;37383:845::-;37486:3;37523:5;37517:12;37552:36;37578:9;37552:36;:::i;:::-;37604:89;37686:6;37681:3;37604:89;:::i;:::-;37597:96;;37724:1;37713:9;37709:17;37740:1;37735:137;;;;37886:1;37881:341;;;;37702:520;;37735:137;37819:4;37815:9;37804;37800:25;37795:3;37788:38;37855:6;37850:3;37846:16;37839:23;;37735:137;;37881:341;37948:38;37980:5;37948:38;:::i;:::-;38008:1;38022:154;38036:6;38033:1;38030:13;38022:154;;;38110:7;38104:14;38100:1;38095:3;38091:11;38084:35;38160:1;38151:7;38147:15;38136:26;;38058:4;38055:1;38051:12;38046:17;;38022:154;;;38205:6;38200:3;38196:16;38189:23;;37888:334;;37702:520;;37490:738;;37383:845;;;;:::o;38234:589::-;38459:3;38481:95;38572:3;38563:6;38481:95;:::i;:::-;38474:102;;38593:95;38684:3;38675:6;38593:95;:::i;:::-;38586:102;;38705:92;38793:3;38784:6;38705:92;:::i;:::-;38698:99;;38814:3;38807:10;;38234:589;;;;;;:::o;38829:225::-;38969:34;38965:1;38957:6;38953:14;38946:58;39038:8;39033:2;39025:6;39021:15;39014:33;38829:225;:::o;39060:366::-;39202:3;39223:67;39287:2;39282:3;39223:67;:::i;:::-;39216:74;;39299:93;39388:3;39299:93;:::i;:::-;39417:2;39412:3;39408:12;39401:19;;39060:366;;;:::o;39432:419::-;39598:4;39636:2;39625:9;39621:18;39613:26;;39685:9;39679:4;39675:20;39671:1;39660:9;39656:17;39649:47;39713:131;39839:4;39713:131;:::i;:::-;39705:139;;39432:419;;;:::o;39857:182::-;39997:34;39993:1;39985:6;39981:14;39974:58;39857:182;:::o;40045:366::-;40187:3;40208:67;40272:2;40267:3;40208:67;:::i;:::-;40201:74;;40284:93;40373:3;40284:93;:::i;:::-;40402:2;40397:3;40393:12;40386:19;;40045:366;;;:::o;40417:419::-;40583:4;40621:2;40610:9;40606:18;40598:26;;40670:9;40664:4;40660:20;40656:1;40645:9;40641:17;40634:47;40698:131;40824:4;40698:131;:::i;:::-;40690:139;;40417:419;;;:::o;40842:98::-;40893:6;40927:5;40921:12;40911:22;;40842:98;;;:::o;40946:168::-;41029:11;41063:6;41058:3;41051:19;41103:4;41098:3;41094:14;41079:29;;40946:168;;;;:::o;41120:360::-;41206:3;41234:38;41266:5;41234:38;:::i;:::-;41288:70;41351:6;41346:3;41288:70;:::i;:::-;41281:77;;41367:52;41412:6;41407:3;41400:4;41393:5;41389:16;41367:52;:::i;:::-;41444:29;41466:6;41444:29;:::i;:::-;41439:3;41435:39;41428:46;;41210:270;41120:360;;;;:::o;41486:640::-;41681:4;41719:3;41708:9;41704:19;41696:27;;41733:71;41801:1;41790:9;41786:17;41777:6;41733:71;:::i;:::-;41814:72;41882:2;41871:9;41867:18;41858:6;41814:72;:::i;:::-;41896;41964:2;41953:9;41949:18;41940:6;41896:72;:::i;:::-;42015:9;42009:4;42005:20;42000:2;41989:9;41985:18;41978:48;42043:76;42114:4;42105:6;42043:76;:::i;:::-;42035:84;;41486:640;;;;;;;:::o;42132:141::-;42188:5;42219:6;42213:13;42204:22;;42235:32;42261:5;42235:32;:::i;:::-;42132:141;;;;:::o;42279:349::-;42348:6;42397:2;42385:9;42376:7;42372:23;42368:32;42365:119;;;42403:79;;:::i;:::-;42365:119;42523:1;42548:63;42603:7;42594:6;42583:9;42579:22;42548:63;:::i;:::-;42538:73;;42494:127;42279:349;;;;:::o;42634:348::-;42674:7;42697:20;42715:1;42697:20;:::i;:::-;42692:25;;42731:20;42749:1;42731:20;:::i;:::-;42726:25;;42919:1;42851:66;42847:74;42844:1;42841:81;42836:1;42829:9;42822:17;42818:105;42815:131;;;42926:18;;:::i;:::-;42815:131;42974:1;42971;42967:9;42956:20;;42634:348;;;;:::o;42988:233::-;43027:3;43050:24;43068:5;43050:24;:::i;:::-;43041:33;;43096:66;43089:5;43086:77;43083:103;;;43166:18;;:::i;:::-;43083:103;43213:1;43206:5;43202:13;43195:20;;42988:233;;;:::o;43227:180::-;43275:77;43272:1;43265:88;43372:4;43369:1;43362:15;43396:4;43393:1;43386:15;43413:185;43453:1;43470:20;43488:1;43470:20;:::i;:::-;43465:25;;43504:20;43522:1;43504:20;:::i;:::-;43499:25;;43543:1;43533:35;;43548:18;;:::i;:::-;43533:35;43590:1;43587;43583:9;43578:14;;43413:185;;;;:::o;43604:176::-;43636:1;43653:20;43671:1;43653:20;:::i;:::-;43648:25;;43687:20;43705:1;43687:20;:::i;:::-;43682:25;;43726:1;43716:35;;43731:18;;:::i;:::-;43716:35;43772:1;43769;43765:9;43760:14;;43604:176;;;;:::o
Swarm Source
ipfs://e18e13aae23dea0b4429f07f494f8805617989dbaf3d34967af835c451bfbd0d
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.