Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
3,798 LLTLL
Holders
1,272
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 LLTLLLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LoveLoves
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-01 */ // //██▓ ▒█████ ██▒ █▓▓█████ ██▓ ▒█████ ██▒ █▓▓█████ ██████ ▄▄▄█████▓ ▒█████ ██▓ ▒█████ ██▒ █▓▓█████ ██▓ ▒█████ ██▒ █▓▓█████ //▓██▒ ▒██▒ ██▒▓██░ █▒▓█ ▀ ▓██▒ ▒██▒ ██▒▓██░ █▒▓█ ▀ ▒██ ▒ ▓ ██▒ ▓▒▒██▒ ██▒ ▓██▒ ▒██▒ ██▒▓██░ █▒▓█ ▀ ▓██▒ ▒██▒ ██▒▓██░ █▒▓█ ▀ //▒██░ ▒██░ ██▒ ▓██ █▒░▒███ ▒██░ ▒██░ ██▒ ▓██ █▒░▒███ ░ ▓██▄ ▒ ▓██░ ▒░▒██░ ██▒ ▒██░ ▒██░ ██▒ ▓██ █▒░▒███ ▒██░ ▒██░ ██▒ ▓██ █▒░▒███ //▒██░ ▒██ ██░ ▒██ █░░▒▓█ ▄ ▒██░ ▒██ ██░ ▒██ █░░▒▓█ ▄ ▒ ██▒ ░ ▓██▓ ░ ▒██ ██░ ▒██░ ▒██ ██░ ▒██ █░░▒▓█ ▄ ▒██░ ▒██ ██░ ▒██ █░░▒▓█ ▄ //░██████▒░ ████▓▒░ ▒▀█░ ░▒████▒ ░██████▒░ ████▓▒░ ▒▀█░ ░▒████▒▒██████▒▒ ▒██▒ ░ ░ ████▓▒░ ░██████▒░ ████▓▒░ ▒▀█░ ░▒████▒ ░██████▒░ ████▓▒░ ▒▀█░ ░▒████▒ //░ ▒░▓ ░░ ▒░▒░▒░ ░ ▐░ ░░ ▒░ ░ ░ ▒░▓ ░░ ▒░▒░▒░ ░ ▐░ ░░ ▒░ ░▒ ▒▓▒ ▒ ░ ▒ ░░ ░ ▒░▒░▒░ ░ ▒░▓ ░░ ▒░▒░▒░ ░ ▐░ ░░ ▒░ ░ ░ ▒░▓ ░░ ▒░▒░▒░ ░ ▐░ ░░ ▒░ ░ //░ ░ ▒ ░ ░ ▒ ▒░ ░ ░░ ░ ░ ░ ░ ░ ▒ ░ ░ ▒ ▒░ ░ ░░ ░ ░ ░░ ░▒ ░ ░ ░ ░ ▒ ▒░ ░ ░ ▒ ░ ░ ▒ ▒░ ░ ░░ ░ ░ ░ ░ ░ ▒ ░ ░ ▒ ▒░ ░ ░░ ░ ░ ░ //░ ░ ░ ░ ░ ▒ ░░ ░ ░ ░ ░ ░ ░ ▒ ░░ ░ ░ ░ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░░ ░ ░ ░ ░ ░ ░ ▒ ░░ ░ //░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ //░ ░ ░ ░ // // 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); } // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // 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); } // 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; } } } // 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; } } // 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); } } // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } pragma solidity >=0.7.0 <0.9.0; contract LoveLoves is ERC721AQueryable, Ownable { enum Status { Paused, Preminting, Started } Status public status = Status.Paused; bytes32 public root; string public baseURI; string public boxURI; uint256 public MAX_MINT_PER_ADDR = 5; uint256 public MAX_PREMINT_PER_ADDR = 2; uint256 public constant MAX_FREEMINT_PER_ADDR = 1; uint256 public constant teamSupply = 500; uint256 public freeSupply = 2500; uint256 public maxSupply = 5555; uint256 public freeMinted = 0; uint256 public price = 6900000000000000; event Minted(address minter, uint256 amount); constructor() ERC721A("love loves", "LLTLL") {} function _startTokenId() internal pure override returns (uint256) { return 1; } function _baseURI() internal view override returns (string memory) { return baseURI; } function tokenURI(uint256 tokenId) public view override returns (string memory) { return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId), ".json")) : boxURI; } function mint(uint256 quantity) external payable { require(status == Status.Started, "Not minting"); require(tx.origin == msg.sender, "Contract call not allowed"); require(totalSupply() + quantity <= maxSupply, "Hearts exceed"); require( numberMinted(msg.sender) + quantity <= MAX_MINT_PER_ADDR, "Hearts exceed" ); require(quantity > 0, "One heart at least"); uint256 nonFreeMintQuantity = quantity; if ( numberMinted(msg.sender) < MAX_FREEMINT_PER_ADDR && freeMinted < freeSupply ) { nonFreeMintQuantity = quantity - MAX_FREEMINT_PER_ADDR; freeMinted += MAX_FREEMINT_PER_ADDR; } checkPrice(price * nonFreeMintQuantity); _safeMint(msg.sender, quantity); emit Minted(msg.sender, quantity); } function checkPrice(uint256 amount) private { require(msg.value >= amount, "Need to send more ETH"); } function allowlistMint(bytes32[] memory _proof, uint256 quantity) external payable { require(status == Status.Preminting, "Not preminting"); require(tx.origin == msg.sender, "Contract call not allowed"); require(_verify(_leaf(msg.sender), _proof), "Not allowlisted"); require( numberMinted(msg.sender) + quantity <= MAX_PREMINT_PER_ADDR, "Hearts exceed" ); freeMint(quantity); } function devMint(uint256 quantity) external payable onlyOwner { require( numberMinted(msg.sender) + quantity <= teamSupply, "Hearts exceed" ); require(totalSupply() + quantity <= teamSupply, "Hearts exceed"); freeMint(quantity); } function freeMint(uint256 quantity) private { require(freeMinted + quantity <= freeSupply, "Free hearts exceed"); _safeMint(msg.sender, quantity); freeMinted += quantity; emit Minted(msg.sender, quantity); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function withdraw() public payable onlyOwner { payable(owner()).transfer(address(this).balance); } function setBaseURI(string calldata uri) public onlyOwner { baseURI = uri; } function setBoxURI(string calldata uri) public onlyOwner { boxURI = uri; } function setPrice(uint256 newPrice) public onlyOwner { price = newPrice; } function setAmount(uint256[] calldata amounts) public onlyOwner { MAX_MINT_PER_ADDR = amounts[0]; MAX_PREMINT_PER_ADDR = amounts[1]; } function decreaseMaxSupply(uint256 supply) public onlyOwner { require( supply <= maxSupply, "Max supply must be less than or equal to max supply" ); maxSupply = supply; } function setFreeSupply(uint256 supply) public onlyOwner { require( supply <= maxSupply, "Free supply must be less than or equal to max supply" ); freeSupply = supply; } function setStatus(Status newStatus) public onlyOwner { status = newStatus; } function setRoot(uint256 _root) public onlyOwner { root = bytes32(_root); } function _leaf(address account) internal pure returns (bytes32) { return keccak256(abi.encodePacked(account)); } function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool) { return MerkleProof.verify(proof, root, leaf); } }
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":[],"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":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_FREEMINT_PER_ADDR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_ADDR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PREMINT_PER_ADDR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boxURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"decreaseMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"payable","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":[],"name":"freeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"setAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBoxURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_root","type":"uint256"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum LoveLoves.Status","name":"newStatus","type":"uint8"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"enum LoveLoves.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526000600860146101000a81548160ff021916908360028111156200002d576200002c620002ff565b5b02179055506005600c556002600d556109c4600e556115b3600f5560006010556618838370f340006011553480156200006557600080fd5b506040518060400160405280600a81526020017f6c6f7665206c6f766573000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4c4c544c4c0000000000000000000000000000000000000000000000000000008152508160029080519060200190620000ea92919062000219565b5080600390805190602001906200010392919062000219565b50620001146200014260201b60201c565b60008190555050506200013c620001306200014b60201b60201c565b6200015360201b60201c565b6200035d565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200022790620002c9565b90600052602060002090601f0160209004810192826200024b576000855562000297565b82601f106200026657805160ff191683800117855562000297565b8280016001018555821562000297579182015b828111156200029657825182559160200191906001019062000279565b5b509050620002a69190620002aa565b5090565b5b80821115620002c5576000816000905550600101620002ab565b5090565b60006002820490506001821680620002e257607f821691505b60208210811415620002f957620002f86200032e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61470b806200036d6000396000f3fe60806040526004361061027d5760003560e01c80638462151c1161014f578063c23dc68f116100c1578063ebf0c7171161007a578063ebf0c7171461098a578063f2184d0c146109b5578063f2917850146109de578063f2f5a7e514610a09578063f2fde38b14610a32578063f676308a14610a5b5761027d565b8063c23dc68f14610840578063c87b56dd1461087d578063d10a1a2b146108ba578063d5abeb01146108e5578063dc33e68114610910578063e985e9c51461094d5761027d565b806399a2557a1161011357806399a2557a14610741578063a035b1fe1461077e578063a0712d68146107a9578063a22cb465146107c5578063b88d4fde146107ee578063b99b8f00146108175761027d565b80638462151c1461065c5780638da5cb5b1461069957806391b7f5ed146106c457806391ff4a73146106ed57806395d89b41146107165761027d565b80632cfac6ec116101f357806355f804b3116101ac57806355f804b31461053a5780635bbb2177146105635780636352211e146105a05780636c0360eb146105dd57806370a0823114610608578063715018a6146106455761027d565b80632cfac6ec1461046c5780632e49d78b1461049757806331a72cc6146104c0578063375a069a146104eb5780633ccfd60b1461050757806342842e0e146105115761027d565b80631338a83f116102455780631338a83f1461037b578063161548621461039757806318160ddd146103c2578063200d2ed2146103ed57806323b872dd1461041857806324a6ab0c146104415761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780630faa689614610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906134e8565b610a84565b6040516102b69190613c33565b60405180910390f35b3480156102cb57600080fd5b506102d4610b16565b6040516102e19190613c84565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c91906135bc565b610ba8565b60405161031e9190613b5f565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613363565b610c24565b005b34801561035c57600080fd5b50610365610d65565b6040516103729190613e41565b60405180910390f35b610395600480360381019061039091906133f6565b610d6a565b005b3480156103a357600080fd5b506103ac610f04565b6040516103b99190613e41565b60405180910390f35b3480156103ce57600080fd5b506103d7610f0a565b6040516103e49190613e41565b60405180910390f35b3480156103f957600080fd5b50610402610f21565b60405161040f9190613c69565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061324d565b610f34565b005b34801561044d57600080fd5b50610456611259565b6040516104639190613e41565b60405180910390f35b34801561047857600080fd5b5061048161125f565b60405161048e9190613e41565b60405180910390f35b3480156104a357600080fd5b506104be60048036038101906104b99190613542565b611265565b005b3480156104cc57600080fd5b506104d561129a565b6040516104e29190613e41565b60405180910390f35b610505600480360381019061050091906135bc565b6112a0565b005b61050f611363565b005b34801561051d57600080fd5b506105386004803603810190610533919061324d565b6113bb565b005b34801561054657600080fd5b50610561600480360381019061055c919061356f565b6113db565b005b34801561056f57600080fd5b5061058a6004803603810190610585919061349f565b6113f9565b6040516105979190613bef565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c291906135bc565b6114ba565b6040516105d49190613b5f565b60405180910390f35b3480156105e957600080fd5b506105f26114cc565b6040516105ff9190613c84565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a91906131e0565b61155a565b60405161063c9190613e41565b60405180910390f35b34801561065157600080fd5b5061065a611613565b005b34801561066857600080fd5b50610683600480360381019061067e91906131e0565b611627565b6040516106909190613c11565b60405180910390f35b3480156106a557600080fd5b506106ae611771565b6040516106bb9190613b5f565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e691906135bc565b61179b565b005b3480156106f957600080fd5b50610714600480360381019061070f91906135bc565b6117ad565b005b34801561072257600080fd5b5061072b611804565b6040516107389190613c84565b60405180910390f35b34801561074d57600080fd5b50610768600480360381019061076391906133a3565b611896565b6040516107759190613c11565b60405180910390f35b34801561078a57600080fd5b50610793611aaa565b6040516107a09190613e41565b60405180910390f35b6107c360048036038101906107be91906135bc565b611ab0565b005b3480156107d157600080fd5b506107ec60048036038101906107e79190613323565b611d31565b005b3480156107fa57600080fd5b50610815600480360381019061081091906132a0565b611ea9565b005b34801561082357600080fd5b5061083e6004803603810190610839919061356f565b611f1c565b005b34801561084c57600080fd5b50610867600480360381019061086291906135bc565b611f3a565b6040516108749190613e26565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f91906135bc565b611fa4565b6040516108b19190613c84565b60405180910390f35b3480156108c657600080fd5b506108cf612080565b6040516108dc9190613e41565b60405180910390f35b3480156108f157600080fd5b506108fa612086565b6040516109079190613e41565b60405180910390f35b34801561091c57600080fd5b50610937600480360381019061093291906131e0565b61208c565b6040516109449190613e41565b60405180910390f35b34801561095957600080fd5b50610974600480360381019061096f919061320d565b61209e565b6040516109819190613c33565b60405180910390f35b34801561099657600080fd5b5061099f612132565b6040516109ac9190613c4e565b60405180910390f35b3480156109c157600080fd5b506109dc60048036038101906109d79190613452565b612138565b005b3480156109ea57600080fd5b506109f3612186565b604051610a009190613c84565b60405180910390f35b348015610a1557600080fd5b50610a306004803603810190610a2b91906135bc565b612214565b005b348015610a3e57600080fd5b50610a596004803603810190610a5491906131e0565b612229565b005b348015610a6757600080fd5b50610a826004803603810190610a7d91906135bc565b6122ad565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610adf57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b0f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b25906141c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b51906141c0565b8015610b9e5780601f10610b7357610100808354040283529160200191610b9e565b820191906000526020600020905b815481529060010190602001808311610b8157829003601f168201915b5050505050905090565b6000610bb382612304565b610be9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2f826114ba565b90508073ffffffffffffffffffffffffffffffffffffffff16610c50612363565b73ffffffffffffffffffffffffffffffffffffffff1614610cb357610c7c81610c77612363565b61209e565b610cb2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600181565b60016002811115610d7e57610d7d6142bf565b5b600860149054906101000a900460ff166002811115610da057610d9f6142bf565b5b14610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd790613d26565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4590613cc6565b60405180910390fd5b610e60610e5a3361236b565b8361239b565b610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690613da6565b60405180910390fd5b600d5481610eac3361208c565b610eb69190613fd4565b1115610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90613e06565b60405180910390fd5b610f00816123b2565b5050565b600c5481565b6000610f14612463565b6001546000540303905090565b600860149054906101000a900460ff1681565b6000610f3f8261246c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fa6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610fb28461253a565b91509150610fc88187610fc3612363565b61255c565b61101457610fdd86610fd8612363565b61209e565b611013576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561107b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61108886868660016125a0565b801561109357600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506111618561113d8888876125a6565b7c0200000000000000000000000000000000000000000000000000000000176125ce565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156111e95760006001850190506000600460008381526020019081526020016000205414156111e75760005481146111e6578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461125186868660016125f9565b505050505050565b600e5481565b6101f481565b61126d6125ff565b80600860146101000a81548160ff02191690836002811115611292576112916142bf565b5b021790555050565b600d5481565b6112a86125ff565b6101f4816112b53361208c565b6112bf9190613fd4565b1115611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f790613e06565b60405180910390fd5b6101f48161130c610f0a565b6113169190613fd4565b1115611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e90613e06565b60405180910390fd5b611360816123b2565b50565b61136b6125ff565b611373611771565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113b8573d6000803e3d6000fd5b50565b6113d683838360405180602001604052806000815250611ea9565b505050565b6113e36125ff565b8181600a91906113f4929190612e03565b505050565b606060008251905060008167ffffffffffffffff81111561141d5761141c61434c565b5b60405190808252806020026020018201604052801561145657816020015b611443612e89565b81526020019060019003908161143b5790505b50905060005b8281146114af576114868582815181106114795761147861431d565b5b6020026020010151611f3a565b8282815181106114995761149861431d565b5b602002602001018190525080600101905061145c565b508092505050919050565b60006114c58261246c565b9050919050565b600a80546114d9906141c0565b80601f0160208091040260200160405190810160405280929190818152602001828054611505906141c0565b80156115525780601f1061152757610100808354040283529160200191611552565b820191906000526020600020905b81548152906001019060200180831161153557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115c2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61161b6125ff565b611625600061267d565b565b606060008060006116378561155a565b905060008167ffffffffffffffff8111156116555761165461434c565b5b6040519080825280602002602001820160405280156116835781602001602082028036833780820191505090505b50905061168e612e89565b6000611698612463565b90505b838614611763576116ab81612743565b91508160400151156116bc57611758565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116fc57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611757578083878060010198508151811061174a5761174961431d565b5b6020026020010181815250505b5b80600101905061169b565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117a36125ff565b8060118190555050565b6117b56125ff565b600f548111156117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190613ca6565b60405180910390fd5b80600f8190555050565b606060038054611813906141c0565b80601f016020809104026020016040519081016040528092919081815260200182805461183f906141c0565b801561188c5780601f106118615761010080835404028352916020019161188c565b820191906000526020600020905b81548152906001019060200180831161186f57829003601f168201915b5050505050905090565b60608183106118d1576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806118dc61276e565b90506118e6612463565b8510156118f8576118f5612463565b94505b80841115611904578093505b600061190f8761155a565b90508486101561193257600086860390508181101561192c578091505b50611937565b600090505b60008167ffffffffffffffff8111156119535761195261434c565b5b6040519080825280602002602001820160405280156119815781602001602082028036833780820191505090505b50905060008214156119995780945050505050611aa3565b60006119a488611f3a565b9050600081604001516119b957816000015190505b60008990505b8881141580156119cf5750848714155b15611a95576119dd81612743565b92508260400151156119ee57611a8a565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611a2e57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a895780848880600101995081518110611a7c57611a7b61431d565b5b6020026020010181815250505b5b8060010190506119bf565b508583528296505050505050505b9392505050565b60115481565b600280811115611ac357611ac26142bf565b5b600860149054906101000a900460ff166002811115611ae557611ae46142bf565b5b14611b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1c90613dc6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8a90613cc6565b60405180910390fd5b600f5481611b9f610f0a565b611ba99190613fd4565b1115611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be190613e06565b60405180910390fd5b600c5481611bf73361208c565b611c019190613fd4565b1115611c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3990613e06565b60405180910390fd5b60008111611c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7c90613d46565b60405180910390fd5b60008190506001611c953361208c565b108015611ca55750600e54601054105b15611cd457600182611cb79190614084565b9050600160106000828254611ccc9190613fd4565b925050819055505b611cea81601154611ce5919061402a565b612777565b611cf433836127bd565b7f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe3383604051611d25929190613bc6565b60405180910390a15050565b611d39612363565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d9e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611dab612363565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e58612363565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e9d9190613c33565b60405180910390a35050565b611eb4848484610f34565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f1657611edf848484846127db565b611f15576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611f246125ff565b8181600b9190611f35929190612e03565b505050565b611f42612e89565b611f4a612e89565b611f52612463565b831080611f665750611f6261276e565b8310155b15611f745780915050611f9f565b611f7d83612743565b9050806040015115611f925780915050611f9f565b611f9b8361293b565b9150505b919050565b60606000600a8054611fb5906141c0565b9050141561204d57600b8054611fca906141c0565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff6906141c0565b80156120435780601f1061201857610100808354040283529160200191612043565b820191906000526020600020905b81548152906001019060200180831161202657829003601f168201915b5050505050612079565b600a6120588361295b565b604051602001612069929190613b30565b6040516020818303038152906040525b9050919050565b60105481565b600f5481565b6000612097826129b5565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60095481565b6121406125ff565b818160008181106121545761215361431d565b5b90506020020135600c81905550818160018181106121755761217461431d565b5b90506020020135600d819055505050565b600b8054612193906141c0565b80601f01602080910402602001604051908101604052809291908181526020018280546121bf906141c0565b801561220c5780601f106121e15761010080835404028352916020019161220c565b820191906000526020600020905b8154815290600101906020018083116121ef57829003601f168201915b505050505081565b61221c6125ff565b8060001b60098190555050565b6122316125ff565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890613d06565b60405180910390fd5b6122aa8161267d565b50565b6122b56125ff565b600f548111156122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190613ce6565b60405180910390fd5b80600e8190555050565b60008161230f612463565b1115801561231e575060005482105b801561235c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60008160405160200161237e9190613b15565b604051602081830303815290604052805190602001209050919050565b60006123aa8260095485612a0c565b905092915050565b600e54816010546123c39190613fd4565b1115612404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fb90613de6565b60405180910390fd5b61240e33826127bd565b80601060008282546124209190613fd4565b925050819055507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe3382604051612458929190613bc6565b60405180910390a150565b60006001905090565b6000808290508061247b612463565b11612503576000548110156125025760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612500575b60008114156124f65760046000836001900393508381526020019081526020016000205490506124cb565b8092505050612535565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86125bd868684612a23565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612607612a2c565b73ffffffffffffffffffffffffffffffffffffffff16612625611771565b73ffffffffffffffffffffffffffffffffffffffff161461267b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267290613d66565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61274b612e89565b6127676004600084815260200190815260200160002054612a34565b9050919050565b60008054905090565b803410156127ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b190613d86565b60405180910390fd5b50565b6127d7828260405180602001604052806000815250612aea565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612801612363565b8786866040518563ffffffff1660e01b81526004016128239493929190613b7a565b602060405180830381600087803b15801561283d57600080fd5b505af192505050801561286e57506040513d601f19601f8201168201806040525081019061286b9190613515565b60015b6128e8573d806000811461289e576040519150601f19603f3d011682016040523d82523d6000602084013e6128a3565b606091505b506000815114156128e0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612943612e89565b61295461294f8361246c565b612a34565b9050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156129a157600183039250600a81066030018353600a81049050612981565b508181036020830392508083525050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600082612a198584612b87565b1490509392505050565b60009392505050565b600033905090565b612a3c612e89565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b612af48383612bdd565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612b8257600080549050600083820390505b612b3460008683806001019450866127db565b612b6a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612b21578160005414612b7f57600080fd5b50505b505050565b60008082905060005b8451811015612bd257612bbd82868381518110612bb057612baf61431d565b5b6020026020010151612db1565b91508080612bca90614223565b915050612b90565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c4a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612c85576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c9260008483856125a0565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612d0983612cfa60008660006125a6565b612d0385612ddc565b176125ce565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d2d57806000819055505050612dac60008483856125f9565b505050565b6000818310612dc957612dc48284612dec565b612dd4565b612dd38383612dec565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612e0f906141c0565b90600052602060002090601f016020900481019282612e315760008555612e78565b82601f10612e4a57803560ff1916838001178555612e78565b82800160010185558215612e78579182015b82811115612e77578235825591602001919060010190612e5c565b5b509050612e859190612ed8565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612ef1576000816000905550600101612ed9565b5090565b6000612f08612f0384613e81565b613e5c565b90508083825260208201905082856020860282011115612f2b57612f2a614385565b5b60005b85811015612f5b5781612f4188826130f3565b845260208401935060208301925050600181019050612f2e565b5050509392505050565b6000612f78612f7384613ead565b613e5c565b90508083825260208201905082856020860282011115612f9b57612f9a614385565b5b60005b85811015612fcb5781612fb188826131cb565b845260208401935060208301925050600181019050612f9e565b5050509392505050565b6000612fe8612fe384613ed9565b613e5c565b9050828152602081018484840111156130045761300361438a565b5b61300f84828561417e565b509392505050565b60008135905061302681614652565b92915050565b600082601f83011261304157613040614380565b5b8135613051848260208601612ef5565b91505092915050565b60008083601f8401126130705761306f614380565b5b8235905067ffffffffffffffff81111561308d5761308c61437b565b5b6020830191508360208202830111156130a9576130a8614385565b5b9250929050565b600082601f8301126130c5576130c4614380565b5b81356130d5848260208601612f65565b91505092915050565b6000813590506130ed81614669565b92915050565b60008135905061310281614680565b92915050565b60008135905061311781614697565b92915050565b60008151905061312c81614697565b92915050565b600082601f83011261314757613146614380565b5b8135613157848260208601612fd5565b91505092915050565b60008135905061316f816146ae565b92915050565b60008083601f84011261318b5761318a614380565b5b8235905067ffffffffffffffff8111156131a8576131a761437b565b5b6020830191508360018202830111156131c4576131c3614385565b5b9250929050565b6000813590506131da816146be565b92915050565b6000602082840312156131f6576131f5614394565b5b600061320484828501613017565b91505092915050565b6000806040838503121561322457613223614394565b5b600061323285828601613017565b925050602061324385828601613017565b9150509250929050565b60008060006060848603121561326657613265614394565b5b600061327486828701613017565b935050602061328586828701613017565b9250506040613296868287016131cb565b9150509250925092565b600080600080608085870312156132ba576132b9614394565b5b60006132c887828801613017565b94505060206132d987828801613017565b93505060406132ea878288016131cb565b925050606085013567ffffffffffffffff81111561330b5761330a61438f565b5b61331787828801613132565b91505092959194509250565b6000806040838503121561333a57613339614394565b5b600061334885828601613017565b9250506020613359858286016130de565b9150509250929050565b6000806040838503121561337a57613379614394565b5b600061338885828601613017565b9250506020613399858286016131cb565b9150509250929050565b6000806000606084860312156133bc576133bb614394565b5b60006133ca86828701613017565b93505060206133db868287016131cb565b92505060406133ec868287016131cb565b9150509250925092565b6000806040838503121561340d5761340c614394565b5b600083013567ffffffffffffffff81111561342b5761342a61438f565b5b6134378582860161302c565b9250506020613448858286016131cb565b9150509250929050565b6000806020838503121561346957613468614394565b5b600083013567ffffffffffffffff8111156134875761348661438f565b5b6134938582860161305a565b92509250509250929050565b6000602082840312156134b5576134b4614394565b5b600082013567ffffffffffffffff8111156134d3576134d261438f565b5b6134df848285016130b0565b91505092915050565b6000602082840312156134fe576134fd614394565b5b600061350c84828501613108565b91505092915050565b60006020828403121561352b5761352a614394565b5b60006135398482850161311d565b91505092915050565b60006020828403121561355857613557614394565b5b600061356684828501613160565b91505092915050565b6000806020838503121561358657613585614394565b5b600083013567ffffffffffffffff8111156135a4576135a361438f565b5b6135b085828601613175565b92509250509250929050565b6000602082840312156135d2576135d1614394565b5b60006135e0848285016131cb565b91505092915050565b60006135f58383613a2f565b60808301905092915050565b600061360d8383613ae8565b60208301905092915050565b613622816140b8565b82525050565b613631816140b8565b82525050565b613648613643826140b8565b61426c565b82525050565b600061365982613f3f565b6136638185613f85565b935061366e83613f0a565b8060005b8381101561369f57815161368688826135e9565b975061369183613f6b565b925050600181019050613672565b5085935050505092915050565b60006136b782613f4a565b6136c18185613f96565b93506136cc83613f1a565b8060005b838110156136fd5781516136e48882613601565b97506136ef83613f78565b9250506001810190506136d0565b5085935050505092915050565b613713816140ca565b82525050565b613722816140ca565b82525050565b613731816140d6565b82525050565b600061374282613f55565b61374c8185613fa7565b935061375c81856020860161418d565b61376581614399565b840191505092915050565b6137798161416c565b82525050565b600061378a82613f60565b6137948185613fb8565b93506137a481856020860161418d565b6137ad81614399565b840191505092915050565b60006137c382613f60565b6137cd8185613fc9565b93506137dd81856020860161418d565b80840191505092915050565b600081546137f6816141c0565b6138008186613fc9565b9450600182166000811461381b576001811461382c5761385f565b60ff1983168652818601935061385f565b61383585613f2a565b60005b8381101561385757815481890152600182019150602081019050613838565b838801955050505b50505092915050565b6000613875603383613fb8565b9150613880826143b7565b604082019050919050565b6000613898601983613fb8565b91506138a382614406565b602082019050919050565b60006138bb603483613fb8565b91506138c68261442f565b604082019050919050565b60006138de602683613fb8565b91506138e98261447e565b604082019050919050565b6000613901600e83613fb8565b915061390c826144cd565b602082019050919050565b6000613924601283613fb8565b915061392f826144f6565b602082019050919050565b6000613947600583613fc9565b91506139528261451f565b600582019050919050565b600061396a602083613fb8565b915061397582614548565b602082019050919050565b600061398d601583613fb8565b915061399882614571565b602082019050919050565b60006139b0600f83613fb8565b91506139bb8261459a565b602082019050919050565b60006139d3600b83613fb8565b91506139de826145c3565b602082019050919050565b60006139f6601283613fb8565b9150613a01826145ec565b602082019050919050565b6000613a19600d83613fb8565b9150613a2482614615565b602082019050919050565b608082016000820151613a456000850182613619565b506020820151613a586020850182613b06565b506040820151613a6b604085018261370a565b506060820151613a7e6060850182613ad9565b50505050565b608082016000820151613a9a6000850182613619565b506020820151613aad6020850182613b06565b506040820151613ac0604085018261370a565b506060820151613ad36060850182613ad9565b50505050565b613ae28161413f565b82525050565b613af18161414e565b82525050565b613b008161414e565b82525050565b613b0f81614158565b82525050565b6000613b218284613637565b60148201915081905092915050565b6000613b3c82856137e9565b9150613b4882846137b8565b9150613b538261393a565b91508190509392505050565b6000602082019050613b746000830184613628565b92915050565b6000608082019050613b8f6000830187613628565b613b9c6020830186613628565b613ba96040830185613af7565b8181036060830152613bbb8184613737565b905095945050505050565b6000604082019050613bdb6000830185613628565b613be86020830184613af7565b9392505050565b60006020820190508181036000830152613c09818461364e565b905092915050565b60006020820190508181036000830152613c2b81846136ac565b905092915050565b6000602082019050613c486000830184613719565b92915050565b6000602082019050613c636000830184613728565b92915050565b6000602082019050613c7e6000830184613770565b92915050565b60006020820190508181036000830152613c9e818461377f565b905092915050565b60006020820190508181036000830152613cbf81613868565b9050919050565b60006020820190508181036000830152613cdf8161388b565b9050919050565b60006020820190508181036000830152613cff816138ae565b9050919050565b60006020820190508181036000830152613d1f816138d1565b9050919050565b60006020820190508181036000830152613d3f816138f4565b9050919050565b60006020820190508181036000830152613d5f81613917565b9050919050565b60006020820190508181036000830152613d7f8161395d565b9050919050565b60006020820190508181036000830152613d9f81613980565b9050919050565b60006020820190508181036000830152613dbf816139a3565b9050919050565b60006020820190508181036000830152613ddf816139c6565b9050919050565b60006020820190508181036000830152613dff816139e9565b9050919050565b60006020820190508181036000830152613e1f81613a0c565b9050919050565b6000608082019050613e3b6000830184613a84565b92915050565b6000602082019050613e566000830184613af7565b92915050565b6000613e66613e77565b9050613e7282826141f2565b919050565b6000604051905090565b600067ffffffffffffffff821115613e9c57613e9b61434c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ec857613ec761434c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ef457613ef361434c565b5b613efd82614399565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fdf8261414e565b9150613fea8361414e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561401f5761401e614290565b5b828201905092915050565b60006140358261414e565b91506140408361414e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561407957614078614290565b5b828202905092915050565b600061408f8261414e565b915061409a8361414e565b9250828210156140ad576140ac614290565b5b828203905092915050565b60006140c38261411f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061411a8261463e565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b60006141778261410c565b9050919050565b82818337600083830152505050565b60005b838110156141ab578082015181840152602081019050614190565b838111156141ba576000848401525b50505050565b600060028204905060018216806141d857607f821691505b602082108114156141ec576141eb6142ee565b5b50919050565b6141fb82614399565b810181811067ffffffffffffffff8211171561421a5761421961434c565b5b80604052505050565b600061422e8261414e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561426157614260614290565b5b600182019050919050565b60006142778261427e565b9050919050565b6000614289826143aa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d617820737570706c79206d757374206265206c657373207468616e206f722060008201527f657175616c20746f206d617820737570706c7900000000000000000000000000602082015250565b7f436f6e74726163742063616c6c206e6f7420616c6c6f77656400000000000000600082015250565b7f4672656520737570706c79206d757374206265206c657373207468616e206f7260008201527f20657175616c20746f206d617820737570706c79000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f74207072656d696e74696e67000000000000000000000000000000000000600082015250565b7f4f6e65206865617274206174206c656173740000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e65656420746f2073656e64206d6f7265204554480000000000000000000000600082015250565b7f4e6f7420616c6c6f776c69737465640000000000000000000000000000000000600082015250565b7f4e6f74206d696e74696e67000000000000000000000000000000000000000000600082015250565b7f4672656520686561727473206578636565640000000000000000000000000000600082015250565b7f4865617274732065786365656400000000000000000000000000000000000000600082015250565b6003811061464f5761464e6142bf565b5b50565b61465b816140b8565b811461466657600080fd5b50565b614672816140ca565b811461467d57600080fd5b50565b614689816140d6565b811461469457600080fd5b50565b6146a0816140e0565b81146146ab57600080fd5b50565b600381106146bb57600080fd5b50565b6146c78161414e565b81146146d257600080fd5b5056fea2646970667358221220c2e10175a41154d10daf1d21094d7e01d9549ab9e717c2682917313d9c4805f064736f6c63430008070033
Deployed Bytecode
0x60806040526004361061027d5760003560e01c80638462151c1161014f578063c23dc68f116100c1578063ebf0c7171161007a578063ebf0c7171461098a578063f2184d0c146109b5578063f2917850146109de578063f2f5a7e514610a09578063f2fde38b14610a32578063f676308a14610a5b5761027d565b8063c23dc68f14610840578063c87b56dd1461087d578063d10a1a2b146108ba578063d5abeb01146108e5578063dc33e68114610910578063e985e9c51461094d5761027d565b806399a2557a1161011357806399a2557a14610741578063a035b1fe1461077e578063a0712d68146107a9578063a22cb465146107c5578063b88d4fde146107ee578063b99b8f00146108175761027d565b80638462151c1461065c5780638da5cb5b1461069957806391b7f5ed146106c457806391ff4a73146106ed57806395d89b41146107165761027d565b80632cfac6ec116101f357806355f804b3116101ac57806355f804b31461053a5780635bbb2177146105635780636352211e146105a05780636c0360eb146105dd57806370a0823114610608578063715018a6146106455761027d565b80632cfac6ec1461046c5780632e49d78b1461049757806331a72cc6146104c0578063375a069a146104eb5780633ccfd60b1461050757806342842e0e146105115761027d565b80631338a83f116102455780631338a83f1461037b578063161548621461039757806318160ddd146103c2578063200d2ed2146103ed57806323b872dd1461041857806324a6ab0c146104415761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780630faa689614610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906134e8565b610a84565b6040516102b69190613c33565b60405180910390f35b3480156102cb57600080fd5b506102d4610b16565b6040516102e19190613c84565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c91906135bc565b610ba8565b60405161031e9190613b5f565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613363565b610c24565b005b34801561035c57600080fd5b50610365610d65565b6040516103729190613e41565b60405180910390f35b610395600480360381019061039091906133f6565b610d6a565b005b3480156103a357600080fd5b506103ac610f04565b6040516103b99190613e41565b60405180910390f35b3480156103ce57600080fd5b506103d7610f0a565b6040516103e49190613e41565b60405180910390f35b3480156103f957600080fd5b50610402610f21565b60405161040f9190613c69565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061324d565b610f34565b005b34801561044d57600080fd5b50610456611259565b6040516104639190613e41565b60405180910390f35b34801561047857600080fd5b5061048161125f565b60405161048e9190613e41565b60405180910390f35b3480156104a357600080fd5b506104be60048036038101906104b99190613542565b611265565b005b3480156104cc57600080fd5b506104d561129a565b6040516104e29190613e41565b60405180910390f35b610505600480360381019061050091906135bc565b6112a0565b005b61050f611363565b005b34801561051d57600080fd5b506105386004803603810190610533919061324d565b6113bb565b005b34801561054657600080fd5b50610561600480360381019061055c919061356f565b6113db565b005b34801561056f57600080fd5b5061058a6004803603810190610585919061349f565b6113f9565b6040516105979190613bef565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c291906135bc565b6114ba565b6040516105d49190613b5f565b60405180910390f35b3480156105e957600080fd5b506105f26114cc565b6040516105ff9190613c84565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a91906131e0565b61155a565b60405161063c9190613e41565b60405180910390f35b34801561065157600080fd5b5061065a611613565b005b34801561066857600080fd5b50610683600480360381019061067e91906131e0565b611627565b6040516106909190613c11565b60405180910390f35b3480156106a557600080fd5b506106ae611771565b6040516106bb9190613b5f565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e691906135bc565b61179b565b005b3480156106f957600080fd5b50610714600480360381019061070f91906135bc565b6117ad565b005b34801561072257600080fd5b5061072b611804565b6040516107389190613c84565b60405180910390f35b34801561074d57600080fd5b50610768600480360381019061076391906133a3565b611896565b6040516107759190613c11565b60405180910390f35b34801561078a57600080fd5b50610793611aaa565b6040516107a09190613e41565b60405180910390f35b6107c360048036038101906107be91906135bc565b611ab0565b005b3480156107d157600080fd5b506107ec60048036038101906107e79190613323565b611d31565b005b3480156107fa57600080fd5b50610815600480360381019061081091906132a0565b611ea9565b005b34801561082357600080fd5b5061083e6004803603810190610839919061356f565b611f1c565b005b34801561084c57600080fd5b50610867600480360381019061086291906135bc565b611f3a565b6040516108749190613e26565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f91906135bc565b611fa4565b6040516108b19190613c84565b60405180910390f35b3480156108c657600080fd5b506108cf612080565b6040516108dc9190613e41565b60405180910390f35b3480156108f157600080fd5b506108fa612086565b6040516109079190613e41565b60405180910390f35b34801561091c57600080fd5b50610937600480360381019061093291906131e0565b61208c565b6040516109449190613e41565b60405180910390f35b34801561095957600080fd5b50610974600480360381019061096f919061320d565b61209e565b6040516109819190613c33565b60405180910390f35b34801561099657600080fd5b5061099f612132565b6040516109ac9190613c4e565b60405180910390f35b3480156109c157600080fd5b506109dc60048036038101906109d79190613452565b612138565b005b3480156109ea57600080fd5b506109f3612186565b604051610a009190613c84565b60405180910390f35b348015610a1557600080fd5b50610a306004803603810190610a2b91906135bc565b612214565b005b348015610a3e57600080fd5b50610a596004803603810190610a5491906131e0565b612229565b005b348015610a6757600080fd5b50610a826004803603810190610a7d91906135bc565b6122ad565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610adf57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b0f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b25906141c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b51906141c0565b8015610b9e5780601f10610b7357610100808354040283529160200191610b9e565b820191906000526020600020905b815481529060010190602001808311610b8157829003601f168201915b5050505050905090565b6000610bb382612304565b610be9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2f826114ba565b90508073ffffffffffffffffffffffffffffffffffffffff16610c50612363565b73ffffffffffffffffffffffffffffffffffffffff1614610cb357610c7c81610c77612363565b61209e565b610cb2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600181565b60016002811115610d7e57610d7d6142bf565b5b600860149054906101000a900460ff166002811115610da057610d9f6142bf565b5b14610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd790613d26565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4590613cc6565b60405180910390fd5b610e60610e5a3361236b565b8361239b565b610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690613da6565b60405180910390fd5b600d5481610eac3361208c565b610eb69190613fd4565b1115610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90613e06565b60405180910390fd5b610f00816123b2565b5050565b600c5481565b6000610f14612463565b6001546000540303905090565b600860149054906101000a900460ff1681565b6000610f3f8261246c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fa6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610fb28461253a565b91509150610fc88187610fc3612363565b61255c565b61101457610fdd86610fd8612363565b61209e565b611013576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561107b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61108886868660016125a0565b801561109357600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506111618561113d8888876125a6565b7c0200000000000000000000000000000000000000000000000000000000176125ce565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156111e95760006001850190506000600460008381526020019081526020016000205414156111e75760005481146111e6578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461125186868660016125f9565b505050505050565b600e5481565b6101f481565b61126d6125ff565b80600860146101000a81548160ff02191690836002811115611292576112916142bf565b5b021790555050565b600d5481565b6112a86125ff565b6101f4816112b53361208c565b6112bf9190613fd4565b1115611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f790613e06565b60405180910390fd5b6101f48161130c610f0a565b6113169190613fd4565b1115611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e90613e06565b60405180910390fd5b611360816123b2565b50565b61136b6125ff565b611373611771565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113b8573d6000803e3d6000fd5b50565b6113d683838360405180602001604052806000815250611ea9565b505050565b6113e36125ff565b8181600a91906113f4929190612e03565b505050565b606060008251905060008167ffffffffffffffff81111561141d5761141c61434c565b5b60405190808252806020026020018201604052801561145657816020015b611443612e89565b81526020019060019003908161143b5790505b50905060005b8281146114af576114868582815181106114795761147861431d565b5b6020026020010151611f3a565b8282815181106114995761149861431d565b5b602002602001018190525080600101905061145c565b508092505050919050565b60006114c58261246c565b9050919050565b600a80546114d9906141c0565b80601f0160208091040260200160405190810160405280929190818152602001828054611505906141c0565b80156115525780601f1061152757610100808354040283529160200191611552565b820191906000526020600020905b81548152906001019060200180831161153557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115c2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61161b6125ff565b611625600061267d565b565b606060008060006116378561155a565b905060008167ffffffffffffffff8111156116555761165461434c565b5b6040519080825280602002602001820160405280156116835781602001602082028036833780820191505090505b50905061168e612e89565b6000611698612463565b90505b838614611763576116ab81612743565b91508160400151156116bc57611758565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116fc57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611757578083878060010198508151811061174a5761174961431d565b5b6020026020010181815250505b5b80600101905061169b565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117a36125ff565b8060118190555050565b6117b56125ff565b600f548111156117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190613ca6565b60405180910390fd5b80600f8190555050565b606060038054611813906141c0565b80601f016020809104026020016040519081016040528092919081815260200182805461183f906141c0565b801561188c5780601f106118615761010080835404028352916020019161188c565b820191906000526020600020905b81548152906001019060200180831161186f57829003601f168201915b5050505050905090565b60608183106118d1576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806118dc61276e565b90506118e6612463565b8510156118f8576118f5612463565b94505b80841115611904578093505b600061190f8761155a565b90508486101561193257600086860390508181101561192c578091505b50611937565b600090505b60008167ffffffffffffffff8111156119535761195261434c565b5b6040519080825280602002602001820160405280156119815781602001602082028036833780820191505090505b50905060008214156119995780945050505050611aa3565b60006119a488611f3a565b9050600081604001516119b957816000015190505b60008990505b8881141580156119cf5750848714155b15611a95576119dd81612743565b92508260400151156119ee57611a8a565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611a2e57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a895780848880600101995081518110611a7c57611a7b61431d565b5b6020026020010181815250505b5b8060010190506119bf565b508583528296505050505050505b9392505050565b60115481565b600280811115611ac357611ac26142bf565b5b600860149054906101000a900460ff166002811115611ae557611ae46142bf565b5b14611b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1c90613dc6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8a90613cc6565b60405180910390fd5b600f5481611b9f610f0a565b611ba99190613fd4565b1115611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be190613e06565b60405180910390fd5b600c5481611bf73361208c565b611c019190613fd4565b1115611c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3990613e06565b60405180910390fd5b60008111611c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7c90613d46565b60405180910390fd5b60008190506001611c953361208c565b108015611ca55750600e54601054105b15611cd457600182611cb79190614084565b9050600160106000828254611ccc9190613fd4565b925050819055505b611cea81601154611ce5919061402a565b612777565b611cf433836127bd565b7f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe3383604051611d25929190613bc6565b60405180910390a15050565b611d39612363565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d9e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611dab612363565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e58612363565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e9d9190613c33565b60405180910390a35050565b611eb4848484610f34565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f1657611edf848484846127db565b611f15576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611f246125ff565b8181600b9190611f35929190612e03565b505050565b611f42612e89565b611f4a612e89565b611f52612463565b831080611f665750611f6261276e565b8310155b15611f745780915050611f9f565b611f7d83612743565b9050806040015115611f925780915050611f9f565b611f9b8361293b565b9150505b919050565b60606000600a8054611fb5906141c0565b9050141561204d57600b8054611fca906141c0565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff6906141c0565b80156120435780601f1061201857610100808354040283529160200191612043565b820191906000526020600020905b81548152906001019060200180831161202657829003601f168201915b5050505050612079565b600a6120588361295b565b604051602001612069929190613b30565b6040516020818303038152906040525b9050919050565b60105481565b600f5481565b6000612097826129b5565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60095481565b6121406125ff565b818160008181106121545761215361431d565b5b90506020020135600c81905550818160018181106121755761217461431d565b5b90506020020135600d819055505050565b600b8054612193906141c0565b80601f01602080910402602001604051908101604052809291908181526020018280546121bf906141c0565b801561220c5780601f106121e15761010080835404028352916020019161220c565b820191906000526020600020905b8154815290600101906020018083116121ef57829003601f168201915b505050505081565b61221c6125ff565b8060001b60098190555050565b6122316125ff565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890613d06565b60405180910390fd5b6122aa8161267d565b50565b6122b56125ff565b600f548111156122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190613ce6565b60405180910390fd5b80600e8190555050565b60008161230f612463565b1115801561231e575060005482105b801561235c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60008160405160200161237e9190613b15565b604051602081830303815290604052805190602001209050919050565b60006123aa8260095485612a0c565b905092915050565b600e54816010546123c39190613fd4565b1115612404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fb90613de6565b60405180910390fd5b61240e33826127bd565b80601060008282546124209190613fd4565b925050819055507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe3382604051612458929190613bc6565b60405180910390a150565b60006001905090565b6000808290508061247b612463565b11612503576000548110156125025760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612500575b60008114156124f65760046000836001900393508381526020019081526020016000205490506124cb565b8092505050612535565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86125bd868684612a23565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612607612a2c565b73ffffffffffffffffffffffffffffffffffffffff16612625611771565b73ffffffffffffffffffffffffffffffffffffffff161461267b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267290613d66565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61274b612e89565b6127676004600084815260200190815260200160002054612a34565b9050919050565b60008054905090565b803410156127ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b190613d86565b60405180910390fd5b50565b6127d7828260405180602001604052806000815250612aea565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612801612363565b8786866040518563ffffffff1660e01b81526004016128239493929190613b7a565b602060405180830381600087803b15801561283d57600080fd5b505af192505050801561286e57506040513d601f19601f8201168201806040525081019061286b9190613515565b60015b6128e8573d806000811461289e576040519150601f19603f3d011682016040523d82523d6000602084013e6128a3565b606091505b506000815114156128e0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612943612e89565b61295461294f8361246c565b612a34565b9050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156129a157600183039250600a81066030018353600a81049050612981565b508181036020830392508083525050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600082612a198584612b87565b1490509392505050565b60009392505050565b600033905090565b612a3c612e89565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b612af48383612bdd565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612b8257600080549050600083820390505b612b3460008683806001019450866127db565b612b6a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612b21578160005414612b7f57600080fd5b50505b505050565b60008082905060005b8451811015612bd257612bbd82868381518110612bb057612baf61431d565b5b6020026020010151612db1565b91508080612bca90614223565b915050612b90565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c4a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612c85576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c9260008483856125a0565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612d0983612cfa60008660006125a6565b612d0385612ddc565b176125ce565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d2d57806000819055505050612dac60008483856125f9565b505050565b6000818310612dc957612dc48284612dec565b612dd4565b612dd38383612dec565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612e0f906141c0565b90600052602060002090601f016020900481019282612e315760008555612e78565b82601f10612e4a57803560ff1916838001178555612e78565b82800160010185558215612e78579182015b82811115612e77578235825591602001919060010190612e5c565b5b509050612e859190612ed8565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612ef1576000816000905550600101612ed9565b5090565b6000612f08612f0384613e81565b613e5c565b90508083825260208201905082856020860282011115612f2b57612f2a614385565b5b60005b85811015612f5b5781612f4188826130f3565b845260208401935060208301925050600181019050612f2e565b5050509392505050565b6000612f78612f7384613ead565b613e5c565b90508083825260208201905082856020860282011115612f9b57612f9a614385565b5b60005b85811015612fcb5781612fb188826131cb565b845260208401935060208301925050600181019050612f9e565b5050509392505050565b6000612fe8612fe384613ed9565b613e5c565b9050828152602081018484840111156130045761300361438a565b5b61300f84828561417e565b509392505050565b60008135905061302681614652565b92915050565b600082601f83011261304157613040614380565b5b8135613051848260208601612ef5565b91505092915050565b60008083601f8401126130705761306f614380565b5b8235905067ffffffffffffffff81111561308d5761308c61437b565b5b6020830191508360208202830111156130a9576130a8614385565b5b9250929050565b600082601f8301126130c5576130c4614380565b5b81356130d5848260208601612f65565b91505092915050565b6000813590506130ed81614669565b92915050565b60008135905061310281614680565b92915050565b60008135905061311781614697565b92915050565b60008151905061312c81614697565b92915050565b600082601f83011261314757613146614380565b5b8135613157848260208601612fd5565b91505092915050565b60008135905061316f816146ae565b92915050565b60008083601f84011261318b5761318a614380565b5b8235905067ffffffffffffffff8111156131a8576131a761437b565b5b6020830191508360018202830111156131c4576131c3614385565b5b9250929050565b6000813590506131da816146be565b92915050565b6000602082840312156131f6576131f5614394565b5b600061320484828501613017565b91505092915050565b6000806040838503121561322457613223614394565b5b600061323285828601613017565b925050602061324385828601613017565b9150509250929050565b60008060006060848603121561326657613265614394565b5b600061327486828701613017565b935050602061328586828701613017565b9250506040613296868287016131cb565b9150509250925092565b600080600080608085870312156132ba576132b9614394565b5b60006132c887828801613017565b94505060206132d987828801613017565b93505060406132ea878288016131cb565b925050606085013567ffffffffffffffff81111561330b5761330a61438f565b5b61331787828801613132565b91505092959194509250565b6000806040838503121561333a57613339614394565b5b600061334885828601613017565b9250506020613359858286016130de565b9150509250929050565b6000806040838503121561337a57613379614394565b5b600061338885828601613017565b9250506020613399858286016131cb565b9150509250929050565b6000806000606084860312156133bc576133bb614394565b5b60006133ca86828701613017565b93505060206133db868287016131cb565b92505060406133ec868287016131cb565b9150509250925092565b6000806040838503121561340d5761340c614394565b5b600083013567ffffffffffffffff81111561342b5761342a61438f565b5b6134378582860161302c565b9250506020613448858286016131cb565b9150509250929050565b6000806020838503121561346957613468614394565b5b600083013567ffffffffffffffff8111156134875761348661438f565b5b6134938582860161305a565b92509250509250929050565b6000602082840312156134b5576134b4614394565b5b600082013567ffffffffffffffff8111156134d3576134d261438f565b5b6134df848285016130b0565b91505092915050565b6000602082840312156134fe576134fd614394565b5b600061350c84828501613108565b91505092915050565b60006020828403121561352b5761352a614394565b5b60006135398482850161311d565b91505092915050565b60006020828403121561355857613557614394565b5b600061356684828501613160565b91505092915050565b6000806020838503121561358657613585614394565b5b600083013567ffffffffffffffff8111156135a4576135a361438f565b5b6135b085828601613175565b92509250509250929050565b6000602082840312156135d2576135d1614394565b5b60006135e0848285016131cb565b91505092915050565b60006135f58383613a2f565b60808301905092915050565b600061360d8383613ae8565b60208301905092915050565b613622816140b8565b82525050565b613631816140b8565b82525050565b613648613643826140b8565b61426c565b82525050565b600061365982613f3f565b6136638185613f85565b935061366e83613f0a565b8060005b8381101561369f57815161368688826135e9565b975061369183613f6b565b925050600181019050613672565b5085935050505092915050565b60006136b782613f4a565b6136c18185613f96565b93506136cc83613f1a565b8060005b838110156136fd5781516136e48882613601565b97506136ef83613f78565b9250506001810190506136d0565b5085935050505092915050565b613713816140ca565b82525050565b613722816140ca565b82525050565b613731816140d6565b82525050565b600061374282613f55565b61374c8185613fa7565b935061375c81856020860161418d565b61376581614399565b840191505092915050565b6137798161416c565b82525050565b600061378a82613f60565b6137948185613fb8565b93506137a481856020860161418d565b6137ad81614399565b840191505092915050565b60006137c382613f60565b6137cd8185613fc9565b93506137dd81856020860161418d565b80840191505092915050565b600081546137f6816141c0565b6138008186613fc9565b9450600182166000811461381b576001811461382c5761385f565b60ff1983168652818601935061385f565b61383585613f2a565b60005b8381101561385757815481890152600182019150602081019050613838565b838801955050505b50505092915050565b6000613875603383613fb8565b9150613880826143b7565b604082019050919050565b6000613898601983613fb8565b91506138a382614406565b602082019050919050565b60006138bb603483613fb8565b91506138c68261442f565b604082019050919050565b60006138de602683613fb8565b91506138e98261447e565b604082019050919050565b6000613901600e83613fb8565b915061390c826144cd565b602082019050919050565b6000613924601283613fb8565b915061392f826144f6565b602082019050919050565b6000613947600583613fc9565b91506139528261451f565b600582019050919050565b600061396a602083613fb8565b915061397582614548565b602082019050919050565b600061398d601583613fb8565b915061399882614571565b602082019050919050565b60006139b0600f83613fb8565b91506139bb8261459a565b602082019050919050565b60006139d3600b83613fb8565b91506139de826145c3565b602082019050919050565b60006139f6601283613fb8565b9150613a01826145ec565b602082019050919050565b6000613a19600d83613fb8565b9150613a2482614615565b602082019050919050565b608082016000820151613a456000850182613619565b506020820151613a586020850182613b06565b506040820151613a6b604085018261370a565b506060820151613a7e6060850182613ad9565b50505050565b608082016000820151613a9a6000850182613619565b506020820151613aad6020850182613b06565b506040820151613ac0604085018261370a565b506060820151613ad36060850182613ad9565b50505050565b613ae28161413f565b82525050565b613af18161414e565b82525050565b613b008161414e565b82525050565b613b0f81614158565b82525050565b6000613b218284613637565b60148201915081905092915050565b6000613b3c82856137e9565b9150613b4882846137b8565b9150613b538261393a565b91508190509392505050565b6000602082019050613b746000830184613628565b92915050565b6000608082019050613b8f6000830187613628565b613b9c6020830186613628565b613ba96040830185613af7565b8181036060830152613bbb8184613737565b905095945050505050565b6000604082019050613bdb6000830185613628565b613be86020830184613af7565b9392505050565b60006020820190508181036000830152613c09818461364e565b905092915050565b60006020820190508181036000830152613c2b81846136ac565b905092915050565b6000602082019050613c486000830184613719565b92915050565b6000602082019050613c636000830184613728565b92915050565b6000602082019050613c7e6000830184613770565b92915050565b60006020820190508181036000830152613c9e818461377f565b905092915050565b60006020820190508181036000830152613cbf81613868565b9050919050565b60006020820190508181036000830152613cdf8161388b565b9050919050565b60006020820190508181036000830152613cff816138ae565b9050919050565b60006020820190508181036000830152613d1f816138d1565b9050919050565b60006020820190508181036000830152613d3f816138f4565b9050919050565b60006020820190508181036000830152613d5f81613917565b9050919050565b60006020820190508181036000830152613d7f8161395d565b9050919050565b60006020820190508181036000830152613d9f81613980565b9050919050565b60006020820190508181036000830152613dbf816139a3565b9050919050565b60006020820190508181036000830152613ddf816139c6565b9050919050565b60006020820190508181036000830152613dff816139e9565b9050919050565b60006020820190508181036000830152613e1f81613a0c565b9050919050565b6000608082019050613e3b6000830184613a84565b92915050565b6000602082019050613e566000830184613af7565b92915050565b6000613e66613e77565b9050613e7282826141f2565b919050565b6000604051905090565b600067ffffffffffffffff821115613e9c57613e9b61434c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ec857613ec761434c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ef457613ef361434c565b5b613efd82614399565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fdf8261414e565b9150613fea8361414e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561401f5761401e614290565b5b828201905092915050565b60006140358261414e565b91506140408361414e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561407957614078614290565b5b828202905092915050565b600061408f8261414e565b915061409a8361414e565b9250828210156140ad576140ac614290565b5b828203905092915050565b60006140c38261411f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061411a8261463e565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b60006141778261410c565b9050919050565b82818337600083830152505050565b60005b838110156141ab578082015181840152602081019050614190565b838111156141ba576000848401525b50505050565b600060028204905060018216806141d857607f821691505b602082108114156141ec576141eb6142ee565b5b50919050565b6141fb82614399565b810181811067ffffffffffffffff8211171561421a5761421961434c565b5b80604052505050565b600061422e8261414e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561426157614260614290565b5b600182019050919050565b60006142778261427e565b9050919050565b6000614289826143aa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d617820737570706c79206d757374206265206c657373207468616e206f722060008201527f657175616c20746f206d617820737570706c7900000000000000000000000000602082015250565b7f436f6e74726163742063616c6c206e6f7420616c6c6f77656400000000000000600082015250565b7f4672656520737570706c79206d757374206265206c657373207468616e206f7260008201527f20657175616c20746f206d617820737570706c79000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f74207072656d696e74696e67000000000000000000000000000000000000600082015250565b7f4f6e65206865617274206174206c656173740000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e65656420746f2073656e64206d6f7265204554480000000000000000000000600082015250565b7f4e6f7420616c6c6f776c69737465640000000000000000000000000000000000600082015250565b7f4e6f74206d696e74696e67000000000000000000000000000000000000000000600082015250565b7f4672656520686561727473206578636565640000000000000000000000000000600082015250565b7f4865617274732065786365656400000000000000000000000000000000000000600082015250565b6003811061464f5761464e6142bf565b5b50565b61465b816140b8565b811461466657600080fd5b50565b614672816140ca565b811461467d57600080fd5b50565b614689816140d6565b811461469457600080fd5b50565b6146a0816140e0565b81146146ab57600080fd5b50565b600381106146bb57600080fd5b50565b6146c78161414e565b81146146d257600080fd5b5056fea2646970667358221220c2e10175a41154d10daf1d21094d7e01d9549ab9e717c2682917313d9c4805f064736f6c63430008070033
Deployed Bytecode Sourcemap
68758:4991:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17759:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23406:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25352:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24900:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69111:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71016:486;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69020:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16813:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68896:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34617:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69214:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69167:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73237:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69063:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71510:297;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72192:112;;;:::i;:::-;;26242:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72312:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51860:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23195:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68965:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18438:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59242:103;;;;;;;;;;;;;:::i;:::-;;55672:892;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58594:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72506:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72767:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23575:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52718:2505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69327:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69994:890;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25628:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26498:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72410:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51281:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69692:294;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69291:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69253:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72071:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26007:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68939:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72602:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68993:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73336:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59500:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73003:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17759:615;17844:4;18159:10;18144:25;;:11;:25;;;;:102;;;;18236:10;18221:25;;:11;:25;;;;18144:102;:179;;;;18313:10;18298:25;;:11;:25;;;;18144:179;18124:199;;17759:615;;;:::o;23406:100::-;23460:13;23493:5;23486:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23406:100;:::o;25352:204::-;25420:7;25445:16;25453:7;25445;:16::i;:::-;25440:64;;25470:34;;;;;;;;;;;;;;25440:64;25524:15;:24;25540:7;25524:24;;;;;;;;;;;;;;;;;;;;;25517:31;;25352:204;;;:::o;24900:386::-;24973:13;24989:16;24997:7;24989;:16::i;:::-;24973:32;;25045:5;25022:28;;:19;:17;:19::i;:::-;:28;;;25018:175;;25070:44;25087:5;25094:19;:17;:19::i;:::-;25070:16;:44::i;:::-;25065:128;;25142:35;;;;;;;;;;;;;;25065:128;25018:175;25232:2;25205:15;:24;25221:7;25205:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25270:7;25266:2;25250:28;;25259:5;25250:28;;;;;;;;;;;;24962:324;24900:386;;:::o;69111:49::-;69159:1;69111:49;:::o;71016:486::-;71151:17;71141:27;;;;;;;;:::i;:::-;;:6;;;;;;;;;;;:27;;;;;;;;:::i;:::-;;;71133:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;71219:10;71206:23;;:9;:23;;;71198:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;71278:34;71286:17;71292:10;71286:5;:17::i;:::-;71305:6;71278:7;:34::i;:::-;71270:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;71404:20;;71392:8;71365:24;71378:10;71365:12;:24::i;:::-;:35;;;;:::i;:::-;:59;;71343:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;71476:18;71485:8;71476;:18::i;:::-;71016:486;;:::o;69020:36::-;;;;:::o;16813:315::-;16866:7;17094:15;:13;:15::i;:::-;17079:12;;17063:13;;:28;:46;17056:53;;16813:315;:::o;68896:36::-;;;;;;;;;;;;;:::o;34617:2800::-;34751:27;34781;34800:7;34781:18;:27::i;:::-;34751:57;;34866:4;34825:45;;34841:19;34825:45;;;34821:86;;34879:28;;;;;;;;;;;;;;34821:86;34921:27;34950:23;34977:28;34997:7;34977:19;:28::i;:::-;34920:85;;;;35105:62;35124:15;35141:4;35147:19;:17;:19::i;:::-;35105:18;:62::i;:::-;35100:174;;35187:43;35204:4;35210:19;:17;:19::i;:::-;35187:16;:43::i;:::-;35182:92;;35239:35;;;;;;;;;;;;;;35182:92;35100:174;35305:1;35291:16;;:2;:16;;;35287:52;;;35316:23;;;;;;;;;;;;;;35287:52;35352:43;35374:4;35380:2;35384:7;35393:1;35352:21;:43::i;:::-;35488:15;35485:160;;;35628:1;35607:19;35600:30;35485:160;36023:18;:24;36042:4;36023:24;;;;;;;;;;;;;;;;36021:26;;;;;;;;;;;;36092:18;:22;36111:2;36092:22;;;;;;;;;;;;;;;;36090:24;;;;;;;;;;;36414:145;36451:2;36499:45;36514:4;36520:2;36524:19;36499:14;:45::i;:::-;14041:8;36472:72;36414:18;:145::i;:::-;36385:17;:26;36403:7;36385:26;;;;;;;;;;;:174;;;;36729:1;14041:8;36679:19;:46;:51;36675:626;;;36751:19;36783:1;36773:7;:11;36751:33;;36940:1;36906:17;:30;36924:11;36906:30;;;;;;;;;;;;:35;36902:384;;;37044:13;;37029:11;:28;37025:242;;37224:19;37191:17;:30;37209:11;37191:30;;;;;;;;;;;:52;;;;37025:242;36902:384;36732:569;36675:626;37348:7;37344:2;37329:27;;37338:4;37329:27;;;;;;;;;;;;37367:42;37388:4;37394:2;37398:7;37407:1;37367:20;:42::i;:::-;34740:2677;;;34617:2800;;;:::o;69214:32::-;;;;:::o;69167:40::-;69204:3;69167:40;:::o;73237:91::-;58480:13;:11;:13::i;:::-;73311:9:::1;73302:6;;:18;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;73237:91:::0;:::o;69063:39::-;;;;:::o;71510:297::-;58480:13;:11;:13::i;:::-;69204:3:::1;71632:8;71605:24;71618:10;71605:12;:24::i;:::-;:35;;;;:::i;:::-;:49;;71583:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;69204:3;71730:8;71714:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;71706:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;71781:18;71790:8;71781;:18::i;:::-;71510:297:::0;:::o;72192:112::-;58480:13;:11;:13::i;:::-;72256:7:::1;:5;:7::i;:::-;72248:25;;:48;72274:21;72248:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;72192:112::o:0;26242:185::-;26380:39;26397:4;26403:2;26407:7;26380:39;;;;;;;;;;;;:16;:39::i;:::-;26242:185;;;:::o;72312:90::-;58480:13;:11;:13::i;:::-;72391:3:::1;;72381:7;:13;;;;;;;:::i;:::-;;72312:90:::0;;:::o;51860:468::-;51949:23;52010:22;52035:8;:15;52010:40;;52065:34;52123:14;52102:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;52065:73;;52158:9;52153:125;52174:14;52169:1;:19;52153:125;;52230:32;52250:8;52259:1;52250:11;;;;;;;;:::i;:::-;;;;;;;;52230:19;:32::i;:::-;52214:10;52225:1;52214:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;52190:3;;;;;52153:125;;;;52299:10;52292:17;;;;51860:468;;;:::o;23195:144::-;23259:7;23302:27;23321:7;23302:18;:27::i;:::-;23279:52;;23195:144;;;:::o;68965:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18438:224::-;18502:7;18543:1;18526:19;;:5;:19;;;18522:60;;;18554:28;;;;;;;;;;;;;;18522:60;12993:13;18600:18;:25;18619:5;18600:25;;;;;;;;;;;;;;;;:54;18593:61;;18438:224;;;:::o;59242:103::-;58480:13;:11;:13::i;:::-;59307:30:::1;59334:1;59307:18;:30::i;:::-;59242:103::o:0;55672:892::-;55742:16;55796:19;55830:25;55870:22;55895:16;55905:5;55895:9;:16::i;:::-;55870:41;;55926:25;55968:14;55954:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55926:57;;55998:31;;:::i;:::-;56049:9;56061:15;:13;:15::i;:::-;56049:27;;56044:472;56093:14;56078:11;:29;56044:472;;56145:15;56158:1;56145:12;:15::i;:::-;56133:27;;56183:9;:16;;;56179:73;;;56224:8;;56179:73;56300:1;56274:28;;:9;:14;;;:28;;;56270:111;;56347:9;:14;;;56327:34;;56270:111;56424:5;56403:26;;:17;:26;;;56399:102;;;56480:1;56454:8;56463:13;;;;;;56454:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;56399:102;56044:472;56109:3;;;;;56044:472;;;;56537:8;56530:15;;;;;;;55672:892;;;:::o;58594:87::-;58640:7;58667:6;;;;;;;;;;;58660:13;;58594:87;:::o;72506:88::-;58480:13;:11;:13::i;:::-;72578:8:::1;72570:5;:16;;;;72506:88:::0;:::o;72767:228::-;58480:13;:11;:13::i;:::-;72870:9:::1;;72860:6;:19;;72838:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;72981:6;72969:9;:18;;;;72767:228:::0;:::o;23575:104::-;23631:13;23664:7;23657:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23575:104;:::o;52718:2505::-;52853:16;52920:4;52911:5;:13;52907:45;;52933:19;;;;;;;;;;;;;;52907:45;52967:19;53001:17;53021:14;:12;:14::i;:::-;53001:34;;53121:15;:13;:15::i;:::-;53113:5;:23;53109:87;;;53165:15;:13;:15::i;:::-;53157:23;;53109:87;53272:9;53265:4;:16;53261:73;;;53309:9;53302:16;;53261:73;53348:25;53376:16;53386:5;53376:9;:16::i;:::-;53348:44;;53570:4;53562:5;:12;53558:278;;;53595:19;53624:5;53617:4;:12;53595:34;;53666:17;53652:11;:31;53648:111;;;53728:11;53708:31;;53648:111;53576:198;53558:278;;;53819:1;53799:21;;53558:278;53850:25;53892:17;53878:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53850:60;;53950:1;53929:17;:22;53925:78;;;53979:8;53972:15;;;;;;;;53925:78;54147:31;54181:26;54201:5;54181:19;:26::i;:::-;54147:60;;54222:25;54467:9;:16;;;54462:92;;54524:9;:14;;;54504:34;;54462:92;54573:9;54585:5;54573:17;;54568:478;54597:4;54592:1;:9;;:45;;;;;54620:17;54605:11;:32;;54592:45;54568:478;;;54675:15;54688:1;54675:12;:15::i;:::-;54663:27;;54713:9;:16;;;54709:73;;;54754:8;;54709:73;54830:1;54804:28;;:9;:14;;;:28;;;54800:111;;54877:9;:14;;;54857:34;;54800:111;54954:5;54933:26;;:17;:26;;;54929:102;;;55010:1;54984:8;54993:13;;;;;;54984:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;54929:102;54568:478;54639:3;;;;;54568:478;;;;55148:11;55138:8;55131:29;55196:8;55189:15;;;;;;;;52718:2505;;;;;;:::o;69327:39::-;;;;:::o;69994:890::-;70072:14;70062:24;;;;;;;;:::i;:::-;;:6;;;;;;;;;;;:24;;;;;;;;:::i;:::-;;;70054:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;70134:10;70121:23;;:9;:23;;;70113:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;70221:9;;70209:8;70193:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;70185:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;70320:17;;70308:8;70281:24;70294:10;70281:12;:24::i;:::-;:35;;;;:::i;:::-;:56;;70259:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;70408:1;70397:8;:12;70389:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;70443:27;70473:8;70443:38;;69159:1;70510:24;70523:10;70510:12;:24::i;:::-;:48;:88;;;;;70588:10;;70575;;:23;70510:88;70492:249;;;69159:1;70647:8;:32;;;;:::i;:::-;70625:54;;69159:1;70694:10;;:35;;;;;;;:::i;:::-;;;;;;;;70492:249;70751:39;70770:19;70762:5;;:27;;;;:::i;:::-;70751:10;:39::i;:::-;70801:31;70811:10;70823:8;70801:9;:31::i;:::-;70848:28;70855:10;70867:8;70848:28;;;;;;;:::i;:::-;;;;;;;;70043:841;69994:890;:::o;25628:308::-;25739:19;:17;:19::i;:::-;25727:31;;:8;:31;;;25723:61;;;25767:17;;;;;;;;;;;;;;25723:61;25849:8;25797:18;:39;25816:19;:17;:19::i;:::-;25797:39;;;;;;;;;;;;;;;:49;25837:8;25797:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25909:8;25873:55;;25888:19;:17;:19::i;:::-;25873:55;;;25919:8;25873:55;;;;;;:::i;:::-;;;;;;;;25628:308;;:::o;26498:399::-;26665:31;26678:4;26684:2;26688:7;26665:12;:31::i;:::-;26729:1;26711:2;:14;;;:19;26707:183;;26750:56;26781:4;26787:2;26791:7;26800:5;26750:30;:56::i;:::-;26745:145;;26834:40;;;;;;;;;;;;;;26745:145;26707:183;26498:399;;;;:::o;72410:88::-;58480:13;:11;:13::i;:::-;72487:3:::1;;72478:6;:12;;;;;;;:::i;:::-;;72410:88:::0;;:::o;51281:420::-;51357:21;;:::i;:::-;51391:31;;:::i;:::-;51447:15;:13;:15::i;:::-;51437:7;:25;:54;;;;51477:14;:12;:14::i;:::-;51466:7;:25;;51437:54;51433:103;;;51515:9;51508:16;;;;;51433:103;51558:21;51571:7;51558:12;:21::i;:::-;51546:33;;51594:9;:16;;;51590:65;;;51634:9;51627:16;;;;;51590:65;51672:21;51685:7;51672:12;:21::i;:::-;51665:28;;;51281:420;;;;:::o;69692:294::-;69793:13;69869:1;69850:7;69844:21;;;;;:::i;:::-;;;:26;;:134;;69972:6;69844:134;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69914:7;69923:18;69933:7;69923:9;:18::i;:::-;69897:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69844:134;69824:154;;69692:294;;;:::o;69291:29::-;;;;:::o;69253:31::-;;;;:::o;72071:113::-;72129:7;72156:20;72170:5;72156:13;:20::i;:::-;72149:27;;72071:113;;;:::o;26007:164::-;26104:4;26128:18;:25;26147:5;26128:25;;;;;;;;;;;;;;;:35;26154:8;26128:35;;;;;;;;;;;;;;;;;;;;;;;;;26121:42;;26007:164;;;;:::o;68939:19::-;;;;:::o;72602:157::-;58480:13;:11;:13::i;:::-;72697:7:::1;;72705:1;72697:10;;;;;;;:::i;:::-;;;;;;;;72677:17;:30;;;;72741:7;;72749:1;72741:10;;;;;;;:::i;:::-;;;;;;;;72718:20;:33;;;;72602:157:::0;;:::o;68993:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73336:89::-;58480:13;:11;:13::i;:::-;73411:5:::1;73403:14;;73396:4;:21;;;;73336:89:::0;:::o;59500:201::-;58480:13;:11;:13::i;:::-;59609:1:::1;59589:22;;:8;:22;;;;59581:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;59665:28;59684:8;59665:18;:28::i;:::-;59500:201:::0;:::o;73003:226::-;58480:13;:11;:13::i;:::-;73102:9:::1;;73092:6;:19;;73070:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;73215:6;73202:10;:19;;;;73003:226:::0;:::o;27152:273::-;27209:4;27265:7;27246:15;:13;:15::i;:::-;:26;;:66;;;;;27299:13;;27289:7;:23;27246:66;:152;;;;;27397:1;13763:8;27350:17;:26;27368:7;27350:26;;;;;;;;;;;;:43;:48;27246:152;27226:172;;27152:273;;;:::o;45713:105::-;45773:7;45800:10;45793:17;;45713:105;:::o;73433:126::-;73488:7;73542;73525:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;73515:36;;;;;;73508:43;;73433:126;;;:::o;73567:179::-;73672:4;73701:37;73720:5;73727:4;;73733;73701:18;:37::i;:::-;73694:44;;73567:179;;;;:::o;71815:248::-;71903:10;;71891:8;71878:10;;:21;;;;:::i;:::-;:35;;71870:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;71947:31;71957:10;71969:8;71947:9;:31::i;:::-;72003:8;71989:10;;:22;;;;;;;:::i;:::-;;;;;;;;72027:28;72034:10;72046:8;72027:28;;;;;;;:::i;:::-;;;;;;;;71815:248;:::o;69483:93::-;69540:7;69567:1;69560:8;;69483:93;:::o;20112:1129::-;20179:7;20199:12;20214:7;20199:22;;20282:4;20263:15;:13;:15::i;:::-;:23;20259:915;;20316:13;;20309:4;:20;20305:869;;;20354:14;20371:17;:23;20389:4;20371:23;;;;;;;;;;;;20354:40;;20487:1;13763:8;20460:6;:23;:28;20456:699;;;20979:113;20996:1;20986:6;:11;20979:113;;;21039:17;:25;21057:6;;;;;;;21039:25;;;;;;;;;;;;21030:34;;20979:113;;;21125:6;21118:13;;;;;;20456:699;20331:843;20305:869;20259:915;21202:31;;;;;;;;;;;;;;20112:1129;;;;:::o;32953:652::-;33048:27;33077:23;33118:53;33174:15;33118:71;;33360:7;33354:4;33347:21;33395:22;33389:4;33382:36;33471:4;33465;33455:21;33432:44;;33567:19;33561:26;33542:45;;33298:300;32953:652;;;:::o;33718:645::-;33860:11;34022:15;34016:4;34012:26;34004:34;;34181:15;34170:9;34166:31;34153:44;;34328:15;34317:9;34314:30;34307:4;34296:9;34293:19;34290:55;34280:65;;33718:645;;;;;:::o;44546:159::-;;;;;:::o;42858:309::-;42993:7;43013:16;14164:3;43039:19;:40;;43013:67;;14164:3;43106:31;43117:4;43123:2;43127:9;43106:10;:31::i;:::-;43098:40;;:61;;43091:68;;;42858:309;;;;;:::o;22686:447::-;22766:14;22934:15;22927:5;22923:27;22914:36;;23108:5;23094:11;23070:22;23066:40;23063:51;23056:5;23053:62;23043:72;;22686:447;;;;:::o;45364:158::-;;;;;:::o;58759:132::-;58834:12;:10;:12::i;:::-;58823:23;;:7;:5;:7::i;:::-;:23;;;58815:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58759:132::o;59861:191::-;59935:16;59954:6;;;;;;;;;;;59935:25;;59980:8;59971:6;;:17;;;;;;;;;;;;;;;;;;60035:8;60004:40;;60025:8;60004:40;;;;;;;;;;;;59924:128;59861:191;:::o;21789:153::-;21849:21;;:::i;:::-;21890:44;21909:17;:24;21927:5;21909:24;;;;;;;;;;;;21890:18;:44::i;:::-;21883:51;;21789:153;;;:::o;16508:95::-;16555:7;16582:13;;16575:20;;16508:95;:::o;70892:116::-;70968:6;70955:9;:19;;70947:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;70892:116;:::o;27509:104::-;27578:27;27588:2;27592:8;27578:27;;;;;;;;;;;;:9;:27::i;:::-;27509:104;;:::o;41368:716::-;41531:4;41577:2;41552:45;;;41598:19;:17;:19::i;:::-;41619:4;41625:7;41634:5;41552:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41548:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41852:1;41835:6;:13;:18;41831:235;;;41881:40;;;;;;;;;;;;;;41831:235;42024:6;42018:13;42009:6;42005:2;42001:15;41994:38;41548:529;41721:54;;;41711:64;;;:6;:64;;;;41704:71;;;41368:716;;;;;;:::o;22445:158::-;22507:21;;:::i;:::-;22548:47;22567:27;22586:7;22567:18;:27::i;:::-;22548:18;:47::i;:::-;22541:54;;22445:158;;;:::o;45924:1960::-;45981:17;46400:3;46393:4;46387:11;46383:21;46376:28;;46491:3;46485:4;46478:17;46597:3;47053:5;47183:1;47178:3;47174:11;47167:18;;47320:2;47314:4;47310:13;47306:2;47302:22;47297:3;47289:36;47361:2;47355:4;47351:13;47343:21;;46945:697;47380:4;46945:697;;;47571:1;47566:3;47562:11;47555:18;;47622:2;47616:4;47612:13;47608:2;47604:22;47599:3;47591:36;47475:2;47469:4;47465:13;47457:21;;46945:697;;;46949:430;47681:3;47676;47672:13;47796:2;47791:3;47787:12;47780:19;;47859:6;47854:3;47847:19;46020:1857;;45924:1960;;;:::o;18744:176::-;18805:7;12993:13;13130:2;18833:18;:25;18852:5;18833:25;;;;;;;;;;;;;;;;:49;;18832:80;18825:87;;18744:176;;;:::o;61207:190::-;61332:4;61385;61356:25;61369:5;61376:4;61356:12;:25::i;:::-;:33;61349:40;;61207:190;;;;;:::o;43743:147::-;43880:6;43743:147;;;;;:::o;57198:98::-;57251:7;57278:10;57271:17;;57198:98;:::o;21335:363::-;21401:31;;:::i;:::-;21478:6;21445:9;:14;;:41;;;;;;;;;;;13647:3;21531:6;:32;;21497:9;:24;;:67;;;;;;;;;;;21621:1;13763:8;21594:6;:23;:28;;21575:9;:16;;:47;;;;;;;;;;;14164:3;21662:6;:27;;21633:9;:19;;:57;;;;;;;;;;;21335:363;;;:::o;28029:681::-;28152:19;28158:2;28162:8;28152:5;:19::i;:::-;28231:1;28213:2;:14;;;:19;28209:483;;28253:11;28267:13;;28253:27;;28299:13;28321:8;28315:3;:14;28299:30;;28348:233;28379:62;28418:1;28422:2;28426:7;;;;;;28435:5;28379:30;:62::i;:::-;28374:167;;28477:40;;;;;;;;;;;;;;28374:167;28576:3;28568:5;:11;28348:233;;28663:3;28646:13;;:20;28642:34;;28668:8;;;28642:34;28234:458;;28209:483;28029:681;;;:::o;62074:296::-;62157:7;62177:20;62200:4;62177:27;;62220:9;62215:118;62239:5;:12;62235:1;:16;62215:118;;;62288:33;62298:12;62312:5;62318:1;62312:8;;;;;;;;:::i;:::-;;;;;;;;62288:9;:33::i;:::-;62273:48;;62253:3;;;;;:::i;:::-;;;;62215:118;;;;62350:12;62343:19;;;62074:296;;;;:::o;28983:1529::-;29048:20;29071:13;;29048:36;;29113:1;29099:16;;:2;:16;;;29095:48;;;29124:19;;;;;;;;;;;;;;29095:48;29170:1;29158:8;:13;29154:44;;;29180:18;;;;;;;;;;;;;;29154:44;29211:61;29241:1;29245:2;29249:12;29263:8;29211:21;:61::i;:::-;29754:1;13130:2;29725:1;:25;;29724:31;29712:8;:44;29686:18;:22;29705:2;29686:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;30033:139;30070:2;30124:33;30147:1;30151:2;30155:1;30124:14;:33::i;:::-;30091:30;30112:8;30091:20;:30::i;:::-;:66;30033:18;:139::i;:::-;29999:17;:31;30017:12;29999:31;;;;;;;;;;;:173;;;;30189:15;30207:12;30189:30;;30234:11;30263:8;30248:12;:23;30234:37;;30286:101;30338:9;;;;;;30334:2;30313:35;;30330:1;30313:35;;;;;;;;;;;;30382:3;30372:7;:13;30286:101;;30419:3;30403:13;:19;;;;29460:974;;30444:60;30473:1;30477:2;30481:12;30495:8;30444:20;:60::i;:::-;29037:1475;28983:1529;;:::o;68281:149::-;68344:7;68375:1;68371;:5;:51;;68402:20;68417:1;68420;68402:14;:20::i;:::-;68371:51;;;68379:20;68394:1;68397;68379:14;:20::i;:::-;68371:51;68364:58;;68281:149;;;;:::o;24516:322::-;24586:14;24817:1;24807:8;24804:15;24779:23;24775:45;24765:55;;24516:322;;;:::o;68438:268::-;68506:13;68613:1;68607:4;68600:15;68642:1;68636:4;68629:15;68683:4;68677;68667:21;68658:30;;68438:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:139::-;1959:5;1997:6;1984:20;1975:29;;2013:33;2040:5;2013:33;:::i;:::-;1913:139;;;;:::o;2075:370::-;2146:5;2195:3;2188:4;2180:6;2176:17;2172:27;2162:122;;2203:79;;:::i;:::-;2162:122;2320:6;2307:20;2345:94;2435:3;2427:6;2420:4;2412:6;2408:17;2345:94;:::i;:::-;2336:103;;2152:293;2075:370;;;;:::o;2468:568::-;2541:8;2551:6;2601:3;2594:4;2586:6;2582:17;2578:27;2568:122;;2609:79;;:::i;:::-;2568:122;2722:6;2709:20;2699:30;;2752:18;2744:6;2741:30;2738:117;;;2774:79;;:::i;:::-;2738:117;2888:4;2880:6;2876:17;2864:29;;2942:3;2934:4;2926:6;2922:17;2912:8;2908:32;2905:41;2902:128;;;2949:79;;:::i;:::-;2902:128;2468:568;;;;;:::o;3059:370::-;3130:5;3179:3;3172:4;3164:6;3160:17;3156:27;3146:122;;3187:79;;:::i;:::-;3146:122;3304:6;3291:20;3329:94;3419:3;3411:6;3404:4;3396:6;3392:17;3329:94;:::i;:::-;3320:103;;3136:293;3059:370;;;;:::o;3435:133::-;3478:5;3516:6;3503:20;3494:29;;3532:30;3556:5;3532:30;:::i;:::-;3435:133;;;;:::o;3574:139::-;3620:5;3658:6;3645:20;3636:29;;3674:33;3701:5;3674:33;:::i;:::-;3574:139;;;;:::o;3719:137::-;3764:5;3802:6;3789:20;3780:29;;3818:32;3844:5;3818:32;:::i;:::-;3719:137;;;;:::o;3862:141::-;3918:5;3949:6;3943:13;3934:22;;3965:32;3991:5;3965:32;:::i;:::-;3862:141;;;;:::o;4022:338::-;4077:5;4126:3;4119:4;4111:6;4107:17;4103:27;4093:122;;4134:79;;:::i;:::-;4093:122;4251:6;4238:20;4276:78;4350:3;4342:6;4335:4;4327:6;4323:17;4276:78;:::i;:::-;4267:87;;4083:277;4022:338;;;;:::o;4366:161::-;4423:5;4461:6;4448:20;4439:29;;4477:44;4515:5;4477:44;:::i;:::-;4366:161;;;;:::o;4547:553::-;4605:8;4615:6;4665:3;4658:4;4650:6;4646:17;4642:27;4632:122;;4673:79;;:::i;:::-;4632:122;4786:6;4773:20;4763:30;;4816:18;4808:6;4805:30;4802:117;;;4838:79;;:::i;:::-;4802:117;4952:4;4944:6;4940:17;4928:29;;5006:3;4998:4;4990:6;4986:17;4976:8;4972:32;4969:41;4966:128;;;5013:79;;:::i;:::-;4966:128;4547:553;;;;;:::o;5106:139::-;5152:5;5190:6;5177:20;5168:29;;5206:33;5233:5;5206:33;:::i;:::-;5106:139;;;;:::o;5251:329::-;5310:6;5359:2;5347:9;5338:7;5334:23;5330:32;5327:119;;;5365:79;;:::i;:::-;5327:119;5485:1;5510:53;5555:7;5546:6;5535:9;5531:22;5510:53;:::i;:::-;5500:63;;5456:117;5251:329;;;;:::o;5586:474::-;5654:6;5662;5711:2;5699:9;5690:7;5686:23;5682:32;5679:119;;;5717:79;;:::i;:::-;5679:119;5837:1;5862:53;5907:7;5898:6;5887:9;5883:22;5862:53;:::i;:::-;5852:63;;5808:117;5964:2;5990:53;6035:7;6026:6;6015:9;6011:22;5990:53;:::i;:::-;5980:63;;5935:118;5586:474;;;;;:::o;6066:619::-;6143:6;6151;6159;6208:2;6196:9;6187:7;6183:23;6179:32;6176:119;;;6214:79;;:::i;:::-;6176:119;6334:1;6359:53;6404:7;6395:6;6384:9;6380:22;6359:53;:::i;:::-;6349:63;;6305:117;6461:2;6487:53;6532:7;6523:6;6512:9;6508:22;6487:53;:::i;:::-;6477:63;;6432:118;6589:2;6615:53;6660:7;6651:6;6640:9;6636:22;6615:53;:::i;:::-;6605:63;;6560:118;6066:619;;;;;:::o;6691:943::-;6786:6;6794;6802;6810;6859:3;6847:9;6838:7;6834:23;6830:33;6827:120;;;6866:79;;:::i;:::-;6827:120;6986:1;7011:53;7056:7;7047:6;7036:9;7032:22;7011:53;:::i;:::-;7001:63;;6957:117;7113:2;7139:53;7184:7;7175:6;7164:9;7160:22;7139:53;:::i;:::-;7129:63;;7084:118;7241:2;7267:53;7312:7;7303:6;7292:9;7288:22;7267:53;:::i;:::-;7257:63;;7212:118;7397:2;7386:9;7382:18;7369:32;7428:18;7420:6;7417:30;7414:117;;;7450:79;;:::i;:::-;7414:117;7555:62;7609:7;7600:6;7589:9;7585:22;7555:62;:::i;:::-;7545:72;;7340:287;6691:943;;;;;;;:::o;7640:468::-;7705:6;7713;7762:2;7750:9;7741:7;7737:23;7733:32;7730:119;;;7768:79;;:::i;:::-;7730:119;7888:1;7913:53;7958:7;7949:6;7938:9;7934:22;7913:53;:::i;:::-;7903:63;;7859:117;8015:2;8041:50;8083:7;8074:6;8063:9;8059:22;8041:50;:::i;:::-;8031:60;;7986:115;7640:468;;;;;:::o;8114:474::-;8182:6;8190;8239:2;8227:9;8218:7;8214:23;8210:32;8207:119;;;8245:79;;:::i;:::-;8207:119;8365:1;8390:53;8435:7;8426:6;8415:9;8411:22;8390:53;:::i;:::-;8380:63;;8336:117;8492:2;8518:53;8563:7;8554:6;8543:9;8539:22;8518:53;:::i;:::-;8508:63;;8463:118;8114:474;;;;;:::o;8594:619::-;8671:6;8679;8687;8736:2;8724:9;8715:7;8711:23;8707:32;8704:119;;;8742:79;;:::i;:::-;8704:119;8862:1;8887:53;8932:7;8923:6;8912:9;8908:22;8887:53;:::i;:::-;8877:63;;8833:117;8989:2;9015:53;9060:7;9051:6;9040:9;9036:22;9015:53;:::i;:::-;9005:63;;8960:118;9117:2;9143:53;9188:7;9179:6;9168:9;9164:22;9143:53;:::i;:::-;9133:63;;9088:118;8594:619;;;;;:::o;9219:684::-;9312:6;9320;9369:2;9357:9;9348:7;9344:23;9340:32;9337:119;;;9375:79;;:::i;:::-;9337:119;9523:1;9512:9;9508:17;9495:31;9553:18;9545:6;9542:30;9539:117;;;9575:79;;:::i;:::-;9539:117;9680:78;9750:7;9741:6;9730:9;9726:22;9680:78;:::i;:::-;9670:88;;9466:302;9807:2;9833:53;9878:7;9869:6;9858:9;9854:22;9833:53;:::i;:::-;9823:63;;9778:118;9219:684;;;;;:::o;9909:559::-;9995:6;10003;10052:2;10040:9;10031:7;10027:23;10023:32;10020:119;;;10058:79;;:::i;:::-;10020:119;10206:1;10195:9;10191:17;10178:31;10236:18;10228:6;10225:30;10222:117;;;10258:79;;:::i;:::-;10222:117;10371:80;10443:7;10434:6;10423:9;10419:22;10371:80;:::i;:::-;10353:98;;;;10149:312;9909:559;;;;;:::o;10474:539::-;10558:6;10607:2;10595:9;10586:7;10582:23;10578:32;10575:119;;;10613:79;;:::i;:::-;10575:119;10761:1;10750:9;10746:17;10733:31;10791:18;10783:6;10780:30;10777:117;;;10813:79;;:::i;:::-;10777:117;10918:78;10988:7;10979:6;10968:9;10964:22;10918:78;:::i;:::-;10908:88;;10704:302;10474:539;;;;:::o;11019:327::-;11077:6;11126:2;11114:9;11105:7;11101:23;11097:32;11094:119;;;11132:79;;:::i;:::-;11094:119;11252:1;11277:52;11321:7;11312:6;11301:9;11297:22;11277:52;:::i;:::-;11267:62;;11223:116;11019:327;;;;:::o;11352:349::-;11421:6;11470:2;11458:9;11449:7;11445:23;11441:32;11438:119;;;11476:79;;:::i;:::-;11438:119;11596:1;11621:63;11676:7;11667:6;11656:9;11652:22;11621:63;:::i;:::-;11611:73;;11567:127;11352:349;;;;:::o;11707:351::-;11777:6;11826:2;11814:9;11805:7;11801:23;11797:32;11794:119;;;11832:79;;:::i;:::-;11794:119;11952:1;11977:64;12033:7;12024:6;12013:9;12009:22;11977:64;:::i;:::-;11967:74;;11923:128;11707:351;;;;:::o;12064:529::-;12135:6;12143;12192:2;12180:9;12171:7;12167:23;12163:32;12160:119;;;12198:79;;:::i;:::-;12160:119;12346:1;12335:9;12331:17;12318:31;12376:18;12368:6;12365:30;12362:117;;;12398:79;;:::i;:::-;12362:117;12511:65;12568:7;12559:6;12548:9;12544:22;12511:65;:::i;:::-;12493:83;;;;12289:297;12064:529;;;;;:::o;12599:329::-;12658:6;12707:2;12695:9;12686:7;12682:23;12678:32;12675:119;;;12713:79;;:::i;:::-;12675:119;12833:1;12858:53;12903:7;12894:6;12883:9;12879:22;12858:53;:::i;:::-;12848:63;;12804:117;12599:329;;;;:::o;12934:299::-;13063:10;13084:106;13186:3;13178:6;13084:106;:::i;:::-;13222:4;13217:3;13213:14;13199:28;;12934:299;;;;:::o;13239:179::-;13308:10;13329:46;13371:3;13363:6;13329:46;:::i;:::-;13407:4;13402:3;13398:14;13384:28;;13239:179;;;;:::o;13424:108::-;13501:24;13519:5;13501:24;:::i;:::-;13496:3;13489:37;13424:108;;:::o;13538:118::-;13625:24;13643:5;13625:24;:::i;:::-;13620:3;13613:37;13538:118;;:::o;13662:157::-;13767:45;13787:24;13805:5;13787:24;:::i;:::-;13767:45;:::i;:::-;13762:3;13755:58;13662:157;;:::o;13901:972::-;14080:3;14109:84;14187:5;14109:84;:::i;:::-;14209:116;14318:6;14313:3;14209:116;:::i;:::-;14202:123;;14349:86;14429:5;14349:86;:::i;:::-;14458:7;14489:1;14474:374;14499:6;14496:1;14493:13;14474:374;;;14575:6;14569:13;14602:123;14721:3;14706:13;14602:123;:::i;:::-;14595:130;;14748:90;14831:6;14748:90;:::i;:::-;14738:100;;14534:314;14521:1;14518;14514:9;14509:14;;14474:374;;;14478:14;14864:3;14857:10;;14085:788;;;13901:972;;;;:::o;14909:732::-;15028:3;15057:54;15105:5;15057:54;:::i;:::-;15127:86;15206:6;15201:3;15127:86;:::i;:::-;15120:93;;15237:56;15287:5;15237:56;:::i;:::-;15316:7;15347:1;15332:284;15357:6;15354:1;15351:13;15332:284;;;15433:6;15427:13;15460:63;15519:3;15504:13;15460:63;:::i;:::-;15453:70;;15546:60;15599:6;15546:60;:::i;:::-;15536:70;;15392:224;15379:1;15376;15372:9;15367:14;;15332:284;;;15336:14;15632:3;15625:10;;15033:608;;;14909:732;;;;:::o;15647:99::-;15718:21;15733:5;15718:21;:::i;:::-;15713:3;15706:34;15647:99;;:::o;15752:109::-;15833:21;15848:5;15833:21;:::i;:::-;15828:3;15821:34;15752:109;;:::o;15867:118::-;15954:24;15972:5;15954:24;:::i;:::-;15949:3;15942:37;15867:118;;:::o;15991:360::-;16077:3;16105:38;16137:5;16105:38;:::i;:::-;16159:70;16222:6;16217:3;16159:70;:::i;:::-;16152:77;;16238:52;16283:6;16278:3;16271:4;16264:5;16260:16;16238:52;:::i;:::-;16315:29;16337:6;16315:29;:::i;:::-;16310:3;16306:39;16299:46;;16081:270;15991:360;;;;:::o;16357:149::-;16453:46;16493:5;16453:46;:::i;:::-;16448:3;16441:59;16357:149;;:::o;16512:364::-;16600:3;16628:39;16661:5;16628:39;:::i;:::-;16683:71;16747:6;16742:3;16683:71;:::i;:::-;16676:78;;16763:52;16808:6;16803:3;16796:4;16789:5;16785:16;16763:52;:::i;:::-;16840:29;16862:6;16840:29;:::i;:::-;16835:3;16831:39;16824:46;;16604:272;16512:364;;;;:::o;16882:377::-;16988:3;17016:39;17049:5;17016:39;:::i;:::-;17071:89;17153:6;17148:3;17071:89;:::i;:::-;17064:96;;17169:52;17214:6;17209:3;17202:4;17195:5;17191:16;17169:52;:::i;:::-;17246:6;17241:3;17237:16;17230:23;;16992:267;16882:377;;;;:::o;17289:845::-;17392:3;17429:5;17423:12;17458:36;17484:9;17458:36;:::i;:::-;17510:89;17592:6;17587:3;17510:89;:::i;:::-;17503:96;;17630:1;17619:9;17615:17;17646:1;17641:137;;;;17792:1;17787:341;;;;17608:520;;17641:137;17725:4;17721:9;17710;17706:25;17701:3;17694:38;17761:6;17756:3;17752:16;17745:23;;17641:137;;17787:341;17854:38;17886:5;17854:38;:::i;:::-;17914:1;17928:154;17942:6;17939:1;17936:13;17928:154;;;18016:7;18010:14;18006:1;18001:3;17997:11;17990:35;18066:1;18057:7;18053:15;18042:26;;17964:4;17961:1;17957:12;17952:17;;17928:154;;;18111:6;18106:3;18102:16;18095:23;;17794:334;;17608:520;;17396:738;;17289:845;;;;:::o;18140:366::-;18282:3;18303:67;18367:2;18362:3;18303:67;:::i;:::-;18296:74;;18379:93;18468:3;18379:93;:::i;:::-;18497:2;18492:3;18488:12;18481:19;;18140:366;;;:::o;18512:::-;18654:3;18675:67;18739:2;18734:3;18675:67;:::i;:::-;18668:74;;18751:93;18840:3;18751:93;:::i;:::-;18869:2;18864:3;18860:12;18853:19;;18512:366;;;:::o;18884:::-;19026:3;19047:67;19111:2;19106:3;19047:67;:::i;:::-;19040:74;;19123:93;19212:3;19123:93;:::i;:::-;19241:2;19236:3;19232:12;19225:19;;18884:366;;;:::o;19256:::-;19398:3;19419:67;19483:2;19478:3;19419:67;:::i;:::-;19412:74;;19495:93;19584:3;19495:93;:::i;:::-;19613:2;19608:3;19604:12;19597:19;;19256:366;;;:::o;19628:::-;19770:3;19791:67;19855:2;19850:3;19791:67;:::i;:::-;19784:74;;19867:93;19956:3;19867:93;:::i;:::-;19985:2;19980:3;19976:12;19969:19;;19628:366;;;:::o;20000:::-;20142:3;20163:67;20227:2;20222:3;20163:67;:::i;:::-;20156:74;;20239:93;20328:3;20239:93;:::i;:::-;20357:2;20352:3;20348:12;20341:19;;20000:366;;;:::o;20372:400::-;20532:3;20553:84;20635:1;20630:3;20553:84;:::i;:::-;20546:91;;20646:93;20735:3;20646:93;:::i;:::-;20764:1;20759:3;20755:11;20748:18;;20372:400;;;:::o;20778:366::-;20920:3;20941:67;21005:2;21000:3;20941:67;:::i;:::-;20934:74;;21017:93;21106:3;21017:93;:::i;:::-;21135:2;21130:3;21126:12;21119:19;;20778:366;;;:::o;21150:::-;21292:3;21313:67;21377:2;21372:3;21313:67;:::i;:::-;21306:74;;21389:93;21478:3;21389:93;:::i;:::-;21507:2;21502:3;21498:12;21491:19;;21150:366;;;:::o;21522:::-;21664:3;21685:67;21749:2;21744:3;21685:67;:::i;:::-;21678:74;;21761:93;21850:3;21761:93;:::i;:::-;21879:2;21874:3;21870:12;21863:19;;21522:366;;;:::o;21894:::-;22036:3;22057:67;22121:2;22116:3;22057:67;:::i;:::-;22050:74;;22133:93;22222:3;22133:93;:::i;:::-;22251:2;22246:3;22242:12;22235:19;;21894:366;;;:::o;22266:::-;22408:3;22429:67;22493:2;22488:3;22429:67;:::i;:::-;22422:74;;22505:93;22594:3;22505:93;:::i;:::-;22623:2;22618:3;22614:12;22607:19;;22266:366;;;:::o;22638:::-;22780:3;22801:67;22865:2;22860:3;22801:67;:::i;:::-;22794:74;;22877:93;22966:3;22877:93;:::i;:::-;22995:2;22990:3;22986:12;22979:19;;22638:366;;;:::o;23082:862::-;23229:4;23224:3;23220:14;23316:4;23309:5;23305:16;23299:23;23335:63;23392:4;23387:3;23383:14;23369:12;23335:63;:::i;:::-;23244:164;23500:4;23493:5;23489:16;23483:23;23519:61;23574:4;23569:3;23565:14;23551:12;23519:61;:::i;:::-;23418:172;23674:4;23667:5;23663:16;23657:23;23693:57;23744:4;23739:3;23735:14;23721:12;23693:57;:::i;:::-;23600:160;23847:4;23840:5;23836:16;23830:23;23866:61;23921:4;23916:3;23912:14;23898:12;23866:61;:::i;:::-;23770:167;23198:746;23082:862;;:::o;24022:872::-;24179:4;24174:3;24170:14;24266:4;24259:5;24255:16;24249:23;24285:63;24342:4;24337:3;24333:14;24319:12;24285:63;:::i;:::-;24194:164;24450:4;24443:5;24439:16;24433:23;24469:61;24524:4;24519:3;24515:14;24501:12;24469:61;:::i;:::-;24368:172;24624:4;24617:5;24613:16;24607:23;24643:57;24694:4;24689:3;24685:14;24671:12;24643:57;:::i;:::-;24550:160;24797:4;24790:5;24786:16;24780:23;24816:61;24871:4;24866:3;24862:14;24848:12;24816:61;:::i;:::-;24720:167;24148:746;24022:872;;:::o;24900:105::-;24975:23;24992:5;24975:23;:::i;:::-;24970:3;24963:36;24900:105;;:::o;25011:108::-;25088:24;25106:5;25088:24;:::i;:::-;25083:3;25076:37;25011:108;;:::o;25125:118::-;25212:24;25230:5;25212:24;:::i;:::-;25207:3;25200:37;25125:118;;:::o;25249:105::-;25324:23;25341:5;25324:23;:::i;:::-;25319:3;25312:36;25249:105;;:::o;25360:256::-;25472:3;25487:75;25558:3;25549:6;25487:75;:::i;:::-;25587:2;25582:3;25578:12;25571:19;;25607:3;25600:10;;25360:256;;;;:::o;25622:695::-;25900:3;25922:92;26010:3;26001:6;25922:92;:::i;:::-;25915:99;;26031:95;26122:3;26113:6;26031:95;:::i;:::-;26024:102;;26143:148;26287:3;26143:148;:::i;:::-;26136:155;;26308:3;26301:10;;25622:695;;;;;:::o;26323:222::-;26416:4;26454:2;26443:9;26439:18;26431:26;;26467:71;26535:1;26524:9;26520:17;26511:6;26467:71;:::i;:::-;26323:222;;;;:::o;26551:640::-;26746:4;26784:3;26773:9;26769:19;26761:27;;26798:71;26866:1;26855:9;26851:17;26842:6;26798:71;:::i;:::-;26879:72;26947:2;26936:9;26932:18;26923:6;26879:72;:::i;:::-;26961;27029:2;27018:9;27014:18;27005:6;26961:72;:::i;:::-;27080:9;27074:4;27070:20;27065:2;27054:9;27050:18;27043:48;27108:76;27179:4;27170:6;27108:76;:::i;:::-;27100:84;;26551:640;;;;;;;:::o;27197:332::-;27318:4;27356:2;27345:9;27341:18;27333:26;;27369:71;27437:1;27426:9;27422:17;27413:6;27369:71;:::i;:::-;27450:72;27518:2;27507:9;27503:18;27494:6;27450:72;:::i;:::-;27197:332;;;;;:::o;27535:493::-;27738:4;27776:2;27765:9;27761:18;27753:26;;27825:9;27819:4;27815:20;27811:1;27800:9;27796:17;27789:47;27853:168;28016:4;28007:6;27853:168;:::i;:::-;27845:176;;27535:493;;;;:::o;28034:373::-;28177:4;28215:2;28204:9;28200:18;28192:26;;28264:9;28258:4;28254:20;28250:1;28239:9;28235:17;28228:47;28292:108;28395:4;28386:6;28292:108;:::i;:::-;28284:116;;28034:373;;;;:::o;28413:210::-;28500:4;28538:2;28527:9;28523:18;28515:26;;28551:65;28613:1;28602:9;28598:17;28589:6;28551:65;:::i;:::-;28413:210;;;;:::o;28629:222::-;28722:4;28760:2;28749:9;28745:18;28737:26;;28773:71;28841:1;28830:9;28826:17;28817:6;28773:71;:::i;:::-;28629:222;;;;:::o;28857:240::-;28959:4;28997:2;28986:9;28982:18;28974:26;;29010:80;29087:1;29076:9;29072:17;29063:6;29010:80;:::i;:::-;28857:240;;;;:::o;29103:313::-;29216:4;29254:2;29243:9;29239:18;29231:26;;29303:9;29297:4;29293:20;29289:1;29278:9;29274:17;29267:47;29331:78;29404:4;29395:6;29331:78;:::i;:::-;29323:86;;29103:313;;;;:::o;29422:419::-;29588:4;29626:2;29615:9;29611:18;29603:26;;29675:9;29669:4;29665:20;29661:1;29650:9;29646:17;29639:47;29703:131;29829:4;29703:131;:::i;:::-;29695:139;;29422:419;;;:::o;29847:::-;30013:4;30051:2;30040:9;30036:18;30028:26;;30100:9;30094:4;30090:20;30086:1;30075:9;30071:17;30064:47;30128:131;30254:4;30128:131;:::i;:::-;30120:139;;29847:419;;;:::o;30272:::-;30438:4;30476:2;30465:9;30461:18;30453:26;;30525:9;30519:4;30515:20;30511:1;30500:9;30496:17;30489:47;30553:131;30679:4;30553:131;:::i;:::-;30545:139;;30272:419;;;:::o;30697:::-;30863:4;30901:2;30890:9;30886:18;30878:26;;30950:9;30944:4;30940:20;30936:1;30925:9;30921:17;30914:47;30978:131;31104:4;30978:131;:::i;:::-;30970:139;;30697:419;;;:::o;31122:::-;31288:4;31326:2;31315:9;31311:18;31303:26;;31375:9;31369:4;31365:20;31361:1;31350:9;31346:17;31339:47;31403:131;31529:4;31403:131;:::i;:::-;31395:139;;31122:419;;;:::o;31547:::-;31713:4;31751:2;31740:9;31736:18;31728:26;;31800:9;31794:4;31790:20;31786:1;31775:9;31771:17;31764:47;31828:131;31954:4;31828:131;:::i;:::-;31820:139;;31547:419;;;:::o;31972:::-;32138:4;32176:2;32165:9;32161:18;32153:26;;32225:9;32219:4;32215:20;32211:1;32200:9;32196:17;32189:47;32253:131;32379:4;32253:131;:::i;:::-;32245:139;;31972:419;;;:::o;32397:::-;32563:4;32601:2;32590:9;32586:18;32578:26;;32650:9;32644:4;32640:20;32636:1;32625:9;32621:17;32614:47;32678:131;32804:4;32678:131;:::i;:::-;32670:139;;32397:419;;;:::o;32822:::-;32988:4;33026:2;33015:9;33011:18;33003:26;;33075:9;33069:4;33065:20;33061:1;33050:9;33046:17;33039:47;33103:131;33229:4;33103:131;:::i;:::-;33095:139;;32822:419;;;:::o;33247:::-;33413:4;33451:2;33440:9;33436:18;33428:26;;33500:9;33494:4;33490:20;33486:1;33475:9;33471:17;33464:47;33528:131;33654:4;33528:131;:::i;:::-;33520:139;;33247:419;;;:::o;33672:::-;33838:4;33876:2;33865:9;33861:18;33853:26;;33925:9;33919:4;33915:20;33911:1;33900:9;33896:17;33889:47;33953:131;34079:4;33953:131;:::i;:::-;33945:139;;33672:419;;;:::o;34097:::-;34263:4;34301:2;34290:9;34286:18;34278:26;;34350:9;34344:4;34340:20;34336:1;34325:9;34321:17;34314:47;34378:131;34504:4;34378:131;:::i;:::-;34370:139;;34097:419;;;:::o;34522:343::-;34675:4;34713:3;34702:9;34698:19;34690:27;;34727:131;34855:1;34844:9;34840:17;34831:6;34727:131;:::i;:::-;34522:343;;;;:::o;34871:222::-;34964:4;35002:2;34991:9;34987:18;34979:26;;35015:71;35083:1;35072:9;35068:17;35059:6;35015:71;:::i;:::-;34871:222;;;;:::o;35099:129::-;35133:6;35160:20;;:::i;:::-;35150:30;;35189:33;35217:4;35209:6;35189:33;:::i;:::-;35099:129;;;:::o;35234:75::-;35267:6;35300:2;35294:9;35284:19;;35234:75;:::o;35315:311::-;35392:4;35482:18;35474:6;35471:30;35468:56;;;35504:18;;:::i;:::-;35468:56;35554:4;35546:6;35542:17;35534:25;;35614:4;35608;35604:15;35596:23;;35315:311;;;:::o;35632:::-;35709:4;35799:18;35791:6;35788:30;35785:56;;;35821:18;;:::i;:::-;35785:56;35871:4;35863:6;35859:17;35851:25;;35931:4;35925;35921:15;35913:23;;35632:311;;;:::o;35949:307::-;36010:4;36100:18;36092:6;36089:30;36086:56;;;36122:18;;:::i;:::-;36086:56;36160:29;36182:6;36160:29;:::i;:::-;36152:37;;36244:4;36238;36234:15;36226:23;;35949:307;;;:::o;36262:162::-;36359:4;36382:3;36374:11;;36412:4;36407:3;36403:14;36395:22;;36262:162;;;:::o;36430:132::-;36497:4;36520:3;36512:11;;36550:4;36545:3;36541:14;36533:22;;36430:132;;;:::o;36568:141::-;36617:4;36640:3;36632:11;;36663:3;36660:1;36653:14;36697:4;36694:1;36684:18;36676:26;;36568:141;;;:::o;36715:144::-;36812:6;36846:5;36840:12;36830:22;;36715:144;;;:::o;36865:114::-;36932:6;36966:5;36960:12;36950:22;;36865:114;;;:::o;36985:98::-;37036:6;37070:5;37064:12;37054:22;;36985:98;;;:::o;37089:99::-;37141:6;37175:5;37169:12;37159:22;;37089:99;;;:::o;37194:143::-;37294:4;37326;37321:3;37317:14;37309:22;;37194:143;;;:::o;37343:113::-;37413:4;37445;37440:3;37436:14;37428:22;;37343:113;;;:::o;37462:214::-;37591:11;37625:6;37620:3;37613:19;37665:4;37660:3;37656:14;37641:29;;37462:214;;;;:::o;37682:184::-;37781:11;37815:6;37810:3;37803:19;37855:4;37850:3;37846:14;37831:29;;37682:184;;;;:::o;37872:168::-;37955:11;37989:6;37984:3;37977:19;38029:4;38024:3;38020:14;38005:29;;37872:168;;;;:::o;38046:169::-;38130:11;38164:6;38159:3;38152:19;38204:4;38199:3;38195:14;38180:29;;38046:169;;;;:::o;38221:148::-;38323:11;38360:3;38345:18;;38221:148;;;;:::o;38375:305::-;38415:3;38434:20;38452:1;38434:20;:::i;:::-;38429:25;;38468:20;38486:1;38468:20;:::i;:::-;38463:25;;38622:1;38554:66;38550:74;38547:1;38544:81;38541:107;;;38628:18;;:::i;:::-;38541:107;38672:1;38669;38665:9;38658:16;;38375:305;;;;:::o;38686:348::-;38726:7;38749:20;38767:1;38749:20;:::i;:::-;38744:25;;38783:20;38801:1;38783:20;:::i;:::-;38778:25;;38971:1;38903:66;38899:74;38896:1;38893:81;38888:1;38881:9;38874:17;38870:105;38867:131;;;38978:18;;:::i;:::-;38867:131;39026:1;39023;39019:9;39008:20;;38686:348;;;;:::o;39040:191::-;39080:4;39100:20;39118:1;39100:20;:::i;:::-;39095:25;;39134:20;39152:1;39134:20;:::i;:::-;39129:25;;39173:1;39170;39167:8;39164:34;;;39178:18;;:::i;:::-;39164:34;39223:1;39220;39216:9;39208:17;;39040:191;;;;:::o;39237:96::-;39274:7;39303:24;39321:5;39303:24;:::i;:::-;39292:35;;39237:96;;;:::o;39339:90::-;39373:7;39416:5;39409:13;39402:21;39391:32;;39339:90;;;:::o;39435:77::-;39472:7;39501:5;39490:16;;39435:77;;;:::o;39518:149::-;39554:7;39594:66;39587:5;39583:78;39572:89;;39518:149;;;:::o;39673:133::-;39721:7;39750:5;39739:16;;39756:44;39794:5;39756:44;:::i;:::-;39673:133;;;:::o;39812:126::-;39849:7;39889:42;39882:5;39878:54;39867:65;;39812:126;;;:::o;39944:91::-;39980:7;40020:8;40013:5;40009:20;39998:31;;39944:91;;;:::o;40041:77::-;40078:7;40107:5;40096:16;;40041:77;;;:::o;40124:101::-;40160:7;40200:18;40193:5;40189:30;40178:41;;40124:101;;;:::o;40231:133::-;40290:9;40323:35;40352:5;40323:35;:::i;:::-;40310:48;;40231:133;;;:::o;40370:154::-;40454:6;40449:3;40444;40431:30;40516:1;40507:6;40502:3;40498:16;40491:27;40370:154;;;:::o;40530:307::-;40598:1;40608:113;40622:6;40619:1;40616:13;40608:113;;;40707:1;40702:3;40698:11;40692:18;40688:1;40683:3;40679:11;40672:39;40644:2;40641:1;40637:10;40632:15;;40608:113;;;40739:6;40736:1;40733:13;40730:101;;;40819:1;40810:6;40805:3;40801:16;40794:27;40730:101;40579:258;40530:307;;;:::o;40843:320::-;40887:6;40924:1;40918:4;40914:12;40904:22;;40971:1;40965:4;40961:12;40992:18;40982:81;;41048:4;41040:6;41036:17;41026:27;;40982:81;41110:2;41102:6;41099:14;41079:18;41076:38;41073:84;;;41129:18;;:::i;:::-;41073:84;40894:269;40843:320;;;:::o;41169:281::-;41252:27;41274:4;41252:27;:::i;:::-;41244:6;41240:40;41382:6;41370:10;41367:22;41346:18;41334:10;41331:34;41328:62;41325:88;;;41393:18;;:::i;:::-;41325:88;41433:10;41429:2;41422:22;41212:238;41169:281;;:::o;41456:233::-;41495:3;41518:24;41536:5;41518:24;:::i;:::-;41509:33;;41564:66;41557:5;41554:77;41551:103;;;41634:18;;:::i;:::-;41551:103;41681:1;41674:5;41670:13;41663:20;;41456:233;;;:::o;41695:100::-;41734:7;41763:26;41783:5;41763:26;:::i;:::-;41752:37;;41695:100;;;:::o;41801:94::-;41840:7;41869:20;41883:5;41869:20;:::i;:::-;41858:31;;41801:94;;;:::o;41901:180::-;41949:77;41946:1;41939:88;42046:4;42043:1;42036:15;42070:4;42067:1;42060:15;42087:180;42135:77;42132:1;42125:88;42232:4;42229:1;42222:15;42256:4;42253:1;42246:15;42273:180;42321:77;42318:1;42311:88;42418:4;42415:1;42408:15;42442:4;42439:1;42432:15;42459:180;42507:77;42504:1;42497:88;42604:4;42601:1;42594:15;42628:4;42625:1;42618:15;42645:180;42693:77;42690:1;42683:88;42790:4;42787:1;42780:15;42814:4;42811:1;42804:15;42831:117;42940:1;42937;42930:12;42954:117;43063:1;43060;43053:12;43077:117;43186:1;43183;43176:12;43200:117;43309:1;43306;43299:12;43323:117;43432:1;43429;43422:12;43446:117;43555:1;43552;43545:12;43569:102;43610:6;43661:2;43657:7;43652:2;43645:5;43641:14;43637:28;43627:38;;43569:102;;;:::o;43677:94::-;43710:8;43758:5;43754:2;43750:14;43729:35;;43677:94;;;:::o;43777:238::-;43917:34;43913:1;43905:6;43901:14;43894:58;43986:21;43981:2;43973:6;43969:15;43962:46;43777:238;:::o;44021:175::-;44161:27;44157:1;44149:6;44145:14;44138:51;44021:175;:::o;44202:239::-;44342:34;44338:1;44330:6;44326:14;44319:58;44411:22;44406:2;44398:6;44394:15;44387:47;44202:239;:::o;44447:225::-;44587:34;44583:1;44575:6;44571:14;44564:58;44656:8;44651:2;44643:6;44639:15;44632:33;44447:225;:::o;44678:164::-;44818:16;44814:1;44806:6;44802:14;44795:40;44678:164;:::o;44848:168::-;44988:20;44984:1;44976:6;44972:14;44965:44;44848:168;:::o;45022:155::-;45162:7;45158:1;45150:6;45146:14;45139:31;45022:155;:::o;45183:182::-;45323:34;45319:1;45311:6;45307:14;45300:58;45183:182;:::o;45371:171::-;45511:23;45507:1;45499:6;45495:14;45488:47;45371:171;:::o;45548:165::-;45688:17;45684:1;45676:6;45672:14;45665:41;45548:165;:::o;45719:161::-;45859:13;45855:1;45847:6;45843:14;45836:37;45719:161;:::o;45886:168::-;46026:20;46022:1;46014:6;46010:14;46003:44;45886:168;:::o;46060:163::-;46200:15;46196:1;46188:6;46184:14;46177:39;46060:163;:::o;46229:116::-;46313:1;46306:5;46303:12;46293:46;;46319:18;;:::i;:::-;46293:46;46229:116;:::o;46351:122::-;46424:24;46442:5;46424:24;:::i;:::-;46417:5;46414:35;46404:63;;46463:1;46460;46453:12;46404:63;46351:122;:::o;46479:116::-;46549:21;46564:5;46549:21;:::i;:::-;46542:5;46539:32;46529:60;;46585:1;46582;46575:12;46529:60;46479:116;:::o;46601:122::-;46674:24;46692:5;46674:24;:::i;:::-;46667:5;46664:35;46654:63;;46713:1;46710;46703:12;46654:63;46601:122;:::o;46729:120::-;46801:23;46818:5;46801:23;:::i;:::-;46794:5;46791:34;46781:62;;46839:1;46836;46829:12;46781:62;46729:120;:::o;46855:110::-;46939:1;46932:5;46929:12;46919:40;;46955:1;46952;46945:12;46919:40;46855:110;:::o;46971:122::-;47044:24;47062:5;47044:24;:::i;:::-;47037:5;47034:35;47024:63;;47083:1;47080;47073:12;47024:63;46971:122;:::o
Swarm Source
ipfs://c2e10175a41154d10daf1d21094d7e01d9549ab9e717c2682917313d9c4805f0
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.