1102 lines
188 KiB
JSON
1102 lines
188 KiB
JSON
{
|
|
"address": "0x8464135c8F25Da09e49BC8782676a84730C318bC",
|
|
"abi": [
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "string",
|
|
"name": "_name",
|
|
"type": "string"
|
|
},
|
|
{
|
|
"internalType": "string",
|
|
"name": "_symbol",
|
|
"type": "string"
|
|
}
|
|
],
|
|
"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": "bytes32",
|
|
"name": "role",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"indexed": true,
|
|
"internalType": "bytes32",
|
|
"name": "previousAdminRole",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"indexed": true,
|
|
"internalType": "bytes32",
|
|
"name": "newAdminRole",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"name": "RoleAdminChanged",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": true,
|
|
"internalType": "bytes32",
|
|
"name": "role",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"indexed": true,
|
|
"internalType": "address",
|
|
"name": "account",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": true,
|
|
"internalType": "address",
|
|
"name": "sender",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "RoleGranted",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": true,
|
|
"internalType": "bytes32",
|
|
"name": "role",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"indexed": true,
|
|
"internalType": "address",
|
|
"name": "account",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": true,
|
|
"internalType": "address",
|
|
"name": "sender",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "RoleRevoked",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": true,
|
|
"internalType": "address",
|
|
"name": "from",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": true,
|
|
"internalType": "address",
|
|
"name": "to",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": true,
|
|
"internalType": "uint256",
|
|
"name": "tokenId",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "Transfer",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "COLLECTION_CONTROLLER_ROLE",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "COLLECTION_OWNER_ROLE",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "DEFAULT_ADMIN_ROLE",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "tokenId",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "controller",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "addTokenController",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "to",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "tokenId",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "approve",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "owner",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "balanceOf",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "tokenId",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "burn",
|
|
"outputs": [],
|
|
"stateMutability": "payable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "tokenId",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "getApproved",
|
|
"outputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "role",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"name": "getRoleAdmin",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "role",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "account",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "grantRole",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "role",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "account",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "hasRole",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bool",
|
|
"name": "",
|
|
"type": "bool"
|
|
}
|
|
],
|
|
"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": "address",
|
|
"name": "to",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "external_url",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "ENS",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "string",
|
|
"name": "commit_hash",
|
|
"type": "string"
|
|
},
|
|
{
|
|
"internalType": "string",
|
|
"name": "git_repository",
|
|
"type": "string"
|
|
}
|
|
],
|
|
"name": "mint",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"stateMutability": "payable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "name",
|
|
"outputs": [
|
|
{
|
|
"internalType": "string",
|
|
"name": "",
|
|
"type": "string"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "tokenId",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "ownerOf",
|
|
"outputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "tokenId",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "controller",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "removeTokenController",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "role",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "account",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "renounceRole",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "role",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "account",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "revokeRole",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "from",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "to",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "tokenId",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "safeTransferFrom",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "from",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "to",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "tokenId",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "bytes",
|
|
"name": "data",
|
|
"type": "bytes"
|
|
}
|
|
],
|
|
"name": "safeTransferFrom",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "operator",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bool",
|
|
"name": "approved",
|
|
"type": "bool"
|
|
}
|
|
],
|
|
"name": "setApprovalForAll",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "tokenId",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "string",
|
|
"name": "_commit_hash",
|
|
"type": "string"
|
|
},
|
|
{
|
|
"internalType": "string",
|
|
"name": "_git_repository",
|
|
"type": "string"
|
|
}
|
|
],
|
|
"name": "setTokenBuild",
|
|
"outputs": [],
|
|
"stateMutability": "payable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "tokenId",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "_tokenENS",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"name": "setTokenENS",
|
|
"outputs": [],
|
|
"stateMutability": "payable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "tokenId",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "_tokenExternalURL",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"name": "setTokenExternalURL",
|
|
"outputs": [],
|
|
"stateMutability": "payable",
|
|
"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": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "tokenId",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "string",
|
|
"name": "commit",
|
|
"type": "string"
|
|
},
|
|
{
|
|
"internalType": "string",
|
|
"name": "repository",
|
|
"type": "string"
|
|
}
|
|
],
|
|
"name": "upgradeTokenBuild",
|
|
"outputs": [],
|
|
"stateMutability": "payable",
|
|
"type": "function"
|
|
}
|
|
],
|
|
"transactionHash": "0x9bbd2193ba51263e584935885aafa1c561f3d6e3a6ac9b672c98f847a3bc423b",
|
|
"receipt": {
|
|
"to": null,
|
|
"from": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
|
|
"contractAddress": "0x8464135c8F25Da09e49BC8782676a84730C318bC",
|
|
"transactionIndex": 0,
|
|
"gasUsed": "4039586",
|
|
"logsBloom": "0x00000004000000000802000000000000080000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002002000000000000000000000800020000400000000000000800000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000004100000000000020000000000000000000000000000000000001000000020000000000000000000000",
|
|
"blockHash": "0xd3d74199571a4f40b4af6633ec9153ccdc34a11ad66547fed2dfa1ac540fd29e",
|
|
"transactionHash": "0x9bbd2193ba51263e584935885aafa1c561f3d6e3a6ac9b672c98f847a3bc423b",
|
|
"logs": [
|
|
{
|
|
"transactionIndex": 0,
|
|
"blockNumber": 1,
|
|
"transactionHash": "0x9bbd2193ba51263e584935885aafa1c561f3d6e3a6ac9b672c98f847a3bc423b",
|
|
"address": "0x8464135c8F25Da09e49BC8782676a84730C318bC",
|
|
"topics": [
|
|
"0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff",
|
|
"0xcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc",
|
|
"0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
"0x0000000000000000000000000000000000000000000000000000000000000000"
|
|
],
|
|
"data": "0x",
|
|
"logIndex": 0,
|
|
"blockHash": "0xd3d74199571a4f40b4af6633ec9153ccdc34a11ad66547fed2dfa1ac540fd29e"
|
|
},
|
|
{
|
|
"transactionIndex": 0,
|
|
"blockNumber": 1,
|
|
"transactionHash": "0x9bbd2193ba51263e584935885aafa1c561f3d6e3a6ac9b672c98f847a3bc423b",
|
|
"address": "0x8464135c8F25Da09e49BC8782676a84730C318bC",
|
|
"topics": [
|
|
"0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d",
|
|
"0xcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc",
|
|
"0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8",
|
|
"0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8"
|
|
],
|
|
"data": "0x",
|
|
"logIndex": 1,
|
|
"blockHash": "0xd3d74199571a4f40b4af6633ec9153ccdc34a11ad66547fed2dfa1ac540fd29e"
|
|
}
|
|
],
|
|
"blockNumber": 1,
|
|
"cumulativeGasUsed": "4039586",
|
|
"status": 1,
|
|
"byzantium": true
|
|
},
|
|
"args": [
|
|
"FleekSites",
|
|
"FLKSITE"
|
|
],
|
|
"numDeployments": 1,
|
|
"solcInputHash": "c5d3d1f992d02d48f8722ea8871105d5",
|
|
"metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"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\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COLLECTION_CONTROLLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COLLECTION_OWNER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"name\":\"addTokenController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"external_url\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ENS\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"commit_hash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"git_repository\",\"type\":\"string\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"name\":\"removeTokenController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_commit_hash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_git_repository\",\"type\":\"string\"}],\"name\":\"setTokenBuild\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_tokenENS\",\"type\":\"bytes32\"}],\"name\":\"setTokenENS\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_tokenExternalURL\",\"type\":\"bytes32\"}],\"name\":\"setTokenExternalURL\",\"outputs\":[],\"stateMutability\":\"payable\",\"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\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"commit\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"repository\",\"type\":\"string\"}],\"name\":\"upgradeTokenBuild\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"See {IERC721Metadata-tokenURI}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FleekERC721.sol\":\"FleekERC721\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x67e3daf189111d6d5b0464ed09cf9f0605a22c4b965a7fcecd707101faff008a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC721.sol\\\";\\nimport \\\"./IERC721Receiver.sol\\\";\\nimport \\\"./extensions/IERC721Metadata.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\nimport \\\"../../utils/Strings.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\n * {ERC721Enumerable}.\\n */\\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\\n using Address for address;\\n using Strings for uint256;\\n\\n // Token name\\n string private _name;\\n\\n // Token symbol\\n string private _symbol;\\n\\n // Mapping from token ID to owner address\\n mapping(uint256 => address) private _owners;\\n\\n // Mapping owner address to token count\\n mapping(address => uint256) private _balances;\\n\\n // Mapping from token ID to approved address\\n mapping(uint256 => address) private _tokenApprovals;\\n\\n // Mapping from owner to operator approvals\\n mapping(address => mapping(address => bool)) private _operatorApprovals;\\n\\n /**\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\n return\\n interfaceId == type(IERC721).interfaceId ||\\n interfaceId == type(IERC721Metadata).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721-balanceOf}.\\n */\\n function balanceOf(address owner) public view virtual override returns (uint256) {\\n require(owner != address(0), \\\"ERC721: address zero is not a valid owner\\\");\\n return _balances[owner];\\n }\\n\\n /**\\n * @dev See {IERC721-ownerOf}.\\n */\\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\n address owner = _ownerOf(tokenId);\\n require(owner != address(0), \\\"ERC721: invalid token ID\\\");\\n return owner;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-symbol}.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n _requireMinted(tokenId);\\n\\n string memory baseURI = _baseURI();\\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \\\"\\\";\\n }\\n\\n /**\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\n * by default, can be overridden in child contracts.\\n */\\n function _baseURI() internal view virtual returns (string memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IERC721-approve}.\\n */\\n function approve(address to, uint256 tokenId) public virtual override {\\n address owner = ERC721.ownerOf(tokenId);\\n require(to != owner, \\\"ERC721: approval to current owner\\\");\\n\\n require(\\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\\n \\\"ERC721: approve caller is not token owner or approved for all\\\"\\n );\\n\\n _approve(to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-getApproved}.\\n */\\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\\n _requireMinted(tokenId);\\n\\n return _tokenApprovals[tokenId];\\n }\\n\\n /**\\n * @dev See {IERC721-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual override {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC721-isApprovedForAll}.\\n */\\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\n return _operatorApprovals[owner][operator];\\n }\\n\\n /**\\n * @dev See {IERC721-transferFrom}.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) public virtual override {\\n //solhint-disable-next-line max-line-length\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner or approved\\\");\\n\\n _transfer(from, to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) public virtual override {\\n safeTransferFrom(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) public virtual override {\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner or approved\\\");\\n _safeTransfer(from, to, tokenId, data);\\n }\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\\n *\\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeTransfer(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) internal virtual {\\n _transfer(from, to, tokenId);\\n require(_checkOnERC721Received(from, to, tokenId, data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n }\\n\\n /**\\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\\n */\\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\\n return _owners[tokenId];\\n }\\n\\n /**\\n * @dev Returns whether `tokenId` exists.\\n *\\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\n *\\n * Tokens start existing when they are minted (`_mint`),\\n * and stop existing when they are burned (`_burn`).\\n */\\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\\n return _ownerOf(tokenId) != address(0);\\n }\\n\\n /**\\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\n address owner = ERC721.ownerOf(tokenId);\\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\\n }\\n\\n /**\\n * @dev Safely mints `tokenId` and transfers it to `to`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeMint(address to, uint256 tokenId) internal virtual {\\n _safeMint(to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeMint(\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) internal virtual {\\n _mint(to, tokenId);\\n require(\\n _checkOnERC721Received(address(0), to, tokenId, data),\\n \\\"ERC721: transfer to non ERC721Receiver implementer\\\"\\n );\\n }\\n\\n /**\\n * @dev Mints `tokenId` and transfers it to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - `to` cannot be the zero address.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _mint(address to, uint256 tokenId) internal virtual {\\n require(to != address(0), \\\"ERC721: mint to the zero address\\\");\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n _beforeTokenTransfer(address(0), to, tokenId, 1);\\n\\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n unchecked {\\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\\n // Given that tokens are minted one by one, it is impossible in practice that\\n // this ever happens. Might change if we allow batch minting.\\n // The ERC fails to describe this case.\\n _balances[to] += 1;\\n }\\n\\n _owners[tokenId] = to;\\n\\n emit Transfer(address(0), to, tokenId);\\n\\n _afterTokenTransfer(address(0), to, tokenId, 1);\\n }\\n\\n /**\\n * @dev Destroys `tokenId`.\\n * The approval is cleared when the token is burned.\\n * This is an internal function that does not check if the sender is authorized to operate on the token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _burn(uint256 tokenId) internal virtual {\\n address owner = ERC721.ownerOf(tokenId);\\n\\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\\n\\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\\n owner = ERC721.ownerOf(tokenId);\\n\\n // Clear approvals\\n delete _tokenApprovals[tokenId];\\n\\n unchecked {\\n // Cannot overflow, as that would require more tokens to be burned/transferred\\n // out than the owner initially received through minting and transferring in.\\n _balances[owner] -= 1;\\n }\\n delete _owners[tokenId];\\n\\n emit Transfer(owner, address(0), tokenId);\\n\\n _afterTokenTransfer(owner, address(0), tokenId, 1);\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from `from` to `to`.\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 tokenId\\n ) internal virtual {\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n require(to != address(0), \\\"ERC721: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, tokenId, 1);\\n\\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n\\n // Clear approvals from the previous owner\\n delete _tokenApprovals[tokenId];\\n\\n unchecked {\\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\\n // `from`'s balance is the number of token held, which is at least one before the current\\n // transfer.\\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\\n // all 2**256 token ids to be minted, which in practice is impossible.\\n _balances[from] -= 1;\\n _balances[to] += 1;\\n }\\n _owners[tokenId] = to;\\n\\n emit Transfer(from, to, tokenId);\\n\\n _afterTokenTransfer(from, to, tokenId, 1);\\n }\\n\\n /**\\n * @dev Approve `to` to operate on `tokenId`\\n *\\n * Emits an {Approval} event.\\n */\\n function _approve(address to, uint256 tokenId) internal virtual {\\n _tokenApprovals[tokenId] = to;\\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function _setApprovalForAll(\\n address owner,\\n address operator,\\n bool approved\\n ) internal virtual {\\n require(owner != operator, \\\"ERC721: approve to caller\\\");\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Reverts if the `tokenId` has not been minted yet.\\n */\\n function _requireMinted(uint256 tokenId) internal view virtual {\\n require(_exists(tokenId), \\\"ERC721: invalid token ID\\\");\\n }\\n\\n /**\\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\n * The call is not executed if the target address is not a contract.\\n *\\n * @param from address representing the previous owner of the given token ID\\n * @param to target address that will receive the tokens\\n * @param tokenId uint256 ID of the token to be transferred\\n * @param data bytes optional data to send along with the call\\n * @return bool whether the call correctly returned the expected magic value\\n */\\n function _checkOnERC721Received(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) private returns (bool) {\\n if (to.isContract()) {\\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\\n return retval == IERC721Receiver.onERC721Received.selector;\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n revert(\\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n } else {\\n return true;\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\\n * - When `from` is zero, the tokens will be minted for `to`.\\n * - When `to` is zero, ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n * - `batchSize` is non-zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256, /* firstTokenId */\\n uint256 batchSize\\n ) internal virtual {\\n if (batchSize > 1) {\\n if (from != address(0)) {\\n _balances[from] -= batchSize;\\n }\\n if (to != address(0)) {\\n _balances[to] += batchSize;\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\\n * - When `from` is zero, the tokens were minted for `to`.\\n * - When `to` is zero, ``from``'s tokens were burned.\\n * - `from` and `to` are never both zero.\\n * - `batchSize` is non-zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 firstTokenId,\\n uint256 batchSize\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0xd89f3585b211fc9e3408384a4c4efdc3a93b2f877a3821046fa01c219d35be1b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes calldata data\\n ) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool _approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xab28a56179c1db258c9bf5235b382698cb650debecb51b23d12be9e241374b68\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC721.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721Metadata is IERC721 {\\n /**\\n * @dev Returns the token collection name.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the token collection symbol.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n */\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x75b829ff2f26c14355d1cba20e16fe7b29ca58eb5fef665ede48bc0f9c6c74b9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/FleekAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\n\\r\\npragma solidity ^0.8.7;\\r\\n\\r\\nimport \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\r\\n\\r\\nabstract contract FleekAccessControl is AccessControl {\\r\\n bytes32 public constant COLLECTION_OWNER_ROLE =\\r\\n keccak256(\\\"COLLECTION_OWNER_ROLE\\\");\\r\\n bytes32 public constant COLLECTION_CONTROLLER_ROLE =\\r\\n keccak256(\\\"COLLECTION_CONTROLLER_ROLE\\\");\\r\\n\\r\\n constructor() {\\r\\n _setRoleAdmin(COLLECTION_OWNER_ROLE, DEFAULT_ADMIN_ROLE);\\r\\n _grantRole(COLLECTION_OWNER_ROLE, msg.sender);\\r\\n }\\r\\n\\r\\n modifier requireCollectionOwner() {\\r\\n require(\\r\\n hasRole(COLLECTION_OWNER_ROLE, msg.sender),\\r\\n \\\"FleekAccessControl: must have collection owner role\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n modifier requireCollectionController() {\\r\\n require(\\r\\n hasRole(COLLECTION_OWNER_ROLE, msg.sender) ||\\r\\n hasRole(COLLECTION_CONTROLLER_ROLE, msg.sender),\\r\\n \\\"FleekAccessControl: must have collection controller role\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n modifier requireTokenController(uint256 tokenId) {\\r\\n require(\\r\\n hasRole(_tokenRole(tokenId, \\\"CONTROLLER\\\"), msg.sender),\\r\\n \\\"FleekAccessControl: must have token role\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n function _tokenRole(\\r\\n uint256 tokenId,\\r\\n string memory role\\r\\n ) internal pure returns (bytes32) {\\r\\n return keccak256(abi.encodePacked(\\\"TOKEN_\\\", role, tokenId));\\r\\n }\\r\\n}\\r\\n\",\"keccak256\":\"0x40cbb25741c2d6e285ab2ccee87f38fab424ce3746a17bca274a23c098f5e5c6\",\"license\":\"MIT\"},\"contracts/FleekERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Counters.sol\\\";\\nimport \\\"./FleekAccessControl.sol\\\";\\n\\ncontract FleekERC721 is ERC721, FleekAccessControl {\\n using Strings for uint256;\\n using Counters for Counters.Counter;\\n\\n struct Build {\\n string commit_hash;\\n string git_repository;\\n }\\n\\n struct Site {\\n bytes32 external_url; // IPFS HASH\\n bytes32 ENS; // ENS ID\\n uint256 current_build; // THE CURRENT BUILD NUMBER (increments by one with each change, starts at zero)\\n mapping(uint256 => Build) builds; // MAPPING TO BUILD DETAILS FOR EACH BUILD NUMBER\\n }\\n\\n Counters.Counter private _tokenIds;\\n mapping(uint256 => Site) private _sites;\\n\\n constructor(\\n string memory _name,\\n string memory _symbol\\n ) ERC721(_name, _symbol) {}\\n\\n modifier requireTokenOwner(uint256 tokenId) {\\n require(\\n msg.sender == ownerOf(tokenId),\\n \\\"FleekERC721: must be token owner\\\"\\n );\\n _;\\n }\\n\\n function mint(\\n address to,\\n bytes32 external_url,\\n bytes32 ENS,\\n string memory commit_hash,\\n string memory git_repository\\n ) public payable requireCollectionOwner returns (uint256) {\\n uint256 tokenId = _tokenIds.current();\\n _mint(to, tokenId);\\n addTokenController(tokenId, to);\\n _tokenIds.increment();\\n\\n Site storage site = _sites[tokenId];\\n site.external_url = external_url;\\n site.ENS = ENS;\\n\\n // The mint interaction is considered to be the first build of the site. Updates from now on all increment the current_build by one and update the mapping.\\n site.current_build = 0;\\n site.builds[0] = Build(commit_hash, git_repository);\\n \\n return tokenId;\\n }\\n\\n function upgradeTokenBuild(\\n uint256 tokenId,\\n string memory commit,\\n string memory repository\\n ) public payable requireTokenOwner(tokenId) {\\n _requireMinted(tokenId);\\n setTokenBuild(tokenId, commit, repository);\\n }\\n\\n function tokenURI(\\n uint256 tokenId\\n ) public view virtual override returns (string memory) {\\n _requireMinted(tokenId);\\n address owner = ownerOf(tokenId);\\n Site storage site = _sites[tokenId];\\n /*\\n / Note: I do not think this is the way this function is supposed to be written.\\n / I recommend returning a IPFS URL per OpenSea's own documentation:\\n / https://docs.opensea.io/docs/metadata-standards#implementing-token-uri\\n */\\n \\n bytes memory dataURI = abi.encodePacked(\\n '{',\\n '\\\"owner\\\":\\\"', owner, '\\\",',\\n '\\\"ENS\\\":\\\"', site.ENS, '\\\",',\\n '\\\"external_url\\\":\\\"', site.external_url, '\\\",',\\n '\\\"build:{',\\n '\\\"id\\\":\\\"', site.current_build, '\\\",',\\n '\\\"commit_hash\\\":\\\"', site.builds[site.current_build].commit_hash, '\\\",',\\n '\\\"repository\\\":\\\"', site.builds[site.current_build].git_repository, '\\\"'\\n '}',\\n '}'\\n );\\n\\n return string(abi.encodePacked(_baseURI(), dataURI));\\n }\\n\\n function addTokenController(\\n uint256 tokenId,\\n address controller\\n ) public requireTokenOwner(tokenId) {\\n _requireMinted(tokenId);\\n _grantRole(_tokenRole(tokenId, \\\"CONTROLLER\\\"), controller);\\n }\\n\\n function removeTokenController(\\n uint256 tokenId,\\n address controller\\n ) public requireTokenOwner(tokenId) {\\n _requireMinted(tokenId);\\n _revokeRole(_tokenRole(tokenId, \\\"CONTROLLER\\\"), controller);\\n }\\n\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC721, AccessControl) returns (bool) {\\n return super.supportsInterface(interfaceId);\\n }\\n\\n function _baseURI() internal view virtual override returns (string memory) {\\n return \\\"data:application/json;base64,\\\";\\n }\\n\\n function setTokenExternalURL(\\n uint256 tokenId,\\n bytes32 _tokenExternalURL\\n ) public virtual payable requireTokenController(tokenId) {\\n _requireMinted(tokenId);\\n _sites[tokenId].external_url = _tokenExternalURL;\\n }\\n\\n function setTokenENS(\\n uint256 tokenId,\\n bytes32 _tokenENS\\n ) public virtual payable requireTokenController(tokenId) {\\n _requireMinted(tokenId);\\n _sites[tokenId].ENS = _tokenENS;\\n }\\n\\n function setTokenBuild(\\n uint256 tokenId,\\n string memory _commit_hash,\\n string memory _git_repository\\n ) public virtual payable requireTokenController(tokenId) {\\n _requireMinted(tokenId);\\n _sites[tokenId].builds[++_sites[tokenId].current_build] = Build(_commit_hash, _git_repository);\\n }\\n\\n function burn(uint256 tokenId) public virtual payable requireTokenController(tokenId) {\\n require(\\n ownerOf(tokenId) == msg.sender,\\n \\\"FleekERC721: must be token owner\\\"\\n );\\n super._burn(tokenId);\\n\\n if (_sites[tokenId].external_url.length != 0) {\\n delete _sites[tokenId];\\n }\\n }\\n}\\n\",\"keccak256\":\"0x20ee7e1b15feb0674526158c1090e3949f8e1e6415b7209c925b76d9a74e7d64\",\"license\":\"MIT\"}},\"version\":1}",
|
|
"bytecode": "0x60806040523480156200001157600080fd5b5060405162004cc238038062004cc28339818101604052810190620000379190620003f3565b8181816000908051906020019062000051929190620002c5565b5080600190805190602001906200006a929190620002c5565b505050620000a27fcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc6000801b620000dc60201b60201c565b620000d47fcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc336200014060201b60201c565b5050620005fc565b6000620000ef836200023260201b60201c565b90508160066000858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b6200015282826200025260201b60201c565b6200022e5760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001d3620002bd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600060066000838152602001908152602001600020600101549050919050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b828054620002d3906200050d565b90600052602060002090601f016020900481019282620002f7576000855562000343565b82601f106200031257805160ff191683800117855562000343565b8280016001018555821562000343579182015b828111156200034257825182559160200191906001019062000325565b5b50905062000352919062000356565b5090565b5b808211156200037157600081600090555060010162000357565b5090565b60006200038c6200038684620004a1565b62000478565b905082815260208101848484011115620003ab57620003aa620005dc565b5b620003b8848285620004d7565b509392505050565b600082601f830112620003d857620003d7620005d7565b5b8151620003ea84826020860162000375565b91505092915050565b600080604083850312156200040d576200040c620005e6565b5b600083015167ffffffffffffffff8111156200042e576200042d620005e1565b5b6200043c85828601620003c0565b925050602083015167ffffffffffffffff81111562000460576200045f620005e1565b5b6200046e85828601620003c0565b9150509250929050565b60006200048462000497565b905062000492828262000543565b919050565b6000604051905090565b600067ffffffffffffffff821115620004bf57620004be620005a8565b5b620004ca82620005eb565b9050602081019050919050565b60005b83811015620004f7578082015181840152602081019050620004da565b8381111562000507576000848401525b50505050565b600060028204905060018216806200052657607f821691505b602082108114156200053d576200053c62000579565b5b50919050565b6200054e82620005eb565b810181811067ffffffffffffffff8211171562000570576200056f620005a8565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6146b6806200060c6000396000f3fe6080604052600436106101c25760003560e01c806391d14854116100f7578063b88d4fde11610095578063d547741f11610064578063d547741f14610622578063dcd781861461064b578063e46f29c814610674578063e985e9c51461069f576101c2565b8063b88d4fde14610577578063befaa6a3146105a0578063c87b56dd146105c9578063ceade7b614610606576101c2565b806398b70793116100d157806398b70793146104c8578063a0c5a75e146104f3578063a217fddf14610523578063a22cb4651461054e576101c2565b806391d148541461044457806395d89b4114610481578063987c26fd146104ac576101c2565b806336568abe1161016457806342966c681161013e57806342966c68146103925780636352211e146103ae578063651a32b9146103eb57806370a0823114610407576101c2565b806336568abe146103245780633806f1521461034d57806342842e0e14610369576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806323b872dd14610295578063248a9ca3146102be5780632f2ff15d146102fb576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612f41565b6106dc565b6040516101fb91906138c6565b60405180910390f35b34801561021057600080fd5b506102196106ee565b60405161022691906138fc565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612f9b565b610780565b604051610263919061385f565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612e94565b6107c6565b005b3480156102a157600080fd5b506102bc60048036038101906102b79190612ccb565b6108de565b005b3480156102ca57600080fd5b506102e560048036038101906102e09190612ed4565b61093e565b6040516102f291906138e1565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190612f01565b61095e565b005b34801561033057600080fd5b5061034b60048036038101906103469190612f01565b61097f565b005b61036760048036038101906103629190613048565b610a02565b005b34801561037557600080fd5b50610390600480360381019061038b9190612ccb565b610b3a565b005b6103ac60048036038101906103a79190612f9b565b610b5a565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190612f9b565b610cb4565b6040516103e2919061385f565b60405180910390f35b61040560048036038101906104009190613008565b610d3b565b005b34801561041357600080fd5b5061042e60048036038101906104299190612c5e565b610dec565b60405161043b9190613b1e565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190612f01565b610ea4565b60405161047891906138c6565b60405180910390f35b34801561048d57600080fd5b50610496610f0f565b6040516104a391906138fc565b60405180910390f35b6104c660048036038101906104c19190613048565b610fa1565b005b3480156104d457600080fd5b506104dd611032565b6040516104ea91906138e1565b60405180910390f35b61050d60048036038101906105089190612de1565b611056565b60405161051a9190613b1e565b60405180910390f35b34801561052f57600080fd5b50610538611195565b60405161054591906138e1565b60405180910390f35b34801561055a57600080fd5b5061057560048036038101906105709190612da1565b61119c565b005b34801561058357600080fd5b5061059e60048036038101906105999190612d1e565b6111b2565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190612fc8565b611214565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190612f9b565b6112e1565b6040516105fd91906138fc565b60405180910390f35b610620600480360381019061061b9190613008565b6113b3565b005b34801561062e57600080fd5b5061064960048036038101906106449190612f01565b611464565b005b34801561065757600080fd5b50610672600480360381019061066d9190612fc8565b611485565b005b34801561068057600080fd5b50610689611552565b60405161069691906138e1565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c19190612c8b565b611576565b6040516106d391906138c6565b60405180910390f35b60006106e78261160a565b9050919050565b6060600080546106fd90613df1565b80601f016020809104026020016040519081016040528092919081815260200182805461072990613df1565b80156107765780601f1061074b57610100808354040283529160200191610776565b820191906000526020600020905b81548152906001019060200180831161075957829003601f168201915b5050505050905090565b600061078b82611684565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107d182610cb4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083990613a7e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108616116cf565b73ffffffffffffffffffffffffffffffffffffffff161480610890575061088f8161088a6116cf565b611576565b5b6108cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c690613a9e565b60405180910390fd5b6108d983836116d7565b505050565b6108ef6108e96116cf565b82611790565b61092e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109259061393e565b60405180910390fd5b610939838383611825565b505050565b600060066000838152602001908152602001600020600101549050919050565b6109678261093e565b61097081611b1f565b61097a8383611b33565b505050565b6109876116cf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109eb90613afe565b60405180910390fd5b6109fe8282611c14565b5050565b82610a4b610a45826040518060400160405280600a81526020017f434f4e54524f4c4c455200000000000000000000000000000000000000000000815250611cf6565b33610ea4565b610a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8190613ade565b60405180910390fd5b610a9384611684565b6040518060400160405280848152602001838152506008600086815260200190815260200160002060030160006008600088815260200190815260200160002060020160008154610ae390613e54565b91905081905581526020019081526020016000206000820151816000019080519060200190610b13929190612a5d565b506020820151816001019080519060200190610b30929190612a5d565b5090505050505050565b610b55838383604051806020016040528060008152506111b2565b505050565b80610ba3610b9d826040518060400160405280600a81526020017f434f4e54524f4c4c455200000000000000000000000000000000000000000000815250611cf6565b33610ea4565b610be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd990613ade565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16610c0283610cb4565b73ffffffffffffffffffffffffffffffffffffffff1614610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90613a3e565b60405180910390fd5b610c6182611d29565b60006008600084815260200190815260200160002050602060ff1614610cb057600860008381526020019081526020016000206000808201600090556001820160009055600282016000905550505b5050565b600080610cc083611e77565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2990613a5e565b60405180910390fd5b80915050919050565b81610d84610d7e826040518060400160405280600a81526020017f434f4e54524f4c4c455200000000000000000000000000000000000000000000815250611cf6565b33610ea4565b610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba90613ade565b60405180910390fd5b610dcc83611684565b816008600085815260200190815260200160002060000181905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e54906139fe565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610f1e90613df1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4a90613df1565b8015610f975780601f10610f6c57610100808354040283529160200191610f97565b820191906000526020600020905b815481529060010190602001808311610f7a57829003601f168201915b5050505050905090565b82610fab81610cb4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100f90613a3e565b60405180910390fd5b61102184611684565b61102c848484610a02565b50505050565b7fcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc81565b60006110827fcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc33610ea4565b6110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b890613abe565b60405180910390fd5b60006110cd6007611eb4565b90506110d98782611ec2565b6110e38188611485565b6110ed60076120e0565b6000600860008381526020019081526020016000209050868160000181905550858160010181905550600081600201819055506040518060400160405280868152602001858152508160030160008081526020019081526020016000206000820151816000019080519060200190611166929190612a5d565b506020820151816001019080519060200190611183929190612a5d565b50905050819250505095945050505050565b6000801b81565b6111ae6111a76116cf565b83836120f6565b5050565b6111c36111bd6116cf565b83611790565b611202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f99061393e565b60405180910390fd5b61120e84848484612263565b50505050565b8161121e81610cb4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128290613a3e565b60405180910390fd5b61129483611684565b6112dc6112d6846040518060400160405280600a81526020017f434f4e54524f4c4c455200000000000000000000000000000000000000000000815250611cf6565b83611c14565b505050565b60606112ec82611684565b60006112f783610cb4565b90506000600860008581526020019081526020016000209050600082826001015483600001548460020154856003016000876002015481526020019081526020016000206000018660030160008860020154815260200190815260200160002060010160405160200161136f96959493929190613718565b60405160208183030381529060405290506113886122bf565b8160405160200161139a9291906136c1565b6040516020818303038152906040529350505050919050565b816113fc6113f6826040518060400160405280600a81526020017f434f4e54524f4c4c455200000000000000000000000000000000000000000000815250611cf6565b33610ea4565b61143b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143290613ade565b60405180910390fd5b61144483611684565b816008600085815260200190815260200160002060010181905550505050565b61146d8261093e565b61147681611b1f565b6114808383611c14565b505050565b8161148f81610cb4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f390613a3e565b60405180910390fd5b61150583611684565b61154d611547846040518060400160405280600a81526020017f434f4e54524f4c4c455200000000000000000000000000000000000000000000815250611cf6565b83611b33565b505050565b7f54812023c8fe13756580f3420840aeb566f69714bea27346e22e4c654756d77e81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061167d575061167c826122fc565b5b9050919050565b61168d816123de565b6116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390613a5e565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661174a83610cb4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061179c83610cb4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117de57506117dd8185611576565b5b8061181c57508373ffffffffffffffffffffffffffffffffffffffff1661180484610780565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661184582610cb4565b73ffffffffffffffffffffffffffffffffffffffff161461189b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118929061397e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561190b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611902906139be565b60405180910390fd5b611918838383600161241f565b8273ffffffffffffffffffffffffffffffffffffffff1661193882610cb4565b73ffffffffffffffffffffffffffffffffffffffff161461198e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119859061397e565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b1a8383836001612545565b505050565b611b3081611b2b6116cf565b61254b565b50565b611b3d8282610ea4565b611c105760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611bb56116cf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611c1e8282610ea4565b15611cf25760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611c976116cf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008183604051602001611d0b9291906136e5565b60405160208183030381529060405280519060200120905092915050565b6000611d3482610cb4565b9050611d4481600084600161241f565b611d4d82610cb4565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e73816000846001612545565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2990613a1e565b60405180910390fd5b611f3b816123de565b15611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f729061399e565b60405180910390fd5b611f8960008383600161241f565b611f92816123de565b15611fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc99061399e565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120dc600083836001612545565b5050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c906139de565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161225691906138c6565b60405180910390a3505050565b61226e848484611825565b61227a848484846125d0565b6122b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b09061395e565b60405180910390fd5b50505050565b60606040518060400160405280601d81526020017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123c757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123d757506123d682612767565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661240083611e77565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600181111561253f57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146124b35780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ab9190613cd3565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461253e5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125369190613c23565b925050819055505b5b50505050565b50505050565b6125558282610ea4565b6125cc57612562816127d1565b6125708360001c60206127fe565b604051602001612581929190613825565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c391906138fc565b60405180910390fd5b5050565b60006125f18473ffffffffffffffffffffffffffffffffffffffff16612a3a565b1561275a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261261a6116cf565b8786866040518563ffffffff1660e01b815260040161263c949392919061387a565b602060405180830381600087803b15801561265657600080fd5b505af192505050801561268757506040513d601f19601f820116820180604052508101906126849190612f6e565b60015b61270a573d80600081146126b7576040519150601f19603f3d011682016040523d82523d6000602084013e6126bc565b606091505b50600081511415612702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f99061395e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061275f565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606127f78273ffffffffffffffffffffffffffffffffffffffff16601460ff166127fe565b9050919050565b6060600060028360026128119190613c79565b61281b9190613c23565b67ffffffffffffffff81111561283457612833613f62565b5b6040519080825280601f01601f1916602001820160405280156128665781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061289e5761289d613f33565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061290257612901613f33565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026129429190613c79565b61294c9190613c23565b90505b60018111156129ec577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061298e5761298d613f33565b5b1a60f81b8282815181106129a5576129a4613f33565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806129e590613dc7565b905061294f565b5060008414612a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a279061391e565b60405180910390fd5b8091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612a6990613df1565b90600052602060002090601f016020900481019282612a8b5760008555612ad2565b82601f10612aa457805160ff1916838001178555612ad2565b82800160010185558215612ad2579182015b82811115612ad1578251825591602001919060010190612ab6565b5b509050612adf9190612ae3565b5090565b5b80821115612afc576000816000905550600101612ae4565b5090565b6000612b13612b0e84613b5e565b613b39565b905082815260208101848484011115612b2f57612b2e613f96565b5b612b3a848285613d85565b509392505050565b6000612b55612b5084613b8f565b613b39565b905082815260208101848484011115612b7157612b70613f96565b5b612b7c848285613d85565b509392505050565b600081359050612b938161460d565b92915050565b600081359050612ba881614624565b92915050565b600081359050612bbd8161463b565b92915050565b600081359050612bd281614652565b92915050565b600081519050612be781614652565b92915050565b600082601f830112612c0257612c01613f91565b5b8135612c12848260208601612b00565b91505092915050565b600082601f830112612c3057612c2f613f91565b5b8135612c40848260208601612b42565b91505092915050565b600081359050612c5881614669565b92915050565b600060208284031215612c7457612c73613fa0565b5b6000612c8284828501612b84565b91505092915050565b60008060408385031215612ca257612ca1613fa0565b5b6000612cb085828601612b84565b9250506020612cc185828601612b84565b9150509250929050565b600080600060608486031215612ce457612ce3613fa0565b5b6000612cf286828701612b84565b9350506020612d0386828701612b84565b9250506040612d1486828701612c49565b9150509250925092565b60008060008060808587031215612d3857612d37613fa0565b5b6000612d4687828801612b84565b9450506020612d5787828801612b84565b9350506040612d6887828801612c49565b925050606085013567ffffffffffffffff811115612d8957612d88613f9b565b5b612d9587828801612bed565b91505092959194509250565b60008060408385031215612db857612db7613fa0565b5b6000612dc685828601612b84565b9250506020612dd785828601612b99565b9150509250929050565b600080600080600060a08688031215612dfd57612dfc613fa0565b5b6000612e0b88828901612b84565b9550506020612e1c88828901612bae565b9450506040612e2d88828901612bae565b935050606086013567ffffffffffffffff811115612e4e57612e4d613f9b565b5b612e5a88828901612c1b565b925050608086013567ffffffffffffffff811115612e7b57612e7a613f9b565b5b612e8788828901612c1b565b9150509295509295909350565b60008060408385031215612eab57612eaa613fa0565b5b6000612eb985828601612b84565b9250506020612eca85828601612c49565b9150509250929050565b600060208284031215612eea57612ee9613fa0565b5b6000612ef884828501612bae565b91505092915050565b60008060408385031215612f1857612f17613fa0565b5b6000612f2685828601612bae565b9250506020612f3785828601612b84565b9150509250929050565b600060208284031215612f5757612f56613fa0565b5b6000612f6584828501612bc3565b91505092915050565b600060208284031215612f8457612f83613fa0565b5b6000612f9284828501612bd8565b91505092915050565b600060208284031215612fb157612fb0613fa0565b5b6000612fbf84828501612c49565b91505092915050565b60008060408385031215612fdf57612fde613fa0565b5b6000612fed85828601612c49565b9250506020612ffe85828601612b84565b9150509250929050565b6000806040838503121561301f5761301e613fa0565b5b600061302d85828601612c49565b925050602061303e85828601612bae565b9150509250929050565b60008060006060848603121561306157613060613fa0565b5b600061306f86828701612c49565b935050602084013567ffffffffffffffff8111156130905761308f613f9b565b5b61309c86828701612c1b565b925050604084013567ffffffffffffffff8111156130bd576130bc613f9b565b5b6130c986828701612c1b565b9150509250925092565b6130dc81613d07565b82525050565b6130f36130ee82613d07565b613e9d565b82525050565b61310281613d19565b82525050565b61311181613d25565b82525050565b61312861312382613d25565b613eaf565b82525050565b600061313982613bd5565b6131438185613beb565b9350613153818560208601613d94565b61315c81613fa5565b840191505092915050565b600061317282613bd5565b61317c8185613bfc565b935061318c818560208601613d94565b80840191505092915050565b60006131a382613be0565b6131ad8185613c07565b93506131bd818560208601613d94565b6131c681613fa5565b840191505092915050565b60006131dc82613be0565b6131e68185613c18565b93506131f6818560208601613d94565b80840191505092915050565b6000815461320f81613df1565b6132198186613c18565b94506001821660008114613234576001811461324557613278565b60ff19831686528186019350613278565b61324e85613bc0565b60005b8381101561327057815481890152600182019150602081019050613251565b838801955050505b50505092915050565b600061328e602083613c07565b915061329982613fc3565b602082019050919050565b60006132b1602d83613c07565b91506132bc82613fec565b604082019050919050565b60006132d4600e83613c18565b91506132df8261403b565b600e82019050919050565b60006132f7601083613c18565b915061330282614064565b601082019050919050565b600061331a603283613c07565b91506133258261408d565b604082019050919050565b600061333d600283613c18565b9150613348826140dc565b600282019050919050565b6000613360600683613c18565b915061336b82614105565b600682019050919050565b6000613383602583613c07565b915061338e8261412e565b604082019050919050565b60006133a6601c83613c07565b91506133b18261417d565b602082019050919050565b60006133c9602483613c07565b91506133d4826141a6565b604082019050919050565b60006133ec601983613c07565b91506133f7826141f5565b602082019050919050565b600061340f600f83613c18565b915061341a8261421e565b600f82019050919050565b6000613432600683613c18565b915061343d82614247565b600682019050919050565b6000613455602983613c07565b915061346082614270565b604082019050919050565b6000613478600283613c18565b9150613483826142bf565b600282019050919050565b600061349b602083613c07565b91506134a6826142e8565b602082019050919050565b60006134be600183613c18565b91506134c982614311565b600182019050919050565b60006134e1602083613c07565b91506134ec8261433a565b602082019050919050565b6000613504600183613c18565b915061350f82614363565b600182019050919050565b6000613527600983613c18565b91506135328261438c565b600982019050919050565b600061354a601883613c07565b9150613555826143b5565b602082019050919050565b600061356d600883613c18565b9150613578826143de565b600882019050919050565b6000613590602183613c07565b915061359b82614407565b604082019050919050565b60006135b3603d83613c07565b91506135be82614456565b604082019050919050565b60006135d6601783613c18565b91506135e1826144a5565b601782019050919050565b60006135f9603383613c07565b9150613604826144ce565b604082019050919050565b600061361c602883613c07565b91506136278261451d565b604082019050919050565b600061363f600783613c18565b915061364a8261456c565b600782019050919050565b6000613662601183613c18565b915061366d82614595565b601182019050919050565b6000613685602f83613c07565b9150613690826145be565b604082019050919050565b6136a481613d7b565b82525050565b6136bb6136b682613d7b565b613ecb565b82525050565b60006136cd82856131d1565b91506136d98284613167565b91508190509392505050565b60006136f082613425565b91506136fc82856131d1565b915061370882846136aa565b6020820191508190509392505050565b6000613723826134f7565b915061372e8261351a565b915061373a82896130e2565b60148201915061374982613330565b915061375482613632565b91506137608288613117565b60208201915061376f82613330565b915061377a826132ea565b91506137868287613117565b60208201915061379582613330565b91506137a082613560565b91506137ab82613353565b91506137b782866136aa565b6020820191506137c682613330565b91506137d182613402565b91506137dd8285613202565b91506137e882613330565b91506137f3826132c7565b91506137ff8284613202565b915061380a8261346b565b9150613815826134b1565b9150819050979650505050505050565b6000613830826135c9565b915061383c82856131d1565b915061384782613655565b915061385382846131d1565b91508190509392505050565b600060208201905061387460008301846130d3565b92915050565b600060808201905061388f60008301876130d3565b61389c60208301866130d3565b6138a9604083018561369b565b81810360608301526138bb818461312e565b905095945050505050565b60006020820190506138db60008301846130f9565b92915050565b60006020820190506138f66000830184613108565b92915050565b600060208201905081810360008301526139168184613198565b905092915050565b6000602082019050818103600083015261393781613281565b9050919050565b60006020820190508181036000830152613957816132a4565b9050919050565b600060208201905081810360008301526139778161330d565b9050919050565b6000602082019050818103600083015261399781613376565b9050919050565b600060208201905081810360008301526139b781613399565b9050919050565b600060208201905081810360008301526139d7816133bc565b9050919050565b600060208201905081810360008301526139f7816133df565b9050919050565b60006020820190508181036000830152613a1781613448565b9050919050565b60006020820190508181036000830152613a378161348e565b9050919050565b60006020820190508181036000830152613a57816134d4565b9050919050565b60006020820190508181036000830152613a778161353d565b9050919050565b60006020820190508181036000830152613a9781613583565b9050919050565b60006020820190508181036000830152613ab7816135a6565b9050919050565b60006020820190508181036000830152613ad7816135ec565b9050919050565b60006020820190508181036000830152613af78161360f565b9050919050565b60006020820190508181036000830152613b1781613678565b9050919050565b6000602082019050613b33600083018461369b565b92915050565b6000613b43613b54565b9050613b4f8282613e23565b919050565b6000604051905090565b600067ffffffffffffffff821115613b7957613b78613f62565b5b613b8282613fa5565b9050602081019050919050565b600067ffffffffffffffff821115613baa57613ba9613f62565b5b613bb382613fa5565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c2e82613d7b565b9150613c3983613d7b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6e57613c6d613ed5565b5b828201905092915050565b6000613c8482613d7b565b9150613c8f83613d7b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cc857613cc7613ed5565b5b828202905092915050565b6000613cde82613d7b565b9150613ce983613d7b565b925082821015613cfc57613cfb613ed5565b5b828203905092915050565b6000613d1282613d5b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613db2578082015181840152602081019050613d97565b83811115613dc1576000848401525b50505050565b6000613dd282613d7b565b91506000821415613de657613de5613ed5565b5b600182039050919050565b60006002820490506001821680613e0957607f821691505b60208210811415613e1d57613e1c613f04565b5b50919050565b613e2c82613fa5565b810181811067ffffffffffffffff82111715613e4b57613e4a613f62565b5b80604052505050565b6000613e5f82613d7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e9257613e91613ed5565b5b600182019050919050565b6000613ea882613eb9565b9050919050565b6000819050919050565b6000613ec482613fb6565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f227265706f7369746f7279223a22000000000000000000000000000000000000600082015250565b7f2265787465726e616c5f75726c223a2200000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b7f226964223a220000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f22636f6d6d69745f68617368223a220000000000000000000000000000000000600082015250565b7f544f4b454e5f0000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f466c65656b4552433732313a206d75737420626520746f6b656e206f776e6572600082015250565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b7f226f776e6572223a220000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f226275696c643a7b000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f466c65656b416363657373436f6e74726f6c3a206d757374206861766520636f60008201527f6c6c656374696f6e206f776e657220726f6c6500000000000000000000000000602082015250565b7f466c65656b416363657373436f6e74726f6c3a206d757374206861766520746f60008201527f6b656e20726f6c65000000000000000000000000000000000000000000000000602082015250565b7f22454e53223a2200000000000000000000000000000000000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61461681613d07565b811461462157600080fd5b50565b61462d81613d19565b811461463857600080fd5b50565b61464481613d25565b811461464f57600080fd5b50565b61465b81613d2f565b811461466657600080fd5b50565b61467281613d7b565b811461467d57600080fd5b5056fea264697066735822122035e4184e342cd37d9e3641cfc2af27ec44489dde9313dcb89431f93aff08385e64736f6c63430008070033",
|
|
"deployedBytecode": "0x6080604052600436106101c25760003560e01c806391d14854116100f7578063b88d4fde11610095578063d547741f11610064578063d547741f14610622578063dcd781861461064b578063e46f29c814610674578063e985e9c51461069f576101c2565b8063b88d4fde14610577578063befaa6a3146105a0578063c87b56dd146105c9578063ceade7b614610606576101c2565b806398b70793116100d157806398b70793146104c8578063a0c5a75e146104f3578063a217fddf14610523578063a22cb4651461054e576101c2565b806391d148541461044457806395d89b4114610481578063987c26fd146104ac576101c2565b806336568abe1161016457806342966c681161013e57806342966c68146103925780636352211e146103ae578063651a32b9146103eb57806370a0823114610407576101c2565b806336568abe146103245780633806f1521461034d57806342842e0e14610369576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806323b872dd14610295578063248a9ca3146102be5780632f2ff15d146102fb576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612f41565b6106dc565b6040516101fb91906138c6565b60405180910390f35b34801561021057600080fd5b506102196106ee565b60405161022691906138fc565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612f9b565b610780565b604051610263919061385f565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612e94565b6107c6565b005b3480156102a157600080fd5b506102bc60048036038101906102b79190612ccb565b6108de565b005b3480156102ca57600080fd5b506102e560048036038101906102e09190612ed4565b61093e565b6040516102f291906138e1565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190612f01565b61095e565b005b34801561033057600080fd5b5061034b60048036038101906103469190612f01565b61097f565b005b61036760048036038101906103629190613048565b610a02565b005b34801561037557600080fd5b50610390600480360381019061038b9190612ccb565b610b3a565b005b6103ac60048036038101906103a79190612f9b565b610b5a565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190612f9b565b610cb4565b6040516103e2919061385f565b60405180910390f35b61040560048036038101906104009190613008565b610d3b565b005b34801561041357600080fd5b5061042e60048036038101906104299190612c5e565b610dec565b60405161043b9190613b1e565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190612f01565b610ea4565b60405161047891906138c6565b60405180910390f35b34801561048d57600080fd5b50610496610f0f565b6040516104a391906138fc565b60405180910390f35b6104c660048036038101906104c19190613048565b610fa1565b005b3480156104d457600080fd5b506104dd611032565b6040516104ea91906138e1565b60405180910390f35b61050d60048036038101906105089190612de1565b611056565b60405161051a9190613b1e565b60405180910390f35b34801561052f57600080fd5b50610538611195565b60405161054591906138e1565b60405180910390f35b34801561055a57600080fd5b5061057560048036038101906105709190612da1565b61119c565b005b34801561058357600080fd5b5061059e60048036038101906105999190612d1e565b6111b2565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190612fc8565b611214565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190612f9b565b6112e1565b6040516105fd91906138fc565b60405180910390f35b610620600480360381019061061b9190613008565b6113b3565b005b34801561062e57600080fd5b5061064960048036038101906106449190612f01565b611464565b005b34801561065757600080fd5b50610672600480360381019061066d9190612fc8565b611485565b005b34801561068057600080fd5b50610689611552565b60405161069691906138e1565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c19190612c8b565b611576565b6040516106d391906138c6565b60405180910390f35b60006106e78261160a565b9050919050565b6060600080546106fd90613df1565b80601f016020809104026020016040519081016040528092919081815260200182805461072990613df1565b80156107765780601f1061074b57610100808354040283529160200191610776565b820191906000526020600020905b81548152906001019060200180831161075957829003601f168201915b5050505050905090565b600061078b82611684565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107d182610cb4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083990613a7e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108616116cf565b73ffffffffffffffffffffffffffffffffffffffff161480610890575061088f8161088a6116cf565b611576565b5b6108cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c690613a9e565b60405180910390fd5b6108d983836116d7565b505050565b6108ef6108e96116cf565b82611790565b61092e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109259061393e565b60405180910390fd5b610939838383611825565b505050565b600060066000838152602001908152602001600020600101549050919050565b6109678261093e565b61097081611b1f565b61097a8383611b33565b505050565b6109876116cf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109eb90613afe565b60405180910390fd5b6109fe8282611c14565b5050565b82610a4b610a45826040518060400160405280600a81526020017f434f4e54524f4c4c455200000000000000000000000000000000000000000000815250611cf6565b33610ea4565b610a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8190613ade565b60405180910390fd5b610a9384611684565b6040518060400160405280848152602001838152506008600086815260200190815260200160002060030160006008600088815260200190815260200160002060020160008154610ae390613e54565b91905081905581526020019081526020016000206000820151816000019080519060200190610b13929190612a5d565b506020820151816001019080519060200190610b30929190612a5d565b5090505050505050565b610b55838383604051806020016040528060008152506111b2565b505050565b80610ba3610b9d826040518060400160405280600a81526020017f434f4e54524f4c4c455200000000000000000000000000000000000000000000815250611cf6565b33610ea4565b610be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd990613ade565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16610c0283610cb4565b73ffffffffffffffffffffffffffffffffffffffff1614610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90613a3e565b60405180910390fd5b610c6182611d29565b60006008600084815260200190815260200160002050602060ff1614610cb057600860008381526020019081526020016000206000808201600090556001820160009055600282016000905550505b5050565b600080610cc083611e77565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2990613a5e565b60405180910390fd5b80915050919050565b81610d84610d7e826040518060400160405280600a81526020017f434f4e54524f4c4c455200000000000000000000000000000000000000000000815250611cf6565b33610ea4565b610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba90613ade565b60405180910390fd5b610dcc83611684565b816008600085815260200190815260200160002060000181905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e54906139fe565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610f1e90613df1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4a90613df1565b8015610f975780601f10610f6c57610100808354040283529160200191610f97565b820191906000526020600020905b815481529060010190602001808311610f7a57829003601f168201915b5050505050905090565b82610fab81610cb4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100f90613a3e565b60405180910390fd5b61102184611684565b61102c848484610a02565b50505050565b7fcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc81565b60006110827fcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc33610ea4565b6110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b890613abe565b60405180910390fd5b60006110cd6007611eb4565b90506110d98782611ec2565b6110e38188611485565b6110ed60076120e0565b6000600860008381526020019081526020016000209050868160000181905550858160010181905550600081600201819055506040518060400160405280868152602001858152508160030160008081526020019081526020016000206000820151816000019080519060200190611166929190612a5d565b506020820151816001019080519060200190611183929190612a5d565b50905050819250505095945050505050565b6000801b81565b6111ae6111a76116cf565b83836120f6565b5050565b6111c36111bd6116cf565b83611790565b611202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f99061393e565b60405180910390fd5b61120e84848484612263565b50505050565b8161121e81610cb4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128290613a3e565b60405180910390fd5b61129483611684565b6112dc6112d6846040518060400160405280600a81526020017f434f4e54524f4c4c455200000000000000000000000000000000000000000000815250611cf6565b83611c14565b505050565b60606112ec82611684565b60006112f783610cb4565b90506000600860008581526020019081526020016000209050600082826001015483600001548460020154856003016000876002015481526020019081526020016000206000018660030160008860020154815260200190815260200160002060010160405160200161136f96959493929190613718565b60405160208183030381529060405290506113886122bf565b8160405160200161139a9291906136c1565b6040516020818303038152906040529350505050919050565b816113fc6113f6826040518060400160405280600a81526020017f434f4e54524f4c4c455200000000000000000000000000000000000000000000815250611cf6565b33610ea4565b61143b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143290613ade565b60405180910390fd5b61144483611684565b816008600085815260200190815260200160002060010181905550505050565b61146d8261093e565b61147681611b1f565b6114808383611c14565b505050565b8161148f81610cb4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f390613a3e565b60405180910390fd5b61150583611684565b61154d611547846040518060400160405280600a81526020017f434f4e54524f4c4c455200000000000000000000000000000000000000000000815250611cf6565b83611b33565b505050565b7f54812023c8fe13756580f3420840aeb566f69714bea27346e22e4c654756d77e81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061167d575061167c826122fc565b5b9050919050565b61168d816123de565b6116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390613a5e565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661174a83610cb4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061179c83610cb4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117de57506117dd8185611576565b5b8061181c57508373ffffffffffffffffffffffffffffffffffffffff1661180484610780565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661184582610cb4565b73ffffffffffffffffffffffffffffffffffffffff161461189b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118929061397e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561190b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611902906139be565b60405180910390fd5b611918838383600161241f565b8273ffffffffffffffffffffffffffffffffffffffff1661193882610cb4565b73ffffffffffffffffffffffffffffffffffffffff161461198e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119859061397e565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b1a8383836001612545565b505050565b611b3081611b2b6116cf565b61254b565b50565b611b3d8282610ea4565b611c105760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611bb56116cf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611c1e8282610ea4565b15611cf25760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611c976116cf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008183604051602001611d0b9291906136e5565b60405160208183030381529060405280519060200120905092915050565b6000611d3482610cb4565b9050611d4481600084600161241f565b611d4d82610cb4565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e73816000846001612545565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2990613a1e565b60405180910390fd5b611f3b816123de565b15611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f729061399e565b60405180910390fd5b611f8960008383600161241f565b611f92816123de565b15611fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc99061399e565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120dc600083836001612545565b5050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c906139de565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161225691906138c6565b60405180910390a3505050565b61226e848484611825565b61227a848484846125d0565b6122b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b09061395e565b60405180910390fd5b50505050565b60606040518060400160405280601d81526020017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123c757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123d757506123d682612767565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661240083611e77565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600181111561253f57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146124b35780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ab9190613cd3565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461253e5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125369190613c23565b925050819055505b5b50505050565b50505050565b6125558282610ea4565b6125cc57612562816127d1565b6125708360001c60206127fe565b604051602001612581929190613825565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c391906138fc565b60405180910390fd5b5050565b60006125f18473ffffffffffffffffffffffffffffffffffffffff16612a3a565b1561275a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261261a6116cf565b8786866040518563ffffffff1660e01b815260040161263c949392919061387a565b602060405180830381600087803b15801561265657600080fd5b505af192505050801561268757506040513d601f19601f820116820180604052508101906126849190612f6e565b60015b61270a573d80600081146126b7576040519150601f19603f3d011682016040523d82523d6000602084013e6126bc565b606091505b50600081511415612702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f99061395e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061275f565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606127f78273ffffffffffffffffffffffffffffffffffffffff16601460ff166127fe565b9050919050565b6060600060028360026128119190613c79565b61281b9190613c23565b67ffffffffffffffff81111561283457612833613f62565b5b6040519080825280601f01601f1916602001820160405280156128665781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061289e5761289d613f33565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061290257612901613f33565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026129429190613c79565b61294c9190613c23565b90505b60018111156129ec577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061298e5761298d613f33565b5b1a60f81b8282815181106129a5576129a4613f33565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806129e590613dc7565b905061294f565b5060008414612a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a279061391e565b60405180910390fd5b8091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612a6990613df1565b90600052602060002090601f016020900481019282612a8b5760008555612ad2565b82601f10612aa457805160ff1916838001178555612ad2565b82800160010185558215612ad2579182015b82811115612ad1578251825591602001919060010190612ab6565b5b509050612adf9190612ae3565b5090565b5b80821115612afc576000816000905550600101612ae4565b5090565b6000612b13612b0e84613b5e565b613b39565b905082815260208101848484011115612b2f57612b2e613f96565b5b612b3a848285613d85565b509392505050565b6000612b55612b5084613b8f565b613b39565b905082815260208101848484011115612b7157612b70613f96565b5b612b7c848285613d85565b509392505050565b600081359050612b938161460d565b92915050565b600081359050612ba881614624565b92915050565b600081359050612bbd8161463b565b92915050565b600081359050612bd281614652565b92915050565b600081519050612be781614652565b92915050565b600082601f830112612c0257612c01613f91565b5b8135612c12848260208601612b00565b91505092915050565b600082601f830112612c3057612c2f613f91565b5b8135612c40848260208601612b42565b91505092915050565b600081359050612c5881614669565b92915050565b600060208284031215612c7457612c73613fa0565b5b6000612c8284828501612b84565b91505092915050565b60008060408385031215612ca257612ca1613fa0565b5b6000612cb085828601612b84565b9250506020612cc185828601612b84565b9150509250929050565b600080600060608486031215612ce457612ce3613fa0565b5b6000612cf286828701612b84565b9350506020612d0386828701612b84565b9250506040612d1486828701612c49565b9150509250925092565b60008060008060808587031215612d3857612d37613fa0565b5b6000612d4687828801612b84565b9450506020612d5787828801612b84565b9350506040612d6887828801612c49565b925050606085013567ffffffffffffffff811115612d8957612d88613f9b565b5b612d9587828801612bed565b91505092959194509250565b60008060408385031215612db857612db7613fa0565b5b6000612dc685828601612b84565b9250506020612dd785828601612b99565b9150509250929050565b600080600080600060a08688031215612dfd57612dfc613fa0565b5b6000612e0b88828901612b84565b9550506020612e1c88828901612bae565b9450506040612e2d88828901612bae565b935050606086013567ffffffffffffffff811115612e4e57612e4d613f9b565b5b612e5a88828901612c1b565b925050608086013567ffffffffffffffff811115612e7b57612e7a613f9b565b5b612e8788828901612c1b565b9150509295509295909350565b60008060408385031215612eab57612eaa613fa0565b5b6000612eb985828601612b84565b9250506020612eca85828601612c49565b9150509250929050565b600060208284031215612eea57612ee9613fa0565b5b6000612ef884828501612bae565b91505092915050565b60008060408385031215612f1857612f17613fa0565b5b6000612f2685828601612bae565b9250506020612f3785828601612b84565b9150509250929050565b600060208284031215612f5757612f56613fa0565b5b6000612f6584828501612bc3565b91505092915050565b600060208284031215612f8457612f83613fa0565b5b6000612f9284828501612bd8565b91505092915050565b600060208284031215612fb157612fb0613fa0565b5b6000612fbf84828501612c49565b91505092915050565b60008060408385031215612fdf57612fde613fa0565b5b6000612fed85828601612c49565b9250506020612ffe85828601612b84565b9150509250929050565b6000806040838503121561301f5761301e613fa0565b5b600061302d85828601612c49565b925050602061303e85828601612bae565b9150509250929050565b60008060006060848603121561306157613060613fa0565b5b600061306f86828701612c49565b935050602084013567ffffffffffffffff8111156130905761308f613f9b565b5b61309c86828701612c1b565b925050604084013567ffffffffffffffff8111156130bd576130bc613f9b565b5b6130c986828701612c1b565b9150509250925092565b6130dc81613d07565b82525050565b6130f36130ee82613d07565b613e9d565b82525050565b61310281613d19565b82525050565b61311181613d25565b82525050565b61312861312382613d25565b613eaf565b82525050565b600061313982613bd5565b6131438185613beb565b9350613153818560208601613d94565b61315c81613fa5565b840191505092915050565b600061317282613bd5565b61317c8185613bfc565b935061318c818560208601613d94565b80840191505092915050565b60006131a382613be0565b6131ad8185613c07565b93506131bd818560208601613d94565b6131c681613fa5565b840191505092915050565b60006131dc82613be0565b6131e68185613c18565b93506131f6818560208601613d94565b80840191505092915050565b6000815461320f81613df1565b6132198186613c18565b94506001821660008114613234576001811461324557613278565b60ff19831686528186019350613278565b61324e85613bc0565b60005b8381101561327057815481890152600182019150602081019050613251565b838801955050505b50505092915050565b600061328e602083613c07565b915061329982613fc3565b602082019050919050565b60006132b1602d83613c07565b91506132bc82613fec565b604082019050919050565b60006132d4600e83613c18565b91506132df8261403b565b600e82019050919050565b60006132f7601083613c18565b915061330282614064565b601082019050919050565b600061331a603283613c07565b91506133258261408d565b604082019050919050565b600061333d600283613c18565b9150613348826140dc565b600282019050919050565b6000613360600683613c18565b915061336b82614105565b600682019050919050565b6000613383602583613c07565b915061338e8261412e565b604082019050919050565b60006133a6601c83613c07565b91506133b18261417d565b602082019050919050565b60006133c9602483613c07565b91506133d4826141a6565b604082019050919050565b60006133ec601983613c07565b91506133f7826141f5565b602082019050919050565b600061340f600f83613c18565b915061341a8261421e565b600f82019050919050565b6000613432600683613c18565b915061343d82614247565b600682019050919050565b6000613455602983613c07565b915061346082614270565b604082019050919050565b6000613478600283613c18565b9150613483826142bf565b600282019050919050565b600061349b602083613c07565b91506134a6826142e8565b602082019050919050565b60006134be600183613c18565b91506134c982614311565b600182019050919050565b60006134e1602083613c07565b91506134ec8261433a565b602082019050919050565b6000613504600183613c18565b915061350f82614363565b600182019050919050565b6000613527600983613c18565b91506135328261438c565b600982019050919050565b600061354a601883613c07565b9150613555826143b5565b602082019050919050565b600061356d600883613c18565b9150613578826143de565b600882019050919050565b6000613590602183613c07565b915061359b82614407565b604082019050919050565b60006135b3603d83613c07565b91506135be82614456565b604082019050919050565b60006135d6601783613c18565b91506135e1826144a5565b601782019050919050565b60006135f9603383613c07565b9150613604826144ce565b604082019050919050565b600061361c602883613c07565b91506136278261451d565b604082019050919050565b600061363f600783613c18565b915061364a8261456c565b600782019050919050565b6000613662601183613c18565b915061366d82614595565b601182019050919050565b6000613685602f83613c07565b9150613690826145be565b604082019050919050565b6136a481613d7b565b82525050565b6136bb6136b682613d7b565b613ecb565b82525050565b60006136cd82856131d1565b91506136d98284613167565b91508190509392505050565b60006136f082613425565b91506136fc82856131d1565b915061370882846136aa565b6020820191508190509392505050565b6000613723826134f7565b915061372e8261351a565b915061373a82896130e2565b60148201915061374982613330565b915061375482613632565b91506137608288613117565b60208201915061376f82613330565b915061377a826132ea565b91506137868287613117565b60208201915061379582613330565b91506137a082613560565b91506137ab82613353565b91506137b782866136aa565b6020820191506137c682613330565b91506137d182613402565b91506137dd8285613202565b91506137e882613330565b91506137f3826132c7565b91506137ff8284613202565b915061380a8261346b565b9150613815826134b1565b9150819050979650505050505050565b6000613830826135c9565b915061383c82856131d1565b915061384782613655565b915061385382846131d1565b91508190509392505050565b600060208201905061387460008301846130d3565b92915050565b600060808201905061388f60008301876130d3565b61389c60208301866130d3565b6138a9604083018561369b565b81810360608301526138bb818461312e565b905095945050505050565b60006020820190506138db60008301846130f9565b92915050565b60006020820190506138f66000830184613108565b92915050565b600060208201905081810360008301526139168184613198565b905092915050565b6000602082019050818103600083015261393781613281565b9050919050565b60006020820190508181036000830152613957816132a4565b9050919050565b600060208201905081810360008301526139778161330d565b9050919050565b6000602082019050818103600083015261399781613376565b9050919050565b600060208201905081810360008301526139b781613399565b9050919050565b600060208201905081810360008301526139d7816133bc565b9050919050565b600060208201905081810360008301526139f7816133df565b9050919050565b60006020820190508181036000830152613a1781613448565b9050919050565b60006020820190508181036000830152613a378161348e565b9050919050565b60006020820190508181036000830152613a57816134d4565b9050919050565b60006020820190508181036000830152613a778161353d565b9050919050565b60006020820190508181036000830152613a9781613583565b9050919050565b60006020820190508181036000830152613ab7816135a6565b9050919050565b60006020820190508181036000830152613ad7816135ec565b9050919050565b60006020820190508181036000830152613af78161360f565b9050919050565b60006020820190508181036000830152613b1781613678565b9050919050565b6000602082019050613b33600083018461369b565b92915050565b6000613b43613b54565b9050613b4f8282613e23565b919050565b6000604051905090565b600067ffffffffffffffff821115613b7957613b78613f62565b5b613b8282613fa5565b9050602081019050919050565b600067ffffffffffffffff821115613baa57613ba9613f62565b5b613bb382613fa5565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c2e82613d7b565b9150613c3983613d7b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6e57613c6d613ed5565b5b828201905092915050565b6000613c8482613d7b565b9150613c8f83613d7b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cc857613cc7613ed5565b5b828202905092915050565b6000613cde82613d7b565b9150613ce983613d7b565b925082821015613cfc57613cfb613ed5565b5b828203905092915050565b6000613d1282613d5b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613db2578082015181840152602081019050613d97565b83811115613dc1576000848401525b50505050565b6000613dd282613d7b565b91506000821415613de657613de5613ed5565b5b600182039050919050565b60006002820490506001821680613e0957607f821691505b60208210811415613e1d57613e1c613f04565b5b50919050565b613e2c82613fa5565b810181811067ffffffffffffffff82111715613e4b57613e4a613f62565b5b80604052505050565b6000613e5f82613d7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e9257613e91613ed5565b5b600182019050919050565b6000613ea882613eb9565b9050919050565b6000819050919050565b6000613ec482613fb6565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f227265706f7369746f7279223a22000000000000000000000000000000000000600082015250565b7f2265787465726e616c5f75726c223a2200000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b7f226964223a220000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f22636f6d6d69745f68617368223a220000000000000000000000000000000000600082015250565b7f544f4b454e5f0000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f466c65656b4552433732313a206d75737420626520746f6b656e206f776e6572600082015250565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b7f226f776e6572223a220000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f226275696c643a7b000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f466c65656b416363657373436f6e74726f6c3a206d757374206861766520636f60008201527f6c6c656374696f6e206f776e657220726f6c6500000000000000000000000000602082015250565b7f466c65656b416363657373436f6e74726f6c3a206d757374206861766520746f60008201527f6b656e20726f6c65000000000000000000000000000000000000000000000000602082015250565b7f22454e53223a2200000000000000000000000000000000000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61461681613d07565b811461462157600080fd5b50565b61462d81613d19565b811461463857600080fd5b50565b61464481613d25565b811461464f57600080fd5b50565b61465b81613d2f565b811461466657600080fd5b50565b61467281613d7b565b811461467d57600080fd5b5056fea264697066735822122035e4184e342cd37d9e3641cfc2af27ec44489dde9313dcb89431f93aff08385e64736f6c63430008070033",
|
|
"devdoc": {
|
|
"kind": "dev",
|
|
"methods": {
|
|
"approve(address,uint256)": {
|
|
"details": "See {IERC721-approve}."
|
|
},
|
|
"balanceOf(address)": {
|
|
"details": "See {IERC721-balanceOf}."
|
|
},
|
|
"getApproved(uint256)": {
|
|
"details": "See {IERC721-getApproved}."
|
|
},
|
|
"getRoleAdmin(bytes32)": {
|
|
"details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."
|
|
},
|
|
"grantRole(bytes32,address)": {
|
|
"details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."
|
|
},
|
|
"hasRole(bytes32,address)": {
|
|
"details": "Returns `true` if `account` has been granted `role`."
|
|
},
|
|
"isApprovedForAll(address,address)": {
|
|
"details": "See {IERC721-isApprovedForAll}."
|
|
},
|
|
"name()": {
|
|
"details": "See {IERC721Metadata-name}."
|
|
},
|
|
"ownerOf(uint256)": {
|
|
"details": "See {IERC721-ownerOf}."
|
|
},
|
|
"renounceRole(bytes32,address)": {
|
|
"details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event."
|
|
},
|
|
"revokeRole(bytes32,address)": {
|
|
"details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."
|
|
},
|
|
"safeTransferFrom(address,address,uint256)": {
|
|
"details": "See {IERC721-safeTransferFrom}."
|
|
},
|
|
"safeTransferFrom(address,address,uint256,bytes)": {
|
|
"details": "See {IERC721-safeTransferFrom}."
|
|
},
|
|
"setApprovalForAll(address,bool)": {
|
|
"details": "See {IERC721-setApprovalForAll}."
|
|
},
|
|
"symbol()": {
|
|
"details": "See {IERC721Metadata-symbol}."
|
|
},
|
|
"tokenURI(uint256)": {
|
|
"details": "See {IERC721Metadata-tokenURI}."
|
|
},
|
|
"transferFrom(address,address,uint256)": {
|
|
"details": "See {IERC721-transferFrom}."
|
|
}
|
|
},
|
|
"version": 1
|
|
},
|
|
"userdoc": {
|
|
"kind": "user",
|
|
"methods": {},
|
|
"version": 1
|
|
},
|
|
"storageLayout": {
|
|
"storage": [
|
|
{
|
|
"astId": 414,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "_name",
|
|
"offset": 0,
|
|
"slot": "0",
|
|
"type": "t_string_storage"
|
|
},
|
|
{
|
|
"astId": 416,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "_symbol",
|
|
"offset": 0,
|
|
"slot": "1",
|
|
"type": "t_string_storage"
|
|
},
|
|
{
|
|
"astId": 420,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "_owners",
|
|
"offset": 0,
|
|
"slot": "2",
|
|
"type": "t_mapping(t_uint256,t_address)"
|
|
},
|
|
{
|
|
"astId": 424,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "_balances",
|
|
"offset": 0,
|
|
"slot": "3",
|
|
"type": "t_mapping(t_address,t_uint256)"
|
|
},
|
|
{
|
|
"astId": 428,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "_tokenApprovals",
|
|
"offset": 0,
|
|
"slot": "4",
|
|
"type": "t_mapping(t_uint256,t_address)"
|
|
},
|
|
{
|
|
"astId": 434,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "_operatorApprovals",
|
|
"offset": 0,
|
|
"slot": "5",
|
|
"type": "t_mapping(t_address,t_mapping(t_address,t_bool))"
|
|
},
|
|
{
|
|
"astId": 24,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "_roles",
|
|
"offset": 0,
|
|
"slot": "6",
|
|
"type": "t_mapping(t_bytes32,t_struct(RoleData)19_storage)"
|
|
},
|
|
{
|
|
"astId": 3132,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "_tokenIds",
|
|
"offset": 0,
|
|
"slot": "7",
|
|
"type": "t_struct(Counter)1852_storage"
|
|
},
|
|
{
|
|
"astId": 3137,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "_sites",
|
|
"offset": 0,
|
|
"slot": "8",
|
|
"type": "t_mapping(t_uint256,t_struct(Site)3129_storage)"
|
|
}
|
|
],
|
|
"types": {
|
|
"t_address": {
|
|
"encoding": "inplace",
|
|
"label": "address",
|
|
"numberOfBytes": "20"
|
|
},
|
|
"t_bool": {
|
|
"encoding": "inplace",
|
|
"label": "bool",
|
|
"numberOfBytes": "1"
|
|
},
|
|
"t_bytes32": {
|
|
"encoding": "inplace",
|
|
"label": "bytes32",
|
|
"numberOfBytes": "32"
|
|
},
|
|
"t_mapping(t_address,t_bool)": {
|
|
"encoding": "mapping",
|
|
"key": "t_address",
|
|
"label": "mapping(address => bool)",
|
|
"numberOfBytes": "32",
|
|
"value": "t_bool"
|
|
},
|
|
"t_mapping(t_address,t_mapping(t_address,t_bool))": {
|
|
"encoding": "mapping",
|
|
"key": "t_address",
|
|
"label": "mapping(address => mapping(address => bool))",
|
|
"numberOfBytes": "32",
|
|
"value": "t_mapping(t_address,t_bool)"
|
|
},
|
|
"t_mapping(t_address,t_uint256)": {
|
|
"encoding": "mapping",
|
|
"key": "t_address",
|
|
"label": "mapping(address => uint256)",
|
|
"numberOfBytes": "32",
|
|
"value": "t_uint256"
|
|
},
|
|
"t_mapping(t_bytes32,t_struct(RoleData)19_storage)": {
|
|
"encoding": "mapping",
|
|
"key": "t_bytes32",
|
|
"label": "mapping(bytes32 => struct AccessControl.RoleData)",
|
|
"numberOfBytes": "32",
|
|
"value": "t_struct(RoleData)19_storage"
|
|
},
|
|
"t_mapping(t_uint256,t_address)": {
|
|
"encoding": "mapping",
|
|
"key": "t_uint256",
|
|
"label": "mapping(uint256 => address)",
|
|
"numberOfBytes": "32",
|
|
"value": "t_address"
|
|
},
|
|
"t_mapping(t_uint256,t_struct(Build)3117_storage)": {
|
|
"encoding": "mapping",
|
|
"key": "t_uint256",
|
|
"label": "mapping(uint256 => struct FleekERC721.Build)",
|
|
"numberOfBytes": "32",
|
|
"value": "t_struct(Build)3117_storage"
|
|
},
|
|
"t_mapping(t_uint256,t_struct(Site)3129_storage)": {
|
|
"encoding": "mapping",
|
|
"key": "t_uint256",
|
|
"label": "mapping(uint256 => struct FleekERC721.Site)",
|
|
"numberOfBytes": "32",
|
|
"value": "t_struct(Site)3129_storage"
|
|
},
|
|
"t_string_storage": {
|
|
"encoding": "bytes",
|
|
"label": "string",
|
|
"numberOfBytes": "32"
|
|
},
|
|
"t_struct(Build)3117_storage": {
|
|
"encoding": "inplace",
|
|
"label": "struct FleekERC721.Build",
|
|
"members": [
|
|
{
|
|
"astId": 3114,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "commit_hash",
|
|
"offset": 0,
|
|
"slot": "0",
|
|
"type": "t_string_storage"
|
|
},
|
|
{
|
|
"astId": 3116,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "git_repository",
|
|
"offset": 0,
|
|
"slot": "1",
|
|
"type": "t_string_storage"
|
|
}
|
|
],
|
|
"numberOfBytes": "64"
|
|
},
|
|
"t_struct(Counter)1852_storage": {
|
|
"encoding": "inplace",
|
|
"label": "struct Counters.Counter",
|
|
"members": [
|
|
{
|
|
"astId": 1851,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "_value",
|
|
"offset": 0,
|
|
"slot": "0",
|
|
"type": "t_uint256"
|
|
}
|
|
],
|
|
"numberOfBytes": "32"
|
|
},
|
|
"t_struct(RoleData)19_storage": {
|
|
"encoding": "inplace",
|
|
"label": "struct AccessControl.RoleData",
|
|
"members": [
|
|
{
|
|
"astId": 16,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "members",
|
|
"offset": 0,
|
|
"slot": "0",
|
|
"type": "t_mapping(t_address,t_bool)"
|
|
},
|
|
{
|
|
"astId": 18,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "adminRole",
|
|
"offset": 0,
|
|
"slot": "1",
|
|
"type": "t_bytes32"
|
|
}
|
|
],
|
|
"numberOfBytes": "64"
|
|
},
|
|
"t_struct(Site)3129_storage": {
|
|
"encoding": "inplace",
|
|
"label": "struct FleekERC721.Site",
|
|
"members": [
|
|
{
|
|
"astId": 3119,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "external_url",
|
|
"offset": 0,
|
|
"slot": "0",
|
|
"type": "t_bytes32"
|
|
},
|
|
{
|
|
"astId": 3121,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "ENS",
|
|
"offset": 0,
|
|
"slot": "1",
|
|
"type": "t_bytes32"
|
|
},
|
|
{
|
|
"astId": 3123,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "current_build",
|
|
"offset": 0,
|
|
"slot": "2",
|
|
"type": "t_uint256"
|
|
},
|
|
{
|
|
"astId": 3128,
|
|
"contract": "contracts/FleekERC721.sol:FleekERC721",
|
|
"label": "builds",
|
|
"offset": 0,
|
|
"slot": "3",
|
|
"type": "t_mapping(t_uint256,t_struct(Build)3117_storage)"
|
|
}
|
|
],
|
|
"numberOfBytes": "128"
|
|
},
|
|
"t_uint256": {
|
|
"encoding": "inplace",
|
|
"label": "uint256",
|
|
"numberOfBytes": "32"
|
|
}
|
|
}
|
|
}
|
|
} |