ERC-721
Overview
Max Total Supply
5,638 Treasure
Holders
910
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 TreasureLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TheTreasuresofAncientEgyptOfficial
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-14 */ /** _ __ _ _ ______ _ | | / _| /\ (_) | | | ____| | | | |_ _ __ ___ __ _ ___ _ _ _ __ ___ ___ ___ | |_ / \ _ __ ___ _ ___ _ __ | |_ | |__ __ _ _ _ _ __ | |_ | __| '__/ _ \/ _` / __| | | | '__/ _ \/ __| / _ \| _| / /\ \ | '_ \ / __| |/ _ \ '_ \| __| | __| / _` | | | | '_ \| __| | |_| | | __/ (_| \__ \ |_| | | | __/\__ \ | (_) | | / ____ \| | | | (__| | __/ | | | |_ | |___| (_| | |_| | |_) | |_ \__|_| \___|\__,_|___/\__,_|_| \___||___/ \___/|_| /_/ \_\_| |_|\___|_|\___|_| |_|\__| |______\__, |\__, | .__/ \__| __/ | __/ | | |___/ |___/|_| */ /** *Submitted for verification at Etherscan.io on */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.0.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(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * 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(); 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; } /** * @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); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.0.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 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` 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 auxillary 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 auxillary 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; assembly { // Cast aux without masking. 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; } /** * 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 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, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); 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-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @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 { _transfer(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. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) 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 or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) 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 or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // 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)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // 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 Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: nft.sol pragma solidity ^0.8.7; contract TheTreasuresofAncientEgyptOfficial is Ownable, ERC721A { uint256 public maxSupply = 7700; uint256 public maxFreeSupply = 2000; uint256 public maxPerTxDuringMint = 20; uint256 public maxPerAddressDuringMint = 60; uint256 public maxPerAddressDuringFreeMint = 5; uint256 public price = 0.002 ether; bool public saleIsActive = true; address constant internal TEAM_ADDRESS = 0x33E8fce4ee1eB405E59E93c9E19AD8d0fFD9bc4e; string private _baseTokenURI="ipfs://QmXu8zUdGhvRAz2Z1xSQhwUfVfxst17HLH6Xx7V38ZsYCJ/"; mapping(address => uint256) public freeMintedAmount; mapping(address => uint256) public mintedAmount; constructor() ERC721A("The Treasures of Ancient Egypt Official", "Treasure") { _safeMint(msg.sender, 50); } modifier mintCompliance() { require(saleIsActive, "Sale is not active yet."); require(tx.origin == msg.sender, "Caller cannot be a contract."); _; } function mint(uint256 _quantity) external payable mintCompliance() { require( msg.value >= price * _quantity, "GDZ: Insufficient Fund." ); require( maxSupply >= totalSupply() + _quantity, "GDZ: Exceeds max supply." ); uint256 _mintedAmount = mintedAmount[msg.sender]; require( _mintedAmount + _quantity <= maxPerAddressDuringMint, "GDZ: Exceeds max mints per address!" ); require( _quantity > 0 && _quantity <= maxPerTxDuringMint, "Invalid mint amount." ); mintedAmount[msg.sender] = _mintedAmount + _quantity; _safeMint(msg.sender, _quantity); } function freeMint(uint256 _quantity) external mintCompliance() { require( maxFreeSupply >= totalSupply() + _quantity, "GDZ: Exceeds max free supply." ); uint256 _freeMintedAmount = freeMintedAmount[msg.sender]; require( _freeMintedAmount + _quantity <= maxPerAddressDuringFreeMint, "GDZ: Exceeds max free mints per address!" ); freeMintedAmount[msg.sender] = _freeMintedAmount + _quantity; _safeMint(msg.sender, _quantity); } function setPrice(uint256 _price) external onlyOwner { price = _price; } function setMaxPerTx(uint256 _amount) external onlyOwner { maxPerTxDuringMint = _amount; } function setMaxPerAddress(uint256 _amount) external onlyOwner { maxPerAddressDuringMint = _amount; } function setMaxFreePerAddress(uint256 _amount) external onlyOwner { maxPerAddressDuringFreeMint = _amount; } function flipSale() public onlyOwner { saleIsActive = !saleIsActive; } function cutMaxSupply(uint256 _amount) public onlyOwner { require( maxSupply +_amount >= 1, "Supply cannot fall below minted tokens." ); maxSupply += _amount; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function withdrawBalance() external payable onlyOwner { (bool success, ) = payable(TEAM_ADDRESS).call{ value: address(this).balance }(""); require(success, "transfer failed."); } }
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":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"cutMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintedAmount","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":"maxFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringFreeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTxDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxFreePerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"withdrawBalance","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052611e146009556107d0600a556014600b55603c600c556005600d5566071afd498d0000600e556001600f60006101000a81548160ff02191690831515021790555060405180606001604052806036815260200162004106603691396010908051906020019062000076929190620006cf565b503480156200008457600080fd5b506040518060600160405280602781526020016200413c602791396040518060400160405280600881526020017f5472656173757265000000000000000000000000000000000000000000000000815250620000f5620000e96200015860201b60201c565b6200016060201b60201c565b81600390805190602001906200010d929190620006cf565b50806004908051906020019062000126929190620006cf565b50620001376200022460201b60201c565b6001819055505050620001523360326200022960201b60201c565b620009d0565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b6200024b8282604051806020016040528060008152506200024f60201b60201c565b5050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620002be576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415620002fa576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200030f60008583866200053560201b60201c565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16200037c600185146200053b60201b60201c565b901b60a042901b62000394866200054560201b60201c565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14620004a5575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200045160008784806001019550876200054f60201b60201c565b62000488576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210620003da5782600154146200049f57600080fd5b62000511565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210620004a6575b8160018190555050506200052f6000858386620006c160201b60201c565b50505050565b50505050565b6000819050919050565b6000819050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200057d620006c760201b60201c565b8786866040518563ffffffff1660e01b8152600401620005a194939291906200082b565b602060405180830381600087803b158015620005bc57600080fd5b505af1925050508015620005f057506040513d601f19601f82011682018060405250810190620005ed919062000796565b60015b6200066e573d806000811462000623576040519150601f19603f3d011682016040523d82523d6000602084013e62000628565b606091505b5060008151141562000666576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b600033905090565b828054620006dd906200093b565b90600052602060002090601f0160209004810192826200070157600085556200074d565b82601f106200071c57805160ff19168380011785556200074d565b828001600101855582156200074d579182015b828111156200074c5782518255916020019190600101906200072f565b5b5090506200075c919062000760565b5090565b5b808211156200077b57600081600090555060010162000761565b5090565b6000815190506200079081620009b6565b92915050565b600060208284031215620007af57620007ae620009a0565b5b6000620007bf848285016200077f565b91505092915050565b620007d3816200089b565b82525050565b6000620007e6826200087f565b620007f281856200088a565b93506200080481856020860162000905565b6200080f81620009a5565b840191505092915050565b6200082581620008fb565b82525050565b6000608082019050620008426000830187620007c8565b620008516020830186620007c8565b6200086060408301856200081a565b8181036060830152620008748184620007d9565b905095945050505050565b600081519050919050565b600082825260208201905092915050565b6000620008a882620008db565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200092557808201518184015260208101905062000908565b8381111562000935576000848401525b50505050565b600060028204905060018216806200095457607f821691505b602082108114156200096b576200096a62000971565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b620009c181620008af565b8114620009cd57600080fd5b50565b61372680620009e06000396000f3fe60806040526004361061020f5760003560e01c80638bc35c2f11610118578063bbb64319116100a0578063d5abeb011161006f578063d5abeb0114610745578063e985e9c514610770578063eb8d2444146107ad578063f2fde38b146107d8578063fbbf8cc3146108015761020f565b8063bbb643191461068b578063c6f6f216146106b4578063c87b56dd146106dd578063d3464cbd1461071a5761020f565b806396b10201116100e757806396b10201146105b5578063a035b1fe146105f2578063a0712d681461061d578063a22cb46514610639578063b88d4fde146106625761020f565b80638bc35c2f1461050b5780638da5cb5b1461053657806391b7f5ed1461056157806395d89b411461058a5761020f565b8063475133341161019b57806370a082311161016a57806370a082311461044e578063715018a61461048b5780637ba5e621146104a25780637bddd65b146104b95780637c928fe9146104e25761020f565b806347513334146103b357806355f804b3146103de5780635fd8c710146104075780636352211e146104115761020f565b80631141df20116101e25780631141df20146102e257806318160ddd1461030b57806323b872dd146103365780632e0fd6eb1461035f57806342842e0e1461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612b01565b61083e565b6040516102489190612f0c565b60405180910390f35b34801561025d57600080fd5b506102666108d0565b6040516102739190612f27565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612ba8565b610962565b6040516102b09190612ea5565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612ac1565b6109de565b005b3480156102ee57600080fd5b5061030960048036038101906103049190612ba8565b610b85565b005b34801561031757600080fd5b50610320610c6e565b60405161032d91906130c9565b60405180910390f35b34801561034257600080fd5b5061035d600480360381019061035891906129ab565b610c85565b005b34801561036b57600080fd5b50610374610c95565b60405161038191906130c9565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac91906129ab565b610c9b565b005b3480156103bf57600080fd5b506103c8610cbb565b6040516103d591906130c9565b60405180910390f35b3480156103ea57600080fd5b5061040560048036038101906104009190612b5b565b610cc1565b005b61040f610d53565b005b34801561041d57600080fd5b5061043860048036038101906104339190612ba8565b610e92565b6040516104459190612ea5565b60405180910390f35b34801561045a57600080fd5b506104756004803603810190610470919061293e565b610ea4565b60405161048291906130c9565b60405180910390f35b34801561049757600080fd5b506104a0610f5d565b005b3480156104ae57600080fd5b506104b7610fe5565b005b3480156104c557600080fd5b506104e060048036038101906104db9190612ba8565b61108d565b005b3480156104ee57600080fd5b5061050960048036038101906105049190612ba8565b611113565b005b34801561051757600080fd5b50610520611318565b60405161052d91906130c9565b60405180910390f35b34801561054257600080fd5b5061054b61131e565b6040516105589190612ea5565b60405180910390f35b34801561056d57600080fd5b5061058860048036038101906105839190612ba8565b611347565b005b34801561059657600080fd5b5061059f6113cd565b6040516105ac9190612f27565b60405180910390f35b3480156105c157600080fd5b506105dc60048036038101906105d7919061293e565b61145f565b6040516105e991906130c9565b60405180910390f35b3480156105fe57600080fd5b50610607611477565b60405161061491906130c9565b60405180910390f35b61063760048036038101906106329190612ba8565b61147d565b005b34801561064557600080fd5b50610660600480360381019061065b9190612a81565b611723565b005b34801561066e57600080fd5b50610689600480360381019061068491906129fe565b61189b565b005b34801561069757600080fd5b506106b260048036038101906106ad9190612ba8565b61190e565b005b3480156106c057600080fd5b506106db60048036038101906106d69190612ba8565b611994565b005b3480156106e957600080fd5b5061070460048036038101906106ff9190612ba8565b611a1a565b6040516107119190612f27565b60405180910390f35b34801561072657600080fd5b5061072f611ab9565b60405161073c91906130c9565b60405180910390f35b34801561075157600080fd5b5061075a611abf565b60405161076791906130c9565b60405180910390f35b34801561077c57600080fd5b506107976004803603810190610792919061296b565b611ac5565b6040516107a49190612f0c565b60405180910390f35b3480156107b957600080fd5b506107c2611b59565b6040516107cf9190612f0c565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa919061293e565b611b6c565b005b34801561080d57600080fd5b506108286004803603810190610823919061293e565b611c64565b60405161083591906130c9565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546108df906132ee565b80601f016020809104026020016040519081016040528092919081815260200182805461090b906132ee565b80156109585780601f1061092d57610100808354040283529160200191610958565b820191906000526020600020905b81548152906001019060200180831161093b57829003601f168201915b5050505050905090565b600061096d82611c7c565b6109a3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e982611cdb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a51576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a70611da9565b73ffffffffffffffffffffffffffffffffffffffff1614610ad357610a9c81610a97611da9565b611ac5565b610ad2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610b8d611db1565b73ffffffffffffffffffffffffffffffffffffffff16610bab61131e565b73ffffffffffffffffffffffffffffffffffffffff1614610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf8906130a9565b60405180910390fd5b600181600954610c119190613188565b1015610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4990613029565b60405180910390fd5b8060096000828254610c649190613188565b9250508190555050565b6000610c78611db9565b6002546001540303905090565b610c90838383611dbe565b505050565b600d5481565b610cb68383836040518060200160405280600081525061189b565b505050565b600a5481565b610cc9611db1565b73ffffffffffffffffffffffffffffffffffffffff16610ce761131e565b73ffffffffffffffffffffffffffffffffffffffff1614610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d34906130a9565b60405180910390fd5b818160109190610d4e92919061276c565b505050565b610d5b611db1565b73ffffffffffffffffffffffffffffffffffffffff16610d7961131e565b73ffffffffffffffffffffffffffffffffffffffff1614610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc6906130a9565b60405180910390fd5b60007333e8fce4ee1eb405e59e93c9e19ad8d0ffd9bc4e73ffffffffffffffffffffffffffffffffffffffff1647604051610e0990612e90565b60006040518083038185875af1925050503d8060008114610e46576040519150601f19603f3d011682016040523d82523d6000602084013e610e4b565b606091505b5050905080610e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8690613049565b60405180910390fd5b50565b6000610e9d82611cdb565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f0c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610f65611db1565b73ffffffffffffffffffffffffffffffffffffffff16610f8361131e565b73ffffffffffffffffffffffffffffffffffffffff1614610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd0906130a9565b60405180910390fd5b610fe36000612168565b565b610fed611db1565b73ffffffffffffffffffffffffffffffffffffffff1661100b61131e565b73ffffffffffffffffffffffffffffffffffffffff1614611061576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611058906130a9565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b611095611db1565b73ffffffffffffffffffffffffffffffffffffffff166110b361131e565b73ffffffffffffffffffffffffffffffffffffffff1614611109576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611100906130a9565b60405180910390fd5b80600c8190555050565b600f60009054906101000a900460ff16611162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115990612fc9565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790612f89565b60405180910390fd5b806111d9610c6e565b6111e39190613188565b600a541015611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90612f69565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600d54828261127a9190613188565b11156112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290612fa9565b60405180910390fd5b81816112c79190613188565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611314338361222c565b5050565b600c5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61134f611db1565b73ffffffffffffffffffffffffffffffffffffffff1661136d61131e565b73ffffffffffffffffffffffffffffffffffffffff16146113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba906130a9565b60405180910390fd5b80600e8190555050565b6060600480546113dc906132ee565b80601f0160208091040260200160405190810160405280929190818152602001828054611408906132ee565b80156114555780601f1061142a57610100808354040283529160200191611455565b820191906000526020600020905b81548152906001019060200180831161143857829003601f168201915b5050505050905090565b60116020528060005260406000206000915090505481565b600e5481565b600f60009054906101000a900460ff166114cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c390612fc9565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190612f89565b60405180910390fd5b80600e5461154891906131de565b34101561158a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158190613089565b60405180910390fd5b80611593610c6e565b61159d9190613188565b60095410156115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d890612fe9565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600c5482826116349190613188565b1115611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166c90613009565b60405180910390fd5b6000821180156116875750600b548211155b6116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd90613069565b60405180910390fd5b81816116d29190613188565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061171f338361222c565b5050565b61172b611da9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611790576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061179d611da9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661184a611da9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161188f9190612f0c565b60405180910390a35050565b6118a6848484611dbe565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611908576118d18484848461224a565b611907576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611916611db1565b73ffffffffffffffffffffffffffffffffffffffff1661193461131e565b73ffffffffffffffffffffffffffffffffffffffff161461198a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611981906130a9565b60405180910390fd5b80600d8190555050565b61199c611db1565b73ffffffffffffffffffffffffffffffffffffffff166119ba61131e565b73ffffffffffffffffffffffffffffffffffffffff1614611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a07906130a9565b60405180910390fd5b80600b8190555050565b6060611a2582611c7c565b611a5b576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a656123aa565b9050600081511415611a865760405180602001604052806000815250611ab1565b80611a908461243c565b604051602001611aa1929190612e6c565b6040516020818303038152906040525b915050919050565b600b5481565b60095481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b611b74611db1565b73ffffffffffffffffffffffffffffffffffffffff16611b9261131e565b73ffffffffffffffffffffffffffffffffffffffff1614611be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdf906130a9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f90612f49565b60405180910390fd5b611c6181612168565b50565b60126020528060005260406000206000915090505481565b600081611c87611db9565b11158015611c96575060015482105b8015611cd4575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b60008082905080611cea611db9565b11611d7257600154811015611d715760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611d6f575b6000811415611d65576005600083600190039350838152602001908152602001600020549050611d3a565b8092505050611da4565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b600090565b6000611dc982611cdb565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e30576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611e51611da9565b73ffffffffffffffffffffffffffffffffffffffff161480611e805750611e7f85611e7a611da9565b611ac5565b5b80611ec55750611e8e611da9565b73ffffffffffffffffffffffffffffffffffffffff16611ead84610962565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611efe576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f65576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f728585856001612496565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61206f8661249c565b1717600560008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831614156120f95760006001840190506000600560008381526020019081526020016000205414156120f75760015481146120f6578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461216185858560016124a6565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122468282604051806020016040528060008152506124ac565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612270611da9565b8786866040518563ffffffff1660e01b81526004016122929493929190612ec0565b602060405180830381600087803b1580156122ac57600080fd5b505af19250505080156122dd57506040513d601f19601f820116820180604052508101906122da9190612b2e565b60015b612357573d806000811461230d576040519150601f19603f3d011682016040523d82523d6000602084013e612312565b606091505b5060008151141561234f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060601080546123b9906132ee565b80601f01602080910402602001604051908101604052809291908181526020018280546123e5906132ee565b80156124325780601f1061240757610100808354040283529160200191612432565b820191906000526020600020905b81548152906001019060200180831161241557829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561248257600183039250600a81066030018353600a81049050612462565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561251a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612555576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125626000858386612496565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16125c760018514612762565b901b60a042901b6125d78661249c565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146126db575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461268b600087848060010195508761224a565b6126c1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061261c5782600154146126d657600080fd5b612746565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106126dc575b81600181905550505061275c60008583866124a6565b50505050565b6000819050919050565b828054612778906132ee565b90600052602060002090601f01602090048101928261279a57600085556127e1565b82601f106127b357803560ff19168380011785556127e1565b828001600101855582156127e1579182015b828111156127e05782358255916020019190600101906127c5565b5b5090506127ee91906127f2565b5090565b5b8082111561280b5760008160009055506001016127f3565b5090565b600061282261281d84613109565b6130e4565b90508281526020810184848401111561283e5761283d6133ed565b5b6128498482856132ac565b509392505050565b60008135905061286081613694565b92915050565b600081359050612875816136ab565b92915050565b60008135905061288a816136c2565b92915050565b60008151905061289f816136c2565b92915050565b600082601f8301126128ba576128b96133e3565b5b81356128ca84826020860161280f565b91505092915050565b60008083601f8401126128e9576128e86133e3565b5b8235905067ffffffffffffffff811115612906576129056133de565b5b602083019150836001820283011115612922576129216133e8565b5b9250929050565b600081359050612938816136d9565b92915050565b600060208284031215612954576129536133f7565b5b600061296284828501612851565b91505092915050565b60008060408385031215612982576129816133f7565b5b600061299085828601612851565b92505060206129a185828601612851565b9150509250929050565b6000806000606084860312156129c4576129c36133f7565b5b60006129d286828701612851565b93505060206129e386828701612851565b92505060406129f486828701612929565b9150509250925092565b60008060008060808587031215612a1857612a176133f7565b5b6000612a2687828801612851565b9450506020612a3787828801612851565b9350506040612a4887828801612929565b925050606085013567ffffffffffffffff811115612a6957612a686133f2565b5b612a75878288016128a5565b91505092959194509250565b60008060408385031215612a9857612a976133f7565b5b6000612aa685828601612851565b9250506020612ab785828601612866565b9150509250929050565b60008060408385031215612ad857612ad76133f7565b5b6000612ae685828601612851565b9250506020612af785828601612929565b9150509250929050565b600060208284031215612b1757612b166133f7565b5b6000612b258482850161287b565b91505092915050565b600060208284031215612b4457612b436133f7565b5b6000612b5284828501612890565b91505092915050565b60008060208385031215612b7257612b716133f7565b5b600083013567ffffffffffffffff811115612b9057612b8f6133f2565b5b612b9c858286016128d3565b92509250509250929050565b600060208284031215612bbe57612bbd6133f7565b5b6000612bcc84828501612929565b91505092915050565b612bde81613238565b82525050565b612bed8161324a565b82525050565b6000612bfe8261313a565b612c088185613150565b9350612c188185602086016132bb565b612c21816133fc565b840191505092915050565b6000612c3782613145565b612c41818561316c565b9350612c518185602086016132bb565b612c5a816133fc565b840191505092915050565b6000612c7082613145565b612c7a818561317d565b9350612c8a8185602086016132bb565b80840191505092915050565b6000612ca360268361316c565b9150612cae8261340d565b604082019050919050565b6000612cc6601d8361316c565b9150612cd18261345c565b602082019050919050565b6000612ce9601c8361316c565b9150612cf482613485565b602082019050919050565b6000612d0c60288361316c565b9150612d17826134ae565b604082019050919050565b6000612d2f60178361316c565b9150612d3a826134fd565b602082019050919050565b6000612d5260188361316c565b9150612d5d82613526565b602082019050919050565b6000612d7560238361316c565b9150612d808261354f565b604082019050919050565b6000612d9860278361316c565b9150612da38261359e565b604082019050919050565b6000612dbb60108361316c565b9150612dc6826135ed565b602082019050919050565b6000612dde60148361316c565b9150612de982613616565b602082019050919050565b6000612e0160178361316c565b9150612e0c8261363f565b602082019050919050565b6000612e2460208361316c565b9150612e2f82613668565b602082019050919050565b6000612e47600083613161565b9150612e5282613691565b600082019050919050565b612e66816132a2565b82525050565b6000612e788285612c65565b9150612e848284612c65565b91508190509392505050565b6000612e9b82612e3a565b9150819050919050565b6000602082019050612eba6000830184612bd5565b92915050565b6000608082019050612ed56000830187612bd5565b612ee26020830186612bd5565b612eef6040830185612e5d565b8181036060830152612f018184612bf3565b905095945050505050565b6000602082019050612f216000830184612be4565b92915050565b60006020820190508181036000830152612f418184612c2c565b905092915050565b60006020820190508181036000830152612f6281612c96565b9050919050565b60006020820190508181036000830152612f8281612cb9565b9050919050565b60006020820190508181036000830152612fa281612cdc565b9050919050565b60006020820190508181036000830152612fc281612cff565b9050919050565b60006020820190508181036000830152612fe281612d22565b9050919050565b6000602082019050818103600083015261300281612d45565b9050919050565b6000602082019050818103600083015261302281612d68565b9050919050565b6000602082019050818103600083015261304281612d8b565b9050919050565b6000602082019050818103600083015261306281612dae565b9050919050565b6000602082019050818103600083015261308281612dd1565b9050919050565b600060208201905081810360008301526130a281612df4565b9050919050565b600060208201905081810360008301526130c281612e17565b9050919050565b60006020820190506130de6000830184612e5d565b92915050565b60006130ee6130ff565b90506130fa8282613320565b919050565b6000604051905090565b600067ffffffffffffffff821115613124576131236133af565b5b61312d826133fc565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613193826132a2565b915061319e836132a2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131d3576131d2613351565b5b828201905092915050565b60006131e9826132a2565b91506131f4836132a2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561322d5761322c613351565b5b828202905092915050565b600061324382613282565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156132d95780820151818401526020810190506132be565b838111156132e8576000848401525b50505050565b6000600282049050600182168061330657607f821691505b6020821081141561331a57613319613380565b5b50919050565b613329826133fc565b810181811067ffffffffffffffff82111715613348576133476133af565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f47445a3a2045786365656473206d6178206672656520737570706c792e000000600082015250565b7f43616c6c65722063616e6e6f74206265206120636f6e74726163742e00000000600082015250565b7f47445a3a2045786365656473206d61782066726565206d696e7473207065722060008201527f6164647265737321000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f7420616374697665207965742e000000000000000000600082015250565b7f47445a3a2045786365656473206d617820737570706c792e0000000000000000600082015250565b7f47445a3a2045786365656473206d6178206d696e74732070657220616464726560008201527f7373210000000000000000000000000000000000000000000000000000000000602082015250565b7f537570706c792063616e6e6f742066616c6c2062656c6f77206d696e7465642060008201527f746f6b656e732e00000000000000000000000000000000000000000000000000602082015250565b7f7472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f496e76616c6964206d696e7420616d6f756e742e000000000000000000000000600082015250565b7f47445a3a20496e73756666696369656e742046756e642e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b61369d81613238565b81146136a857600080fd5b50565b6136b48161324a565b81146136bf57600080fd5b50565b6136cb81613256565b81146136d657600080fd5b50565b6136e2816132a2565b81146136ed57600080fd5b5056fea2646970667358221220203aa448b0a4eff4a6048c92112df7961b4a0b8b7ffc90d164424e8e252a224664736f6c63430008070033697066733a2f2f516d5875387a556447687652417a325a317853516877556656667873743137484c48365878375633385a7359434a2f54686520547265617375726573206f6620416e6369656e74204567797074204f6666696369616c
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80638bc35c2f11610118578063bbb64319116100a0578063d5abeb011161006f578063d5abeb0114610745578063e985e9c514610770578063eb8d2444146107ad578063f2fde38b146107d8578063fbbf8cc3146108015761020f565b8063bbb643191461068b578063c6f6f216146106b4578063c87b56dd146106dd578063d3464cbd1461071a5761020f565b806396b10201116100e757806396b10201146105b5578063a035b1fe146105f2578063a0712d681461061d578063a22cb46514610639578063b88d4fde146106625761020f565b80638bc35c2f1461050b5780638da5cb5b1461053657806391b7f5ed1461056157806395d89b411461058a5761020f565b8063475133341161019b57806370a082311161016a57806370a082311461044e578063715018a61461048b5780637ba5e621146104a25780637bddd65b146104b95780637c928fe9146104e25761020f565b806347513334146103b357806355f804b3146103de5780635fd8c710146104075780636352211e146104115761020f565b80631141df20116101e25780631141df20146102e257806318160ddd1461030b57806323b872dd146103365780632e0fd6eb1461035f57806342842e0e1461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612b01565b61083e565b6040516102489190612f0c565b60405180910390f35b34801561025d57600080fd5b506102666108d0565b6040516102739190612f27565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612ba8565b610962565b6040516102b09190612ea5565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612ac1565b6109de565b005b3480156102ee57600080fd5b5061030960048036038101906103049190612ba8565b610b85565b005b34801561031757600080fd5b50610320610c6e565b60405161032d91906130c9565b60405180910390f35b34801561034257600080fd5b5061035d600480360381019061035891906129ab565b610c85565b005b34801561036b57600080fd5b50610374610c95565b60405161038191906130c9565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac91906129ab565b610c9b565b005b3480156103bf57600080fd5b506103c8610cbb565b6040516103d591906130c9565b60405180910390f35b3480156103ea57600080fd5b5061040560048036038101906104009190612b5b565b610cc1565b005b61040f610d53565b005b34801561041d57600080fd5b5061043860048036038101906104339190612ba8565b610e92565b6040516104459190612ea5565b60405180910390f35b34801561045a57600080fd5b506104756004803603810190610470919061293e565b610ea4565b60405161048291906130c9565b60405180910390f35b34801561049757600080fd5b506104a0610f5d565b005b3480156104ae57600080fd5b506104b7610fe5565b005b3480156104c557600080fd5b506104e060048036038101906104db9190612ba8565b61108d565b005b3480156104ee57600080fd5b5061050960048036038101906105049190612ba8565b611113565b005b34801561051757600080fd5b50610520611318565b60405161052d91906130c9565b60405180910390f35b34801561054257600080fd5b5061054b61131e565b6040516105589190612ea5565b60405180910390f35b34801561056d57600080fd5b5061058860048036038101906105839190612ba8565b611347565b005b34801561059657600080fd5b5061059f6113cd565b6040516105ac9190612f27565b60405180910390f35b3480156105c157600080fd5b506105dc60048036038101906105d7919061293e565b61145f565b6040516105e991906130c9565b60405180910390f35b3480156105fe57600080fd5b50610607611477565b60405161061491906130c9565b60405180910390f35b61063760048036038101906106329190612ba8565b61147d565b005b34801561064557600080fd5b50610660600480360381019061065b9190612a81565b611723565b005b34801561066e57600080fd5b50610689600480360381019061068491906129fe565b61189b565b005b34801561069757600080fd5b506106b260048036038101906106ad9190612ba8565b61190e565b005b3480156106c057600080fd5b506106db60048036038101906106d69190612ba8565b611994565b005b3480156106e957600080fd5b5061070460048036038101906106ff9190612ba8565b611a1a565b6040516107119190612f27565b60405180910390f35b34801561072657600080fd5b5061072f611ab9565b60405161073c91906130c9565b60405180910390f35b34801561075157600080fd5b5061075a611abf565b60405161076791906130c9565b60405180910390f35b34801561077c57600080fd5b506107976004803603810190610792919061296b565b611ac5565b6040516107a49190612f0c565b60405180910390f35b3480156107b957600080fd5b506107c2611b59565b6040516107cf9190612f0c565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa919061293e565b611b6c565b005b34801561080d57600080fd5b506108286004803603810190610823919061293e565b611c64565b60405161083591906130c9565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546108df906132ee565b80601f016020809104026020016040519081016040528092919081815260200182805461090b906132ee565b80156109585780601f1061092d57610100808354040283529160200191610958565b820191906000526020600020905b81548152906001019060200180831161093b57829003601f168201915b5050505050905090565b600061096d82611c7c565b6109a3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e982611cdb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a51576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a70611da9565b73ffffffffffffffffffffffffffffffffffffffff1614610ad357610a9c81610a97611da9565b611ac5565b610ad2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610b8d611db1565b73ffffffffffffffffffffffffffffffffffffffff16610bab61131e565b73ffffffffffffffffffffffffffffffffffffffff1614610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf8906130a9565b60405180910390fd5b600181600954610c119190613188565b1015610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4990613029565b60405180910390fd5b8060096000828254610c649190613188565b9250508190555050565b6000610c78611db9565b6002546001540303905090565b610c90838383611dbe565b505050565b600d5481565b610cb68383836040518060200160405280600081525061189b565b505050565b600a5481565b610cc9611db1565b73ffffffffffffffffffffffffffffffffffffffff16610ce761131e565b73ffffffffffffffffffffffffffffffffffffffff1614610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d34906130a9565b60405180910390fd5b818160109190610d4e92919061276c565b505050565b610d5b611db1565b73ffffffffffffffffffffffffffffffffffffffff16610d7961131e565b73ffffffffffffffffffffffffffffffffffffffff1614610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc6906130a9565b60405180910390fd5b60007333e8fce4ee1eb405e59e93c9e19ad8d0ffd9bc4e73ffffffffffffffffffffffffffffffffffffffff1647604051610e0990612e90565b60006040518083038185875af1925050503d8060008114610e46576040519150601f19603f3d011682016040523d82523d6000602084013e610e4b565b606091505b5050905080610e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8690613049565b60405180910390fd5b50565b6000610e9d82611cdb565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f0c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610f65611db1565b73ffffffffffffffffffffffffffffffffffffffff16610f8361131e565b73ffffffffffffffffffffffffffffffffffffffff1614610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd0906130a9565b60405180910390fd5b610fe36000612168565b565b610fed611db1565b73ffffffffffffffffffffffffffffffffffffffff1661100b61131e565b73ffffffffffffffffffffffffffffffffffffffff1614611061576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611058906130a9565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b611095611db1565b73ffffffffffffffffffffffffffffffffffffffff166110b361131e565b73ffffffffffffffffffffffffffffffffffffffff1614611109576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611100906130a9565b60405180910390fd5b80600c8190555050565b600f60009054906101000a900460ff16611162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115990612fc9565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790612f89565b60405180910390fd5b806111d9610c6e565b6111e39190613188565b600a541015611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90612f69565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600d54828261127a9190613188565b11156112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290612fa9565b60405180910390fd5b81816112c79190613188565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611314338361222c565b5050565b600c5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61134f611db1565b73ffffffffffffffffffffffffffffffffffffffff1661136d61131e565b73ffffffffffffffffffffffffffffffffffffffff16146113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba906130a9565b60405180910390fd5b80600e8190555050565b6060600480546113dc906132ee565b80601f0160208091040260200160405190810160405280929190818152602001828054611408906132ee565b80156114555780601f1061142a57610100808354040283529160200191611455565b820191906000526020600020905b81548152906001019060200180831161143857829003601f168201915b5050505050905090565b60116020528060005260406000206000915090505481565b600e5481565b600f60009054906101000a900460ff166114cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c390612fc9565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190612f89565b60405180910390fd5b80600e5461154891906131de565b34101561158a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158190613089565b60405180910390fd5b80611593610c6e565b61159d9190613188565b60095410156115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d890612fe9565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600c5482826116349190613188565b1115611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166c90613009565b60405180910390fd5b6000821180156116875750600b548211155b6116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd90613069565b60405180910390fd5b81816116d29190613188565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061171f338361222c565b5050565b61172b611da9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611790576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061179d611da9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661184a611da9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161188f9190612f0c565b60405180910390a35050565b6118a6848484611dbe565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611908576118d18484848461224a565b611907576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611916611db1565b73ffffffffffffffffffffffffffffffffffffffff1661193461131e565b73ffffffffffffffffffffffffffffffffffffffff161461198a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611981906130a9565b60405180910390fd5b80600d8190555050565b61199c611db1565b73ffffffffffffffffffffffffffffffffffffffff166119ba61131e565b73ffffffffffffffffffffffffffffffffffffffff1614611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a07906130a9565b60405180910390fd5b80600b8190555050565b6060611a2582611c7c565b611a5b576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a656123aa565b9050600081511415611a865760405180602001604052806000815250611ab1565b80611a908461243c565b604051602001611aa1929190612e6c565b6040516020818303038152906040525b915050919050565b600b5481565b60095481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b611b74611db1565b73ffffffffffffffffffffffffffffffffffffffff16611b9261131e565b73ffffffffffffffffffffffffffffffffffffffff1614611be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdf906130a9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f90612f49565b60405180910390fd5b611c6181612168565b50565b60126020528060005260406000206000915090505481565b600081611c87611db9565b11158015611c96575060015482105b8015611cd4575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b60008082905080611cea611db9565b11611d7257600154811015611d715760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611d6f575b6000811415611d65576005600083600190039350838152602001908152602001600020549050611d3a565b8092505050611da4565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b600090565b6000611dc982611cdb565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e30576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611e51611da9565b73ffffffffffffffffffffffffffffffffffffffff161480611e805750611e7f85611e7a611da9565b611ac5565b5b80611ec55750611e8e611da9565b73ffffffffffffffffffffffffffffffffffffffff16611ead84610962565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611efe576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f65576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f728585856001612496565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61206f8661249c565b1717600560008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831614156120f95760006001840190506000600560008381526020019081526020016000205414156120f75760015481146120f6578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461216185858560016124a6565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122468282604051806020016040528060008152506124ac565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612270611da9565b8786866040518563ffffffff1660e01b81526004016122929493929190612ec0565b602060405180830381600087803b1580156122ac57600080fd5b505af19250505080156122dd57506040513d601f19601f820116820180604052508101906122da9190612b2e565b60015b612357573d806000811461230d576040519150601f19603f3d011682016040523d82523d6000602084013e612312565b606091505b5060008151141561234f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060601080546123b9906132ee565b80601f01602080910402602001604051908101604052809291908181526020018280546123e5906132ee565b80156124325780601f1061240757610100808354040283529160200191612432565b820191906000526020600020905b81548152906001019060200180831161241557829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561248257600183039250600a81066030018353600a81049050612462565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561251a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612555576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125626000858386612496565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16125c760018514612762565b901b60a042901b6125d78661249c565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146126db575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461268b600087848060010195508761224a565b6126c1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061261c5782600154146126d657600080fd5b612746565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106126dc575b81600181905550505061275c60008583866124a6565b50505050565b6000819050919050565b828054612778906132ee565b90600052602060002090601f01602090048101928261279a57600085556127e1565b82601f106127b357803560ff19168380011785556127e1565b828001600101855582156127e1579182015b828111156127e05782358255916020019190600101906127c5565b5b5090506127ee91906127f2565b5090565b5b8082111561280b5760008160009055506001016127f3565b5090565b600061282261281d84613109565b6130e4565b90508281526020810184848401111561283e5761283d6133ed565b5b6128498482856132ac565b509392505050565b60008135905061286081613694565b92915050565b600081359050612875816136ab565b92915050565b60008135905061288a816136c2565b92915050565b60008151905061289f816136c2565b92915050565b600082601f8301126128ba576128b96133e3565b5b81356128ca84826020860161280f565b91505092915050565b60008083601f8401126128e9576128e86133e3565b5b8235905067ffffffffffffffff811115612906576129056133de565b5b602083019150836001820283011115612922576129216133e8565b5b9250929050565b600081359050612938816136d9565b92915050565b600060208284031215612954576129536133f7565b5b600061296284828501612851565b91505092915050565b60008060408385031215612982576129816133f7565b5b600061299085828601612851565b92505060206129a185828601612851565b9150509250929050565b6000806000606084860312156129c4576129c36133f7565b5b60006129d286828701612851565b93505060206129e386828701612851565b92505060406129f486828701612929565b9150509250925092565b60008060008060808587031215612a1857612a176133f7565b5b6000612a2687828801612851565b9450506020612a3787828801612851565b9350506040612a4887828801612929565b925050606085013567ffffffffffffffff811115612a6957612a686133f2565b5b612a75878288016128a5565b91505092959194509250565b60008060408385031215612a9857612a976133f7565b5b6000612aa685828601612851565b9250506020612ab785828601612866565b9150509250929050565b60008060408385031215612ad857612ad76133f7565b5b6000612ae685828601612851565b9250506020612af785828601612929565b9150509250929050565b600060208284031215612b1757612b166133f7565b5b6000612b258482850161287b565b91505092915050565b600060208284031215612b4457612b436133f7565b5b6000612b5284828501612890565b91505092915050565b60008060208385031215612b7257612b716133f7565b5b600083013567ffffffffffffffff811115612b9057612b8f6133f2565b5b612b9c858286016128d3565b92509250509250929050565b600060208284031215612bbe57612bbd6133f7565b5b6000612bcc84828501612929565b91505092915050565b612bde81613238565b82525050565b612bed8161324a565b82525050565b6000612bfe8261313a565b612c088185613150565b9350612c188185602086016132bb565b612c21816133fc565b840191505092915050565b6000612c3782613145565b612c41818561316c565b9350612c518185602086016132bb565b612c5a816133fc565b840191505092915050565b6000612c7082613145565b612c7a818561317d565b9350612c8a8185602086016132bb565b80840191505092915050565b6000612ca360268361316c565b9150612cae8261340d565b604082019050919050565b6000612cc6601d8361316c565b9150612cd18261345c565b602082019050919050565b6000612ce9601c8361316c565b9150612cf482613485565b602082019050919050565b6000612d0c60288361316c565b9150612d17826134ae565b604082019050919050565b6000612d2f60178361316c565b9150612d3a826134fd565b602082019050919050565b6000612d5260188361316c565b9150612d5d82613526565b602082019050919050565b6000612d7560238361316c565b9150612d808261354f565b604082019050919050565b6000612d9860278361316c565b9150612da38261359e565b604082019050919050565b6000612dbb60108361316c565b9150612dc6826135ed565b602082019050919050565b6000612dde60148361316c565b9150612de982613616565b602082019050919050565b6000612e0160178361316c565b9150612e0c8261363f565b602082019050919050565b6000612e2460208361316c565b9150612e2f82613668565b602082019050919050565b6000612e47600083613161565b9150612e5282613691565b600082019050919050565b612e66816132a2565b82525050565b6000612e788285612c65565b9150612e848284612c65565b91508190509392505050565b6000612e9b82612e3a565b9150819050919050565b6000602082019050612eba6000830184612bd5565b92915050565b6000608082019050612ed56000830187612bd5565b612ee26020830186612bd5565b612eef6040830185612e5d565b8181036060830152612f018184612bf3565b905095945050505050565b6000602082019050612f216000830184612be4565b92915050565b60006020820190508181036000830152612f418184612c2c565b905092915050565b60006020820190508181036000830152612f6281612c96565b9050919050565b60006020820190508181036000830152612f8281612cb9565b9050919050565b60006020820190508181036000830152612fa281612cdc565b9050919050565b60006020820190508181036000830152612fc281612cff565b9050919050565b60006020820190508181036000830152612fe281612d22565b9050919050565b6000602082019050818103600083015261300281612d45565b9050919050565b6000602082019050818103600083015261302281612d68565b9050919050565b6000602082019050818103600083015261304281612d8b565b9050919050565b6000602082019050818103600083015261306281612dae565b9050919050565b6000602082019050818103600083015261308281612dd1565b9050919050565b600060208201905081810360008301526130a281612df4565b9050919050565b600060208201905081810360008301526130c281612e17565b9050919050565b60006020820190506130de6000830184612e5d565b92915050565b60006130ee6130ff565b90506130fa8282613320565b919050565b6000604051905090565b600067ffffffffffffffff821115613124576131236133af565b5b61312d826133fc565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613193826132a2565b915061319e836132a2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131d3576131d2613351565b5b828201905092915050565b60006131e9826132a2565b91506131f4836132a2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561322d5761322c613351565b5b828202905092915050565b600061324382613282565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156132d95780820151818401526020810190506132be565b838111156132e8576000848401525b50505050565b6000600282049050600182168061330657607f821691505b6020821081141561331a57613319613380565b5b50919050565b613329826133fc565b810181811067ffffffffffffffff82111715613348576133476133af565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f47445a3a2045786365656473206d6178206672656520737570706c792e000000600082015250565b7f43616c6c65722063616e6e6f74206265206120636f6e74726163742e00000000600082015250565b7f47445a3a2045786365656473206d61782066726565206d696e7473207065722060008201527f6164647265737321000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f7420616374697665207965742e000000000000000000600082015250565b7f47445a3a2045786365656473206d617820737570706c792e0000000000000000600082015250565b7f47445a3a2045786365656473206d6178206d696e74732070657220616464726560008201527f7373210000000000000000000000000000000000000000000000000000000000602082015250565b7f537570706c792063616e6e6f742066616c6c2062656c6f77206d696e7465642060008201527f746f6b656e732e00000000000000000000000000000000000000000000000000602082015250565b7f7472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f496e76616c6964206d696e7420616d6f756e742e000000000000000000000000600082015250565b7f47445a3a20496e73756666696369656e742046756e642e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b61369d81613238565b81146136a857600080fd5b50565b6136b48161324a565b81146136bf57600080fd5b50565b6136cb81613256565b81146136d657600080fd5b50565b6136e2816132a2565b81146136ed57600080fd5b5056fea2646970667358221220203aa448b0a4eff4a6048c92112df7961b4a0b8b7ffc90d164424e8e252a224664736f6c63430008070033
Deployed Bytecode Sourcemap
43247:3657:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17922:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22935:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25003:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24463:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46213:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16976:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25889:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43548:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26130:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43375:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46440:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46676:225;;;:::i;:::-;;22724:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18601:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4038:103;;;;;;;;;;;;;:::i;:::-;;46121:84;;;;;;;;;;;;;:::i;:::-;;45869:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45110:545;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43493:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3387:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45663:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23104:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43917:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43608:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44348:754;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25279:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26386:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45991:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45757:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23279:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43438:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43318:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25658:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43672:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4296:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43975:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17922:615;18007:4;18322:10;18307:25;;:11;:25;;;;:102;;;;18399:10;18384:25;;:11;:25;;;;18307:102;:179;;;;18476:10;18461:25;;:11;:25;;;;18307:179;18287:199;;17922:615;;;:::o;22935:100::-;22989:13;23022:5;23015:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22935:100;:::o;25003:204::-;25071:7;25096:16;25104:7;25096;:16::i;:::-;25091:64;;25121:34;;;;;;;;;;;;;;25091:64;25175:15;:24;25191:7;25175:24;;;;;;;;;;;;;;;;;;;;;25168:31;;25003:204;;;:::o;24463:474::-;24536:13;24568:27;24587:7;24568:18;:27::i;:::-;24536:61;;24618:5;24612:11;;:2;:11;;;24608:48;;;24632:24;;;;;;;;;;;;;;24608:48;24696:5;24673:28;;:19;:17;:19::i;:::-;:28;;;24669:175;;24721:44;24738:5;24745:19;:17;:19::i;:::-;24721:16;:44::i;:::-;24716:128;;24793:35;;;;;;;;;;;;;;24716:128;24669:175;24883:2;24856:15;:24;24872:7;24856:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24921:7;24917:2;24901:28;;24910:5;24901:28;;;;;;;;;;;;24525:412;24463:474;;:::o;46213:219::-;3618:12;:10;:12::i;:::-;3607:23;;:7;:5;:7::i;:::-;:23;;;3599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46324:1:::1;46313:7;46302:9;;:18;;;;:::i;:::-;:23;;46280:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;46417:7;46404:9;;:20;;;;;;;:::i;:::-;;;;;;;;46213:219:::0;:::o;16976:315::-;17029:7;17257:15;:13;:15::i;:::-;17242:12;;17226:13;;:28;:46;17219:53;;16976:315;:::o;25889:170::-;26023:28;26033:4;26039:2;26043:7;26023:9;:28::i;:::-;25889:170;;;:::o;43548:47::-;;;;:::o;26130:185::-;26268:39;26285:4;26291:2;26295:7;26268:39;;;;;;;;;;;;:16;:39::i;:::-;26130:185;;;:::o;43375:50::-;;;;:::o;46440:106::-;3618:12;:10;:12::i;:::-;3607:23;;:7;:5;:7::i;:::-;:23;;;3599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46531:7:::1;;46515:13;:23;;;;;;;:::i;:::-;;46440:106:::0;;:::o;46676:225::-;3618:12;:10;:12::i;:::-;3607:23;;:7;:5;:7::i;:::-;:23;;;3599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46744:12:::1;43772:42;46762:26;;46810:21;46762:84;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46743:103;;;46865:7;46857:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;46730:171;46676:225::o:0;22724:144::-;22788:7;22831:27;22850:7;22831:18;:27::i;:::-;22808:52;;22724:144;;;:::o;18601:224::-;18665:7;18706:1;18689:19;;:5;:19;;;18685:60;;;18717:28;;;;;;;;;;;;;;18685:60;13940:13;18763:18;:25;18782:5;18763:25;;;;;;;;;;;;;;;;:54;18756:61;;18601:224;;;:::o;4038:103::-;3618:12;:10;:12::i;:::-;3607:23;;:7;:5;:7::i;:::-;:23;;;3599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4103:30:::1;4130:1;4103:18;:30::i;:::-;4038:103::o:0;46121:84::-;3618:12;:10;:12::i;:::-;3607:23;;:7;:5;:7::i;:::-;:23;;;3599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46185:12:::1;;;;;;;;;;;46184:13;46169:12;;:28;;;;;;;;;;;;;;;;;;46121:84::o:0;45869:114::-;3618:12;:10;:12::i;:::-;3607:23;;:7;:5;:7::i;:::-;:23;;;3599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45968:7:::1;45942:23;:33;;;;45869:114:::0;:::o;45110:545::-;44205:12;;;;;;;;;;;44197:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;44277:10;44264:23;;:9;:23;;;44256:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;45239:9:::1;45223:13;:11;:13::i;:::-;:25;;;;:::i;:::-;45206:13;;:42;;45184:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;45316:25;45344:16;:28;45361:10;45344:28;;;;;;;;;;;;;;;;45316:56;;45438:27;;45425:9;45405:17;:29;;;;:::i;:::-;:60;;45383:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;45595:9;45575:17;:29;;;;:::i;:::-;45544:16;:28;45561:10;45544:28;;;;;;;;;;;;;;;:60;;;;45615:32;45625:10;45637:9;45615;:32::i;:::-;45173:482;45110:545:::0;:::o;43493:48::-;;;;:::o;3387:87::-;3433:7;3460:6;;;;;;;;;;;3453:13;;3387:87;:::o;45663:86::-;3618:12;:10;:12::i;:::-;3607:23;;:7;:5;:7::i;:::-;:23;;;3599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45735:6:::1;45727:5;:14;;;;45663:86:::0;:::o;23104:104::-;23160:13;23193:7;23186:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23104:104;:::o;43917:51::-;;;;;;;;;;;;;;;;;:::o;43608:57::-;;;;:::o;44348:754::-;44205:12;;;;;;;;;;;44197:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;44277:10;44264:23;;:9;:23;;;44256:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;44469:9:::1;44461:5;;:17;;;;:::i;:::-;44448:9;:30;;44426:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;44591:9;44575:13;:11;:13::i;:::-;:25;;;;:::i;:::-;44562:9;;:38;;44540:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;44663:21;44687:12;:24;44700:10;44687:24;;;;;;;;;;;;;;;;44663:48;;44773:23;;44760:9;44744:13;:25;;;;:::i;:::-;:52;;44722:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;44904:1;44892:9;:13;:48;;;;;44922:18;;44909:9;:31;;44892:48;44870:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;45042:9;45026:13;:25;;;;:::i;:::-;44999:12;:24;45012:10;44999:24;;;;;;;;;;;;;;;:52;;;;45062:32;45072:10;45084:9;45062;:32::i;:::-;44415:687;44348:754:::0;:::o;25279:308::-;25390:19;:17;:19::i;:::-;25378:31;;:8;:31;;;25374:61;;;25418:17;;;;;;;;;;;;;;25374:61;25500:8;25448:18;:39;25467:19;:17;:19::i;:::-;25448:39;;;;;;;;;;;;;;;:49;25488:8;25448:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25560:8;25524:55;;25539:19;:17;:19::i;:::-;25524:55;;;25570:8;25524:55;;;;;;:::i;:::-;;;;;;;;25279:308;;:::o;26386:396::-;26553:28;26563:4;26569:2;26573:7;26553:9;:28::i;:::-;26614:1;26596:2;:14;;;:19;26592:183;;26635:56;26666:4;26672:2;26676:7;26685:5;26635:30;:56::i;:::-;26630:145;;26719:40;;;;;;;;;;;;;;26630:145;26592:183;26386:396;;;;:::o;45991:122::-;3618:12;:10;:12::i;:::-;3607:23;;:7;:5;:7::i;:::-;:23;;;3599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46098:7:::1;46068:27;:37;;;;45991:122:::0;:::o;45757:104::-;3618:12;:10;:12::i;:::-;3607:23;;:7;:5;:7::i;:::-;:23;;;3599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45846:7:::1;45825:18;:28;;;;45757:104:::0;:::o;23279:318::-;23352:13;23383:16;23391:7;23383;:16::i;:::-;23378:59;;23408:29;;;;;;;;;;;;;;23378:59;23450:21;23474:10;:8;:10::i;:::-;23450:34;;23527:1;23508:7;23502:21;:26;;:87;;;;;;;;;;;;;;;;;23555:7;23564:18;23574:7;23564:9;:18::i;:::-;23538:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23502:87;23495:94;;;23279:318;;;:::o;43438:48::-;;;;:::o;43318:50::-;;;;:::o;25658:164::-;25755:4;25779:18;:25;25798:5;25779:25;;;;;;;;;;;;;;;:35;25805:8;25779:35;;;;;;;;;;;;;;;;;;;;;;;;;25772:42;;25658:164;;;;:::o;43672:50::-;;;;;;;;;;;;;:::o;4296:201::-;3618:12;:10;:12::i;:::-;3607:23;;:7;:5;:7::i;:::-;:23;;;3599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4405:1:::1;4385:22;;:8;:22;;;;4377:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4461:28;4480:8;4461:18;:28::i;:::-;4296:201:::0;:::o;43975:47::-;;;;;;;;;;;;;;;;;:::o;27037:273::-;27094:4;27150:7;27131:15;:13;:15::i;:::-;:26;;:66;;;;;27184:13;;27174:7;:23;27131:66;:152;;;;;27282:1;14710:8;27235:17;:26;27253:7;27235:26;;;;;;;;;;;;:43;:48;27131:152;27111:172;;27037:273;;;:::o;20239:1129::-;20306:7;20326:12;20341:7;20326:22;;20409:4;20390:15;:13;:15::i;:::-;:23;20386:915;;20443:13;;20436:4;:20;20432:869;;;20481:14;20498:17;:23;20516:4;20498:23;;;;;;;;;;;;20481:40;;20614:1;14710:8;20587:6;:23;:28;20583:699;;;21106:113;21123:1;21113:6;:11;21106:113;;;21166:17;:25;21184:6;;;;;;;21166:25;;;;;;;;;;;;21157:34;;21106:113;;;21252:6;21245:13;;;;;;20583:699;20458:843;20432:869;20386:915;21329:31;;;;;;;;;;;;;;20239:1129;;;;:::o;41019:105::-;41079:7;41106:10;41099:17;;41019:105;:::o;2115:98::-;2168:7;2195:10;2188:17;;2115:98;:::o;16499:92::-;16555:7;16499:92;:::o;32276:2515::-;32391:27;32421;32440:7;32421:18;:27::i;:::-;32391:57;;32506:4;32465:45;;32481:19;32465:45;;;32461:86;;32519:28;;;;;;;;;;;;;;32461:86;32560:22;32609:4;32586:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;32630:43;32647:4;32653:19;:17;:19::i;:::-;32630:16;:43::i;:::-;32586:87;:147;;;;32714:19;:17;:19::i;:::-;32690:43;;:20;32702:7;32690:11;:20::i;:::-;:43;;;32586:147;32560:174;;32752:17;32747:66;;32778:35;;;;;;;;;;;;;;32747:66;32842:1;32828:16;;:2;:16;;;32824:52;;;32853:23;;;;;;;;;;;;;;32824:52;32889:43;32911:4;32917:2;32921:7;32930:1;32889:21;:43::i;:::-;33005:15;:24;33021:7;33005:24;;;;;;;;;;;;32998:31;;;;;;;;;;;33397:18;:24;33416:4;33397:24;;;;;;;;;;;;;;;;33395:26;;;;;;;;;;;;33466:18;:22;33485:2;33466:22;;;;;;;;;;;;;;;;33464:24;;;;;;;;;;;14992:8;14594:3;33847:15;:41;;33805:21;33823:2;33805:17;:21::i;:::-;:84;:128;33759:17;:26;33777:7;33759:26;;;;;;;;;;;:174;;;;34103:1;14992:8;34053:19;:46;:51;34049:626;;;34125:19;34157:1;34147:7;:11;34125:33;;34314:1;34280:17;:30;34298:11;34280:30;;;;;;;;;;;;:35;34276:384;;;34418:13;;34403:11;:28;34399:242;;34598:19;34565:17;:30;34583:11;34565:30;;;;;;;;;;;:52;;;;34399:242;34276:384;34106:569;34049:626;34722:7;34718:2;34703:27;;34712:4;34703:27;;;;;;;;;;;;34741:42;34762:4;34768:2;34772:7;34781:1;34741:20;:42::i;:::-;32380:2411;;32276:2515;;;:::o;4657:191::-;4731:16;4750:6;;;;;;;;;;;4731:25;;4776:8;4767:6;;:17;;;;;;;;;;;;;;;;;;4831:8;4800:40;;4821:8;4800:40;;;;;;;;;;;;4720:128;4657:191;:::o;27394:104::-;27463:27;27473:2;27477:8;27463:27;;;;;;;;;;;;:9;:27::i;:::-;27394:104;;:::o;38488:716::-;38651:4;38697:2;38672:45;;;38718:19;:17;:19::i;:::-;38739:4;38745:7;38754:5;38672:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38668:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38972:1;38955:6;:13;:18;38951:235;;;39001:40;;;;;;;;;;;;;;38951:235;39144:6;39138:13;39129:6;39125:2;39121:15;39114:38;38668:529;38841:54;;;38831:64;;;:6;:64;;;;38824:71;;;38488:716;;;;;;:::o;46554:114::-;46614:13;46647;46640:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46554:114;:::o;41230:1959::-;41287:17;41708:3;41701:4;41695:11;41691:21;41684:28;;41799:3;41793:4;41786:17;41905:3;42362:5;42492:1;42487:3;42483:11;42476:18;;42629:2;42623:4;42619:13;42615:2;42611:22;42606:3;42598:36;42670:2;42664:4;42660:13;42652:21;;42253:682;42689:4;42253:682;;;42864:1;42859:3;42855:11;42848:18;;42915:2;42909:4;42905:13;42901:2;42897:22;42892:3;42884:36;42785:2;42779:4;42775:13;42767:21;;42253:682;;;42257:431;42986:3;42981;42977:13;43101:2;43096:3;43092:12;43085:19;;43164:6;43159:3;43152:19;41326:1856;;41230:1959;;;:::o;39852:159::-;;;;;:::o;24024:148::-;24088:14;24149:5;24139:15;;24024:148;;;:::o;40670:158::-;;;;;:::o;27871:2236::-;27994:20;28017:13;;27994:36;;28059:1;28045:16;;:2;:16;;;28041:48;;;28070:19;;;;;;;;;;;;;;28041:48;28116:1;28104:8;:13;28100:44;;;28126:18;;;;;;;;;;;;;;28100:44;28157:61;28187:1;28191:2;28195:12;28209:8;28157:21;:61::i;:::-;28761:1;14077:2;28732:1;:25;;28731:31;28719:8;:44;28693:18;:22;28712:2;28693:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;14857:3;29162:29;29189:1;29177:8;:13;29162:14;:29::i;:::-;:56;;14594:3;29099:15;:41;;29057:21;29075:2;29057:17;:21::i;:::-;:84;:162;29006:17;:31;29024:12;29006:31;;;;;;;;;;;:213;;;;29236:20;29259:12;29236:35;;29286:11;29315:8;29300:12;:23;29286:37;;29362:1;29344:2;:14;;;:19;29340:635;;29384:313;29440:12;29436:2;29415:38;;29432:1;29415:38;;;;;;;;;;;;29481:69;29520:1;29524:2;29528:14;;;;;;29544:5;29481:30;:69::i;:::-;29476:174;;29586:40;;;;;;;;;;;;;;29476:174;29692:3;29677:12;:18;29384:313;;29778:12;29761:13;;:29;29757:43;;29792:8;;;29757:43;29340:635;;;29841:119;29897:14;;;;;;29893:2;29872:40;;29889:1;29872:40;;;;;;;;;;;;29955:3;29940:12;:18;29841:119;;29340:635;30005:12;29989:13;:28;;;;28470:1559;;30039:60;30068:1;30072:2;30076:12;30090:8;30039:20;:60::i;:::-;27983:2124;27871:2236;;;:::o;24259:142::-;24317:14;24378:5;24368:15;;24259:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:327::-;5473:6;5522:2;5510:9;5501:7;5497:23;5493:32;5490:119;;;5528:79;;:::i;:::-;5490:119;5648:1;5673:52;5717:7;5708:6;5697:9;5693:22;5673:52;:::i;:::-;5663:62;;5619:116;5415:327;;;;:::o;5748:349::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:63;6072:7;6063:6;6052:9;6048:22;6017:63;:::i;:::-;6007:73;;5963:127;5748:349;;;;:::o;6103:529::-;6174:6;6182;6231:2;6219:9;6210:7;6206:23;6202:32;6199:119;;;6237:79;;:::i;:::-;6199:119;6385:1;6374:9;6370:17;6357:31;6415:18;6407:6;6404:30;6401:117;;;6437:79;;:::i;:::-;6401:117;6550:65;6607:7;6598:6;6587:9;6583:22;6550:65;:::i;:::-;6532:83;;;;6328:297;6103:529;;;;;:::o;6638:329::-;6697:6;6746:2;6734:9;6725:7;6721:23;6717:32;6714:119;;;6752:79;;:::i;:::-;6714:119;6872:1;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6843:117;6638:329;;;;:::o;6973:118::-;7060:24;7078:5;7060:24;:::i;:::-;7055:3;7048:37;6973:118;;:::o;7097:109::-;7178:21;7193:5;7178:21;:::i;:::-;7173:3;7166:34;7097:109;;:::o;7212:360::-;7298:3;7326:38;7358:5;7326:38;:::i;:::-;7380:70;7443:6;7438:3;7380:70;:::i;:::-;7373:77;;7459:52;7504:6;7499:3;7492:4;7485:5;7481:16;7459:52;:::i;:::-;7536:29;7558:6;7536:29;:::i;:::-;7531:3;7527:39;7520:46;;7302:270;7212:360;;;;:::o;7578:364::-;7666:3;7694:39;7727:5;7694:39;:::i;:::-;7749:71;7813:6;7808:3;7749:71;:::i;:::-;7742:78;;7829:52;7874:6;7869:3;7862:4;7855:5;7851:16;7829:52;:::i;:::-;7906:29;7928:6;7906:29;:::i;:::-;7901:3;7897:39;7890:46;;7670:272;7578:364;;;;:::o;7948:377::-;8054:3;8082:39;8115:5;8082:39;:::i;:::-;8137:89;8219:6;8214:3;8137:89;:::i;:::-;8130:96;;8235:52;8280:6;8275:3;8268:4;8261:5;8257:16;8235:52;:::i;:::-;8312:6;8307:3;8303:16;8296:23;;8058:267;7948:377;;;;:::o;8331:366::-;8473:3;8494:67;8558:2;8553:3;8494:67;:::i;:::-;8487:74;;8570:93;8659:3;8570:93;:::i;:::-;8688:2;8683:3;8679:12;8672:19;;8331:366;;;:::o;8703:::-;8845:3;8866:67;8930:2;8925:3;8866:67;:::i;:::-;8859:74;;8942:93;9031:3;8942:93;:::i;:::-;9060:2;9055:3;9051:12;9044:19;;8703:366;;;:::o;9075:::-;9217:3;9238:67;9302:2;9297:3;9238:67;:::i;:::-;9231:74;;9314:93;9403:3;9314:93;:::i;:::-;9432:2;9427:3;9423:12;9416:19;;9075:366;;;:::o;9447:::-;9589:3;9610:67;9674:2;9669:3;9610:67;:::i;:::-;9603:74;;9686:93;9775:3;9686:93;:::i;:::-;9804:2;9799:3;9795:12;9788:19;;9447:366;;;:::o;9819:::-;9961:3;9982:67;10046:2;10041:3;9982:67;:::i;:::-;9975:74;;10058:93;10147:3;10058:93;:::i;:::-;10176:2;10171:3;10167:12;10160:19;;9819:366;;;:::o;10191:::-;10333:3;10354:67;10418:2;10413:3;10354:67;:::i;:::-;10347:74;;10430:93;10519:3;10430:93;:::i;:::-;10548:2;10543:3;10539:12;10532:19;;10191:366;;;:::o;10563:::-;10705:3;10726:67;10790:2;10785:3;10726:67;:::i;:::-;10719:74;;10802:93;10891:3;10802:93;:::i;:::-;10920:2;10915:3;10911:12;10904:19;;10563:366;;;:::o;10935:::-;11077:3;11098:67;11162:2;11157:3;11098:67;:::i;:::-;11091:74;;11174:93;11263:3;11174:93;:::i;:::-;11292:2;11287:3;11283:12;11276:19;;10935:366;;;:::o;11307:::-;11449:3;11470:67;11534:2;11529:3;11470:67;:::i;:::-;11463:74;;11546:93;11635:3;11546:93;:::i;:::-;11664:2;11659:3;11655:12;11648:19;;11307:366;;;:::o;11679:::-;11821:3;11842:67;11906:2;11901:3;11842:67;:::i;:::-;11835:74;;11918:93;12007:3;11918:93;:::i;:::-;12036:2;12031:3;12027:12;12020:19;;11679:366;;;:::o;12051:::-;12193:3;12214:67;12278:2;12273:3;12214:67;:::i;:::-;12207:74;;12290:93;12379:3;12290:93;:::i;:::-;12408:2;12403:3;12399:12;12392:19;;12051:366;;;:::o;12423:::-;12565:3;12586:67;12650:2;12645:3;12586:67;:::i;:::-;12579:74;;12662:93;12751:3;12662:93;:::i;:::-;12780:2;12775:3;12771:12;12764:19;;12423:366;;;:::o;12795:398::-;12954:3;12975:83;13056:1;13051:3;12975:83;:::i;:::-;12968:90;;13067:93;13156:3;13067:93;:::i;:::-;13185:1;13180:3;13176:11;13169:18;;12795:398;;;:::o;13199:118::-;13286:24;13304:5;13286:24;:::i;:::-;13281:3;13274:37;13199:118;;:::o;13323:435::-;13503:3;13525:95;13616:3;13607:6;13525:95;:::i;:::-;13518:102;;13637:95;13728:3;13719:6;13637:95;:::i;:::-;13630:102;;13749:3;13742:10;;13323:435;;;;;:::o;13764:379::-;13948:3;13970:147;14113:3;13970:147;:::i;:::-;13963:154;;14134:3;14127:10;;13764:379;;;:::o;14149:222::-;14242:4;14280:2;14269:9;14265:18;14257:26;;14293:71;14361:1;14350:9;14346:17;14337:6;14293:71;:::i;:::-;14149:222;;;;:::o;14377:640::-;14572:4;14610:3;14599:9;14595:19;14587:27;;14624:71;14692:1;14681:9;14677:17;14668:6;14624:71;:::i;:::-;14705:72;14773:2;14762:9;14758:18;14749:6;14705:72;:::i;:::-;14787;14855:2;14844:9;14840:18;14831:6;14787:72;:::i;:::-;14906:9;14900:4;14896:20;14891:2;14880:9;14876:18;14869:48;14934:76;15005:4;14996:6;14934:76;:::i;:::-;14926:84;;14377:640;;;;;;;:::o;15023:210::-;15110:4;15148:2;15137:9;15133:18;15125:26;;15161:65;15223:1;15212:9;15208:17;15199:6;15161:65;:::i;:::-;15023:210;;;;:::o;15239:313::-;15352:4;15390:2;15379:9;15375:18;15367:26;;15439:9;15433:4;15429:20;15425:1;15414:9;15410:17;15403:47;15467:78;15540:4;15531:6;15467:78;:::i;:::-;15459:86;;15239:313;;;;:::o;15558:419::-;15724:4;15762:2;15751:9;15747:18;15739:26;;15811:9;15805:4;15801:20;15797:1;15786:9;15782:17;15775:47;15839:131;15965:4;15839:131;:::i;:::-;15831:139;;15558:419;;;:::o;15983:::-;16149:4;16187:2;16176:9;16172:18;16164:26;;16236:9;16230:4;16226:20;16222:1;16211:9;16207:17;16200:47;16264:131;16390:4;16264:131;:::i;:::-;16256:139;;15983:419;;;:::o;16408:::-;16574:4;16612:2;16601:9;16597:18;16589:26;;16661:9;16655:4;16651:20;16647:1;16636:9;16632:17;16625:47;16689:131;16815:4;16689:131;:::i;:::-;16681:139;;16408:419;;;:::o;16833:::-;16999:4;17037:2;17026:9;17022:18;17014:26;;17086:9;17080:4;17076:20;17072:1;17061:9;17057:17;17050:47;17114:131;17240:4;17114:131;:::i;:::-;17106:139;;16833:419;;;:::o;17258:::-;17424:4;17462:2;17451:9;17447:18;17439:26;;17511:9;17505:4;17501:20;17497:1;17486:9;17482:17;17475:47;17539:131;17665:4;17539:131;:::i;:::-;17531:139;;17258:419;;;:::o;17683:::-;17849:4;17887:2;17876:9;17872:18;17864:26;;17936:9;17930:4;17926:20;17922:1;17911:9;17907:17;17900:47;17964:131;18090:4;17964:131;:::i;:::-;17956:139;;17683:419;;;:::o;18108:::-;18274:4;18312:2;18301:9;18297:18;18289:26;;18361:9;18355:4;18351:20;18347:1;18336:9;18332:17;18325:47;18389:131;18515:4;18389:131;:::i;:::-;18381:139;;18108:419;;;:::o;18533:::-;18699:4;18737:2;18726:9;18722:18;18714:26;;18786:9;18780:4;18776:20;18772:1;18761:9;18757:17;18750:47;18814:131;18940:4;18814:131;:::i;:::-;18806:139;;18533:419;;;:::o;18958:::-;19124:4;19162:2;19151:9;19147:18;19139:26;;19211:9;19205:4;19201:20;19197:1;19186:9;19182:17;19175:47;19239:131;19365:4;19239:131;:::i;:::-;19231:139;;18958:419;;;:::o;19383:::-;19549:4;19587:2;19576:9;19572:18;19564:26;;19636:9;19630:4;19626:20;19622:1;19611:9;19607:17;19600:47;19664:131;19790:4;19664:131;:::i;:::-;19656:139;;19383:419;;;:::o;19808:::-;19974:4;20012:2;20001:9;19997:18;19989:26;;20061:9;20055:4;20051:20;20047:1;20036:9;20032:17;20025:47;20089:131;20215:4;20089:131;:::i;:::-;20081:139;;19808:419;;;:::o;20233:::-;20399:4;20437:2;20426:9;20422:18;20414:26;;20486:9;20480:4;20476:20;20472:1;20461:9;20457:17;20450:47;20514:131;20640:4;20514:131;:::i;:::-;20506:139;;20233:419;;;:::o;20658:222::-;20751:4;20789:2;20778:9;20774:18;20766:26;;20802:71;20870:1;20859:9;20855:17;20846:6;20802:71;:::i;:::-;20658:222;;;;:::o;20886:129::-;20920:6;20947:20;;:::i;:::-;20937:30;;20976:33;21004:4;20996:6;20976:33;:::i;:::-;20886:129;;;:::o;21021:75::-;21054:6;21087:2;21081:9;21071:19;;21021:75;:::o;21102:307::-;21163:4;21253:18;21245:6;21242:30;21239:56;;;21275:18;;:::i;:::-;21239:56;21313:29;21335:6;21313:29;:::i;:::-;21305:37;;21397:4;21391;21387:15;21379:23;;21102:307;;;:::o;21415:98::-;21466:6;21500:5;21494:12;21484:22;;21415:98;;;:::o;21519:99::-;21571:6;21605:5;21599:12;21589:22;;21519:99;;;:::o;21624:168::-;21707:11;21741:6;21736:3;21729:19;21781:4;21776:3;21772:14;21757:29;;21624:168;;;;:::o;21798:147::-;21899:11;21936:3;21921:18;;21798:147;;;;:::o;21951:169::-;22035:11;22069:6;22064:3;22057:19;22109:4;22104:3;22100:14;22085:29;;21951:169;;;;:::o;22126:148::-;22228:11;22265:3;22250:18;;22126:148;;;;:::o;22280:305::-;22320:3;22339:20;22357:1;22339:20;:::i;:::-;22334:25;;22373:20;22391:1;22373:20;:::i;:::-;22368:25;;22527:1;22459:66;22455:74;22452:1;22449:81;22446:107;;;22533:18;;:::i;:::-;22446:107;22577:1;22574;22570:9;22563:16;;22280:305;;;;:::o;22591:348::-;22631:7;22654:20;22672:1;22654:20;:::i;:::-;22649:25;;22688:20;22706:1;22688:20;:::i;:::-;22683:25;;22876:1;22808:66;22804:74;22801:1;22798:81;22793:1;22786:9;22779:17;22775:105;22772:131;;;22883:18;;:::i;:::-;22772:131;22931:1;22928;22924:9;22913:20;;22591:348;;;;:::o;22945:96::-;22982:7;23011:24;23029:5;23011:24;:::i;:::-;23000:35;;22945:96;;;:::o;23047:90::-;23081:7;23124:5;23117:13;23110:21;23099:32;;23047:90;;;:::o;23143:149::-;23179:7;23219:66;23212:5;23208:78;23197:89;;23143:149;;;:::o;23298:126::-;23335:7;23375:42;23368:5;23364:54;23353:65;;23298:126;;;:::o;23430:77::-;23467:7;23496:5;23485:16;;23430:77;;;:::o;23513:154::-;23597:6;23592:3;23587;23574:30;23659:1;23650:6;23645:3;23641:16;23634:27;23513:154;;;:::o;23673:307::-;23741:1;23751:113;23765:6;23762:1;23759:13;23751:113;;;23850:1;23845:3;23841:11;23835:18;23831:1;23826:3;23822:11;23815:39;23787:2;23784:1;23780:10;23775:15;;23751:113;;;23882:6;23879:1;23876:13;23873:101;;;23962:1;23953:6;23948:3;23944:16;23937:27;23873:101;23722:258;23673:307;;;:::o;23986:320::-;24030:6;24067:1;24061:4;24057:12;24047:22;;24114:1;24108:4;24104:12;24135:18;24125:81;;24191:4;24183:6;24179:17;24169:27;;24125:81;24253:2;24245:6;24242:14;24222:18;24219:38;24216:84;;;24272:18;;:::i;:::-;24216:84;24037:269;23986:320;;;:::o;24312:281::-;24395:27;24417:4;24395:27;:::i;:::-;24387:6;24383:40;24525:6;24513:10;24510:22;24489:18;24477:10;24474:34;24471:62;24468:88;;;24536:18;;:::i;:::-;24468:88;24576:10;24572:2;24565:22;24355:238;24312:281;;:::o;24599:180::-;24647:77;24644:1;24637:88;24744:4;24741:1;24734:15;24768:4;24765:1;24758:15;24785:180;24833:77;24830:1;24823:88;24930:4;24927:1;24920:15;24954:4;24951:1;24944:15;24971:180;25019:77;25016:1;25009:88;25116:4;25113:1;25106:15;25140:4;25137:1;25130:15;25157:117;25266:1;25263;25256:12;25280:117;25389:1;25386;25379:12;25403:117;25512:1;25509;25502:12;25526:117;25635:1;25632;25625:12;25649:117;25758:1;25755;25748:12;25772:117;25881:1;25878;25871:12;25895:102;25936:6;25987:2;25983:7;25978:2;25971:5;25967:14;25963:28;25953:38;;25895:102;;;:::o;26003:225::-;26143:34;26139:1;26131:6;26127:14;26120:58;26212:8;26207:2;26199:6;26195:15;26188:33;26003:225;:::o;26234:179::-;26374:31;26370:1;26362:6;26358:14;26351:55;26234:179;:::o;26419:178::-;26559:30;26555:1;26547:6;26543:14;26536:54;26419:178;:::o;26603:227::-;26743:34;26739:1;26731:6;26727:14;26720:58;26812:10;26807:2;26799:6;26795:15;26788:35;26603:227;:::o;26836:173::-;26976:25;26972:1;26964:6;26960:14;26953:49;26836:173;:::o;27015:174::-;27155:26;27151:1;27143:6;27139:14;27132:50;27015:174;:::o;27195:222::-;27335:34;27331:1;27323:6;27319:14;27312:58;27404:5;27399:2;27391:6;27387:15;27380:30;27195:222;:::o;27423:226::-;27563:34;27559:1;27551:6;27547:14;27540:58;27632:9;27627:2;27619:6;27615:15;27608:34;27423:226;:::o;27655:166::-;27795:18;27791:1;27783:6;27779:14;27772:42;27655:166;:::o;27827:170::-;27967:22;27963:1;27955:6;27951:14;27944:46;27827:170;:::o;28003:173::-;28143:25;28139:1;28131:6;28127:14;28120:49;28003:173;:::o;28182:182::-;28322:34;28318:1;28310:6;28306:14;28299:58;28182:182;:::o;28370:114::-;;:::o;28490:122::-;28563:24;28581:5;28563:24;:::i;:::-;28556:5;28553:35;28543:63;;28602:1;28599;28592:12;28543:63;28490:122;:::o;28618:116::-;28688:21;28703:5;28688:21;:::i;:::-;28681:5;28678:32;28668:60;;28724:1;28721;28714:12;28668:60;28618:116;:::o;28740:120::-;28812:23;28829:5;28812:23;:::i;:::-;28805:5;28802:34;28792:62;;28850:1;28847;28840:12;28792:62;28740:120;:::o;28866:122::-;28939:24;28957:5;28939:24;:::i;:::-;28932:5;28929:35;28919:63;;28978:1;28975;28968:12;28919:63;28866:122;:::o
Swarm Source
ipfs://203aa448b0a4eff4a6048c92112df7961b4a0b8b7ffc90d164424e8e252a2246
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.