ERC-721
Overview
Max Total Supply
0 LMS
Holders
84
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 LMSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Collection
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "./ERC721.sol"; import "./utils/Base64.sol"; import "./utils/MerkleProof.sol"; import "./CollectionDescriptor.sol"; // import "hardhat/console.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 Collection is ERC721 { address public owner = 0xaF69610ea9ddc95883f97a6a3171d52165b69B03; // for opensea integration. doesn't do anything else. address public collector; // address authorised to withdraw funds recipient address payable public recipient; // in this instance, it will be a mirror split on mainnet (to be deployed) // minting time uint256 public startDate; uint256 public endDate; CollectionDescriptor public descriptor; mapping (address => bool) public claimed; bytes32 public loyaltyRoot; // todo: for testing // uint256 public newlyMinted; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_, address collector_, address payable recipient_, uint256 startDate_, uint256 endDate_, bytes32 root_) ERC721(name_, symbol_) { collector = collector_; recipient = recipient_; startDate = startDate_; endDate = endDate_; descriptor = new CollectionDescriptor(); loyaltyRoot = root_; // mint first claim UF. It's a known address in the merkle tree to populate NFT marketplaces before launch _createNFT(owner); claimed[owner] = true; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory name = descriptor.generateName(tokenId); string memory description = "Ceramic beings with simulated souls collected by the Martian, Nyx."; string memory image = generateBase64Image(tokenId); string memory attributes = generateTraits(tokenId); return string( abi.encodePacked( 'data:application/json;base64,', Base64.encode( bytes( abi.encodePacked( '{"name":"', name, '", "description":"', description, '", "image": "', 'data:image/svg+xml;base64,', image,'",', attributes, '}' ) ) ) ) ); } function generateBase64Image(uint256 tokenId) public view returns (string memory) { bytes memory img = bytes(generateImage(tokenId)); return Base64.encode(img); } function generateImage(uint256 tokenId) public view returns (string memory) { return descriptor.generateImage(tokenId); } function generateTraits(uint256 tokenId) public view returns (string memory) { return descriptor.generateTraits(tokenId); } function mint() public payable { require(msg.value >= 0.032 ether, 'MORE ETH NEEDED'); //~$100 _mint(msg.sender); } function loyalMint(bytes32[] calldata proof) public { loyalMintLeaf(proof, msg.sender); } // anyone can mint for someone in the merkle tree // you just need the correct proof function loyalMintLeaf(bytes32[] calldata proof, address leaf) public { // if one of addresses in the overlap set require(claimed[leaf] == false, "Already claimed"); claimed[leaf] = true; bytes32 hashedLeaf = keccak256(abi.encodePacked(leaf)); require(MerkleProof.verify(proof, loyaltyRoot, hashedLeaf), "Invalid Proof"); _mint(leaf); } // internal mint function _mint(address _owner) internal { require(block.timestamp > startDate, "NOT_STARTED"); // ~ 2000 gas require(block.timestamp < endDate, "ENDED"); _createNFT(_owner); } function _createNFT(address _owner) internal { uint256 tokenId = uint(keccak256(abi.encodePacked(block.timestamp, _owner))); super._mint(_owner, tokenId); } function withdrawETH() public { require(msg.sender == collector, "NOT_COLLECTOR"); recipient.call{value: address(this).balance}(""); // this is safe because the recipient is known } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "./interfaces/IERC721.sol"; import "./interfaces/IERC721Receiver.sol"; import "./interfaces/IERC721Metadata.sol"; import "./utils/Address.sol"; // import "../../utils/Context.sol"; import "./utils/Strings.sol"; import "./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 ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(msg.sender == owner || isApprovedForAll(owner, msg.sender), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != msg.sender, "ERC721: approve to caller"); _operatorApprovals[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, 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(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); // _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); // _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); // _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } // modified from ERC721 template: // removed BeforeTokenTransfer }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides a function for encoding some bytes in base64 library Base64 { string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and( input, 0x3F))))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) // import "hardhat/console.sol"; pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees 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 view returns (bool) { return processProof(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 view returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; // console.logBytes32(computedHash); // console.logBytes32(proofElement); if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) //computedHash = _efficientHash(computedHash, proofElement); computedHash = keccak256( abi.encodePacked(computedHash, proofElement) ); } else { // Hash(current element of the proof + current computed hash) // computedHash = _efficientHash(proofElement, computedHash); computedHash = keccak256( abi.encodePacked(proofElement, computedHash) ); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; /* Contract that's primarily responsible for generating the metadata, including the image itself in SVG. Parts of the SVG is encapsulated into custom re-usable components specific to this collection. */ /* Little Martians have the following randomised components. 1) 1 of 10 hardcoded shells. 2) Degree of blur + random seed. 3) Step pattern with 2 vars + random seed. 4) Background pattern 5) Foreground pattern with colour shifting + alpha slope */ contract CollectionDescriptor { function generateName(uint nr) public pure returns (string memory) { return string(abi.encodePacked('Little Martian #', substring(toString(nr),0,8))); } function generateTraits(uint256 tokenId) public pure returns (string memory) { bytes memory hash = abi.encodePacked(bytes32(tokenId)); uint256 index = uint256(toUint8(hash,0))*100/256; // 0 - 100 string memory ceramicType = '{"trait_type": "Ceramic Shell", "value":'; string memory ceramicValue = ""; if(index < 10) { ceramicValue = '"Type One"}'; } if(index < 20) { ceramicValue = '"Type Two"}'; } if(index < 30) { ceramicValue = '"Type Three"}'; } if(index < 40) { ceramicValue = '"Type Four"}'; } if(index < 50) { ceramicValue = '"Type Five"}'; } if(index < 60) { ceramicValue = '"Type Six"}'; } if(index < 70) { ceramicValue = '"Type Seven"}'; } if(index < 80) { ceramicValue = '"Type Eight"}'; } if(index < 90) { ceramicValue = '"Type Nine"}'; } if(index < 100) { ceramicValue = '"Type Ten"}'; } return string(abi.encodePacked( '"attributes": [', ceramicType, ceramicValue, ']' )); } function generateImage(uint256 tokenId) public pure returns (string memory) { bytes memory hash = abi.encodePacked(bytes32(tokenId)); uint256 fillI = uint256(toUint8(hash,1)); string memory fill = 'none'; if(fillI < 128) { fill = 'white'; } return string( abi.encodePacked( '<svg width="480" height="460" viewBox="0 0 480 460" xmlns="http://www.w3.org/2000/svg">', '<style type="text/css">.c{fill:white}</style>', '<rect width="480" height="460" fill="black"/>', generatePath(hash), generateBlur(hash), generateSteps(hash), generateTurbs1(hash), generateTurbs2(hash), svgRect("0.7", "blur", fill), svgRect("0.5", "steps", 'none'), svgRect("1", "turb1", 'none'), svgRect("0.7", "turb2", 'none'), generateFace(hash), '</svg>' ) ); } function generatePath(bytes memory hash) public pure returns (string memory) { uint256 index = uint256(toUint8(hash,0))*100/256; // 0 - 100 string memory path; if(index < 10) { path = "M189 49c-23 7-35 24-40 32-12 16-15 31-17 41-6 26 1 29-2 73-1 13-2 21-1 35s4 26 5 33l14 42 11 28 6 12c1 3 5 11 18 27l13 15c14 9 29 6 31 5 9-2 15-7 20-11 10-8 15-17 24-35 6-10 9-16 11-23 6-17 2-20 8-35 6-14 11-13 14-26 2-8 1-11 4-21 3-8 5-9 5-15 0-7-2-8-4-17-2-11 1-13 0-27-2-11-4-12-3-17 2-9 8-11 11-19 4-10 0-21-2-27-2-4-3-6-22-30l-16-18c-4-3-10-9-19-14-3-2-13-7-27-10-8-1-24-4-42 2z"; } else if(index < 20) { path = "M240 23c17 3 25 5 35 11 13 8 19 17 29 33a197 197 0 0135 106c2 21 2 31 0 40-3 9-8 16-10 31l-2 14c0 4-3 18-10 31-3 7-9 13-22 27-13 12-17 15-21 24-3 6-2 9-6 15-4 7-8 12-14 17-9 10-11 9-22 19-9 9-8 10-14 14-8 6-17 9-25 10-14 1-25-7-45-23-10-8-40-32-43-57l-1-11-3-29c-3-22-8-23-9-37 0-13 3-13 7-38 4-20 1-21 5-53 3-24 4-20 5-34 1-22-1-32 4-48l8-18c2-3 8-14 20-25 6-5 20-17 41-22 18-5 33-2 58 3z"; } else if(index < 30) { path = "M188 21c3-1 43 1 60 4 33 6 70 47 79 65 2 5 17 60 17 81 0 15-4 3-4 44 0 24-6 40-16 61-9 26-7 34-18 60a113 113 0 01-50 63c-12 7-23 14-40 13-18-1-33-17-37-24-21-37-41-65-45-73-3-8-21-33-25-67-1-12 5-37 4-56-1-29-7-39-4-50 8-26 6-16 11-42 4-20 8-52 26-64 15-12 32-14 42-15z"; } else if(index < 40) { path = "M71 93v21l1 24c3 22 5 23 9 48l2 13c4 12 13 20 15 23 9 8 21 30 45 74 9 18 13 26 22 36 9 8 16 13 27 20 18 12 45 28 78 32a57 57 0 0049-18c8-9 11-18 16-37 6-21 9-31 6-40-2-6-5-10-6-18l2-18c2-10 6-26 5-42 0-14-5-26-7-33l-10-22c-6-18-2-21-8-32-5-9-8-9-17-22-8-12-9-18-14-25-9-17-23-25-38-33-35-20-69-20-82-19-15 1-36 2-58 16-3 2-35 24-37 52z"; } else if(index < 50) { path = "M147 43c6-6 14-14 27-18 15-6 30-4 49-1a129 129 0 0193 52c8 13 15 35 15 57 0 17-6 24-7 52v25c-1 6-2 16-15 54l-10 29c-5 20-11 27-14 39-7 23-14 36-21 43-22 24-47 32-53 34-12 4-23-1-32-5-10-5-9-6-23-23-12-15-13-12-20-23-10-13-11-22-18-49-10-40-16-37-18-59-2-25 8-24 6-55 0-20-1-24 1-44 1-10 3-34 7-53 2-8 15-36 33-55z"; } else if(index < 60) { path = "M135 47c-6 10-14 23-22 52-2 11-4 19-5 38-1 11-6 20-10 31-9 29-9 27-11 39-1 8 1 36 4 55l6 29c4 25 3 28 7 41a216 216 0 0027 58c10 15 14 21 28 25 6 2 15 7 26 6 10-1 25-3 42-11 2-2 11-6 24-17 9-8 28-25 43-54 14-26 8-31 24-55 11-18 16-18 19-31 6-18 2-16 6-41 4-16 1-30 1-43 1-13-2-15-2-31 0-29-2-35-5-47-9-34-51-59-81-68-42-14-101-7-121 24z"; } else if(index < 70) { path = "M92 75c7-14 15-21 17-23a179 179 0 01104-22c11 1 28 3 49 13 8 4 19 9 31 21 5 3 15 14 24 31l12 33 7 19 11 30c5 17 8 26 8 38 0 14-4 16-10 46-2 14-4 21-4 29-2 26 1 30-1 54-1 6-4 10-8 19-8 17-13 26-21 33-9 7-18 9-27 11-7 1-38 8-62-8-10-6-10-11-26-19l-16-8s-13-6-24-15c-6-4-18-16-39-71l-15-45c-11-29-15-36-17-52v-42c1-47 0-58 7-72z"; } else if(index < 80) { path = "M174 35c-8 8-7 13-22 30-11 13-15 14-19 22-6 13-2 18-8 33l-15 24c-20 29-22 33-24 39l-5 29c-2 17-1 20-2 41l-5 45-2 35c1 13 2 39 21 58 8 9 17 13 22 15 15 6 28 6 36 6 18 0 30-4 44-9 16-5 25-8 35-16s10-12 25-33c13-16 20-26 31-36 18-17 25-15 39-32 9-10 14-20 17-25 6-14 8-23 14-43 12-43 13-38 15-48 3-30-9-54-17-69-5-11-20-39-51-59-9-6-35-23-71-23-16 0-41 0-58 16z"; } else if(index < 90) { path = "M223 17c-11 0-42 2-72 23-36 25-63 73-57 111 1 8 5 22 2 42-3 15-7 18-9 31-3 13 0 27 6 53 5 20 9 39 19 62l12 24c8 21 7 25 13 34 2 3 12 17 30 21 15 3 28-2 42-8l19-11a443 443 0 0067-81c9-16 16-27 23-43l15-48c11-33 16-50 17-62 3-20 5-39-2-61-11-37-41-56-52-63-9-7-35-24-73-24z"; } else if(index < 100) { path = "M194 15c-18 2-20 0-45 4-29 4-31 6-47 12-2 2-25 12-35 35-4 9-5 17-5 22-5 66 24 136 24 136 21 49 32 41 48 85 6 16 11 34 27 52 10 11 19 16 36 27 35 22 54 35 79 30 15-3 27-12 31-15 3-3 17-14 25-34 9-24 2-37 5-76l6-42c6-43 9-52 4-67-4-12-7-10-14-30-6-14-6-19-11-36l-14-34c-10-20-18-37-34-50-32-25-74-20-80-19z"; } return string(abi.encodePacked( '<clipPath id="m"> <path d="',path,'"/></clipPath>' )); } function generateFace(bytes memory hash) public pure returns (string memory) { uint256 index = uint256(toUint8(hash,0))*100/256; // 0 - 100 string memory path; if(index < 10) { path = "M182 223c0-3-4-5-7-6-5-1-8 1-14 3-12 4-19 2-19 4s8 6 17 6c11 1 23-3 23-7zM235 227c0-2 9-5 14-6s11-2 18-1c7 2 16 7 15 10 0 3-9 3-10 4-7 0-10-2-18-4-12-3-18-1-19-3z M241 300c0 2-3 3-4 3-13 6-10 8-21 12-7 3-15 5-25 4-4 0-12-1-18-7-6-5-10-14-10-14 13-9 16-15 16-15l3-6c4-10 2-11 5-19l5-11v-2c6-16 3-31 3-31-1-3-3-14-10-19l-2-2a39 39 0 00-15-5c-2-1-9-2-16 0-8 1-11 4-13 3-1-1 1-8 6-12 8-7 20-4 27-2 5 1 12 2 19 8a40 40 0 0114 31v19c-2 12-2 18-6 26l-5 10c-12 21-14 25-12 29 1 6 7 9 8 10 11 4 23-4 24-5 9-6 9-13 15-14 6 0 12 5 12 9z M174 338c1-2 3-1 27-2h14c4 2 6 4 9 3s2-5 5-7c4-3 7-1 14 1 12 2 17 0 18 1 1 4-15 14-32 19-8 3-16 5-25 4-17-3-31-15-30-19z"; } else if(index < 20) { path = "M326 200c-1 1-9-6-29-12-23-7-32-5-35-4-3 0-11 3-18 10a38 38 0 00-10 26c0 6 2 6 5 18 1 4 4 16 5 31 1 13-1 13 1 21s5 11 5 18c-1 2-1 8-5 13-7 10-21 10-22 10-10 0-9-5-28-12-9-3-25-11-24-18 1-4 10-12 7-12l8 13c6 9 16 17 27 18 7 1 19 0 24-7 3-7-2-12-6-30s0-17-4-48c-2-13-4-19-2-28 1-5 3-14 11-21 6-5 21-14 40-11 28 5 51 23 50 25zM131 175c16-14 51-8 60-3 3 2 0 1 0 0 0 0-3-9-18-13-4-2-19-2-31 7-6 4-9 6-11 9zM125 210c2-5 20-5 33-3 3 0 16 0 22 11l1 6c1 8 3 10 3 10-4 1-9-5-17-8h-16c-13 0-27-10-26-16z M257 236c0-5 14-10 26-10 19 1 36 14 34 17 0 2-3 1-13 3l-18 3c-13 0-29-7-29-13zM151 355c1-2 5 2 15 4 11 1 21-1 24-1 7-2 10-4 14-2 5 2 5 7 9 7s6-6 12-7l8 2c11 4 20 0 20 1 1 2-10 13-32 21-10 4-14 2-20 2-11 1-20-2-23-4-17-7-27-23-27-23z"; } else if(index < 30) { path = "M152 205s25 10 37 1c3-2-5-9-8-11-7-3-10-6-14-5-12 2-17 12-15 15zM265 214c-2-2 6-9 17-14 5-2 9-2 11-2 13 0 21 12 21 12 0 3-9 4-10 4-8 2-7-3-15-4-13-2-22 6-24 4zM191 289c-3 1-6 8-3 13s10 6 14 9c2 1 6 4 15 4 6-1 6-4 13-6l14-4c7-2 10-3 10-8s-5-9-5-9 2 7-1 12c-3 4-11 2-19 5-11 5-8 6-18 5-7 0-17-4-21-8-3-3 1-13 1-13zM184 351c-1 1 10 11 26 16l13 2c3 0 10 0 18-5 6-3 12-9 11-11s-8 1-21 4c-8 2-17 3-26 2-13-2-21-9-21-8zM252 175c1 1 10-10 25-12 13-3 26 2 28 3 7 3 12 7 13 6 1-2-4-9-11-14-14-9-32-2-34-1-14 6-21 17-21 18zM144 168c1 2 14-12 30-10 18 2 17 13 26 9 0 0 1-3-4-7-11-5-15-11-34-4-11 4-20 10-18 12zM213 215c1-5 3 27 2 38l-5 18c-1 4-5 5-5 5 2-4 4-6 6-16 2-17 1-40 2-45z"; } else if(index < 40) { path = "M159 239c0-2 7 0 14-4l4-4 6-7 5-11s4 6 4 11c1 7-5 16-14 19s-19-3-19-4zM270 199c-1-2 6-9 13-12l10-3c7-5 8-12 10-11 2 0 3 9 0 15-4 5-9 7-18 9-4 1-14 4-15 2zM134 218c1 0 3-9 13-16l1-2 16-7c13-5 12-12 21-13 7-1 12 1 12 1s-8-6-15-6c-8 0-8 3-21 10-10 6-9 1-15 6-10 9-13 27-12 27z M305 141s-11-9-23-6c-3 1-5 2-21 18l-13 14c-4 6-11 14-12 26-2 16 7 30 17 45l10 13 2 2 10 10c8 6 16 9 17 9 5 2 7 2 7 4 1 2-3 5-8 9-10 10-8 14-14 18l-20 2c-8 1-8 2-12 1-6-1-15-5-14-7l14 3c14 2 28-3 29-4 7-7 12-14 13-18 1-6-12-3-26-17-6-6-12-12-17-20-9-13-12-24-13-27-4-16-2-28-2-31 1-10 5-16 13-24 5-5 5-9 15-17s10-10 14-12c15-6 34 8 34 9zM245 345s7-11 15-14c4-2 5-1 14-3 7-2 10-3 14-6l8-9c6-7 6-9 9-10 3-2 9-6 11-4 2 1 2 3 0 16l-4 16c-5 8-12 11-18 14-8 3-14 4-19 4-9 1-30-4-30-4z"; } else if(index < 50) { path = "M126 216l7-6c3-3 6-4 10-4 9-1 7 0 12 1l4 2s4 4 2 4-8 7-15 7c-15 1-20-4-20-4z M124 172c0 1 6-5 12-6 13-1 24 2 33 11l1 1c10 11 10 25 10 28l-4 18-6 28c-1 14 1 21-4 27l-6 6c-5 5-8 6-8 8 0 4 4 6 5 7l9 6 9 5c4 1 6-4 13-6s9 2 18 0c7-1 13-5 12-6l-17 1c-19 1-16 5-23 6-10 0-19-8-20-10-1-6 5-10 10-17 4-5 4-15 5-25 3-24 4-21 7-34 3-10 3-15 2-22-2-17-2-24-17-32-9-5-23-9-32-2-5 4-10 7-9 8zM234 219l10-7c4-2 9-1 13-1 4 1 9 1 16 6l3 5c4 5 9 3 9 4s-4 2-9 2c-4 0-7 0-12-2-6-1-11-5-17-6-11-2-13-1-13-1zM294 190c0 1-4-6-11-11-8-5-15-6-25-6-11-1-21-1-29 5l-5 5c-1-1 1-6 5-9 7-7 19-6 32-4 10 1 16 2 22 6 8 6 11 14 11 14zM236 339c0 4-11 6-20 14l-6 4c-3 2-6 2-7 2-13 1-18 2-23 0-10-3-9-2-12-5l-10-7-9-6c-1-1-5-1-4-2l4-2c6-3 5-1 10-3 4-2 7-3 10-2 5 0 3 2 8 2 4 1 6-2 12-3 4-1 7-1 17 1 19 3 29 5 30 7z"; } else if(index < 60) { path = "M120 168c0-4 13-5 18-5h13l11-2c2 2 0 8-5 13-7 7-19 4-21 4-8-2-17-7-16-10z M122 126c1 1 10-8 25-7 8 0 14-1 19 1 7 3 13 9 17 15l3 12c1 5 1 11-2 19l-10 28-7 25c-4 14-13 20-16 25-5 8-7 7-9 14-2 3-3 8-1 13 3 4 3 3 9 6l10 7c4 2 7 4 11 3 3 0 3-2 8-3 1-1 6-3 13-2 8 2 9 7 14 7 6 0 12-8 10-10-1-2-1 6-10 5-12-1-12-6-21-6s-12 3-19 2c-6-1-18-6-19-12-1-1-2-7 5-17l9-13c6-7 8-11 12-24 5-16 1-10 5-20l13-31c2-7 1-17-3-27-4-8-6-13-12-17-7-4-17-10-30-8-15 2-25 13-24 15zM128 316c2-3 12-2 17-2l9 2s3 5 7 6c4 2 5-1 10-1 5-1 9 0 14 1 4 1 7 2 15 7l28 15-17 9c-10 3-18 3-25 3-18-1-29-7-32-8-9-5-15-11-17-13-1-1-13-14-9-19zM241 192c0-3 6-6 11-7 6-2 12-1 14-1 7 1 12 4 16 7 7 4 11 8 14 11s8 8 7 9-9-6-23-11c-8-3-16-4-21-5-12-2-17-1-18-3zM316 163s-3-12-13-21l-4-3c-2-2-7-9-18-12l-15-1c-7 0-17 6-17 6 2-2 2-5 13-9 6-2 14-3 24 1 11 4 13 6 19 11 11 11 12 27 11 28z"; } else if(index < 70) { path = "M329 180s4 0-11-4l-14-3c-3 0-11 1-17 6-1 0-7 5-6 7 1 1 6 0 15-1l17 1c11 0 17-4 16-6z M321 138s-18-5-31-2c-4 1-9 1-20 9-13 10-16 13-17 23-2 9-2 17 2 25 3 8 0 4 10 21 8 13 12 17 12 23 1 10-3 13-1 22 0 2 3 14 10 15h1c6 1 13-1 14-2 4-4 2-11 3-11 2 0 4 8 0 15-2 4-4 4-15 13l-13 8-17 1c-12 0-13 4-19 3-8-2-15-9-15-16 0-3 6-7 4-7s1 16 9 18c7 1 6-3 12-2 6 0 13-1 20-6 2-1 6-4 6-7 2-7-2-10-6-20-3-8 3-12 1-24-1-8-6-9-12-21-8-16-11-17-14-27-1-3-3-21 2-30 3-6 2-9 12-16 7-5 12-8 20-10 15-3 19-1 25-1 9 1 17 6 17 6zM199 193c0-3-7-5-12-4-6 1-8 5-13 9-4 4-11 8-22 10 3 2 6 4 11 4 7 1 18 0 27-5 8-4 10-10 9-14zM190 156c-1 1-2-1-5-3 0 0-5-3-12-4-13-2-25 7-28 9-9 6-12 13-14 12s-1-9 4-16c8-14 27-14 30-15 5 0 11 0 16 4 7 4 10 13 9 13zM319 324s1 11-3 16c-2 3-6 5-17 9-15 5-23 8-33 7-9-1-15-4-22-7-2-1-7-3-7-5 0-1 13 5 25 0 6-3 8-7 15-7h10c4-1 6-4 10-7 7-6 22-6 22-6z"; } else if(index < 80) { path = "M118 152c0-2 8-3 15-4 9-1 13 0 15 1 5 1 7 4 7 5 2 1 4 4 4 8l-5 7s-2-7-7-10c-4-3-7 1-16-1-6-1-14-4-13-6z M143 103c1 1 8-3 17-3 24 1 25 28 25 39-1 11 0 18-8 25-9 8-7 3-18 18-6 7-6 11-12 18-5 7-29 23-35 32-3 5-4 9-4 15-1 12 18 16 22 20 9 7 11 12 20 14 7 3 14 5 21-1 5-4 7-10 5-12-2-3-12 12-22 9-7-2 0 0-17-14-11-9-17-6-20-17-2-11 7-18 21-28 12-8 12-11 16-15 7-10 6-13 13-22 9-11 25-11 25-38 0-10-2-18-3-25-1-9-7-14-11-19-5-5-14-9-22-7s-14 9-13 11zM230 199c1-3 5-6 9-7 2 0 12-3 21 0 10 3 12 8 17 14 7 9 2 22 5 24 2 1-7-7-16-13-7-5-6-4-17-8-9-5-19-4-19-10zM300 164s-3-10-14-18c-3-2-13-10-26-10-17 0-27 11-29 9-1-2 7-14 19-18 14-4 25 3 28 4 18 10 23 33 22 33zM164 332c1 4-12 10-25 11-3 0-12 0-21-5-8-4-12-10-14-14-4-6-6-19-6-19l12 2 15 5c4 7 6 7 6 7 2 2 4-1 8 0 4 0 6 2 9 4 10 8 16 7 16 9z"; } else if(index < 90) { path = "M103 206c2-2 7 4 16 5 12 1 22-2 22-2s-3 6-9 10c-1 1-10 6-19 2-7-4-12-13-10-15z M106 164c0 4 30-7 43 12 8 11 7 36 2 49-3 9-11 20-14 39v1c-4 20-9 29-10 30-3 3-6 10-6 18v2c2 8 8 12 10 14a31 31 0 0019 7c3 0 9 0 17-3 5-1 16-6 16-8-1-4-36 17-52-3-10-13 5-27 14-66 3-11 16-33 17-53 1-19-2-29-15-38-17-12-41-5-41-1zM261 241l-8-4c-6-4-11-15-28-11-5 1-11 7-11 9 0 1 3 3 12 5 8 2 12-3 21 2 6 3 14-1 14-1zM277 205c-1 2-8-9-21-13-11-2-22 0-28 2l-13 3c-1-1 8-9 20-12 2-1 16-4 29 4 10 6 14 15 13 16zM195 370c1 2-7 11-19 13-9 3-17 0-23-2-7-2-16-5-18-12 0-2 0-6 2-7s4 4 11 6c5 2 7 0 14 1l9 3c12 5 23-3 24-2z"; } else if(index < 100) { path = "M313 128c0 1-14-6-31-1a46 46 0 00-30 52c0 3 4 9 10 20 10 18 11 17 15 26 9 18 7 20 14 30 2 3 10 7 12 16l1 1c2 10-8 21-10 23a60 60 0 01-35 18c-12 3-27 6-36-2-7-6-9-16-7-17 2-2 6 2 13 6 16 6 32 2 38 1 9-3 18-5 23-14 0-1 5-10 1-17l-19-39c-5-10-31-43-32-61-1-5-2-12 5-25 1-3 9-20 28-25 21-6 40 6 40 8z M328 172c1-3-5-9-12-10-3-1-8-3-20 1-8 3-13 8-15 11-5 5-9 10-7 12 2 1 8-8 19-10 7-1 8 2 18 1 3 0 16-1 17-5zM198 201c-1-6-11-11-18-9-7 1-6 7-16 14-9 6-14 4-20 11-2 3-6 9-4 11 2 3 8-1 26-6 13-3 17-3 23-8 3-2 10-7 9-13zM197 156c-1 2-12-6-31-5-14 1-25 7-27 8-11 6-16 13-18 11-2-1 0-12 7-18 5-5 9-3 24-7 13-5 13-7 19-7 15 0 28 15 26 18zM322 315s3 18-3 28c-5 9-12 13-16 15-4 3-15 9-31 9-10 0-10-4-31-8l-16-4c0-3 11-4 27-14 10-6 13-7 20-7 6 0 8 3 12 1 4-1 4-5 9-9l12-6c13-2 14-7 17-5z"; } return string(abi.encodePacked( '<path class="c" d="',path,'"/>' )); } function generateBlur(bytes memory hash) public pure returns (string memory) { uint256 blurDegree = uint256(toUint8(hash,2))/64; // 1 - 4 uint256 blurSeed = uint256(toUint8(hash,3)); return string(abi.encodePacked( svgFilter('blur'), '<feTurbulence baseFrequency="',generateDecimalString(5,blurDegree+1),'" seed="',toString(blurSeed),'" result="turbs"/>', '<feSpecularLighting surfaceScale="200" result="out" specularExponent="20">', '<fePointLight x="216" y="17" z="200"/>', '</feSpecularLighting>', '<feGaussianBlur in="out" stdDeviation="4" result="blurred"/>', '<feComposite in="SourceGraphic" in2="blurred" operator="arithmetic" k1="0" k2="1" k3="1" k4="0"/>', '</filter>' )); } function generateSteps(bytes memory hash) public pure returns (string memory) { uint256 stepsDegree = uint256(toUint8(hash,4))/64; // 1 - 4 uint256 stepsInterDegree = 1+uint256(toUint8(hash,5))*100/256/10; uint256 stepsSeed = uint256(toUint8(hash,6)); uint256 stepsScale = 80+uint256(toUint8(hash,7))/2; return string(abi.encodePacked( svgFilter('steps'), '<feTurbulence baseFrequency="',generateDecimalString(stepsInterDegree,stepsDegree+1),'" seed="',toString(stepsSeed),'" result="turbs"/>', '<feSpecularLighting surfaceScale="',toString(stepsScale),'" result="specOut" specularExponent="20">', '<fePointLight x="210" y="17" z="200"/>', '</feSpecularLighting>', '<feComposite in="SourceGraphic" in2="blurred" operator="arithmetic" k1="0" k2="1" k3="1" k4="0"/>', '</filter>' )); } function generateTurbs1(bytes memory hash) public pure returns (string memory) { uint256 turbs1Degree = uint256(toUint8(hash,8))/128; // 0 - 2 (2 is very slightly rarer due to it ending at 2.965) uint256 turbs1InterDegree = 1+uint256(toUint8(hash,9))*100/256/10; uint256 turbs1Seed = uint256(toUint8(hash,10)); return string(abi.encodePacked( svgFilter('turb1'), '<feTurbulence baseFrequency="',generateDecimalString(turbs1InterDegree,turbs1Degree+2),'" seed="',toString(turbs1Seed),'" result="turbs"/>', '</filter>' )); } function generateTurbs2(bytes memory hash) public pure returns (string memory) { uint256 turbs2Degree = uint256(toUint8(hash,11))/64; // 0 - 3 uint256 turbs2InterDegree = 1+uint256(toUint8(hash,12))*100/256/10; uint256 turbs2Seed = uint256(toUint8(hash,13)); // do colour tempering next string memory redOffset = getColourOffset(hash, 14); string memory greenOffset = getColourOffset(hash, 15); string memory blueOffset = getColourOffset(hash, 16); uint256 alphaSlope = 1+uint256(toUint8(hash,17))/64; return string(abi.encodePacked( svgFilter('turb2'), '<feTurbulence baseFrequency="',generateDecimalString(turbs2InterDegree,turbs2Degree+1),'" seed="',toString(turbs2Seed),'" result="turbs"/>', '<feComponentTransfer result="wave">', '<feFuncR type="gamma" offset="',redOffset,'"/>', '<feFuncG type="gamma" offset="',greenOffset,'"/>', '<feFuncB type="gamma" offset="',blueOffset,'"/>', '<feFuncA type="linear" slope="',toString(alphaSlope),'"/>', '</feComponentTransfer>', '</filter>' )); } function getColourOffset(bytes memory hash, uint256 hashIndex) public pure returns (string memory) { uint256 shift = uint256(toUint8(hash,hashIndex))/128; // 0 or 1. Positive or Negative uint256 change = uint256(toUint8(hash,hashIndex))*100/256; // 0 - 99 string memory sign = ""; if(shift == 1) { sign = "-"; } return string(abi.encodePacked( sign,generateDecimalString(change,1) )); } function svgRect(string memory opacity, string memory filter, string memory fill) public pure returns (string memory) { return string(abi.encodePacked('<rect width="100%" height="200%" clip-path="url(#m)" opacity="',opacity,'" filter="url(#',filter,')" fill="',fill,'"/>')); } function svgFilter(string memory id) public pure returns (string memory) { return string(abi.encodePacked('<filter id="',id,'" width="100%" height="100%">')); } function svgFeTurbulence(string memory seed, string memory baseFrequency) public pure returns (string memory) { return string(abi.encodePacked( '<feTurbulence type="turbulence" seed="',seed,'" baseFrequency="',baseFrequency,'" result="turbs"/>' )); } // helper function for generation // from: https://github.com/GNSPS/solidity-bytes-utils/blob/master/contracts/BytesLib.sol function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) { require(_start + 1 >= _start, "toUint8_overflow"); require(_bytes.length >= _start + 1 , "toUint8_outOfBounds"); uint8 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x1), _start)) } return tempUint; } // from: https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/master/contracts/utils/Strings.sol /** * @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); } function generateDecimalString(uint nr, uint decimals) public pure returns (string memory) { if(decimals == 1) { return string(abi.encodePacked('0.',toString(nr))); } if(decimals == 2) { return string(abi.encodePacked('0.0',toString(nr))); } if(decimals == 3) { return string(abi.encodePacked('0.00',toString(nr))); } if(decimals == 4) { return string(abi.encodePacked('0.000',toString(nr))); } } // from: https://ethereum.stackexchange.com/questions/31457/substring-in-solidity/31470 function substring(string memory str, uint startIndex, uint endIndex) internal pure returns (string memory) { bytes memory strBytes = bytes(str); bytes memory result = new bytes(endIndex-startIndex); for(uint i = startIndex; i < endIndex; i++) { result[i-startIndex] = strBytes[i]; } return string(result); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "./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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; 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 pragma solidity ^0.8.9; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "./interfaces/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 pragma solidity ^0.8.9; /** * @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); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"collector_","type":"address"},{"internalType":"address payable","name":"recipient_","type":"address"},{"internalType":"uint256","name":"startDate_","type":"uint256"},{"internalType":"uint256","name":"endDate_","type":"uint256"},{"internalType":"bytes32","name":"root_","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"descriptor","outputs":[{"internalType":"contract CollectionDescriptor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"generateBase64Image","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"generateImage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"generateTraits","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":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"loyalMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"address","name":"leaf","type":"address"}],"name":"loyalMintLeaf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"loyaltyRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"recipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405273af69610ea9ddc95883f97a6a3171d52165b69b03600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b506040516200a7aa3803806200a7aa83398181016040528101906200008c919062000885565b86868160009080519060200190620000a69291906200050a565b508060019080519060200190620000bf9291906200050a565b50505084600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260098190555081600a8190555060405162000160906200059b565b604051809103906000f0801580156200017d573d6000803e3d6000fd5b50600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d81905550620001f8600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200027f60201b60201c565b6001600c6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050505062000c01565b6000428260405160200162000296929190620009eb565b6040516020818303038152906040528051906020012060001c9050620002c88282620002cc60201b620015d01760201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200033f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003369062000a7c565b60405180910390fd5b62000350816200049e60201b60201c565b1562000393576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038a9062000aee565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620003e5919062000b3f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b828054620005189062000bcb565b90600052602060002090601f0160209004810192826200053c576000855562000588565b82601f106200055757805160ff191683800117855562000588565b8280016001018555821562000588579182015b82811115620005875782518255916020019190600101906200056a565b5b509050620005979190620005a9565b5090565b615f57806200485383390190565b5b80821115620005c4576000816000905550600101620005aa565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200063182620005e6565b810181811067ffffffffffffffff82111715620006535762000652620005f7565b5b80604052505050565b600062000668620005c8565b905062000676828262000626565b919050565b600067ffffffffffffffff821115620006995762000698620005f7565b5b620006a482620005e6565b9050602081019050919050565b60005b83811015620006d1578082015181840152602081019050620006b4565b83811115620006e1576000848401525b50505050565b6000620006fe620006f8846200067b565b6200065c565b9050828152602081018484840111156200071d576200071c620005e1565b5b6200072a848285620006b1565b509392505050565b600082601f8301126200074a5762000749620005dc565b5b81516200075c848260208601620006e7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007928262000765565b9050919050565b620007a48162000785565b8114620007b057600080fd5b50565b600081519050620007c48162000799565b92915050565b6000620007d78262000765565b9050919050565b620007e981620007ca565b8114620007f557600080fd5b50565b6000815190506200080981620007de565b92915050565b6000819050919050565b62000824816200080f565b81146200083057600080fd5b50565b600081519050620008448162000819565b92915050565b6000819050919050565b6200085f816200084a565b81146200086b57600080fd5b50565b6000815190506200087f8162000854565b92915050565b600080600080600080600060e0888a031215620008a757620008a6620005d2565b5b600088015167ffffffffffffffff811115620008c857620008c7620005d7565b5b620008d68a828b0162000732565b975050602088015167ffffffffffffffff811115620008fa57620008f9620005d7565b5b620009088a828b0162000732565b96505060406200091b8a828b01620007b3565b95505060606200092e8a828b01620007f8565b9450506080620009418a828b0162000833565b93505060a0620009548a828b0162000833565b92505060c0620009678a828b016200086e565b91505092959891949750929550565b6000819050919050565b620009956200098f826200080f565b62000976565b82525050565b60008160601b9050919050565b6000620009b5826200099b565b9050919050565b6000620009c982620009a8565b9050919050565b620009e5620009df8262000785565b620009bc565b82525050565b6000620009f9828562000980565b60208201915062000a0b8284620009d0565b6014820191508190509392505050565b600082825260208201905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600062000a6460208362000a1b565b915062000a718262000a2c565b602082019050919050565b6000602082019050818103600083015262000a978162000a55565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600062000ad6601c8362000a1b565b915062000ae38262000a9e565b602082019050919050565b6000602082019050818103600083015262000b098162000ac7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b4c826200080f565b915062000b59836200080f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b915762000b9062000b10565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000be457607f821691505b6020821081141562000bfb5762000bfa62000b9c565b5b50919050565b613c428062000c116000396000f3fe6080604052600436106101b75760003560e01c806370a08231116100ec578063aba048b41161008a578063c87b56dd11610064578063c87b56dd14610613578063c884ef8314610650578063e086e5ec1461068d578063e985e9c5146106a4576101b7565b8063aba048b414610596578063b88d4fde146105bf578063c24a0f8b146105e8576101b7565b8063913e77ad116100c6578063913e77ad146104da57806395d89b4114610505578063a22cb46514610530578063a48b3b8f14610559576101b7565b806370a082311461043557806379b92f27146104725780638da5cb5b146104af576101b7565b8063303e74df116101595780634b44d812116101335780634b44d812146103655780636352211e146103a257806366d003ac146103df5780636d9ec4941461040a576101b7565b8063303e74df146102e8578063423d79391461031357806342842e0e1461033c576101b7565b8063095ea7b311610195578063095ea7b3146102615780630b97bc861461028a5780631249c58b146102b557806323b872dd146102bf576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de91906121dc565b6106e1565b6040516101f09190612224565b60405180910390f35b34801561020557600080fd5b5061020e6107c3565b60405161021b91906122d8565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612330565b610855565b604051610258919061239e565b60405180910390f35b34801561026d57600080fd5b50610288600480360381019061028391906123e5565b6108da565b005b34801561029657600080fd5b5061029f6109e4565b6040516102ac9190612434565b60405180910390f35b6102bd6109ea565b005b3480156102cb57600080fd5b506102e660048036038101906102e1919061244f565b610a3f565b005b3480156102f457600080fd5b506102fd610a98565b60405161030a9190612501565b60405180910390f35b34801561031f57600080fd5b5061033a60048036038101906103359190612581565b610abe565b005b34801561034857600080fd5b50610363600480360381019061035e919061244f565b610c70565b005b34801561037157600080fd5b5061038c60048036038101906103879190612330565b610c90565b60405161039991906122d8565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190612330565b610d49565b6040516103d6919061239e565b60405180910390f35b3480156103eb57600080fd5b506103f4610dfb565b6040516104019190612602565b60405180910390f35b34801561041657600080fd5b5061041f610e21565b60405161042c9190612636565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190612651565b610e27565b6040516104699190612434565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190612330565b610edf565b6040516104a691906122d8565b60405180910390f35b3480156104bb57600080fd5b506104c4610f98565b6040516104d1919061239e565b60405180910390f35b3480156104e657600080fd5b506104ef610fbe565b6040516104fc919061239e565b60405180910390f35b34801561051157600080fd5b5061051a610fe4565b60405161052791906122d8565b60405180910390f35b34801561053c57600080fd5b50610557600480360381019061055291906126aa565b611076565b005b34801561056557600080fd5b50610580600480360381019061057b9190612330565b6111e2565b60405161058d91906122d8565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b891906126ea565b611202565b005b3480156105cb57600080fd5b506105e660048036038101906105e19190612867565b611211565b005b3480156105f457600080fd5b506105fd61126c565b60405161060a9190612434565b60405180910390f35b34801561061f57600080fd5b5061063a60048036038101906106359190612330565b611272565b60405161064791906122d8565b60405180910390f35b34801561065c57600080fd5b5061067760048036038101906106729190612651565b6113ff565b6040516106849190612224565b60405180910390f35b34801561069957600080fd5b506106a261141f565b005b3480156106b057600080fd5b506106cb60048036038101906106c691906128ea565b61153c565b6040516106d89190612224565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ac57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107bc57506107bb82611792565b5b9050919050565b6060600080546107d290612959565b80601f01602080910402602001604051908101604052809291908181526020018280546107fe90612959565b801561084b5780601f106108205761010080835404028352916020019161084b565b820191906000526020600020905b81548152906001019060200180831161082e57829003601f168201915b5050505050905090565b6000610860826117fc565b61089f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610896906129fd565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e582610d49565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d90612a8f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109965750610995813361153c565b5b6109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc90612b21565b60405180910390fd5b6109df8383611868565b505050565b60095481565b6671afd498d00000341015610a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2b90612b8d565b60405180910390fd5b610a3d33611921565b565b610a4933826119b5565b610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f90612c1f565b60405180910390fd5b610a93838383611a93565b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60001515600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4890612c8b565b60405180910390fd5b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600081604051602001610bbc9190612cf3565b604051602081830303815290604052805190602001209050610c22848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5483611ce4565b610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5890612d5a565b60405180910390fd5b610c6a82611921565b50505050565b610c8b83838360405180602001604052806000815250611211565b505050565b6060600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634b44d812836040518263ffffffff1660e01b8152600401610ced9190612434565b60006040518083038186803b158015610d0557600080fd5b505afa158015610d19573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d429190612e1b565b9050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de990612ed6565b60405180910390fd5b80915050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f90612f68565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379b92f27836040518263ffffffff1660e01b8152600401610f3c9190612434565b60006040518083038186803b158015610f5457600080fd5b505afa158015610f68573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f919190612e1b565b9050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060018054610ff390612959565b80601f016020809104026020016040519081016040528092919081815260200182805461101f90612959565b801561106c5780601f106110415761010080835404028352916020019161106c565b820191906000526020600020905b81548152906001019060200180831161104f57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dc90612fd4565b60405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111d69190612224565b60405180910390a35050565b606060006111ef83610c90565b90506111fa81611cfb565b915050919050565b61120d828233610abe565b5050565b61121b33836119b5565b61125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190612c1f565b60405180910390fd5b61126684848484611e80565b50505050565b600a5481565b606061127d826117fc565b6112bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b390613066565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663192a0a1f846040518263ffffffff1660e01b81526004016113199190612434565b60006040518083038186803b15801561133157600080fd5b505afa158015611345573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061136e9190612e1b565b90506000604051806080016040528060428152602001613b8b6042913990506000611398856111e2565b905060006113a586610edf565b90506113d5848484846040516020016113c1949392919061328a565b604051602081830303815290604052611cfb565b6040516020016113e59190613356565b604051602081830303815290604052945050505050919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a6906133c4565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516114f590613415565b60006040518083038185875af1925050503d8060008114611532576040519150601f19603f3d011682016040523d82523d6000602084013e611537565b606091505b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163790613476565b60405180910390fd5b611649816117fc565b15611689576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611680906134e2565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116d99190613531565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118db83610d49565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6009544211611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c906135d3565b60405180910390fd5b600a5442106119a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a09061363f565b60405180910390fd5b6119b281611edc565b50565b60006119c0826117fc565b6119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f6906136d1565b60405180910390fd5b6000611a0a83610d49565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a7957508373ffffffffffffffffffffffffffffffffffffffff16611a6184610855565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a8a5750611a89818561153c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ab382610d49565b73ffffffffffffffffffffffffffffffffffffffff1614611b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0090613763565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b70906137f5565b60405180910390fd5b611b84600082611868565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bd49190613815565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c2b9190613531565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600082611cf18584611f1a565b1490509392505050565b6060600082511415611d1e57604051806020016040528060008152509050611e7b565b6000604051806060016040528060408152602001613bcd6040913990506000600360028551611d4d9190613531565b611d579190613878565b6004611d6391906138a9565b90506000602082611d749190613531565b67ffffffffffffffff811115611d8d57611d8c61273c565b5b6040519080825280601f01601f191660200182016040528015611dbf5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015611e3a576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050611dd3565b600389510660018114611e545760028114611e6457611e6f565b613d3d60f01b6002830352611e6f565b603d60f81b60018303525b50505050508093505050505b919050565b611e8b848484611a93565b611e9784848484611fcd565b611ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecd90613975565b60405180910390fd5b50505050565b60004282604051602001611ef19291906139b6565b6040516020818303038152906040528051906020012060001c9050611f1682826115d0565b5050565b60008082905060005b8451811015611fc2576000858281518110611f4157611f406139e2565b5b60200260200101519050808311611f82578281604051602001611f65929190613a32565b604051602081830303815290604052805190602001209250611fae565b8083604051602001611f95929190613a32565b6040516020818303038152906040528051906020012092505b508080611fba90613a5e565b915050611f23565b508091505092915050565b6000611fee8473ffffffffffffffffffffffffffffffffffffffff1661215d565b15612150578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016120329493929190613afc565b602060405180830381600087803b15801561204c57600080fd5b505af192505050801561207d57506040513d601f19601f8201168201806040525081019061207a9190613b5d565b60015b612100573d80600081146120ad576040519150601f19603f3d011682016040523d82523d6000602084013e6120b2565b606091505b506000815114156120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef90613975565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612155565b600190505b949350505050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6121b981612184565b81146121c457600080fd5b50565b6000813590506121d6816121b0565b92915050565b6000602082840312156121f2576121f161217a565b5b6000612200848285016121c7565b91505092915050565b60008115159050919050565b61221e81612209565b82525050565b60006020820190506122396000830184612215565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561227957808201518184015260208101905061225e565b83811115612288576000848401525b50505050565b6000601f19601f8301169050919050565b60006122aa8261223f565b6122b4818561224a565b93506122c481856020860161225b565b6122cd8161228e565b840191505092915050565b600060208201905081810360008301526122f2818461229f565b905092915050565b6000819050919050565b61230d816122fa565b811461231857600080fd5b50565b60008135905061232a81612304565b92915050565b6000602082840312156123465761234561217a565b5b60006123548482850161231b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123888261235d565b9050919050565b6123988161237d565b82525050565b60006020820190506123b3600083018461238f565b92915050565b6123c28161237d565b81146123cd57600080fd5b50565b6000813590506123df816123b9565b92915050565b600080604083850312156123fc576123fb61217a565b5b600061240a858286016123d0565b925050602061241b8582860161231b565b9150509250929050565b61242e816122fa565b82525050565b60006020820190506124496000830184612425565b92915050565b6000806000606084860312156124685761246761217a565b5b6000612476868287016123d0565b9350506020612487868287016123d0565b92505060406124988682870161231b565b9150509250925092565b6000819050919050565b60006124c76124c26124bd8461235d565b6124a2565b61235d565b9050919050565b60006124d9826124ac565b9050919050565b60006124eb826124ce565b9050919050565b6124fb816124e0565b82525050565b600060208201905061251660008301846124f2565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126125415761254061251c565b5b8235905067ffffffffffffffff81111561255e5761255d612521565b5b60208301915083602082028301111561257a57612579612526565b5b9250929050565b60008060006040848603121561259a5761259961217a565b5b600084013567ffffffffffffffff8111156125b8576125b761217f565b5b6125c48682870161252b565b935093505060206125d7868287016123d0565b9150509250925092565b60006125ec8261235d565b9050919050565b6125fc816125e1565b82525050565b600060208201905061261760008301846125f3565b92915050565b6000819050919050565b6126308161261d565b82525050565b600060208201905061264b6000830184612627565b92915050565b6000602082840312156126675761266661217a565b5b6000612675848285016123d0565b91505092915050565b61268781612209565b811461269257600080fd5b50565b6000813590506126a48161267e565b92915050565b600080604083850312156126c1576126c061217a565b5b60006126cf858286016123d0565b92505060206126e085828601612695565b9150509250929050565b600080602083850312156127015761270061217a565b5b600083013567ffffffffffffffff81111561271f5761271e61217f565b5b61272b8582860161252b565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6127748261228e565b810181811067ffffffffffffffff821117156127935761279261273c565b5b80604052505050565b60006127a6612170565b90506127b2828261276b565b919050565b600067ffffffffffffffff8211156127d2576127d161273c565b5b6127db8261228e565b9050602081019050919050565b82818337600083830152505050565b600061280a612805846127b7565b61279c565b90508281526020810184848401111561282657612825612737565b5b6128318482856127e8565b509392505050565b600082601f83011261284e5761284d61251c565b5b813561285e8482602086016127f7565b91505092915050565b600080600080608085870312156128815761288061217a565b5b600061288f878288016123d0565b94505060206128a0878288016123d0565b93505060406128b18782880161231b565b925050606085013567ffffffffffffffff8111156128d2576128d161217f565b5b6128de87828801612839565b91505092959194509250565b600080604083850312156129015761290061217a565b5b600061290f858286016123d0565b9250506020612920858286016123d0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061297157607f821691505b602082108114156129855761298461292a565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006129e7602c8361224a565b91506129f28261298b565b604082019050919050565b60006020820190508181036000830152612a16816129da565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612a7960218361224a565b9150612a8482612a1d565b604082019050919050565b60006020820190508181036000830152612aa881612a6c565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612b0b60388361224a565b9150612b1682612aaf565b604082019050919050565b60006020820190508181036000830152612b3a81612afe565b9050919050565b7f4d4f524520455448204e45454445440000000000000000000000000000000000600082015250565b6000612b77600f8361224a565b9150612b8282612b41565b602082019050919050565b60006020820190508181036000830152612ba681612b6a565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612c0960318361224a565b9150612c1482612bad565b604082019050919050565b60006020820190508181036000830152612c3881612bfc565b9050919050565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b6000612c75600f8361224a565b9150612c8082612c3f565b602082019050919050565b60006020820190508181036000830152612ca481612c68565b9050919050565b60008160601b9050919050565b6000612cc382612cab565b9050919050565b6000612cd582612cb8565b9050919050565b612ced612ce88261237d565b612cca565b82525050565b6000612cff8284612cdc565b60148201915081905092915050565b7f496e76616c69642050726f6f6600000000000000000000000000000000000000600082015250565b6000612d44600d8361224a565b9150612d4f82612d0e565b602082019050919050565b60006020820190508181036000830152612d7381612d37565b9050919050565b600067ffffffffffffffff821115612d9557612d9461273c565b5b612d9e8261228e565b9050602081019050919050565b6000612dbe612db984612d7a565b61279c565b905082815260208101848484011115612dda57612dd9612737565b5b612de584828561225b565b509392505050565b600082601f830112612e0257612e0161251c565b5b8151612e12848260208601612dab565b91505092915050565b600060208284031215612e3157612e3061217a565b5b600082015167ffffffffffffffff811115612e4f57612e4e61217f565b5b612e5b84828501612ded565b91505092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612ec060298361224a565b9150612ecb82612e64565b604082019050919050565b60006020820190508181036000830152612eef81612eb3565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612f52602a8361224a565b9150612f5d82612ef6565b604082019050919050565b60006020820190508181036000830152612f8181612f45565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612fbe60198361224a565b9150612fc982612f88565b602082019050919050565b60006020820190508181036000830152612fed81612fb1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613050602f8361224a565b915061305b82612ff4565b604082019050919050565b6000602082019050818103600083015261307f81613043565b9050919050565b600081905092915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000600082015250565b60006130c7600983613086565b91506130d282613091565b600982019050919050565b60006130e88261223f565b6130f28185613086565b935061310281856020860161225b565b80840191505092915050565b7f222c20226465736372697074696f6e223a220000000000000000000000000000600082015250565b6000613144601283613086565b915061314f8261310e565b601282019050919050565b7f222c2022696d616765223a202200000000000000000000000000000000000000600082015250565b6000613190600d83613086565b915061319b8261315a565b600d82019050919050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b60006131dc601a83613086565b91506131e7826131a6565b601a82019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b6000613228600283613086565b9150613233826131f2565b600282019050919050565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b6000613274600183613086565b915061327f8261323e565b600182019050919050565b6000613295826130ba565b91506132a182876130dd565b91506132ac82613137565b91506132b882866130dd565b91506132c382613183565b91506132ce826131cf565b91506132da82856130dd565b91506132e58261321b565b91506132f182846130dd565b91506132fc82613267565b915081905095945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000613340601d83613086565b915061334b8261330a565b601d82019050919050565b600061336182613333565b915061336d82846130dd565b915081905092915050565b7f4e4f545f434f4c4c4543544f5200000000000000000000000000000000000000600082015250565b60006133ae600d8361224a565b91506133b982613378565b602082019050919050565b600060208201905081810360008301526133dd816133a1565b9050919050565b600081905092915050565b50565b60006133ff6000836133e4565b915061340a826133ef565b600082019050919050565b6000613420826133f2565b9150819050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061346060208361224a565b915061346b8261342a565b602082019050919050565b6000602082019050818103600083015261348f81613453565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006134cc601c8361224a565b91506134d782613496565b602082019050919050565b600060208201905081810360008301526134fb816134bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061353c826122fa565b9150613547836122fa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561357c5761357b613502565b5b828201905092915050565b7f4e4f545f53544152544544000000000000000000000000000000000000000000600082015250565b60006135bd600b8361224a565b91506135c882613587565b602082019050919050565b600060208201905081810360008301526135ec816135b0565b9050919050565b7f454e444544000000000000000000000000000000000000000000000000000000600082015250565b600061362960058361224a565b9150613634826135f3565b602082019050919050565b600060208201905081810360008301526136588161361c565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006136bb602c8361224a565b91506136c68261365f565b604082019050919050565b600060208201905081810360008301526136ea816136ae565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061374d60298361224a565b9150613758826136f1565b604082019050919050565b6000602082019050818103600083015261377c81613740565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006137df60248361224a565b91506137ea82613783565b604082019050919050565b6000602082019050818103600083015261380e816137d2565b9050919050565b6000613820826122fa565b915061382b836122fa565b92508282101561383e5761383d613502565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613883826122fa565b915061388e836122fa565b92508261389e5761389d613849565b5b828204905092915050565b60006138b4826122fa565b91506138bf836122fa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138f8576138f7613502565b5b828202905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061395f60328361224a565b915061396a82613903565b604082019050919050565b6000602082019050818103600083015261398e81613952565b9050919050565b6000819050919050565b6139b06139ab826122fa565b613995565b82525050565b60006139c2828561399f565b6020820191506139d28284612cdc565b6014820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b613a2c613a278261261d565b613a11565b82525050565b6000613a3e8285613a1b565b602082019150613a4e8284613a1b565b6020820191508190509392505050565b6000613a69826122fa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a9c57613a9b613502565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000613ace82613aa7565b613ad88185613ab2565b9350613ae881856020860161225b565b613af18161228e565b840191505092915050565b6000608082019050613b11600083018761238f565b613b1e602083018661238f565b613b2b6040830185612425565b8181036060830152613b3d8184613ac3565b905095945050505050565b600081519050613b57816121b0565b92915050565b600060208284031215613b7357613b7261217a565b5b6000613b8184828501613b48565b9150509291505056fe436572616d6963206265696e677320776974682073696d756c6174656420736f756c7320636f6c6c656374656420627920746865204d61727469616e2c204e79782e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212207c807da1b4fed468bafb663a2f24d5cabaec0c192b3a3dfd7c73e4d94aff0b3a64736f6c63430008090033608060405234801561001057600080fd5b50615f37806100206000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806388de3fb21161008c578063cde0e4b711610066578063cde0e4b7146102cf578063d05e3b8c146102ff578063d0f206491461032f578063dcaf635d1461035f576100ea565b806388de3fb21461023f5780639adf953d1461026f5780639c0415241461029f576100ea565b80632822b87d116100c85780632822b87d1461017f5780634b44d812146101af57806379b92f27146101df57806388c9f4ec1461020f576100ea565b80631381a846146100ef578063192a0a1f1461011f578063245283b71461014f575b600080fd5b610109600480360381019061010491906118bf565b61038f565b6040516101169190611998565b60405180910390f35b610139600480360381019061013491906119ba565b610478565b6040516101469190611998565b60405180910390f35b61016960048036038101906101649190611b1c565b6104b5565b6040516101769190611998565b60405180910390f35b61019960048036038101906101949190611b1c565b6106ca565b6040516101a69190611998565b60405180910390f35b6101c960048036038101906101c491906119ba565b610784565b6040516101d69190611998565b60405180910390f35b6101f960048036038101906101f491906119ba565b610b16565b6040516102069190611998565b60405180910390f35b61022960048036038101906102249190611b1c565b610e5c565b6040516102369190611998565b60405180910390f35b61025960048036038101906102549190611c06565b610fc4565b6040516102669190611998565b60405180910390f35b61028960048036038101906102849190611b1c565b610fed565b6040516102969190611998565b60405180910390f35b6102b960048036038101906102b49190611b1c565b6110ea565b6040516102c69190611998565b60405180910390f35b6102e960048036038101906102e49190611b1c565b6112ff565b6040516102f69190611998565b60405180910390f35b61031960048036038101906103149190611c4f565b611431565b6040516103269190611998565b60405180910390f35b61034960048036038101906103449190611cf6565b611460565b6040516103569190611998565b60405180910390f35b61037960048036038101906103749190611d52565b611536565b6040516103869190611998565b60405180910390f35b606060018214156103c9576103a383611562565b6040516020016103b39190611e52565b6040516020818303038152906040529050610472565b6002821415610401576103db83611562565b6040516020016103eb9190611ec0565b6040516020818303038152906040529050610472565b60038214156104395761041383611562565b6040516020016104239190611f2e565b6040516020818303038152906040529050610472565b60048214156104715761044b83611562565b60405160200161045b9190611f9c565b6040516020818303038152906040529050610472565b5b92915050565b606061048f61048683611562565b600060086116c3565b60405160200161049f919061200a565b6040516020818303038152906040529050919050565b6060600061010060646104c98560006117bf565b60ff166104d6919061205b565b6104e091906120e4565b90506060600a82101561051057604051806101a0016040528061017f815260200161519e61017f913990506106a1565b601482101561053c57604051806101c001604052806101858152602001615d7d610185913990506106a0565b601e8210156105685760405180610140016040528061010d815260200161471561010d9139905061069f565b60288210156105945760405180610180016040528061014f8152602001615c2e61014f9139905061069e565b60328210156105c05760405180610160016040528061013981526020016142ed6101399139905061069d565b603c8210156105ec5760405180610180016040528061014f8152602001614e0161014f9139905061069c565b60468210156106185760405180610180016040528061014581526020016157716101459139905061069b565b605082101561064457604051806101a0016040528061016681526020016141876101669139905061069a565b605a8210156106705760405180610140016040528061010f815260200161531d61010f91399050610699565b6064821015610698576040518061016001604052806101308152602001613a43610130913990505b5b5b5b5b5b5b5b5b5b806040516020016106b291906121ad565b60405160208183030381529060405292505050919050565b6060600060406106db8460026117bf565b60ff166106e891906120e4565b905060006106f78460036117bf565b60ff16905061073a6040518060400160405280600481526020017f626c757200000000000000000000000000000000000000000000000000000000815250610fc4565b610751600560018561074c91906121da565b61038f565b61075a83611562565b60405160200161076c939291906125e6565b60405160208183030381529060405292505050919050565b606060008260001b60405160200161079c91906126a5565b604051602081830303815290604052905060006107ba8260016117bf565b60ff16905060006040518060400160405280600481526020017f6e6f6e65000000000000000000000000000000000000000000000000000000008152509050608082101561083b576040518060400160405280600581526020017f776869746500000000000000000000000000000000000000000000000000000081525090505b610844836104b5565b61084d846106ca565b610856856112ff565b61085f86610fed565b61086887610e5c565b6108dd6040518060400160405280600381526020017f302e3700000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f626c75720000000000000000000000000000000000000000000000000000000081525088611431565b6109876040518060400160405280600381526020017f302e3500000000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f73746570730000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f6e6f6e6500000000000000000000000000000000000000000000000000000000815250611431565b610a316040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f74757262310000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f6e6f6e6500000000000000000000000000000000000000000000000000000000815250611431565b610adb6040518060400160405280600381526020017f302e3700000000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f74757262320000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f6e6f6e6500000000000000000000000000000000000000000000000000000000815250611431565b610ae48c6110ea565b604051602001610afd9a99989796959493929190612888565b6040516020818303038152906040529350505050919050565b606060008260001b604051602001610b2e91906126a5565b604051602081830303815290604052905060006101006064610b518460006117bf565b60ff16610b5e919061205b565b610b6891906120e4565b905060006040518060600160405280602881526020016158b66028913990506000604051806020016040528060008152509050600a831015610bdd576040518060400160405280600b81526020017f2254797065204f6e65227d00000000000000000000000000000000000000000081525090505b6014831015610c1f576040518060400160405280600b81526020017f22547970652054776f227d00000000000000000000000000000000000000000081525090505b601e831015610c61576040518060400160405280600d81526020017f2254797065205468726565227d0000000000000000000000000000000000000081525090505b6028831015610ca3576040518060400160405280600c81526020017f225479706520466f7572227d000000000000000000000000000000000000000081525090505b6032831015610ce5576040518060400160405280600c81526020017f22547970652046697665227d000000000000000000000000000000000000000081525090505b603c831015610d27576040518060400160405280600b81526020017f225479706520536978227d00000000000000000000000000000000000000000081525090505b6046831015610d69576040518060400160405280600d81526020017f225479706520536576656e227d0000000000000000000000000000000000000081525090505b6050831015610dab576040518060400160405280600d81526020017f2254797065204569676874227d0000000000000000000000000000000000000081525090505b605a831015610ded576040518060400160405280600c81526020017f2254797065204e696e65227d000000000000000000000000000000000000000081525090505b6064831015610e2f576040518060400160405280600b81526020017f22547970652054656e227d00000000000000000000000000000000000000000081525090505b8181604051602001610e429291906129d8565b604051602081830303815290604052945050505050919050565b606060006040610e6d84600b6117bf565b60ff16610e7a91906120e4565b90506000600a6101006064610e9087600c6117bf565b60ff16610e9d919061205b565b610ea791906120e4565b610eb191906120e4565b6001610ebd91906121da565b90506000610ecc85600d6117bf565b60ff1690506000610ede86600e611460565b90506000610eed87600f611460565b90506000610efc886010611460565b905060006040610f0d8a60116117bf565b60ff16610f1a91906120e4565b6001610f2691906121da565b9050610f666040518060400160405280600581526020017f7475726232000000000000000000000000000000000000000000000000000000815250610fc4565b610f7c8760018a610f7791906121da565b61038f565b610f8587611562565b868686610f9187611562565b604051602001610fa79796959493929190612c4c565b604051602081830303815290604052975050505050505050919050565b606081604051602001610fd79190612de3565b6040516020818303038152906040529050919050565b606060006080610ffe8460086117bf565b60ff1661100b91906120e4565b90506000600a61010060646110218760096117bf565b60ff1661102e919061205b565b61103891906120e4565b61104291906120e4565b600161104e91906121da565b9050600061105d85600a6117bf565b60ff1690506110a06040518060400160405280600581526020017f7475726231000000000000000000000000000000000000000000000000000000815250610fc4565b6110b6836002866110b191906121da565b61038f565b6110bf83611562565b6040516020016110d193929190612e10565b6040516020818303038152906040529350505050919050565b6060600061010060646110fe8560006117bf565b60ff1661110b919061205b565b61111591906120e4565b90506060600a82101561114557604051806102c001604052806102868152602001613521610286913990506112d6565b6014821015611171576040518061030001604052806102d58152602001614b2c6102d5913990506112d5565b601e82101561119d57604051806102c0016040528061029c81526020016137a761029c913990506112d4565b60288210156111c9576040518061032001604052806102ef81526020016144266102ef913990506112d3565b60328210156111f55760405180610340016040528061030a815260200161482261030a913990506112d2565b603c82101561122157604051806103800160405280610345815260200161542c610345913990506112d1565b604682101561124d5760405180610380016040528061035081526020016158de610350913990506112d0565b60508210156112795760405180610340016040528061030f8152602001613e7861030f913990506112cf565b605a8210156112a55760405180610280016040528061024e8152602001614f5061024e913990506112ce565b60648210156112cd576040518061034001604052806103058152602001613b73610305913990505b5b5b5b5b5b5b5b5b5b806040516020016112e79190612eb9565b60405160208183030381529060405292505050919050565b6060600060406113108460046117bf565b60ff1661131d91906120e4565b90506000600a61010060646113338760056117bf565b60ff16611340919061205b565b61134a91906120e4565b61135491906120e4565b600161136091906121da565b9050600061136f8560066117bf565b60ff169050600060026113838760076117bf565b60ff1661139091906120e4565b605061139c91906121da565b90506113dc6040518060400160405280600581526020017f7374657073000000000000000000000000000000000000000000000000000000815250610fc4565b6113f2846001876113ed91906121da565b61038f565b6113fb84611562565b61140484611562565b604051602001611417949392919061303c565b604051602081830303815290604052945050505050919050565b6060838383604051602001611448939291906131e7565b60405160208183030381529060405290509392505050565b60606000608061147085856117bf565b60ff1661147d91906120e4565b90506000610100606461149087876117bf565b60ff1661149d919061205b565b6114a791906120e4565b9050600060405180602001604052806000815250905060018314156114ff576040518060400160405280600181526020017f2d0000000000000000000000000000000000000000000000000000000000000081525090505b8061150b83600161038f565b60405160200161151c929190613244565b604051602081830303815290604052935050505092915050565b6060828260405160200161154b929190613326565b604051602081830303815290604052905092915050565b606060008214156115aa576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506116be565b600082905060005b600082146115dc5780806115c59061336b565b915050600a826115d591906120e4565b91506115b2565b60008167ffffffffffffffff8111156115f8576115f76119f1565b5b6040519080825280601f01601f19166020018201604052801561162a5781602001600182028036833780820191505090505b5090505b600085146116b75760018261164391906133b4565b9150600a8561165291906133e8565b603061165e91906121da565b60f81b81838151811061167457611673613419565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856116b091906120e4565b945061162e565b8093505050505b919050565b60606000849050600084846116d891906133b4565b67ffffffffffffffff8111156116f1576116f06119f1565b5b6040519080825280601f01601f1916602001820160405280156117235781602001600182028036833780820191505090505b50905060008590505b848110156117b25782818151811061174757611746613419565b5b602001015160f81c60f81b82878361175f91906133b4565b815181106117705761176f613419565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806117aa9061336b565b91505061172c565b5080925050509392505050565b6000816001836117cf91906121da565b1015611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180790613494565b60405180910390fd5b60018261181d91906121da565b83511015611860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185790613500565b60405180910390fd5b60008260018501015190508091505092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61189c81611889565b81146118a757600080fd5b50565b6000813590506118b981611893565b92915050565b600080604083850312156118d6576118d561187f565b5b60006118e4858286016118aa565b92505060206118f5858286016118aa565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561193957808201518184015260208101905061191e565b83811115611948576000848401525b50505050565b6000601f19601f8301169050919050565b600061196a826118ff565b611974818561190a565b935061198481856020860161191b565b61198d8161194e565b840191505092915050565b600060208201905081810360008301526119b2818461195f565b905092915050565b6000602082840312156119d0576119cf61187f565b5b60006119de848285016118aa565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611a298261194e565b810181811067ffffffffffffffff82111715611a4857611a476119f1565b5b80604052505050565b6000611a5b611875565b9050611a678282611a20565b919050565b600067ffffffffffffffff821115611a8757611a866119f1565b5b611a908261194e565b9050602081019050919050565b82818337600083830152505050565b6000611abf611aba84611a6c565b611a51565b905082815260208101848484011115611adb57611ada6119ec565b5b611ae6848285611a9d565b509392505050565b600082601f830112611b0357611b026119e7565b5b8135611b13848260208601611aac565b91505092915050565b600060208284031215611b3257611b3161187f565b5b600082013567ffffffffffffffff811115611b5057611b4f611884565b5b611b5c84828501611aee565b91505092915050565b600067ffffffffffffffff821115611b8057611b7f6119f1565b5b611b898261194e565b9050602081019050919050565b6000611ba9611ba484611b65565b611a51565b905082815260208101848484011115611bc557611bc46119ec565b5b611bd0848285611a9d565b509392505050565b600082601f830112611bed57611bec6119e7565b5b8135611bfd848260208601611b96565b91505092915050565b600060208284031215611c1c57611c1b61187f565b5b600082013567ffffffffffffffff811115611c3a57611c39611884565b5b611c4684828501611bd8565b91505092915050565b600080600060608486031215611c6857611c6761187f565b5b600084013567ffffffffffffffff811115611c8657611c85611884565b5b611c9286828701611bd8565b935050602084013567ffffffffffffffff811115611cb357611cb2611884565b5b611cbf86828701611bd8565b925050604084013567ffffffffffffffff811115611ce057611cdf611884565b5b611cec86828701611bd8565b9150509250925092565b60008060408385031215611d0d57611d0c61187f565b5b600083013567ffffffffffffffff811115611d2b57611d2a611884565b5b611d3785828601611aee565b9250506020611d48858286016118aa565b9150509250929050565b60008060408385031215611d6957611d6861187f565b5b600083013567ffffffffffffffff811115611d8757611d86611884565b5b611d9385828601611bd8565b925050602083013567ffffffffffffffff811115611db457611db3611884565b5b611dc085828601611bd8565b9150509250929050565b600081905092915050565b7f302e000000000000000000000000000000000000000000000000000000000000600082015250565b6000611e0b600283611dca565b9150611e1682611dd5565b600282019050919050565b6000611e2c826118ff565b611e368185611dca565b9350611e4681856020860161191b565b80840191505092915050565b6000611e5d82611dfe565b9150611e698284611e21565b915081905092915050565b7f302e300000000000000000000000000000000000000000000000000000000000600082015250565b6000611eaa600383611dca565b9150611eb582611e74565b600382019050919050565b6000611ecb82611e9d565b9150611ed78284611e21565b915081905092915050565b7f302e303000000000000000000000000000000000000000000000000000000000600082015250565b6000611f18600483611dca565b9150611f2382611ee2565b600482019050919050565b6000611f3982611f0b565b9150611f458284611e21565b915081905092915050565b7f302e303030000000000000000000000000000000000000000000000000000000600082015250565b6000611f86600583611dca565b9150611f9182611f50565b600582019050919050565b6000611fa782611f79565b9150611fb38284611e21565b915081905092915050565b7f4c6974746c65204d61727469616e202300000000000000000000000000000000600082015250565b6000611ff4601083611dca565b9150611fff82611fbe565b601082019050919050565b600061201582611fe7565b91506120218284611e21565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061206682611889565b915061207183611889565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156120aa576120a961202c565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006120ef82611889565b91506120fa83611889565b92508261210a576121096120b5565b5b828204905092915050565b7f3c636c6970506174682069643d226d223e203c7061746820643d220000000000600082015250565b600061214b601b83611dca565b915061215682612115565b601b82019050919050565b7f222f3e3c2f636c6970506174683e000000000000000000000000000000000000600082015250565b6000612197600e83611dca565b91506121a282612161565b600e82019050919050565b60006121b88261213e565b91506121c48284611e21565b91506121cf8261218a565b915081905092915050565b60006121e582611889565b91506121f083611889565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156122255761222461202c565b5b828201905092915050565b7f3c666554757262756c656e636520626173654672657175656e63793d22000000600082015250565b6000612266601d83611dca565b915061227182612230565b601d82019050919050565b7f2220736565643d22000000000000000000000000000000000000000000000000600082015250565b60006122b2600883611dca565b91506122bd8261227c565b600882019050919050565b7f2220726573756c743d227475726273222f3e0000000000000000000000000000600082015250565b60006122fe601283611dca565b9150612309826122c8565b601282019050919050565b7f3c666553706563756c61724c69676874696e6720737572666163655363616c6560008201527f3d223230302220726573756c743d226f7574222073706563756c61724578706f60208201527f6e656e743d223230223e00000000000000000000000000000000000000000000604082015250565b6000612396604a83611dca565b91506123a182612314565b604a82019050919050565b7f3c6665506f696e744c6967687420783d223231362220793d22313722207a3d2260008201527f323030222f3e0000000000000000000000000000000000000000000000000000602082015250565b6000612408602683611dca565b9150612413826123ac565b602682019050919050565b7f3c2f666553706563756c61724c69676874696e673e0000000000000000000000600082015250565b6000612454601583611dca565b915061245f8261241e565b601582019050919050565b7f3c6665476175737369616e426c757220696e3d226f757422207374644465766960008201527f6174696f6e3d22342220726573756c743d22626c7572726564222f3e00000000602082015250565b60006124c6603c83611dca565b91506124d18261246a565b603c82019050919050565b7f3c6665436f6d706f7369746520696e3d22536f7572636547726170686963222060008201527f696e323d22626c757272656422206f70657261746f723d2261726974686d657460208201527f696322206b313d223022206b323d223122206b333d223122206b343d2230222f60408201527f3e00000000000000000000000000000000000000000000000000000000000000606082015250565b6000612584606183611dca565b915061258f826124dc565b606182019050919050565b7f3c2f66696c7465723e0000000000000000000000000000000000000000000000600082015250565b60006125d0600983611dca565b91506125db8261259a565b600982019050919050565b60006125f28286611e21565b91506125fd82612259565b91506126098285611e21565b9150612614826122a5565b91506126208284611e21565b915061262b826122f1565b915061263682612389565b9150612641826123fb565b915061264c82612447565b9150612657826124b9565b915061266282612577565b915061266d826125c3565b9150819050949350505050565b6000819050919050565b6000819050919050565b61269f61269a8261267a565b612684565b82525050565b60006126b1828461268e565b60208201915081905092915050565b7f3c7376672077696474683d2234383022206865696768743d223436302220766960008201527f6577426f783d2230203020343830203436302220786d6c6e733d22687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667223e000000000000000000604082015250565b6000612742605783611dca565b915061274d826126c0565b605782019050919050565b7f3c7374796c6520747970653d22746578742f637373223e2e637b66696c6c3a7760008201527f686974657d3c2f7374796c653e00000000000000000000000000000000000000602082015250565b60006127b4602d83611dca565b91506127bf82612758565b602d82019050919050565b7f3c726563742077696474683d2234383022206865696768743d2234363022206660008201527f696c6c3d22626c61636b222f3e00000000000000000000000000000000000000602082015250565b6000612826602d83611dca565b9150612831826127ca565b602d82019050919050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000600082015250565b6000612872600683611dca565b915061287d8261283c565b600682019050919050565b600061289382612735565b915061289e826127a7565b91506128a982612819565b91506128b5828d611e21565b91506128c1828c611e21565b91506128cd828b611e21565b91506128d9828a611e21565b91506128e58289611e21565b91506128f18288611e21565b91506128fd8287611e21565b91506129098286611e21565b91506129158285611e21565b91506129218284611e21565b915061292c82612865565b91508190509b9a5050505050505050505050565b7f2261747472696275746573223a205b0000000000000000000000000000000000600082015250565b6000612976600f83611dca565b915061298182612940565b600f82019050919050565b7f5d00000000000000000000000000000000000000000000000000000000000000600082015250565b60006129c2600183611dca565b91506129cd8261298c565b600182019050919050565b60006129e382612969565b91506129ef8285611e21565b91506129fb8284611e21565b9150612a06826129b5565b91508190509392505050565b7f3c6665436f6d706f6e656e745472616e7366657220726573756c743d2277617660008201527f65223e0000000000000000000000000000000000000000000000000000000000602082015250565b6000612a6e602383611dca565b9150612a7982612a12565b602382019050919050565b7f3c666546756e635220747970653d2267616d6d6122206f66667365743d220000600082015250565b6000612aba601e83611dca565b9150612ac582612a84565b601e82019050919050565b7f222f3e0000000000000000000000000000000000000000000000000000000000600082015250565b6000612b06600383611dca565b9150612b1182612ad0565b600382019050919050565b7f3c666546756e634720747970653d2267616d6d6122206f66667365743d220000600082015250565b6000612b52601e83611dca565b9150612b5d82612b1c565b601e82019050919050565b7f3c666546756e634220747970653d2267616d6d6122206f66667365743d220000600082015250565b6000612b9e601e83611dca565b9150612ba982612b68565b601e82019050919050565b7f3c666546756e634120747970653d226c696e6561722220736c6f70653d220000600082015250565b6000612bea601e83611dca565b9150612bf582612bb4565b601e82019050919050565b7f3c2f6665436f6d706f6e656e745472616e736665723e00000000000000000000600082015250565b6000612c36601683611dca565b9150612c4182612c00565b601682019050919050565b6000612c58828a611e21565b9150612c6382612259565b9150612c6f8289611e21565b9150612c7a826122a5565b9150612c868288611e21565b9150612c91826122f1565b9150612c9c82612a61565b9150612ca782612aad565b9150612cb38287611e21565b9150612cbe82612af9565b9150612cc982612b45565b9150612cd58286611e21565b9150612ce082612af9565b9150612ceb82612b91565b9150612cf78285611e21565b9150612d0282612af9565b9150612d0d82612bdd565b9150612d198284611e21565b9150612d2482612af9565b9150612d2f82612c29565b9150612d3a826125c3565b915081905098975050505050505050565b7f3c66696c7465722069643d220000000000000000000000000000000000000000600082015250565b6000612d81600c83611dca565b9150612d8c82612d4b565b600c82019050919050565b7f222077696474683d223130302522206865696768743d2231303025223e000000600082015250565b6000612dcd601d83611dca565b9150612dd882612d97565b601d82019050919050565b6000612dee82612d74565b9150612dfa8284611e21565b9150612e0582612dc0565b915081905092915050565b6000612e1c8286611e21565b9150612e2782612259565b9150612e338285611e21565b9150612e3e826122a5565b9150612e4a8284611e21565b9150612e55826122f1565b9150612e60826125c3565b9150819050949350505050565b7f3c7061746820636c6173733d22632220643d2200000000000000000000000000600082015250565b6000612ea3601383611dca565b9150612eae82612e6d565b601382019050919050565b6000612ec482612e96565b9150612ed08284611e21565b9150612edb82612af9565b915081905092915050565b7f3c666553706563756c61724c69676874696e6720737572666163655363616c6560008201527f3d22000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f42602283611dca565b9150612f4d82612ee6565b602282019050919050565b7f2220726573756c743d22737065634f7574222073706563756c61724578706f6e60008201527f656e743d223230223e0000000000000000000000000000000000000000000000602082015250565b6000612fb4602983611dca565b9150612fbf82612f58565b602982019050919050565b7f3c6665506f696e744c6967687420783d223231302220793d22313722207a3d2260008201527f323030222f3e0000000000000000000000000000000000000000000000000000602082015250565b6000613026602683611dca565b915061303182612fca565b602682019050919050565b60006130488287611e21565b915061305382612259565b915061305f8286611e21565b915061306a826122a5565b91506130768285611e21565b9150613081826122f1565b915061308c82612f35565b91506130988284611e21565b91506130a382612fa7565b91506130ae82613019565b91506130b982612447565b91506130c482612577565b91506130cf826125c3565b915081905095945050505050565b7f3c726563742077696474683d223130302522206865696768743d22323030252260008201527f20636c69702d706174683d2275726c28236d2922206f7061636974793d220000602082015250565b6000613139603e83611dca565b9150613144826130dd565b603e82019050919050565b7f222066696c7465723d2275726c28230000000000000000000000000000000000600082015250565b6000613185600f83611dca565b91506131908261314f565b600f82019050919050565b7f29222066696c6c3d220000000000000000000000000000000000000000000000600082015250565b60006131d1600983611dca565b91506131dc8261319b565b600982019050919050565b60006131f28261312c565b91506131fe8286611e21565b915061320982613178565b91506132158285611e21565b9150613220826131c4565b915061322c8284611e21565b915061323782612af9565b9150819050949350505050565b60006132508285611e21565b915061325c8284611e21565b91508190509392505050565b7f3c666554757262756c656e636520747970653d2274757262756c656e6365222060008201527f736565643d220000000000000000000000000000000000000000000000000000602082015250565b60006132c4602683611dca565b91506132cf82613268565b602682019050919050565b7f2220626173654672657175656e63793d22000000000000000000000000000000600082015250565b6000613310601183611dca565b915061331b826132da565b601182019050919050565b6000613331826132b7565b915061333d8285611e21565b915061334882613303565b91506133548284611e21565b915061335f826122f1565b91508190509392505050565b600061337682611889565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133a9576133a861202c565b5b600182019050919050565b60006133bf82611889565b91506133ca83611889565b9250828210156133dd576133dc61202c565b5b828203905092915050565b60006133f382611889565b91506133fe83611889565b92508261340e5761340d6120b5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f746f55696e74385f6f766572666c6f7700000000000000000000000000000000600082015250565b600061347e60108361190a565b915061348982613448565b602082019050919050565b600060208201905081810360008301526134ad81613471565b9050919050565b7f746f55696e74385f6f75744f66426f756e647300000000000000000000000000600082015250565b60006134ea60138361190a565b91506134f5826134b4565b602082019050919050565b60006020820190508181036000830152613519816134dd565b905091905056fe4d3138322032323363302d332d342d352d372d362d352d312d3820312d313420332d313220342d313920322d3139203473382036203137203663313120312032332d332032332d377a4d3233352032323763302d3220392d352031342d367331312d322031382d31633720322031362037203135203130203020332d3920332d313020342d3720302d31302d322d31382d342d31322d332d31382d312d31392d337a204d32343120333030633020322d3320332d3420332d313320362d313020382d32312031322d3720332d313520352d323520342d3420302d31322d312d31382d372d362d352d31302d31342d31302d31342031332d392031362d31352031362d31356c332d3663342d313020322d313120352d31396c352d3131762d3263362d313620332d333120332d33312d312d332d332d31342d31302d31396c2d322d3261333920333920302030302d31352d35632d322d312d392d322d313620302d3820312d313120342d313320332d312d3120312d3820362d313220382d372032302d342032372d32203520312031322032203139203861343020343020302030313134203331763139632d322031322d322031382d362032366c2d35203130632d31322032312d31342032352d31322032392031203620372039203820313020313120342032332d342032342d3520392d3620392d31332031352d313420362030203132203520313220397a204d3137342033333863312d3220332d312032372d3268313463342032203620342039203373322d3520352d3763342d3320372d312031342031203132203220313720302031382031203120342d31352031342d33322031392d3820332d313620352d323520342d31372d332d33312d31352d33302d31397a4d31353220323035733235203130203337203163332d322d352d392d382d31312d372d332d31302d362d31342d352d313220322d31372031322d31352031357a4d32363520323134632d322d3220362d392031372d313420352d3220392d322031312d322031332030203231203132203231203132203020332d3920342d313020342d3820322d372d332d31352d342d31332d322d323220362d323420347a4d31393120323839632d3320312d3620382d33203133733130203620313420396332203120362034203135203420362d3120362d342031332d366c31342d3463372d322031302d332031302d38732d352d392d352d39203220372d31203132632d3320342d313120322d313920352d313120352d3820362d313820352d3720302d31372d342d32312d382d332d3320312d313320312d31337a4d31383420333531632d3120312031302031312032362031366c313320326333203020313020302031382d3520362d332031322d392031312d3131732d3820312d32312034632d3820322d313720332d323620322d31332d322d32312d392d32312d387a4d32353220313735633120312031302d31302032352d31322031332d3320323620322032382033203720332031322037203133203620312d322d342d392d31312d31342d31342d392d33322d322d33342d312d313420362d32312031372d32312031387a4d31343420313638633120322031342d31322033302d3130203138203220313720313320323620392030203020312d332d342d372d31312d352d31352d31312d33342d342d313120342d32302031302d31382031327a4d3231332032313563312d35203320323720322033386c2d35203138632d3120342d3520352d35203520322d3420342d3620362d313620322d313720312d343020322d34357a4d313934203135632d313820322d323020302d343520342d323920342d333120362d34372031322d3220322d32352031322d33352033352d3420392d352031372d352032322d35203636203234203133362032342031333620323120343920333220343120343820383520362031362031312033342032372035322031302031312031392031362033362032372033352032322035342033352037392033302031352d332032372d31322033312d313520332d332031372d31342032352d333420392d323420322d333720352d37366c362d343263362d343320392d353220342d36372d342d31322d372d31302d31342d33302d362d31342d362d31392d31312d33366c2d31342d3334632d31302d32302d31382d33372d33342d35302d33322d32352d37342d32302d38302d31397a4d33313320313238633020312d31342d362d33312d3161343620343620302030302d33302035326330203320342039203130203230203130203138203131203137203135203236203920313820372032302031342033302032203320313020372031322031366c31203163322031302d382032312d313020323361363020363020302030312d3335203138632d313220332d323720362d33362d322d372d362d392d31362d372d313720322d3220362032203133203620313620362033322032203338203120392d332031382d352032332d313420302d3120352d313020312d31376c2d31392d3339632d352d31302d33312d34332d33322d36312d312d352d322d313220352d323520312d3320392d32302032382d32352032312d36203430203620343020387a204d3332382031373263312d332d352d392d31322d31302d332d312d382d332d323020312d3820332d313320382d31352031312d3520352d392031302d372031322032203120382d382031392d313020372d31203820322031382031203320302031362d312031372d357a4d31393820323031632d312d362d31312d31312d31382d392d3720312d3620372d31362031342d3920362d313420342d32302031312d3220332d3620392d342031312032203320382d312032362d362031332d332031372d332032332d3820332d322031302d3720392d31337a4d31393720313536632d3120322d31322d362d33312d352d313420312d323520372d323720382d313120362d31362031332d31382031312d322d3120302d313220372d313820352d3520392d332032342d372031332d352031332d372031392d3720313520302032382031352032362031387a4d3332322033313573332031382d33203238632d3520392d31322031332d31362031352d3420332d313520392d333120392d313020302d31302d342d33312d386c2d31362d3463302d332031312d342032372d31342031302d362031332d372032302d372036203020382033203132203120342d3120342d3520392d396c31322d366331332d322031342d372031372d357a4d3131382031353263302d3220382d332031352d3420392d31203133203020313520312035203120372034203720352032203120342034203420386c2d352037732d322d372d372d3130632d342d332d3720312d31362d312d362d312d31342d342d31332d367a204d313433203130336331203120382d332031372d3320323420312032352032382032352033392d3120313120302031382d382032352d3920382d3720332d31382031382d3620372d362031312d31322031382d3520372d32392032332d33352033322d3320352d3420392d342031352d31203132203138203136203232203230203920372031312031322032302031342037203320313420352032312d3120352d3420372d313020352d31322d322d332d31322031322d323220392d372d32203020302d31372d31342d31312d392d31372d362d32302d31372d322d313120372d31382032312d32382031322d382031322d31312031362d313520372d313020362d31332031332d323220392d31312032352d31312032352d333820302d31302d322d31382d332d32352d312d392d372d31342d31312d31392d352d352d31342d392d32322d37732d313420392d31332031317a4d3233302031393963312d3320352d3620392d37203220302031322d332032312030203130203320313220382031372031342037203920322032322035203234203220312d372d372d31362d31332d372d352d362d342d31372d382d392d352d31392d342d31392d31307a4d33303020313634732d332d31302d31342d3138632d332d322d31332d31302d32362d31302d313720302d32372031312d323920392d312d3220372d31342031392d31382031342d34203235203320323820342031382031302032332033332032322033337a4d31363420333332633120342d31322031302d32352031312d3320302d313220302d32312d352d382d342d31322d31302d31342d31342d342d362d362d31392d362d31396c3132203220313520356334203720362037203620372032203220342d31203820302034203020362032203920342031302038203136203720313620397a4d313734203335632d3820382d372031332d32322033302d31312031332d31352031342d31392032322d362031332d322031382d382033336c2d3135203234632d32302032392d32322033332d32342033396c2d35203239632d322031372d312032302d322034316c2d352034352d32203335633120313320322033392032312035382038203920313720313320323220313520313520362032382036203336203620313820302033302d342034342d392031362d352032352d382033352d31367331302d31322032352d33336331332d31362032302d32362033312d33362031382d31372032352d31352033392d333220392d31302031342d32302031372d323520362d313420382d32332031342d34332031322d34332031332d33382031352d343820332d33302d392d35342d31372d36392d352d31312d32302d33392d35312d35392d392d362d33352d32332d37312d32332d313620302d343120302d35382031367a4d31343720343363362d362031342d31342032372d31382031352d362033302d342034392d31613132392031323920302030313933203532633820313320313520333520313520353720302031372d362032342d37203532763235632d3120362d322031362d31352035346c2d3130203239632d352032302d31312032372d31342033392d372032332d31342033362d32312034332d32322032342d34372033322d35332033342d313220342d32332d312d33322d352d31302d352d392d362d32332d32332d31322d31352d31332d31322d32302d32332d31302d31332d31312d32322d31382d34392d31302d34302d31362d33372d31382d35392d322d323520382d323420362d353520302d32302d312d323420312d343420312d313020332d333420372d353320322d382031352d33362033332d35357a4d3135392032333963302d32203720302031342d346c342d3420362d3720352d3131733420362034203131633120372d352031362d3134203139732d31392d332d31392d347a4d32373020313939632d312d3220362d392031332d31326c31302d3363372d3520382d31322031302d3131203220302033203920302031352d3420352d3920372d313820392d3420312d313420342d313520327a4d313334203231386331203020332d392031332d31366c312d322031362d376331332d352031322d31322032312d313320372d3120313220312031322031732d382d362d31352d36632d3820302d3820332d32312031302d313020362d3920312d313520362d313020392d31332032372d31322032377a204d33303520313431732d31312d392d32332d36632d3320312d3520322d32312031386c2d3133203134632d3420362d31312031342d31322032362d3220313620372033302031372034356c3130203133203220322031302031306338203620313620392031372039203520322037203220372034203120322d3320352d3820392d31302031302d382031342d31342031386c2d32302032632d3820312d3820322d313220312d362d312d31352d352d31342d376c3134203363313420322032382d332032392d3420372d372031322d31342031332d313820312d362d31322d332d32362d31372d362d362d31322d31322d31372d32302d392d31332d31322d32342d31332d32372d342d31362d322d32382d322d333120312d313020352d31362031332d323420352d3520352d392031352d31377331302d31302031342d31326331352d36203334203820333420397a4d3234352033343573372d31312031352d313463342d3220352d312031342d3320372d322031302d332031342d366c382d3963362d3720362d3920392d313020332d3220392d362031312d34203220312032203320302031366c2d34203136632d3520382d31322031312d31382031342d3820332d313420342d313920342d3920312d33302d342d33302d347a4d31383820323163332d312034332031203630203420333320362037302034372037392036352032203520313720363020313720383120302031352d3420332d3420343420302032342d362034302d31362036312d392032362d372033342d3138203630613131332031313320302030312d3530203633632d313220372d32332031342d34302031332d31382d312d33332d31372d33372d32342d32312d33372d34312d36352d34352d37332d332d382d32312d33332d32352d36372d312d313220352d333720342d35362d312d32392d372d33392d342d353020382d323620362d31362031312d343220342d323020382d35322032362d36342031352d31322033322d31342034322d31357a4d313236203231366c372d3663332d3320362d342031302d3420392d312037203020313220316c34203273342034203220342d3820372d31352037632d313520312d32302d342d32302d347a204d313234203137326330203120362d352031322d362031332d3120323420322033332031316c3120316331302031312031302032352031302032386c2d342031382d36203238632d3120313420312032312d342032376c2d362036632d3520352d3820362d3820382030203420342036203520376c392036203920356334203120362d342031332d3673392032203138203063372d312031332d352031322d366c2d31372031632d313920312d313620352d323320362d313020302d31392d382d32302d31302d312d3620352d31302031302d313720342d3520342d313520352d323520332d323420342d323120372d333420332d313020332d313520322d32322d322d31372d322d32342d31372d33322d392d352d32332d392d33322d322d3520342d313020372d3920387a4d323334203231396c31302d3763342d3220392d312031332d31203420312039203120313620366c332035633420352039203320392034732d3420322d392032632d3420302d3720302d31322d322d362d312d31312d352d31372d362d31312d322d31332d312d31332d317a4d32393420313930633020312d342d362d31312d31312d382d352d31352d362d32352d362d31312d312d32312d312d323920356c2d352035632d312d3120312d3620352d3920372d372031392d362033322d34203130203120313620322032322036203820362031312031342031312031347a4d32333620333339633020342d313120362d32302031346c2d362034632d3320322d3620322d3720322d313320312d313820322d323320302d31302d332d392d322d31322d356c2d31302d372d392d36632d312d312d352d312d342d326c342d3263362d3320352d312031302d3320342d3220372d332031302d322035203020332032203820322034203120362d322031322d3320342d3120372d3120313720312031392033203239203520333020377a4d33323620323030632d3120312d392d362d32392d31322d32332d372d33322d352d33352d342d3320302d313120332d313820313061333820333820302030302d313020323663302036203220362035203138203120342034203136203520333120312031332d31203133203120323173352031312035203138632d3120322d3120382d352031332d372031302d32312031302d32322031302d313020302d392d352d32382d31322d392d332d32352d31312d32342d313820312d342031302d313220372d31326c38203133633620392031362031372032372031382037203120313920302032342d3720332d372d322d31322d362d333073302d31372d342d3438632d322d31332d342d31392d322d323820312d3520332d31342031312d323120362d352032312d31342034302d313120323820352035312032332035302032357a4d313331203137356331362d31342035312d382036302d33203320322030203120302030203020302d332d392d31382d31332d342d322d31392d322d333120372d3620342d3920362d313120397a4d3132352032313063322d352032302d352033332d332033203020313620302032322031316c31203663312038203320313020332031302d3420312d392d352d31372d38682d3136632d313320302d32372d31302d32362d31367a204d3235372032333663302d352031342d31302032362d31302031392031203336203134203334203137203020322d3320312d313320336c2d31382033632d313320302d32392d372d32392d31337a4d3135312033353563312d3220352032203135203420313120312032312d312032342d3120372d322031302d342031342d3220352032203520372039203773362d362031322d376c382032633131203420323020302032302031203120322d31302031332d33322032312d313020342d313420322d323020322d313120312d32302d322d32332d342d31372d372d32372d32332d32372d32337a4d313335203437632d362031302d31342032332d32322035322d322031312d342031392d352033382d312031312d362032302d31302033312d392032392d392032372d31312033392d312038203120333620342035356c3620323963342032352033203238203720343161323136203231362030203030323720353863313020313520313420323120323820323520362032203135203720323620362031302d312032352d332034322d313120322d322031312d362032342d313720392d382032382d32352034332d35342031342d323620382d33312032342d35352031312d31382031362d31382031392d333120362d313820322d313620362d343120342d313620312d333020312d343320312d31332d322d31352d322d333120302d32392d322d33352d352d34372d392d33342d35312d35392d38312d36382d34322d31342d3130312d372d3132312032347a4d3130332032303663322d3220372034203136203520313220312032322d322032322d32732d3320362d39203130632d3120312d313020362d313920322d372d342d31322d31332d31302d31357a204d31303620313634633020342033302d372034332031322038203131203720333620322034392d3320392d31312032302d31342033397631632d342032302d392032392d31302033302d3320332d362031302d36203138763263322038203820313220313020313461333120333120302030303139203763332030203920302031372d3320352d312031362d362031362d382d312d342d33362031372d35322d332d31302d313320352d32372031342d363620332d31312031362d33332031372d353320312d31392d322d32392d31352d33382d31372d31322d34312d352d34312d317a4d323631203234316c2d382d34632d362d342d31312d31352d32382d31312d3520312d313120372d3131203920302031203320332031322035203820322031322d332032312032203620332031342d312031342d317a4d32373720323035632d3120322d382d392d32312d31332d31312d322d323220302d323820326c2d31332033632d312d3120382d392032302d313220322d312031362d34203239203420313020362031342031352031332031367a4d31393520333730633120322d372031312d31392031332d3920332d313720302d32332d322d372d322d31362d352d31382d313220302d3220302d3620322d37733420342031312036633520322037203020313420316c39203363313220352032332d332032342d327a4d313839203439632d323320372d33352032342d34302033322d31322031362d31352033312d31372034312d3620323620312032392d322037332d312031332d322032312d31203335733420323620352033336c313420343220313120323820362031326331203320352031312031382032376c313320313563313420392032392036203331203520392d322031352d372032302d31312031302d382031352d31372032342d333520362d313020392d31362031312d323320362d313720322d323020382d333520362d31342031312d31332031342d323620322d3820312d313120342d323120332d3820352d3920352d313520302d372d322d382d342d31372d322d313120312d313320302d32372d322d31312d342d31322d332d313720322d3920382d31312031312d313920342d313020302d32312d322d32372d322d342d332d362d32322d33306c2d31362d3138632d342d332d31302d392d31392d31342d332d322d31332d372d32372d31302d382d312d32342d342d343220327a4d323233203137632d313120302d343220322d37322032332d33362032352d36332037332d35372031313120312038203520323220322034322d332031352d372031382d392033312d3320313320302032372036203533203520323020392033392031392036326c3132203234633820323120372032352031332033342032203320313220313720333020323120313520332032382d322034322d386c31392d31316134343320343433203020303036372d383163392d31362031362d32372032332d34336c31352d34386331312d33332031362d35302031372d363220332d323020352d33392d322d36312d31312d33372d34312d35362d35322d36332d392d372d33352d32342d37332d32347a4d3132302031363863302d342031332d352031382d356831336c31312d3263322032203020382d352031332d3720372d313920342d323120342d382d322d31372d372d31362d31307a204d31323220313236633120312031302d382032352d37203820302031342d3120313920312037203320313320392031372031356c332031326331203520312031312d322031396c2d31302032382d37203235632d342031342d31332032302d31362032352d3520382d3720372d392031342d3220332d3320382d312031332033203420332033203920366c31302037633420322037203420313120332033203020332d3220382d3320312d3120362d332031332d3220382032203920372031342037203620302031322d382031302d31302d312d322d3120362d313020352d31322d312d31322d362d32312d36732d313220332d31392032632d362d312d31382d362d31392d31322d312d312d322d3720352d31376c392d313363362d3720382d31312031322d323420352d313620312d313020352d32306c31332d333163322d3720312d31372d332d32372d342d382d362d31332d31322d31372d372d342d31372d31302d33302d382d313520322d32352031332d32342031357a4d3132382033313663322d332031322d322031372d326c39203273332035203720366334203220352d312031302d3120352d31203920302031342031203420312037203220313520376c32382031352d31372039632d313020332d313820332d323520332d31382d312d32392d372d33322d382d392d352d31352d31312d31372d31332d312d312d31332d31342d392d31397a4d3234312031393263302d3320362d362031312d3720362d322031322d312031342d31203720312031322034203136203720372034203131203820313420313173382038203720392d392d362d32332d3131632d382d332d31362d342d32312d352d31322d322d31372d312d31382d337a4d33313620313633732d332d31322d31332d32316c2d342d33632d322d322d372d392d31382d31326c2d31352d31632d3720302d313720362d3137203620322d3220322d352031332d3920362d322031342d332032342031203131203420313320362031392031312031312031312031322032372031312032387a4d393220373563372d31342031352d32312031372d3233613137392031373920302030313130342d323263313120312032382033203439203133203820342031392039203331203231203520332031352031342032342033316c3132203333203720313920313120333063352031372038203236203820333820302031342d342031362d31302034362d322031342d342032312d342032392d3220323620312033302d312035342d3120362d342031302d382031392d382031372d31332032362d32312033332d3920372d313820392d32372031312d3720312d333820382d36322d382d31302d362d31302d31312d32362d31396c2d31362d38732d31332d362d32342d3135632d362d342d31382d31362d33392d37316c2d31352d3435632d31312d32392d31352d33362d31372d3532762d343263312d343720302d353820372d37327a7b2274726169745f74797065223a2022436572616d6963205368656c6c222c202276616c7565223a4d33323920313830733420302d31312d346c2d31342d33632d3320302d313120312d313720362d3120302d3720352d36203720312031203620302031352d316c3137203163313120302031372d342031362d367a204d33323120313338732d31382d352d33312d32632d3420312d3920312d323020392d31332031302d31362031332d31372032332d3220392d3220313720322032352033203820302034203130203231203820313320313220313720313220323320312031302d332031332d312032322030203220332031342031302031356831633620312031332d312031342d3220342d3420322d313120332d3131203220302034203820302031352d3220342d3420342d31352031336c2d313320382d31372031632d313220302d313320342d313920332d382d322d31352d392d31352d313620302d3320362d3720342d37733120313620392031386337203120362d332031322d32203620302031332d312032302d3620322d3120362d3420362d3720322d372d322d31302d362d32302d332d3820332d313220312d32342d312d382d362d392d31322d32312d382d31362d31312d31372d31342d32372d312d332d332d323120322d333020332d3620322d392031322d313620372d352031322d382032302d31302031352d332031392d312032352d3120392031203137203620313720367a4d3139392031393363302d332d372d352d31322d342d3620312d3820352d313320392d3420342d313120382d3232203130203320322036203420313120342037203120313820302032372d3520382d342031302d313020392d31347a4d31393020313536632d3120312d322d312d352d33203020302d352d332d31322d342d31332d322d323520372d323820392d3920362d31322031332d3134203132732d312d3920342d313663382d31342032372d31342033302d313520352030203131203020313620342037203420313020313320392031337a4d3331392033323473312031312d33203136632d3220332d3620352d313720392d313520352d323320382d333320372d392d312d31352d342d32322d372d322d312d372d332d372d3520302d312031332035203235203020362d3320382d372031352d3768313063342d3120362d342031302d3720372d362032322d362032322d367a4d37312039337632316c312032346333203232203520323320392034386c32203133633420313220313320323020313520323320392038203231203330203435203734203920313820313320323620323220333620392038203136203133203237203230203138203132203435203238203738203332613537203537203020303034392d313863382d392031312d31382031362d333720362d323120392d333120362d34302d322d362d352d31302d362d31386c322d313863322d313020362d323620352d343220302d31342d352d32362d372d33336c2d31302d3232632d362d31382d322d32312d382d33322d352d392d382d392d31372d32322d382d31322d392d31382d31342d32352d392d31372d32332d32352d33382d33332d33352d32302d36392d32302d38322d31392d313520312d333620322d35382031362d3320322d33352032342d33372035327a4d323430203233633137203320323520352033352031312031332038203139203137203239203333613139372031393720302030313335203130366332203231203220333120302034302d3320392d382031362d31302033316c2d32203134633020342d332031382d31302033312d3320372d392031332d32322032372d31332031322d31372031352d32312032342d3320362d3220392d362031352d3420372d382031322d31342031372d392031302d313120392d32322031392d3920392d382031302d31342031342d3820362d313720392d32352031302d313420312d32352d372d34352d32332d31302d382d34302d33322d34332d35376c2d312d31312d332d3239632d332d32322d382d32332d392d333720302d313320332d313320372d333820342d323020312d323120352d353320332d323420342d323020352d333420312d32322d312d333220342d34386c382d313863322d3320382d31342032302d323520362d352032302d31372034312d32322031382d352033332d3220353820337aa2646970667358221220d43c8860695d183b494778c987be6ac981053c97f1ba36c9201a9758b9a6223a64736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000af69610ea9ddc95883f97a6a3171d52165b69b030000000000000000000000002c48763e807f51d58cfc72f3d903513e12af355100000000000000000000000000000000000000000000000000000000625d6ee000000000000000000000000000000000000000000000000000000000628258e05a205b661dc03e3b33329ec05c331ddb579d0a146b5a14e68d88d5eafaaa5d15000000000000000000000000000000000000000000000000000000000000000f4c6974746c65204d61727469616e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034c4d530000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101b75760003560e01c806370a08231116100ec578063aba048b41161008a578063c87b56dd11610064578063c87b56dd14610613578063c884ef8314610650578063e086e5ec1461068d578063e985e9c5146106a4576101b7565b8063aba048b414610596578063b88d4fde146105bf578063c24a0f8b146105e8576101b7565b8063913e77ad116100c6578063913e77ad146104da57806395d89b4114610505578063a22cb46514610530578063a48b3b8f14610559576101b7565b806370a082311461043557806379b92f27146104725780638da5cb5b146104af576101b7565b8063303e74df116101595780634b44d812116101335780634b44d812146103655780636352211e146103a257806366d003ac146103df5780636d9ec4941461040a576101b7565b8063303e74df146102e8578063423d79391461031357806342842e0e1461033c576101b7565b8063095ea7b311610195578063095ea7b3146102615780630b97bc861461028a5780631249c58b146102b557806323b872dd146102bf576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de91906121dc565b6106e1565b6040516101f09190612224565b60405180910390f35b34801561020557600080fd5b5061020e6107c3565b60405161021b91906122d8565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612330565b610855565b604051610258919061239e565b60405180910390f35b34801561026d57600080fd5b50610288600480360381019061028391906123e5565b6108da565b005b34801561029657600080fd5b5061029f6109e4565b6040516102ac9190612434565b60405180910390f35b6102bd6109ea565b005b3480156102cb57600080fd5b506102e660048036038101906102e1919061244f565b610a3f565b005b3480156102f457600080fd5b506102fd610a98565b60405161030a9190612501565b60405180910390f35b34801561031f57600080fd5b5061033a60048036038101906103359190612581565b610abe565b005b34801561034857600080fd5b50610363600480360381019061035e919061244f565b610c70565b005b34801561037157600080fd5b5061038c60048036038101906103879190612330565b610c90565b60405161039991906122d8565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190612330565b610d49565b6040516103d6919061239e565b60405180910390f35b3480156103eb57600080fd5b506103f4610dfb565b6040516104019190612602565b60405180910390f35b34801561041657600080fd5b5061041f610e21565b60405161042c9190612636565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190612651565b610e27565b6040516104699190612434565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190612330565b610edf565b6040516104a691906122d8565b60405180910390f35b3480156104bb57600080fd5b506104c4610f98565b6040516104d1919061239e565b60405180910390f35b3480156104e657600080fd5b506104ef610fbe565b6040516104fc919061239e565b60405180910390f35b34801561051157600080fd5b5061051a610fe4565b60405161052791906122d8565b60405180910390f35b34801561053c57600080fd5b50610557600480360381019061055291906126aa565b611076565b005b34801561056557600080fd5b50610580600480360381019061057b9190612330565b6111e2565b60405161058d91906122d8565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b891906126ea565b611202565b005b3480156105cb57600080fd5b506105e660048036038101906105e19190612867565b611211565b005b3480156105f457600080fd5b506105fd61126c565b60405161060a9190612434565b60405180910390f35b34801561061f57600080fd5b5061063a60048036038101906106359190612330565b611272565b60405161064791906122d8565b60405180910390f35b34801561065c57600080fd5b5061067760048036038101906106729190612651565b6113ff565b6040516106849190612224565b60405180910390f35b34801561069957600080fd5b506106a261141f565b005b3480156106b057600080fd5b506106cb60048036038101906106c691906128ea565b61153c565b6040516106d89190612224565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ac57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107bc57506107bb82611792565b5b9050919050565b6060600080546107d290612959565b80601f01602080910402602001604051908101604052809291908181526020018280546107fe90612959565b801561084b5780601f106108205761010080835404028352916020019161084b565b820191906000526020600020905b81548152906001019060200180831161082e57829003601f168201915b5050505050905090565b6000610860826117fc565b61089f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610896906129fd565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e582610d49565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d90612a8f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109965750610995813361153c565b5b6109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc90612b21565b60405180910390fd5b6109df8383611868565b505050565b60095481565b6671afd498d00000341015610a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2b90612b8d565b60405180910390fd5b610a3d33611921565b565b610a4933826119b5565b610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f90612c1f565b60405180910390fd5b610a93838383611a93565b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60001515600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4890612c8b565b60405180910390fd5b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600081604051602001610bbc9190612cf3565b604051602081830303815290604052805190602001209050610c22848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5483611ce4565b610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5890612d5a565b60405180910390fd5b610c6a82611921565b50505050565b610c8b83838360405180602001604052806000815250611211565b505050565b6060600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634b44d812836040518263ffffffff1660e01b8152600401610ced9190612434565b60006040518083038186803b158015610d0557600080fd5b505afa158015610d19573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d429190612e1b565b9050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de990612ed6565b60405180910390fd5b80915050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f90612f68565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379b92f27836040518263ffffffff1660e01b8152600401610f3c9190612434565b60006040518083038186803b158015610f5457600080fd5b505afa158015610f68573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610f919190612e1b565b9050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060018054610ff390612959565b80601f016020809104026020016040519081016040528092919081815260200182805461101f90612959565b801561106c5780601f106110415761010080835404028352916020019161106c565b820191906000526020600020905b81548152906001019060200180831161104f57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dc90612fd4565b60405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111d69190612224565b60405180910390a35050565b606060006111ef83610c90565b90506111fa81611cfb565b915050919050565b61120d828233610abe565b5050565b61121b33836119b5565b61125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190612c1f565b60405180910390fd5b61126684848484611e80565b50505050565b600a5481565b606061127d826117fc565b6112bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b390613066565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663192a0a1f846040518263ffffffff1660e01b81526004016113199190612434565b60006040518083038186803b15801561133157600080fd5b505afa158015611345573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061136e9190612e1b565b90506000604051806080016040528060428152602001613b8b6042913990506000611398856111e2565b905060006113a586610edf565b90506113d5848484846040516020016113c1949392919061328a565b604051602081830303815290604052611cfb565b6040516020016113e59190613356565b604051602081830303815290604052945050505050919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a6906133c4565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516114f590613415565b60006040518083038185875af1925050503d8060008114611532576040519150601f19603f3d011682016040523d82523d6000602084013e611537565b606091505b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163790613476565b60405180910390fd5b611649816117fc565b15611689576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611680906134e2565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116d99190613531565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118db83610d49565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6009544211611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c906135d3565b60405180910390fd5b600a5442106119a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a09061363f565b60405180910390fd5b6119b281611edc565b50565b60006119c0826117fc565b6119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f6906136d1565b60405180910390fd5b6000611a0a83610d49565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a7957508373ffffffffffffffffffffffffffffffffffffffff16611a6184610855565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a8a5750611a89818561153c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ab382610d49565b73ffffffffffffffffffffffffffffffffffffffff1614611b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0090613763565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b70906137f5565b60405180910390fd5b611b84600082611868565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bd49190613815565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c2b9190613531565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600082611cf18584611f1a565b1490509392505050565b6060600082511415611d1e57604051806020016040528060008152509050611e7b565b6000604051806060016040528060408152602001613bcd6040913990506000600360028551611d4d9190613531565b611d579190613878565b6004611d6391906138a9565b90506000602082611d749190613531565b67ffffffffffffffff811115611d8d57611d8c61273c565b5b6040519080825280601f01601f191660200182016040528015611dbf5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015611e3a576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050611dd3565b600389510660018114611e545760028114611e6457611e6f565b613d3d60f01b6002830352611e6f565b603d60f81b60018303525b50505050508093505050505b919050565b611e8b848484611a93565b611e9784848484611fcd565b611ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecd90613975565b60405180910390fd5b50505050565b60004282604051602001611ef19291906139b6565b6040516020818303038152906040528051906020012060001c9050611f1682826115d0565b5050565b60008082905060005b8451811015611fc2576000858281518110611f4157611f406139e2565b5b60200260200101519050808311611f82578281604051602001611f65929190613a32565b604051602081830303815290604052805190602001209250611fae565b8083604051602001611f95929190613a32565b6040516020818303038152906040528051906020012092505b508080611fba90613a5e565b915050611f23565b508091505092915050565b6000611fee8473ffffffffffffffffffffffffffffffffffffffff1661215d565b15612150578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016120329493929190613afc565b602060405180830381600087803b15801561204c57600080fd5b505af192505050801561207d57506040513d601f19601f8201168201806040525081019061207a9190613b5d565b60015b612100573d80600081146120ad576040519150601f19603f3d011682016040523d82523d6000602084013e6120b2565b606091505b506000815114156120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef90613975565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612155565b600190505b949350505050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6121b981612184565b81146121c457600080fd5b50565b6000813590506121d6816121b0565b92915050565b6000602082840312156121f2576121f161217a565b5b6000612200848285016121c7565b91505092915050565b60008115159050919050565b61221e81612209565b82525050565b60006020820190506122396000830184612215565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561227957808201518184015260208101905061225e565b83811115612288576000848401525b50505050565b6000601f19601f8301169050919050565b60006122aa8261223f565b6122b4818561224a565b93506122c481856020860161225b565b6122cd8161228e565b840191505092915050565b600060208201905081810360008301526122f2818461229f565b905092915050565b6000819050919050565b61230d816122fa565b811461231857600080fd5b50565b60008135905061232a81612304565b92915050565b6000602082840312156123465761234561217a565b5b60006123548482850161231b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123888261235d565b9050919050565b6123988161237d565b82525050565b60006020820190506123b3600083018461238f565b92915050565b6123c28161237d565b81146123cd57600080fd5b50565b6000813590506123df816123b9565b92915050565b600080604083850312156123fc576123fb61217a565b5b600061240a858286016123d0565b925050602061241b8582860161231b565b9150509250929050565b61242e816122fa565b82525050565b60006020820190506124496000830184612425565b92915050565b6000806000606084860312156124685761246761217a565b5b6000612476868287016123d0565b9350506020612487868287016123d0565b92505060406124988682870161231b565b9150509250925092565b6000819050919050565b60006124c76124c26124bd8461235d565b6124a2565b61235d565b9050919050565b60006124d9826124ac565b9050919050565b60006124eb826124ce565b9050919050565b6124fb816124e0565b82525050565b600060208201905061251660008301846124f2565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126125415761254061251c565b5b8235905067ffffffffffffffff81111561255e5761255d612521565b5b60208301915083602082028301111561257a57612579612526565b5b9250929050565b60008060006040848603121561259a5761259961217a565b5b600084013567ffffffffffffffff8111156125b8576125b761217f565b5b6125c48682870161252b565b935093505060206125d7868287016123d0565b9150509250925092565b60006125ec8261235d565b9050919050565b6125fc816125e1565b82525050565b600060208201905061261760008301846125f3565b92915050565b6000819050919050565b6126308161261d565b82525050565b600060208201905061264b6000830184612627565b92915050565b6000602082840312156126675761266661217a565b5b6000612675848285016123d0565b91505092915050565b61268781612209565b811461269257600080fd5b50565b6000813590506126a48161267e565b92915050565b600080604083850312156126c1576126c061217a565b5b60006126cf858286016123d0565b92505060206126e085828601612695565b9150509250929050565b600080602083850312156127015761270061217a565b5b600083013567ffffffffffffffff81111561271f5761271e61217f565b5b61272b8582860161252b565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6127748261228e565b810181811067ffffffffffffffff821117156127935761279261273c565b5b80604052505050565b60006127a6612170565b90506127b2828261276b565b919050565b600067ffffffffffffffff8211156127d2576127d161273c565b5b6127db8261228e565b9050602081019050919050565b82818337600083830152505050565b600061280a612805846127b7565b61279c565b90508281526020810184848401111561282657612825612737565b5b6128318482856127e8565b509392505050565b600082601f83011261284e5761284d61251c565b5b813561285e8482602086016127f7565b91505092915050565b600080600080608085870312156128815761288061217a565b5b600061288f878288016123d0565b94505060206128a0878288016123d0565b93505060406128b18782880161231b565b925050606085013567ffffffffffffffff8111156128d2576128d161217f565b5b6128de87828801612839565b91505092959194509250565b600080604083850312156129015761290061217a565b5b600061290f858286016123d0565b9250506020612920858286016123d0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061297157607f821691505b602082108114156129855761298461292a565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006129e7602c8361224a565b91506129f28261298b565b604082019050919050565b60006020820190508181036000830152612a16816129da565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612a7960218361224a565b9150612a8482612a1d565b604082019050919050565b60006020820190508181036000830152612aa881612a6c565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612b0b60388361224a565b9150612b1682612aaf565b604082019050919050565b60006020820190508181036000830152612b3a81612afe565b9050919050565b7f4d4f524520455448204e45454445440000000000000000000000000000000000600082015250565b6000612b77600f8361224a565b9150612b8282612b41565b602082019050919050565b60006020820190508181036000830152612ba681612b6a565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612c0960318361224a565b9150612c1482612bad565b604082019050919050565b60006020820190508181036000830152612c3881612bfc565b9050919050565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b6000612c75600f8361224a565b9150612c8082612c3f565b602082019050919050565b60006020820190508181036000830152612ca481612c68565b9050919050565b60008160601b9050919050565b6000612cc382612cab565b9050919050565b6000612cd582612cb8565b9050919050565b612ced612ce88261237d565b612cca565b82525050565b6000612cff8284612cdc565b60148201915081905092915050565b7f496e76616c69642050726f6f6600000000000000000000000000000000000000600082015250565b6000612d44600d8361224a565b9150612d4f82612d0e565b602082019050919050565b60006020820190508181036000830152612d7381612d37565b9050919050565b600067ffffffffffffffff821115612d9557612d9461273c565b5b612d9e8261228e565b9050602081019050919050565b6000612dbe612db984612d7a565b61279c565b905082815260208101848484011115612dda57612dd9612737565b5b612de584828561225b565b509392505050565b600082601f830112612e0257612e0161251c565b5b8151612e12848260208601612dab565b91505092915050565b600060208284031215612e3157612e3061217a565b5b600082015167ffffffffffffffff811115612e4f57612e4e61217f565b5b612e5b84828501612ded565b91505092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612ec060298361224a565b9150612ecb82612e64565b604082019050919050565b60006020820190508181036000830152612eef81612eb3565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612f52602a8361224a565b9150612f5d82612ef6565b604082019050919050565b60006020820190508181036000830152612f8181612f45565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612fbe60198361224a565b9150612fc982612f88565b602082019050919050565b60006020820190508181036000830152612fed81612fb1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613050602f8361224a565b915061305b82612ff4565b604082019050919050565b6000602082019050818103600083015261307f81613043565b9050919050565b600081905092915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000600082015250565b60006130c7600983613086565b91506130d282613091565b600982019050919050565b60006130e88261223f565b6130f28185613086565b935061310281856020860161225b565b80840191505092915050565b7f222c20226465736372697074696f6e223a220000000000000000000000000000600082015250565b6000613144601283613086565b915061314f8261310e565b601282019050919050565b7f222c2022696d616765223a202200000000000000000000000000000000000000600082015250565b6000613190600d83613086565b915061319b8261315a565b600d82019050919050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b60006131dc601a83613086565b91506131e7826131a6565b601a82019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b6000613228600283613086565b9150613233826131f2565b600282019050919050565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b6000613274600183613086565b915061327f8261323e565b600182019050919050565b6000613295826130ba565b91506132a182876130dd565b91506132ac82613137565b91506132b882866130dd565b91506132c382613183565b91506132ce826131cf565b91506132da82856130dd565b91506132e58261321b565b91506132f182846130dd565b91506132fc82613267565b915081905095945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000613340601d83613086565b915061334b8261330a565b601d82019050919050565b600061336182613333565b915061336d82846130dd565b915081905092915050565b7f4e4f545f434f4c4c4543544f5200000000000000000000000000000000000000600082015250565b60006133ae600d8361224a565b91506133b982613378565b602082019050919050565b600060208201905081810360008301526133dd816133a1565b9050919050565b600081905092915050565b50565b60006133ff6000836133e4565b915061340a826133ef565b600082019050919050565b6000613420826133f2565b9150819050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061346060208361224a565b915061346b8261342a565b602082019050919050565b6000602082019050818103600083015261348f81613453565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006134cc601c8361224a565b91506134d782613496565b602082019050919050565b600060208201905081810360008301526134fb816134bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061353c826122fa565b9150613547836122fa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561357c5761357b613502565b5b828201905092915050565b7f4e4f545f53544152544544000000000000000000000000000000000000000000600082015250565b60006135bd600b8361224a565b91506135c882613587565b602082019050919050565b600060208201905081810360008301526135ec816135b0565b9050919050565b7f454e444544000000000000000000000000000000000000000000000000000000600082015250565b600061362960058361224a565b9150613634826135f3565b602082019050919050565b600060208201905081810360008301526136588161361c565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006136bb602c8361224a565b91506136c68261365f565b604082019050919050565b600060208201905081810360008301526136ea816136ae565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061374d60298361224a565b9150613758826136f1565b604082019050919050565b6000602082019050818103600083015261377c81613740565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006137df60248361224a565b91506137ea82613783565b604082019050919050565b6000602082019050818103600083015261380e816137d2565b9050919050565b6000613820826122fa565b915061382b836122fa565b92508282101561383e5761383d613502565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613883826122fa565b915061388e836122fa565b92508261389e5761389d613849565b5b828204905092915050565b60006138b4826122fa565b91506138bf836122fa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138f8576138f7613502565b5b828202905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061395f60328361224a565b915061396a82613903565b604082019050919050565b6000602082019050818103600083015261398e81613952565b9050919050565b6000819050919050565b6139b06139ab826122fa565b613995565b82525050565b60006139c2828561399f565b6020820191506139d28284612cdc565b6014820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b613a2c613a278261261d565b613a11565b82525050565b6000613a3e8285613a1b565b602082019150613a4e8284613a1b565b6020820191508190509392505050565b6000613a69826122fa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a9c57613a9b613502565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000613ace82613aa7565b613ad88185613ab2565b9350613ae881856020860161225b565b613af18161228e565b840191505092915050565b6000608082019050613b11600083018761238f565b613b1e602083018661238f565b613b2b6040830185612425565b8181036060830152613b3d8184613ac3565b905095945050505050565b600081519050613b57816121b0565b92915050565b600060208284031215613b7357613b7261217a565b5b6000613b8184828501613b48565b9150509291505056fe436572616d6963206265696e677320776974682073696d756c6174656420736f756c7320636f6c6c656374656420627920746865204d61727469616e2c204e79782e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212207c807da1b4fed468bafb663a2f24d5cabaec0c192b3a3dfd7c73e4d94aff0b3a64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000af69610ea9ddc95883f97a6a3171d52165b69b030000000000000000000000002c48763e807f51d58cfc72f3d903513e12af355100000000000000000000000000000000000000000000000000000000625d6ee000000000000000000000000000000000000000000000000000000000628258e05a205b661dc03e3b33329ec05c331ddb579d0a146b5a14e68d88d5eafaaa5d15000000000000000000000000000000000000000000000000000000000000000f4c6974746c65204d61727469616e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034c4d530000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Little Martians
Arg [1] : symbol_ (string): LMS
Arg [2] : collector_ (address): 0xaF69610ea9ddc95883f97a6a3171d52165b69B03
Arg [3] : recipient_ (address): 0x2c48763e807F51D58cFc72f3D903513E12AF3551
Arg [4] : startDate_ (uint256): 1650290400
Arg [5] : endDate_ (uint256): 1652709600
Arg [6] : root_ (bytes32): 0x5a205b661dc03e3b33329ec05c331ddb579d0a146b5a14e68d88d5eafaaa5d15
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 000000000000000000000000af69610ea9ddc95883f97a6a3171d52165b69b03
Arg [3] : 0000000000000000000000002c48763e807f51d58cfc72f3d903513e12af3551
Arg [4] : 00000000000000000000000000000000000000000000000000000000625d6ee0
Arg [5] : 00000000000000000000000000000000000000000000000000000000628258e0
Arg [6] : 5a205b661dc03e3b33329ec05c331ddb579d0a146b5a14e68d88d5eafaaa5d15
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [8] : 4c6974746c65204d61727469616e730000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [10] : 4c4d530000000000000000000000000000000000000000000000000000000000
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.