ERC-721
Overview
Max Total Supply
53 TLS
Holders
19
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TLSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TheLastSamurai
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT /* ______ __ __ __ ____ /\__ _\/\ \ /\ \ /\ \__ /\ _`\ __ \/_/\ \/\ \ \___ __ \ \ \ __ ____\ \ ,_\ \ \,\L\_\ __ ___ ___ __ __ _ __ __ /\_\ \ \ \ \ \ _ `\ /'__`\ \ \ \ __ /'__`\ /',__\\ \ \/ \/_\__ \ /'__`\ /' __` __`\/\ \/\ \/\`'__\/'__`\ \/\ \ \ \ \ \ \ \ \ \/\ __/ \ \ \L\ \/\ \L\.\_/\__, `\\ \ \_ /\ \L\ \/\ \L\.\_/\ \/\ \/\ \ \ \_\ \ \ \//\ \L\.\_\ \ \ \ \_\ \ \_\ \_\ \____\ \ \____/\ \__/.\_\/\____/ \ \__\ \ `\____\ \__/.\_\ \_\ \_\ \_\ \____/\ \_\\ \__/.\_\\ \_\ \/_/ \/_/\/_/\/____/ \/___/ \/__/\/_/\/___/ \/__/ \/_____/\/__/\/_/\/_/\/_/\/_/\/___/ \/_/ \/__/\/_/ \/_/ The Last Samurai is an art project composed of 1500 images of Japanese samurai in dry brush and ink style. The creation lasted for one and a half years. The content and emotions of each work is the non-homogeneous. Every piece is unique. */ pragma solidity ^0.8.17; import '@openzeppelin/contracts/token/ERC721/ERC721.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/utils/Counters.sol'; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; import '@openzeppelin/contracts/utils/cryptography/MerkleProof.sol'; contract TheLastSamurai is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard { using Counters for Counters.Counter; Counters.Counter private currentTokenId; bytes32 public saleMerkleRoot; string public baseTokenURI; uint256 public maxSupply; bool public paused = false; constructor( uint256 _maxSupply, string memory _baseTokenURI, bytes32 merkleRoot ) ERC721('TheLastSamurai', 'TLS') { maxSupply = _maxSupply; baseTokenURI = _baseTokenURI; setSaleMerkleRoot(merkleRoot); selfMint(10); } modifier isValidMint(uint256 amount) { uint256 balance = balanceOf(_msgSender()); require(!paused, 'contract is paused'); require(balance < 5, 'mint more than 5 times'); require(amount + balance <= 5, 'mint more than 5 times'); require(totalSupply() < maxSupply, 'max supply exceeded'); _; } function mint(bytes32[] calldata merkleProof, uint256 amount) public payable isValidMint(amount) { bool inWhiteList = MerkleProof.verify(merkleProof, saleMerkleRoot, keccak256(abi.encodePacked(_msgSender()))); uint256 balance = balanceOf(_msgSender()); if (inWhiteList) { if (balance == 0) { require((0.0072 ether * (amount - 1)) == msg.value, 'ether value you sent not correct'); } else { require((0.0072 ether * amount) == msg.value, 'ether value you sent not correct'); } } else { require((0.0072 ether * amount) == msg.value, 'ether value you sent not correct'); } for (uint256 i = 0; i < amount; i++) { currentTokenId.increment(); uint256 itemId = currentTokenId.current(); _safeMint(_msgSender(), itemId); } } function selfMint(uint256 _amount) public onlyOwner { require(totalSupply() + _amount < maxSupply, 'max supply exceeded'); for (uint256 i = 0; i < _amount; i++) { currentTokenId.increment(); uint256 itemId = currentTokenId.current(); _safeMint(_msgSender(), itemId); } } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId), '.json')) : ''; } function setBaseTokenURI(string memory _baseTokenURI) public onlyOwner { baseTokenURI = _baseTokenURI; } function setPaused(bool _paused) public onlyOwner { paused = _paused; } function setSaleMerkleRoot(bytes32 merkleRoot) public onlyOwner { saleMerkleRoot = merkleRoot; } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.14; import '@openzeppelin/contracts/token/ERC1155/ERC1155.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/security/Pausable.sol'; import '@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol'; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; import '@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol'; contract LZ_DIAMOND_1 is ERC1155, Ownable, Pausable, ERC1155Supply, ERC1155Burnable, ReentrancyGuard { struct Special { string name; uint256 num; } uint256 public constant DIA = 0; uint256 public maxSupply; string private _name; string private _symbol; uint256 private _publicPrice; // Mapping for the combination if used mapping(string => bool) private _merged; mapping(uint256 => bool) private _t_merged; // Mapping for the special objects's nums mapping(string => uint256) private _special; constructor( string memory name_, string memory symbol_, uint256 maxSupply_, uint256 publicPrice_, Special[] memory special, string memory uri_ ) ERC1155(uri_) { _name = name_; _symbol = symbol_; maxSupply = maxSupply_; _publicPrice = publicPrice_; initSpecial(special); } function initSpecial(Special[] memory special) private { for (uint256 i = 0; i < special.length; i++) { _special[special[i].name] = special[i].num; } } function merge( string memory curStr, uint256 tnum, string[] memory specials ) external whenNotPaused { require(balanceOf(msg.sender, DIA) > 0, 'balance must bigger than 0'); require(!_merged[curStr], 'images you choosed was merged'); require(!_t_merged[tnum], 'your the three gates image was merged'); for (uint256 i = 0; i < specials.length; i++) { require(_special[specials[i]] > 0, 'one of images is out of use'); } _merged[curStr] = true; _t_merged[tnum] = true; for (uint256 i = 0; i < specials.length; i++) { _special[specials[i]] -= 1; } burn(msg.sender, DIA, 1); } function getNums(string[] memory specials) external view whenNotPaused returns (Special[] memory) { Special[] memory list = new Special[](specials.length); for (uint256 i = 0; i < specials.length; i++) { list[i] = Special(specials[i], _special[specials[i]]); } return list; } function airDrop(address[] memory addrs, uint256 amount) external onlyOwner { require(totalSupply(DIA) + addrs.length * amount <= maxSupply, 'exceeded max supply'); for (uint256 i = 0; i < addrs.length; i++) { _mint(addrs[i], DIA, amount, ''); } } function mint(address to) external payable whenNotPaused { require(balanceOf(to, DIA) < 1, 'address can not mint more than 1 times'); require(totalSupply(DIA) <= maxSupply, 'exceeded max supply'); require(msg.value == _publicPrice, 'cost incorrect'); _mint(to, DIA, 1, ''); } function setURI(string memory newuri) public onlyOwner { _setURI(newuri); } function setPublicPrice(uint256 price) public onlyOwner { _publicPrice = price; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function check(uint256 tnum) public view returns (bool) { return _t_merged[tnum]; } function checkMerged(string memory curStr) public view returns (bool) { return _merged[curStr]; } function selfMint( address account, uint256 amount, bytes memory data ) public onlyOwner { _mint(account, DIA, amount, data); } function selfMintBatch( address to, uint256 _amounts, bytes memory data ) public onlyOwner { uint256[] memory ids; uint256[] memory amounts; ids[0] = DIA; amounts[0] = _amounts; _mintBatch(to, ids, amounts, data); } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal override(ERC1155, ERC1155Supply) whenNotPaused { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./extensions/IERC1155MetadataURI.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; import "../ERC1155.sol"; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _burnBatch(account, ids, values); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; import "../ERC1155.sol"; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 supply = _totalSupply[id]; require(supply >= amount, "ERC1155: burn amount exceeds totalSupply"); unchecked { _totalSupply[id] = supply - amount; } } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "../IERC1155.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @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: address zero is not a valid owner"); 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: invalid token ID"); 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) { _requireMinted(tokenId); 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 overridden 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 token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_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: caller is not token 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: caller is not token 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly 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 Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.14; import '@openzeppelin/contracts/token/ERC721/ERC721.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/utils/Counters.sol'; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; contract NFTISDEAD is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard { using Counters for Counters.Counter; Counters.Counter private currentTokenId; string public baseTokenURI; uint256 public maxSupply; bool public paused = true; constructor(uint256 _maxSupply, string memory _baseTokenURI) ERC721('NFT IS DEAD?', 'NFTISDEAD') { setPaused(false); maxSupply = _maxSupply; baseTokenURI = _baseTokenURI; } modifier pausedMintCompliance() { require(!paused, 'contract is paused'); _; } function mint(address to) public pausedMintCompliance { require(balanceOf(to) < 1, 'address can not mint more than 1 times'); require(totalSupply() < maxSupply, 'max supply exceeded'); currentTokenId.increment(); uint256 itemId = currentTokenId.current(); _safeMint(to, itemId); } function selfMint(uint256 _amount) public onlyOwner { require(totalSupply() + _amount < maxSupply, 'max supply exceeded'); for (uint256 i = 0; i < _amount; i++) { currentTokenId.increment(); uint256 itemId = currentTokenId.current(); _safeMint(msg.sender, itemId); } } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId), '.json')) : ''; } function setBaseTokenURI(string memory _baseTokenURI) public onlyOwner { baseTokenURI = _baseTokenURI; } function setPaused(bool _paused) public onlyOwner { paused = _paused; } function getAirdropList(uint256 _amount) external view onlyOwner returns (address[] memory) { uint256 amount = _amount < totalSupply() ? _amount : totalSupply(); address[] memory airdropList = new address[](amount); for (uint256 i = 0; i < amount; i++) { airdropList[i] = ownerOf(i + 1); } return airdropList; } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @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(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @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); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.14; import '@openzeppelin/contracts/token/ERC721/ERC721.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/utils/Counters.sol'; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; interface Prophetgamma { function balanceOf(address) external view returns (uint256); } contract PGGameCard is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard { using Counters for Counters.Counter; Counters.Counter private currentTokenId; string public baseTokenURI; uint256 public maxSupply; bool public paused = false; Prophetgamma pg; constructor( uint256 _maxSupply, string memory _baseTokenURI, address pgAddress, address[] memory addresses ) ERC721('PGGameCard', 'PGGameCard') { maxSupply = _maxSupply; baseTokenURI = _baseTokenURI; pg = Prophetgamma(pgAddress); airDrop(addresses); } modifier pausedMintCompliance() { require(!paused, 'contract is paused'); _; } function mint(address to) public payable pausedMintCompliance { require(balanceOf(to) < 5, 'address can not mint more than 5 times'); require(totalSupply() < maxSupply, 'max supply exceeded'); if (pg.balanceOf(to) > 0 && balanceOf(to) >= 1) { require(0.006 ether == msg.value, 'ether value you sent not correct, own Prophetgamma'); } if (pg.balanceOf(to) == 0) { require(0.006 ether == msg.value, 'ether value you sent not correct, not own Prophetgamma'); } currentTokenId.increment(); uint256 itemId = currentTokenId.current(); _safeMint(to, itemId); } function airDrop(address[] memory addresses) public onlyOwner { require(totalSupply() < maxSupply, 'max supply exceeded'); for (uint256 i = 0; i < addresses.length; i++) { currentTokenId.increment(); uint256 itemId = currentTokenId.current(); _safeMint(addresses[i], itemId); } } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId), '.json')) : ''; } function setBaseTokenURI(string memory _baseTokenURI) public onlyOwner { baseTokenURI = _baseTokenURI; } function setPaused(bool _paused) public onlyOwner { paused = _paused; } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.14; import '@openzeppelin/contracts/token/ERC721/ERC721.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/utils/Counters.sol'; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; contract Prophetgamma is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard { using Counters for Counters.Counter; Counters.Counter private currentTokenId; string public baseTokenURI; uint256 public maxSupply; bool public paused = true; constructor(uint256 _maxSupply, string memory _baseTokenURI) ERC721('Prophetgamma', 'Prophetgamma') { setPaused(true); maxSupply = _maxSupply; baseTokenURI = _baseTokenURI; } modifier pausedMintCompliance() { require(!paused, 'contract is paused'); _; } function mint(address to) public payable pausedMintCompliance { require(balanceOf(to) < 1, 'address can not mint more than 1 times'); require(totalSupply() < maxSupply, 'max supply exceeded'); if (totalSupply() > 400) { require(0.006 ether == msg.value, 'ether value you sent not correct'); } currentTokenId.increment(); uint256 itemId = currentTokenId.current(); _safeMint(to, itemId); } function selfMint(uint256 _amount) public onlyOwner { require(totalSupply() + _amount < maxSupply, 'max supply exceeded'); for (uint256 i = 0; i < _amount; i++) { currentTokenId.increment(); uint256 itemId = currentTokenId.current(); _safeMint(msg.sender, itemId); } } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId), '.json')) : ''; } function setBaseTokenURI(string memory _baseTokenURI) public onlyOwner { baseTokenURI = _baseTokenURI; } function setPaused(bool _paused) public onlyOwner { paused = _paused; } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.14; import '@openzeppelin/contracts/token/ERC721/ERC721.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/utils/Counters.sol'; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; contract TheThreeGates is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard { using Counters for Counters.Counter; Counters.Counter private currentTokenId; string public baseTokenURI; uint256 public maxSupply; bool public paused = true; constructor(uint256 _maxSupply, string memory _baseTokenURI) ERC721('TheThreeGates', 'TTG') { setPaused(true); maxSupply = _maxSupply; baseTokenURI = _baseTokenURI; } modifier pausedMintCompliance() { require(!paused, 'contract is paused'); _; } function mint(address to) public payable pausedMintCompliance { require(balanceOf(to) < 1, 'address can not mint more than 1 times'); require(totalSupply() < maxSupply, 'max supply exceeded'); if (totalSupply() >= 10) { require(0.01 ether == msg.value, 'ether value you sent not correct'); } currentTokenId.increment(); uint256 itemId = currentTokenId.current(); _safeMint(to, itemId); } function selfMint(uint256 _amount) public onlyOwner { require(totalSupply() + _amount < maxSupply, 'max supply exceeded'); for (uint256 i = 0; i < _amount; i++) { currentTokenId.increment(); uint256 itemId = currentTokenId.current(); _safeMint(msg.sender, itemId); } } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId), '.json')) : ''; } function setBaseTokenURI(string memory _baseTokenURI) public onlyOwner { baseTokenURI = _baseTokenURI; } function setPaused(bool _paused) public onlyOwner { paused = _paused; } function getAirdropList(uint256 _amount) external view onlyOwner returns (address[] memory) { uint256 amount = _amount < totalSupply() ? _amount : totalSupply(); address[] memory airdropList = new address[](amount); for (uint256 i = 0; i < amount; i++) { airdropList[i] = ownerOf(i + 1); } return airdropList; } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.14; import '@openzeppelin/contracts/token/ERC721/ERC721.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/utils/Counters.sol'; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; contract CryptoPowell is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard { using Counters for Counters.Counter; Counters.Counter private currentTokenId; string public baseTokenURI; uint256 public maxSupply; bool public paused = true; constructor(uint256 _maxSupply, uint256 _airdropMount, string memory _baseTokenURI) ERC721('CryptoPowell', 'CryptoPowell') { setPaused(false); maxSupply = _maxSupply; baseTokenURI = _baseTokenURI; selfMint(_airdropMount); } modifier pausedMintCompliance() { require(!paused, 'contract is paused'); _; } function mint(address to) public pausedMintCompliance { require(balanceOf(to) < 1, 'address can not mint more than 1 times'); require(totalSupply() < maxSupply, 'max supply exceeded'); currentTokenId.increment(); uint256 itemId = currentTokenId.current(); _safeMint(to, itemId); } function selfMint(uint256 _amount) public onlyOwner { require(totalSupply() + _amount < maxSupply, 'max supply exceeded'); for (uint256 i = 0; i < _amount; i++) { currentTokenId.increment(); uint256 itemId = currentTokenId.current(); _safeMint(msg.sender, itemId); } } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId), '.json')) : ''; } function setBaseTokenURI(string memory _baseTokenURI) public onlyOwner { baseTokenURI = _baseTokenURI; } function setPaused(bool _paused) public onlyOwner { paused = _paused; } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"selfMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setSaleMerkleRoot","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000601060006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060405162005c0c38038062005c0c833981810160405281019062000052919062001034565b6040518060400160405280600e81526020017f5468654c61737453616d757261690000000000000000000000000000000000008152506040518060400160405280600381526020017f544c5300000000000000000000000000000000000000000000000000000000008152508160009081620000cf9190620012f0565b508060019081620000e19190620012f0565b50505062000104620000f86200015160201b60201c565b6200015960201b60201c565b6001600b8190555082600f8190555081600e9081620001249190620012f0565b5062000136816200021f60201b60201c565b62000148600a6200023960201b60201c565b505050620019c6565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200022f6200032660201b60201c565b80600d8190555050565b620002496200032660201b60201c565b600f54816200025d620003b760201b60201c565b62000269919062001406565b10620002ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a390620014a2565b60405180910390fd5b60005b818110156200032257620002cf600c620003c460201b6200148d1760201c565b6000620002e8600c620003da60201b620014a31760201c565b90506200030b620002fe6200015160201b60201c565b82620003e860201b60201c565b5080806200031990620014c4565b915050620002af565b5050565b620003366200015160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200035c6200040e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ac9062001561565b60405180910390fd5b565b6000600880549050905090565b6001816000016000828254019250508190555050565b600081600001549050919050565b6200040a8282604051806020016040528060008152506200043860201b60201c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200044a8383620004a660201b60201c565b6200045f60008484846200069f60201b60201c565b620004a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200049890620015f9565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000518576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200050f906200166b565b60405180910390fd5b62000529816200084860201b60201c565b156200056c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200056390620016dd565b60405180910390fd5b6200058060008383620008b460201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620005d2919062001406565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200069b60008383620008d160201b60201c565b5050565b6000620006cd8473ffffffffffffffffffffffffffffffffffffffff16620008d660201b620014b11760201c565b156200083b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006ff6200015160201b60201c565b8786866040518563ffffffff1660e01b8152600401620007239493929190620017b2565b6020604051808303816000875af19250505080156200076257506040513d601f19601f820116820180604052508101906200075f919062001863565b60015b620007ea573d806000811462000795576040519150601f19603f3d011682016040523d82523d6000602084013e6200079a565b606091505b506000815103620007e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007d990620015f9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000840565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b620008cc838383620008f960201b620014d41760201c565b505050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6200091183838362000a3e60201b620015e61760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036200095d57620009578162000a4360201b60201c565b620009a5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620009a457620009a3838262000a8c60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620009f157620009eb8162000c0960201b60201c565b62000a39565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000a385762000a37828262000ce560201b60201c565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000aa68462000d7160201b620010631760201c565b62000ab2919062001895565b905060006007600084815260200190815260200160002054905081811462000b98576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000c1f919062001895565b905060006009600084815260200190815260200160002054905060006008838154811062000c525762000c51620018d0565b5b90600052602060002001549050806008838154811062000c775762000c76620018d0565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000cc95762000cc8620018ff565b5b6001900381819060005260206000200160009055905550505050565b600062000cfd8362000d7160201b620010631760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000de4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ddb90620019a4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b62000e548162000e3f565b811462000e6057600080fd5b50565b60008151905062000e748162000e49565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000ecf8262000e84565b810181811067ffffffffffffffff8211171562000ef15762000ef062000e95565b5b80604052505050565b600062000f0662000e2b565b905062000f14828262000ec4565b919050565b600067ffffffffffffffff82111562000f375762000f3662000e95565b5b62000f428262000e84565b9050602081019050919050565b60005b8381101562000f6f57808201518184015260208101905062000f52565b60008484015250505050565b600062000f9262000f8c8462000f19565b62000efa565b90508281526020810184848401111562000fb15762000fb062000e7f565b5b62000fbe84828562000f4f565b509392505050565b600082601f83011262000fde5762000fdd62000e7a565b5b815162000ff084826020860162000f7b565b91505092915050565b6000819050919050565b6200100e8162000ff9565b81146200101a57600080fd5b50565b6000815190506200102e8162001003565b92915050565b60008060006060848603121562001050576200104f62000e35565b5b6000620010608682870162000e63565b935050602084015167ffffffffffffffff81111562001084576200108362000e3a565b5b620010928682870162000fc6565b9250506040620010a5868287016200101d565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200110257607f821691505b602082108103620011185762001117620010ba565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620011827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001143565b6200118e868362001143565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620011d1620011cb620011c58462000e3f565b620011a6565b62000e3f565b9050919050565b6000819050919050565b620011ed83620011b0565b62001205620011fc82620011d8565b84845462001150565b825550505050565b600090565b6200121c6200120d565b62001229818484620011e2565b505050565b5b8181101562001251576200124560008262001212565b6001810190506200122f565b5050565b601f821115620012a0576200126a816200111e565b620012758462001133565b8101602085101562001285578190505b6200129d620012948562001133565b8301826200122e565b50505b505050565b600082821c905092915050565b6000620012c560001984600802620012a5565b1980831691505092915050565b6000620012e08383620012b2565b9150826002028217905092915050565b620012fb82620010af565b67ffffffffffffffff81111562001317576200131662000e95565b5b620013238254620010e9565b6200133082828562001255565b600060209050601f83116001811462001368576000841562001353578287015190505b6200135f8582620012d2565b865550620013cf565b601f19841662001378866200111e565b60005b82811015620013a2578489015182556001820191506020850194506020810190506200137b565b86831015620013c25784890151620013be601f891682620012b2565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620014138262000e3f565b9150620014208362000e3f565b92508282019050808211156200143b576200143a620013d7565b5b92915050565b600082825260208201905092915050565b7f6d617820737570706c7920657863656564656400000000000000000000000000600082015250565b60006200148a60138362001441565b9150620014978262001452565b602082019050919050565b60006020820190508181036000830152620014bd816200147b565b9050919050565b6000620014d18262000e3f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620015065762001505620013d7565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200154960208362001441565b9150620015568262001511565b602082019050919050565b600060208201905081810360008301526200157c816200153a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000620015e160328362001441565b9150620015ee8262001583565b604082019050919050565b600060208201905081810360008301526200161481620015d2565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006200165360208362001441565b915062001660826200161b565b602082019050919050565b60006020820190508181036000830152620016868162001644565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000620016c5601c8362001441565b9150620016d2826200168d565b602082019050919050565b60006020820190508181036000830152620016f881620016b6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200172c82620016ff565b9050919050565b6200173e816200171f565b82525050565b6200174f8162000e3f565b82525050565b600081519050919050565b600082825260208201905092915050565b60006200177e8262001755565b6200178a818562001760565b93506200179c81856020860162000f4f565b620017a78162000e84565b840191505092915050565b6000608082019050620017c9600083018762001733565b620017d8602083018662001733565b620017e7604083018562001744565b8181036060830152620017fb818462001771565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6200183d8162001806565b81146200184957600080fd5b50565b6000815190506200185d8162001832565b92915050565b6000602082840312156200187c576200187b62000e35565b5b60006200188c848285016200184c565b91505092915050565b6000620018a28262000e3f565b9150620018af8362000e3f565b9250828203905081811115620018ca57620018c9620013d7565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006200198c60298362001441565b915062001999826200192e565b604082019050919050565b60006020820190508181036000830152620019bf816200197d565b9050919050565b61423680620019d66000396000f3fe6080604052600436106101c25760003560e01c80635c975abb116100f7578063b88d4fde11610095578063d5abeb0111610064578063d5abeb0114610631578063e985e9c51461065c578063f2fde38b14610699578063f91eb630146106c2576101c2565b8063b88d4fde14610575578063c87b56dd1461059e578063d4a417e6146105db578063d547cfb714610606576101c2565b8063715018a6116100d1578063715018a6146104df5780638da5cb5b146104f657806395d89b4114610521578063a22cb4651461054c576101c2565b80635c975abb1461043a5780636352211e1461046557806370a08231146104a2576101c2565b806323b872dd116101645780633ccfd60b1161013e5780633ccfd60b146103a157806342842e0e146103b857806345de0d9b146103e15780634f6ccce7146103fd576101c2565b806323b872dd146103125780632f745c591461033b57806330176e1314610378576101c2565b8063095ea7b3116101a0578063095ea7b31461026c5780630d3c69b41461029557806316c38b3c146102be57806318160ddd146102e7576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612931565b6106eb565b6040516101fb9190612979565b60405180910390f35b34801561021057600080fd5b506102196106fd565b6040516102269190612a24565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612a7c565b61078f565b6040516102639190612aea565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612b31565b6107d5565b005b3480156102a157600080fd5b506102bc60048036038101906102b79190612a7c565b6108ec565b005b3480156102ca57600080fd5b506102e560048036038101906102e09190612b9d565b610996565b005b3480156102f357600080fd5b506102fc6109bb565b6040516103099190612bd9565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612bf4565b6109c8565b005b34801561034757600080fd5b50610362600480360381019061035d9190612b31565b610a28565b60405161036f9190612bd9565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612d7c565b610acd565b005b3480156103ad57600080fd5b506103b6610ae8565b005b3480156103c457600080fd5b506103df60048036038101906103da9190612bf4565b610bc5565b005b6103fb60048036038101906103f69190612e25565b610be5565b005b34801561040957600080fd5b50610424600480360381019061041f9190612a7c565b610f2e565b6040516104319190612bd9565b60405180910390f35b34801561044657600080fd5b5061044f610f9f565b60405161045c9190612979565b60405180910390f35b34801561047157600080fd5b5061048c60048036038101906104879190612a7c565b610fb2565b6040516104999190612aea565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190612e85565b611063565b6040516104d69190612bd9565b60405180910390f35b3480156104eb57600080fd5b506104f461111a565b005b34801561050257600080fd5b5061050b61112e565b6040516105189190612aea565b60405180910390f35b34801561052d57600080fd5b50610536611158565b6040516105439190612a24565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190612eb2565b6111ea565b005b34801561058157600080fd5b5061059c60048036038101906105979190612f93565b611200565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190612a7c565b611262565b6040516105d29190612a24565b60405180910390f35b3480156105e757600080fd5b506105f06112ca565b6040516105fd919061302f565b60405180910390f35b34801561061257600080fd5b5061061b6112d0565b6040516106289190612a24565b60405180910390f35b34801561063d57600080fd5b5061064661135e565b6040516106539190612bd9565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e919061304a565b611364565b6040516106909190612979565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190612e85565b6113f8565b005b3480156106ce57600080fd5b506106e960048036038101906106e491906130b6565b61147b565b005b60006106f6826115eb565b9050919050565b60606000805461070c90613112565b80601f016020809104026020016040519081016040528092919081815260200182805461073890613112565b80156107855780601f1061075a57610100808354040283529160200191610785565b820191906000526020600020905b81548152906001019060200180831161076857829003601f168201915b5050505050905090565b600061079a82611665565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e082610fb2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610850576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610847906131b5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661086f6116b0565b73ffffffffffffffffffffffffffffffffffffffff16148061089e575061089d816108986116b0565b611364565b5b6108dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d490613247565b60405180910390fd5b6108e783836116b8565b505050565b6108f4611771565b600f54816109006109bb565b61090a9190613296565b1061094a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094190613316565b60405180910390fd5b60005b818110156109925761095f600c61148d565b600061096b600c6114a3565b905061097e6109786116b0565b826117ef565b50808061098a90613336565b91505061094d565b5050565b61099e611771565b80601060006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b6109d96109d36116b0565b8261180d565b610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f906133f0565b60405180910390fd5b610a238383836118a2565b505050565b6000610a3383611063565b8210610a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6b90613482565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ad5611771565b80600e9081610ae4919061364e565b5050565b610af0611771565b6002600b5403610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c9061376c565b60405180910390fd5b6002600b819055506000610b4761112e565b73ffffffffffffffffffffffffffffffffffffffff1647604051610b6a906137bd565b60006040518083038185875af1925050503d8060008114610ba7576040519150601f19603f3d011682016040523d82523d6000602084013e610bac565b606091505b5050905080610bba57600080fd5b506001600b81905550565b610be083838360405180602001604052806000815250611200565b505050565b806000610bf8610bf36116b0565b611063565b9050601060009054906101000a900460ff1615610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c419061381e565b60405180910390fd5b60058110610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c849061388a565b60405180910390fd5b60058183610c9b9190613296565b1115610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd39061388a565b60405180910390fd5b600f54610ce76109bb565b10610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e90613316565b60405180910390fd5b6000610da4868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54610d796116b0565b604051602001610d8991906138f2565b60405160208183030381529060405280519060200120611b08565b90506000610db8610db36116b0565b611063565b90508115610e875760008103610e2d5734600186610dd6919061390d565b6619945ca2620000610de89190613941565b14610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f906139cf565b60405180910390fd5b610e82565b34856619945ca2620000610e419190613941565b14610e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e78906139cf565b60405180910390fd5b5b610edc565b34856619945ca2620000610e9b9190613941565b14610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed2906139cf565b60405180910390fd5b5b60005b85811015610f2457610ef1600c61148d565b6000610efd600c6114a3565b9050610f10610f0a6116b0565b826117ef565b508080610f1c90613336565b915050610edf565b5050505050505050565b6000610f386109bb565b8210610f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7090613a61565b60405180910390fd5b60088281548110610f8d57610f8c613a81565b5b90600052602060002001549050919050565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105190613afc565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca90613b8e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611122611771565b61112c6000611b1f565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116790613112565b80601f016020809104026020016040519081016040528092919081815260200182805461119390613112565b80156111e05780601f106111b5576101008083540402835291602001916111e0565b820191906000526020600020905b8154815290600101906020018083116111c357829003601f168201915b5050505050905090565b6111fc6111f56116b0565b8383611be5565b5050565b61121161120b6116b0565b8361180d565b611250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611247906133f0565b60405180910390fd5b61125c84848484611d51565b50505050565b606061126d82611665565b6000611277611dad565b9050600081511161129757604051806020016040528060008152506112c2565b806112a184611e3f565b6040516020016112b2929190613c36565b6040516020818303038152906040525b915050919050565b600d5481565b600e80546112dd90613112565b80601f016020809104026020016040519081016040528092919081815260200182805461130990613112565b80156113565780601f1061132b57610100808354040283529160200191611356565b820191906000526020600020905b81548152906001019060200180831161133957829003601f168201915b505050505081565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611400611771565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361146f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146690613cd7565b60405180910390fd5b61147881611b1f565b50565b611483611771565b80600d8190555050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6114df8383836115e6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115215761151c81611f9f565b611560565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461155f5761155e8382611fe8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a25761159d81612155565b6115e1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146115e0576115df8282612226565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061165e575061165d826122a5565b5b9050919050565b61166e81612387565b6116ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a490613afc565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661172b83610fb2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6117796116b0565b73ffffffffffffffffffffffffffffffffffffffff1661179761112e565b73ffffffffffffffffffffffffffffffffffffffff16146117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e490613d43565b60405180910390fd5b565b6118098282604051806020016040528060008152506123f3565b5050565b60008061181983610fb2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061185b575061185a8185611364565b5b8061189957508373ffffffffffffffffffffffffffffffffffffffff166118818461078f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118c282610fb2565b73ffffffffffffffffffffffffffffffffffffffff1614611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90613dd5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e90613e67565b60405180910390fd5b61199283838361244e565b61199d6000826116b8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119ed919061390d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a449190613296565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b0383838361245e565b505050565b600082611b158584612463565b1490509392505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a90613ed3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d449190612979565b60405180910390a3505050565b611d5c8484846118a2565b611d68848484846124b9565b611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e90613f65565b60405180910390fd5b50505050565b6060600e8054611dbc90613112565b80601f0160208091040260200160405190810160405280929190818152602001828054611de890613112565b8015611e355780601f10611e0a57610100808354040283529160200191611e35565b820191906000526020600020905b815481529060010190602001808311611e1857829003601f168201915b5050505050905090565b606060008203611e86576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f9a565b600082905060005b60008214611eb8578080611ea190613336565b915050600a82611eb19190613fb4565b9150611e8e565b60008167ffffffffffffffff811115611ed457611ed3612c51565b5b6040519080825280601f01601f191660200182016040528015611f065781602001600182028036833780820191505090505b5090505b60008514611f9357600182611f1f919061390d565b9150600a85611f2e9190613fe5565b6030611f3a9190613296565b60f81b818381518110611f5057611f4f613a81565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f8c9190613fb4565b9450611f0a565b8093505050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611ff584611063565b611fff919061390d565b90506000600760008481526020019081526020016000205490508181146120e4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612169919061390d565b905060006009600084815260200190815260200160002054905060006008838154811061219957612198613a81565b5b9060005260206000200154905080600883815481106121bb576121ba613a81565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061220a57612209614016565b5b6001900381819060005260206000200160009055905550505050565b600061223183611063565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061237057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612380575061237f82612640565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6123fd83836126aa565b61240a60008484846124b9565b612449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244090613f65565b60405180910390fd5b505050565b6124598383836114d4565b505050565b505050565b60008082905060005b84518110156124ae576124998286838151811061248c5761248b613a81565b5b6020026020010151612883565b915080806124a690613336565b91505061246c565b508091505092915050565b60006124da8473ffffffffffffffffffffffffffffffffffffffff166114b1565b15612633578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125036116b0565b8786866040518563ffffffff1660e01b8152600401612525949392919061409a565b6020604051808303816000875af192505050801561256157506040513d601f19601f8201168201806040525081019061255e91906140fb565b60015b6125e3573d8060008114612591576040519150601f19603f3d011682016040523d82523d6000602084013e612596565b606091505b5060008151036125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d290613f65565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612638565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271090614174565b60405180910390fd5b61272281612387565b15612762576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612759906141e0565b60405180910390fd5b61276e6000838361244e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127be9190613296565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461287f6000838361245e565b5050565b600081831061289b5761289682846128ae565b6128a6565b6128a583836128ae565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61290e816128d9565b811461291957600080fd5b50565b60008135905061292b81612905565b92915050565b600060208284031215612947576129466128cf565b5b60006129558482850161291c565b91505092915050565b60008115159050919050565b6129738161295e565b82525050565b600060208201905061298e600083018461296a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129ce5780820151818401526020810190506129b3565b60008484015250505050565b6000601f19601f8301169050919050565b60006129f682612994565b612a00818561299f565b9350612a108185602086016129b0565b612a19816129da565b840191505092915050565b60006020820190508181036000830152612a3e81846129eb565b905092915050565b6000819050919050565b612a5981612a46565b8114612a6457600080fd5b50565b600081359050612a7681612a50565b92915050565b600060208284031215612a9257612a916128cf565b5b6000612aa084828501612a67565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ad482612aa9565b9050919050565b612ae481612ac9565b82525050565b6000602082019050612aff6000830184612adb565b92915050565b612b0e81612ac9565b8114612b1957600080fd5b50565b600081359050612b2b81612b05565b92915050565b60008060408385031215612b4857612b476128cf565b5b6000612b5685828601612b1c565b9250506020612b6785828601612a67565b9150509250929050565b612b7a8161295e565b8114612b8557600080fd5b50565b600081359050612b9781612b71565b92915050565b600060208284031215612bb357612bb26128cf565b5b6000612bc184828501612b88565b91505092915050565b612bd381612a46565b82525050565b6000602082019050612bee6000830184612bca565b92915050565b600080600060608486031215612c0d57612c0c6128cf565b5b6000612c1b86828701612b1c565b9350506020612c2c86828701612b1c565b9250506040612c3d86828701612a67565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c89826129da565b810181811067ffffffffffffffff82111715612ca857612ca7612c51565b5b80604052505050565b6000612cbb6128c5565b9050612cc78282612c80565b919050565b600067ffffffffffffffff821115612ce757612ce6612c51565b5b612cf0826129da565b9050602081019050919050565b82818337600083830152505050565b6000612d1f612d1a84612ccc565b612cb1565b905082815260208101848484011115612d3b57612d3a612c4c565b5b612d46848285612cfd565b509392505050565b600082601f830112612d6357612d62612c47565b5b8135612d73848260208601612d0c565b91505092915050565b600060208284031215612d9257612d916128cf565b5b600082013567ffffffffffffffff811115612db057612daf6128d4565b5b612dbc84828501612d4e565b91505092915050565b600080fd5b600080fd5b60008083601f840112612de557612de4612c47565b5b8235905067ffffffffffffffff811115612e0257612e01612dc5565b5b602083019150836020820283011115612e1e57612e1d612dca565b5b9250929050565b600080600060408486031215612e3e57612e3d6128cf565b5b600084013567ffffffffffffffff811115612e5c57612e5b6128d4565b5b612e6886828701612dcf565b93509350506020612e7b86828701612a67565b9150509250925092565b600060208284031215612e9b57612e9a6128cf565b5b6000612ea984828501612b1c565b91505092915050565b60008060408385031215612ec957612ec86128cf565b5b6000612ed785828601612b1c565b9250506020612ee885828601612b88565b9150509250929050565b600067ffffffffffffffff821115612f0d57612f0c612c51565b5b612f16826129da565b9050602081019050919050565b6000612f36612f3184612ef2565b612cb1565b905082815260208101848484011115612f5257612f51612c4c565b5b612f5d848285612cfd565b509392505050565b600082601f830112612f7a57612f79612c47565b5b8135612f8a848260208601612f23565b91505092915050565b60008060008060808587031215612fad57612fac6128cf565b5b6000612fbb87828801612b1c565b9450506020612fcc87828801612b1c565b9350506040612fdd87828801612a67565b925050606085013567ffffffffffffffff811115612ffe57612ffd6128d4565b5b61300a87828801612f65565b91505092959194509250565b6000819050919050565b61302981613016565b82525050565b60006020820190506130446000830184613020565b92915050565b60008060408385031215613061576130606128cf565b5b600061306f85828601612b1c565b925050602061308085828601612b1c565b9150509250929050565b61309381613016565b811461309e57600080fd5b50565b6000813590506130b08161308a565b92915050565b6000602082840312156130cc576130cb6128cf565b5b60006130da848285016130a1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061312a57607f821691505b60208210810361313d5761313c6130e3565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061319f60218361299f565b91506131aa82613143565b604082019050919050565b600060208201905081810360008301526131ce81613192565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613231603e8361299f565b915061323c826131d5565b604082019050919050565b6000602082019050818103600083015261326081613224565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006132a182612a46565b91506132ac83612a46565b92508282019050808211156132c4576132c3613267565b5b92915050565b7f6d617820737570706c7920657863656564656400000000000000000000000000600082015250565b600061330060138361299f565b915061330b826132ca565b602082019050919050565b6000602082019050818103600083015261332f816132f3565b9050919050565b600061334182612a46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361337357613372613267565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006133da602e8361299f565b91506133e58261337e565b604082019050919050565b60006020820190508181036000830152613409816133cd565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061346c602b8361299f565b915061347782613410565b604082019050919050565b6000602082019050818103600083015261349b8161345f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134c7565b61350e86836134c7565b95508019841693508086168417925050509392505050565b6000819050919050565b600061354b61354661354184612a46565b613526565b612a46565b9050919050565b6000819050919050565b61356583613530565b61357961357182613552565b8484546134d4565b825550505050565b600090565b61358e613581565b61359981848461355c565b505050565b5b818110156135bd576135b2600082613586565b60018101905061359f565b5050565b601f821115613602576135d3816134a2565b6135dc846134b7565b810160208510156135eb578190505b6135ff6135f7856134b7565b83018261359e565b50505b505050565b600082821c905092915050565b600061362560001984600802613607565b1980831691505092915050565b600061363e8383613614565b9150826002028217905092915050565b61365782612994565b67ffffffffffffffff8111156136705761366f612c51565b5b61367a8254613112565b6136858282856135c1565b600060209050601f8311600181146136b857600084156136a6578287015190505b6136b08582613632565b865550613718565b601f1984166136c6866134a2565b60005b828110156136ee578489015182556001820191506020850194506020810190506136c9565b8683101561370b5784890151613707601f891682613614565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613756601f8361299f565b915061376182613720565b602082019050919050565b6000602082019050818103600083015261378581613749565b9050919050565b600081905092915050565b50565b60006137a760008361378c565b91506137b282613797565b600082019050919050565b60006137c88261379a565b9150819050919050565b7f636f6e7472616374206973207061757365640000000000000000000000000000600082015250565b600061380860128361299f565b9150613813826137d2565b602082019050919050565b60006020820190508181036000830152613837816137fb565b9050919050565b7f6d696e74206d6f7265207468616e20352074696d657300000000000000000000600082015250565b600061387460168361299f565b915061387f8261383e565b602082019050919050565b600060208201905081810360008301526138a381613867565b9050919050565b60008160601b9050919050565b60006138c2826138aa565b9050919050565b60006138d4826138b7565b9050919050565b6138ec6138e782612ac9565b6138c9565b82525050565b60006138fe82846138db565b60148201915081905092915050565b600061391882612a46565b915061392383612a46565b925082820390508181111561393b5761393a613267565b5b92915050565b600061394c82612a46565b915061395783612a46565b925082820261396581612a46565b9150828204841483151761397c5761397b613267565b5b5092915050565b7f65746865722076616c756520796f752073656e74206e6f7420636f7272656374600082015250565b60006139b960208361299f565b91506139c482613983565b602082019050919050565b600060208201905081810360008301526139e8816139ac565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613a4b602c8361299f565b9150613a56826139ef565b604082019050919050565b60006020820190508181036000830152613a7a81613a3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ae660188361299f565b9150613af182613ab0565b602082019050919050565b60006020820190508181036000830152613b1581613ad9565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613b7860298361299f565b9150613b8382613b1c565b604082019050919050565b60006020820190508181036000830152613ba781613b6b565b9050919050565b600081905092915050565b6000613bc482612994565b613bce8185613bae565b9350613bde8185602086016129b0565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613c20600583613bae565b9150613c2b82613bea565b600582019050919050565b6000613c428285613bb9565b9150613c4e8284613bb9565b9150613c5982613c13565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613cc160268361299f565b9150613ccc82613c65565b604082019050919050565b60006020820190508181036000830152613cf081613cb4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d2d60208361299f565b9150613d3882613cf7565b602082019050919050565b60006020820190508181036000830152613d5c81613d20565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613dbf60258361299f565b9150613dca82613d63565b604082019050919050565b60006020820190508181036000830152613dee81613db2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613e5160248361299f565b9150613e5c82613df5565b604082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613ebd60198361299f565b9150613ec882613e87565b602082019050919050565b60006020820190508181036000830152613eec81613eb0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613f4f60328361299f565b9150613f5a82613ef3565b604082019050919050565b60006020820190508181036000830152613f7e81613f42565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613fbf82612a46565b9150613fca83612a46565b925082613fda57613fd9613f85565b5b828204905092915050565b6000613ff082612a46565b9150613ffb83612a46565b92508261400b5761400a613f85565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061406c82614045565b6140768185614050565b93506140868185602086016129b0565b61408f816129da565b840191505092915050565b60006080820190506140af6000830187612adb565b6140bc6020830186612adb565b6140c96040830185612bca565b81810360608301526140db8184614061565b905095945050505050565b6000815190506140f581612905565b92915050565b600060208284031215614111576141106128cf565b5b600061411f848285016140e6565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061415e60208361299f565b915061416982614128565b602082019050919050565b6000602082019050818103600083015261418d81614151565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006141ca601c8361299f565b91506141d582614194565b602082019050919050565b600060208201905081810360008301526141f9816141bd565b905091905056fea2646970667358221220ad1abcdbae674c00de5c3081c0ad9840113a6e40b727357f01fe84047fc8b7df64736f6c6343000811003300000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000000605f5169bf56eede430e2e98a0ee5dc952366e670f025e7bf2cd026e5d84d8455d0000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696776656334627367706d70786d73736a79376c756d6d616b6b746b66777133336a7035746f7777676c6e7a6366636a7a757364342f0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101c25760003560e01c80635c975abb116100f7578063b88d4fde11610095578063d5abeb0111610064578063d5abeb0114610631578063e985e9c51461065c578063f2fde38b14610699578063f91eb630146106c2576101c2565b8063b88d4fde14610575578063c87b56dd1461059e578063d4a417e6146105db578063d547cfb714610606576101c2565b8063715018a6116100d1578063715018a6146104df5780638da5cb5b146104f657806395d89b4114610521578063a22cb4651461054c576101c2565b80635c975abb1461043a5780636352211e1461046557806370a08231146104a2576101c2565b806323b872dd116101645780633ccfd60b1161013e5780633ccfd60b146103a157806342842e0e146103b857806345de0d9b146103e15780634f6ccce7146103fd576101c2565b806323b872dd146103125780632f745c591461033b57806330176e1314610378576101c2565b8063095ea7b3116101a0578063095ea7b31461026c5780630d3c69b41461029557806316c38b3c146102be57806318160ddd146102e7576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612931565b6106eb565b6040516101fb9190612979565b60405180910390f35b34801561021057600080fd5b506102196106fd565b6040516102269190612a24565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612a7c565b61078f565b6040516102639190612aea565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612b31565b6107d5565b005b3480156102a157600080fd5b506102bc60048036038101906102b79190612a7c565b6108ec565b005b3480156102ca57600080fd5b506102e560048036038101906102e09190612b9d565b610996565b005b3480156102f357600080fd5b506102fc6109bb565b6040516103099190612bd9565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612bf4565b6109c8565b005b34801561034757600080fd5b50610362600480360381019061035d9190612b31565b610a28565b60405161036f9190612bd9565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612d7c565b610acd565b005b3480156103ad57600080fd5b506103b6610ae8565b005b3480156103c457600080fd5b506103df60048036038101906103da9190612bf4565b610bc5565b005b6103fb60048036038101906103f69190612e25565b610be5565b005b34801561040957600080fd5b50610424600480360381019061041f9190612a7c565b610f2e565b6040516104319190612bd9565b60405180910390f35b34801561044657600080fd5b5061044f610f9f565b60405161045c9190612979565b60405180910390f35b34801561047157600080fd5b5061048c60048036038101906104879190612a7c565b610fb2565b6040516104999190612aea565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190612e85565b611063565b6040516104d69190612bd9565b60405180910390f35b3480156104eb57600080fd5b506104f461111a565b005b34801561050257600080fd5b5061050b61112e565b6040516105189190612aea565b60405180910390f35b34801561052d57600080fd5b50610536611158565b6040516105439190612a24565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190612eb2565b6111ea565b005b34801561058157600080fd5b5061059c60048036038101906105979190612f93565b611200565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190612a7c565b611262565b6040516105d29190612a24565b60405180910390f35b3480156105e757600080fd5b506105f06112ca565b6040516105fd919061302f565b60405180910390f35b34801561061257600080fd5b5061061b6112d0565b6040516106289190612a24565b60405180910390f35b34801561063d57600080fd5b5061064661135e565b6040516106539190612bd9565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e919061304a565b611364565b6040516106909190612979565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190612e85565b6113f8565b005b3480156106ce57600080fd5b506106e960048036038101906106e491906130b6565b61147b565b005b60006106f6826115eb565b9050919050565b60606000805461070c90613112565b80601f016020809104026020016040519081016040528092919081815260200182805461073890613112565b80156107855780601f1061075a57610100808354040283529160200191610785565b820191906000526020600020905b81548152906001019060200180831161076857829003601f168201915b5050505050905090565b600061079a82611665565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e082610fb2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610850576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610847906131b5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661086f6116b0565b73ffffffffffffffffffffffffffffffffffffffff16148061089e575061089d816108986116b0565b611364565b5b6108dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d490613247565b60405180910390fd5b6108e783836116b8565b505050565b6108f4611771565b600f54816109006109bb565b61090a9190613296565b1061094a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094190613316565b60405180910390fd5b60005b818110156109925761095f600c61148d565b600061096b600c6114a3565b905061097e6109786116b0565b826117ef565b50808061098a90613336565b91505061094d565b5050565b61099e611771565b80601060006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b6109d96109d36116b0565b8261180d565b610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f906133f0565b60405180910390fd5b610a238383836118a2565b505050565b6000610a3383611063565b8210610a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6b90613482565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ad5611771565b80600e9081610ae4919061364e565b5050565b610af0611771565b6002600b5403610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c9061376c565b60405180910390fd5b6002600b819055506000610b4761112e565b73ffffffffffffffffffffffffffffffffffffffff1647604051610b6a906137bd565b60006040518083038185875af1925050503d8060008114610ba7576040519150601f19603f3d011682016040523d82523d6000602084013e610bac565b606091505b5050905080610bba57600080fd5b506001600b81905550565b610be083838360405180602001604052806000815250611200565b505050565b806000610bf8610bf36116b0565b611063565b9050601060009054906101000a900460ff1615610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c419061381e565b60405180910390fd5b60058110610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c849061388a565b60405180910390fd5b60058183610c9b9190613296565b1115610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd39061388a565b60405180910390fd5b600f54610ce76109bb565b10610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e90613316565b60405180910390fd5b6000610da4868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54610d796116b0565b604051602001610d8991906138f2565b60405160208183030381529060405280519060200120611b08565b90506000610db8610db36116b0565b611063565b90508115610e875760008103610e2d5734600186610dd6919061390d565b6619945ca2620000610de89190613941565b14610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f906139cf565b60405180910390fd5b610e82565b34856619945ca2620000610e419190613941565b14610e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e78906139cf565b60405180910390fd5b5b610edc565b34856619945ca2620000610e9b9190613941565b14610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed2906139cf565b60405180910390fd5b5b60005b85811015610f2457610ef1600c61148d565b6000610efd600c6114a3565b9050610f10610f0a6116b0565b826117ef565b508080610f1c90613336565b915050610edf565b5050505050505050565b6000610f386109bb565b8210610f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7090613a61565b60405180910390fd5b60088281548110610f8d57610f8c613a81565b5b90600052602060002001549050919050565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105190613afc565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca90613b8e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611122611771565b61112c6000611b1f565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116790613112565b80601f016020809104026020016040519081016040528092919081815260200182805461119390613112565b80156111e05780601f106111b5576101008083540402835291602001916111e0565b820191906000526020600020905b8154815290600101906020018083116111c357829003601f168201915b5050505050905090565b6111fc6111f56116b0565b8383611be5565b5050565b61121161120b6116b0565b8361180d565b611250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611247906133f0565b60405180910390fd5b61125c84848484611d51565b50505050565b606061126d82611665565b6000611277611dad565b9050600081511161129757604051806020016040528060008152506112c2565b806112a184611e3f565b6040516020016112b2929190613c36565b6040516020818303038152906040525b915050919050565b600d5481565b600e80546112dd90613112565b80601f016020809104026020016040519081016040528092919081815260200182805461130990613112565b80156113565780601f1061132b57610100808354040283529160200191611356565b820191906000526020600020905b81548152906001019060200180831161133957829003601f168201915b505050505081565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611400611771565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361146f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146690613cd7565b60405180910390fd5b61147881611b1f565b50565b611483611771565b80600d8190555050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6114df8383836115e6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115215761151c81611f9f565b611560565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461155f5761155e8382611fe8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a25761159d81612155565b6115e1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146115e0576115df8282612226565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061165e575061165d826122a5565b5b9050919050565b61166e81612387565b6116ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a490613afc565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661172b83610fb2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6117796116b0565b73ffffffffffffffffffffffffffffffffffffffff1661179761112e565b73ffffffffffffffffffffffffffffffffffffffff16146117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e490613d43565b60405180910390fd5b565b6118098282604051806020016040528060008152506123f3565b5050565b60008061181983610fb2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061185b575061185a8185611364565b5b8061189957508373ffffffffffffffffffffffffffffffffffffffff166118818461078f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118c282610fb2565b73ffffffffffffffffffffffffffffffffffffffff1614611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90613dd5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e90613e67565b60405180910390fd5b61199283838361244e565b61199d6000826116b8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119ed919061390d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a449190613296565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b0383838361245e565b505050565b600082611b158584612463565b1490509392505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a90613ed3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d449190612979565b60405180910390a3505050565b611d5c8484846118a2565b611d68848484846124b9565b611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e90613f65565b60405180910390fd5b50505050565b6060600e8054611dbc90613112565b80601f0160208091040260200160405190810160405280929190818152602001828054611de890613112565b8015611e355780601f10611e0a57610100808354040283529160200191611e35565b820191906000526020600020905b815481529060010190602001808311611e1857829003601f168201915b5050505050905090565b606060008203611e86576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f9a565b600082905060005b60008214611eb8578080611ea190613336565b915050600a82611eb19190613fb4565b9150611e8e565b60008167ffffffffffffffff811115611ed457611ed3612c51565b5b6040519080825280601f01601f191660200182016040528015611f065781602001600182028036833780820191505090505b5090505b60008514611f9357600182611f1f919061390d565b9150600a85611f2e9190613fe5565b6030611f3a9190613296565b60f81b818381518110611f5057611f4f613a81565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f8c9190613fb4565b9450611f0a565b8093505050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611ff584611063565b611fff919061390d565b90506000600760008481526020019081526020016000205490508181146120e4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612169919061390d565b905060006009600084815260200190815260200160002054905060006008838154811061219957612198613a81565b5b9060005260206000200154905080600883815481106121bb576121ba613a81565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061220a57612209614016565b5b6001900381819060005260206000200160009055905550505050565b600061223183611063565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061237057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612380575061237f82612640565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6123fd83836126aa565b61240a60008484846124b9565b612449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244090613f65565b60405180910390fd5b505050565b6124598383836114d4565b505050565b505050565b60008082905060005b84518110156124ae576124998286838151811061248c5761248b613a81565b5b6020026020010151612883565b915080806124a690613336565b91505061246c565b508091505092915050565b60006124da8473ffffffffffffffffffffffffffffffffffffffff166114b1565b15612633578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125036116b0565b8786866040518563ffffffff1660e01b8152600401612525949392919061409a565b6020604051808303816000875af192505050801561256157506040513d601f19601f8201168201806040525081019061255e91906140fb565b60015b6125e3573d8060008114612591576040519150601f19603f3d011682016040523d82523d6000602084013e612596565b606091505b5060008151036125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d290613f65565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612638565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271090614174565b60405180910390fd5b61272281612387565b15612762576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612759906141e0565b60405180910390fd5b61276e6000838361244e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127be9190613296565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461287f6000838361245e565b5050565b600081831061289b5761289682846128ae565b6128a6565b6128a583836128ae565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61290e816128d9565b811461291957600080fd5b50565b60008135905061292b81612905565b92915050565b600060208284031215612947576129466128cf565b5b60006129558482850161291c565b91505092915050565b60008115159050919050565b6129738161295e565b82525050565b600060208201905061298e600083018461296a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129ce5780820151818401526020810190506129b3565b60008484015250505050565b6000601f19601f8301169050919050565b60006129f682612994565b612a00818561299f565b9350612a108185602086016129b0565b612a19816129da565b840191505092915050565b60006020820190508181036000830152612a3e81846129eb565b905092915050565b6000819050919050565b612a5981612a46565b8114612a6457600080fd5b50565b600081359050612a7681612a50565b92915050565b600060208284031215612a9257612a916128cf565b5b6000612aa084828501612a67565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ad482612aa9565b9050919050565b612ae481612ac9565b82525050565b6000602082019050612aff6000830184612adb565b92915050565b612b0e81612ac9565b8114612b1957600080fd5b50565b600081359050612b2b81612b05565b92915050565b60008060408385031215612b4857612b476128cf565b5b6000612b5685828601612b1c565b9250506020612b6785828601612a67565b9150509250929050565b612b7a8161295e565b8114612b8557600080fd5b50565b600081359050612b9781612b71565b92915050565b600060208284031215612bb357612bb26128cf565b5b6000612bc184828501612b88565b91505092915050565b612bd381612a46565b82525050565b6000602082019050612bee6000830184612bca565b92915050565b600080600060608486031215612c0d57612c0c6128cf565b5b6000612c1b86828701612b1c565b9350506020612c2c86828701612b1c565b9250506040612c3d86828701612a67565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c89826129da565b810181811067ffffffffffffffff82111715612ca857612ca7612c51565b5b80604052505050565b6000612cbb6128c5565b9050612cc78282612c80565b919050565b600067ffffffffffffffff821115612ce757612ce6612c51565b5b612cf0826129da565b9050602081019050919050565b82818337600083830152505050565b6000612d1f612d1a84612ccc565b612cb1565b905082815260208101848484011115612d3b57612d3a612c4c565b5b612d46848285612cfd565b509392505050565b600082601f830112612d6357612d62612c47565b5b8135612d73848260208601612d0c565b91505092915050565b600060208284031215612d9257612d916128cf565b5b600082013567ffffffffffffffff811115612db057612daf6128d4565b5b612dbc84828501612d4e565b91505092915050565b600080fd5b600080fd5b60008083601f840112612de557612de4612c47565b5b8235905067ffffffffffffffff811115612e0257612e01612dc5565b5b602083019150836020820283011115612e1e57612e1d612dca565b5b9250929050565b600080600060408486031215612e3e57612e3d6128cf565b5b600084013567ffffffffffffffff811115612e5c57612e5b6128d4565b5b612e6886828701612dcf565b93509350506020612e7b86828701612a67565b9150509250925092565b600060208284031215612e9b57612e9a6128cf565b5b6000612ea984828501612b1c565b91505092915050565b60008060408385031215612ec957612ec86128cf565b5b6000612ed785828601612b1c565b9250506020612ee885828601612b88565b9150509250929050565b600067ffffffffffffffff821115612f0d57612f0c612c51565b5b612f16826129da565b9050602081019050919050565b6000612f36612f3184612ef2565b612cb1565b905082815260208101848484011115612f5257612f51612c4c565b5b612f5d848285612cfd565b509392505050565b600082601f830112612f7a57612f79612c47565b5b8135612f8a848260208601612f23565b91505092915050565b60008060008060808587031215612fad57612fac6128cf565b5b6000612fbb87828801612b1c565b9450506020612fcc87828801612b1c565b9350506040612fdd87828801612a67565b925050606085013567ffffffffffffffff811115612ffe57612ffd6128d4565b5b61300a87828801612f65565b91505092959194509250565b6000819050919050565b61302981613016565b82525050565b60006020820190506130446000830184613020565b92915050565b60008060408385031215613061576130606128cf565b5b600061306f85828601612b1c565b925050602061308085828601612b1c565b9150509250929050565b61309381613016565b811461309e57600080fd5b50565b6000813590506130b08161308a565b92915050565b6000602082840312156130cc576130cb6128cf565b5b60006130da848285016130a1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061312a57607f821691505b60208210810361313d5761313c6130e3565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061319f60218361299f565b91506131aa82613143565b604082019050919050565b600060208201905081810360008301526131ce81613192565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613231603e8361299f565b915061323c826131d5565b604082019050919050565b6000602082019050818103600083015261326081613224565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006132a182612a46565b91506132ac83612a46565b92508282019050808211156132c4576132c3613267565b5b92915050565b7f6d617820737570706c7920657863656564656400000000000000000000000000600082015250565b600061330060138361299f565b915061330b826132ca565b602082019050919050565b6000602082019050818103600083015261332f816132f3565b9050919050565b600061334182612a46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361337357613372613267565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006133da602e8361299f565b91506133e58261337e565b604082019050919050565b60006020820190508181036000830152613409816133cd565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061346c602b8361299f565b915061347782613410565b604082019050919050565b6000602082019050818103600083015261349b8161345f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134c7565b61350e86836134c7565b95508019841693508086168417925050509392505050565b6000819050919050565b600061354b61354661354184612a46565b613526565b612a46565b9050919050565b6000819050919050565b61356583613530565b61357961357182613552565b8484546134d4565b825550505050565b600090565b61358e613581565b61359981848461355c565b505050565b5b818110156135bd576135b2600082613586565b60018101905061359f565b5050565b601f821115613602576135d3816134a2565b6135dc846134b7565b810160208510156135eb578190505b6135ff6135f7856134b7565b83018261359e565b50505b505050565b600082821c905092915050565b600061362560001984600802613607565b1980831691505092915050565b600061363e8383613614565b9150826002028217905092915050565b61365782612994565b67ffffffffffffffff8111156136705761366f612c51565b5b61367a8254613112565b6136858282856135c1565b600060209050601f8311600181146136b857600084156136a6578287015190505b6136b08582613632565b865550613718565b601f1984166136c6866134a2565b60005b828110156136ee578489015182556001820191506020850194506020810190506136c9565b8683101561370b5784890151613707601f891682613614565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613756601f8361299f565b915061376182613720565b602082019050919050565b6000602082019050818103600083015261378581613749565b9050919050565b600081905092915050565b50565b60006137a760008361378c565b91506137b282613797565b600082019050919050565b60006137c88261379a565b9150819050919050565b7f636f6e7472616374206973207061757365640000000000000000000000000000600082015250565b600061380860128361299f565b9150613813826137d2565b602082019050919050565b60006020820190508181036000830152613837816137fb565b9050919050565b7f6d696e74206d6f7265207468616e20352074696d657300000000000000000000600082015250565b600061387460168361299f565b915061387f8261383e565b602082019050919050565b600060208201905081810360008301526138a381613867565b9050919050565b60008160601b9050919050565b60006138c2826138aa565b9050919050565b60006138d4826138b7565b9050919050565b6138ec6138e782612ac9565b6138c9565b82525050565b60006138fe82846138db565b60148201915081905092915050565b600061391882612a46565b915061392383612a46565b925082820390508181111561393b5761393a613267565b5b92915050565b600061394c82612a46565b915061395783612a46565b925082820261396581612a46565b9150828204841483151761397c5761397b613267565b5b5092915050565b7f65746865722076616c756520796f752073656e74206e6f7420636f7272656374600082015250565b60006139b960208361299f565b91506139c482613983565b602082019050919050565b600060208201905081810360008301526139e8816139ac565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613a4b602c8361299f565b9150613a56826139ef565b604082019050919050565b60006020820190508181036000830152613a7a81613a3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ae660188361299f565b9150613af182613ab0565b602082019050919050565b60006020820190508181036000830152613b1581613ad9565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613b7860298361299f565b9150613b8382613b1c565b604082019050919050565b60006020820190508181036000830152613ba781613b6b565b9050919050565b600081905092915050565b6000613bc482612994565b613bce8185613bae565b9350613bde8185602086016129b0565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613c20600583613bae565b9150613c2b82613bea565b600582019050919050565b6000613c428285613bb9565b9150613c4e8284613bb9565b9150613c5982613c13565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613cc160268361299f565b9150613ccc82613c65565b604082019050919050565b60006020820190508181036000830152613cf081613cb4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d2d60208361299f565b9150613d3882613cf7565b602082019050919050565b60006020820190508181036000830152613d5c81613d20565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613dbf60258361299f565b9150613dca82613d63565b604082019050919050565b60006020820190508181036000830152613dee81613db2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613e5160248361299f565b9150613e5c82613df5565b604082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613ebd60198361299f565b9150613ec882613e87565b602082019050919050565b60006020820190508181036000830152613eec81613eb0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613f4f60328361299f565b9150613f5a82613ef3565b604082019050919050565b60006020820190508181036000830152613f7e81613f42565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613fbf82612a46565b9150613fca83612a46565b925082613fda57613fd9613f85565b5b828204905092915050565b6000613ff082612a46565b9150613ffb83612a46565b92508261400b5761400a613f85565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061406c82614045565b6140768185614050565b93506140868185602086016129b0565b61408f816129da565b840191505092915050565b60006080820190506140af6000830187612adb565b6140bc6020830186612adb565b6140c96040830185612bca565b81810360608301526140db8184614061565b905095945050505050565b6000815190506140f581612905565b92915050565b600060208284031215614111576141106128cf565b5b600061411f848285016140e6565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061415e60208361299f565b915061416982614128565b602082019050919050565b6000602082019050818103600083015261418d81614151565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006141ca601c8361299f565b91506141d582614194565b602082019050919050565b600060208201905081810360008301526141f9816141bd565b905091905056fea2646970667358221220ad1abcdbae674c00de5c3081c0ad9840113a6e40b727357f01fe84047fc8b7df64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000000605f5169bf56eede430e2e98a0ee5dc952366e670f025e7bf2cd026e5d84d8455d0000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696776656334627367706d70786d73736a79376c756d6d616b6b746b66777133336a7035746f7777676c6e7a6366636a7a757364342f0000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _maxSupply (uint256): 1500
Arg [1] : _baseTokenURI (string): ipfs://bafybeigvec4bsgpmpxmssjy7lummakktkfwq33jp5towwglnzcfcjzusd4/
Arg [2] : merkleRoot (bytes32): 0x5f5169bf56eede430e2e98a0ee5dc952366e670f025e7bf2cd026e5d84d8455d
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000005dc
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 5f5169bf56eede430e2e98a0ee5dc952366e670f025e7bf2cd026e5d84d8455d
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [4] : 697066733a2f2f626166796265696776656334627367706d70786d73736a7937
Arg [5] : 6c756d6d616b6b746b66777133336a7035746f7777676c6e7a6366636a7a7573
Arg [6] : 64342f0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
1803:3463:27:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5095:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2470:98:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3935:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3467:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3637:334:27;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4514:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1615:111:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4612:327:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1291:253:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4392:116:27;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4717:157;;;;;;;;;;;;;:::i;:::-;;5005:179:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2740:891:27;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1798:230:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2071:26:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2190:218:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1929:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;1201:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2632:102:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4169:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5250:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4094:292:27;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1974:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2009:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2041:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4388:162:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4603:108:27;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5095:169;5198:4;5221:36;5245:11;5221:23;:36::i;:::-;5214:43;;5095:169;;;:::o;2470:98:9:-;2524:13;2556:5;2549:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2470:98;:::o;3935:167::-;4011:7;4030:23;4045:7;4030:14;:23::i;:::-;4071:15;:24;4087:7;4071:24;;;;;;;;;;;;;;;;;;;;;4064:31;;3935:167;;;:::o;3467:407::-;3547:13;3563:23;3578:7;3563:14;:23::i;:::-;3547:39;;3610:5;3604:11;;:2;:11;;;3596:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3701:5;3685:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3710:37;3727:5;3734:12;:10;:12::i;:::-;3710:16;:37::i;:::-;3685:62;3664:171;;;;;;;;;;;;:::i;:::-;;;;;;;;;3846:21;3855:2;3859:7;3846:8;:21::i;:::-;3537:337;3467:407;;:::o;3637:334:27:-;1094:13:0;:11;:13::i;:::-;3733:9:27::1;;3723:7;3707:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:35;3699:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3781:9;3776:189;3800:7;3796:1;:11;3776:189;;;3828:26;:14;:24;:26::i;:::-;3868:14;3885:24;:14;:22;:24::i;:::-;3868:41;;3923:31;3933:12;:10;:12::i;:::-;3947:6;3923:9;:31::i;:::-;3814:151;3809:3;;;;;:::i;:::-;;;;3776:189;;;;3637:334:::0;:::o;4514:83::-;1094:13:0;:11;:13::i;:::-;4583:7:27::1;4574:6;;:16;;;;;;;;;;;;;;;;;;4514:83:::0;:::o;1615:111:12:-;1676:7;1702:10;:17;;;;1695:24;;1615:111;:::o;4612:327:9:-;4801:41;4820:12;:10;:12::i;:::-;4834:7;4801:18;:41::i;:::-;4793:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;4904:28;4914:4;4920:2;4924:7;4904:9;:28::i;:::-;4612:327;;;:::o;1291:253:12:-;1388:7;1423:23;1440:5;1423:16;:23::i;:::-;1415:5;:31;1407:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1511:12;:19;1524:5;1511:19;;;;;;;;;;;;;;;:26;1531:5;1511:26;;;;;;;;;;;;1504:33;;1291:253;;;;:::o;4392:116:27:-;1094:13:0;:11;:13::i;:::-;4488::27::1;4473:12;:28;;;;;;:::i;:::-;;4392:116:::0;:::o;4717:157::-;1094:13:0;:11;:13::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;4778:7:27::2;4799;:5;:7::i;:::-;4791:21;;4820;4791:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4777:69;;;4864:2;4856:11;;;::::0;::::2;;4767:107;1701:1:2::1;2628:7;:22;;;;4717:157:27:o:0;5005:179:9:-;5138:39;5155:4;5161:2;5165:7;5138:39;;;;;;;;;;;;:16;:39::i;:::-;5005:179;;;:::o;2740:891:27:-;2829:6;2438:15;2456:23;2466:12;:10;:12::i;:::-;2456:9;:23::i;:::-;2438:41;;2498:6;;;;;;;;;;;2497:7;2489:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;2555:1;2545:7;:11;2537:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2621:1;2610:7;2601:6;:16;;;;:::i;:::-;:21;;2593:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2683:9;;2667:13;:11;:13::i;:::-;:25;2659:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;2847:16:::1;2866:90;2885:11;;2866:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2898:14;;2941:12;:10;:12::i;:::-;2924:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;2914:41;;;;;;2866:18;:90::i;:::-;2847:109;;2966:15;2984:23;2994:12;:10;:12::i;:::-;2984:9;:23::i;:::-;2966:41;;3021:11;3017:411;;;3063:1;3052:7;:12:::0;3048:258:::1;;3125:9;3118:1;3109:6;:10;;;;:::i;:::-;3093:12;:27;;;;:::i;:::-;3092:42;3084:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;3048:258;;;3245:9;3234:6;3219:12;:21;;;;:::i;:::-;3218:36;3210:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;3048:258;3017:411;;;3371:9;3360:6;3345:12;:21;;;;:::i;:::-;3344:36;3336:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;3017:411;3442:9;3437:188;3461:6;3457:1;:10;3437:188;;;3488:26;:14;:24;:26::i;:::-;3528:14;3545:24;:14;:22;:24::i;:::-;3528:41;;3583:31;3593:12;:10;:12::i;:::-;3607:6;3583:9;:31::i;:::-;3474:151;3469:3;;;;;:::i;:::-;;;;3437:188;;;;2837:794;;2428:306:::0;2740:891;;;;:::o;1798:230:12:-;1873:7;1908:30;:28;:30::i;:::-;1900:5;:38;1892:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2004:10;2015:5;2004:17;;;;;;;;:::i;:::-;;;;;;;;;;1997:24;;1798:230;;;:::o;2071:26:27:-;;;;;;;;;;;;;:::o;2190:218:9:-;2262:7;2281:13;2297:7;:16;2305:7;2297:16;;;;;;;;;;;;;;;;;;;;;2281:32;;2348:1;2331:19;;:5;:19;;;2323:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2396:5;2389:12;;;2190:218;;;:::o;1929:204::-;2001:7;2045:1;2028:19;;:5;:19;;;2020:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2110:9;:16;2120:5;2110:16;;;;;;;;;;;;;;;;2103:23;;1929:204;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1201:85::-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;2632:102:9:-;2688:13;2720:7;2713:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2632:102;:::o;4169:153::-;4263:52;4282:12;:10;:12::i;:::-;4296:8;4306;4263:18;:52::i;:::-;4169:153;;:::o;5250:315::-;5418:41;5437:12;:10;:12::i;:::-;5451:7;5418:18;:41::i;:::-;5410:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;5520:38;5534:4;5540:2;5544:7;5553:4;5520:13;:38::i;:::-;5250:315;;;;:::o;4094:292:27:-;4167:13;4192:23;4207:7;4192:14;:23::i;:::-;4226:21;4250:10;:8;:10::i;:::-;4226:34;;4301:1;4283:7;4277:21;:25;:102;;;;;;;;;;;;;;;;;4329:7;4338:25;4355:7;4338:16;:25::i;:::-;4312:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4277:102;4270:109;;;4094:292;;;:::o;1974:29::-;;;;:::o;2009:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2041:24::-;;;;:::o;4388:162:9:-;4485:4;4508:18;:25;4527:5;4508:25;;;;;;;;;;;;;;;:35;4534:8;4508:35;;;;;;;;;;;;;;;;;;;;;;;;;4501:42;;4388:162;;;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;::::0;2161:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;4603:108:27:-;1094:13:0;:11;:13::i;:::-;4694:10:27::1;4677:14;:27;;;;4603:108:::0;:::o;945:123:17:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;827:112::-;892:7;918;:14;;;911:21;;827:112;;;:::o;1175:320:15:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;2624:572:12:-;2763:45;2790:4;2796:2;2800:7;2763:26;:45::i;:::-;2839:1;2823:18;;:4;:18;;;2819:183;;2857:40;2889:7;2857:31;:40::i;:::-;2819:183;;;2926:2;2918:10;;:4;:10;;;2914:88;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;2914:88;2819:183;3029:1;3015:16;;:2;:16;;;3011:179;;3047:45;3084:7;3047:36;:45::i;:::-;3011:179;;;3119:4;3113:10;;:2;:10;;;3109:81;;3139:40;3167:2;3171:7;3139:27;:40::i;:::-;3109:81;3011:179;2624:572;;;:::o;13729:122:9:-;;;;:::o;990:222:12:-;1092:4;1130:35;1115:50;;;:11;:50;;;;:90;;;;1169:36;1193:11;1169:23;:36::i;:::-;1115:90;1108:97;;990:222;;;:::o;11657:133:9:-;11738:16;11746:7;11738;:16::i;:::-;11730:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;11657:133;:::o;640:96:16:-;693:7;719:10;712:17;;640:96;:::o;10959:171:9:-;11060:2;11033:15;:24;11049:7;11033:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11115:7;11111:2;11077:46;;11086:23;11101:7;11086:14;:23::i;:::-;11077:46;;;;;;;;;;;;10959:171;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;7908:108:9:-;7983:26;7993:2;7997:7;7983:26;;;;;;;;;;;;:9;:26::i;:::-;7908:108;;:::o;7317:261::-;7410:4;7426:13;7442:23;7457:7;7442:14;:23::i;:::-;7426:39;;7494:5;7483:16;;:7;:16;;;:52;;;;7503:32;7520:5;7527:7;7503:16;:32::i;:::-;7483:52;:87;;;;7563:7;7539:31;;:20;7551:7;7539:11;:20::i;:::-;:31;;;7483:87;7475:96;;;7317:261;;;;:::o;10242:605::-;10396:4;10369:31;;:23;10384:7;10369:14;:23::i;:::-;:31;;;10361:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10474:1;10460:16;;:2;:16;;;10452:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10528:39;10549:4;10555:2;10559:7;10528:20;:39::i;:::-;10629:29;10646:1;10650:7;10629:8;:29::i;:::-;10688:1;10669:9;:15;10679:4;10669:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10716:1;10699:9;:13;10709:2;10699:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10746:2;10727:7;:16;10735:7;10727:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10783:7;10779:2;10764:27;;10773:4;10764:27;;;;;;;;;;;;10802:38;10822:4;10828:2;10832:7;10802:19;:38::i;:::-;10242:605;;;:::o;1153:184:19:-;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;1290:40;;1153:184;;;;;:::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;11266:307:9:-;11416:8;11407:17;;:5;:17;;;11399:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11502:8;11464:18;:25;11483:5;11464:25;;;;;;;;;;;;;;;:35;11490:8;11464:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11547:8;11525:41;;11540:5;11525:41;;;11557:8;11525:41;;;;;;:::i;:::-;;;;;;;;11266:307;;;:::o;6426:305::-;6576:28;6586:4;6592:2;6596:7;6576:9;:28::i;:::-;6622:47;6645:4;6651:2;6655:7;6664:4;6622:22;:47::i;:::-;6614:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;6426:305;;;;:::o;3977:111:27:-;4037:13;4069:12;4062:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3977:111;:::o;392:703:18:-;448:13;674:1;665:5;:10;661:51;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;3902:161:12:-;4005:10;:17;;;;3978:15;:24;3994:7;3978:24;;;;;;;;;;;:44;;;;4032:10;4048:7;4032:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3902:161;:::o;4680:970::-;4942:22;4992:1;4967:22;4984:4;4967:16;:22::i;:::-;:26;;;;:::i;:::-;4942:51;;5003:18;5024:17;:26;5042:7;5024:26;;;;;;;;;;;;5003:47;;5168:14;5154:10;:28;5150:323;;5198:19;5220:12;:18;5233:4;5220:18;;;;;;;;;;;;;;;:34;5239:14;5220:34;;;;;;;;;;;;5198:56;;5302:11;5269:12;:18;5282:4;5269:18;;;;;;;;;;;;;;;:30;5288:10;5269:30;;;;;;;;;;;:44;;;;5418:10;5385:17;:30;5403:11;5385:30;;;;;;;;;;;:43;;;;5184:289;5150:323;5566:17;:26;5584:7;5566:26;;;;;;;;;;;5559:33;;;5609:12;:18;5622:4;5609:18;;;;;;;;;;;;;;;:34;5628:14;5609:34;;;;;;;;;;;5602:41;;;4761:889;;4680:970;;:::o;5938:1061::-;6187:22;6232:1;6212:10;:17;;;;:21;;;;:::i;:::-;6187:46;;6243:18;6264:15;:24;6280:7;6264:24;;;;;;;;;;;;6243:45;;6610:19;6632:10;6643:14;6632:26;;;;;;;;:::i;:::-;;;;;;;;;;6610:48;;6694:11;6669:10;6680;6669:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6804:10;6773:15;:28;6789:11;6773:28;;;;;;;;;;;:41;;;;6942:15;:24;6958:7;6942:24;;;;;;;;;;;6935:31;;;6976:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6009:990;;;5938:1061;:::o;3490:217::-;3574:14;3591:20;3608:2;3591:16;:20::i;:::-;3574:37;;3648:7;3621:12;:16;3634:2;3621:16;;;;;;;;;;;;;;;:24;3638:6;3621:24;;;;;;;;;;;:34;;;;3694:6;3665:17;:26;3683:7;3665:26;;;;;;;;;;;:35;;;;3564:143;3490:217;;:::o;1570:300:9:-;1672:4;1722:25;1707:40;;;:11;:40;;;;:104;;;;1778:33;1763:48;;;:11;:48;;;;1707:104;:156;;;;1827:36;1851:11;1827:23;:36::i;:::-;1707:156;1688:175;;1570:300;;;:::o;7034:125::-;7099:4;7150:1;7122:30;;:7;:16;7130:7;7122:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7115:37;;7034:125;;;:::o;8237:309::-;8361:18;8367:2;8371:7;8361:5;:18::i;:::-;8410:53;8441:1;8445:2;8449:7;8458:4;8410:22;:53::i;:::-;8389:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;8237:309;;;:::o;4880:209:27:-;5037:45;5064:4;5070:2;5074:7;5037:26;:45::i;:::-;4880:209;;;:::o;14223:121:9:-;;;;:::o;1991:290:19:-;2074:7;2093:20;2116:4;2093:27;;2135:9;2130:116;2154:5;:12;2150:1;:16;2130:116;;;2202:33;2212:12;2226:5;2232:1;2226:8;;;;;;;;:::i;:::-;;;;;;;;2202:9;:33::i;:::-;2187:48;;2168:3;;;;;:::i;:::-;;;;2130:116;;;;2262:12;2255:19;;;1991:290;;;;:::o;12342:831:9:-;12491:4;12511:15;:2;:13;;;:15::i;:::-;12507:660;;;12562:2;12546:36;;;12583:12;:10;:12::i;:::-;12597:4;12603:7;12612:4;12546:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12542:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12801:1;12784:6;:13;:18;12780:321;;12826:60;;;;;;;;;;:::i;:::-;;;;;;;;12780:321;13053:6;13047:13;13038:6;13034:2;13030:15;13023:38;12542:573;12677:41;;;12667:51;;;:6;:51;;;;12660:58;;;;;12507:660;13152:4;13145:11;;12342:831;;;;;;;:::o;829:155:20:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;8868:427:9:-;8961:1;8947:16;;:2;:16;;;8939:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9019:16;9027:7;9019;:16::i;:::-;9018:17;9010:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9079:45;9108:1;9112:2;9116:7;9079:20;:45::i;:::-;9152:1;9135:9;:13;9145:2;9135:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9182:2;9163:7;:16;9171:7;9163:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9225:7;9221:2;9200:33;;9217:1;9200:33;;;;;;;;;;;;9244:44;9272:1;9276:2;9280:7;9244:19;:44::i;:::-;8868:427;;:::o;8054:147:19:-;8117:7;8147:1;8143;:5;:51;;8174:20;8189:1;8192;8174:14;:20::i;:::-;8143:51;;;8151:20;8166:1;8169;8151:14;:20::i;:::-;8143:51;8136:58;;8054:147;;;;:::o;8207:261::-;8275:13;8379:1;8373:4;8366:15;8407:1;8401:4;8394:15;8447:4;8441;8431:21;8422:30;;8207:261;;;;:::o;7:75:29:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:116::-;4960:21;4975:5;4960:21;:::i;:::-;4953:5;4950:32;4940:60;;4996:1;4993;4986:12;4940:60;4890:116;:::o;5012:133::-;5055:5;5093:6;5080:20;5071:29;;5109:30;5133:5;5109:30;:::i;:::-;5012:133;;;;:::o;5151:323::-;5207:6;5256:2;5244:9;5235:7;5231:23;5227:32;5224:119;;;5262:79;;:::i;:::-;5224:119;5382:1;5407:50;5449:7;5440:6;5429:9;5425:22;5407:50;:::i;:::-;5397:60;;5353:114;5151:323;;;;:::o;5480:118::-;5567:24;5585:5;5567:24;:::i;:::-;5562:3;5555:37;5480:118;;:::o;5604:222::-;5697:4;5735:2;5724:9;5720:18;5712:26;;5748:71;5816:1;5805:9;5801:17;5792:6;5748:71;:::i;:::-;5604:222;;;;:::o;5832:619::-;5909:6;5917;5925;5974:2;5962:9;5953:7;5949:23;5945:32;5942:119;;;5980:79;;:::i;:::-;5942:119;6100:1;6125:53;6170:7;6161:6;6150:9;6146:22;6125:53;:::i;:::-;6115:63;;6071:117;6227:2;6253:53;6298:7;6289:6;6278:9;6274:22;6253:53;:::i;:::-;6243:63;;6198:118;6355:2;6381:53;6426:7;6417:6;6406:9;6402:22;6381:53;:::i;:::-;6371:63;;6326:118;5832:619;;;;;:::o;6457:117::-;6566:1;6563;6556:12;6580:117;6689:1;6686;6679:12;6703:180;6751:77;6748:1;6741:88;6848:4;6845:1;6838:15;6872:4;6869:1;6862:15;6889:281;6972:27;6994:4;6972:27;:::i;:::-;6964:6;6960:40;7102:6;7090:10;7087:22;7066:18;7054:10;7051:34;7048:62;7045:88;;;7113:18;;:::i;:::-;7045:88;7153:10;7149:2;7142:22;6932:238;6889:281;;:::o;7176:129::-;7210:6;7237:20;;:::i;:::-;7227:30;;7266:33;7294:4;7286:6;7266:33;:::i;:::-;7176:129;;;:::o;7311:308::-;7373:4;7463:18;7455:6;7452:30;7449:56;;;7485:18;;:::i;:::-;7449:56;7523:29;7545:6;7523:29;:::i;:::-;7515:37;;7607:4;7601;7597:15;7589:23;;7311:308;;;:::o;7625:146::-;7722:6;7717:3;7712;7699:30;7763:1;7754:6;7749:3;7745:16;7738:27;7625:146;;;:::o;7777:425::-;7855:5;7880:66;7896:49;7938:6;7896:49;:::i;:::-;7880:66;:::i;:::-;7871:75;;7969:6;7962:5;7955:21;8007:4;8000:5;7996:16;8045:3;8036:6;8031:3;8027:16;8024:25;8021:112;;;8052:79;;:::i;:::-;8021:112;8142:54;8189:6;8184:3;8179;8142:54;:::i;:::-;7861:341;7777:425;;;;;:::o;8222:340::-;8278:5;8327:3;8320:4;8312:6;8308:17;8304:27;8294:122;;8335:79;;:::i;:::-;8294:122;8452:6;8439:20;8477:79;8552:3;8544:6;8537:4;8529:6;8525:17;8477:79;:::i;:::-;8468:88;;8284:278;8222:340;;;;:::o;8568:509::-;8637:6;8686:2;8674:9;8665:7;8661:23;8657:32;8654:119;;;8692:79;;:::i;:::-;8654:119;8840:1;8829:9;8825:17;8812:31;8870:18;8862:6;8859:30;8856:117;;;8892:79;;:::i;:::-;8856:117;8997:63;9052:7;9043:6;9032:9;9028:22;8997:63;:::i;:::-;8987:73;;8783:287;8568:509;;;;:::o;9083:117::-;9192:1;9189;9182:12;9206:117;9315:1;9312;9305:12;9346:568;9419:8;9429:6;9479:3;9472:4;9464:6;9460:17;9456:27;9446:122;;9487:79;;:::i;:::-;9446:122;9600:6;9587:20;9577:30;;9630:18;9622:6;9619:30;9616:117;;;9652:79;;:::i;:::-;9616:117;9766:4;9758:6;9754:17;9742:29;;9820:3;9812:4;9804:6;9800:17;9790:8;9786:32;9783:41;9780:128;;;9827:79;;:::i;:::-;9780:128;9346:568;;;;;:::o;9920:704::-;10015:6;10023;10031;10080:2;10068:9;10059:7;10055:23;10051:32;10048:119;;;10086:79;;:::i;:::-;10048:119;10234:1;10223:9;10219:17;10206:31;10264:18;10256:6;10253:30;10250:117;;;10286:79;;:::i;:::-;10250:117;10399:80;10471:7;10462:6;10451:9;10447:22;10399:80;:::i;:::-;10381:98;;;;10177:312;10528:2;10554:53;10599:7;10590:6;10579:9;10575:22;10554:53;:::i;:::-;10544:63;;10499:118;9920:704;;;;;:::o;10630:329::-;10689:6;10738:2;10726:9;10717:7;10713:23;10709:32;10706:119;;;10744:79;;:::i;:::-;10706:119;10864:1;10889:53;10934:7;10925:6;10914:9;10910:22;10889:53;:::i;:::-;10879:63;;10835:117;10630:329;;;;:::o;10965:468::-;11030:6;11038;11087:2;11075:9;11066:7;11062:23;11058:32;11055:119;;;11093:79;;:::i;:::-;11055:119;11213:1;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11184:117;11340:2;11366:50;11408:7;11399:6;11388:9;11384:22;11366:50;:::i;:::-;11356:60;;11311:115;10965:468;;;;;:::o;11439:307::-;11500:4;11590:18;11582:6;11579:30;11576:56;;;11612:18;;:::i;:::-;11576:56;11650:29;11672:6;11650:29;:::i;:::-;11642:37;;11734:4;11728;11724:15;11716:23;;11439:307;;;:::o;11752:423::-;11829:5;11854:65;11870:48;11911:6;11870:48;:::i;:::-;11854:65;:::i;:::-;11845:74;;11942:6;11935:5;11928:21;11980:4;11973:5;11969:16;12018:3;12009:6;12004:3;12000:16;11997:25;11994:112;;;12025:79;;:::i;:::-;11994:112;12115:54;12162:6;12157:3;12152;12115:54;:::i;:::-;11835:340;11752:423;;;;;:::o;12194:338::-;12249:5;12298:3;12291:4;12283:6;12279:17;12275:27;12265:122;;12306:79;;:::i;:::-;12265:122;12423:6;12410:20;12448:78;12522:3;12514:6;12507:4;12499:6;12495:17;12448:78;:::i;:::-;12439:87;;12255:277;12194:338;;;;:::o;12538:943::-;12633:6;12641;12649;12657;12706:3;12694:9;12685:7;12681:23;12677:33;12674:120;;;12713:79;;:::i;:::-;12674:120;12833:1;12858:53;12903:7;12894:6;12883:9;12879:22;12858:53;:::i;:::-;12848:63;;12804:117;12960:2;12986:53;13031:7;13022:6;13011:9;13007:22;12986:53;:::i;:::-;12976:63;;12931:118;13088:2;13114:53;13159:7;13150:6;13139:9;13135:22;13114:53;:::i;:::-;13104:63;;13059:118;13244:2;13233:9;13229:18;13216:32;13275:18;13267:6;13264:30;13261:117;;;13297:79;;:::i;:::-;13261:117;13402:62;13456:7;13447:6;13436:9;13432:22;13402:62;:::i;:::-;13392:72;;13187:287;12538:943;;;;;;;:::o;13487:77::-;13524:7;13553:5;13542:16;;13487:77;;;:::o;13570:118::-;13657:24;13675:5;13657:24;:::i;:::-;13652:3;13645:37;13570:118;;:::o;13694:222::-;13787:4;13825:2;13814:9;13810:18;13802:26;;13838:71;13906:1;13895:9;13891:17;13882:6;13838:71;:::i;:::-;13694:222;;;;:::o;13922:474::-;13990:6;13998;14047:2;14035:9;14026:7;14022:23;14018:32;14015:119;;;14053:79;;:::i;:::-;14015:119;14173:1;14198:53;14243:7;14234:6;14223:9;14219:22;14198:53;:::i;:::-;14188:63;;14144:117;14300:2;14326:53;14371:7;14362:6;14351:9;14347:22;14326:53;:::i;:::-;14316:63;;14271:118;13922:474;;;;;:::o;14402:122::-;14475:24;14493:5;14475:24;:::i;:::-;14468:5;14465:35;14455:63;;14514:1;14511;14504:12;14455:63;14402:122;:::o;14530:139::-;14576:5;14614:6;14601:20;14592:29;;14630:33;14657:5;14630:33;:::i;:::-;14530:139;;;;:::o;14675:329::-;14734:6;14783:2;14771:9;14762:7;14758:23;14754:32;14751:119;;;14789:79;;:::i;:::-;14751:119;14909:1;14934:53;14979:7;14970:6;14959:9;14955:22;14934:53;:::i;:::-;14924:63;;14880:117;14675:329;;;;:::o;15010:180::-;15058:77;15055:1;15048:88;15155:4;15152:1;15145:15;15179:4;15176:1;15169:15;15196:320;15240:6;15277:1;15271:4;15267:12;15257:22;;15324:1;15318:4;15314:12;15345:18;15335:81;;15401:4;15393:6;15389:17;15379:27;;15335:81;15463:2;15455:6;15452:14;15432:18;15429:38;15426:84;;15482:18;;:::i;:::-;15426:84;15247:269;15196:320;;;:::o;15522:220::-;15662:34;15658:1;15650:6;15646:14;15639:58;15731:3;15726:2;15718:6;15714:15;15707:28;15522:220;:::o;15748:366::-;15890:3;15911:67;15975:2;15970:3;15911:67;:::i;:::-;15904:74;;15987:93;16076:3;15987:93;:::i;:::-;16105:2;16100:3;16096:12;16089:19;;15748:366;;;:::o;16120:419::-;16286:4;16324:2;16313:9;16309:18;16301:26;;16373:9;16367:4;16363:20;16359:1;16348:9;16344:17;16337:47;16401:131;16527:4;16401:131;:::i;:::-;16393:139;;16120:419;;;:::o;16545:249::-;16685:34;16681:1;16673:6;16669:14;16662:58;16754:32;16749:2;16741:6;16737:15;16730:57;16545:249;:::o;16800:366::-;16942:3;16963:67;17027:2;17022:3;16963:67;:::i;:::-;16956:74;;17039:93;17128:3;17039:93;:::i;:::-;17157:2;17152:3;17148:12;17141:19;;16800:366;;;:::o;17172:419::-;17338:4;17376:2;17365:9;17361:18;17353:26;;17425:9;17419:4;17415:20;17411:1;17400:9;17396:17;17389:47;17453:131;17579:4;17453:131;:::i;:::-;17445:139;;17172:419;;;:::o;17597:180::-;17645:77;17642:1;17635:88;17742:4;17739:1;17732:15;17766:4;17763:1;17756:15;17783:191;17823:3;17842:20;17860:1;17842:20;:::i;:::-;17837:25;;17876:20;17894:1;17876:20;:::i;:::-;17871:25;;17919:1;17916;17912:9;17905:16;;17940:3;17937:1;17934:10;17931:36;;;17947:18;;:::i;:::-;17931:36;17783:191;;;;:::o;17980:169::-;18120:21;18116:1;18108:6;18104:14;18097:45;17980:169;:::o;18155:366::-;18297:3;18318:67;18382:2;18377:3;18318:67;:::i;:::-;18311:74;;18394:93;18483:3;18394:93;:::i;:::-;18512:2;18507:3;18503:12;18496:19;;18155:366;;;:::o;18527:419::-;18693:4;18731:2;18720:9;18716:18;18708:26;;18780:9;18774:4;18770:20;18766:1;18755:9;18751:17;18744:47;18808:131;18934:4;18808:131;:::i;:::-;18800:139;;18527:419;;;:::o;18952:233::-;18991:3;19014:24;19032:5;19014:24;:::i;:::-;19005:33;;19060:66;19053:5;19050:77;19047:103;;19130:18;;:::i;:::-;19047:103;19177:1;19170:5;19166:13;19159:20;;18952:233;;;:::o;19191:::-;19331:34;19327:1;19319:6;19315:14;19308:58;19400:16;19395:2;19387:6;19383:15;19376:41;19191:233;:::o;19430:366::-;19572:3;19593:67;19657:2;19652:3;19593:67;:::i;:::-;19586:74;;19669:93;19758:3;19669:93;:::i;:::-;19787:2;19782:3;19778:12;19771:19;;19430:366;;;:::o;19802:419::-;19968:4;20006:2;19995:9;19991:18;19983:26;;20055:9;20049:4;20045:20;20041:1;20030:9;20026:17;20019:47;20083:131;20209:4;20083:131;:::i;:::-;20075:139;;19802:419;;;:::o;20227:230::-;20367:34;20363:1;20355:6;20351:14;20344:58;20436:13;20431:2;20423:6;20419:15;20412:38;20227:230;:::o;20463:366::-;20605:3;20626:67;20690:2;20685:3;20626:67;:::i;:::-;20619:74;;20702:93;20791:3;20702:93;:::i;:::-;20820:2;20815:3;20811:12;20804:19;;20463:366;;;:::o;20835:419::-;21001:4;21039:2;21028:9;21024:18;21016:26;;21088:9;21082:4;21078:20;21074:1;21063:9;21059:17;21052:47;21116:131;21242:4;21116:131;:::i;:::-;21108:139;;20835:419;;;:::o;21260:141::-;21309:4;21332:3;21324:11;;21355:3;21352:1;21345:14;21389:4;21386:1;21376:18;21368:26;;21260:141;;;:::o;21407:93::-;21444:6;21491:2;21486;21479:5;21475:14;21471:23;21461:33;;21407:93;;;:::o;21506:107::-;21550:8;21600:5;21594:4;21590:16;21569:37;;21506:107;;;;:::o;21619:393::-;21688:6;21738:1;21726:10;21722:18;21761:97;21791:66;21780:9;21761:97;:::i;:::-;21879:39;21909:8;21898:9;21879:39;:::i;:::-;21867:51;;21951:4;21947:9;21940:5;21936:21;21927:30;;22000:4;21990:8;21986:19;21979:5;21976:30;21966:40;;21695:317;;21619:393;;;;;:::o;22018:60::-;22046:3;22067:5;22060:12;;22018:60;;;:::o;22084:142::-;22134:9;22167:53;22185:34;22194:24;22212:5;22194:24;:::i;:::-;22185:34;:::i;:::-;22167:53;:::i;:::-;22154:66;;22084:142;;;:::o;22232:75::-;22275:3;22296:5;22289:12;;22232:75;;;:::o;22313:269::-;22423:39;22454:7;22423:39;:::i;:::-;22484:91;22533:41;22557:16;22533:41;:::i;:::-;22525:6;22518:4;22512:11;22484:91;:::i;:::-;22478:4;22471:105;22389:193;22313:269;;;:::o;22588:73::-;22633:3;22588:73;:::o;22667:189::-;22744:32;;:::i;:::-;22785:65;22843:6;22835;22829:4;22785:65;:::i;:::-;22720:136;22667:189;;:::o;22862:186::-;22922:120;22939:3;22932:5;22929:14;22922:120;;;22993:39;23030:1;23023:5;22993:39;:::i;:::-;22966:1;22959:5;22955:13;22946:22;;22922:120;;;22862:186;;:::o;23054:543::-;23155:2;23150:3;23147:11;23144:446;;;23189:38;23221:5;23189:38;:::i;:::-;23273:29;23291:10;23273:29;:::i;:::-;23263:8;23259:44;23456:2;23444:10;23441:18;23438:49;;;23477:8;23462:23;;23438:49;23500:80;23556:22;23574:3;23556:22;:::i;:::-;23546:8;23542:37;23529:11;23500:80;:::i;:::-;23159:431;;23144:446;23054:543;;;:::o;23603:117::-;23657:8;23707:5;23701:4;23697:16;23676:37;;23603:117;;;;:::o;23726:169::-;23770:6;23803:51;23851:1;23847:6;23839:5;23836:1;23832:13;23803:51;:::i;:::-;23799:56;23884:4;23878;23874:15;23864:25;;23777:118;23726:169;;;;:::o;23900:295::-;23976:4;24122:29;24147:3;24141:4;24122:29;:::i;:::-;24114:37;;24184:3;24181:1;24177:11;24171:4;24168:21;24160:29;;23900:295;;;;:::o;24200:1395::-;24317:37;24350:3;24317:37;:::i;:::-;24419:18;24411:6;24408:30;24405:56;;;24441:18;;:::i;:::-;24405:56;24485:38;24517:4;24511:11;24485:38;:::i;:::-;24570:67;24630:6;24622;24616:4;24570:67;:::i;:::-;24664:1;24688:4;24675:17;;24720:2;24712:6;24709:14;24737:1;24732:618;;;;25394:1;25411:6;25408:77;;;25460:9;25455:3;25451:19;25445:26;25436:35;;25408:77;25511:67;25571:6;25564:5;25511:67;:::i;:::-;25505:4;25498:81;25367:222;24702:887;;24732:618;24784:4;24780:9;24772:6;24768:22;24818:37;24850:4;24818:37;:::i;:::-;24877:1;24891:208;24905:7;24902:1;24899:14;24891:208;;;24984:9;24979:3;24975:19;24969:26;24961:6;24954:42;25035:1;25027:6;25023:14;25013:24;;25082:2;25071:9;25067:18;25054:31;;24928:4;24925:1;24921:12;24916:17;;24891:208;;;25127:6;25118:7;25115:19;25112:179;;;25185:9;25180:3;25176:19;25170:26;25228:48;25270:4;25262:6;25258:17;25247:9;25228:48;:::i;:::-;25220:6;25213:64;25135:156;25112:179;25337:1;25333;25325:6;25321:14;25317:22;25311:4;25304:36;24739:611;;;24702:887;;24292:1303;;;24200:1395;;:::o;25601:181::-;25741:33;25737:1;25729:6;25725:14;25718:57;25601:181;:::o;25788:366::-;25930:3;25951:67;26015:2;26010:3;25951:67;:::i;:::-;25944:74;;26027:93;26116:3;26027:93;:::i;:::-;26145:2;26140:3;26136:12;26129:19;;25788:366;;;:::o;26160:419::-;26326:4;26364:2;26353:9;26349:18;26341:26;;26413:9;26407:4;26403:20;26399:1;26388:9;26384:17;26377:47;26441:131;26567:4;26441:131;:::i;:::-;26433:139;;26160:419;;;:::o;26585:147::-;26686:11;26723:3;26708:18;;26585:147;;;;:::o;26738:114::-;;:::o;26858:398::-;27017:3;27038:83;27119:1;27114:3;27038:83;:::i;:::-;27031:90;;27130:93;27219:3;27130:93;:::i;:::-;27248:1;27243:3;27239:11;27232:18;;26858:398;;;:::o;27262:379::-;27446:3;27468:147;27611:3;27468:147;:::i;:::-;27461:154;;27632:3;27625:10;;27262:379;;;:::o;27647:168::-;27787:20;27783:1;27775:6;27771:14;27764:44;27647:168;:::o;27821:366::-;27963:3;27984:67;28048:2;28043:3;27984:67;:::i;:::-;27977:74;;28060:93;28149:3;28060:93;:::i;:::-;28178:2;28173:3;28169:12;28162:19;;27821:366;;;:::o;28193:419::-;28359:4;28397:2;28386:9;28382:18;28374:26;;28446:9;28440:4;28436:20;28432:1;28421:9;28417:17;28410:47;28474:131;28600:4;28474:131;:::i;:::-;28466:139;;28193:419;;;:::o;28618:172::-;28758:24;28754:1;28746:6;28742:14;28735:48;28618:172;:::o;28796:366::-;28938:3;28959:67;29023:2;29018:3;28959:67;:::i;:::-;28952:74;;29035:93;29124:3;29035:93;:::i;:::-;29153:2;29148:3;29144:12;29137:19;;28796:366;;;:::o;29168:419::-;29334:4;29372:2;29361:9;29357:18;29349:26;;29421:9;29415:4;29411:20;29407:1;29396:9;29392:17;29385:47;29449:131;29575:4;29449:131;:::i;:::-;29441:139;;29168:419;;;:::o;29593:94::-;29626:8;29674:5;29670:2;29666:14;29645:35;;29593:94;;;:::o;29693:::-;29732:7;29761:20;29775:5;29761:20;:::i;:::-;29750:31;;29693:94;;;:::o;29793:100::-;29832:7;29861:26;29881:5;29861:26;:::i;:::-;29850:37;;29793:100;;;:::o;29899:157::-;30004:45;30024:24;30042:5;30024:24;:::i;:::-;30004:45;:::i;:::-;29999:3;29992:58;29899:157;;:::o;30062:256::-;30174:3;30189:75;30260:3;30251:6;30189:75;:::i;:::-;30289:2;30284:3;30280:12;30273:19;;30309:3;30302:10;;30062:256;;;;:::o;30324:194::-;30364:4;30384:20;30402:1;30384:20;:::i;:::-;30379:25;;30418:20;30436:1;30418:20;:::i;:::-;30413:25;;30462:1;30459;30455:9;30447:17;;30486:1;30480:4;30477:11;30474:37;;;30491:18;;:::i;:::-;30474:37;30324:194;;;;:::o;30524:410::-;30564:7;30587:20;30605:1;30587:20;:::i;:::-;30582:25;;30621:20;30639:1;30621:20;:::i;:::-;30616:25;;30676:1;30673;30669:9;30698:30;30716:11;30698:30;:::i;:::-;30687:41;;30877:1;30868:7;30864:15;30861:1;30858:22;30838:1;30831:9;30811:83;30788:139;;30907:18;;:::i;:::-;30788:139;30572:362;30524:410;;;;:::o;30940:182::-;31080:34;31076:1;31068:6;31064:14;31057:58;30940:182;:::o;31128:366::-;31270:3;31291:67;31355:2;31350:3;31291:67;:::i;:::-;31284:74;;31367:93;31456:3;31367:93;:::i;:::-;31485:2;31480:3;31476:12;31469:19;;31128:366;;;:::o;31500:419::-;31666:4;31704:2;31693:9;31689:18;31681:26;;31753:9;31747:4;31743:20;31739:1;31728:9;31724:17;31717:47;31781:131;31907:4;31781:131;:::i;:::-;31773:139;;31500:419;;;:::o;31925:231::-;32065:34;32061:1;32053:6;32049:14;32042:58;32134:14;32129:2;32121:6;32117:15;32110:39;31925:231;:::o;32162:366::-;32304:3;32325:67;32389:2;32384:3;32325:67;:::i;:::-;32318:74;;32401:93;32490:3;32401:93;:::i;:::-;32519:2;32514:3;32510:12;32503:19;;32162:366;;;:::o;32534:419::-;32700:4;32738:2;32727:9;32723:18;32715:26;;32787:9;32781:4;32777:20;32773:1;32762:9;32758:17;32751:47;32815:131;32941:4;32815:131;:::i;:::-;32807:139;;32534:419;;;:::o;32959:180::-;33007:77;33004:1;32997:88;33104:4;33101:1;33094:15;33128:4;33125:1;33118:15;33145:174;33285:26;33281:1;33273:6;33269:14;33262:50;33145:174;:::o;33325:366::-;33467:3;33488:67;33552:2;33547:3;33488:67;:::i;:::-;33481:74;;33564:93;33653:3;33564:93;:::i;:::-;33682:2;33677:3;33673:12;33666:19;;33325:366;;;:::o;33697:419::-;33863:4;33901:2;33890:9;33886:18;33878:26;;33950:9;33944:4;33940:20;33936:1;33925:9;33921:17;33914:47;33978:131;34104:4;33978:131;:::i;:::-;33970:139;;33697:419;;;:::o;34122:228::-;34262:34;34258:1;34250:6;34246:14;34239:58;34331:11;34326:2;34318:6;34314:15;34307:36;34122:228;:::o;34356:366::-;34498:3;34519:67;34583:2;34578:3;34519:67;:::i;:::-;34512:74;;34595:93;34684:3;34595:93;:::i;:::-;34713:2;34708:3;34704:12;34697:19;;34356:366;;;:::o;34728:419::-;34894:4;34932:2;34921:9;34917:18;34909:26;;34981:9;34975:4;34971:20;34967:1;34956:9;34952:17;34945:47;35009:131;35135:4;35009:131;:::i;:::-;35001:139;;34728:419;;;:::o;35153:148::-;35255:11;35292:3;35277:18;;35153:148;;;;:::o;35307:390::-;35413:3;35441:39;35474:5;35441:39;:::i;:::-;35496:89;35578:6;35573:3;35496:89;:::i;:::-;35489:96;;35594:65;35652:6;35647:3;35640:4;35633:5;35629:16;35594:65;:::i;:::-;35684:6;35679:3;35675:16;35668:23;;35417:280;35307:390;;;;:::o;35703:155::-;35843:7;35839:1;35831:6;35827:14;35820:31;35703:155;:::o;35864:400::-;36024:3;36045:84;36127:1;36122:3;36045:84;:::i;:::-;36038:91;;36138:93;36227:3;36138:93;:::i;:::-;36256:1;36251:3;36247:11;36240:18;;35864:400;;;:::o;36270:701::-;36551:3;36573:95;36664:3;36655:6;36573:95;:::i;:::-;36566:102;;36685:95;36776:3;36767:6;36685:95;:::i;:::-;36678:102;;36797:148;36941:3;36797:148;:::i;:::-;36790:155;;36962:3;36955:10;;36270:701;;;;;:::o;36977:225::-;37117:34;37113:1;37105:6;37101:14;37094:58;37186:8;37181:2;37173:6;37169:15;37162:33;36977:225;:::o;37208:366::-;37350:3;37371:67;37435:2;37430:3;37371:67;:::i;:::-;37364:74;;37447:93;37536:3;37447:93;:::i;:::-;37565:2;37560:3;37556:12;37549:19;;37208:366;;;:::o;37580:419::-;37746:4;37784:2;37773:9;37769:18;37761:26;;37833:9;37827:4;37823:20;37819:1;37808:9;37804:17;37797:47;37861:131;37987:4;37861:131;:::i;:::-;37853:139;;37580:419;;;:::o;38005:182::-;38145:34;38141:1;38133:6;38129:14;38122:58;38005:182;:::o;38193:366::-;38335:3;38356:67;38420:2;38415:3;38356:67;:::i;:::-;38349:74;;38432:93;38521:3;38432:93;:::i;:::-;38550:2;38545:3;38541:12;38534:19;;38193:366;;;:::o;38565:419::-;38731:4;38769:2;38758:9;38754:18;38746:26;;38818:9;38812:4;38808:20;38804:1;38793:9;38789:17;38782:47;38846:131;38972:4;38846:131;:::i;:::-;38838:139;;38565:419;;;:::o;38990:224::-;39130:34;39126:1;39118:6;39114:14;39107:58;39199:7;39194:2;39186:6;39182:15;39175:32;38990:224;:::o;39220:366::-;39362:3;39383:67;39447:2;39442:3;39383:67;:::i;:::-;39376:74;;39459:93;39548:3;39459:93;:::i;:::-;39577:2;39572:3;39568:12;39561:19;;39220:366;;;:::o;39592:419::-;39758:4;39796:2;39785:9;39781:18;39773:26;;39845:9;39839:4;39835:20;39831:1;39820:9;39816:17;39809:47;39873:131;39999:4;39873:131;:::i;:::-;39865:139;;39592:419;;;:::o;40017:223::-;40157:34;40153:1;40145:6;40141:14;40134:58;40226:6;40221:2;40213:6;40209:15;40202:31;40017:223;:::o;40246:366::-;40388:3;40409:67;40473:2;40468:3;40409:67;:::i;:::-;40402:74;;40485:93;40574:3;40485:93;:::i;:::-;40603:2;40598:3;40594:12;40587:19;;40246:366;;;:::o;40618:419::-;40784:4;40822:2;40811:9;40807:18;40799:26;;40871:9;40865:4;40861:20;40857:1;40846:9;40842:17;40835:47;40899:131;41025:4;40899:131;:::i;:::-;40891:139;;40618:419;;;:::o;41043:175::-;41183:27;41179:1;41171:6;41167:14;41160:51;41043:175;:::o;41224:366::-;41366:3;41387:67;41451:2;41446:3;41387:67;:::i;:::-;41380:74;;41463:93;41552:3;41463:93;:::i;:::-;41581:2;41576:3;41572:12;41565:19;;41224:366;;;:::o;41596:419::-;41762:4;41800:2;41789:9;41785:18;41777:26;;41849:9;41843:4;41839:20;41835:1;41824:9;41820:17;41813:47;41877:131;42003:4;41877:131;:::i;:::-;41869:139;;41596:419;;;:::o;42021:237::-;42161:34;42157:1;42149:6;42145:14;42138:58;42230:20;42225:2;42217:6;42213:15;42206:45;42021:237;:::o;42264:366::-;42406:3;42427:67;42491:2;42486:3;42427:67;:::i;:::-;42420:74;;42503:93;42592:3;42503:93;:::i;:::-;42621:2;42616:3;42612:12;42605:19;;42264:366;;;:::o;42636:419::-;42802:4;42840:2;42829:9;42825:18;42817:26;;42889:9;42883:4;42879:20;42875:1;42864:9;42860:17;42853:47;42917:131;43043:4;42917:131;:::i;:::-;42909:139;;42636:419;;;:::o;43061:180::-;43109:77;43106:1;43099:88;43206:4;43203:1;43196:15;43230:4;43227:1;43220:15;43247:185;43287:1;43304:20;43322:1;43304:20;:::i;:::-;43299:25;;43338:20;43356:1;43338:20;:::i;:::-;43333:25;;43377:1;43367:35;;43382:18;;:::i;:::-;43367:35;43424:1;43421;43417:9;43412:14;;43247:185;;;;:::o;43438:176::-;43470:1;43487:20;43505:1;43487:20;:::i;:::-;43482:25;;43521:20;43539:1;43521:20;:::i;:::-;43516:25;;43560:1;43550:35;;43565:18;;:::i;:::-;43550:35;43606:1;43603;43599:9;43594:14;;43438:176;;;;:::o;43620:180::-;43668:77;43665:1;43658:88;43765:4;43762:1;43755:15;43789:4;43786:1;43779:15;43806:98;43857:6;43891:5;43885:12;43875:22;;43806:98;;;:::o;43910:168::-;43993:11;44027:6;44022:3;44015:19;44067:4;44062:3;44058:14;44043:29;;43910:168;;;;:::o;44084:373::-;44170:3;44198:38;44230:5;44198:38;:::i;:::-;44252:70;44315:6;44310:3;44252:70;:::i;:::-;44245:77;;44331:65;44389:6;44384:3;44377:4;44370:5;44366:16;44331:65;:::i;:::-;44421:29;44443:6;44421:29;:::i;:::-;44416:3;44412:39;44405:46;;44174:283;44084:373;;;;:::o;44463:640::-;44658:4;44696:3;44685:9;44681:19;44673:27;;44710:71;44778:1;44767:9;44763:17;44754:6;44710:71;:::i;:::-;44791:72;44859:2;44848:9;44844:18;44835:6;44791:72;:::i;:::-;44873;44941:2;44930:9;44926:18;44917:6;44873:72;:::i;:::-;44992:9;44986:4;44982:20;44977:2;44966:9;44962:18;44955:48;45020:76;45091:4;45082:6;45020:76;:::i;:::-;45012:84;;44463:640;;;;;;;:::o;45109:141::-;45165:5;45196:6;45190:13;45181:22;;45212:32;45238:5;45212:32;:::i;:::-;45109:141;;;;:::o;45256:349::-;45325:6;45374:2;45362:9;45353:7;45349:23;45345:32;45342:119;;;45380:79;;:::i;:::-;45342:119;45500:1;45525:63;45580:7;45571:6;45560:9;45556:22;45525:63;:::i;:::-;45515:73;;45471:127;45256:349;;;;:::o;45611:182::-;45751:34;45747:1;45739:6;45735:14;45728:58;45611:182;:::o;45799:366::-;45941:3;45962:67;46026:2;46021:3;45962:67;:::i;:::-;45955:74;;46038:93;46127:3;46038:93;:::i;:::-;46156:2;46151:3;46147:12;46140:19;;45799:366;;;:::o;46171:419::-;46337:4;46375:2;46364:9;46360:18;46352:26;;46424:9;46418:4;46414:20;46410:1;46399:9;46395:17;46388:47;46452:131;46578:4;46452:131;:::i;:::-;46444:139;;46171:419;;;:::o;46596:178::-;46736:30;46732:1;46724:6;46720:14;46713:54;46596:178;:::o;46780:366::-;46922:3;46943:67;47007:2;47002:3;46943:67;:::i;:::-;46936:74;;47019:93;47108:3;47019:93;:::i;:::-;47137:2;47132:3;47128:12;47121:19;;46780:366;;;:::o;47152:419::-;47318:4;47356:2;47345:9;47341:18;47333:26;;47405:9;47399:4;47395:20;47391:1;47380:9;47376:17;47369:47;47433:131;47559:4;47433:131;:::i;:::-;47425:139;;47152:419;;;:::o
Swarm Source
ipfs://ad1abcdbae674c00de5c3081c0ad9840113a6e40b727357f01fe84047fc8b7df
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.