Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
3,333 LD
Holders
1,739
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 LDLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LOFI_DREAMERS
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-15 */ // SPDX-License-Identifier: GPL-3.0 /* ## ####### ######## #### ######## ######## ######## ### ## ## ######## ######## ###### ## ## ## ## ## ## ## ## ## ## ## ## ### ### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #### #### ## ## ## ## ## ## ## ###### ## ## ## ######## ###### ## ## ## ### ## ###### ######## ###### ## ## ## ## ## ## ## ## ## ## ######### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ######## ####### ## #### ######## ## ## ######## ## ## ## ## ######## ## ## ###### */ pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/extensions/IERC721ABurnable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721ABurnable compliant contract. */ interface IERC721ABurnable is IERC721A { /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) external; } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) virtual public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @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); } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @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; } } } // File: contracts/LofiDreamers.sol pragma solidity >=0.8.0 <0.9.0; contract LOFI_DREAMERS is ERC721AQueryable, Ownable, ReentrancyGuard, OperatorFilterer { using Strings for uint256; string public uriPrefix; string public notRevealedURI = "ipfs://QmZaHJkGNYpyvV7oJYWd8wMFSCCwcusc3wiycu3pZiWxpJ/1.json"; string public uriSuffix = ".json"; uint256 public cost = 0.0059 ether; uint256 public maxSupply = 3333; uint256 public maxPerTx = 5; uint256 public maxPerWallet = 5; bool public paused = true; bool public revealed = true; mapping(address => uint) public addressMintedBalance; mapping(address => bool) public freeMintClaimed; constructor() ERC721A ( "Lofi Dreamers", "LD" ) OperatorFilterer(address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6), true) {} // ~~~~~~~~~~~~~~~~~~~~ Modifiers ~~~~~~~~~~~~~~~~~~~~ modifier mintCompliance(uint256 _mintAmount) { require(!paused, "The contract is paused!"); require(_mintAmount > 0 && _mintAmount <= maxPerTx, "Invalid mint amount!"); require(_mintAmount + addressMintedBalance[msg.sender] <= maxPerWallet, "Max per wallet exceeded!"); require(totalSupply() + _mintAmount <= maxSupply, "Mint amount exceeds max supply!"); _; } // ~~~~~~~~~~~~~~~~~~~~ Mint Functions ~~~~~~~~~~~~~~~~~~~~ // PUBLIC MINT function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) { require(totalSupply() + _mintAmount <= maxSupply, "Max supply limit exceeded!"); if (freeMintClaimed[msg.sender] == false) { freeMintClaimed[msg.sender] = true; if (_mintAmount >= 1) { require(msg.value >= cost * (_mintAmount - 1),"Insufficient funds!"); } } else { require(msg.value >= cost * _mintAmount,"Insufficient funds!"); } addressMintedBalance[msg.sender] += _mintAmount; _safeMint(_msgSender(), _mintAmount); } // MINT for address function mintToAddress(uint256 _mintAmount, address _receiver) public onlyOwner { require(totalSupply() + _mintAmount <= maxSupply, "Mint amount exceeds max supply!"); _safeMint(_receiver, _mintAmount); } function MassAirdrop(uint256 amount, address[] calldata _receivers) public onlyOwner { for (uint256 i = 0; i < _receivers.length; ++i) { require(totalSupply() + amount <= maxSupply, "Max supply exceeded!"); _safeMint(_receivers[i], amount); } } // ~~~~~~~~~~~~~~~~~~~~ Various Checks ~~~~~~~~~~~~~~~~~~~~ function _startTokenId() internal view virtual override returns (uint256) { return 1; } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } function tokenURI(uint256 _tokenId) public view virtual override(ERC721A, IERC721A) returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); if (revealed == false) { return notRevealedURI; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ""; } // ~~~~~~~~~~~~~~~~~~~~ onlyOwner Functions ~~~~~~~~~~~~~~~~~~~~ // SET MAX SUPPLY function setMaxSupply(uint256 _MaxSupply) public onlyOwner { maxSupply = _MaxSupply; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setMaxPerTx(uint256 _maxPerTx) public onlyOwner { maxPerTx = _maxPerTx; } function setMaxPerWallet(uint256 _maxPerWallet) public onlyOwner { maxPerWallet = _maxPerWallet; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedURI = _notRevealedURI; } function reveal(bool _state) public onlyOwner { revealed = _state; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setApprovalForAll(address operator, bool approved) public override(ERC721A, IERC721A) onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override(ERC721A, IERC721A) onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override(ERC721A, IERC721A) onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override(ERC721A, IERC721A) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override(ERC721A, IERC721A) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } // ~~~~~~~~~~~~~~~~~~~~ Withdraw Functions ~~~~~~~~~~~~~~~~~~~~ function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"uint256","name":"amount","type":"uint256"},{"internalType":"address[]","name":"_receivers","type":"address[]"}],"name":"MassAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":"address","name":"","type":"address"}],"name":"freeMintClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedURI","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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"reveal","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":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerWallet","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060600160405280603c815260200162004e56603c9139600b908051906020019062000035929190620004ac565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c908051906020019062000083929190620004ac565b506614f604cc2cc000600d55610d05600e556005600f5560056010556001601160006101000a81548160ff0219169083151502179055506001601160016101000a81548160ff021916908315150217905550348015620000e257600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600d81526020017f4c6f666920447265616d657273000000000000000000000000000000000000008152506040518060400160405280600281526020017f4c4400000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200017e929190620004ac565b50806003908051906020019062000197929190620004ac565b50620001a8620003d560201b60201c565b6000819055505050620001d0620001c4620003de60201b60201c565b620003e660201b60201c565b600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003cd57801562000293576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000259929190620005a1565b600060405180830381600087803b1580156200027457600080fd5b505af115801562000289573d6000803e3d6000fd5b50505050620003cc565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200034d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b815260040162000313929190620005a1565b600060405180830381600087803b1580156200032e57600080fd5b505af115801562000343573d6000803e3d6000fd5b50505050620003cb565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003969190620005ce565b600060405180830381600087803b158015620003b157600080fd5b505af1158015620003c6573d6000803e3d6000fd5b505050505b5b5b50506200064f565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004ba906200061a565b90600052602060002090601f016020900481019282620004de57600085556200052a565b82601f10620004f957805160ff19168380011785556200052a565b828001600101855582156200052a579182015b82811115620005295782518255916020019190600101906200050c565b5b5090506200053991906200053d565b5090565b5b80821115620005585760008160009055506001016200053e565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000589826200055c565b9050919050565b6200059b816200057c565b82525050565b6000604082019050620005b8600083018562000590565b620005c7602083018462000590565b9392505050565b6000602082019050620005e5600083018462000590565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200063357607f821691505b602082108103620006495762000648620005eb565b5b50919050565b6147f7806200065f6000396000f3fe6080604052600436106102725760003560e01c80636f8b44b01161014f578063a22cb465116100c1578063e0ec7c361161007a578063e0ec7c3614610967578063e268e4d3146109a4578063e985e9c5146109cd578063f2c4ce1e14610a0a578063f2fde38b14610a33578063f968adbe14610a5c57610272565b8063a22cb46514610847578063b88d4fde14610870578063c23dc68f14610899578063c6f6f216146108d6578063c87b56dd146108ff578063d5abeb011461093c57610272565b80638462151c116101135780638462151c146107325780638da5cb5b1461076f578063940cd05b1461079a57806395d89b41146107c357806399a2557a146107ee578063a0712d681461082b57610272565b80636f8b44b01461066157806370a082311461068a578063715018a6146106c757806372250380146106de5780637ec4a6591461070957610272565b806341f43434116101e857806351830227116101ac578063518302271461053b5780635503a0e8146105665780635bbb2177146105915780635c975abb146105ce57806362b99ad4146105f95780636352211e1461062457610272565b806341f434341461046a57806342842e0e1461049557806344a0d68a146104be578063453c2310146104e7578063512b658d1461051257610272565b806313faede61161023a57806313faede61461036e57806316c38b3c1461039957806318160ddd146103c257806318cae269146103ed57806323b872dd1461042a5780633ccfd60b1461045357610272565b806301ffc9a714610277578063051ad03b146102b457806306fdde03146102dd578063081812fc14610308578063095ea7b314610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906131a5565b610a87565b6040516102ab91906131ed565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d691906132a3565b610b19565b005b3480156102e957600080fd5b506102f2610bce565b6040516102ff919061339c565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a91906133be565b610c60565b60405161033c919061342c565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190613473565b610cdc565b005b34801561037a57600080fd5b50610383610cf5565b60405161039091906134c2565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb9190613509565b610cfb565b005b3480156103ce57600080fd5b506103d7610d20565b6040516103e491906134c2565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f9190613536565b610d37565b60405161042191906134c2565b60405180910390f35b34801561043657600080fd5b50610451600480360381019061044c9190613563565b610d4f565b005b34801561045f57600080fd5b50610468610d9e565b005b34801561047657600080fd5b5061047f610e7b565b60405161048c9190613615565b60405180910390f35b3480156104a157600080fd5b506104bc60048036038101906104b79190613563565b610e8d565b005b3480156104ca57600080fd5b506104e560048036038101906104e091906133be565b610edc565b005b3480156104f357600080fd5b506104fc610eee565b60405161050991906134c2565b60405180910390f35b34801561051e57600080fd5b5061053960048036038101906105349190613630565b610ef4565b005b34801561054757600080fd5b50610550610f61565b60405161055d91906131ed565b60405180910390f35b34801561057257600080fd5b5061057b610f74565b604051610588919061339c565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b391906137ae565b611002565b6040516105c5919061395a565b60405180910390f35b3480156105da57600080fd5b506105e36110c3565b6040516105f091906131ed565b60405180910390f35b34801561060557600080fd5b5061060e6110d6565b60405161061b919061339c565b60405180910390f35b34801561063057600080fd5b5061064b600480360381019061064691906133be565b611164565b604051610658919061342c565b60405180910390f35b34801561066d57600080fd5b50610688600480360381019061068391906133be565b611176565b005b34801561069657600080fd5b506106b160048036038101906106ac9190613536565b611188565b6040516106be91906134c2565b60405180910390f35b3480156106d357600080fd5b506106dc611240565b005b3480156106ea57600080fd5b506106f3611254565b604051610700919061339c565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190613a31565b6112e2565b005b34801561073e57600080fd5b5061075960048036038101906107549190613536565b611304565b6040516107669190613b38565b60405180910390f35b34801561077b57600080fd5b50610784611447565b604051610791919061342c565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc9190613509565b611471565b005b3480156107cf57600080fd5b506107d8611496565b6040516107e5919061339c565b60405180910390f35b3480156107fa57600080fd5b5061081560048036038101906108109190613b5a565b611528565b6040516108229190613b38565b60405180910390f35b610845600480360381019061084091906133be565b611734565b005b34801561085357600080fd5b5061086e60048036038101906108699190613bad565b611ae9565b005b34801561087c57600080fd5b5061089760048036038101906108929190613c8e565b611b02565b005b3480156108a557600080fd5b506108c060048036038101906108bb91906133be565b611b53565b6040516108cd9190613d66565b60405180910390f35b3480156108e257600080fd5b506108fd60048036038101906108f891906133be565b611bbd565b005b34801561090b57600080fd5b50610926600480360381019061092191906133be565b611bcf565b604051610933919061339c565b60405180910390f35b34801561094857600080fd5b50610951611d27565b60405161095e91906134c2565b60405180910390f35b34801561097357600080fd5b5061098e60048036038101906109899190613536565b611d2d565b60405161099b91906131ed565b60405180910390f35b3480156109b057600080fd5b506109cb60048036038101906109c691906133be565b611d4d565b005b3480156109d957600080fd5b506109f460048036038101906109ef9190613d81565b611d5f565b604051610a0191906131ed565b60405180910390f35b348015610a1657600080fd5b50610a316004803603810190610a2c9190613a31565b611df3565b005b348015610a3f57600080fd5b50610a5a6004803603810190610a559190613536565b611e15565b005b348015610a6857600080fd5b50610a71611e98565b604051610a7e91906134c2565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b125750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610b21611e9e565b60005b82829050811015610bc857600e5484610b3b610d20565b610b459190613df0565b1115610b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7d90613e92565b60405180910390fd5b610bb7838383818110610b9c57610b9b613eb2565b5b9050602002016020810190610bb19190613536565b85611f1c565b80610bc190613ee1565b9050610b24565b50505050565b606060028054610bdd90613f58565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0990613f58565b8015610c565780601f10610c2b57610100808354040283529160200191610c56565b820191906000526020600020905b815481529060010190602001808311610c3957829003601f168201915b5050505050905090565b6000610c6b82611f3a565b610ca1576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610ce681611f99565b610cf08383612096565b505050565b600d5481565b610d03611e9e565b80601160006101000a81548160ff02191690831515021790555050565b6000610d2a6121d7565b6001546000540303905090565b60126020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d8d57610d8c33611f99565b5b610d988484846121e0565b50505050565b610da6611e9e565b600260095403610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de290613fd5565b60405180910390fd5b60026009819055506000610dfd611447565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e2090614026565b60006040518083038185875af1925050503d8060008114610e5d576040519150601f19603f3d011682016040523d82523d6000602084013e610e62565b606091505b5050905080610e7057600080fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ecb57610eca33611f99565b5b610ed6848484612502565b50505050565b610ee4611e9e565b80600d8190555050565b60105481565b610efc611e9e565b600e5482610f08610d20565b610f129190613df0565b1115610f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4a90614087565b60405180910390fd5b610f5d8183611f1c565b5050565b601160019054906101000a900460ff1681565b600c8054610f8190613f58565b80601f0160208091040260200160405190810160405280929190818152602001828054610fad90613f58565b8015610ffa5780601f10610fcf57610100808354040283529160200191610ffa565b820191906000526020600020905b815481529060010190602001808311610fdd57829003601f168201915b505050505081565b606060008251905060008167ffffffffffffffff81111561102657611025613670565b5b60405190808252806020026020018201604052801561105f57816020015b61104c613047565b8152602001906001900390816110445790505b50905060005b8281146110b85761108f85828151811061108257611081613eb2565b5b6020026020010151611b53565b8282815181106110a2576110a1613eb2565b5b6020026020010181905250806001019050611065565b508092505050919050565b601160009054906101000a900460ff1681565b600a80546110e390613f58565b80601f016020809104026020016040519081016040528092919081815260200182805461110f90613f58565b801561115c5780601f106111315761010080835404028352916020019161115c565b820191906000526020600020905b81548152906001019060200180831161113f57829003601f168201915b505050505081565b600061116f82612522565b9050919050565b61117e611e9e565b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111ef576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611248611e9e565b61125260006125ee565b565b600b805461126190613f58565b80601f016020809104026020016040519081016040528092919081815260200182805461128d90613f58565b80156112da5780601f106112af576101008083540402835291602001916112da565b820191906000526020600020905b8154815290600101906020018083116112bd57829003601f168201915b505050505081565b6112ea611e9e565b80600a9080519060200190611300929190613096565b5050565b6060600080600061131485611188565b905060008167ffffffffffffffff81111561133257611331613670565b5b6040519080825280602002602001820160405280156113605781602001602082028036833780820191505090505b50905061136b613047565b60006113756121d7565b90505b83861461143957611388816126b4565b9150816040015161142e57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146113d357816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361142d57808387806001019850815181106114205761141f613eb2565b5b6020026020010181815250505b5b806001019050611378565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611479611e9e565b80601160016101000a81548160ff02191690831515021790555050565b6060600380546114a590613f58565b80601f01602080910402602001604051908101604052809291908181526020018280546114d190613f58565b801561151e5780601f106114f35761010080835404028352916020019161151e565b820191906000526020600020905b81548152906001019060200180831161150157829003601f168201915b5050505050905090565b6060818310611563576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061156e6126df565b90506115786121d7565b85101561158a576115876121d7565b94505b80841115611596578093505b60006115a187611188565b9050848610156115c45760008686039050818110156115be578091505b506115c9565b600090505b60008167ffffffffffffffff8111156115e5576115e4613670565b5b6040519080825280602002602001820160405280156116135781602001602082028036833780820191505090505b5090506000820361162a578094505050505061172d565b600061163588611b53565b90506000816040015161164a57816000015190505b60008990505b8881141580156116605750848714155b1561171f5761166e816126b4565b9250826040015161171457600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146116b957826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611713578084888060010199508151811061170657611705613eb2565b5b6020026020010181815250505b5b806001019050611650565b508583528296505050505050505b9392505050565b80601160009054906101000a900460ff1615611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c906140f3565b60405180910390fd5b6000811180156117975750600f548111155b6117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd9061415f565b60405180910390fd5b601054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826118249190613df0565b1115611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c906141cb565b60405180910390fd5b600e5481611871610d20565b61187b9190613df0565b11156118bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b390614087565b60405180910390fd5b600e54826118c8610d20565b6118d29190613df0565b1115611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a90614237565b60405180910390fd5b60001515601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503611a2d576001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060018210611a28576001826119d89190614257565b600d546119e5919061428b565b341015611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e90614331565b60405180910390fd5b5b611a7e565b81600d54611a3b919061428b565b341015611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7490614331565b60405180910390fd5b5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611acd9190613df0565b92505081905550611ae5611adf6126e8565b83611f1c565b5050565b81611af381611f99565b611afd83836126f0565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b4057611b3f33611f99565b5b611b4c85858585612867565b5050505050565b611b5b613047565b611b63613047565b611b6b6121d7565b831080611b7f5750611b7b6126df565b8310155b15611b8d5780915050611bb8565b611b96836126b4565b9050806040015115611bab5780915050611bb8565b611bb4836128da565b9150505b919050565b611bc5611e9e565b80600f8190555050565b6060611bda82611f3a565b611c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c10906143c3565b60405180910390fd5b60001515601160019054906101000a900460ff16151503611cc657600b8054611c4190613f58565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6d90613f58565b8015611cba5780601f10611c8f57610100808354040283529160200191611cba565b820191906000526020600020905b815481529060010190602001808311611c9d57829003601f168201915b50505050509050611d22565b6000611cd06128fa565b90506000815111611cf05760405180602001604052806000815250611d1e565b80611cfa8461298c565b600c604051602001611d0e939291906144b3565b6040516020818303038152906040525b9150505b919050565b600e5481565b60136020528060005260406000206000915054906101000a900460ff1681565b611d55611e9e565b8060108190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611dfb611e9e565b80600b9080519060200190611e11929190613096565b5050565b611e1d611e9e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390614556565b60405180910390fd5b611e95816125ee565b50565b600f5481565b611ea66126e8565b73ffffffffffffffffffffffffffffffffffffffff16611ec4611447565b73ffffffffffffffffffffffffffffffffffffffff1614611f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f11906145c2565b60405180910390fd5b565b611f36828260405180602001604052806000815250612aec565b5050565b600081611f456121d7565b11158015611f54575060005482105b8015611f92575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612093576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016120109291906145e2565b602060405180830381865afa15801561202d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120519190614620565b61209257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612089919061342c565b60405180910390fd5b5b50565b60006120a182611164565b90508073ffffffffffffffffffffffffffffffffffffffff166120c2612b89565b73ffffffffffffffffffffffffffffffffffffffff1614612125576120ee816120e9612b89565b611d5f565b612124576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006121eb82612522565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612252576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061225e84612b91565b91509150612274818761226f612b89565b612bb3565b6122c05761228986612284612b89565b611d5f565b6122bf576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612326576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123338686866001612bf7565b801561233e57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061240c856123e8888887612bfd565b7c020000000000000000000000000000000000000000000000000000000017612c25565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612492576000600185019050600060046000838152602001908152602001600020540361249057600054811461248f578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124fa8686866001612c50565b505050505050565b61251d83838360405180602001604052806000815250611b02565b505050565b600080829050806125316121d7565b116125b7576000548110156125b65760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036125b4575b600081036125aa576004600083600190039350838152602001908152602001600020549050612580565b80925050506125e9565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126bc613047565b6126d86004600084815260200190815260200160002054612c56565b9050919050565b60008054905090565b600033905090565b6126f8612b89565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361275c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612769612b89565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612816612b89565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161285b91906131ed565b60405180910390a35050565b612872848484610d4f565b60008373ffffffffffffffffffffffffffffffffffffffff163b146128d45761289d84848484612d0c565b6128d3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6128e2613047565b6128f36128ee83612522565b612c56565b9050919050565b6060600a805461290990613f58565b80601f016020809104026020016040519081016040528092919081815260200182805461293590613f58565b80156129825780601f1061295757610100808354040283529160200191612982565b820191906000526020600020905b81548152906001019060200180831161296557829003601f168201915b5050505050905090565b6060600082036129d3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ae7565b600082905060005b60008214612a055780806129ee90613ee1565b915050600a826129fe919061467c565b91506129db565b60008167ffffffffffffffff811115612a2157612a20613670565b5b6040519080825280601f01601f191660200182016040528015612a535781602001600182028036833780820191505090505b5090505b60008514612ae057600182612a6c9190614257565b9150600a85612a7b91906146ad565b6030612a879190613df0565b60f81b818381518110612a9d57612a9c613eb2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ad9919061467c565b9450612a57565b8093505050505b919050565b612af68383612e5c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612b8457600080549050600083820390505b612b366000868380600101945086612d0c565b612b6c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612b23578160005414612b8157600080fd5b50505b505050565b600033905090565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612c1486868461302e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612c5e613047565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d32612b89565b8786866040518563ffffffff1660e01b8152600401612d549493929190614733565b6020604051808303816000875af1925050508015612d9057506040513d601f19601f82011682018060405250810190612d8d9190614794565b60015b612e09573d8060008114612dc0576040519150601f19603f3d011682016040523d82523d6000602084013e612dc5565b606091505b506000815103612e01576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ec8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612f02576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f0f6000848385612bf7565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612f8683612f776000866000612bfd565b612f8085613037565b17612c25565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612faa578060008190555050506130296000848385612c50565b505050565b60009392505050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b8280546130a290613f58565b90600052602060002090601f0160209004810192826130c4576000855561310b565b82601f106130dd57805160ff191683800117855561310b565b8280016001018555821561310b579182015b8281111561310a5782518255916020019190600101906130ef565b5b509050613118919061311c565b5090565b5b8082111561313557600081600090555060010161311d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131828161314d565b811461318d57600080fd5b50565b60008135905061319f81613179565b92915050565b6000602082840312156131bb576131ba613143565b5b60006131c984828501613190565b91505092915050565b60008115159050919050565b6131e7816131d2565b82525050565b600060208201905061320260008301846131de565b92915050565b6000819050919050565b61321b81613208565b811461322657600080fd5b50565b60008135905061323881613212565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126132635761326261323e565b5b8235905067ffffffffffffffff8111156132805761327f613243565b5b60208301915083602082028301111561329c5761329b613248565b5b9250929050565b6000806000604084860312156132bc576132bb613143565b5b60006132ca86828701613229565b935050602084013567ffffffffffffffff8111156132eb576132ea613148565b5b6132f78682870161324d565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561333d578082015181840152602081019050613322565b8381111561334c576000848401525b50505050565b6000601f19601f8301169050919050565b600061336e82613303565b613378818561330e565b935061338881856020860161331f565b61339181613352565b840191505092915050565b600060208201905081810360008301526133b68184613363565b905092915050565b6000602082840312156133d4576133d3613143565b5b60006133e284828501613229565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613416826133eb565b9050919050565b6134268161340b565b82525050565b6000602082019050613441600083018461341d565b92915050565b6134508161340b565b811461345b57600080fd5b50565b60008135905061346d81613447565b92915050565b6000806040838503121561348a57613489613143565b5b60006134988582860161345e565b92505060206134a985828601613229565b9150509250929050565b6134bc81613208565b82525050565b60006020820190506134d760008301846134b3565b92915050565b6134e6816131d2565b81146134f157600080fd5b50565b600081359050613503816134dd565b92915050565b60006020828403121561351f5761351e613143565b5b600061352d848285016134f4565b91505092915050565b60006020828403121561354c5761354b613143565b5b600061355a8482850161345e565b91505092915050565b60008060006060848603121561357c5761357b613143565b5b600061358a8682870161345e565b935050602061359b8682870161345e565b92505060406135ac86828701613229565b9150509250925092565b6000819050919050565b60006135db6135d66135d1846133eb565b6135b6565b6133eb565b9050919050565b60006135ed826135c0565b9050919050565b60006135ff826135e2565b9050919050565b61360f816135f4565b82525050565b600060208201905061362a6000830184613606565b92915050565b6000806040838503121561364757613646613143565b5b600061365585828601613229565b92505060206136668582860161345e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136a882613352565b810181811067ffffffffffffffff821117156136c7576136c6613670565b5b80604052505050565b60006136da613139565b90506136e6828261369f565b919050565b600067ffffffffffffffff82111561370657613705613670565b5b602082029050602081019050919050565b600061372a613725846136eb565b6136d0565b9050808382526020820190506020840283018581111561374d5761374c613248565b5b835b8181101561377657806137628882613229565b84526020840193505060208101905061374f565b5050509392505050565b600082601f8301126137955761379461323e565b5b81356137a5848260208601613717565b91505092915050565b6000602082840312156137c4576137c3613143565b5b600082013567ffffffffffffffff8111156137e2576137e1613148565b5b6137ee84828501613780565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61382c8161340b565b82525050565b600067ffffffffffffffff82169050919050565b61384f81613832565b82525050565b61385e816131d2565b82525050565b600062ffffff82169050919050565b61387c81613864565b82525050565b6080820160008201516138986000850182613823565b5060208201516138ab6020850182613846565b5060408201516138be6040850182613855565b5060608201516138d16060850182613873565b50505050565b60006138e38383613882565b60808301905092915050565b6000602082019050919050565b6000613907826137f7565b6139118185613802565b935061391c83613813565b8060005b8381101561394d57815161393488826138d7565b975061393f836138ef565b925050600181019050613920565b5085935050505092915050565b6000602082019050818103600083015261397481846138fc565b905092915050565b600080fd5b600067ffffffffffffffff82111561399c5761399b613670565b5b6139a582613352565b9050602081019050919050565b82818337600083830152505050565b60006139d46139cf84613981565b6136d0565b9050828152602081018484840111156139f0576139ef61397c565b5b6139fb8482856139b2565b509392505050565b600082601f830112613a1857613a1761323e565b5b8135613a288482602086016139c1565b91505092915050565b600060208284031215613a4757613a46613143565b5b600082013567ffffffffffffffff811115613a6557613a64613148565b5b613a7184828501613a03565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613aaf81613208565b82525050565b6000613ac18383613aa6565b60208301905092915050565b6000602082019050919050565b6000613ae582613a7a565b613aef8185613a85565b9350613afa83613a96565b8060005b83811015613b2b578151613b128882613ab5565b9750613b1d83613acd565b925050600181019050613afe565b5085935050505092915050565b60006020820190508181036000830152613b528184613ada565b905092915050565b600080600060608486031215613b7357613b72613143565b5b6000613b818682870161345e565b9350506020613b9286828701613229565b9250506040613ba386828701613229565b9150509250925092565b60008060408385031215613bc457613bc3613143565b5b6000613bd28582860161345e565b9250506020613be3858286016134f4565b9150509250929050565b600067ffffffffffffffff821115613c0857613c07613670565b5b613c1182613352565b9050602081019050919050565b6000613c31613c2c84613bed565b6136d0565b905082815260208101848484011115613c4d57613c4c61397c565b5b613c588482856139b2565b509392505050565b600082601f830112613c7557613c7461323e565b5b8135613c85848260208601613c1e565b91505092915050565b60008060008060808587031215613ca857613ca7613143565b5b6000613cb68782880161345e565b9450506020613cc78782880161345e565b9350506040613cd887828801613229565b925050606085013567ffffffffffffffff811115613cf957613cf8613148565b5b613d0587828801613c60565b91505092959194509250565b608082016000820151613d276000850182613823565b506020820151613d3a6020850182613846565b506040820151613d4d6040850182613855565b506060820151613d606060850182613873565b50505050565b6000608082019050613d7b6000830184613d11565b92915050565b60008060408385031215613d9857613d97613143565b5b6000613da68582860161345e565b9250506020613db78582860161345e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dfb82613208565b9150613e0683613208565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e3b57613e3a613dc1565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613e7c60148361330e565b9150613e8782613e46565b602082019050919050565b60006020820190508181036000830152613eab81613e6f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613eec82613208565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f1e57613f1d613dc1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f7057607f821691505b602082108103613f8357613f82613f29565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613fbf601f8361330e565b9150613fca82613f89565b602082019050919050565b60006020820190508181036000830152613fee81613fb2565b9050919050565b600081905092915050565b50565b6000614010600083613ff5565b915061401b82614000565b600082019050919050565b600061403182614003565b9150819050919050565b7f4d696e7420616d6f756e742065786365656473206d617820737570706c792100600082015250565b6000614071601f8361330e565b915061407c8261403b565b602082019050919050565b600060208201905081810360008301526140a081614064565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006140dd60178361330e565b91506140e8826140a7565b602082019050919050565b6000602082019050818103600083015261410c816140d0565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600061414960148361330e565b915061415482614113565b602082019050919050565b600060208201905081810360008301526141788161413c565b9050919050565b7f4d6178207065722077616c6c6574206578636565646564210000000000000000600082015250565b60006141b560188361330e565b91506141c08261417f565b602082019050919050565b600060208201905081810360008301526141e4816141a8565b9050919050565b7f4d617820737570706c79206c696d697420657863656564656421000000000000600082015250565b6000614221601a8361330e565b915061422c826141eb565b602082019050919050565b6000602082019050818103600083015261425081614214565b9050919050565b600061426282613208565b915061426d83613208565b9250828210156142805761427f613dc1565b5b828203905092915050565b600061429682613208565b91506142a183613208565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142da576142d9613dc1565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b600061431b60138361330e565b9150614326826142e5565b602082019050919050565b6000602082019050818103600083015261434a8161430e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006143ad602f8361330e565b91506143b882614351565b604082019050919050565b600060208201905081810360008301526143dc816143a0565b9050919050565b600081905092915050565b60006143f982613303565b61440381856143e3565b935061441381856020860161331f565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461444181613f58565b61444b81866143e3565b945060018216600081146144665760018114614477576144aa565b60ff198316865281860193506144aa565b6144808561441f565b60005b838110156144a257815481890152600182019150602081019050614483565b838801955050505b50505092915050565b60006144bf82866143ee565b91506144cb82856143ee565b91506144d78284614434565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061454060268361330e565b915061454b826144e4565b604082019050919050565b6000602082019050818103600083015261456f81614533565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006145ac60208361330e565b91506145b782614576565b602082019050919050565b600060208201905081810360008301526145db8161459f565b9050919050565b60006040820190506145f7600083018561341d565b614604602083018461341d565b9392505050565b60008151905061461a816134dd565b92915050565b60006020828403121561463657614635613143565b5b60006146448482850161460b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061468782613208565b915061469283613208565b9250826146a2576146a161464d565b5b828204905092915050565b60006146b882613208565b91506146c383613208565b9250826146d3576146d261464d565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614705826146de565b61470f81856146e9565b935061471f81856020860161331f565b61472881613352565b840191505092915050565b6000608082019050614748600083018761341d565b614755602083018661341d565b61476260408301856134b3565b818103606083015261477481846146fa565b905095945050505050565b60008151905061478e81613179565b92915050565b6000602082840312156147aa576147a9613143565b5b60006147b88482850161477f565b9150509291505056fea264697066735822122053b1df9833934c2ff3b6659cf405d540081534d0881c816891ed752b196d848b64736f6c634300080d0033697066733a2f2f516d5a61484a6b474e5970797656376f4a59576438774d46534343776375736333776979637533705a695778704a2f312e6a736f6e
Deployed Bytecode
0x6080604052600436106102725760003560e01c80636f8b44b01161014f578063a22cb465116100c1578063e0ec7c361161007a578063e0ec7c3614610967578063e268e4d3146109a4578063e985e9c5146109cd578063f2c4ce1e14610a0a578063f2fde38b14610a33578063f968adbe14610a5c57610272565b8063a22cb46514610847578063b88d4fde14610870578063c23dc68f14610899578063c6f6f216146108d6578063c87b56dd146108ff578063d5abeb011461093c57610272565b80638462151c116101135780638462151c146107325780638da5cb5b1461076f578063940cd05b1461079a57806395d89b41146107c357806399a2557a146107ee578063a0712d681461082b57610272565b80636f8b44b01461066157806370a082311461068a578063715018a6146106c757806372250380146106de5780637ec4a6591461070957610272565b806341f43434116101e857806351830227116101ac578063518302271461053b5780635503a0e8146105665780635bbb2177146105915780635c975abb146105ce57806362b99ad4146105f95780636352211e1461062457610272565b806341f434341461046a57806342842e0e1461049557806344a0d68a146104be578063453c2310146104e7578063512b658d1461051257610272565b806313faede61161023a57806313faede61461036e57806316c38b3c1461039957806318160ddd146103c257806318cae269146103ed57806323b872dd1461042a5780633ccfd60b1461045357610272565b806301ffc9a714610277578063051ad03b146102b457806306fdde03146102dd578063081812fc14610308578063095ea7b314610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906131a5565b610a87565b6040516102ab91906131ed565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d691906132a3565b610b19565b005b3480156102e957600080fd5b506102f2610bce565b6040516102ff919061339c565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a91906133be565b610c60565b60405161033c919061342c565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190613473565b610cdc565b005b34801561037a57600080fd5b50610383610cf5565b60405161039091906134c2565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb9190613509565b610cfb565b005b3480156103ce57600080fd5b506103d7610d20565b6040516103e491906134c2565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f9190613536565b610d37565b60405161042191906134c2565b60405180910390f35b34801561043657600080fd5b50610451600480360381019061044c9190613563565b610d4f565b005b34801561045f57600080fd5b50610468610d9e565b005b34801561047657600080fd5b5061047f610e7b565b60405161048c9190613615565b60405180910390f35b3480156104a157600080fd5b506104bc60048036038101906104b79190613563565b610e8d565b005b3480156104ca57600080fd5b506104e560048036038101906104e091906133be565b610edc565b005b3480156104f357600080fd5b506104fc610eee565b60405161050991906134c2565b60405180910390f35b34801561051e57600080fd5b5061053960048036038101906105349190613630565b610ef4565b005b34801561054757600080fd5b50610550610f61565b60405161055d91906131ed565b60405180910390f35b34801561057257600080fd5b5061057b610f74565b604051610588919061339c565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b391906137ae565b611002565b6040516105c5919061395a565b60405180910390f35b3480156105da57600080fd5b506105e36110c3565b6040516105f091906131ed565b60405180910390f35b34801561060557600080fd5b5061060e6110d6565b60405161061b919061339c565b60405180910390f35b34801561063057600080fd5b5061064b600480360381019061064691906133be565b611164565b604051610658919061342c565b60405180910390f35b34801561066d57600080fd5b50610688600480360381019061068391906133be565b611176565b005b34801561069657600080fd5b506106b160048036038101906106ac9190613536565b611188565b6040516106be91906134c2565b60405180910390f35b3480156106d357600080fd5b506106dc611240565b005b3480156106ea57600080fd5b506106f3611254565b604051610700919061339c565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190613a31565b6112e2565b005b34801561073e57600080fd5b5061075960048036038101906107549190613536565b611304565b6040516107669190613b38565b60405180910390f35b34801561077b57600080fd5b50610784611447565b604051610791919061342c565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc9190613509565b611471565b005b3480156107cf57600080fd5b506107d8611496565b6040516107e5919061339c565b60405180910390f35b3480156107fa57600080fd5b5061081560048036038101906108109190613b5a565b611528565b6040516108229190613b38565b60405180910390f35b610845600480360381019061084091906133be565b611734565b005b34801561085357600080fd5b5061086e60048036038101906108699190613bad565b611ae9565b005b34801561087c57600080fd5b5061089760048036038101906108929190613c8e565b611b02565b005b3480156108a557600080fd5b506108c060048036038101906108bb91906133be565b611b53565b6040516108cd9190613d66565b60405180910390f35b3480156108e257600080fd5b506108fd60048036038101906108f891906133be565b611bbd565b005b34801561090b57600080fd5b50610926600480360381019061092191906133be565b611bcf565b604051610933919061339c565b60405180910390f35b34801561094857600080fd5b50610951611d27565b60405161095e91906134c2565b60405180910390f35b34801561097357600080fd5b5061098e60048036038101906109899190613536565b611d2d565b60405161099b91906131ed565b60405180910390f35b3480156109b057600080fd5b506109cb60048036038101906109c691906133be565b611d4d565b005b3480156109d957600080fd5b506109f460048036038101906109ef9190613d81565b611d5f565b604051610a0191906131ed565b60405180910390f35b348015610a1657600080fd5b50610a316004803603810190610a2c9190613a31565b611df3565b005b348015610a3f57600080fd5b50610a5a6004803603810190610a559190613536565b611e15565b005b348015610a6857600080fd5b50610a71611e98565b604051610a7e91906134c2565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b125750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610b21611e9e565b60005b82829050811015610bc857600e5484610b3b610d20565b610b459190613df0565b1115610b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7d90613e92565b60405180910390fd5b610bb7838383818110610b9c57610b9b613eb2565b5b9050602002016020810190610bb19190613536565b85611f1c565b80610bc190613ee1565b9050610b24565b50505050565b606060028054610bdd90613f58565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0990613f58565b8015610c565780601f10610c2b57610100808354040283529160200191610c56565b820191906000526020600020905b815481529060010190602001808311610c3957829003601f168201915b5050505050905090565b6000610c6b82611f3a565b610ca1576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610ce681611f99565b610cf08383612096565b505050565b600d5481565b610d03611e9e565b80601160006101000a81548160ff02191690831515021790555050565b6000610d2a6121d7565b6001546000540303905090565b60126020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d8d57610d8c33611f99565b5b610d988484846121e0565b50505050565b610da6611e9e565b600260095403610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de290613fd5565b60405180910390fd5b60026009819055506000610dfd611447565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e2090614026565b60006040518083038185875af1925050503d8060008114610e5d576040519150601f19603f3d011682016040523d82523d6000602084013e610e62565b606091505b5050905080610e7057600080fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ecb57610eca33611f99565b5b610ed6848484612502565b50505050565b610ee4611e9e565b80600d8190555050565b60105481565b610efc611e9e565b600e5482610f08610d20565b610f129190613df0565b1115610f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4a90614087565b60405180910390fd5b610f5d8183611f1c565b5050565b601160019054906101000a900460ff1681565b600c8054610f8190613f58565b80601f0160208091040260200160405190810160405280929190818152602001828054610fad90613f58565b8015610ffa5780601f10610fcf57610100808354040283529160200191610ffa565b820191906000526020600020905b815481529060010190602001808311610fdd57829003601f168201915b505050505081565b606060008251905060008167ffffffffffffffff81111561102657611025613670565b5b60405190808252806020026020018201604052801561105f57816020015b61104c613047565b8152602001906001900390816110445790505b50905060005b8281146110b85761108f85828151811061108257611081613eb2565b5b6020026020010151611b53565b8282815181106110a2576110a1613eb2565b5b6020026020010181905250806001019050611065565b508092505050919050565b601160009054906101000a900460ff1681565b600a80546110e390613f58565b80601f016020809104026020016040519081016040528092919081815260200182805461110f90613f58565b801561115c5780601f106111315761010080835404028352916020019161115c565b820191906000526020600020905b81548152906001019060200180831161113f57829003601f168201915b505050505081565b600061116f82612522565b9050919050565b61117e611e9e565b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111ef576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611248611e9e565b61125260006125ee565b565b600b805461126190613f58565b80601f016020809104026020016040519081016040528092919081815260200182805461128d90613f58565b80156112da5780601f106112af576101008083540402835291602001916112da565b820191906000526020600020905b8154815290600101906020018083116112bd57829003601f168201915b505050505081565b6112ea611e9e565b80600a9080519060200190611300929190613096565b5050565b6060600080600061131485611188565b905060008167ffffffffffffffff81111561133257611331613670565b5b6040519080825280602002602001820160405280156113605781602001602082028036833780820191505090505b50905061136b613047565b60006113756121d7565b90505b83861461143957611388816126b4565b9150816040015161142e57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146113d357816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361142d57808387806001019850815181106114205761141f613eb2565b5b6020026020010181815250505b5b806001019050611378565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611479611e9e565b80601160016101000a81548160ff02191690831515021790555050565b6060600380546114a590613f58565b80601f01602080910402602001604051908101604052809291908181526020018280546114d190613f58565b801561151e5780601f106114f35761010080835404028352916020019161151e565b820191906000526020600020905b81548152906001019060200180831161150157829003601f168201915b5050505050905090565b6060818310611563576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061156e6126df565b90506115786121d7565b85101561158a576115876121d7565b94505b80841115611596578093505b60006115a187611188565b9050848610156115c45760008686039050818110156115be578091505b506115c9565b600090505b60008167ffffffffffffffff8111156115e5576115e4613670565b5b6040519080825280602002602001820160405280156116135781602001602082028036833780820191505090505b5090506000820361162a578094505050505061172d565b600061163588611b53565b90506000816040015161164a57816000015190505b60008990505b8881141580156116605750848714155b1561171f5761166e816126b4565b9250826040015161171457600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146116b957826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611713578084888060010199508151811061170657611705613eb2565b5b6020026020010181815250505b5b806001019050611650565b508583528296505050505050505b9392505050565b80601160009054906101000a900460ff1615611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c906140f3565b60405180910390fd5b6000811180156117975750600f548111155b6117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd9061415f565b60405180910390fd5b601054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826118249190613df0565b1115611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c906141cb565b60405180910390fd5b600e5481611871610d20565b61187b9190613df0565b11156118bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b390614087565b60405180910390fd5b600e54826118c8610d20565b6118d29190613df0565b1115611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a90614237565b60405180910390fd5b60001515601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503611a2d576001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060018210611a28576001826119d89190614257565b600d546119e5919061428b565b341015611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e90614331565b60405180910390fd5b5b611a7e565b81600d54611a3b919061428b565b341015611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7490614331565b60405180910390fd5b5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611acd9190613df0565b92505081905550611ae5611adf6126e8565b83611f1c565b5050565b81611af381611f99565b611afd83836126f0565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b4057611b3f33611f99565b5b611b4c85858585612867565b5050505050565b611b5b613047565b611b63613047565b611b6b6121d7565b831080611b7f5750611b7b6126df565b8310155b15611b8d5780915050611bb8565b611b96836126b4565b9050806040015115611bab5780915050611bb8565b611bb4836128da565b9150505b919050565b611bc5611e9e565b80600f8190555050565b6060611bda82611f3a565b611c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c10906143c3565b60405180910390fd5b60001515601160019054906101000a900460ff16151503611cc657600b8054611c4190613f58565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6d90613f58565b8015611cba5780601f10611c8f57610100808354040283529160200191611cba565b820191906000526020600020905b815481529060010190602001808311611c9d57829003601f168201915b50505050509050611d22565b6000611cd06128fa565b90506000815111611cf05760405180602001604052806000815250611d1e565b80611cfa8461298c565b600c604051602001611d0e939291906144b3565b6040516020818303038152906040525b9150505b919050565b600e5481565b60136020528060005260406000206000915054906101000a900460ff1681565b611d55611e9e565b8060108190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611dfb611e9e565b80600b9080519060200190611e11929190613096565b5050565b611e1d611e9e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390614556565b60405180910390fd5b611e95816125ee565b50565b600f5481565b611ea66126e8565b73ffffffffffffffffffffffffffffffffffffffff16611ec4611447565b73ffffffffffffffffffffffffffffffffffffffff1614611f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f11906145c2565b60405180910390fd5b565b611f36828260405180602001604052806000815250612aec565b5050565b600081611f456121d7565b11158015611f54575060005482105b8015611f92575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612093576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016120109291906145e2565b602060405180830381865afa15801561202d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120519190614620565b61209257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612089919061342c565b60405180910390fd5b5b50565b60006120a182611164565b90508073ffffffffffffffffffffffffffffffffffffffff166120c2612b89565b73ffffffffffffffffffffffffffffffffffffffff1614612125576120ee816120e9612b89565b611d5f565b612124576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006121eb82612522565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612252576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061225e84612b91565b91509150612274818761226f612b89565b612bb3565b6122c05761228986612284612b89565b611d5f565b6122bf576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612326576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123338686866001612bf7565b801561233e57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061240c856123e8888887612bfd565b7c020000000000000000000000000000000000000000000000000000000017612c25565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612492576000600185019050600060046000838152602001908152602001600020540361249057600054811461248f578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124fa8686866001612c50565b505050505050565b61251d83838360405180602001604052806000815250611b02565b505050565b600080829050806125316121d7565b116125b7576000548110156125b65760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036125b4575b600081036125aa576004600083600190039350838152602001908152602001600020549050612580565b80925050506125e9565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126bc613047565b6126d86004600084815260200190815260200160002054612c56565b9050919050565b60008054905090565b600033905090565b6126f8612b89565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361275c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612769612b89565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612816612b89565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161285b91906131ed565b60405180910390a35050565b612872848484610d4f565b60008373ffffffffffffffffffffffffffffffffffffffff163b146128d45761289d84848484612d0c565b6128d3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6128e2613047565b6128f36128ee83612522565b612c56565b9050919050565b6060600a805461290990613f58565b80601f016020809104026020016040519081016040528092919081815260200182805461293590613f58565b80156129825780601f1061295757610100808354040283529160200191612982565b820191906000526020600020905b81548152906001019060200180831161296557829003601f168201915b5050505050905090565b6060600082036129d3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ae7565b600082905060005b60008214612a055780806129ee90613ee1565b915050600a826129fe919061467c565b91506129db565b60008167ffffffffffffffff811115612a2157612a20613670565b5b6040519080825280601f01601f191660200182016040528015612a535781602001600182028036833780820191505090505b5090505b60008514612ae057600182612a6c9190614257565b9150600a85612a7b91906146ad565b6030612a879190613df0565b60f81b818381518110612a9d57612a9c613eb2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ad9919061467c565b9450612a57565b8093505050505b919050565b612af68383612e5c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612b8457600080549050600083820390505b612b366000868380600101945086612d0c565b612b6c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612b23578160005414612b8157600080fd5b50505b505050565b600033905090565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612c1486868461302e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612c5e613047565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d32612b89565b8786866040518563ffffffff1660e01b8152600401612d549493929190614733565b6020604051808303816000875af1925050508015612d9057506040513d601f19601f82011682018060405250810190612d8d9190614794565b60015b612e09573d8060008114612dc0576040519150601f19603f3d011682016040523d82523d6000602084013e612dc5565b606091505b506000815103612e01576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ec8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612f02576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f0f6000848385612bf7565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612f8683612f776000866000612bfd565b612f8085613037565b17612c25565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612faa578060008190555050506130296000848385612c50565b505050565b60009392505050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b8280546130a290613f58565b90600052602060002090601f0160209004810192826130c4576000855561310b565b82601f106130dd57805160ff191683800117855561310b565b8280016001018555821561310b579182015b8281111561310a5782518255916020019190600101906130ef565b5b509050613118919061311c565b5090565b5b8082111561313557600081600090555060010161311d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131828161314d565b811461318d57600080fd5b50565b60008135905061319f81613179565b92915050565b6000602082840312156131bb576131ba613143565b5b60006131c984828501613190565b91505092915050565b60008115159050919050565b6131e7816131d2565b82525050565b600060208201905061320260008301846131de565b92915050565b6000819050919050565b61321b81613208565b811461322657600080fd5b50565b60008135905061323881613212565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126132635761326261323e565b5b8235905067ffffffffffffffff8111156132805761327f613243565b5b60208301915083602082028301111561329c5761329b613248565b5b9250929050565b6000806000604084860312156132bc576132bb613143565b5b60006132ca86828701613229565b935050602084013567ffffffffffffffff8111156132eb576132ea613148565b5b6132f78682870161324d565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561333d578082015181840152602081019050613322565b8381111561334c576000848401525b50505050565b6000601f19601f8301169050919050565b600061336e82613303565b613378818561330e565b935061338881856020860161331f565b61339181613352565b840191505092915050565b600060208201905081810360008301526133b68184613363565b905092915050565b6000602082840312156133d4576133d3613143565b5b60006133e284828501613229565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613416826133eb565b9050919050565b6134268161340b565b82525050565b6000602082019050613441600083018461341d565b92915050565b6134508161340b565b811461345b57600080fd5b50565b60008135905061346d81613447565b92915050565b6000806040838503121561348a57613489613143565b5b60006134988582860161345e565b92505060206134a985828601613229565b9150509250929050565b6134bc81613208565b82525050565b60006020820190506134d760008301846134b3565b92915050565b6134e6816131d2565b81146134f157600080fd5b50565b600081359050613503816134dd565b92915050565b60006020828403121561351f5761351e613143565b5b600061352d848285016134f4565b91505092915050565b60006020828403121561354c5761354b613143565b5b600061355a8482850161345e565b91505092915050565b60008060006060848603121561357c5761357b613143565b5b600061358a8682870161345e565b935050602061359b8682870161345e565b92505060406135ac86828701613229565b9150509250925092565b6000819050919050565b60006135db6135d66135d1846133eb565b6135b6565b6133eb565b9050919050565b60006135ed826135c0565b9050919050565b60006135ff826135e2565b9050919050565b61360f816135f4565b82525050565b600060208201905061362a6000830184613606565b92915050565b6000806040838503121561364757613646613143565b5b600061365585828601613229565b92505060206136668582860161345e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136a882613352565b810181811067ffffffffffffffff821117156136c7576136c6613670565b5b80604052505050565b60006136da613139565b90506136e6828261369f565b919050565b600067ffffffffffffffff82111561370657613705613670565b5b602082029050602081019050919050565b600061372a613725846136eb565b6136d0565b9050808382526020820190506020840283018581111561374d5761374c613248565b5b835b8181101561377657806137628882613229565b84526020840193505060208101905061374f565b5050509392505050565b600082601f8301126137955761379461323e565b5b81356137a5848260208601613717565b91505092915050565b6000602082840312156137c4576137c3613143565b5b600082013567ffffffffffffffff8111156137e2576137e1613148565b5b6137ee84828501613780565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61382c8161340b565b82525050565b600067ffffffffffffffff82169050919050565b61384f81613832565b82525050565b61385e816131d2565b82525050565b600062ffffff82169050919050565b61387c81613864565b82525050565b6080820160008201516138986000850182613823565b5060208201516138ab6020850182613846565b5060408201516138be6040850182613855565b5060608201516138d16060850182613873565b50505050565b60006138e38383613882565b60808301905092915050565b6000602082019050919050565b6000613907826137f7565b6139118185613802565b935061391c83613813565b8060005b8381101561394d57815161393488826138d7565b975061393f836138ef565b925050600181019050613920565b5085935050505092915050565b6000602082019050818103600083015261397481846138fc565b905092915050565b600080fd5b600067ffffffffffffffff82111561399c5761399b613670565b5b6139a582613352565b9050602081019050919050565b82818337600083830152505050565b60006139d46139cf84613981565b6136d0565b9050828152602081018484840111156139f0576139ef61397c565b5b6139fb8482856139b2565b509392505050565b600082601f830112613a1857613a1761323e565b5b8135613a288482602086016139c1565b91505092915050565b600060208284031215613a4757613a46613143565b5b600082013567ffffffffffffffff811115613a6557613a64613148565b5b613a7184828501613a03565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613aaf81613208565b82525050565b6000613ac18383613aa6565b60208301905092915050565b6000602082019050919050565b6000613ae582613a7a565b613aef8185613a85565b9350613afa83613a96565b8060005b83811015613b2b578151613b128882613ab5565b9750613b1d83613acd565b925050600181019050613afe565b5085935050505092915050565b60006020820190508181036000830152613b528184613ada565b905092915050565b600080600060608486031215613b7357613b72613143565b5b6000613b818682870161345e565b9350506020613b9286828701613229565b9250506040613ba386828701613229565b9150509250925092565b60008060408385031215613bc457613bc3613143565b5b6000613bd28582860161345e565b9250506020613be3858286016134f4565b9150509250929050565b600067ffffffffffffffff821115613c0857613c07613670565b5b613c1182613352565b9050602081019050919050565b6000613c31613c2c84613bed565b6136d0565b905082815260208101848484011115613c4d57613c4c61397c565b5b613c588482856139b2565b509392505050565b600082601f830112613c7557613c7461323e565b5b8135613c85848260208601613c1e565b91505092915050565b60008060008060808587031215613ca857613ca7613143565b5b6000613cb68782880161345e565b9450506020613cc78782880161345e565b9350506040613cd887828801613229565b925050606085013567ffffffffffffffff811115613cf957613cf8613148565b5b613d0587828801613c60565b91505092959194509250565b608082016000820151613d276000850182613823565b506020820151613d3a6020850182613846565b506040820151613d4d6040850182613855565b506060820151613d606060850182613873565b50505050565b6000608082019050613d7b6000830184613d11565b92915050565b60008060408385031215613d9857613d97613143565b5b6000613da68582860161345e565b9250506020613db78582860161345e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dfb82613208565b9150613e0683613208565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e3b57613e3a613dc1565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613e7c60148361330e565b9150613e8782613e46565b602082019050919050565b60006020820190508181036000830152613eab81613e6f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613eec82613208565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f1e57613f1d613dc1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f7057607f821691505b602082108103613f8357613f82613f29565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613fbf601f8361330e565b9150613fca82613f89565b602082019050919050565b60006020820190508181036000830152613fee81613fb2565b9050919050565b600081905092915050565b50565b6000614010600083613ff5565b915061401b82614000565b600082019050919050565b600061403182614003565b9150819050919050565b7f4d696e7420616d6f756e742065786365656473206d617820737570706c792100600082015250565b6000614071601f8361330e565b915061407c8261403b565b602082019050919050565b600060208201905081810360008301526140a081614064565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006140dd60178361330e565b91506140e8826140a7565b602082019050919050565b6000602082019050818103600083015261410c816140d0565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600061414960148361330e565b915061415482614113565b602082019050919050565b600060208201905081810360008301526141788161413c565b9050919050565b7f4d6178207065722077616c6c6574206578636565646564210000000000000000600082015250565b60006141b560188361330e565b91506141c08261417f565b602082019050919050565b600060208201905081810360008301526141e4816141a8565b9050919050565b7f4d617820737570706c79206c696d697420657863656564656421000000000000600082015250565b6000614221601a8361330e565b915061422c826141eb565b602082019050919050565b6000602082019050818103600083015261425081614214565b9050919050565b600061426282613208565b915061426d83613208565b9250828210156142805761427f613dc1565b5b828203905092915050565b600061429682613208565b91506142a183613208565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142da576142d9613dc1565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b600061431b60138361330e565b9150614326826142e5565b602082019050919050565b6000602082019050818103600083015261434a8161430e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006143ad602f8361330e565b91506143b882614351565b604082019050919050565b600060208201905081810360008301526143dc816143a0565b9050919050565b600081905092915050565b60006143f982613303565b61440381856143e3565b935061441381856020860161331f565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461444181613f58565b61444b81866143e3565b945060018216600081146144665760018114614477576144aa565b60ff198316865281860193506144aa565b6144808561441f565b60005b838110156144a257815481890152600182019150602081019050614483565b838801955050505b50505092915050565b60006144bf82866143ee565b91506144cb82856143ee565b91506144d78284614434565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061454060268361330e565b915061454b826144e4565b604082019050919050565b6000602082019050818103600083015261456f81614533565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006145ac60208361330e565b91506145b782614576565b602082019050919050565b600060208201905081810360008301526145db8161459f565b9050919050565b60006040820190506145f7600083018561341d565b614604602083018461341d565b9392505050565b60008151905061461a816134dd565b92915050565b60006020828403121561463657614635613143565b5b60006146448482850161460b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061468782613208565b915061469283613208565b9250826146a2576146a161464d565b5b828204905092915050565b60006146b882613208565b91506146c383613208565b9250826146d3576146d261464d565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614705826146de565b61470f81856146e9565b935061471f81856020860161331f565b61472881613352565b840191505092915050565b6000608082019050614748600083018761341d565b614755602083018661341d565b61476260408301856134b3565b818103606083015261477481846146fa565b905095945050505050565b60008151905061478e81613179565b92915050565b6000602082840312156147aa576147a9613143565b5b60006147b88482850161477f565b9150509291505056fea264697066735822122053b1df9833934c2ff3b6659cf405d540081534d0881c816891ed752b196d848b64736f6c634300080d0033
Deployed Bytecode Sourcemap
68654:5177:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29631:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70797:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35278:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37232:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72850:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68952:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72572:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28685:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69167:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73026:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73678:150;;;;;;;;;;;;;:::i;:::-;;3694:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73208:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71970:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69063:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70574:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69133:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68910:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63867:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69103:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68784:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35067:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71870:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30310:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13735:103;;;;;;;;;;;;;:::i;:::-;;68812:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72258:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67679:892;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13087:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72490:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35447:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64725:2505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69941:604;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72655:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73398:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63288:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72050:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71346:431;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68991:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69224:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72146:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37887:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72364:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13993:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69031:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29631:615;29716:4;30031:10;30016:25;;:11;:25;;;;:102;;;;30108:10;30093:25;;:11;:25;;;;30016:102;:179;;;;30185:10;30170:25;;:11;:25;;;;30016:179;29996:199;;29631:615;;;:::o;70797:271::-;12973:13;:11;:13::i;:::-;70894:9:::1;70889:174;70913:10;;:17;;70909:1;:21;70889:174;;;70980:9;;70970:6;70954:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;70946:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71023:32;71033:10;;71044:1;71033:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;71048:6;71023:9;:32::i;:::-;70932:3;;;;:::i;:::-;;;70889:174;;;;70797:271:::0;;;:::o;35278:100::-;35332:13;35365:5;35358:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35278:100;:::o;37232:204::-;37300:7;37325:16;37333:7;37325;:16::i;:::-;37320:64;;37350:34;;;;;;;;;;;;;;37320:64;37404:15;:24;37420:7;37404:24;;;;;;;;;;;;;;;;;;;;;37397:31;;37232:204;;;:::o;72850:170::-;72965:8;5215:30;5236:8;5215:20;:30::i;:::-;72982:32:::1;72996:8;73006:7;72982:13;:32::i;:::-;72850:170:::0;;;:::o;68952:34::-;;;;:::o;72572:77::-;12973:13;:11;:13::i;:::-;72637:6:::1;72628;;:15;;;;;;;;;;;;;;;;;;72572:77:::0;:::o;28685:315::-;28738:7;28966:15;:13;:15::i;:::-;28951:12;;28935:13;;:28;:46;28928:53;;28685:315;:::o;69167:52::-;;;;;;;;;;;;;;;;;:::o;73026:176::-;73146:4;5043:10;5035:18;;:4;:18;;;5031:83;;5070:32;5091:10;5070:20;:32::i;:::-;5031:83;73159:37:::1;73178:4;73184:2;73188:7;73159:18;:37::i;:::-;73026:176:::0;;;;:::o;73678:150::-;12973:13;:11;:13::i;:::-;7511:1:::1;8109:7;;:19:::0;8101:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7511:1;8242:7;:18;;;;73736:7:::2;73757;:5;:7::i;:::-;73749:21;;73778;73749:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73735:69;;;73819:2;73811:11;;;::::0;::::2;;73728:100;7467:1:::1;8421:7;:22;;;;73678:150::o:0;3694:143::-;3794:42;3694:143;:::o;73208:184::-;73332:4;5043:10;5035:18;;:4;:18;;;5031:83;;5070:32;5091:10;5070:20;:32::i;:::-;5031:83;73345:41:::1;73368:4;73374:2;73378:7;73345:22;:41::i;:::-;73208:184:::0;;;;:::o;71970:74::-;12973:13;:11;:13::i;:::-;72033:5:::1;72026:4;:12;;;;71970:74:::0;:::o;69063:31::-;;;;:::o;70574:217::-;12973:13;:11;:13::i;:::-;70700:9:::1;;70685:11;70669:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;70661:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;70752:33;70762:9;70773:11;70752:9;:33::i;:::-;70574:217:::0;;:::o;69133:27::-;;;;;;;;;;;;;:::o;68910:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63867:468::-;63956:23;64017:22;64042:8;:15;64017:40;;64072:34;64130:14;64109:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;64072:73;;64165:9;64160:125;64181:14;64176:1;:19;64160:125;;64237:32;64257:8;64266:1;64257:11;;;;;;;;:::i;:::-;;;;;;;;64237:19;:32::i;:::-;64221:10;64232:1;64221:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;64197:3;;;;;64160:125;;;;64306:10;64299:17;;;;63867:468;;;:::o;69103:25::-;;;;;;;;;;;;;:::o;68784:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35067:144::-;35131:7;35174:27;35193:7;35174:18;:27::i;:::-;35151:52;;35067:144;;;:::o;71870:94::-;12973:13;:11;:13::i;:::-;71948:10:::1;71936:9;:22;;;;71870:94:::0;:::o;30310:224::-;30374:7;30415:1;30398:19;;:5;:19;;;30394:60;;30426:28;;;;;;;;;;;;;;30394:60;24865:13;30472:18;:25;30491:5;30472:25;;;;;;;;;;;;;;;;:54;30465:61;;30310:224;;;:::o;13735:103::-;12973:13;:11;:13::i;:::-;13800:30:::1;13827:1;13800:18;:30::i;:::-;13735:103::o:0;68812:93::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72258:100::-;12973:13;:11;:13::i;:::-;72342:10:::1;72330:9;:22;;;;;;;;;;;;:::i;:::-;;72258:100:::0;:::o;67679:892::-;67749:16;67803:19;67837:25;67877:22;67902:16;67912:5;67902:9;:16::i;:::-;67877:41;;67933:25;67975:14;67961:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67933:57;;68005:31;;:::i;:::-;68056:9;68068:15;:13;:15::i;:::-;68056:27;;68051:472;68100:14;68085:11;:29;68051:472;;68152:15;68165:1;68152:12;:15::i;:::-;68140:27;;68190:9;:16;;;68231:8;68186:73;68307:1;68281:28;;:9;:14;;;:28;;;68277:111;;68354:9;:14;;;68334:34;;68277:111;68431:5;68410:26;;:17;:26;;;68406:102;;68487:1;68461:8;68470:13;;;;;;68461:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;68406:102;68051:472;68116:3;;;;;68051:472;;;;68544:8;68537:15;;;;;;;67679:892;;;:::o;13087:87::-;13133:7;13160:6;;;;;;;;;;;13153:13;;13087:87;:::o;72490:76::-;12973:13;:11;:13::i;:::-;72554:6:::1;72543:8;;:17;;;;;;;;;;;;;;;;;;72490:76:::0;:::o;35447:104::-;35503:13;35536:7;35529:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35447:104;:::o;64725:2505::-;64860:16;64927:4;64918:5;:13;64914:45;;64940:19;;;;;;;;;;;;;;64914:45;64974:19;65008:17;65028:14;:12;:14::i;:::-;65008:34;;65128:15;:13;:15::i;:::-;65120:5;:23;65116:87;;;65172:15;:13;:15::i;:::-;65164:23;;65116:87;65279:9;65272:4;:16;65268:73;;;65316:9;65309:16;;65268:73;65355:25;65383:16;65393:5;65383:9;:16::i;:::-;65355:44;;65577:4;65569:5;:12;65565:278;;;65602:19;65631:5;65624:4;:12;65602:34;;65673:17;65659:11;:31;65655:111;;;65735:11;65715:31;;65655:111;65583:198;65565:278;;;65826:1;65806:21;;65565:278;65857:25;65899:17;65885:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65857:60;;65957:1;65936:17;:22;65932:78;;65986:8;65979:15;;;;;;;;65932:78;66154:31;66188:26;66208:5;66188:19;:26::i;:::-;66154:60;;66229:25;66474:9;:16;;;66469:92;;66531:9;:14;;;66511:34;;66469:92;66580:9;66592:5;66580:17;;66575:478;66604:4;66599:1;:9;;:45;;;;;66627:17;66612:11;:32;;66599:45;66575:478;;;66682:15;66695:1;66682:12;:15::i;:::-;66670:27;;66720:9;:16;;;66761:8;66716:73;66837:1;66811:28;;:9;:14;;;:28;;;66807:111;;66884:9;:14;;;66864:34;;66807:111;66961:5;66940:26;;:17;:26;;;66936:102;;67017:1;66991:8;67000:13;;;;;;66991:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;66936:102;66575:478;66646:3;;;;;66575:478;;;;67155:11;67145:8;67138:29;67203:8;67196:15;;;;;;;;64725:2505;;;;;;:::o;69941:604::-;70006:11;69529:6;;;;;;;;;;;69528:7;69520:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;69592:1;69578:11;:15;:42;;;;;69612:8;;69597:11;:23;;69578:42;69570:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;69710:12;;69674:20;:32;69695:10;69674:32;;;;;;;;;;;;;;;;69660:11;:46;;;;:::i;:::-;:62;;69652:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;69797:9;;69782:11;69766:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;69758:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;70065:9:::1;;70050:11;70034:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;70026:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;70149:5;70118:36;;:15;:27;70134:10;70118:27;;;;;;;;;;;;;;;;;;;;;;;;;:36;;::::0;70114:327:::1;;70197:4;70167:15;:27;70183:10;70167:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;70233:1;70218:11;:16;70214:121;;70294:1;70280:11;:15;;;;:::i;:::-;70272:4;;:24;;;;:::i;:::-;70259:9;:37;;70251:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70214:121;70114:327;;;70395:11;70388:4;;:18;;;;:::i;:::-;70375:9;:31;;70367:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;70114:327;70485:11;70449:20;:32;70470:10;70449:32;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;70503:36;70513:12;:10;:12::i;:::-;70527:11;70503:9;:36::i;:::-;69941:604:::0;;:::o;72655:189::-;72778:8;5215:30;5236:8;5215:20;:30::i;:::-;72795:43:::1;72819:8;72829;72795:23;:43::i;:::-;72655:189:::0;;;:::o;73398:209::-;73541:4;5043:10;5035:18;;:4;:18;;;5031:83;;5070:32;5091:10;5070:20;:32::i;:::-;5031:83;73554:47:::1;73577:4;73583:2;73587:7;73596:4;73554:22;:47::i;:::-;73398:209:::0;;;;;:::o;63288:420::-;63364:21;;:::i;:::-;63398:31;;:::i;:::-;63454:15;:13;:15::i;:::-;63444:7;:25;:54;;;;63484:14;:12;:14::i;:::-;63473:7;:25;;63444:54;63440:103;;;63522:9;63515:16;;;;;63440:103;63565:21;63578:7;63565:12;:21::i;:::-;63553:33;;63601:9;:16;;;63597:65;;;63641:9;63634:16;;;;;63597:65;63679:21;63692:7;63679:12;:21::i;:::-;63672:28;;;63288:420;;;;:::o;72050:90::-;12973:13;:11;:13::i;:::-;72125:9:::1;72114:8;:20;;;;72050:90:::0;:::o;71346:431::-;71439:13;71469:17;71477:8;71469:7;:17::i;:::-;71461:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;71563:5;71551:17;;:8;;;;;;;;;;;:17;;;71547:49;;71579:14;71572:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71547:49;71604:28;71635:10;:8;:10::i;:::-;71604:41;;71690:1;71665:14;71659:28;:32;:112;;;;;;;;;;;;;;;;;71718:14;71734:19;:8;:17;:19::i;:::-;71755:9;71701:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71659:112;71652:119;;;71346:431;;;;:::o;68991:31::-;;;;:::o;69224:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;72146:106::-;12973:13;:11;:13::i;:::-;72233::::1;72218:12;:28;;;;72146:106:::0;:::o;37887:164::-;37984:4;38008:18;:25;38027:5;38008:25;;;;;;;;;;;;;;;:35;38034:8;38008:35;;;;;;;;;;;;;;;;;;;;;;;;;38001:42;;37887:164;;;;:::o;72364:120::-;12973:13;:11;:13::i;:::-;72463:15:::1;72446:14;:32;;;;;;;;;;;;:::i;:::-;;72364:120:::0;:::o;13993:201::-;12973:13;:11;:13::i;:::-;14102:1:::1;14082:22;;:8;:22;;::::0;14074:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14158:28;14177:8;14158:18;:28::i;:::-;13993:201:::0;:::o;69031:27::-;;;;:::o;13252:132::-;13327:12;:10;:12::i;:::-;13316:23;;:7;:5;:7::i;:::-;:23;;;13308:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13252:132::o;39389:104::-;39458:27;39468:2;39472:8;39458:27;;;;;;;;;;;;:9;:27::i;:::-;39389:104;;:::o;39032:273::-;39089:4;39145:7;39126:15;:13;:15::i;:::-;:26;;:66;;;;;39179:13;;39169:7;:23;39126:66;:152;;;;;39277:1;25635:8;39230:17;:26;39248:7;39230:26;;;;;;;;;;;;:43;:48;39126:152;39106:172;;39032:273;;;:::o;5273:419::-;5512:1;3794:42;5464:45;;;:49;5460:225;;;3794:42;5535;;;5586:4;5593:8;5535:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5530:144;;5649:8;5630:28;;;;;;;;;;;:::i;:::-;;;;;;;;5530:144;5460:225;5273:419;:::o;36772:394::-;36853:13;36869:16;36877:7;36869;:16::i;:::-;36853:32;;36925:5;36902:28;;:19;:17;:19::i;:::-;:28;;;36898:175;;36950:44;36967:5;36974:19;:17;:19::i;:::-;36950:16;:44::i;:::-;36945:128;;37022:35;;;;;;;;;;;;;;36945:128;36898:175;37112:2;37085:15;:24;37101:7;37085:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37150:7;37146:2;37130:28;;37139:5;37130:28;;;;;;;;;;;;36842:324;36772:394;;:::o;71135:95::-;71200:7;71223:1;71216:8;;71135:95;:::o;46497:2800::-;46631:27;46661;46680:7;46661:18;:27::i;:::-;46631:57;;46746:4;46705:45;;46721:19;46705:45;;;46701:86;;46759:28;;;;;;;;;;;;;;46701:86;46801:27;46830:23;46857:28;46877:7;46857:19;:28::i;:::-;46800:85;;;;46985:62;47004:15;47021:4;47027:19;:17;:19::i;:::-;46985:18;:62::i;:::-;46980:174;;47067:43;47084:4;47090:19;:17;:19::i;:::-;47067:16;:43::i;:::-;47062:92;;47119:35;;;;;;;;;;;;;;47062:92;46980:174;47185:1;47171:16;;:2;:16;;;47167:52;;47196:23;;;;;;;;;;;;;;47167:52;47232:43;47254:4;47260:2;47264:7;47273:1;47232:21;:43::i;:::-;47368:15;47365:160;;;47508:1;47487:19;47480:30;47365:160;47903:18;:24;47922:4;47903:24;;;;;;;;;;;;;;;;47901:26;;;;;;;;;;;;47972:18;:22;47991:2;47972:22;;;;;;;;;;;;;;;;47970:24;;;;;;;;;;;48294:145;48331:2;48379:45;48394:4;48400:2;48404:19;48379:14;:45::i;:::-;25913:8;48352:72;48294:18;:145::i;:::-;48265:17;:26;48283:7;48265:26;;;;;;;;;;;:174;;;;48609:1;25913:8;48559:19;:46;:51;48555:626;;48631:19;48663:1;48653:7;:11;48631:33;;48820:1;48786:17;:30;48804:11;48786:30;;;;;;;;;;;;:35;48782:384;;48924:13;;48909:11;:28;48905:242;;49104:19;49071:17;:30;49089:11;49071:30;;;;;;;;;;;:52;;;;48905:242;48782:384;48612:569;48555:626;49228:7;49224:2;49209:27;;49218:4;49209:27;;;;;;;;;;;;49247:42;49268:4;49274:2;49278:7;49287:1;49247:20;:42::i;:::-;46620:2677;;;46497:2800;;;:::o;38122:185::-;38260:39;38277:4;38283:2;38287:7;38260:39;;;;;;;;;;;;:16;:39::i;:::-;38122:185;;;:::o;31984:1129::-;32051:7;32071:12;32086:7;32071:22;;32154:4;32135:15;:13;:15::i;:::-;:23;32131:915;;32188:13;;32181:4;:20;32177:869;;;32226:14;32243:17;:23;32261:4;32243:23;;;;;;;;;;;;32226:40;;32359:1;25635:8;32332:6;:23;:28;32328:699;;32851:113;32868:1;32858:6;:11;32851:113;;32911:17;:25;32929:6;;;;;;;32911:25;;;;;;;;;;;;32902:34;;32851:113;;;32997:6;32990:13;;;;;;32328:699;32203:843;32177:869;32131:915;33074:31;;;;;;;;;;;;;;31984:1129;;;;:::o;14354:191::-;14428:16;14447:6;;;;;;;;;;;14428:25;;14473:8;14464:6;;:17;;;;;;;;;;;;;;;;;;14528:8;14497:40;;14518:8;14497:40;;;;;;;;;;;;14417:128;14354:191;:::o;33661:153::-;33721:21;;:::i;:::-;33762:44;33781:17;:24;33799:5;33781:24;;;;;;;;;;;;33762:18;:44::i;:::-;33755:51;;33661:153;;;:::o;28380:95::-;28427:7;28454:13;;28447:20;;28380:95;:::o;11638:98::-;11691:7;11718:10;11711:17;;11638:98;:::o;37508:308::-;37619:19;:17;:19::i;:::-;37607:31;;:8;:31;;;37603:61;;37647:17;;;;;;;;;;;;;;37603:61;37729:8;37677:18;:39;37696:19;:17;:19::i;:::-;37677:39;;;;;;;;;;;;;;;:49;37717:8;37677:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;37789:8;37753:55;;37768:19;:17;:19::i;:::-;37753:55;;;37799:8;37753:55;;;;;;:::i;:::-;;;;;;;;37508:308;;:::o;38378:399::-;38545:31;38558:4;38564:2;38568:7;38545:12;:31::i;:::-;38609:1;38591:2;:14;;;:19;38587:183;;38630:56;38661:4;38667:2;38671:7;38680:5;38630:30;:56::i;:::-;38625:145;;38714:40;;;;;;;;;;;;;;38625:145;38587:183;38378:399;;;;:::o;34317:158::-;34379:21;;:::i;:::-;34420:47;34439:27;34458:7;34439:18;:27::i;:::-;34420:18;:47::i;:::-;34413:54;;34317:158;;;:::o;71236:104::-;71296:13;71325:9;71318:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71236:104;:::o;8892:723::-;8948:13;9178:1;9169:5;:10;9165:53;;9196:10;;;;;;;;;;;;;;;;;;;;;9165:53;9228:12;9243:5;9228:20;;9259:14;9284:78;9299:1;9291:4;:9;9284:78;;9317:8;;;;;:::i;:::-;;;;9348:2;9340:10;;;;;:::i;:::-;;;9284:78;;;9372:19;9404:6;9394:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9372:39;;9422:154;9438:1;9429:5;:10;9422:154;;9466:1;9456:11;;;;;:::i;:::-;;;9533:2;9525:5;:10;;;;:::i;:::-;9512:2;:24;;;;:::i;:::-;9499:39;;9482:6;9489;9482:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9562:2;9553:11;;;;;:::i;:::-;;;9422:154;;;9600:6;9586:21;;;;;8892:723;;;;:::o;39909:681::-;40032:19;40038:2;40042:8;40032:5;:19::i;:::-;40111:1;40093:2;:14;;;:19;40089:483;;40133:11;40147:13;;40133:27;;40179:13;40201:8;40195:3;:14;40179:30;;40228:233;40259:62;40298:1;40302:2;40306:7;;;;;;40315:5;40259:30;:62::i;:::-;40254:167;;40357:40;;;;;;;;;;;;;;40254:167;40456:3;40448:5;:11;40228:233;;40543:3;40526:13;;:20;40522:34;;40548:8;;;40522:34;40114:458;;40089:483;39909:681;;;:::o;57593:105::-;57653:7;57680:10;57673:17;;57593:105;:::o;44833:652::-;44928:27;44957:23;44998:53;45054:15;44998:71;;45240:7;45234:4;45227:21;45275:22;45269:4;45262:36;45351:4;45345;45335:21;45312:44;;45447:19;45441:26;45422:45;;45178:300;44833:652;;;:::o;45598:645::-;45740:11;45902:15;45896:4;45892:26;45884:34;;46061:15;46050:9;46046:31;46033:44;;46208:15;46197:9;46194:30;46187:4;46176:9;46173:19;46170:55;46160:65;;45598:645;;;;;:::o;56426:159::-;;;;;:::o;54738:309::-;54873:7;54893:16;26036:3;54919:19;:40;;54893:67;;26036:3;54986:31;54997:4;55003:2;55007:9;54986:10;:31::i;:::-;54978:40;;:61;;54971:68;;;54738:309;;;;;:::o;34558:447::-;34638:14;34806:15;34799:5;34795:27;34786:36;;34980:5;34966:11;34942:22;34938:40;34935:51;34928:5;34925:62;34915:72;;34558:447;;;;:::o;57244:158::-;;;;;:::o;33207:363::-;33273:31;;:::i;:::-;33350:6;33317:9;:14;;:41;;;;;;;;;;;25519:3;33403:6;:32;;33369:9;:24;;:67;;;;;;;;;;;33493:1;25635:8;33466:6;:23;:28;;33447:9;:16;;:47;;;;;;;;;;;26036:3;33534:6;:27;;33505:9;:19;;:57;;;;;;;;;;;33207:363;;;:::o;53248:716::-;53411:4;53457:2;53432:45;;;53478:19;:17;:19::i;:::-;53499:4;53505:7;53514:5;53432:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53428:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53732:1;53715:6;:13;:18;53711:235;;53761:40;;;;;;;;;;;;;;53711:235;53904:6;53898:13;53889:6;53885:2;53881:15;53874:38;53428:529;53601:54;;;53591:64;;;:6;:64;;;;53584:71;;;53248:716;;;;;;:::o;40863:1529::-;40928:20;40951:13;;40928:36;;40993:1;40979:16;;:2;:16;;;40975:48;;41004:19;;;;;;;;;;;;;;40975:48;41050:1;41038:8;:13;41034:44;;41060:18;;;;;;;;;;;;;;41034:44;41091:61;41121:1;41125:2;41129:12;41143:8;41091:21;:61::i;:::-;41634:1;25002:2;41605:1;:25;;41604:31;41592:8;:44;41566:18;:22;41585:2;41566:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;41913:139;41950:2;42004:33;42027:1;42031:2;42035:1;42004:14;:33::i;:::-;41971:30;41992:8;41971:20;:30::i;:::-;:66;41913:18;:139::i;:::-;41879:17;:31;41897:12;41879:31;;;;;;;;;;;:173;;;;42069:15;42087:12;42069:30;;42114:11;42143:8;42128:12;:23;42114:37;;42166:101;42218:9;;;;;;42214:2;42193:35;;42210:1;42193:35;;;;;;;;;;;;42262:3;42252:7;:13;42166:101;;42299:3;42283:13;:19;;;;41340:974;;42324:60;42353:1;42357:2;42361:12;42375:8;42324:20;:60::i;:::-;40917:1475;40863:1529;;:::o;55623:147::-;55760:6;55623:147;;;;;:::o;36388:322::-;36458:14;36689:1;36679:8;36676:15;36651:23;36647:45;36637:55;;36388:322;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334: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:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:117::-;1983:1;1980;1973:12;1997:117;2106:1;2103;2096:12;2120:117;2229:1;2226;2219:12;2260:568;2333:8;2343:6;2393:3;2386:4;2378:6;2374:17;2370:27;2360:122;;2401:79;;:::i;:::-;2360:122;2514:6;2501:20;2491:30;;2544:18;2536:6;2533:30;2530:117;;;2566:79;;:::i;:::-;2530:117;2680:4;2672:6;2668:17;2656:29;;2734:3;2726:4;2718:6;2714:17;2704:8;2700:32;2697:41;2694:128;;;2741:79;;:::i;:::-;2694:128;2260:568;;;;;:::o;2834:704::-;2929:6;2937;2945;2994:2;2982:9;2973:7;2969:23;2965:32;2962:119;;;3000:79;;:::i;:::-;2962:119;3120:1;3145:53;3190:7;3181:6;3170:9;3166:22;3145:53;:::i;:::-;3135:63;;3091:117;3275:2;3264:9;3260:18;3247:32;3306:18;3298:6;3295:30;3292:117;;;3328:79;;:::i;:::-;3292:117;3441:80;3513:7;3504:6;3493:9;3489:22;3441:80;:::i;:::-;3423:98;;;;3218:313;2834:704;;;;;:::o;3544:99::-;3596:6;3630:5;3624:12;3614:22;;3544:99;;;:::o;3649:169::-;3733:11;3767:6;3762:3;3755:19;3807:4;3802:3;3798:14;3783:29;;3649:169;;;;:::o;3824:307::-;3892:1;3902:113;3916:6;3913:1;3910:13;3902:113;;;4001:1;3996:3;3992:11;3986:18;3982:1;3977:3;3973:11;3966:39;3938:2;3935:1;3931:10;3926:15;;3902:113;;;4033:6;4030:1;4027:13;4024:101;;;4113:1;4104:6;4099:3;4095:16;4088:27;4024:101;3873:258;3824:307;;;:::o;4137:102::-;4178:6;4229:2;4225:7;4220:2;4213:5;4209:14;4205:28;4195:38;;4137:102;;;:::o;4245:364::-;4333:3;4361:39;4394:5;4361:39;:::i;:::-;4416:71;4480:6;4475:3;4416:71;:::i;:::-;4409:78;;4496:52;4541:6;4536:3;4529:4;4522:5;4518:16;4496:52;:::i;:::-;4573:29;4595:6;4573:29;:::i;:::-;4568:3;4564:39;4557:46;;4337:272;4245:364;;;;:::o;4615:313::-;4728:4;4766:2;4755:9;4751:18;4743:26;;4815:9;4809:4;4805:20;4801:1;4790:9;4786:17;4779:47;4843:78;4916:4;4907:6;4843:78;:::i;:::-;4835:86;;4615:313;;;;:::o;4934:329::-;4993:6;5042:2;5030:9;5021:7;5017:23;5013:32;5010:119;;;5048:79;;:::i;:::-;5010:119;5168:1;5193:53;5238:7;5229:6;5218:9;5214:22;5193:53;:::i;:::-;5183:63;;5139:117;4934:329;;;;:::o;5269:126::-;5306:7;5346:42;5339:5;5335:54;5324:65;;5269:126;;;:::o;5401:96::-;5438:7;5467:24;5485:5;5467:24;:::i;:::-;5456:35;;5401:96;;;:::o;5503:118::-;5590:24;5608:5;5590:24;:::i;:::-;5585:3;5578:37;5503:118;;:::o;5627:222::-;5720:4;5758:2;5747:9;5743:18;5735:26;;5771:71;5839:1;5828:9;5824:17;5815:6;5771:71;:::i;:::-;5627:222;;;;:::o;5855:122::-;5928:24;5946:5;5928:24;:::i;:::-;5921:5;5918:35;5908:63;;5967:1;5964;5957:12;5908:63;5855:122;:::o;5983:139::-;6029:5;6067:6;6054:20;6045:29;;6083:33;6110:5;6083:33;:::i;:::-;5983:139;;;;:::o;6128:474::-;6196:6;6204;6253:2;6241:9;6232:7;6228:23;6224:32;6221:119;;;6259:79;;:::i;:::-;6221:119;6379:1;6404:53;6449:7;6440:6;6429:9;6425:22;6404:53;:::i;:::-;6394:63;;6350:117;6506:2;6532:53;6577:7;6568:6;6557:9;6553:22;6532:53;:::i;:::-;6522:63;;6477:118;6128:474;;;;;:::o;6608:118::-;6695:24;6713:5;6695:24;:::i;:::-;6690:3;6683:37;6608:118;;:::o;6732:222::-;6825:4;6863:2;6852:9;6848:18;6840:26;;6876:71;6944:1;6933:9;6929:17;6920:6;6876:71;:::i;:::-;6732:222;;;;:::o;6960:116::-;7030:21;7045:5;7030:21;:::i;:::-;7023:5;7020:32;7010:60;;7066:1;7063;7056:12;7010:60;6960:116;:::o;7082:133::-;7125:5;7163:6;7150:20;7141:29;;7179:30;7203:5;7179:30;:::i;:::-;7082:133;;;;:::o;7221:323::-;7277:6;7326:2;7314:9;7305:7;7301:23;7297:32;7294:119;;;7332:79;;:::i;:::-;7294:119;7452:1;7477:50;7519:7;7510:6;7499:9;7495:22;7477:50;:::i;:::-;7467:60;;7423:114;7221:323;;;;:::o;7550:329::-;7609:6;7658:2;7646:9;7637:7;7633:23;7629:32;7626:119;;;7664:79;;:::i;:::-;7626:119;7784:1;7809:53;7854:7;7845:6;7834:9;7830:22;7809:53;:::i;:::-;7799:63;;7755:117;7550:329;;;;:::o;7885:619::-;7962:6;7970;7978;8027:2;8015:9;8006:7;8002:23;7998:32;7995:119;;;8033:79;;:::i;:::-;7995:119;8153:1;8178:53;8223:7;8214:6;8203:9;8199:22;8178:53;:::i;:::-;8168:63;;8124:117;8280:2;8306:53;8351:7;8342:6;8331:9;8327:22;8306:53;:::i;:::-;8296:63;;8251:118;8408:2;8434:53;8479:7;8470:6;8459:9;8455:22;8434:53;:::i;:::-;8424:63;;8379:118;7885:619;;;;;:::o;8510:60::-;8538:3;8559:5;8552:12;;8510:60;;;:::o;8576:142::-;8626:9;8659:53;8677:34;8686:24;8704:5;8686:24;:::i;:::-;8677:34;:::i;:::-;8659:53;:::i;:::-;8646:66;;8576:142;;;:::o;8724:126::-;8774:9;8807:37;8838:5;8807:37;:::i;:::-;8794:50;;8724:126;;;:::o;8856:157::-;8937:9;8970:37;9001:5;8970:37;:::i;:::-;8957:50;;8856:157;;;:::o;9019:193::-;9137:68;9199:5;9137:68;:::i;:::-;9132:3;9125:81;9019:193;;:::o;9218:284::-;9342:4;9380:2;9369:9;9365:18;9357:26;;9393:102;9492:1;9481:9;9477:17;9468:6;9393:102;:::i;:::-;9218:284;;;;:::o;9508:474::-;9576:6;9584;9633:2;9621:9;9612:7;9608:23;9604:32;9601:119;;;9639:79;;:::i;:::-;9601:119;9759:1;9784:53;9829:7;9820:6;9809:9;9805:22;9784:53;:::i;:::-;9774:63;;9730:117;9886:2;9912:53;9957:7;9948:6;9937:9;9933:22;9912:53;:::i;:::-;9902:63;;9857:118;9508:474;;;;;:::o;9988:180::-;10036:77;10033:1;10026:88;10133:4;10130:1;10123:15;10157:4;10154:1;10147:15;10174:281;10257:27;10279:4;10257:27;:::i;:::-;10249:6;10245:40;10387:6;10375:10;10372:22;10351:18;10339:10;10336:34;10333:62;10330:88;;;10398:18;;:::i;:::-;10330:88;10438:10;10434:2;10427:22;10217:238;10174:281;;:::o;10461:129::-;10495:6;10522:20;;:::i;:::-;10512:30;;10551:33;10579:4;10571:6;10551:33;:::i;:::-;10461:129;;;:::o;10596:311::-;10673:4;10763:18;10755:6;10752:30;10749:56;;;10785:18;;:::i;:::-;10749:56;10835:4;10827:6;10823:17;10815:25;;10895:4;10889;10885:15;10877:23;;10596:311;;;:::o;10930:710::-;11026:5;11051:81;11067:64;11124:6;11067:64;:::i;:::-;11051:81;:::i;:::-;11042:90;;11152:5;11181:6;11174:5;11167:21;11215:4;11208:5;11204:16;11197:23;;11268:4;11260:6;11256:17;11248:6;11244:30;11297:3;11289:6;11286:15;11283:122;;;11316:79;;:::i;:::-;11283:122;11431:6;11414:220;11448:6;11443:3;11440:15;11414:220;;;11523:3;11552:37;11585:3;11573:10;11552:37;:::i;:::-;11547:3;11540:50;11619:4;11614:3;11610:14;11603:21;;11490:144;11474:4;11469:3;11465:14;11458:21;;11414:220;;;11418:21;11032:608;;10930:710;;;;;:::o;11663:370::-;11734:5;11783:3;11776:4;11768:6;11764:17;11760:27;11750:122;;11791:79;;:::i;:::-;11750:122;11908:6;11895:20;11933:94;12023:3;12015:6;12008:4;12000:6;11996:17;11933:94;:::i;:::-;11924:103;;11740:293;11663:370;;;;:::o;12039:539::-;12123:6;12172:2;12160:9;12151:7;12147:23;12143:32;12140:119;;;12178:79;;:::i;:::-;12140:119;12326:1;12315:9;12311:17;12298:31;12356:18;12348:6;12345:30;12342:117;;;12378:79;;:::i;:::-;12342:117;12483:78;12553:7;12544:6;12533:9;12529:22;12483:78;:::i;:::-;12473:88;;12269:302;12039:539;;;;:::o;12584:145::-;12682:6;12716:5;12710:12;12700:22;;12584:145;;;:::o;12735:215::-;12865:11;12899:6;12894:3;12887:19;12939:4;12934:3;12930:14;12915:29;;12735:215;;;;:::o;12956:163::-;13054:4;13077:3;13069:11;;13107:4;13102:3;13098:14;13090:22;;12956:163;;;:::o;13125:108::-;13202:24;13220:5;13202:24;:::i;:::-;13197:3;13190:37;13125:108;;:::o;13239:101::-;13275:7;13315:18;13308:5;13304:30;13293:41;;13239:101;;;:::o;13346:105::-;13421:23;13438:5;13421:23;:::i;:::-;13416:3;13409:36;13346:105;;:::o;13457:99::-;13528:21;13543:5;13528:21;:::i;:::-;13523:3;13516:34;13457:99;;:::o;13562:91::-;13598:7;13638:8;13631:5;13627:20;13616:31;;13562:91;;;:::o;13659:105::-;13734:23;13751:5;13734:23;:::i;:::-;13729:3;13722:36;13659:105;;:::o;13842:864::-;13991:4;13986:3;13982:14;14078:4;14071:5;14067:16;14061:23;14097:63;14154:4;14149:3;14145:14;14131:12;14097:63;:::i;:::-;14006:164;14262:4;14255:5;14251:16;14245:23;14281:61;14336:4;14331:3;14327:14;14313:12;14281:61;:::i;:::-;14180:172;14436:4;14429:5;14425:16;14419:23;14455:57;14506:4;14501:3;14497:14;14483:12;14455:57;:::i;:::-;14362:160;14609:4;14602:5;14598:16;14592:23;14628:61;14683:4;14678:3;14674:14;14660:12;14628:61;:::i;:::-;14532:167;13960:746;13842:864;;:::o;14712:303::-;14843:10;14864:108;14968:3;14960:6;14864:108;:::i;:::-;15004:4;14999:3;14995:14;14981:28;;14712:303;;;;:::o;15021:144::-;15122:4;15154;15149:3;15145:14;15137:22;;15021:144;;;:::o;15247:980::-;15428:3;15457:85;15536:5;15457:85;:::i;:::-;15558:117;15668:6;15663:3;15558:117;:::i;:::-;15551:124;;15699:87;15780:5;15699:87;:::i;:::-;15809:7;15840:1;15825:377;15850:6;15847:1;15844:13;15825:377;;;15926:6;15920:13;15953:125;16074:3;16059:13;15953:125;:::i;:::-;15946:132;;16101:91;16185:6;16101:91;:::i;:::-;16091:101;;15885:317;15872:1;15869;15865:9;15860:14;;15825:377;;;15829:14;16218:3;16211:10;;15433:794;;;15247:980;;;;:::o;16233:497::-;16438:4;16476:2;16465:9;16461:18;16453:26;;16525:9;16519:4;16515:20;16511:1;16500:9;16496:17;16489:47;16553:170;16718:4;16709:6;16553:170;:::i;:::-;16545:178;;16233:497;;;;:::o;16736:117::-;16845:1;16842;16835:12;16859:308;16921:4;17011:18;17003:6;17000:30;16997:56;;;17033:18;;:::i;:::-;16997:56;17071:29;17093:6;17071:29;:::i;:::-;17063:37;;17155:4;17149;17145:15;17137:23;;16859:308;;;:::o;17173:154::-;17257:6;17252:3;17247;17234:30;17319:1;17310:6;17305:3;17301:16;17294:27;17173:154;;;:::o;17333:412::-;17411:5;17436:66;17452:49;17494:6;17452:49;:::i;:::-;17436:66;:::i;:::-;17427:75;;17525:6;17518:5;17511:21;17563:4;17556:5;17552:16;17601:3;17592:6;17587:3;17583:16;17580:25;17577:112;;;17608:79;;:::i;:::-;17577:112;17698:41;17732:6;17727:3;17722;17698:41;:::i;:::-;17417:328;17333:412;;;;;:::o;17765:340::-;17821:5;17870:3;17863:4;17855:6;17851:17;17847:27;17837:122;;17878:79;;:::i;:::-;17837:122;17995:6;17982:20;18020:79;18095:3;18087:6;18080:4;18072:6;18068:17;18020:79;:::i;:::-;18011:88;;17827:278;17765:340;;;;:::o;18111:509::-;18180:6;18229:2;18217:9;18208:7;18204:23;18200:32;18197:119;;;18235:79;;:::i;:::-;18197:119;18383:1;18372:9;18368:17;18355:31;18413:18;18405:6;18402:30;18399:117;;;18435:79;;:::i;:::-;18399:117;18540:63;18595:7;18586:6;18575:9;18571:22;18540:63;:::i;:::-;18530:73;;18326:287;18111:509;;;;:::o;18626:114::-;18693:6;18727:5;18721:12;18711:22;;18626:114;;;:::o;18746:184::-;18845:11;18879:6;18874:3;18867:19;18919:4;18914:3;18910:14;18895:29;;18746:184;;;;:::o;18936:132::-;19003:4;19026:3;19018:11;;19056:4;19051:3;19047:14;19039:22;;18936:132;;;:::o;19074:108::-;19151:24;19169:5;19151:24;:::i;:::-;19146:3;19139:37;19074:108;;:::o;19188:179::-;19257:10;19278:46;19320:3;19312:6;19278:46;:::i;:::-;19356:4;19351:3;19347:14;19333:28;;19188:179;;;;:::o;19373:113::-;19443:4;19475;19470:3;19466:14;19458:22;;19373:113;;;:::o;19522:732::-;19641:3;19670:54;19718:5;19670:54;:::i;:::-;19740:86;19819:6;19814:3;19740:86;:::i;:::-;19733:93;;19850:56;19900:5;19850:56;:::i;:::-;19929:7;19960:1;19945:284;19970:6;19967:1;19964:13;19945:284;;;20046:6;20040:13;20073:63;20132:3;20117:13;20073:63;:::i;:::-;20066:70;;20159:60;20212:6;20159:60;:::i;:::-;20149:70;;20005:224;19992:1;19989;19985:9;19980:14;;19945:284;;;19949:14;20245:3;20238:10;;19646:608;;;19522:732;;;;:::o;20260:373::-;20403:4;20441:2;20430:9;20426:18;20418:26;;20490:9;20484:4;20480:20;20476:1;20465:9;20461:17;20454:47;20518:108;20621:4;20612:6;20518:108;:::i;:::-;20510:116;;20260:373;;;;:::o;20639:619::-;20716:6;20724;20732;20781:2;20769:9;20760:7;20756:23;20752:32;20749:119;;;20787:79;;:::i;:::-;20749:119;20907:1;20932:53;20977:7;20968:6;20957:9;20953:22;20932:53;:::i;:::-;20922:63;;20878:117;21034:2;21060:53;21105:7;21096:6;21085:9;21081:22;21060:53;:::i;:::-;21050:63;;21005:118;21162:2;21188:53;21233:7;21224:6;21213:9;21209:22;21188:53;:::i;:::-;21178:63;;21133:118;20639:619;;;;;:::o;21264:468::-;21329:6;21337;21386:2;21374:9;21365:7;21361:23;21357:32;21354:119;;;21392:79;;:::i;:::-;21354:119;21512:1;21537:53;21582:7;21573:6;21562:9;21558:22;21537:53;:::i;:::-;21527:63;;21483:117;21639:2;21665:50;21707:7;21698:6;21687:9;21683:22;21665:50;:::i;:::-;21655:60;;21610:115;21264:468;;;;;:::o;21738:307::-;21799:4;21889:18;21881:6;21878:30;21875:56;;;21911:18;;:::i;:::-;21875:56;21949:29;21971:6;21949:29;:::i;:::-;21941:37;;22033:4;22027;22023:15;22015:23;;21738:307;;;:::o;22051:410::-;22128:5;22153:65;22169:48;22210:6;22169:48;:::i;:::-;22153:65;:::i;:::-;22144:74;;22241:6;22234:5;22227:21;22279:4;22272:5;22268:16;22317:3;22308:6;22303:3;22299:16;22296:25;22293:112;;;22324:79;;:::i;:::-;22293:112;22414:41;22448:6;22443:3;22438;22414:41;:::i;:::-;22134:327;22051:410;;;;;:::o;22480:338::-;22535:5;22584:3;22577:4;22569:6;22565:17;22561:27;22551:122;;22592:79;;:::i;:::-;22551:122;22709:6;22696:20;22734:78;22808:3;22800:6;22793:4;22785:6;22781:17;22734:78;:::i;:::-;22725:87;;22541:277;22480:338;;;;:::o;22824:943::-;22919:6;22927;22935;22943;22992:3;22980:9;22971:7;22967:23;22963:33;22960:120;;;22999:79;;:::i;:::-;22960:120;23119:1;23144:53;23189:7;23180:6;23169:9;23165:22;23144:53;:::i;:::-;23134:63;;23090:117;23246:2;23272:53;23317:7;23308:6;23297:9;23293:22;23272:53;:::i;:::-;23262:63;;23217:118;23374:2;23400:53;23445:7;23436:6;23425:9;23421:22;23400:53;:::i;:::-;23390:63;;23345:118;23530:2;23519:9;23515:18;23502:32;23561:18;23553:6;23550:30;23547:117;;;23583:79;;:::i;:::-;23547:117;23688:62;23742:7;23733:6;23722:9;23718:22;23688:62;:::i;:::-;23678:72;;23473:287;22824:943;;;;;;;:::o;23845:874::-;24004:4;23999:3;23995:14;24091:4;24084:5;24080:16;24074:23;24110:63;24167:4;24162:3;24158:14;24144:12;24110:63;:::i;:::-;24019:164;24275:4;24268:5;24264:16;24258:23;24294:61;24349:4;24344:3;24340:14;24326:12;24294:61;:::i;:::-;24193:172;24449:4;24442:5;24438:16;24432:23;24468:57;24519:4;24514:3;24510:14;24496:12;24468:57;:::i;:::-;24375:160;24622:4;24615:5;24611:16;24605:23;24641:61;24696:4;24691:3;24687:14;24673:12;24641:61;:::i;:::-;24545:167;23973:746;23845:874;;:::o;24725:347::-;24880:4;24918:3;24907:9;24903:19;24895:27;;24932:133;25062:1;25051:9;25047:17;25038:6;24932:133;:::i;:::-;24725:347;;;;:::o;25078:474::-;25146:6;25154;25203:2;25191:9;25182:7;25178:23;25174:32;25171:119;;;25209:79;;:::i;:::-;25171:119;25329:1;25354:53;25399:7;25390:6;25379:9;25375:22;25354:53;:::i;:::-;25344:63;;25300:117;25456:2;25482:53;25527:7;25518:6;25507:9;25503:22;25482:53;:::i;:::-;25472:63;;25427:118;25078:474;;;;;:::o;25558:180::-;25606:77;25603:1;25596:88;25703:4;25700:1;25693:15;25727:4;25724:1;25717:15;25744:305;25784:3;25803:20;25821:1;25803:20;:::i;:::-;25798:25;;25837:20;25855:1;25837:20;:::i;:::-;25832:25;;25991:1;25923:66;25919:74;25916:1;25913:81;25910:107;;;25997:18;;:::i;:::-;25910:107;26041:1;26038;26034:9;26027:16;;25744:305;;;;:::o;26055:170::-;26195:22;26191:1;26183:6;26179:14;26172:46;26055:170;:::o;26231:366::-;26373:3;26394:67;26458:2;26453:3;26394:67;:::i;:::-;26387:74;;26470:93;26559:3;26470:93;:::i;:::-;26588:2;26583:3;26579:12;26572:19;;26231:366;;;:::o;26603:419::-;26769:4;26807:2;26796:9;26792:18;26784:26;;26856:9;26850:4;26846:20;26842:1;26831:9;26827:17;26820:47;26884:131;27010:4;26884:131;:::i;:::-;26876:139;;26603:419;;;:::o;27028:180::-;27076:77;27073:1;27066:88;27173:4;27170:1;27163:15;27197:4;27194:1;27187:15;27214:233;27253:3;27276:24;27294:5;27276:24;:::i;:::-;27267:33;;27322:66;27315:5;27312:77;27309:103;;27392:18;;:::i;:::-;27309:103;27439:1;27432:5;27428:13;27421:20;;27214:233;;;:::o;27453:180::-;27501:77;27498:1;27491:88;27598:4;27595:1;27588:15;27622:4;27619:1;27612:15;27639:320;27683:6;27720:1;27714:4;27710:12;27700:22;;27767:1;27761:4;27757:12;27788:18;27778:81;;27844:4;27836:6;27832:17;27822:27;;27778:81;27906:2;27898:6;27895:14;27875:18;27872:38;27869:84;;27925:18;;:::i;:::-;27869:84;27690:269;27639:320;;;:::o;27965:181::-;28105:33;28101:1;28093:6;28089:14;28082:57;27965:181;:::o;28152:366::-;28294:3;28315:67;28379:2;28374:3;28315:67;:::i;:::-;28308:74;;28391:93;28480:3;28391:93;:::i;:::-;28509:2;28504:3;28500:12;28493:19;;28152:366;;;:::o;28524:419::-;28690:4;28728:2;28717:9;28713:18;28705:26;;28777:9;28771:4;28767:20;28763:1;28752:9;28748:17;28741:47;28805:131;28931:4;28805:131;:::i;:::-;28797:139;;28524:419;;;:::o;28949:147::-;29050:11;29087:3;29072:18;;28949:147;;;;:::o;29102:114::-;;:::o;29222:398::-;29381:3;29402:83;29483:1;29478:3;29402:83;:::i;:::-;29395:90;;29494:93;29583:3;29494:93;:::i;:::-;29612:1;29607:3;29603:11;29596:18;;29222:398;;;:::o;29626:379::-;29810:3;29832:147;29975:3;29832:147;:::i;:::-;29825:154;;29996:3;29989:10;;29626:379;;;:::o;30011:181::-;30151:33;30147:1;30139:6;30135:14;30128:57;30011:181;:::o;30198:366::-;30340:3;30361:67;30425:2;30420:3;30361:67;:::i;:::-;30354:74;;30437:93;30526:3;30437:93;:::i;:::-;30555:2;30550:3;30546:12;30539:19;;30198:366;;;:::o;30570:419::-;30736:4;30774:2;30763:9;30759:18;30751:26;;30823:9;30817:4;30813:20;30809:1;30798:9;30794:17;30787:47;30851:131;30977:4;30851:131;:::i;:::-;30843:139;;30570:419;;;:::o;30995:173::-;31135:25;31131:1;31123:6;31119:14;31112:49;30995:173;:::o;31174:366::-;31316:3;31337:67;31401:2;31396:3;31337:67;:::i;:::-;31330:74;;31413:93;31502:3;31413:93;:::i;:::-;31531:2;31526:3;31522:12;31515:19;;31174:366;;;:::o;31546:419::-;31712:4;31750:2;31739:9;31735:18;31727:26;;31799:9;31793:4;31789:20;31785:1;31774:9;31770:17;31763:47;31827:131;31953:4;31827:131;:::i;:::-;31819:139;;31546:419;;;:::o;31971:170::-;32111:22;32107:1;32099:6;32095:14;32088:46;31971:170;:::o;32147:366::-;32289:3;32310:67;32374:2;32369:3;32310:67;:::i;:::-;32303:74;;32386:93;32475:3;32386:93;:::i;:::-;32504:2;32499:3;32495:12;32488:19;;32147:366;;;:::o;32519:419::-;32685:4;32723:2;32712:9;32708:18;32700:26;;32772:9;32766:4;32762:20;32758:1;32747:9;32743:17;32736:47;32800:131;32926:4;32800:131;:::i;:::-;32792:139;;32519:419;;;:::o;32944:174::-;33084:26;33080:1;33072:6;33068:14;33061:50;32944:174;:::o;33124:366::-;33266:3;33287:67;33351:2;33346:3;33287:67;:::i;:::-;33280:74;;33363:93;33452:3;33363:93;:::i;:::-;33481:2;33476:3;33472:12;33465:19;;33124:366;;;:::o;33496:419::-;33662:4;33700:2;33689:9;33685:18;33677:26;;33749:9;33743:4;33739:20;33735:1;33724:9;33720:17;33713:47;33777:131;33903:4;33777:131;:::i;:::-;33769:139;;33496:419;;;:::o;33921:176::-;34061:28;34057:1;34049:6;34045:14;34038:52;33921:176;:::o;34103:366::-;34245:3;34266:67;34330:2;34325:3;34266:67;:::i;:::-;34259:74;;34342:93;34431:3;34342:93;:::i;:::-;34460:2;34455:3;34451:12;34444:19;;34103:366;;;:::o;34475:419::-;34641:4;34679:2;34668:9;34664:18;34656:26;;34728:9;34722:4;34718:20;34714:1;34703:9;34699:17;34692:47;34756:131;34882:4;34756:131;:::i;:::-;34748:139;;34475:419;;;:::o;34900:191::-;34940:4;34960:20;34978:1;34960:20;:::i;:::-;34955:25;;34994:20;35012:1;34994:20;:::i;:::-;34989:25;;35033:1;35030;35027:8;35024:34;;;35038:18;;:::i;:::-;35024:34;35083:1;35080;35076:9;35068:17;;34900:191;;;;:::o;35097:348::-;35137:7;35160:20;35178:1;35160:20;:::i;:::-;35155:25;;35194:20;35212:1;35194:20;:::i;:::-;35189:25;;35382:1;35314:66;35310:74;35307:1;35304:81;35299:1;35292:9;35285:17;35281:105;35278:131;;;35389:18;;:::i;:::-;35278:131;35437:1;35434;35430:9;35419:20;;35097:348;;;;:::o;35451:169::-;35591:21;35587:1;35579:6;35575:14;35568:45;35451:169;:::o;35626:366::-;35768:3;35789:67;35853:2;35848:3;35789:67;:::i;:::-;35782:74;;35865:93;35954:3;35865:93;:::i;:::-;35983:2;35978:3;35974:12;35967:19;;35626:366;;;:::o;35998:419::-;36164:4;36202:2;36191:9;36187:18;36179:26;;36251:9;36245:4;36241:20;36237:1;36226:9;36222:17;36215:47;36279:131;36405:4;36279:131;:::i;:::-;36271:139;;35998:419;;;:::o;36423:234::-;36563:34;36559:1;36551:6;36547:14;36540:58;36632:17;36627:2;36619:6;36615:15;36608:42;36423:234;:::o;36663:366::-;36805:3;36826:67;36890:2;36885:3;36826:67;:::i;:::-;36819:74;;36902:93;36991:3;36902:93;:::i;:::-;37020:2;37015:3;37011:12;37004:19;;36663:366;;;:::o;37035:419::-;37201:4;37239:2;37228:9;37224:18;37216:26;;37288:9;37282:4;37278:20;37274:1;37263:9;37259:17;37252:47;37316:131;37442:4;37316:131;:::i;:::-;37308:139;;37035:419;;;:::o;37460:148::-;37562:11;37599:3;37584:18;;37460:148;;;;:::o;37614:377::-;37720:3;37748:39;37781:5;37748:39;:::i;:::-;37803:89;37885:6;37880:3;37803:89;:::i;:::-;37796:96;;37901:52;37946:6;37941:3;37934:4;37927:5;37923:16;37901:52;:::i;:::-;37978:6;37973:3;37969:16;37962:23;;37724:267;37614:377;;;;:::o;37997:141::-;38046:4;38069:3;38061:11;;38092:3;38089:1;38082:14;38126:4;38123:1;38113:18;38105:26;;37997:141;;;:::o;38168:845::-;38271:3;38308:5;38302:12;38337:36;38363:9;38337:36;:::i;:::-;38389:89;38471:6;38466:3;38389:89;:::i;:::-;38382:96;;38509:1;38498:9;38494:17;38525:1;38520:137;;;;38671:1;38666:341;;;;38487:520;;38520:137;38604:4;38600:9;38589;38585:25;38580:3;38573:38;38640:6;38635:3;38631:16;38624:23;;38520:137;;38666:341;38733:38;38765:5;38733:38;:::i;:::-;38793:1;38807:154;38821:6;38818:1;38815:13;38807:154;;;38895:7;38889:14;38885:1;38880:3;38876:11;38869:35;38945:1;38936:7;38932:15;38921:26;;38843:4;38840:1;38836:12;38831:17;;38807:154;;;38990:6;38985:3;38981:16;38974:23;;38673:334;;38487:520;;38275:738;;38168:845;;;;:::o;39019:589::-;39244:3;39266:95;39357:3;39348:6;39266:95;:::i;:::-;39259:102;;39378:95;39469:3;39460:6;39378:95;:::i;:::-;39371:102;;39490:92;39578:3;39569:6;39490:92;:::i;:::-;39483:99;;39599:3;39592:10;;39019:589;;;;;;:::o;39614:225::-;39754:34;39750:1;39742:6;39738:14;39731:58;39823:8;39818:2;39810:6;39806:15;39799:33;39614:225;:::o;39845:366::-;39987:3;40008:67;40072:2;40067:3;40008:67;:::i;:::-;40001:74;;40084:93;40173:3;40084:93;:::i;:::-;40202:2;40197:3;40193:12;40186:19;;39845:366;;;:::o;40217:419::-;40383:4;40421:2;40410:9;40406:18;40398:26;;40470:9;40464:4;40460:20;40456:1;40445:9;40441:17;40434:47;40498:131;40624:4;40498:131;:::i;:::-;40490:139;;40217:419;;;:::o;40642:182::-;40782:34;40778:1;40770:6;40766:14;40759:58;40642:182;:::o;40830:366::-;40972:3;40993:67;41057:2;41052:3;40993:67;:::i;:::-;40986:74;;41069:93;41158:3;41069:93;:::i;:::-;41187:2;41182:3;41178:12;41171:19;;40830:366;;;:::o;41202:419::-;41368:4;41406:2;41395:9;41391:18;41383:26;;41455:9;41449:4;41445:20;41441:1;41430:9;41426:17;41419:47;41483:131;41609:4;41483:131;:::i;:::-;41475:139;;41202:419;;;:::o;41627:332::-;41748:4;41786:2;41775:9;41771:18;41763:26;;41799:71;41867:1;41856:9;41852:17;41843:6;41799:71;:::i;:::-;41880:72;41948:2;41937:9;41933:18;41924:6;41880:72;:::i;:::-;41627:332;;;;;:::o;41965:137::-;42019:5;42050:6;42044:13;42035:22;;42066:30;42090:5;42066:30;:::i;:::-;41965:137;;;;:::o;42108:345::-;42175:6;42224:2;42212:9;42203:7;42199:23;42195:32;42192:119;;;42230:79;;:::i;:::-;42192:119;42350:1;42375:61;42428:7;42419:6;42408:9;42404:22;42375:61;:::i;:::-;42365:71;;42321:125;42108:345;;;;:::o;42459:180::-;42507:77;42504:1;42497:88;42604:4;42601:1;42594:15;42628:4;42625:1;42618:15;42645:185;42685:1;42702:20;42720:1;42702:20;:::i;:::-;42697:25;;42736:20;42754:1;42736:20;:::i;:::-;42731:25;;42775:1;42765:35;;42780:18;;:::i;:::-;42765:35;42822:1;42819;42815:9;42810:14;;42645:185;;;;:::o;42836:176::-;42868:1;42885:20;42903:1;42885:20;:::i;:::-;42880:25;;42919:20;42937:1;42919:20;:::i;:::-;42914:25;;42958:1;42948:35;;42963:18;;:::i;:::-;42948:35;43004:1;43001;42997:9;42992:14;;42836:176;;;;:::o;43018:98::-;43069:6;43103:5;43097:12;43087:22;;43018:98;;;:::o;43122:168::-;43205:11;43239:6;43234:3;43227:19;43279:4;43274:3;43270:14;43255:29;;43122:168;;;;:::o;43296:360::-;43382:3;43410:38;43442:5;43410:38;:::i;:::-;43464:70;43527:6;43522:3;43464:70;:::i;:::-;43457:77;;43543:52;43588:6;43583:3;43576:4;43569:5;43565:16;43543:52;:::i;:::-;43620:29;43642:6;43620:29;:::i;:::-;43615:3;43611:39;43604:46;;43386:270;43296:360;;;;:::o;43662:640::-;43857:4;43895:3;43884:9;43880:19;43872:27;;43909:71;43977:1;43966:9;43962:17;43953:6;43909:71;:::i;:::-;43990:72;44058:2;44047:9;44043:18;44034:6;43990:72;:::i;:::-;44072;44140:2;44129:9;44125:18;44116:6;44072:72;:::i;:::-;44191:9;44185:4;44181:20;44176:2;44165:9;44161:18;44154:48;44219:76;44290:4;44281:6;44219:76;:::i;:::-;44211:84;;43662:640;;;;;;;:::o;44308:141::-;44364:5;44395:6;44389:13;44380:22;;44411:32;44437:5;44411:32;:::i;:::-;44308:141;;;;:::o;44455:349::-;44524:6;44573:2;44561:9;44552:7;44548:23;44544:32;44541:119;;;44579:79;;:::i;:::-;44541:119;44699:1;44724:63;44779:7;44770:6;44759:9;44755:22;44724:63;:::i;:::-;44714:73;;44670:127;44455:349;;;;:::o
Swarm Source
ipfs://53b1df9833934c2ff3b6659cf405d540081534d0881c816891ed752b196d848b
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.