1. Web2 Vs. Web3
Web2 Stuffs
backend: node.js, express
Db
auth
Cloud sevivce
Web3 Stuffs
smart contracts: solididty, vyper, rust
blockchain: ethereum, solanan
2. How Blockchain Works?
Hash Functions with Blockchain
all the Block of chain
Understanding Arbitrum’s architecture
Sequencer
Crypto Wallets
- Metamask
- Backpack
What is transaction
- Transactions are cryptographically signed instructions from accounts
- ac. initiates a transaction
Smart contract lang
solidity
js
rust
haskell
cairo
vyper
About solidity
oop, high-level lang
What is NFT?
are unique digital assets that represents ownership of a specific item or piece of content on hte blockchain
same as blockchain
minting means initiating NFT
opensea is largest NFT market
FanCraze
Deploy our own NFT contract and mint an NFT!
ABI (Application Binary Interface)
[
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "ERC721IncorrectOwner",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "ERC721InsufficientApproval",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "approver",
"type": "address"
}
],
"name": "ERC721InvalidApprover",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
}
],
"name": "ERC721InvalidOperator",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "ERC721InvalidOwner",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "receiver",
"type": "address"
}
],
"name": "ERC721InvalidReceiver",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "ERC721InvalidSender",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "ERC721NonexistentToken",
"type": "error"
},
{
"inputs": [],
"name": "ReentrancyGuardReentrantCall",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "approved",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "ApprovalForAll",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "contentId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "creator",
"type": "address"
},
{
"indexed": false,
"internalType": "string",
"name": "contentURI",
"type": "string"
}
],
"name": "ContentCreated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "contentId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "tipper",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "ContentTipped",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "creator",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "subscriber",
"type": "address"
}
],
"name": "CreatorSubscribed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "approve",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "contentCount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "contents",
"outputs": [
{
"internalType": "address payable",
"name": "creator",
"type": "address"
},
{
"internalType": "string",
"name": "contentURI",
"type": "string"
},
{
"internalType": "uint256",
"name": "tipAmount",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_contentURI",
"type": "string"
}
],
"name": "createContent",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "creators",
"outputs": [
{
"internalType": "uint256",
"name": "subscriberCount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "subscriptionFee",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getApproved",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_creator",
"type": "address"
}
],
"name": "getSubscriberCount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"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": "_subscriber",
"type": "address"
},
{
"internalType": "address",
"name": "_creator",
"type": "address"
}
],
"name": "isSubscribed",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"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": "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": "_fee",
"type": "uint256"
}
],
"name": "setSubscriptionFee",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_creator",
"type": "address"
}
],
"name": "subscribe",
"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": "_contentId",
"type": "uint256"
}
],
"name": "tipContent",
"outputs": [],
"stateMutability": "payable",
"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": "_contentId",
"type": "uint256"
}
],
"name": "withdrawTips",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]
Byte Code
608060405234801561000f575f80fd5b506040518060400160405280600e81526020017f43726561746f72436f6e74656e740000000000000000000000000000000000008152506040518060400160405280600281526020017f4343000000000000000000000000000000000000000000000000000000000000815250815f908161008a91906102e4565b50806001908161009a91906102e4565b50505060016006819055506103b3565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061012557607f821691505b602082108103610138576101376100e1565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261019a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261015f565b6101a4868361015f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6101e86101e36101de846101bc565b6101c5565b6101bc565b9050919050565b5f819050919050565b610201836101ce565b61021561020d826101ef565b84845461016b565b825550505050565b5f90565b61022961021d565b6102348184846101f8565b505050565b5b818110156102575761024c5f82610221565b60018101905061023a565b5050565b601f82111561029c5761026d8161013e565b61027684610150565b81016020851015610285578190505b61029961029185610150565b830182610239565b50505b505050565b5f82821c905092915050565b5f6102bc5f19846008026102a1565b1980831691505092915050565b5f6102d483836102ad565b9150826002028217905092915050565b6102ed826100aa565b67ffffffffffffffff811115610306576103056100b4565b5b610310825461010e565b61031b82828561025b565b5f60209050601f83116001811461034c575f841561033a578287015190505b61034485826102c9565b8655506103ab565b601f19841661035a8661013e565b5f5b828110156103815784890151825560018201915060208501945060208101905061035c565b8683101561039e578489015161039a601f8916826102ad565b8355505b6001600288020188555050505b505050505050565b612f29806103c05f395ff3fe60806040526004361061013f575f3560e01c806370a08231116100b5578063c60bc2ca1161006e578063c60bc2ca1461045e578063c87b56dd1461049a578063cc459696146104d6578063d7af3e7e14610500578063e985e9c51461051c578063f6416ef6146105585761013f565b806370a082311461032d578063933166e11461036957806395d89b41146103a6578063a22cb465146103d0578063b5ecf912146103f8578063b88d4fde146104365761013f565b806323b872dd1161010757806323b872dd1461023557806341a7726a1461025d57806342842e0e14610279578063497cc841146102a15780636352211e146102c95780636ac84956146103055761013f565b806301ffc9a71461014357806306fdde031461017f578063081812fc146101a9578063095ea7b3146101e55780630d61b95f1461020d575b5f80fd5b34801561014e575f80fd5b5061016960048036038101906101649190612105565b610594565b604051610176919061214a565b60405180910390f35b34801561018a575f80fd5b50610193610675565b6040516101a091906121d3565b60405180910390f35b3480156101b4575f80fd5b506101cf60048036038101906101ca9190612226565b610704565b6040516101dc9190612290565b60405180910390f35b3480156101f0575f80fd5b5061020b600480360381019061020691906122d3565b61071f565b005b348015610218575f80fd5b50610233600480360381019061022e9190612226565b610735565b005b348015610240575f80fd5b5061025b60048036038101906102569190612311565b6108aa565b005b61027760048036038101906102729190612361565b6109a9565b005b348015610284575f80fd5b5061029f600480360381019061029a9190612311565b610bd2565b005b3480156102ac575f80fd5b506102c760048036038101906102c291906124b8565b610bf1565b005b3480156102d4575f80fd5b506102ef60048036038101906102ea9190612226565b610d13565b6040516102fc9190612290565b60405180910390f35b348015610310575f80fd5b5061032b60048036038101906103269190612226565b610d24565b005b348015610338575f80fd5b50610353600480360381019061034e9190612361565b610d6c565b604051610360919061250e565b60405180910390f35b348015610374575f80fd5b5061038f600480360381019061038a9190612361565b610e22565b60405161039d929190612527565b60405180910390f35b3480156103b1575f80fd5b506103ba610e42565b6040516103c791906121d3565b60405180910390f35b3480156103db575f80fd5b506103f660048036038101906103f19190612578565b610ed2565b005b348015610403575f80fd5b5061041e60048036038101906104199190612226565b610ee8565b60405161042d939291906125d6565b60405180910390f35b348015610441575f80fd5b5061045c600480360381019061045791906126b0565b610fb3565b005b348015610469575f80fd5b50610484600480360381019061047f9190612361565b610fd0565b604051610491919061250e565b60405180910390f35b3480156104a5575f80fd5b506104c060048036038101906104bb9190612226565b611018565b6040516104cd91906121d3565b60405180910390f35b3480156104e1575f80fd5b506104ea61107e565b6040516104f7919061250e565b60405180910390f35b61051a60048036038101906105159190612226565b611084565b005b348015610527575f80fd5b50610542600480360381019061053d9190612730565b6111f2565b60405161054f919061214a565b60405180910390f35b348015610563575f80fd5b5061057e60048036038101906105799190612730565b611280565b60405161058b919061214a565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061066e575061066d82611311565b5b9050919050565b60605f80546106839061279b565b80601f01602080910402602001604051908101604052809291908181526020018280546106af9061279b565b80156106fa5780601f106106d1576101008083540402835291602001916106fa565b820191905f5260205f20905b8154815290600101906020018083116106dd57829003601f168201915b5050505050905090565b5f61070e8261137a565b5061071882611400565b9050919050565b610731828261072c611439565b611440565b5050565b61073d611452565b600954811115610782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077990612815565b60405180910390fd5b5f60075f8381526020019081526020015f209050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081d906128a3565b60405180910390fd5b5f816002015490505f8260020181905550815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f1935050505015801561089c573d5f803e3d5ffd5b5050506108a7611498565b50565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361091a575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016109119190612290565b60405180910390fd5b5f61092d8383610928611439565b6114a2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109a3578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161099a939291906128c1565b60405180910390fd5b50505050565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806002015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615610a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6c90612940565b60405180910390fd5b5f8160010154905080341015610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab7906129a8565b60405180910390fd5b6001826002015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550815f015f815480929190610b2a906129f3565b91905055508273ffffffffffffffffffffffffffffffffffffffff166108fc3490811502906040515f60405180830381858888f19350505050158015610b72573d5f803e3d5ffd5b503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ffcb7b1207441c5c8eb9b9806ca2cee36487eac3fac7709961bab286d28295bfb60405160405180910390a3505050565b610bec83838360405180602001604052805f815250610fb3565b505050565b60095f815480929190610c03906129f3565b919050555060405180606001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020015f81525060075f60095481526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001019081610ca59190612bd7565b5060408201518160020155905050610cbf336009546116ad565b3373ffffffffffffffffffffffffffffffffffffffff166009547fbacf9f620fd10df5b39931f2a3012e753be545aba5d7642b9bdb59b527709f1d83604051610d0891906121d3565b60405180910390a350565b5f610d1d8261137a565b9050919050565b8060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001018190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ddd575f6040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401610dd49190612290565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6008602052805f5260405f205f91509050805f0154908060010154905082565b606060018054610e519061279b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7d9061279b565b8015610ec85780601f10610e9f57610100808354040283529160200191610ec8565b820191905f5260205f20905b815481529060010190602001808311610eab57829003601f168201915b5050505050905090565b610ee4610edd611439565b83836116ca565b5050565b6007602052805f5260405f205f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001018054610f2c9061279b565b80601f0160208091040260200160405190810160405280929190818152602001828054610f589061279b565b8015610fa35780601f10610f7a57610100808354040283529160200191610fa3565b820191905f5260205f20905b815481529060010190602001808311610f8657829003601f168201915b5050505050908060020154905083565b610fbe8484846108aa565b610fca84848484611833565b50505050565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01549050919050565b60606110238261137a565b505f61102d6119e5565b90505f81511161104b5760405180602001604052805f815250611076565b80611055846119fb565b604051602001611066929190612ce0565b6040516020818303038152906040525b915050919050565b60095481565b6009548111156110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c090612815565b60405180910390fd5b5f60075f8381526020019081526020015f2090505f341161111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690612d73565b60405180910390fd5b34816002015f8282546111329190612d91565b92505081905550805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3490811502906040515f60405180830381858888f1935050505015801561119e573d5f803e3d5ffd5b503373ffffffffffffffffffffffffffffffffffffffff16827f1d57d86da20f2c8bbce7f4febff817af1f887fd8bd96e07a8760e4248b5d233f346040516111e6919061250e565b60405180910390a35050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8061138583611ac5565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113f757826040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016113ee919061250e565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b61144d8383836001611afe565b505050565b60026006540361148e576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b6001600681905550565b5f806114ad84611ac5565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146114ee576114ed818486611cbd565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115795761152d5f855f80611afe565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146115f857600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6116c6828260405180602001604052805f815250611d80565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361173a57816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016117319190612290565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611826919061214a565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b11156119df578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02611876611439565b8685856040518563ffffffff1660e01b81526004016118989493929190612e16565b6020604051808303815f875af19250505080156118d357506040513d601f19601f820116820180604052508101906118d09190612e74565b60015b611954573d805f8114611901576040519150601f19603f3d011682016040523d82523d5f602084013e611906565b606091505b505f81510361194c57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016119439190612290565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146119dd57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016119d49190612290565b60405180910390fd5b505b50505050565b606060405180602001604052805f815250905090565b60605f6001611a0984611d9b565b0190505f8167ffffffffffffffff811115611a2757611a26612394565b5b6040519080825280601f01601f191660200182016040528015611a595781602001600182028036833780820191505090505b5090505f82602001820190505b600115611aba578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611aaf57611aae612e9f565b5b0494505f8503611a66575b819350505050919050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8080611b3657505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611c68575f611b458461137a565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611baf57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611bc25750611bc081846111f2565b155b15611c0457826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401611bfb9190612290565b60405180910390fd5b8115611c6657838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b611cc8838383611eec565b611d7b575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d3c57806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611d33919061250e565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401611d72929190612ecc565b60405180910390fd5b505050565b611d8a8383611fac565b611d965f848484611833565b505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611df7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611ded57611dec612e9f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611e34576d04ee2d6d415b85acef81000000008381611e2a57611e29612e9f565b5b0492506020810190505b662386f26fc100008310611e6357662386f26fc100008381611e5957611e58612e9f565b5b0492506010810190505b6305f5e1008310611e8c576305f5e1008381611e8257611e81612e9f565b5b0492506008810190505b6127108310611eb1576127108381611ea757611ea6612e9f565b5b0492506004810190505b60648310611ed45760648381611eca57611ec9612e9f565b5b0492506002810190505b600a8310611ee3576001810190505b80915050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611fa357508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f645750611f6384846111f2565b5b80611fa257508273ffffffffffffffffffffffffffffffffffffffff16611f8a83611400565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361201c575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016120139190612290565b60405180910390fd5b5f61202883835f6114a2565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461209a575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016120919190612290565b60405180910390fd5b505050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6120e4816120b0565b81146120ee575f80fd5b50565b5f813590506120ff816120db565b92915050565b5f6020828403121561211a576121196120a8565b5b5f612127848285016120f1565b91505092915050565b5f8115159050919050565b61214481612130565b82525050565b5f60208201905061215d5f83018461213b565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6121a582612163565b6121af818561216d565b93506121bf81856020860161217d565b6121c88161218b565b840191505092915050565b5f6020820190508181035f8301526121eb818461219b565b905092915050565b5f819050919050565b612205816121f3565b811461220f575f80fd5b50565b5f81359050612220816121fc565b92915050565b5f6020828403121561223b5761223a6120a8565b5b5f61224884828501612212565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61227a82612251565b9050919050565b61228a81612270565b82525050565b5f6020820190506122a35f830184612281565b92915050565b6122b281612270565b81146122bc575f80fd5b50565b5f813590506122cd816122a9565b92915050565b5f80604083850312156122e9576122e86120a8565b5b5f6122f6858286016122bf565b925050602061230785828601612212565b9150509250929050565b5f805f60608486031215612328576123276120a8565b5b5f612335868287016122bf565b9350506020612346868287016122bf565b925050604061235786828701612212565b9150509250925092565b5f60208284031215612376576123756120a8565b5b5f612383848285016122bf565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6123ca8261218b565b810181811067ffffffffffffffff821117156123e9576123e8612394565b5b80604052505050565b5f6123fb61209f565b905061240782826123c1565b919050565b5f67ffffffffffffffff82111561242657612425612394565b5b61242f8261218b565b9050602081019050919050565b828183375f83830152505050565b5f61245c6124578461240c565b6123f2565b90508281526020810184848401111561247857612477612390565b5b61248384828561243c565b509392505050565b5f82601f83011261249f5761249e61238c565b5b81356124af84826020860161244a565b91505092915050565b5f602082840312156124cd576124cc6120a8565b5b5f82013567ffffffffffffffff8111156124ea576124e96120ac565b5b6124f68482850161248b565b91505092915050565b612508816121f3565b82525050565b5f6020820190506125215f8301846124ff565b92915050565b5f60408201905061253a5f8301856124ff565b61254760208301846124ff565b9392505050565b61255781612130565b8114612561575f80fd5b50565b5f813590506125728161254e565b92915050565b5f806040838503121561258e5761258d6120a8565b5b5f61259b858286016122bf565b92505060206125ac85828601612564565b9150509250929050565b5f6125c082612251565b9050919050565b6125d0816125b6565b82525050565b5f6060820190506125e95f8301866125c7565b81810360208301526125fb818561219b565b905061260a60408301846124ff565b949350505050565b5f67ffffffffffffffff82111561262c5761262b612394565b5b6126358261218b565b9050602081019050919050565b5f61265461264f84612612565b6123f2565b9050828152602081018484840111156126705761266f612390565b5b61267b84828561243c565b509392505050565b5f82601f8301126126975761269661238c565b5b81356126a7848260208601612642565b91505092915050565b5f805f80608085870312156126c8576126c76120a8565b5b5f6126d5878288016122bf565b94505060206126e6878288016122bf565b93505060406126f787828801612212565b925050606085013567ffffffffffffffff811115612718576127176120ac565b5b61272487828801612683565b91505092959194509250565b5f8060408385031215612746576127456120a8565b5b5f612753858286016122bf565b9250506020612764858286016122bf565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806127b257607f821691505b6020821081036127c5576127c461276e565b5b50919050565b7f436f6e74656e7420646f6573206e6f74206578697374000000000000000000005f82015250565b5f6127ff60168361216d565b915061280a826127cb565b602082019050919050565b5f6020820190508181035f83015261282c816127f3565b9050919050565b7f4f6e6c79207468652063726561746f722063616e2077697468647261772074695f8201527f7073000000000000000000000000000000000000000000000000000000000000602082015250565b5f61288d60228361216d565b915061289882612833565b604082019050919050565b5f6020820190508181035f8301526128ba81612881565b9050919050565b5f6060820190506128d45f830186612281565b6128e160208301856124ff565b6128ee6040830184612281565b949350505050565b7f416c7265616479207375627363726962656400000000000000000000000000005f82015250565b5f61292a60128361216d565b9150612935826128f6565b602082019050919050565b5f6020820190508181035f8301526129578161291e565b9050919050565b7f496e73756666696369656e7420737562736372697074696f6e206665650000005f82015250565b5f612992601d8361216d565b915061299d8261295e565b602082019050919050565b5f6020820190508181035f8301526129bf81612986565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6129fd826121f3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a2f57612a2e6129c6565b5b600182019050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302612a967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612a5b565b612aa08683612a5b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f612adb612ad6612ad1846121f3565b612ab8565b6121f3565b9050919050565b5f819050919050565b612af483612ac1565b612b08612b0082612ae2565b848454612a67565b825550505050565b5f90565b612b1c612b10565b612b27818484612aeb565b505050565b5b81811015612b4a57612b3f5f82612b14565b600181019050612b2d565b5050565b601f821115612b8f57612b6081612a3a565b612b6984612a4c565b81016020851015612b78578190505b612b8c612b8485612a4c565b830182612b2c565b50505b505050565b5f82821c905092915050565b5f612baf5f1984600802612b94565b1980831691505092915050565b5f612bc78383612ba0565b9150826002028217905092915050565b612be082612163565b67ffffffffffffffff811115612bf957612bf8612394565b5b612c03825461279b565b612c0e828285612b4e565b5f60209050601f831160018114612c3f575f8415612c2d578287015190505b612c378582612bbc565b865550612c9e565b601f198416612c4d86612a3a565b5f5b82811015612c7457848901518255600182019150602085019450602081019050612c4f565b86831015612c915784890151612c8d601f891682612ba0565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f612cba82612163565b612cc48185612ca6565b9350612cd481856020860161217d565b80840191505092915050565b5f612ceb8285612cb0565b9150612cf78284612cb0565b91508190509392505050565b7f54697020616d6f756e74206d7573742062652067726561746572207468616e205f8201527f3000000000000000000000000000000000000000000000000000000000000000602082015250565b5f612d5d60218361216d565b9150612d6882612d03565b604082019050919050565b5f6020820190508181035f830152612d8a81612d51565b9050919050565b5f612d9b826121f3565b9150612da6836121f3565b9250828201905080821115612dbe57612dbd6129c6565b5b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f612de882612dc4565b612df28185612dce565b9350612e0281856020860161217d565b612e0b8161218b565b840191505092915050565b5f608082019050612e295f830187612281565b612e366020830186612281565b612e4360408301856124ff565b8181036060830152612e558184612dde565b905095945050505050565b5f81519050612e6e816120db565b92915050565b5f60208284031215612e8957612e886120a8565b5b5f612e9684828501612e60565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f604082019050612edf5f830185612281565b612eec60208301846124ff565b939250505056fea264697066735822122026c061d457826eee3a512f56b341457577e511a2db582b02b9397f85dc0f63c864736f6c634300081a0033