Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 394 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer From | 18107602 | 311 days ago | IN | 0 ETH | 0.00046536 | ||||
Transfer From | 18107601 | 311 days ago | IN | 0 ETH | 0.00060529 | ||||
Set Approval For... | 17030741 | 463 days ago | IN | 0 ETH | 0.0008949 | ||||
Approve | 16335956 | 560 days ago | IN | 0 ETH | 0.00070462 | ||||
Set Approval For... | 16318415 | 562 days ago | IN | 0 ETH | 0.00064565 | ||||
Approve | 16289632 | 566 days ago | IN | 0 ETH | 0.00082806 | ||||
Approve | 16289462 | 567 days ago | IN | 0 ETH | 0.0007978 | ||||
Set Approval For... | 16173730 | 583 days ago | IN | 0 ETH | 0.00073609 | ||||
Set Approval For... | 16159526 | 585 days ago | IN | 0 ETH | 0.00063164 | ||||
Set Approval For... | 16151134 | 586 days ago | IN | 0 ETH | 0.00034791 | ||||
Set Approval For... | 15580724 | 666 days ago | IN | 0 ETH | 0.00019306 | ||||
Set Approval For... | 15580387 | 666 days ago | IN | 0 ETH | 0.00019785 | ||||
Set Approval For... | 15580365 | 666 days ago | IN | 0 ETH | 0.00026321 | ||||
Set Approval For... | 15580270 | 666 days ago | IN | 0 ETH | 0.00031638 | ||||
Set Approval For... | 15580163 | 666 days ago | IN | 0 ETH | 0.00029894 | ||||
Safe Transfer Fr... | 15520100 | 675 days ago | IN | 0 ETH | 0.00044541 | ||||
Safe Transfer Fr... | 15520096 | 675 days ago | IN | 0 ETH | 0.0004605 | ||||
Safe Transfer Fr... | 15520088 | 675 days ago | IN | 0 ETH | 0.00052161 | ||||
Safe Transfer Fr... | 15520082 | 675 days ago | IN | 0 ETH | 0.00040607 | ||||
Safe Transfer Fr... | 15520076 | 675 days ago | IN | 0 ETH | 0.00034738 | ||||
Safe Transfer Fr... | 15520065 | 675 days ago | IN | 0 ETH | 0.00045295 | ||||
Set Approval For... | 15518352 | 675 days ago | IN | 0 ETH | 0.00086462 | ||||
Safe Transfer Fr... | 15514901 | 675 days ago | IN | 0 ETH | 0.00047192 | ||||
Safe Transfer Fr... | 15514901 | 675 days ago | IN | 0 ETH | 0.00105387 | ||||
Set Approval For... | 15436837 | 688 days ago | IN | 0 ETH | 0.00062649 |
Latest 15 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
14546648 | 831 days ago | 2 ETH | ||||
14546459 | 831 days ago | 4 ETH | ||||
14546436 | 831 days ago | 4 ETH | ||||
14546309 | 831 days ago | 4 ETH | ||||
14543653 | 832 days ago | 3.6 ETH | ||||
14542659 | 832 days ago | 2.7 ETH | ||||
14527702 | 834 days ago | 1.64 ETH | ||||
14520675 | 835 days ago | 1.6 ETH | ||||
14517581 | 836 days ago | 2.2 ETH | ||||
14477522 | 842 days ago | 1.76 ETH | ||||
14477091 | 842 days ago | 3.36 ETH | ||||
14471418 | 843 days ago | 2.08 ETH | ||||
14471173 | 843 days ago | 15.75999999 ETH | ||||
14471163 | 843 days ago | 10 wei | ||||
14432572 | 849 days ago | 0.08 ETH |
Loading...
Loading
Contract Name:
legendsofasians
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-21 */ /** *Submitted for verification at Etherscan.io on 2022-03-21 */ /** *Submitted for verification at Etherscan.io on 2022-03-18 */ /** *Submitted for verification at Etherscan.io on 2022-03-18 */ /** *Submitted for verification at Etherscan.io on 2022-03-14 */ /** *Submitted for verification at Etherscan.io on 2022-03-11 */ /** *Submitted for verification at Etherscan.io on 2022-03-07 */ /** *Submitted for verification at Etherscan.io on 2022-03-07 */ /** *Submitted for verification at Etherscan.io on 2022-03-04 */ /** *Submitted for verification at Etherscan.io on 2022-03-04 */ // SPDX-License-Identifier: MIT pragma solidity ^ 0.8.7; pragma experimental ABIEncoderV2; /** * @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; } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface 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); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @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`, 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns(address operator); /** * @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 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); /** * @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; } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @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); } abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns(bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // 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; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns(bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns(uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns(address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @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) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @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 See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns(address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), 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 { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _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 { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @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`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns(bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns(bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * 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 ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a 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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns(bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns(bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual { } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns(bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size:= extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{ value: amount } (""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns(bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns(bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns(bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns(bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{ value: value } (data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns(bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns(bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns(bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns(bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size:= mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns(bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns(uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns(uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns(uint256); } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns(string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns(string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns(string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns(bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns(bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns(bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns(bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns(bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns(uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns(uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns(uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns(uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns(uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns(uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns(uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns(uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } /** * @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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns(bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns(uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns(uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns(uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @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 Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. 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; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _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 ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev See {IERC721Enumerable-totalSupply}. * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * 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 See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { if (owner == address(0)) revert AuxQueryForZeroAddress(); return _addressData[owner].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 { if (owner == address(0)) revert AuxQueryForZeroAddress(); _addressData[owner].aux = aux; } /** * 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) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // 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. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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, tokenId.toString())) : ''; } /** * @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 See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @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 override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), 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.isContract() && !_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 && !_ownerships[tokenId].burned; } 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 { _mint(to, quantity, _data, true); } /** * @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, bytes memory _data, bool safe ) 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 { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { 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 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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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 { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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 { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @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 IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == 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 {} } contract legendsofasians is ERC721A,Ownable { using SafeMath for uint256; using Strings for uint256; uint256 public constant Max_Supply = 3333; uint256 public PublicSale_PRICE_PER_NFT = 80000000000000000 wei; //0.08 ETH bool private _publicSaleIsActive; uint256 public MAX_PURCHASE = 5; bool public paused = true; string private _metaBaseUri = ""; //Token Name and Token Symbol inside constructor constructor(string memory MetaUri) ERC721A("legendsofasians", "LOFA") { _publicSaleIsActive=true; _metaBaseUri = MetaUri; } //Start Public sale(Pass true to start and false to stop) function setPublicSaleOn(bool value) public onlyOwner{ require(paused == false, "Contract is Paused"); _publicSaleIsActive=value; } //Check the Public Sale is Active or Not function publicSaleIsActive() public view returns(bool) { return _publicSaleIsActive; } //Sets PublicSale NFT cost(Must be in wei) function setPublicSalePrice(uint256 price) public onlyOwner{ require(paused == false, "Contract is Paused"); PublicSale_PRICE_PER_NFT=price; } function setMetaBaseURI(string memory baseURI) external onlyOwner { require(paused == false, "Contract is Paused"); _metaBaseUri = baseURI; } function withdraw(uint256 amount) external onlyOwner { require(paused == false, "Contract is Paused"); require(amount <= address(this).balance, 'Insufficient balance'); payable(msg.sender).transfer(amount); } function withdrawAll() external onlyOwner { require(paused == false, "Contract is Paused"); payable(msg.sender).transfer(address(this).balance); } //Set Max Mint Amount per transaction function setMaxPurchase(uint256 tokens) public onlyOwner{ require(paused == false, "Contract is Paused"); MAX_PURCHASE=tokens; } //PublicSale Mint function mint(uint16 numberOfTokens) public payable { require(paused == false, "Contract is Paused"); require(publicSaleIsActive(), "Sale is not active"); require(PublicSale_PRICE_PER_NFT.mul(numberOfTokens) <= msg.value, "Ether value sent is incorrect"); require(numberOfTokens <= MAX_PURCHASE, "Can only mint specific number of tokens per transaction"); require(totalSupply() < Max_Supply, "collection sold out"); require(totalSupply().add(numberOfTokens) < Max_Supply, "Insufficient supply"); _mintTokens(numberOfTokens,msg.sender); } function _mintTokens(uint16 numberOfTokens , address _to) internal { require(paused == false, "Contract is Paused"); _safeMint(_to, numberOfTokens); } function approve(uint256 _tokenId, address _from) internal virtual { require(ownerOf(_tokenId) == msg.sender, "NOT OWNER"); isApprovedForAll(_from, address(this)); } function tokenURI(uint256 tokenId) override public view returns(string memory) { require(paused == false, "Contract is Paused"); require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); return string(abi.encodePacked(_baseURI(), "tokens/", uint256(tokenId).toString(), "/metadata.json")); } function _baseURI() override internal view returns(string memory) { return _metaBaseUri; } //Pause Smart Contract function setPaused(bool _paused) public onlyOwner{ paused = _paused; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"MetaUri","type":"string"}],"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"},{"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":[],"name":"MAX_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Max_Supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PublicSale_PRICE_PER_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[{"internalType":"uint16","name":"numberOfTokens","type":"uint16"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"setMaxPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setMetaBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPublicSaleOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPublicSalePrice","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405267011c37937e0800006009556005600b556001600c60006101000a81548160ff02191690831515021790555060405180602001604052806000815250600d90805190602001906200005792919062000273565b503480156200006557600080fd5b50604051620042593803806200425983398181016040528101906200008b9190620003a1565b6040518060400160405280600f81526020017f6c6567656e64736f66617369616e7300000000000000000000000000000000008152506040518060400160405280600481526020017f4c4f46410000000000000000000000000000000000000000000000000000000081525081600290805190602001906200010f92919062000273565b5080600390805190602001906200012892919062000273565b50620001396200019c60201b60201c565b60008190555050506200016162000155620001a560201b60201c565b620001ad60201b60201c565b6001600a60006101000a81548160ff02191690831515021790555080600d90805190602001906200019492919062000273565b505062000576565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002819062000487565b90600052602060002090601f016020900481019282620002a55760008555620002f1565b82601f10620002c057805160ff1916838001178555620002f1565b82800160010185558215620002f1579182015b82811115620002f0578251825591602001919060010190620002d3565b5b50905062000300919062000304565b5090565b5b808211156200031f57600081600090555060010162000305565b5090565b60006200033a62000334846200041b565b620003f2565b90508281526020810184848401111562000359576200035862000556565b5b6200036684828562000451565b509392505050565b600082601f83011262000386576200038562000551565b5b81516200039884826020860162000323565b91505092915050565b600060208284031215620003ba57620003b962000560565b5b600082015167ffffffffffffffff811115620003db57620003da6200055b565b5b620003e9848285016200036e565b91505092915050565b6000620003fe62000411565b90506200040c8282620004bd565b919050565b6000604051905090565b600067ffffffffffffffff82111562000439576200043862000522565b5b620004448262000565565b9050602081019050919050565b60005b838110156200047157808201518184015260208101905062000454565b8381111562000481576000848401525b50505050565b60006002820490506001821680620004a057607f821691505b60208210811415620004b757620004b6620004f3565b5b50919050565b620004c88262000565565b810181811067ffffffffffffffff82111715620004ea57620004e962000522565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b613cd380620005866000396000f3fe6080604052600436106101cd5760003560e01c80636737c9c1116100f7578063853828b611610095578063b88d4fde11610064578063b88d4fde1461062d578063c87b56dd14610656578063e985e9c514610693578063f2fde38b146106d0576101cd565b8063853828b6146105975780638da5cb5b146105ae57806395d89b41146105d9578063a22cb46514610604576101cd565b80637146bd08116100d15780637146bd0814610501578063715018a61461052c578063791a251914610543578063841eb6671461056c576101cd565b80636737c9c11461047057806370a082311461049b57806371189742146104d8576101cd565b806318d272eb1161016f57806342842e0e1161013e57806342842e0e146103b657806342f0d313146103df5780635c975abb146104085780636352211e14610433576101cd565b806318d272eb1461031f57806323b872dd1461034857806323cf0a22146103715780632e1a7d4d1461038d576101cd565b8063095ea7b3116101ab578063095ea7b3146102775780630fcf2e75146102a057806316c38b3c146102cb57806318160ddd146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612f92565b6106f9565b60405161020691906133a4565b60405180910390f35b34801561021b57600080fd5b506102246107db565b60405161023191906133bf565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190613062565b61086d565b60405161026e919061333d565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612f25565b6108e9565b005b3480156102ac57600080fd5b506102b56109f4565b6040516102c291906133a4565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612f65565b610a0b565b005b34801561030057600080fd5b50610309610aa4565b6040516103169190613521565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190612fec565b610abb565b005b34801561035457600080fd5b5061036f600480360381019061036a9190612e0f565b610ba7565b005b61038b60048036038101906103869190613035565b610bb7565b005b34801561039957600080fd5b506103b460048036038101906103af9190613062565b610db1565b005b3480156103c257600080fd5b506103dd60048036038101906103d89190612e0f565b610f10565b005b3480156103eb57600080fd5b5061040660048036038101906104019190612f65565b610f30565b005b34801561041457600080fd5b5061041d61101f565b60405161042a91906133a4565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190613062565b611032565b604051610467919061333d565b60405180910390f35b34801561047c57600080fd5b50610485611048565b6040516104929190613521565b60405180910390f35b3480156104a757600080fd5b506104c260048036038101906104bd9190612da2565b61104e565b6040516104cf9190613521565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa9190613062565b61111e565b005b34801561050d57600080fd5b506105166111fa565b6040516105239190613521565b60405180910390f35b34801561053857600080fd5b50610541611200565b005b34801561054f57600080fd5b5061056a60048036038101906105659190613062565b611288565b005b34801561057857600080fd5b50610581611364565b60405161058e9190613521565b60405180910390f35b3480156105a357600080fd5b506105ac61136a565b005b3480156105ba57600080fd5b506105c3611485565b6040516105d0919061333d565b60405180910390f35b3480156105e557600080fd5b506105ee6114af565b6040516105fb91906133bf565b60405180910390f35b34801561061057600080fd5b5061062b60048036038101906106269190612ee5565b611541565b005b34801561063957600080fd5b50610654600480360381019061064f9190612e62565b6116b9565b005b34801561066257600080fd5b5061067d60048036038101906106789190613062565b611735565b60405161068a91906133bf565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b59190612dcf565b61180d565b6040516106c791906133a4565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f29190612da2565b6118a1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107c457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107d457506107d382611999565b5b9050919050565b6060600280546107ea906137df565b80601f0160208091040260200160405190810160405280929190818152602001828054610816906137df565b80156108635780601f1061083857610100808354040283529160200191610863565b820191906000526020600020905b81548152906001019060200180831161084657829003601f168201915b5050505050905090565b600061087882611a03565b6108ae576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f482611032565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561095c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661097b611a51565b73ffffffffffffffffffffffffffffffffffffffff16141580156109ad57506109ab816109a6611a51565b61180d565b155b156109e4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109ef838383611a59565b505050565b6000600a60009054906101000a900460ff16905090565b610a13611a51565b73ffffffffffffffffffffffffffffffffffffffff16610a31611485565b73ffffffffffffffffffffffffffffffffffffffff1614610a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7e906134e1565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000610aae611b0b565b6001546000540303905090565b610ac3611a51565b73ffffffffffffffffffffffffffffffffffffffff16610ae1611485565b73ffffffffffffffffffffffffffffffffffffffff1614610b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2e906134e1565b60405180910390fd5b60001515600c60009054906101000a900460ff16151514610b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8490613501565b60405180910390fd5b80600d9080519060200190610ba3929190612b5e565b5050565b610bb2838383611b14565b505050565b60001515600c60009054906101000a900460ff16151514610c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0490613501565b60405180910390fd5b610c156109f4565b610c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4b90613441565b60405180910390fd5b34610c6e8261ffff1660095461200590919063ffffffff16565b1115610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca690613401565b60405180910390fd5b600b548161ffff161115610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cef90613481565b60405180910390fd5b610d05610d03610aa4565b10610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a90613461565b60405180910390fd5b610d05610d648261ffff16610d56610aa4565b61201b90919063ffffffff16565b10610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b906134c1565b60405180910390fd5b610dae8133612031565b50565b610db9611a51565b73ffffffffffffffffffffffffffffffffffffffff16610dd7611485565b73ffffffffffffffffffffffffffffffffffffffff1614610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e24906134e1565b60405180910390fd5b60001515600c60009054906101000a900460ff16151514610e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7a90613501565b60405180910390fd5b47811115610ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebd90613421565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f0c573d6000803e3d6000fd5b5050565b610f2b838383604051806020016040528060008152506116b9565b505050565b610f38611a51565b73ffffffffffffffffffffffffffffffffffffffff16610f56611485565b73ffffffffffffffffffffffffffffffffffffffff1614610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa3906134e1565b60405180910390fd5b60001515600c60009054906101000a900460ff16151514611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990613501565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b600c60009054906101000a900460ff1681565b600061103d82612099565b600001519050919050565b610d0581565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110b6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611126611a51565b73ffffffffffffffffffffffffffffffffffffffff16611144611485565b73ffffffffffffffffffffffffffffffffffffffff161461119a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611191906134e1565b60405180910390fd5b60001515600c60009054906101000a900460ff161515146111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790613501565b60405180910390fd5b80600b8190555050565b600b5481565b611208611a51565b73ffffffffffffffffffffffffffffffffffffffff16611226611485565b73ffffffffffffffffffffffffffffffffffffffff161461127c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611273906134e1565b60405180910390fd5b6112866000612328565b565b611290611a51565b73ffffffffffffffffffffffffffffffffffffffff166112ae611485565b73ffffffffffffffffffffffffffffffffffffffff1614611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb906134e1565b60405180910390fd5b60001515600c60009054906101000a900460ff1615151461135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135190613501565b60405180910390fd5b8060098190555050565b60095481565b611372611a51565b73ffffffffffffffffffffffffffffffffffffffff16611390611485565b73ffffffffffffffffffffffffffffffffffffffff16146113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd906134e1565b60405180910390fd5b60001515600c60009054906101000a900460ff1615151461143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390613501565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611482573d6000803e3d6000fd5b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546114be906137df565b80601f01602080910402602001604051908101604052809291908181526020018280546114ea906137df565b80156115375780601f1061150c57610100808354040283529160200191611537565b820191906000526020600020905b81548152906001019060200180831161151a57829003601f168201915b5050505050905090565b611549611a51565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ae576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115bb611a51565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611668611a51565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116ad91906133a4565b60405180910390a35050565b6116c4848484611b14565b6116e38373ffffffffffffffffffffffffffffffffffffffff166123ee565b80156116f857506116f684848484612401565b155b1561172f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606060001515600c60009054906101000a900460ff1615151461178d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178490613501565b60405180910390fd5b61179682611a03565b6117d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cc906134a1565b60405180910390fd5b6117dd612561565b6117e6836125f3565b6040516020016117f7929190613303565b6040516020818303038152906040529050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118a9611a51565b73ffffffffffffffffffffffffffffffffffffffff166118c7611485565b73ffffffffffffffffffffffffffffffffffffffff161461191d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611914906134e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561198d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611984906133e1565b60405180910390fd5b61199681612328565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611a0e611b0b565b11158015611a1d575060005482105b8015611a4a575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611b1f82612099565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611b46611a51565b73ffffffffffffffffffffffffffffffffffffffff161480611b795750611b788260000151611b73611a51565b61180d565b5b80611bbe5750611b87611a51565b73ffffffffffffffffffffffffffffffffffffffff16611ba68461086d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611bf7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c60576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611cc7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cd48585856001612754565b611ce46000848460000151611a59565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f9557600054811015611f945782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ffe858585600161275a565b5050505050565b60008183612013919061368d565b905092915050565b600081836120299190613606565b905092915050565b60001515600c60009054906101000a900460ff16151514612087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207e90613501565b60405180910390fd5b612095818361ffff16612760565b5050565b6120a1612be4565b6000829050806120af611b0b565b111580156120be575060005481105b156122f1576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516122ef57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121d3578092505050612323565b5b6001156122ee57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122e9578092505050612323565b6121d4565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612427611a51565b8786866040518563ffffffff1660e01b81526004016124499493929190613358565b602060405180830381600087803b15801561246357600080fd5b505af192505050801561249457506040513d601f19601f820116820180604052508101906124919190612fbf565b60015b61250e573d80600081146124c4576040519150601f19603f3d011682016040523d82523d6000602084013e6124c9565b606091505b50600081511415612506576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d8054612570906137df565b80601f016020809104026020016040519081016040528092919081815260200182805461259c906137df565b80156125e95780601f106125be576101008083540402835291602001916125e9565b820191906000526020600020905b8154815290600101906020018083116125cc57829003601f168201915b5050505050905090565b6060600082141561263b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061274f565b600082905060005b6000821461266d57808061265690613842565b915050600a82612666919061365c565b9150612643565b60008167ffffffffffffffff81111561268957612688613978565b5b6040519080825280601f01601f1916602001820160405280156126bb5781602001600182028036833780820191505090505b5090505b60008514612748576001826126d491906136e7565b9150600a856126e3919061388b565b60306126ef9190613606565b60f81b81838151811061270557612704613949565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612741919061365c565b94506126bf565b8093505050505b919050565b50505050565b50505050565b61277a82826040518060200160405280600081525061277e565b5050565b61278b8383836001612790565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156127fd576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612838576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128456000868387612754565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612a0f5750612a0e8773ffffffffffffffffffffffffffffffffffffffff166123ee565b5b15612ad5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a846000888480600101955088612401565b612aba576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612a15578260005414612ad057600080fd5b612b41565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612ad6575b816000819055505050612b57600086838761275a565b5050505050565b828054612b6a906137df565b90600052602060002090601f016020900481019282612b8c5760008555612bd3565b82601f10612ba557805160ff1916838001178555612bd3565b82800160010185558215612bd3579182015b82811115612bd2578251825591602001919060010190612bb7565b5b509050612be09190612c27565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612c40576000816000905550600101612c28565b5090565b6000612c57612c5284613561565b61353c565b905082815260208101848484011115612c7357612c726139ac565b5b612c7e84828561379d565b509392505050565b6000612c99612c9484613592565b61353c565b905082815260208101848484011115612cb557612cb46139ac565b5b612cc084828561379d565b509392505050565b600081359050612cd781613c2a565b92915050565b600081359050612cec81613c41565b92915050565b600081359050612d0181613c58565b92915050565b600081519050612d1681613c58565b92915050565b600082601f830112612d3157612d306139a7565b5b8135612d41848260208601612c44565b91505092915050565b600082601f830112612d5f57612d5e6139a7565b5b8135612d6f848260208601612c86565b91505092915050565b600081359050612d8781613c6f565b92915050565b600081359050612d9c81613c86565b92915050565b600060208284031215612db857612db76139b6565b5b6000612dc684828501612cc8565b91505092915050565b60008060408385031215612de657612de56139b6565b5b6000612df485828601612cc8565b9250506020612e0585828601612cc8565b9150509250929050565b600080600060608486031215612e2857612e276139b6565b5b6000612e3686828701612cc8565b9350506020612e4786828701612cc8565b9250506040612e5886828701612d8d565b9150509250925092565b60008060008060808587031215612e7c57612e7b6139b6565b5b6000612e8a87828801612cc8565b9450506020612e9b87828801612cc8565b9350506040612eac87828801612d8d565b925050606085013567ffffffffffffffff811115612ecd57612ecc6139b1565b5b612ed987828801612d1c565b91505092959194509250565b60008060408385031215612efc57612efb6139b6565b5b6000612f0a85828601612cc8565b9250506020612f1b85828601612cdd565b9150509250929050565b60008060408385031215612f3c57612f3b6139b6565b5b6000612f4a85828601612cc8565b9250506020612f5b85828601612d8d565b9150509250929050565b600060208284031215612f7b57612f7a6139b6565b5b6000612f8984828501612cdd565b91505092915050565b600060208284031215612fa857612fa76139b6565b5b6000612fb684828501612cf2565b91505092915050565b600060208284031215612fd557612fd46139b6565b5b6000612fe384828501612d07565b91505092915050565b600060208284031215613002576130016139b6565b5b600082013567ffffffffffffffff8111156130205761301f6139b1565b5b61302c84828501612d4a565b91505092915050565b60006020828403121561304b5761304a6139b6565b5b600061305984828501612d78565b91505092915050565b600060208284031215613078576130776139b6565b5b600061308684828501612d8d565b91505092915050565b6130988161371b565b82525050565b6130a78161372d565b82525050565b60006130b8826135c3565b6130c281856135d9565b93506130d28185602086016137ac565b6130db816139bb565b840191505092915050565b60006130f1826135ce565b6130fb81856135ea565b935061310b8185602086016137ac565b613114816139bb565b840191505092915050565b600061312a826135ce565b61313481856135fb565b93506131448185602086016137ac565b80840191505092915050565b600061315d6026836135ea565b9150613168826139cc565b604082019050919050565b6000613180600e836135fb565b915061318b82613a1b565b600e82019050919050565b60006131a3601d836135ea565b91506131ae82613a44565b602082019050919050565b60006131c66014836135ea565b91506131d182613a6d565b602082019050919050565b60006131e96012836135ea565b91506131f482613a96565b602082019050919050565b600061320c6013836135ea565b915061321782613abf565b602082019050919050565b600061322f6007836135fb565b915061323a82613ae8565b600782019050919050565b60006132526037836135ea565b915061325d82613b11565b604082019050919050565b6000613275602c836135ea565b915061328082613b60565b604082019050919050565b60006132986013836135ea565b91506132a382613baf565b602082019050919050565b60006132bb6020836135ea565b91506132c682613bd8565b602082019050919050565b60006132de6012836135ea565b91506132e982613c01565b602082019050919050565b6132fd81613793565b82525050565b600061330f828561311f565b915061331a82613222565b9150613326828461311f565b915061333182613173565b91508190509392505050565b6000602082019050613352600083018461308f565b92915050565b600060808201905061336d600083018761308f565b61337a602083018661308f565b61338760408301856132f4565b818103606083015261339981846130ad565b905095945050505050565b60006020820190506133b9600083018461309e565b92915050565b600060208201905081810360008301526133d981846130e6565b905092915050565b600060208201905081810360008301526133fa81613150565b9050919050565b6000602082019050818103600083015261341a81613196565b9050919050565b6000602082019050818103600083015261343a816131b9565b9050919050565b6000602082019050818103600083015261345a816131dc565b9050919050565b6000602082019050818103600083015261347a816131ff565b9050919050565b6000602082019050818103600083015261349a81613245565b9050919050565b600060208201905081810360008301526134ba81613268565b9050919050565b600060208201905081810360008301526134da8161328b565b9050919050565b600060208201905081810360008301526134fa816132ae565b9050919050565b6000602082019050818103600083015261351a816132d1565b9050919050565b600060208201905061353660008301846132f4565b92915050565b6000613546613557565b90506135528282613811565b919050565b6000604051905090565b600067ffffffffffffffff82111561357c5761357b613978565b5b613585826139bb565b9050602081019050919050565b600067ffffffffffffffff8211156135ad576135ac613978565b5b6135b6826139bb565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061361182613793565b915061361c83613793565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613651576136506138bc565b5b828201905092915050565b600061366782613793565b915061367283613793565b925082613682576136816138eb565b5b828204905092915050565b600061369882613793565b91506136a383613793565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136dc576136db6138bc565b5b828202905092915050565b60006136f282613793565b91506136fd83613793565b9250828210156137105761370f6138bc565b5b828203905092915050565b600061372682613773565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156137ca5780820151818401526020810190506137af565b838111156137d9576000848401525b50505050565b600060028204905060018216806137f757607f821691505b6020821081141561380b5761380a61391a565b5b50919050565b61381a826139bb565b810181811067ffffffffffffffff8211171561383957613838613978565b5b80604052505050565b600061384d82613793565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138805761387f6138bc565b5b600182019050919050565b600061389682613793565b91506138a183613793565b9250826138b1576138b06138eb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f2f6d657461646174612e6a736f6e000000000000000000000000000000000000600082015250565b7f45746865722076616c75652073656e7420697320696e636f7272656374000000600082015250565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f636f6c6c656374696f6e20736f6c64206f757400000000000000000000000000600082015250565b7f746f6b656e732f00000000000000000000000000000000000000000000000000600082015250565b7f43616e206f6e6c79206d696e74207370656369666963206e756d626572206f6660008201527f20746f6b656e7320706572207472616e73616374696f6e000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e7420737570706c7900000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e7472616374206973205061757365640000000000000000000000000000600082015250565b613c338161371b565b8114613c3e57600080fd5b50565b613c4a8161372d565b8114613c5557600080fd5b50565b613c6181613739565b8114613c6c57600080fd5b50565b613c7881613765565b8114613c8357600080fd5b50565b613c8f81613793565b8114613c9a57600080fd5b5056fea2646970667358221220a5dc4980269077775c9eab987830207e6d1a484c5fede0b065733dab1b50ac7164736f6c634300080700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003368747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6173736574732e6c6567656e64736f66617369616e732e696f2f00000000000000000000000000
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c80636737c9c1116100f7578063853828b611610095578063b88d4fde11610064578063b88d4fde1461062d578063c87b56dd14610656578063e985e9c514610693578063f2fde38b146106d0576101cd565b8063853828b6146105975780638da5cb5b146105ae57806395d89b41146105d9578063a22cb46514610604576101cd565b80637146bd08116100d15780637146bd0814610501578063715018a61461052c578063791a251914610543578063841eb6671461056c576101cd565b80636737c9c11461047057806370a082311461049b57806371189742146104d8576101cd565b806318d272eb1161016f57806342842e0e1161013e57806342842e0e146103b657806342f0d313146103df5780635c975abb146104085780636352211e14610433576101cd565b806318d272eb1461031f57806323b872dd1461034857806323cf0a22146103715780632e1a7d4d1461038d576101cd565b8063095ea7b3116101ab578063095ea7b3146102775780630fcf2e75146102a057806316c38b3c146102cb57806318160ddd146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612f92565b6106f9565b60405161020691906133a4565b60405180910390f35b34801561021b57600080fd5b506102246107db565b60405161023191906133bf565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190613062565b61086d565b60405161026e919061333d565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612f25565b6108e9565b005b3480156102ac57600080fd5b506102b56109f4565b6040516102c291906133a4565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612f65565b610a0b565b005b34801561030057600080fd5b50610309610aa4565b6040516103169190613521565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190612fec565b610abb565b005b34801561035457600080fd5b5061036f600480360381019061036a9190612e0f565b610ba7565b005b61038b60048036038101906103869190613035565b610bb7565b005b34801561039957600080fd5b506103b460048036038101906103af9190613062565b610db1565b005b3480156103c257600080fd5b506103dd60048036038101906103d89190612e0f565b610f10565b005b3480156103eb57600080fd5b5061040660048036038101906104019190612f65565b610f30565b005b34801561041457600080fd5b5061041d61101f565b60405161042a91906133a4565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190613062565b611032565b604051610467919061333d565b60405180910390f35b34801561047c57600080fd5b50610485611048565b6040516104929190613521565b60405180910390f35b3480156104a757600080fd5b506104c260048036038101906104bd9190612da2565b61104e565b6040516104cf9190613521565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa9190613062565b61111e565b005b34801561050d57600080fd5b506105166111fa565b6040516105239190613521565b60405180910390f35b34801561053857600080fd5b50610541611200565b005b34801561054f57600080fd5b5061056a60048036038101906105659190613062565b611288565b005b34801561057857600080fd5b50610581611364565b60405161058e9190613521565b60405180910390f35b3480156105a357600080fd5b506105ac61136a565b005b3480156105ba57600080fd5b506105c3611485565b6040516105d0919061333d565b60405180910390f35b3480156105e557600080fd5b506105ee6114af565b6040516105fb91906133bf565b60405180910390f35b34801561061057600080fd5b5061062b60048036038101906106269190612ee5565b611541565b005b34801561063957600080fd5b50610654600480360381019061064f9190612e62565b6116b9565b005b34801561066257600080fd5b5061067d60048036038101906106789190613062565b611735565b60405161068a91906133bf565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b59190612dcf565b61180d565b6040516106c791906133a4565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f29190612da2565b6118a1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107c457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107d457506107d382611999565b5b9050919050565b6060600280546107ea906137df565b80601f0160208091040260200160405190810160405280929190818152602001828054610816906137df565b80156108635780601f1061083857610100808354040283529160200191610863565b820191906000526020600020905b81548152906001019060200180831161084657829003601f168201915b5050505050905090565b600061087882611a03565b6108ae576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f482611032565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561095c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661097b611a51565b73ffffffffffffffffffffffffffffffffffffffff16141580156109ad57506109ab816109a6611a51565b61180d565b155b156109e4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109ef838383611a59565b505050565b6000600a60009054906101000a900460ff16905090565b610a13611a51565b73ffffffffffffffffffffffffffffffffffffffff16610a31611485565b73ffffffffffffffffffffffffffffffffffffffff1614610a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7e906134e1565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000610aae611b0b565b6001546000540303905090565b610ac3611a51565b73ffffffffffffffffffffffffffffffffffffffff16610ae1611485565b73ffffffffffffffffffffffffffffffffffffffff1614610b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2e906134e1565b60405180910390fd5b60001515600c60009054906101000a900460ff16151514610b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8490613501565b60405180910390fd5b80600d9080519060200190610ba3929190612b5e565b5050565b610bb2838383611b14565b505050565b60001515600c60009054906101000a900460ff16151514610c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0490613501565b60405180910390fd5b610c156109f4565b610c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4b90613441565b60405180910390fd5b34610c6e8261ffff1660095461200590919063ffffffff16565b1115610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca690613401565b60405180910390fd5b600b548161ffff161115610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cef90613481565b60405180910390fd5b610d05610d03610aa4565b10610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a90613461565b60405180910390fd5b610d05610d648261ffff16610d56610aa4565b61201b90919063ffffffff16565b10610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b906134c1565b60405180910390fd5b610dae8133612031565b50565b610db9611a51565b73ffffffffffffffffffffffffffffffffffffffff16610dd7611485565b73ffffffffffffffffffffffffffffffffffffffff1614610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e24906134e1565b60405180910390fd5b60001515600c60009054906101000a900460ff16151514610e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7a90613501565b60405180910390fd5b47811115610ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebd90613421565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f0c573d6000803e3d6000fd5b5050565b610f2b838383604051806020016040528060008152506116b9565b505050565b610f38611a51565b73ffffffffffffffffffffffffffffffffffffffff16610f56611485565b73ffffffffffffffffffffffffffffffffffffffff1614610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa3906134e1565b60405180910390fd5b60001515600c60009054906101000a900460ff16151514611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990613501565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b600c60009054906101000a900460ff1681565b600061103d82612099565b600001519050919050565b610d0581565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110b6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611126611a51565b73ffffffffffffffffffffffffffffffffffffffff16611144611485565b73ffffffffffffffffffffffffffffffffffffffff161461119a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611191906134e1565b60405180910390fd5b60001515600c60009054906101000a900460ff161515146111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790613501565b60405180910390fd5b80600b8190555050565b600b5481565b611208611a51565b73ffffffffffffffffffffffffffffffffffffffff16611226611485565b73ffffffffffffffffffffffffffffffffffffffff161461127c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611273906134e1565b60405180910390fd5b6112866000612328565b565b611290611a51565b73ffffffffffffffffffffffffffffffffffffffff166112ae611485565b73ffffffffffffffffffffffffffffffffffffffff1614611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb906134e1565b60405180910390fd5b60001515600c60009054906101000a900460ff1615151461135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135190613501565b60405180910390fd5b8060098190555050565b60095481565b611372611a51565b73ffffffffffffffffffffffffffffffffffffffff16611390611485565b73ffffffffffffffffffffffffffffffffffffffff16146113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd906134e1565b60405180910390fd5b60001515600c60009054906101000a900460ff1615151461143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390613501565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611482573d6000803e3d6000fd5b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546114be906137df565b80601f01602080910402602001604051908101604052809291908181526020018280546114ea906137df565b80156115375780601f1061150c57610100808354040283529160200191611537565b820191906000526020600020905b81548152906001019060200180831161151a57829003601f168201915b5050505050905090565b611549611a51565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ae576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115bb611a51565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611668611a51565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116ad91906133a4565b60405180910390a35050565b6116c4848484611b14565b6116e38373ffffffffffffffffffffffffffffffffffffffff166123ee565b80156116f857506116f684848484612401565b155b1561172f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606060001515600c60009054906101000a900460ff1615151461178d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178490613501565b60405180910390fd5b61179682611a03565b6117d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cc906134a1565b60405180910390fd5b6117dd612561565b6117e6836125f3565b6040516020016117f7929190613303565b6040516020818303038152906040529050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118a9611a51565b73ffffffffffffffffffffffffffffffffffffffff166118c7611485565b73ffffffffffffffffffffffffffffffffffffffff161461191d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611914906134e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561198d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611984906133e1565b60405180910390fd5b61199681612328565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611a0e611b0b565b11158015611a1d575060005482105b8015611a4a575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611b1f82612099565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611b46611a51565b73ffffffffffffffffffffffffffffffffffffffff161480611b795750611b788260000151611b73611a51565b61180d565b5b80611bbe5750611b87611a51565b73ffffffffffffffffffffffffffffffffffffffff16611ba68461086d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611bf7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c60576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611cc7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cd48585856001612754565b611ce46000848460000151611a59565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f9557600054811015611f945782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ffe858585600161275a565b5050505050565b60008183612013919061368d565b905092915050565b600081836120299190613606565b905092915050565b60001515600c60009054906101000a900460ff16151514612087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207e90613501565b60405180910390fd5b612095818361ffff16612760565b5050565b6120a1612be4565b6000829050806120af611b0b565b111580156120be575060005481105b156122f1576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516122ef57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121d3578092505050612323565b5b6001156122ee57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122e9578092505050612323565b6121d4565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612427611a51565b8786866040518563ffffffff1660e01b81526004016124499493929190613358565b602060405180830381600087803b15801561246357600080fd5b505af192505050801561249457506040513d601f19601f820116820180604052508101906124919190612fbf565b60015b61250e573d80600081146124c4576040519150601f19603f3d011682016040523d82523d6000602084013e6124c9565b606091505b50600081511415612506576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d8054612570906137df565b80601f016020809104026020016040519081016040528092919081815260200182805461259c906137df565b80156125e95780601f106125be576101008083540402835291602001916125e9565b820191906000526020600020905b8154815290600101906020018083116125cc57829003601f168201915b5050505050905090565b6060600082141561263b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061274f565b600082905060005b6000821461266d57808061265690613842565b915050600a82612666919061365c565b9150612643565b60008167ffffffffffffffff81111561268957612688613978565b5b6040519080825280601f01601f1916602001820160405280156126bb5781602001600182028036833780820191505090505b5090505b60008514612748576001826126d491906136e7565b9150600a856126e3919061388b565b60306126ef9190613606565b60f81b81838151811061270557612704613949565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612741919061365c565b94506126bf565b8093505050505b919050565b50505050565b50505050565b61277a82826040518060200160405280600081525061277e565b5050565b61278b8383836001612790565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156127fd576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612838576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128456000868387612754565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612a0f5750612a0e8773ffffffffffffffffffffffffffffffffffffffff166123ee565b5b15612ad5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a846000888480600101955088612401565b612aba576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612a15578260005414612ad057600080fd5b612b41565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612ad6575b816000819055505050612b57600086838761275a565b5050505050565b828054612b6a906137df565b90600052602060002090601f016020900481019282612b8c5760008555612bd3565b82601f10612ba557805160ff1916838001178555612bd3565b82800160010185558215612bd3579182015b82811115612bd2578251825591602001919060010190612bb7565b5b509050612be09190612c27565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612c40576000816000905550600101612c28565b5090565b6000612c57612c5284613561565b61353c565b905082815260208101848484011115612c7357612c726139ac565b5b612c7e84828561379d565b509392505050565b6000612c99612c9484613592565b61353c565b905082815260208101848484011115612cb557612cb46139ac565b5b612cc084828561379d565b509392505050565b600081359050612cd781613c2a565b92915050565b600081359050612cec81613c41565b92915050565b600081359050612d0181613c58565b92915050565b600081519050612d1681613c58565b92915050565b600082601f830112612d3157612d306139a7565b5b8135612d41848260208601612c44565b91505092915050565b600082601f830112612d5f57612d5e6139a7565b5b8135612d6f848260208601612c86565b91505092915050565b600081359050612d8781613c6f565b92915050565b600081359050612d9c81613c86565b92915050565b600060208284031215612db857612db76139b6565b5b6000612dc684828501612cc8565b91505092915050565b60008060408385031215612de657612de56139b6565b5b6000612df485828601612cc8565b9250506020612e0585828601612cc8565b9150509250929050565b600080600060608486031215612e2857612e276139b6565b5b6000612e3686828701612cc8565b9350506020612e4786828701612cc8565b9250506040612e5886828701612d8d565b9150509250925092565b60008060008060808587031215612e7c57612e7b6139b6565b5b6000612e8a87828801612cc8565b9450506020612e9b87828801612cc8565b9350506040612eac87828801612d8d565b925050606085013567ffffffffffffffff811115612ecd57612ecc6139b1565b5b612ed987828801612d1c565b91505092959194509250565b60008060408385031215612efc57612efb6139b6565b5b6000612f0a85828601612cc8565b9250506020612f1b85828601612cdd565b9150509250929050565b60008060408385031215612f3c57612f3b6139b6565b5b6000612f4a85828601612cc8565b9250506020612f5b85828601612d8d565b9150509250929050565b600060208284031215612f7b57612f7a6139b6565b5b6000612f8984828501612cdd565b91505092915050565b600060208284031215612fa857612fa76139b6565b5b6000612fb684828501612cf2565b91505092915050565b600060208284031215612fd557612fd46139b6565b5b6000612fe384828501612d07565b91505092915050565b600060208284031215613002576130016139b6565b5b600082013567ffffffffffffffff8111156130205761301f6139b1565b5b61302c84828501612d4a565b91505092915050565b60006020828403121561304b5761304a6139b6565b5b600061305984828501612d78565b91505092915050565b600060208284031215613078576130776139b6565b5b600061308684828501612d8d565b91505092915050565b6130988161371b565b82525050565b6130a78161372d565b82525050565b60006130b8826135c3565b6130c281856135d9565b93506130d28185602086016137ac565b6130db816139bb565b840191505092915050565b60006130f1826135ce565b6130fb81856135ea565b935061310b8185602086016137ac565b613114816139bb565b840191505092915050565b600061312a826135ce565b61313481856135fb565b93506131448185602086016137ac565b80840191505092915050565b600061315d6026836135ea565b9150613168826139cc565b604082019050919050565b6000613180600e836135fb565b915061318b82613a1b565b600e82019050919050565b60006131a3601d836135ea565b91506131ae82613a44565b602082019050919050565b60006131c66014836135ea565b91506131d182613a6d565b602082019050919050565b60006131e96012836135ea565b91506131f482613a96565b602082019050919050565b600061320c6013836135ea565b915061321782613abf565b602082019050919050565b600061322f6007836135fb565b915061323a82613ae8565b600782019050919050565b60006132526037836135ea565b915061325d82613b11565b604082019050919050565b6000613275602c836135ea565b915061328082613b60565b604082019050919050565b60006132986013836135ea565b91506132a382613baf565b602082019050919050565b60006132bb6020836135ea565b91506132c682613bd8565b602082019050919050565b60006132de6012836135ea565b91506132e982613c01565b602082019050919050565b6132fd81613793565b82525050565b600061330f828561311f565b915061331a82613222565b9150613326828461311f565b915061333182613173565b91508190509392505050565b6000602082019050613352600083018461308f565b92915050565b600060808201905061336d600083018761308f565b61337a602083018661308f565b61338760408301856132f4565b818103606083015261339981846130ad565b905095945050505050565b60006020820190506133b9600083018461309e565b92915050565b600060208201905081810360008301526133d981846130e6565b905092915050565b600060208201905081810360008301526133fa81613150565b9050919050565b6000602082019050818103600083015261341a81613196565b9050919050565b6000602082019050818103600083015261343a816131b9565b9050919050565b6000602082019050818103600083015261345a816131dc565b9050919050565b6000602082019050818103600083015261347a816131ff565b9050919050565b6000602082019050818103600083015261349a81613245565b9050919050565b600060208201905081810360008301526134ba81613268565b9050919050565b600060208201905081810360008301526134da8161328b565b9050919050565b600060208201905081810360008301526134fa816132ae565b9050919050565b6000602082019050818103600083015261351a816132d1565b9050919050565b600060208201905061353660008301846132f4565b92915050565b6000613546613557565b90506135528282613811565b919050565b6000604051905090565b600067ffffffffffffffff82111561357c5761357b613978565b5b613585826139bb565b9050602081019050919050565b600067ffffffffffffffff8211156135ad576135ac613978565b5b6135b6826139bb565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061361182613793565b915061361c83613793565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613651576136506138bc565b5b828201905092915050565b600061366782613793565b915061367283613793565b925082613682576136816138eb565b5b828204905092915050565b600061369882613793565b91506136a383613793565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136dc576136db6138bc565b5b828202905092915050565b60006136f282613793565b91506136fd83613793565b9250828210156137105761370f6138bc565b5b828203905092915050565b600061372682613773565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156137ca5780820151818401526020810190506137af565b838111156137d9576000848401525b50505050565b600060028204905060018216806137f757607f821691505b6020821081141561380b5761380a61391a565b5b50919050565b61381a826139bb565b810181811067ffffffffffffffff8211171561383957613838613978565b5b80604052505050565b600061384d82613793565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138805761387f6138bc565b5b600182019050919050565b600061389682613793565b91506138a183613793565b9250826138b1576138b06138eb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f2f6d657461646174612e6a736f6e000000000000000000000000000000000000600082015250565b7f45746865722076616c75652073656e7420697320696e636f7272656374000000600082015250565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f636f6c6c656374696f6e20736f6c64206f757400000000000000000000000000600082015250565b7f746f6b656e732f00000000000000000000000000000000000000000000000000600082015250565b7f43616e206f6e6c79206d696e74207370656369666963206e756d626572206f6660008201527f20746f6b656e7320706572207472616e73616374696f6e000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e7420737570706c7900000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e7472616374206973205061757365640000000000000000000000000000600082015250565b613c338161371b565b8114613c3e57600080fd5b50565b613c4a8161372d565b8114613c5557600080fd5b50565b613c6181613739565b8114613c6c57600080fd5b50565b613c7881613765565b8114613c8357600080fd5b50565b613c8f81613793565b8114613c9a57600080fd5b5056fea2646970667358221220a5dc4980269077775c9eab987830207e6d1a484c5fede0b065733dab1b50ac7164736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003368747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6173736574732e6c6567656e64736f66617369616e732e696f2f00000000000000000000000000
-----Decoded View---------------
Arg [0] : MetaUri (string): https://s3.amazonaws.com/assets.legendsofasians.io/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000033
Arg [2] : 68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6173736574732e
Arg [3] : 6c6567656e64736f66617369616e732e696f2f00000000000000000000000000
Deployed Bytecode Sourcemap
70899:3663:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53435:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56820:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58323:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57886:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71805:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74470:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52684:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72140:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59180:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72969:609;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72313:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59421:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71594:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71236:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56629:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71019:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53804:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72782:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71195:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41457:94;;;;;;;;;;;;;:::i;:::-;;71965:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71069:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72561:169;;;;;;;;;;;;;:::i;:::-;;40807:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56989:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58599:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59677:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73977:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58949:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41706:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53435:305;53537:4;53589:25;53574:40;;;:11;:40;;;;:105;;;;53646:33;53631:48;;;:11;:48;;;;53574:105;:158;;;;53696:36;53720:11;53696:23;:36::i;:::-;53574:158;53554:178;;53435:305;;;:::o;56820:100::-;56874:13;56907:5;56900:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56820:100;:::o;58323:204::-;58391:7;58416:16;58424:7;58416;:16::i;:::-;58411:64;;58441:34;;;;;;;;;;;;;;58411:64;58495:15;:24;58511:7;58495:24;;;;;;;;;;;;;;;;;;;;;58488:31;;58323:204;;;:::o;57886:371::-;57959:13;57975:24;57991:7;57975:15;:24::i;:::-;57959:40;;58020:5;58014:11;;:2;:11;;;58010:48;;;58034:24;;;;;;;;;;;;;;58010:48;58091:5;58075:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;58101:37;58118:5;58125:12;:10;:12::i;:::-;58101:16;:37::i;:::-;58100:38;58075:63;58071:138;;;58162:35;;;;;;;;;;;;;;58071:138;58221:28;58230:2;58234:7;58243:5;58221:8;:28::i;:::-;57948:309;57886:371;;:::o;71805:101::-;71855:4;71879:19;;;;;;;;;;;71872:26;;71805:101;:::o;74470:84::-;41037:12;:10;:12::i;:::-;41026:23;;:7;:5;:7::i;:::-;:23;;;41018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74539:7:::1;74530:6;;:16;;;;;;;;;;;;;;;;;;74470:84:::0;:::o;52684:303::-;52728:7;52953:15;:13;:15::i;:::-;52938:12;;52922:13;;:28;:46;52915:53;;52684:303;:::o;72140:165::-;41037:12;:10;:12::i;:::-;41026:23;;:7;:5;:7::i;:::-;:23;;;41018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72236:5:::1;72226:15;;:6;;;;;;;;;;;:15;;;72218:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;72290:7;72275:12;:22;;;;;;;;;;;;:::i;:::-;;72140:165:::0;:::o;59180:170::-;59314:28;59324:4;59330:2;59334:7;59314:9;:28::i;:::-;59180:170;;;:::o;72969:609::-;73050:5;73040:15;;:6;;;;;;;;;;;:15;;;73032:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;73097:20;:18;:20::i;:::-;73089:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;73207:9;73159:44;73188:14;73159:44;;:24;;:28;;:44;;;;:::i;:::-;:57;;73151:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;73287:12;;73269:14;:30;;;;73261:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;71056:4;73378:13;:11;:13::i;:::-;:26;73370:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;71056:4;73447:33;73465:14;73447:33;;:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:46;73439:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;73530:38;73542:14;73557:10;73530:11;:38::i;:::-;72969:609;:::o;72313:240::-;41037:12;:10;:12::i;:::-;41026:23;;:7;:5;:7::i;:::-;:23;;;41018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72395:5:::1;72385:15;;:6;;;;;;;;;;;:15;;;72377:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;72452:21;72442:6;:31;;72434:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;72517:10;72509:28;;:36;72538:6;72509:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;72313:240:::0;:::o;59421:185::-;59559:39;59576:4;59582:2;59586:7;59559:39;;;;;;;;;;;;:16;:39::i;:::-;59421:185;;;:::o;71594:154::-;41037:12;:10;:12::i;:::-;41026:23;;:7;:5;:7::i;:::-;:23;;;41018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71676:5:::1;71666:15;;:6;;;;;;;;;;;:15;;;71658:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;71735:5;71715:19;;:25;;;;;;;;;;;;;;;;;;71594:154:::0;:::o;71236:25::-;;;;;;;;;;;;;:::o;56629:124::-;56693:7;56720:20;56732:7;56720:11;:20::i;:::-;:25;;;56713:32;;56629:124;;;:::o;71019:41::-;71056:4;71019:41;:::o;53804:206::-;53868:7;53909:1;53892:19;;:5;:19;;;53888:60;;;53920:28;;;;;;;;;;;;;;53888:60;53974:12;:19;53987:5;53974:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;53966:36;;53959:43;;53804:206;;;:::o;72782:153::-;41037:12;:10;:12::i;:::-;41026:23;;:7;:5;:7::i;:::-;:23;;;41018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72868:5:::1;72858:15;;:6;;;;;;;;;;;:15;;;72850:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;72921:6;72908:12;:19;;;;72782:153:::0;:::o;71195:32::-;;;;:::o;41457:94::-;41037:12;:10;:12::i;:::-;41026:23;;:7;:5;:7::i;:::-;:23;;;41018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41522:21:::1;41540:1;41522:9;:21::i;:::-;41457:94::o:0;71965:167::-;41037:12;:10;:12::i;:::-;41026:23;;:7;:5;:7::i;:::-;:23;;;41018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72054:5:::1;72044:15;;:6;;;;;;;;;;;:15;;;72036:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;72119:5;72094:24;:30;;;;71965:167:::0;:::o;71069:64::-;;;;:::o;72561:169::-;41037:12;:10;:12::i;:::-;41026:23;;:7;:5;:7::i;:::-;:23;;;41018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72632:5:::1;72622:15;;:6;;;;;;;;;;;:15;;;72614:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;72679:10;72671:28;;:51;72700:21;72671:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;72561:169::o:0;40807:86::-;40852:7;40879:6;;;;;;;;;;;40872:13;;40807:86;:::o;56989:104::-;57045:13;57078:7;57071:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56989:104;:::o;58599:279::-;58702:12;:10;:12::i;:::-;58690:24;;:8;:24;;;58686:54;;;58723:17;;;;;;;;;;;;;;58686:54;58798:8;58753:18;:32;58772:12;:10;:12::i;:::-;58753:32;;;;;;;;;;;;;;;:42;58786:8;58753:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;58851:8;58822:48;;58837:12;:10;:12::i;:::-;58822:48;;;58861:8;58822:48;;;;;;:::i;:::-;;;;;;;;58599:279;;:::o;59677:369::-;59844:28;59854:4;59860:2;59864:7;59844:9;:28::i;:::-;59887:15;:2;:13;;;:15::i;:::-;:76;;;;;59907:56;59938:4;59944:2;59948:7;59957:5;59907:30;:56::i;:::-;59906:57;59887:76;59883:156;;;59987:40;;;;;;;;;;;;;;59883:156;59677:369;;;;:::o;73977:342::-;74041:13;74085:5;74075:15;;:6;;;;;;;;;;;:15;;;74067:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;74132:16;74140:7;74132;:16::i;:::-;74124:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;74239:10;:8;:10::i;:::-;74262:27;74270:7;74262:25;:27::i;:::-;74222:86;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74208:101;;73977:342;;;:::o;58949:164::-;59046:4;59070:18;:25;59089:5;59070:25;;;;;;;;;;;;;;;:35;59096:8;59070:35;;;;;;;;;;;;;;;;;;;;;;;;;59063:42;;58949:164;;;;:::o;41706:192::-;41037:12;:10;:12::i;:::-;41026:23;;:7;:5;:7::i;:::-;:23;;;41018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41815:1:::1;41795:22;;:8;:22;;;;41787:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41871:19;41881:8;41871:9;:19::i;:::-;41706:192:::0;:::o;7687:156::-;7771:4;7810:25;7795:40;;;:11;:40;;;;7788:47;;7687:156;;;:::o;60301:187::-;60358:4;60401:7;60382:15;:13;:15::i;:::-;:26;;:53;;;;;60422:13;;60412:7;:23;60382:53;:98;;;;;60453:11;:20;60465:7;60453:20;;;;;;;;;;;:27;;;;;;;;;;;;60452:28;60382:98;60375:105;;60301:187;;;:::o;1283:97::-;1335:7;1362:10;1355:17;;1283:97;:::o;67912:196::-;68054:2;68027:15;:24;68043:7;68027:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;68092:7;68088:2;68072:28;;68081:5;68072:28;;;;;;;;;;;;67912:196;;;:::o;52408:92::-;52464:7;52491:1;52484:8;;52408:92;:::o;63414:2112::-;63529:35;63567:20;63579:7;63567:11;:20::i;:::-;63529:58;;63600:22;63642:13;:18;;;63626:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;63677:50;63694:13;:18;;;63714:12;:10;:12::i;:::-;63677:16;:50::i;:::-;63626:101;:154;;;;63768:12;:10;:12::i;:::-;63744:36;;:20;63756:7;63744:11;:20::i;:::-;:36;;;63626:154;63600:181;;63799:17;63794:66;;63825:35;;;;;;;;;;;;;;63794:66;63897:4;63875:26;;:13;:18;;;:26;;;63871:67;;63910:28;;;;;;;;;;;;;;63871:67;63967:1;63953:16;;:2;:16;;;63949:52;;;63978:23;;;;;;;;;;;;;;63949:52;64014:43;64036:4;64042:2;64046:7;64055:1;64014:21;:43::i;:::-;64122:49;64139:1;64143:7;64152:13;:18;;;64122:8;:49::i;:::-;64497:1;64467:12;:18;64480:4;64467:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64541:1;64513:12;:16;64526:2;64513:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64587:2;64559:11;:20;64571:7;64559:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;64649:15;64604:11;:20;64616:7;64604:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;64917:19;64949:1;64939:7;:11;64917:33;;65010:1;64969:43;;:11;:24;64981:11;64969:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;64965:445;;;65194:13;;65180:11;:27;65176:219;;;65264:13;:18;;;65232:11;:24;65244:11;65232:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;65347:13;:28;;;65305:11;:24;65317:11;65305:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;65176:219;64965:445;64442:979;65457:7;65453:2;65438:27;;65447:4;65438:27;;;;;;;;;;;;65476:42;65497:4;65503:2;65507:7;65516:1;65476:20;:42::i;:::-;63518:2008;;63414:2112;;;:::o;36468:97::-;36525:7;36556:1;36552;:5;;;;:::i;:::-;36545:12;;36468:97;;;;:::o;35732:::-;35789:7;35820:1;35816;:5;;;;:::i;:::-;35809:12;;35732:97;;;;:::o;73588:181::-;73688:5;73678:15;;:6;;;;;;;;;;;:15;;;73670:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;73731:30;73741:3;73746:14;73731:30;;:9;:30::i;:::-;73588:181;;:::o;55459:1108::-;55520:21;;:::i;:::-;55554:12;55569:7;55554:22;;55637:4;55618:15;:13;:15::i;:::-;:23;;:47;;;;;55652:13;;55645:4;:20;55618:47;55614:886;;;55686:31;55720:11;:17;55732:4;55720:17;;;;;;;;;;;55686:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55761:9;:16;;;55756:729;;55832:1;55806:28;;:9;:14;;;:28;;;55802:101;;55870:9;55863:16;;;;;;55802:101;56205:261;56212:4;56205:261;;;56245:6;;;;;;;;56290:11;:17;56302:4;56290:17;;;;;;;;;;;56278:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56364:1;56338:28;;:9;:14;;;:28;;;56334:109;;56406:9;56399:16;;;;;;56334:109;56205:261;;;55756:729;55667:833;55614:886;56528:31;;;;;;;;;;;;;;55459:1108;;;;:::o;41906:173::-;41962:16;41981:6;;;;;;;;;;;41962:25;;42007:8;41998:6;;:17;;;;;;;;;;;;;;;;;;42062:8;42031:40;;42052:8;42031:40;;;;;;;;;;;;41951:128;41906:173;:::o;21943:385::-;22002:4;22210:12;22276:7;22264:20;22257:27;;22319:1;22312:4;:8;22305:15;;;21943:385;;;:::o;68600:667::-;68763:4;68800:2;68784:36;;;68821:12;:10;:12::i;:::-;68835:4;68841:7;68850:5;68784:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;68780:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69035:1;69018:6;:13;:18;69014:235;;;69064:40;;;;;;;;;;;;;;69014:235;69207:6;69201:13;69192:6;69188:2;69184:15;69177:38;68780:480;68913:45;;;68903:55;;;:6;:55;;;;68896:62;;;68600:667;;;;;;:::o;74328:104::-;74379:13;74412:12;74405:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74328:104;:::o;31268:722::-;31323:13;31553:1;31544:5;:10;31540:53;;;31571:10;;;;;;;;;;;;;;;;;;;;;31540:53;31603:12;31618:5;31603:20;;31634:14;31659:78;31674:1;31666:4;:9;31659:78;;31692:8;;;;;:::i;:::-;;;;31723:2;31715:10;;;;;:::i;:::-;;;31659:78;;;31747:19;31779:6;31769:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31747:39;;31797:154;31813:1;31804:5;:10;31797:154;;31841:1;31831:11;;;;;:::i;:::-;;;31908:2;31900:5;:10;;;;:::i;:::-;31887:2;:24;;;;:::i;:::-;31874:39;;31857:6;31864;31857:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;31937:2;31928:11;;;;;:::i;:::-;;;31797:154;;;31975:6;31961:21;;;;;31268:722;;;;:::o;69915:159::-;;;;;:::o;70733:158::-;;;;;:::o;60496:104::-;60565:27;60575:2;60579:8;60565:27;;;;;;;;;;;;:9;:27::i;:::-;60496:104;;:::o;60963:163::-;61086:32;61092:2;61096:8;61106:5;61113:4;61086:5;:32::i;:::-;60963:163;;;:::o;61385:1775::-;61524:20;61547:13;;61524:36;;61589:1;61575:16;;:2;:16;;;61571:48;;;61600:19;;;;;;;;;;;;;;61571:48;61646:1;61634:8;:13;61630:44;;;61656:18;;;;;;;;;;;;;;61630:44;61687:61;61717:1;61721:2;61725:12;61739:8;61687:21;:61::i;:::-;62060:8;62025:12;:16;62038:2;62025:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62124:8;62084:12;:16;62097:2;62084:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62183:2;62150:11;:25;62162:12;62150:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;62250:15;62200:11;:25;62212:12;62200:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;62283:20;62306:12;62283:35;;62333:11;62362:8;62347:12;:23;62333:37;;62391:4;:23;;;;;62399:15;:2;:13;;;:15::i;:::-;62391:23;62387:641;;;62435:314;62491:12;62487:2;62466:38;;62483:1;62466:38;;;;;;;;;;;;62532:69;62571:1;62575:2;62579:14;;;;;;62595:5;62532:30;:69::i;:::-;62527:174;;62637:40;;;;;;;;;;;;;;62527:174;62744:3;62728:12;:19;;62435:314;;62830:12;62813:13;;:29;62809:43;;62844:8;;;62809:43;62387:641;;;62893:120;62949:14;;;;;;62945:2;62924:40;;62941:1;62924:40;;;;;;;;;;;;63008:3;62992:12;:19;;62893:120;;62387:641;63058:12;63042:13;:28;;;;62000:1082;;63092:60;63121:1;63125:2;63129:12;63143:8;63092:20;:60::i;:::-;61513:1647;61385:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:137::-;2177:5;2215:6;2202:20;2193:29;;2231:32;2257:5;2231:32;:::i;:::-;2132:137;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:323::-;5819:6;5868:2;5856:9;5847:7;5843:23;5839:32;5836:119;;;5874:79;;:::i;:::-;5836:119;5994:1;6019:50;6061:7;6052:6;6041:9;6037:22;6019:50;:::i;:::-;6009:60;;5965:114;5763:323;;;;:::o;6092:327::-;6150:6;6199:2;6187:9;6178:7;6174:23;6170:32;6167:119;;;6205:79;;:::i;:::-;6167:119;6325:1;6350:52;6394:7;6385:6;6374:9;6370:22;6350:52;:::i;:::-;6340:62;;6296:116;6092:327;;;;:::o;6425:349::-;6494:6;6543:2;6531:9;6522:7;6518:23;6514:32;6511:119;;;6549:79;;:::i;:::-;6511:119;6669:1;6694:63;6749:7;6740:6;6729:9;6725:22;6694:63;:::i;:::-;6684:73;;6640:127;6425:349;;;;:::o;6780:509::-;6849:6;6898:2;6886:9;6877:7;6873:23;6869:32;6866:119;;;6904:79;;:::i;:::-;6866:119;7052:1;7041:9;7037:17;7024:31;7082:18;7074:6;7071:30;7068:117;;;7104:79;;:::i;:::-;7068:117;7209:63;7264:7;7255:6;7244:9;7240:22;7209:63;:::i;:::-;7199:73;;6995:287;6780:509;;;;:::o;7295:327::-;7353:6;7402:2;7390:9;7381:7;7377:23;7373:32;7370:119;;;7408:79;;:::i;:::-;7370:119;7528:1;7553:52;7597:7;7588:6;7577:9;7573:22;7553:52;:::i;:::-;7543:62;;7499:116;7295:327;;;;:::o;7628:329::-;7687:6;7736:2;7724:9;7715:7;7711:23;7707:32;7704:119;;;7742:79;;:::i;:::-;7704:119;7862:1;7887:53;7932:7;7923:6;7912:9;7908:22;7887:53;:::i;:::-;7877:63;;7833:117;7628:329;;;;:::o;7963:118::-;8050:24;8068:5;8050:24;:::i;:::-;8045:3;8038:37;7963:118;;:::o;8087:109::-;8168:21;8183:5;8168:21;:::i;:::-;8163:3;8156:34;8087:109;;:::o;8202:360::-;8288:3;8316:38;8348:5;8316:38;:::i;:::-;8370:70;8433:6;8428:3;8370:70;:::i;:::-;8363:77;;8449:52;8494:6;8489:3;8482:4;8475:5;8471:16;8449:52;:::i;:::-;8526:29;8548:6;8526:29;:::i;:::-;8521:3;8517:39;8510:46;;8292:270;8202:360;;;;:::o;8568:364::-;8656:3;8684:39;8717:5;8684:39;:::i;:::-;8739:71;8803:6;8798:3;8739:71;:::i;:::-;8732:78;;8819:52;8864:6;8859:3;8852:4;8845:5;8841:16;8819:52;:::i;:::-;8896:29;8918:6;8896:29;:::i;:::-;8891:3;8887:39;8880:46;;8660:272;8568:364;;;;:::o;8938:377::-;9044:3;9072:39;9105:5;9072:39;:::i;:::-;9127:89;9209:6;9204:3;9127:89;:::i;:::-;9120:96;;9225:52;9270:6;9265:3;9258:4;9251:5;9247:16;9225:52;:::i;:::-;9302:6;9297:3;9293:16;9286:23;;9048:267;8938:377;;;;:::o;9321:366::-;9463:3;9484:67;9548:2;9543:3;9484:67;:::i;:::-;9477:74;;9560:93;9649:3;9560:93;:::i;:::-;9678:2;9673:3;9669:12;9662:19;;9321:366;;;:::o;9693:402::-;9853:3;9874:85;9956:2;9951:3;9874:85;:::i;:::-;9867:92;;9968:93;10057:3;9968:93;:::i;:::-;10086:2;10081:3;10077:12;10070:19;;9693:402;;;:::o;10101:366::-;10243:3;10264:67;10328:2;10323:3;10264:67;:::i;:::-;10257:74;;10340:93;10429:3;10340:93;:::i;:::-;10458:2;10453:3;10449:12;10442:19;;10101:366;;;:::o;10473:::-;10615:3;10636:67;10700:2;10695:3;10636:67;:::i;:::-;10629:74;;10712:93;10801:3;10712:93;:::i;:::-;10830:2;10825:3;10821:12;10814:19;;10473:366;;;:::o;10845:::-;10987:3;11008:67;11072:2;11067:3;11008:67;:::i;:::-;11001:74;;11084:93;11173:3;11084:93;:::i;:::-;11202:2;11197:3;11193:12;11186:19;;10845:366;;;:::o;11217:::-;11359:3;11380:67;11444:2;11439:3;11380:67;:::i;:::-;11373:74;;11456:93;11545:3;11456:93;:::i;:::-;11574:2;11569:3;11565:12;11558:19;;11217:366;;;:::o;11589:400::-;11749:3;11770:84;11852:1;11847:3;11770:84;:::i;:::-;11763:91;;11863:93;11952:3;11863:93;:::i;:::-;11981:1;11976:3;11972:11;11965:18;;11589:400;;;:::o;11995:366::-;12137:3;12158:67;12222:2;12217:3;12158:67;:::i;:::-;12151:74;;12234:93;12323:3;12234:93;:::i;:::-;12352:2;12347:3;12343:12;12336:19;;11995:366;;;:::o;12367:::-;12509:3;12530:67;12594:2;12589:3;12530:67;:::i;:::-;12523:74;;12606:93;12695:3;12606:93;:::i;:::-;12724:2;12719:3;12715:12;12708:19;;12367:366;;;:::o;12739:::-;12881:3;12902:67;12966:2;12961:3;12902:67;:::i;:::-;12895:74;;12978:93;13067:3;12978:93;:::i;:::-;13096:2;13091:3;13087:12;13080:19;;12739:366;;;:::o;13111:::-;13253:3;13274:67;13338:2;13333:3;13274:67;:::i;:::-;13267:74;;13350:93;13439:3;13350:93;:::i;:::-;13468:2;13463:3;13459:12;13452:19;;13111:366;;;:::o;13483:::-;13625:3;13646:67;13710:2;13705:3;13646:67;:::i;:::-;13639:74;;13722:93;13811:3;13722:93;:::i;:::-;13840:2;13835:3;13831:12;13824:19;;13483:366;;;:::o;13855:118::-;13942:24;13960:5;13942:24;:::i;:::-;13937:3;13930:37;13855:118;;:::o;13979:967::-;14361:3;14383:95;14474:3;14465:6;14383:95;:::i;:::-;14376:102;;14495:148;14639:3;14495:148;:::i;:::-;14488:155;;14660:95;14751:3;14742:6;14660:95;:::i;:::-;14653:102;;14772:148;14916:3;14772:148;:::i;:::-;14765:155;;14937:3;14930:10;;13979:967;;;;;:::o;14952:222::-;15045:4;15083:2;15072:9;15068:18;15060:26;;15096:71;15164:1;15153:9;15149:17;15140:6;15096:71;:::i;:::-;14952:222;;;;:::o;15180:640::-;15375:4;15413:3;15402:9;15398:19;15390:27;;15427:71;15495:1;15484:9;15480:17;15471:6;15427:71;:::i;:::-;15508:72;15576:2;15565:9;15561:18;15552:6;15508:72;:::i;:::-;15590;15658:2;15647:9;15643:18;15634:6;15590:72;:::i;:::-;15709:9;15703:4;15699:20;15694:2;15683:9;15679:18;15672:48;15737:76;15808:4;15799:6;15737:76;:::i;:::-;15729:84;;15180:640;;;;;;;:::o;15826:210::-;15913:4;15951:2;15940:9;15936:18;15928:26;;15964:65;16026:1;16015:9;16011:17;16002:6;15964:65;:::i;:::-;15826:210;;;;:::o;16042:313::-;16155:4;16193:2;16182:9;16178:18;16170:26;;16242:9;16236:4;16232:20;16228:1;16217:9;16213:17;16206:47;16270:78;16343:4;16334:6;16270:78;:::i;:::-;16262:86;;16042:313;;;;:::o;16361:419::-;16527:4;16565:2;16554:9;16550:18;16542:26;;16614:9;16608:4;16604:20;16600:1;16589:9;16585:17;16578:47;16642:131;16768:4;16642:131;:::i;:::-;16634:139;;16361:419;;;:::o;16786:::-;16952:4;16990:2;16979:9;16975:18;16967:26;;17039:9;17033:4;17029:20;17025:1;17014:9;17010:17;17003:47;17067:131;17193:4;17067:131;:::i;:::-;17059:139;;16786:419;;;:::o;17211:::-;17377:4;17415:2;17404:9;17400:18;17392:26;;17464:9;17458:4;17454:20;17450:1;17439:9;17435:17;17428:47;17492:131;17618:4;17492:131;:::i;:::-;17484:139;;17211:419;;;:::o;17636:::-;17802:4;17840:2;17829:9;17825:18;17817:26;;17889:9;17883:4;17879:20;17875:1;17864:9;17860:17;17853:47;17917:131;18043:4;17917:131;:::i;:::-;17909:139;;17636:419;;;:::o;18061:::-;18227:4;18265:2;18254:9;18250:18;18242:26;;18314:9;18308:4;18304:20;18300:1;18289:9;18285:17;18278:47;18342:131;18468:4;18342:131;:::i;:::-;18334:139;;18061:419;;;:::o;18486:::-;18652:4;18690:2;18679:9;18675:18;18667:26;;18739:9;18733:4;18729:20;18725:1;18714:9;18710:17;18703:47;18767:131;18893:4;18767:131;:::i;:::-;18759:139;;18486:419;;;:::o;18911:::-;19077:4;19115:2;19104:9;19100:18;19092:26;;19164:9;19158:4;19154:20;19150:1;19139:9;19135:17;19128:47;19192:131;19318:4;19192:131;:::i;:::-;19184:139;;18911:419;;;:::o;19336:::-;19502:4;19540:2;19529:9;19525:18;19517:26;;19589:9;19583:4;19579:20;19575:1;19564:9;19560:17;19553:47;19617:131;19743:4;19617:131;:::i;:::-;19609:139;;19336:419;;;:::o;19761:::-;19927:4;19965:2;19954:9;19950:18;19942:26;;20014:9;20008:4;20004:20;20000:1;19989:9;19985:17;19978:47;20042:131;20168:4;20042:131;:::i;:::-;20034:139;;19761:419;;;:::o;20186:::-;20352:4;20390:2;20379:9;20375:18;20367:26;;20439:9;20433:4;20429:20;20425:1;20414:9;20410:17;20403:47;20467:131;20593:4;20467:131;:::i;:::-;20459:139;;20186:419;;;:::o;20611:222::-;20704:4;20742:2;20731:9;20727:18;20719:26;;20755:71;20823:1;20812:9;20808:17;20799:6;20755:71;:::i;:::-;20611:222;;;;:::o;20839:129::-;20873:6;20900:20;;:::i;:::-;20890:30;;20929:33;20957:4;20949:6;20929:33;:::i;:::-;20839:129;;;:::o;20974:75::-;21007:6;21040:2;21034:9;21024:19;;20974:75;:::o;21055:307::-;21116:4;21206:18;21198:6;21195:30;21192:56;;;21228:18;;:::i;:::-;21192:56;21266:29;21288:6;21266:29;:::i;:::-;21258:37;;21350:4;21344;21340:15;21332:23;;21055:307;;;:::o;21368:308::-;21430:4;21520:18;21512:6;21509:30;21506:56;;;21542:18;;:::i;:::-;21506:56;21580:29;21602:6;21580:29;:::i;:::-;21572:37;;21664:4;21658;21654:15;21646:23;;21368:308;;;:::o;21682:98::-;21733:6;21767:5;21761:12;21751:22;;21682:98;;;:::o;21786:99::-;21838:6;21872:5;21866:12;21856:22;;21786:99;;;:::o;21891:168::-;21974:11;22008:6;22003:3;21996:19;22048:4;22043:3;22039:14;22024:29;;21891:168;;;;:::o;22065:169::-;22149:11;22183:6;22178:3;22171:19;22223:4;22218:3;22214:14;22199:29;;22065:169;;;;:::o;22240:148::-;22342:11;22379:3;22364:18;;22240:148;;;;:::o;22394:305::-;22434:3;22453:20;22471:1;22453:20;:::i;:::-;22448:25;;22487:20;22505:1;22487:20;:::i;:::-;22482:25;;22641:1;22573:66;22569:74;22566:1;22563:81;22560:107;;;22647:18;;:::i;:::-;22560:107;22691:1;22688;22684:9;22677:16;;22394:305;;;;:::o;22705:185::-;22745:1;22762:20;22780:1;22762:20;:::i;:::-;22757:25;;22796:20;22814:1;22796:20;:::i;:::-;22791:25;;22835:1;22825:35;;22840:18;;:::i;:::-;22825:35;22882:1;22879;22875:9;22870:14;;22705:185;;;;:::o;22896:348::-;22936:7;22959:20;22977:1;22959:20;:::i;:::-;22954:25;;22993:20;23011:1;22993:20;:::i;:::-;22988:25;;23181:1;23113:66;23109:74;23106:1;23103:81;23098:1;23091:9;23084:17;23080:105;23077:131;;;23188:18;;:::i;:::-;23077:131;23236:1;23233;23229:9;23218:20;;22896:348;;;;:::o;23250:191::-;23290:4;23310:20;23328:1;23310:20;:::i;:::-;23305:25;;23344:20;23362:1;23344:20;:::i;:::-;23339:25;;23383:1;23380;23377:8;23374:34;;;23388:18;;:::i;:::-;23374:34;23433:1;23430;23426:9;23418:17;;23250:191;;;;:::o;23447:96::-;23484:7;23513:24;23531:5;23513:24;:::i;:::-;23502:35;;23447:96;;;:::o;23549:90::-;23583:7;23626:5;23619:13;23612:21;23601:32;;23549:90;;;:::o;23645:149::-;23681:7;23721:66;23714:5;23710:78;23699:89;;23645:149;;;:::o;23800:89::-;23836:7;23876:6;23869:5;23865:18;23854:29;;23800:89;;;:::o;23895:126::-;23932:7;23972:42;23965:5;23961:54;23950:65;;23895:126;;;:::o;24027:77::-;24064:7;24093:5;24082:16;;24027:77;;;:::o;24110:154::-;24194:6;24189:3;24184;24171:30;24256:1;24247:6;24242:3;24238:16;24231:27;24110:154;;;:::o;24270:307::-;24338:1;24348:113;24362:6;24359:1;24356:13;24348:113;;;24447:1;24442:3;24438:11;24432:18;24428:1;24423:3;24419:11;24412:39;24384:2;24381:1;24377:10;24372:15;;24348:113;;;24479:6;24476:1;24473:13;24470:101;;;24559:1;24550:6;24545:3;24541:16;24534:27;24470:101;24319:258;24270:307;;;:::o;24583:320::-;24627:6;24664:1;24658:4;24654:12;24644:22;;24711:1;24705:4;24701:12;24732:18;24722:81;;24788:4;24780:6;24776:17;24766:27;;24722:81;24850:2;24842:6;24839:14;24819:18;24816:38;24813:84;;;24869:18;;:::i;:::-;24813:84;24634:269;24583:320;;;:::o;24909:281::-;24992:27;25014:4;24992:27;:::i;:::-;24984:6;24980:40;25122:6;25110:10;25107:22;25086:18;25074:10;25071:34;25068:62;25065:88;;;25133:18;;:::i;:::-;25065:88;25173:10;25169:2;25162:22;24952:238;24909:281;;:::o;25196:233::-;25235:3;25258:24;25276:5;25258:24;:::i;:::-;25249:33;;25304:66;25297:5;25294:77;25291:103;;;25374:18;;:::i;:::-;25291:103;25421:1;25414:5;25410:13;25403:20;;25196:233;;;:::o;25435:176::-;25467:1;25484:20;25502:1;25484:20;:::i;:::-;25479:25;;25518:20;25536:1;25518:20;:::i;:::-;25513:25;;25557:1;25547:35;;25562:18;;:::i;:::-;25547:35;25603:1;25600;25596:9;25591:14;;25435:176;;;;:::o;25617:180::-;25665:77;25662:1;25655:88;25762:4;25759:1;25752:15;25786:4;25783:1;25776:15;25803:180;25851:77;25848:1;25841:88;25948:4;25945:1;25938:15;25972:4;25969:1;25962:15;25989:180;26037:77;26034:1;26027:88;26134:4;26131:1;26124:15;26158:4;26155:1;26148:15;26175:180;26223:77;26220:1;26213:88;26320:4;26317:1;26310:15;26344:4;26341:1;26334:15;26361:180;26409:77;26406:1;26399:88;26506:4;26503:1;26496:15;26530:4;26527:1;26520:15;26547:117;26656:1;26653;26646:12;26670:117;26779:1;26776;26769:12;26793:117;26902:1;26899;26892:12;26916:117;27025:1;27022;27015:12;27039:102;27080:6;27131:2;27127:7;27122:2;27115:5;27111:14;27107:28;27097:38;;27039:102;;;:::o;27147:225::-;27287:34;27283:1;27275:6;27271:14;27264:58;27356:8;27351:2;27343:6;27339:15;27332:33;27147:225;:::o;27378:164::-;27518:16;27514:1;27506:6;27502:14;27495:40;27378:164;:::o;27548:179::-;27688:31;27684:1;27676:6;27672:14;27665:55;27548:179;:::o;27733:170::-;27873:22;27869:1;27861:6;27857:14;27850:46;27733:170;:::o;27909:168::-;28049:20;28045:1;28037:6;28033:14;28026:44;27909:168;:::o;28083:169::-;28223:21;28219:1;28211:6;28207:14;28200:45;28083:169;:::o;28258:157::-;28398:9;28394:1;28386:6;28382:14;28375:33;28258:157;:::o;28421:242::-;28561:34;28557:1;28549:6;28545:14;28538:58;28630:25;28625:2;28617:6;28613:15;28606:50;28421:242;:::o;28669:231::-;28809:34;28805:1;28797:6;28793:14;28786:58;28878:14;28873:2;28865:6;28861:15;28854:39;28669:231;:::o;28906:169::-;29046:21;29042:1;29034:6;29030:14;29023:45;28906:169;:::o;29081:182::-;29221:34;29217:1;29209:6;29205:14;29198:58;29081:182;:::o;29269:168::-;29409:20;29405:1;29397:6;29393:14;29386:44;29269:168;:::o;29443:122::-;29516:24;29534:5;29516:24;:::i;:::-;29509:5;29506:35;29496:63;;29555:1;29552;29545:12;29496:63;29443:122;:::o;29571:116::-;29641:21;29656:5;29641:21;:::i;:::-;29634:5;29631:32;29621:60;;29677:1;29674;29667:12;29621:60;29571:116;:::o;29693:120::-;29765:23;29782:5;29765:23;:::i;:::-;29758:5;29755:34;29745:62;;29803:1;29800;29793:12;29745:62;29693:120;:::o;29819:::-;29891:23;29908:5;29891:23;:::i;:::-;29884:5;29881:34;29871:62;;29929:1;29926;29919:12;29871:62;29819:120;:::o;29945:122::-;30018:24;30036:5;30018:24;:::i;:::-;30011:5;30008:35;29998:63;;30057:1;30054;30047:12;29998:63;29945:122;:::o
Swarm Source
ipfs://a5dc4980269077775c9eab987830207e6d1a484c5fede0b065733dab1b50ac71
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.