Overview
MATIC Balance
0 MATIC
MATIC Value
$0.00More Info
Private Name Tags
ContractCreator:
Sponsored
Latest 20 from a total of 20 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Claim | 33408385 | 553 days ago | IN | 0 MATIC | 0.00770034 | ||||
Claim | 33388729 | 554 days ago | IN | 0 MATIC | 0.00770041 | ||||
Claim | 33386492 | 554 days ago | IN | 0 MATIC | 0.009595 | ||||
Claim | 33385026 | 554 days ago | IN | 0 MATIC | 0.00821334 | ||||
Claim | 33379890 | 554 days ago | IN | 0 MATIC | 0.00821298 | ||||
Claim | 33379732 | 554 days ago | IN | 0 MATIC | 0.00770034 | ||||
Claim | 33379709 | 554 days ago | IN | 0 MATIC | 0.00769998 | ||||
Set Base Uri | 33379597 | 554 days ago | IN | 0 MATIC | 0.00138573 | ||||
Claim | 33379526 | 554 days ago | IN | 0 MATIC | 0.00770034 | ||||
Claim | 33379332 | 554 days ago | IN | 0 MATIC | 0.00770034 | ||||
Set Base Uri | 33379328 | 554 days ago | IN | 0 MATIC | 0.00155193 | ||||
Claim | 33377826 | 554 days ago | IN | 0 MATIC | 0.00770034 | ||||
Claim | 33377306 | 554 days ago | IN | 0 MATIC | 0.00822372 | ||||
Claim | 33376673 | 554 days ago | IN | 0 MATIC | 0.00770034 | ||||
Admin Mint | 33376664 | 554 days ago | IN | 0 MATIC | 0.03289938 | ||||
Add Predicates | 33376653 | 554 days ago | IN | 0 MATIC | 0.01108554 | ||||
Add Classs | 33376653 | 554 days ago | IN | 0 MATIC | 0.00105813 | ||||
Add Classs | 33376643 | 554 days ago | IN | 0 MATIC | 0.00320601 | ||||
Initialize | 33376634 | 554 days ago | IN | 0 MATIC | 0.0093567 | ||||
0x60806040 | 33376570 | 554 days ago | IN | Create: Semantic | 0 MATIC | 0.16143981 |
Loading...
Loading
Contract Name:
Semantic
Compiler Version
v0.8.12+commit.f00d7308
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "../interfaces/ISemantic.sol"; import "../utils/Strings.sol"; import "../access/AccessControl.sol"; import "./Semantic721.sol"; contract Semantic is ISemantic, AccessControl, Semantic721 { using Strings for uint256; using Strings for address; //class mapping(uint256 => Class) public classIdForData; mapping(string => uint256) public classDataForId; uint256 public classSize; //subject mapping(uint256 => Subject) public subjectIdForData; mapping(uint256 => mapping(string => uint256)) public subjectDataForId; uint256 public subjectSize; //predicate mapping(uint256 => Predicate) public predicateIdForData; mapping(string => uint256) public predicateDataForId; uint256 public predicateSize; //token mapping(uint256 => mapping(uint256 => mapping(string => uint256))) public tokenDataForId; mapping(uint256 => Triple) public tokenIdForDataMap; mapping(uint256 => Turtle) public tokenIdForTurtleData; uint256 public totalSupply; // createInfo uint256 public createdAt; uint256 public createdAtBlockNumber; address public deployer; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; mapping(string => string) public prefixMap; string public constant SUFFIX = " . "; string public constant NO_PERMISSION = "0x0000000000000000000000000000000000000000"; string public constant ALL_PERMISSION = "0x0000000000000000000000000000000000000001"; uint256 public constant SOUL_CLASS_ID = 1; uint256 public constant OWNER_PREDICATE_ID = 1; address public singerPub; constructor() { deployer = msg.sender; createdAt = block.timestamp; createdAtBlockNumber = block.number; } function initialize( address owner, string memory _uri, string memory soulClassValue, string memory ownerPredicateValue ) public { require(deployer == msg.sender, "not deployer"); _grantRole(DEFAULT_ADMIN_ROLE, owner); _setBaseUri(_uri); _setClass(Class(soulClassValue, FieldType.ADDRESS)); _setPredicate(Predicate(ownerPredicateValue, FieldType.ADDRESS)); } function setBaseUri(string memory _uri) public onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)) { _setBaseUri(_uri); } /** * @dev 添加class * @param classes class */ function addClasss(Class[] memory classes) external onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)) { for (uint256 i = 0; i < classes.length; i++) { Class memory class = classes[i]; require( keccak256(abi.encode(class.value)) != keccak256(abi.encode("")), "class can not empty" ); require( classSize == 0 || classDataForId[class.value] == 0, "class already exist" ); _setClass(class); } } /** * @dev 添加谓词 * @param predicateInfos 谓词 */ function addPredicates(Predicate[] memory predicateInfos) external onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)) { for (uint256 i = 0; i < predicateInfos.length; i++) { Predicate memory predicateInfo = predicateInfos[i]; require( keccak256(abi.encode(predicateInfo.value)) != keccak256(abi.encode("")), "predicate can not empty" ); require( keccak256(abi.encode(predicateInfo.predicateType)) != keccak256(abi.encode("")), "predicateType can not empty" ); _setPredicate(predicateInfo); } } /** * @dev mint SBT , only admin can call * @param operateDatas the datas for operate */ function adminMint(OperateData[] memory operateDatas) external onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)) { for (uint256 i = 0; i < operateDatas.length; i++) { OperateData memory operateData = operateDatas[i]; uint256 subjectId = generateSubjectId( operateData.subject.classId, operateData.subject.value ); for ( uint256 j = 0; j < operateData.predicateAndObjects.length; j++ ) { PredicateAndObject memory predicateAndObject = operateData .predicateAndObjects[j]; require( predicateAndObject.predicateId <= predicateSize, "predicate undefined" ); require( tokenDataForId[subjectId][predicateAndObject.predicateId][predicateAndObject.object] == 0, "already exist" ); } _mintTurtle( msg.sender, subjectId, operateData.subject.value, operateData.subject.classId, operateData.predicateAndObjects ); } } /** * @dev mint SBT * @param operateDatas the datas for operate */ function mint(OperateData[] memory operateDatas) external { for (uint256 i = 0; i < operateDatas.length; i++) { OperateData memory operateData = operateDatas[i]; _checkPermission( operateData.subject.classId, operateData.subject.value ); uint256 subjectId = generateSubjectId( operateData.subject.classId, operateData.subject.value ); for ( uint256 j = 0; j < operateData.predicateAndObjects.length; j++ ) { PredicateAndObject memory predicateAndObject = operateData .predicateAndObjects[j]; require( predicateAndObject.predicateId <= predicateSize, "predicate undefined" ); require( tokenDataForId[subjectId][predicateAndObject.predicateId][predicateAndObject.object] == 0, "already exist" ); } _mintTurtle( msg.sender, subjectId, operateData.subject.value, operateData.subject.classId, operateData.predicateAndObjects ); } } /** * @dev mint SBT , subject is caller address * @param operateDatas the datas for operate */ function soulMint(SoulOperateData[] memory operateDatas) external { uint256 subjectId = generateSubjectId( SOUL_CLASS_ID, Strings.toHexString(msg.sender) ); for (uint256 i = 0; i < operateDatas.length; i++) { SoulOperateData memory operateData = operateDatas[i]; for ( uint256 j = 0; j < operateData.predicateAndObjects.length; j++ ) { PredicateAndObject memory predicateAndObject = operateData .predicateAndObjects[j]; require( predicateAndObject.predicateId <= predicateSize, "predicate undefined" ); require( tokenDataForId[subjectId][predicateAndObject.predicateId][predicateAndObject.object] == 0, "already exist" ); } _mintTurtle( msg.sender, subjectId, Strings.toHexString(msg.sender), SOUL_CLASS_ID, operateData.predicateAndObjects ); } } /** * @dev 批量claim * @param operateDatas 操作数据 */ function claim(ClaimOperateData[] memory operateDatas) external { for (uint256 i = 0; i < operateDatas.length; i++) { ClaimOperateData memory operateData = operateDatas[i]; require( operateData.expireTime > block.timestamp, "signData has expired" ); uint256 subjectId = operateData.subjectId; string memory signOriginalData = string.concat(operateData.expireTime.toString(),subjectId.toString()); for ( uint256 j = 0; j < operateData.predicateAndObjects.length; j++ ) { PredicateAndObject memory predicateAndObject = operateData .predicateAndObjects[j]; require( predicateAndObject.predicateId <= predicateSize, "predicate undefined" ); require( tokenDataForId[subjectId][predicateAndObject.predicateId][predicateAndObject.object] == 0, "already exist" ); signOriginalData = string.concat(signOriginalData,predicateAndObject.predicateId.toString(),predicateAndObject.object); } address singer = _verifyMessage( keccak256(abi.encodePacked(signOriginalData)), operateData.v, operateData.r, operateData.s ); require(singer == deployer, "signData not from singer"); _mintTurtle( msg.sender, subjectId, subjectIdForData[operateData.subjectId].value, subjectIdForData[operateData.subjectId].classId, operateData.predicateAndObjects ); } } /** * @dev 批量claim * @param operateDatas 操作数据 */ function testSign(ClaimOperateData[] memory operateDatas) external view returns(string memory signOriginalData,address singer) { for (uint256 i = 0; i < operateDatas.length; i++) { ClaimOperateData memory operateData = operateDatas[i]; require( operateData.expireTime > block.timestamp, "signData has expired" ); uint256 subjectId = operateData.subjectId; signOriginalData = string.concat(operateData.expireTime.toString(),subjectId.toString()); for ( uint256 j = 0; j < operateData.predicateAndObjects.length; j++ ) { PredicateAndObject memory predicateAndObject = operateData .predicateAndObjects[j]; require( predicateAndObject.predicateId <= predicateSize, "predicate undefined" ); require( tokenDataForId[subjectId][predicateAndObject.predicateId][predicateAndObject.object] == 0, "already exist" ); signOriginalData = string.concat(signOriginalData,predicateAndObject.predicateId.toString(),predicateAndObject.object); } singer = _verifyMessage( keccak256(abi.encodePacked(signOriginalData)), operateData.v, operateData.r, operateData.s ); } } /** * @dev 批量销毁 SBT * @param tokenIds 操作数据 */ function adminBurn(uint256[] memory tokenIds) external onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)){ for (uint256 i = 0; i < tokenIds.length; i++) { address owner = _ownerOf(tokenIds[i]); _burn(owner, tokenIds[i]); } } /** * @dev 批量销毁 SBT * @param tokenIds 操作数据 */ function burn(uint256[] memory tokenIds) external { for (uint256 i = 0; i < tokenIds.length; i++) { address owner = _ownerOf(tokenIds[i]); require(owner == msg.sender,"not owner"); _burn(owner, tokenIds[i]); } } function _setClass(Class memory class) private { classSize++; classIdForData[classSize] = class; classDataForId[class.value] = classSize; emit AddClass(msg.sender, classSize, class.value); } function _setPredicate(Predicate memory predicateInfo) private { predicateSize++; predicateIdForData[predicateSize] = predicateInfo; predicateDataForId[predicateInfo.value] = predicateSize; emit AddPredicates( msg.sender, predicateSize, predicateInfo.value, predicateInfo.predicateType ); } function _mint( address owner, string memory subjectValue, uint256 classId, Triple memory triple ) private { totalSupply++; uint256 tokenId = totalSupply; tokenDataForId[triple.subjectId][triple.predicateId][ triple.object ] = tokenId; tokenIdForDataMap[tokenId] = triple; _setOwner(tokenId, owner); _addBalance(owner); string memory rdf = generateRdf( classId, subjectValue, triple.predicateId, triple.object ); //rdf传一个turtle emit Mint(msg.sender, tokenId, rdf); emit Transfer(address(0), owner, tokenId); } function _mintTurtle( address owner, uint256 subjectId, string memory subjectValue, uint256 classId, PredicateAndObject[] memory predicateAndObjects ) private { totalSupply++; uint256 tokenId = totalSupply; string memory rdf = ""; Turtle storage p = tokenIdForTurtleData[tokenId]; p.subjectId = subjectId; for (uint256 i = 0; i < predicateAndObjects.length; i++) { PredicateAndObject memory predicateAndObject = predicateAndObjects[ i ]; p.predicateAndObjects.push(predicateAndObject); tokenDataForId[subjectId][predicateAndObject.predicateId][predicateAndObject.object] = tokenId; string memory singleRdf = generateRdf( classId, subjectValue, predicateAndObject.predicateId, predicateAndObject.object ); rdf = string.concat(rdf, singleRdf); } _setOwner(tokenId, owner); _addBalance(owner); emit Mint(msg.sender, tokenId, rdf); emit Transfer(address(0), owner, tokenId); } function _burn( address owner, uint256 tokenId ) private { _reduceBalance(owner); _removeOwner(tokenId); Turtle memory turtle = tokenIdForTurtleData[tokenId]; Subject memory subject = subjectIdForData[turtle.subjectId]; string memory rdf = ""; for (uint256 i = 0; i < turtle.predicateAndObjects.length; i++) { PredicateAndObject memory predicateAndObject = turtle.predicateAndObjects[i]; string memory singleRdf = generateRdf( subject.classId, subject.value, predicateAndObject.predicateId, predicateAndObject.object ); rdf = string.concat(rdf, singleRdf); } emit Burn(msg.sender, owner, tokenId, rdf); emit Transfer(address(0), owner, tokenId); } function generateSubjectId(uint256 classId, string memory subjectValue) public returns (uint256) { uint256 subjectId = subjectDataForId[classId][subjectValue]; if (subjectId == 0) { subjectSize++; subjectDataForId[classId][subjectValue] = subjectSize; subjectIdForData[subjectSize] = Subject(subjectValue, classId); subjectId = subjectSize; _setSubjectOwner(subjectId); } return subjectId; } function generateRdf( uint256 classId, string memory subjectValue, uint256 predicateId, string memory object ) public view returns (string memory) { string memory subject = string.concat( classIdForData[classId].value, subjectValue ); string memory predicate = predicateIdForData[predicateId].value; if (predicateIdForData[predicateId].predicateType == FieldType.STRING) { object = string.concat('"', object, '"'); } string memory rdf = string.concat( subject, " ", predicate, " ", object, SUFFIX ); return rdf; } function _checkPermission(uint256 classId, string memory subjectValue) internal virtual { uint256 subjectId = subjectDataForId[classId][subjectValue]; if (subjectId > 0) { require( _isSubjectOwner(subjectId) || tokenDataForId[subjectId][OWNER_PREDICATE_ID][ ALL_PERMISSION ] > 0, "not have permission" ); } } function _setSubjectOwner(uint256 subjectId) internal virtual { Triple memory triple = Triple( subjectId, OWNER_PREDICATE_ID, Strings.toHexString(msg.sender) ); _mint(msg.sender, Strings.toHexString(msg.sender), 1, triple); } function _isSubjectOwner(uint256 subjectId) internal virtual returns (bool) { return tokenDataForId[subjectId][OWNER_PREDICATE_ID][ Strings.toHexString(msg.sender) ] > 0; } function _verifyMessage( bytes32 _hashedMessage, uint8 _v, bytes32 _r, bytes32 _s ) internal pure returns (address) { bytes memory prefix = "\x19Ethereum Signed Message:\n32"; bytes32 prefixedHashMessage = keccak256( abi.encodePacked(prefix, _hashedMessage) ); address signer = ecrecover(prefixedHashMessage, _v, _r, _s); return signer; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Required interface of an ISemantic compliant contract. */ interface ISemantic { enum FieldType { ADDRESS, STRING, NUMBER } struct Class { string value; FieldType classType; } struct Subject { string value; uint256 classId; } struct Predicate { string value; FieldType predicateType; } struct Triple { uint256 subjectId; uint256 predicateId; string object; } struct Turtle { uint256 subjectId; PredicateAndObject[] predicateAndObjects; } struct PredicateAndObject{ uint256 predicateId; string object; } struct OperateData { Subject subject; PredicateAndObject[] predicateAndObjects; } struct SoulOperateData { PredicateAndObject[] predicateAndObjects; } struct ClaimOperateData { uint256 subjectId; PredicateAndObject[] predicateAndObjects; uint256 expireTime; uint8 v; bytes32 r; bytes32 s; } /** * @dev 添加Class触发事件 * @param operator 本次操作者,e.g: 0x8d27258136A7AE115461e22F023158dAF3544FD0 * @param classId 谓词id,e.g: 1 * @param classValue 谓词,e.g: wd:Medal */ event AddClass( address indexed operator, uint256 indexed classId, string classValue ); /** * @dev 添加谓词触发事件 * @param operator 本次操作者,e.g: 0x8d27258136A7AE115461e22F023158dAF3544FD0 * @param predicateId 谓词id,e.g: 0 * @param predicate 谓词,e.g: following * @param predicateType 谓词的类型(STRING、ADDRESS、INT),e.g: string */ event AddPredicates( address indexed operator, uint256 indexed predicateId, string predicate, FieldType predicateType ); /** * @dev mint sbt 触发事件 * @param operator 本次操作者,e.g: 0x854C2B6Cf940959b71fAC98f69598D4002b7525F * @param tokenId schemaId,e.g: 100 * @param rdfData rdf使用的数据 类型一 ":0x854C2B6Cf940959b71fAC98f69598D4002b7525F p:following :0x693925dC866541C1B66dBdf1EA182107A274c8C7" 类型二 ":0x854C2B6Cf940959b71fAC98f69598D4002b7525F p:age 20" 类型三 ":0x854C2B6Cf940959b71fAC98f69598D4002b7525F p:name \"relation\" ." */ event Mint( address indexed operator, uint256 indexed tokenId, string rdfData //:0x854C2B6Cf940959b71fAC98f69598D4002b7525F p:following :0x693925dC866541C1B66dBdf1EA182107A274c8C7 ); /** * @dev 删除rdf触发事件 * @param operator 本次操作者,e.g: 0x8d27258136A7AE115461e22F023158dAF3544FD0 * @param owner 所属者,e.g: 0x854C2B6Cf940959b71fAC98f69598D4002b7525F * @param tokenId tokenId,e.g: 100 * @param rdfData rdf的原始数据, * e.g: :0x854C2B6Cf940959b71fAC98f69598D4002b7525F p:following :0x693925dC866541C1B66dBdf1EA182107A274c8C7 */ event Burn( address indexed operator, address indexed owner, uint256 indexed tokenId, string rdfData ); /** * @dev 添加class * @param classes class */ function addClasss(Class[] memory classes) external; /** * @dev 添加谓词 * @param predicateInfos 谓词 */ function addPredicates(Predicate[] memory predicateInfos) external; /** * @dev 用户批量mint SBT * @param operateDatas 操作的数据 */ function mint(OperateData[] memory operateDatas) external; /** * @dev 用户批量销毁 SBT * @param tokenIds 操作的数据 */ function burn(uint256[] memory tokenIds) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "../interfaces/ISemantic721.sol"; import "../interfaces/ISemanticMetadata.sol"; import "../utils/Strings.sol"; import "../utils/Address.sol"; import "../utils/Context.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract Semantic721 is Context, ISemantic721, ISemanticMetadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; string private _baseUri; /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev 查询语义metadata的uri * @return semanticMetaDataUri */ function semanticMetaDataUri() external view returns (string memory) { return string.concat(_baseURI(), "sematic/metadata"); } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return _baseUri; } function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } function _setBaseUri(string memory _uri) internal virtual{ _baseUri = _uri; } function _setOwner(uint256 tokenId,address owner) internal virtual{ _owners[tokenId] = owner; } function _removeOwner(uint256 tokenId) internal virtual{ delete _owners[tokenId]; } function _addBalance(address owner)internal virtual { _balances[owner] = _balances[owner] + 1; } function _reduceBalance(address owner)internal virtual { _balances[owner] = _balances[owner] - 1; } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = 1; // compute log10(value), and add it to length uint256 valueCopy = value; if (valueCopy >= 10**64) { valueCopy /= 10**64; length += 64; } if (valueCopy >= 10**32) { valueCopy /= 10**32; length += 32; } if (valueCopy >= 10**16) { valueCopy /= 10**16; length += 16; } if (valueCopy >= 10**8) { valueCopy /= 10**8; length += 8; } if (valueCopy >= 10**4) { valueCopy /= 10**4; length += 4; } if (valueCopy >= 10**2) { valueCopy /= 10**2; length += 2; } if (valueCopy >= 10**1) { length += 1; } // now, length is log10(value) + 1 string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = 1; // compute log256(value), and add it to length uint256 valueCopy = value; if (valueCopy >= 1 << 128) { valueCopy >>= 128; length += 16; } if (valueCopy >= 1 << 64) { valueCopy >>= 64; length += 8; } if (valueCopy >= 1 << 32) { valueCopy >>= 32; length += 4; } if (valueCopy >= 1 << 16) { valueCopy >>= 16; length += 2; } if (valueCopy >= 1 << 8) { valueCopy >>= 8; length += 1; } // now, length is log256(value) + 1 return toHexString(value, length); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } // /** // * @dev See {IERC165-supportsInterface}. // */ // function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); // } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev 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. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev 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. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev 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. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; // import "../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface ISemantic721 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; interface ISemanticMetadata { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); /** * @dev 查询语义medatada 的uri * @return semanticMetaDataUri metadata的uri,该uri将展示一个json,内容为当前语义的描述、shacl文本、schema、谓词描述等信息 */ function semanticMetaDataUri() external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev 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. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev 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 granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"uint256","name":"classId","type":"uint256"},{"indexed":false,"internalType":"string","name":"classValue","type":"string"}],"name":"AddClass","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"uint256","name":"predicateId","type":"uint256"},{"indexed":false,"internalType":"string","name":"predicate","type":"string"},{"indexed":false,"internalType":"enum ISemantic.FieldType","name":"predicateType","type":"uint8"}],"name":"AddPredicates","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"rdfData","type":"string"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"rdfData","type":"string"}],"name":"Mint","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":"ALL_PERMISSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NO_PERMISSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OWNER_PREDICATE_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SOUL_CLASS_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUFFIX","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"value","type":"string"},{"internalType":"enum ISemantic.FieldType","name":"classType","type":"uint8"}],"internalType":"struct ISemantic.Class[]","name":"classes","type":"tuple[]"}],"name":"addClasss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"value","type":"string"},{"internalType":"enum ISemantic.FieldType","name":"predicateType","type":"uint8"}],"internalType":"struct ISemantic.Predicate[]","name":"predicateInfos","type":"tuple[]"}],"name":"addPredicates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"adminBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"string","name":"value","type":"string"},{"internalType":"uint256","name":"classId","type":"uint256"}],"internalType":"struct ISemantic.Subject","name":"subject","type":"tuple"},{"components":[{"internalType":"uint256","name":"predicateId","type":"uint256"},{"internalType":"string","name":"object","type":"string"}],"internalType":"struct ISemantic.PredicateAndObject[]","name":"predicateAndObjects","type":"tuple[]"}],"internalType":"struct ISemantic.OperateData[]","name":"operateDatas","type":"tuple[]"}],"name":"adminMint","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":"tokenIds","type":"uint256[]"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"subjectId","type":"uint256"},{"components":[{"internalType":"uint256","name":"predicateId","type":"uint256"},{"internalType":"string","name":"object","type":"string"}],"internalType":"struct ISemantic.PredicateAndObject[]","name":"predicateAndObjects","type":"tuple[]"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ISemantic.ClaimOperateData[]","name":"operateDatas","type":"tuple[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"classDataForId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"classIdForData","outputs":[{"internalType":"string","name":"value","type":"string"},{"internalType":"enum ISemantic.FieldType","name":"classType","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"classSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createdAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createdAtBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"classId","type":"uint256"},{"internalType":"string","name":"subjectValue","type":"string"},{"internalType":"uint256","name":"predicateId","type":"uint256"},{"internalType":"string","name":"object","type":"string"}],"name":"generateRdf","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"classId","type":"uint256"},{"internalType":"string","name":"subjectValue","type":"string"}],"name":"generateSubjectId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","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":"string","name":"_uri","type":"string"},{"internalType":"string","name":"soulClassValue","type":"string"},{"internalType":"string","name":"ownerPredicateValue","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"string","name":"value","type":"string"},{"internalType":"uint256","name":"classId","type":"uint256"}],"internalType":"struct ISemantic.Subject","name":"subject","type":"tuple"},{"components":[{"internalType":"uint256","name":"predicateId","type":"uint256"},{"internalType":"string","name":"object","type":"string"}],"internalType":"struct ISemantic.PredicateAndObject[]","name":"predicateAndObjects","type":"tuple[]"}],"internalType":"struct ISemantic.OperateData[]","name":"operateDatas","type":"tuple[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":"string","name":"","type":"string"}],"name":"predicateDataForId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"predicateIdForData","outputs":[{"internalType":"string","name":"value","type":"string"},{"internalType":"enum ISemantic.FieldType","name":"predicateType","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"predicateSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"prefixMap","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":[],"name":"semanticMetaDataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"singerPub","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint256","name":"predicateId","type":"uint256"},{"internalType":"string","name":"object","type":"string"}],"internalType":"struct ISemantic.PredicateAndObject[]","name":"predicateAndObjects","type":"tuple[]"}],"internalType":"struct ISemantic.SoulOperateData[]","name":"operateDatas","type":"tuple[]"}],"name":"soulMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"name":"subjectDataForId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"subjectIdForData","outputs":[{"internalType":"string","name":"value","type":"string"},{"internalType":"uint256","name":"classId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"subjectSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"subjectId","type":"uint256"},{"components":[{"internalType":"uint256","name":"predicateId","type":"uint256"},{"internalType":"string","name":"object","type":"string"}],"internalType":"struct ISemantic.PredicateAndObject[]","name":"predicateAndObjects","type":"tuple[]"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ISemantic.ClaimOperateData[]","name":"operateDatas","type":"tuple[]"}],"name":"testSign","outputs":[{"internalType":"string","name":"signOriginalData","type":"string"},{"internalType":"address","name":"singer","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"name":"tokenDataForId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdForDataMap","outputs":[{"internalType":"uint256","name":"subjectId","type":"uint256"},{"internalType":"uint256","name":"predicateId","type":"uint256"},{"internalType":"string","name":"object","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdForTurtleData","outputs":[{"internalType":"uint256","name":"subjectId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5033601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260138190555043601481905550615f7b80620000706000396000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c806395d89b4111610182578063d66fe70e116100e9578063f142128f116100a2578063f89c24691161007c578063f89c246914610924578063fc9ab2c914610954578063fe4ba8af14610984578063ff846fb9146109a2576102bb565b8063f142128f146108a4578063f2166eb6146108c2578063f31d9f30146108f3576102bb565b8063d66fe70e146107cd578063d95ba8fe146107e9578063e06f10b814610807578063e1b2252a14610838578063e997d6d814610856578063ec3a0ccc14610874576102bb565b8063bd99b97f1161013b578063bd99b97f146106f9578063c87b56dd14610729578063c91b764f14610759578063cf09e0d014610775578063d547741f14610793578063d5f39488146107af576102bb565b806395d89b4114610639578063a0bcfc7f14610657578063a217fddf14610673578063a24d2c8814610691578063b386c9e1146106c1578063b80f55c9146106dd576102bb565b806362add01c116102265780637880da4b116101df5780637880da4b1461056557806381ca11c61461058357806386255f201461059f57806391d14854146105d157806394c8ad4c14610601578063950c63791461061d576102bb565b806362add01c1461046b578063630941e11461049b5780636352211e146104b957806370a08231146104e957806375f6324614610519578063772a25b914610549576102bb565b806323ad87671161027857806323ad876714610398578063248a9ca3146103b65780632f2ff15d146103e657806336568abe146104025780634c6fbd491461041e5780635f1e6f6d1461044f576102bb565b806301ffc9a7146102c057806306fdde03146102f057806318160ddd1461030e5780631bbfdc621461032c5780631d63ff2b1461035c5780632069e4d11461037a575b600080fd5b6102da60048036038101906102d59190613ddf565b6109c0565b6040516102e79190613e27565b60405180910390f35b6102f8610a2a565b6040516103059190613edb565b60405180910390f35b610316610abc565b6040516103239190613f16565b60405180910390f35b61034660048036038101906103419190614066565b610ac2565b6040516103539190613edb565b60405180910390f35b610364610b78565b6040516103719190613edb565b60405180910390f35b610382610b94565b60405161038f9190613f16565b60405180910390f35b6103a0610b9a565b6040516103ad9190613f16565b60405180910390f35b6103d060048036038101906103cb91906140e5565b610ba0565b6040516103dd9190614121565b60405180910390f35b61040060048036038101906103fb919061419a565b610bbf565b005b61041c6004803603810190610417919061419a565b610be0565b005b61043860048036038101906104339190614206565b610c63565b6040516104469291906142aa565b60405180910390f35b610469600480360381019061046491906142da565b610d1c565b005b61048560048036038101906104809190614395565b610e28565b6040516104929190613edb565b60405180910390f35b6104a3610fe8565b6040516104b09190613f16565b60405180910390f35b6104d360048036038101906104ce9190614206565b610fee565b6040516104e09190614443565b60405180910390f35b61050360048036038101906104fe919061445e565b611075565b6040516105109190613f16565b60405180910390f35b610533600480360381019061052e919061448b565b61112d565b6040516105409190613f16565b60405180910390f35b610563600480360381019061055e919061482c565b611175565b005b61056d611535565b60405161057a9190613edb565b60405180910390f35b61059d60048036038101906105989190614a4a565b611563565b005b6105b960048036038101906105b49190614206565b611718565b6040516105c893929190614a93565b60405180910390f35b6105eb60048036038101906105e6919061419a565b6117ca565b6040516105f89190613e27565b60405180910390f35b61061b60048036038101906106169190614c43565b611834565b005b61063760048036038101906106329190614dc5565b6119b8565b005b610641611b49565b60405161064e9190613edb565b60405180910390f35b610671600480360381019061066c9190614066565b611bdb565b005b61067b611bfd565b6040516106889190614121565b60405180910390f35b6106ab60048036038101906106a69190614066565b611c04565b6040516106b89190613f16565b60405180910390f35b6106db60048036038101906106d69190614f5b565b611c32565b005b6106f760048036038101906106f29190615067565b611d97565b005b610713600480360381019061070e9190614206565b611e74565b6040516107209190613f16565b60405180910390f35b610743600480360381019061073e9190614206565b611e92565b6040516107509190613edb565b60405180910390f35b610773600480360381019061076e9190614a4a565b611efa565b005b61077d6120b3565b60405161078a9190613f16565b60405180910390f35b6107ad60048036038101906107a8919061419a565b6120b9565b005b6107b76120da565b6040516107c49190614443565b60405180910390f35b6107e760048036038101906107e29190615067565b612100565b005b6107f1612185565b6040516107fe9190613f16565b60405180910390f35b610821600480360381019061081c919061482c565b61218a565b60405161082f9291906150b0565b60405180910390f35b6108406123f0565b60405161084d9190614443565b60405180910390f35b61085e612416565b60405161086b9190613f16565b60405180910390f35b61088e600480360381019061088991906150e0565b61241c565b60405161089b9190613f16565b60405180910390f35b6108ac612515565b6040516108b99190613f16565b60405180910390f35b6108dc60048036038101906108d79190614206565b61251a565b6040516108ea9291906142aa565b60405180910390f35b61090d60048036038101906109089190614206565b6125d3565b60405161091b92919061513c565b60405180910390f35b61093e600480360381019061093991906150e0565b61267f565b60405161094b9190613f16565b60405180910390f35b61096e60048036038101906109699190614066565b6126ba565b60405161097b9190613f16565b60405180910390f35b61098c6126e8565b6040516109999190613edb565b60405180910390f35b6109aa612721565b6040516109b79190613edb565b60405180910390f35b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060018054610a399061519b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a659061519b565b8015610ab25780601f10610a8757610100808354040283529160200191610ab2565b820191906000526020600020905b815481529060010190602001808311610a9557829003601f168201915b5050505050905090565b60125481565b6017818051602081018201805184825260208301602085012081835280955050505050506000915090508054610af79061519b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b239061519b565b8015610b705780601f10610b4557610100808354040283529160200191610b70565b820191906000526020600020905b815481529060010190602001808311610b5357829003601f168201915b505050505081565b6040518060600160405280602a8152602001615ef2602a913981565b600e5481565b600b5481565b6000806000838152602001908152602001600020600101549050919050565b610bc882610ba0565b610bd18161273d565b610bdb8383612751565b505050565b610be8612831565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4c9061523f565b60405180910390fd5b610c5f8282612839565b5050565b6006602052806000526040600020600091509050806000018054610c869061519b565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb29061519b565b8015610cff5780601f10610cd457610100808354040283529160200191610cff565b820191906000526020600020905b815481529060010190602001808311610ce257829003601f168201915b5050505050908060010160009054906101000a900460ff16905082565b3373ffffffffffffffffffffffffffffffffffffffff16601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da3906152ab565b60405180910390fd5b610db96000801b85612751565b610dc28361291a565b610df2604051806040016040528084815260200160006002811115610dea57610de9614233565b5b815250612934565b610e22604051806040016040528083815260200160006002811115610e1a57610e19614233565b5b815250612a33565b50505050565b606060006006600087815260200190815260200160002060000185604051602001610e5492919061539b565b60405160208183030381529060405290506000600c60008681526020019081526020016000206000018054610e889061519b565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb49061519b565b8015610f015780601f10610ed657610100808354040283529160200191610f01565b820191906000526020600020905b815481529060010190602001808311610ee457829003601f168201915b5050505050905060016002811115610f1c57610f1b614233565b5b600c600087815260200190815260200160002060010160009054906101000a900460ff166002811115610f5257610f51614233565b5b1415610f7b5783604051602001610f6991906153e5565b60405160208183030381529060405293505b60008282866040518060400160405280600381526020017f202e200000000000000000000000000000000000000000000000000000000000815250604051602001610fc99493929190615440565b6040516020818303038152906040529050809350505050949350505050565b60145481565b600080610ffa83612b38565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561106c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611063906154e8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd9061557a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f6020528260005260406000206020528160005260406000208180516020810182018051848252602083016020850120818352809550505050505060009250925050505481565b60005b81518110156115315760008282815181106111965761119561559a565b5b60200260200101519050428160400151116111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90615615565b60405180910390fd5b60008160000151905060006111fe8360400151612b75565b61120783612b75565b604051602001611218929190615635565b604051602081830303815290604052905060005b83602001515181101561137a576000846020015182815181106112525761125161559a565b5b60200260200101519050600e54816000015111156112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c906156a5565b60405180910390fd5b6000600f600086815260200190815260200160002060008360000151815260200190815260200160002082602001516040516112e191906156c5565b90815260200160405180910390205414611330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132790615728565b60405180910390fd5b8261133e8260000151612b75565b826020015160405160200161135593929190615748565b6040516020818303038152906040529250508080611372906157a8565b91505061122c565b5060006113bb8260405160200161139191906156c5565b60405160208183030381529060405280519060200120856060015186608001518760a00151612d8c565b9050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461144d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114449061583d565b60405180910390fd5b61151a3384600960008860000151815260200190815260200160002060000180546114779061519b565b80601f01602080910402602001604051908101604052809291908181526020018280546114a39061519b565b80156114f05780601f106114c5576101008083540402835291602001916114f0565b820191906000526020600020905b8154815290600101906020018083116114d357829003601f168201915b50505050506009600089600001518152602001908152602001600020600101548860200151612e55565b505050508080611529906157a8565b915050611178565b5050565b606061153f613091565b60405160200161154f9190615883565b604051602081830303815290604052905090565b61156f6000801b610ba0565b6115788161273d565b60005b82518110156117135760008382815181106115995761159861559a565b5b6020026020010151905060006115bf82600001516020015183600001516000015161241c565b905060005b8260200151518110156116dc576000836020015182815181106115ea576115e961559a565b5b60200260200101519050600e548160000151111561163d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611634906156a5565b60405180910390fd5b6000600f6000858152602001908152602001600020600083600001518152602001908152602001600020826020015160405161167991906156c5565b908152602001604051809103902054146116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf90615728565b60405180910390fd5b5080806116d4906157a8565b9150506115c4565b506116fe33828460000151600001518560000151602001518660200151612e55565b5050808061170b906157a8565b91505061157b565b505050565b60106020528060005260406000206000915090508060000154908060010154908060020180546117479061519b565b80601f01602080910402602001604051908101604052809291908181526020018280546117739061519b565b80156117c05780601f10611795576101008083540402835291602001916117c0565b820191906000526020600020905b8154815290600101906020018083116117a357829003601f168201915b5050505050905083565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118406000801b610ba0565b6118498161273d565b60005b82518110156119b357600083828151811061186a5761186961559a565b5b60200260200101519050604051602001611883906158cf565b6040516020818303038152906040528051906020012081600001516040516020016118ae9190613edb565b604051602081830303815290604052805190602001201415611905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fc9061593b565b60405180910390fd5b604051602001611914906158cf565b60405160208183030381529060405280519060200120816020015160405160200161193f919061595b565b604051602081830303815290604052805190602001201415611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d906159c2565b60405180910390fd5b61199f81612a33565b5080806119ab906157a8565b91505061184c565b505050565b60006119cd60016119c833613123565b61241c565b905060005b8251811015611b445760008382815181106119f0576119ef61559a565b5b6020026020010151905060005b816000015151811015611b1557600082600001518281518110611a2357611a2261559a565b5b60200260200101519050600e5481600001511115611a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6d906156a5565b60405180910390fd5b6000600f60008781526020019081526020016000206000836000015181526020019081526020016000208260200151604051611ab291906156c5565b90815260200160405180910390205414611b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af890615728565b60405180910390fd5b508080611b0d906157a8565b9150506119fd565b50611b303384611b2433613123565b60018560000151612e55565b508080611b3c906157a8565b9150506119d2565b505050565b606060028054611b589061519b565b80601f0160208091040260200160405190810160405280929190818152602001828054611b849061519b565b8015611bd15780601f10611ba657610100808354040283529160200191611bd1565b820191906000526020600020905b815481529060010190602001808311611bb457829003601f168201915b5050505050905090565b611be76000801b610ba0565b611bf08161273d565b611bf98261291a565b5050565b6000801b81565b6007818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b611c3e6000801b610ba0565b611c478161273d565b60005b8251811015611d92576000838281518110611c6857611c6761559a565b5b60200260200101519050604051602001611c81906158cf565b604051602081830303815290604052805190602001208160000151604051602001611cac9190613edb565b604051602081830303815290604052805190602001201415611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa90615a2e565b60405180910390fd5b60006008541480611d365750600060078260000151604051611d2591906156c5565b908152602001604051809103902054145b611d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6c90615a9a565b60405180910390fd5b611d7e81612934565b508080611d8a906157a8565b915050611c4a565b505050565b60005b8151811015611e70576000611dc8838381518110611dbb57611dba61559a565b5b6020026020010151612b38565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f90615b06565b60405180910390fd5b611e5c81848481518110611e4f57611e4e61559a565b5b6020026020010151613150565b508080611e68906157a8565b915050611d9a565b5050565b60116020528060005260406000206000915090508060000154905081565b6060611e9d826134b5565b6000611ea7613091565b90506000815111611ec75760405180602001604052806000815250611ef2565b80611ed184612b75565b604051602001611ee2929190615635565b6040516020818303038152906040525b915050919050565b60005b81518110156120af576000828281518110611f1b57611f1a61559a565b5b60200260200101519050611f3f816000015160200151826000015160000151613500565b6000611f5b82600001516020015183600001516000015161241c565b905060005b82602001515181101561207857600083602001518281518110611f8657611f8561559a565b5b60200260200101519050600e5481600001511115611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd0906156a5565b60405180910390fd5b6000600f6000858152602001908152602001600020600083600001518152602001908152602001600020826020015160405161201591906156c5565b90815260200160405180910390205414612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205b90615728565b60405180910390fd5b508080612070906157a8565b915050611f60565b5061209a33828460000151600001518560000151602001518660200151612e55565b505080806120a7906157a8565b915050611efd565b5050565b60135481565b6120c282610ba0565b6120cb8161273d565b6120d58383612839565b505050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61210c6000801b610ba0565b6121158161273d565b60005b82518110156121805760006121468483815181106121395761213861559a565b5b6020026020010151612b38565b905061216c8185848151811061215f5761215e61559a565b5b6020026020010151613150565b508080612178906157a8565b915050612118565b505050565b600181565b6060600080600090505b83518110156123ea5760008482815181106121b2576121b161559a565b5b6020026020010151905042816040015111612202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f990615615565b60405180910390fd5b6000816000015190506122188260400151612b75565b61222182612b75565b604051602001612232929190615635565b604051602081830303815290604052945060005b8260200151518110156123945760008360200151828151811061226c5761226b61559a565b5b60200260200101519050600e54816000015111156122bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b6906156a5565b60405180910390fd5b6000600f600085815260200190815260200160002060008360000151815260200190815260200160002082602001516040516122fb91906156c5565b9081526020016040518091039020541461234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190615728565b60405180910390fd5b866123588260000151612b75565b826020015160405160200161236f93929190615748565b604051602081830303815290604052965050808061238c906157a8565b915050612246565b506123d3856040516020016123a991906156c5565b60405160208183030381529060405280519060200120836060015184608001518560a00151612d8c565b9350505080806123e2906157a8565b915050612194565b50915091565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b600080600a60008581526020019081526020016000208360405161244091906156c5565b9081526020016040518091039020549050600081141561250b57600b600081548092919061246d906157a8565b9190505550600b54600a60008681526020019081526020016000208460405161249691906156c5565b90815260200160405180910390208190555060405180604001604052808481526020018581525060096000600b54815260200190815260200160002060008201518160000190805190602001906124ee929190613cd0565b5060208201518160010155905050600b54905061250a816135ef565b5b8091505092915050565b600181565b600c60205280600052604060002060009150905080600001805461253d9061519b565b80601f01602080910402602001604051908101604052809291908181526020018280546125699061519b565b80156125b65780601f1061258b576101008083540402835291602001916125b6565b820191906000526020600020905b81548152906001019060200180831161259957829003601f168201915b5050505050908060010160009054906101000a900460ff16905082565b60096020528060005260406000206000915090508060000180546125f69061519b565b80601f01602080910402602001604051908101604052809291908181526020018280546126229061519b565b801561266f5780601f106126445761010080835404028352916020019161266f565b820191906000526020600020905b81548152906001019060200180831161265257829003601f168201915b5050505050908060010154905082565b600a60205281600052604060002081805160208101820180518482526020830160208501208183528095505050505050600091509150505481565b600d818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6040518060400160405280600381526020017f202e20000000000000000000000000000000000000000000000000000000000081525081565b6040518060600160405280602a8152602001615f1c602a913981565b61274e81612749612831565b613630565b50565b61275b82826117ca565b61282d57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506127d2612831565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b61284382826117ca565b1561291657600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506128bb612831565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b8060059080519060200190612930929190613cd0565b5050565b60086000815480929190612947906157a8565b919050555080600660006008548152602001908152602001600020600082015181600001908051906020019061297e929190613cd0565b5060208201518160010160006101000a81548160ff021916908360028111156129aa576129a9614233565b5b0217905550905050600854600782600001516040516129c991906156c5565b9081526020016040518091039020819055506008543373ffffffffffffffffffffffffffffffffffffffff167f057900bc8d4669fac4fc0d5cd76146ce7b3927bff1bb6b7d2bf9b258fc5d2e048360000151604051612a289190613edb565b60405180910390a350565b600e6000815480929190612a46906157a8565b919050555080600c6000600e5481526020019081526020016000206000820151816000019080519060200190612a7d929190613cd0565b5060208201518160010160006101000a81548160ff02191690836002811115612aa957612aa8614233565b5b0217905550905050600e54600d8260000151604051612ac891906156c5565b908152602001604051809103902081905550600e543373ffffffffffffffffffffffffffffffffffffffff167f5b44e327309fe9fd659b2f5fa0cc3a027af24df460bc66902e8c7a4722e912ef83600001518460200151604051612b2d9291906142aa565b60405180910390a350565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b606060006001905060008390507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008110612bd9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008181612bcf57612bce615b26565b5b0490506040820191505b6d04ee2d6d415b85acef81000000008110612c16576d04ee2d6d415b85acef81000000008181612c0c57612c0b615b26565b5b0490506020820191505b662386f26fc100008110612c4557662386f26fc100008181612c3b57612c3a615b26565b5b0490506010820191505b6305f5e1008110612c6e576305f5e1008181612c6457612c63615b26565b5b0490506008820191505b6127108110612c93576127108181612c8957612c88615b26565b5b0490506004820191505b60648110612cb65760648181612cac57612cab615b26565b5b0490506002820191505b600a8110612cc5576001820191505b60008267ffffffffffffffff811115612ce157612ce0613f3b565b5b6040519080825280601f01601f191660200182016040528015612d135781602001600182028036833780820191505090505b509050600083602001820190505b600115612d80578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a87061a8153600a8681612d6a57612d69615b26565b5b0495506000861415612d7b57612d80565b612d21565b81945050505050919050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060008187604051602001612ddc929190615bbd565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051612e199493929190615bf4565b6020604051602081039080840390855afa158015612e3b573d6000803e3d6000fd5b505050602060405103519050809350505050949350505050565b60126000815480929190612e68906157a8565b9190505550600060125490506000604051806020016040528060008152509050600060116000848152602001908152602001600020905086816000018190555060005b8451811015612fc8576000858281518110612ec957612ec861559a565b5b6020026020010151905082600101819080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001019080519060200190612f27929190613cd0565b50505084600f60008b81526020019081526020016000206000836000015181526020019081526020016000208260200151604051612f6591906156c5565b9081526020016040518091039020819055506000612f8d888a84600001518560200151610e28565b90508481604051602001612fa2929190615635565b604051602081830303815290604052945050508080612fc0906157a8565b915050612eab565b50612fd383896136b5565b612fdc8861370b565b823373ffffffffffffffffffffffffffffffffffffffff167f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a846040516130239190613edb565b60405180910390a3828873ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050505050565b6060600580546130a09061519b565b80601f01602080910402602001604051908101604052809291908181526020018280546130cc9061519b565b80156131195780601f106130ee57610100808354040283529160200191613119565b820191906000526020600020905b8154815290600101906020018083116130fc57829003601f168201915b5050505050905090565b60606131498273ffffffffffffffffffffffffffffffffffffffff16601460ff1661379d565b9050919050565b613159826139d9565b61316281613a6b565b6000601160008381526020019081526020016000206040518060400160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561327f5783829060005260206000209060020201604051806040016040529081600082015481526020016001820180546131ee9061519b565b80601f016020809104026020016040519081016040528092919081815260200182805461321a9061519b565b80156132675780601f1061323c57610100808354040283529160200191613267565b820191906000526020600020905b81548152906001019060200180831161324a57829003601f168201915b505050505081525050815260200190600101906131b1565b50505050815250509050600060096000836000015181526020019081526020016000206040518060400160405290816000820180546132bd9061519b565b80601f01602080910402602001604051908101604052809291908181526020018280546132e99061519b565b80156133365780601f1061330b57610100808354040283529160200191613336565b820191906000526020600020905b81548152906001019060200180831161331957829003601f168201915b505050505081526020016001820154815250509050600060405180602001604052806000815250905060005b8360200151518110156133eb576000846020015182815181106133885761338761559a565b5b6020026020010151905060006133b08560200151866000015184600001518560200151610e28565b905083816040516020016133c5929190615635565b6040516020818303038152906040529350505080806133e3906157a8565b915050613362565b50838573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167feab88a0b2198f2928ade5fb787115a9a6ffbbf3705277143953a7c26769157ff8460405161344a9190613edb565b60405180910390a4838573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6134be81613aa4565b6134fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f4906154e8565b60405180910390fd5b50565b6000600a60008481526020019081526020016000208260405161352391906156c5565b908152602001604051809103902054905060008111156135ea5761354681613ae5565b806135aa57506000600f60008381526020019081526020016000206000600181526020019081526020016000206040518060600160405280602a8152602001615f1c602a913960405161359991906156c5565b908152602001604051809103902054115b6135e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e090615c85565b60405180910390fd5b5b505050565b600060405180606001604052808381526020016001815260200161361233613123565b815250905061362c3361362433613123565b600184613b3a565b5050565b61363a82826117ca565b6136b15761364781613123565b6136558360001c602061379d565b604051602001613666929190615d3d565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a89190613edb565b60405180910390fd5b5050565b806003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137579190615d77565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6060600060028360026137b09190615dcd565b6137ba9190615d77565b67ffffffffffffffff8111156137d3576137d2613f3b565b5b6040519080825280601f01601f1916602001820160405280156138055781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061383d5761383c61559a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106138a1576138a061559a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026138e19190615dcd565b6138eb9190615d77565b90505b600181111561398b577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061392d5761392c61559a565b5b1a60f81b8282815181106139445761394361559a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061398490615e27565b90506138ee565b50600084146139cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c690615e9d565b60405180910390fd5b8091505092915050565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a259190615ebd565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6003600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b60008073ffffffffffffffffffffffffffffffffffffffff16613ac683612b38565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600080600f6000848152602001908152602001600020600060018152602001908152602001600020613b1633613123565b604051613b2391906156c5565b908152602001604051809103902054119050919050565b60126000815480929190613b4d906157a8565b91905055506000601254905080600f6000846000015181526020019081526020016000206000846020015181526020019081526020016000208360400151604051613b9891906156c5565b908152602001604051809103902081905550816010600083815260200190815260200160002060008201518160000155602082015181600101556040820151816002019080519060200190613bee929190613cd0565b50905050613bfc81866136b5565b613c058561370b565b6000613c1b848685602001518660400151610e28565b9050813373ffffffffffffffffffffffffffffffffffffffff167f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a83604051613c649190613edb565b60405180910390a3818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b828054613cdc9061519b565b90600052602060002090601f016020900481019282613cfe5760008555613d45565b82601f10613d1757805160ff1916838001178555613d45565b82800160010185558215613d45579182015b82811115613d44578251825591602001919060010190613d29565b5b509050613d529190613d56565b5090565b5b80821115613d6f576000816000905550600101613d57565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613dbc81613d87565b8114613dc757600080fd5b50565b600081359050613dd981613db3565b92915050565b600060208284031215613df557613df4613d7d565b5b6000613e0384828501613dca565b91505092915050565b60008115159050919050565b613e2181613e0c565b82525050565b6000602082019050613e3c6000830184613e18565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e7c578082015181840152602081019050613e61565b83811115613e8b576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ead82613e42565b613eb78185613e4d565b9350613ec7818560208601613e5e565b613ed081613e91565b840191505092915050565b60006020820190508181036000830152613ef58184613ea2565b905092915050565b6000819050919050565b613f1081613efd565b82525050565b6000602082019050613f2b6000830184613f07565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f7382613e91565b810181811067ffffffffffffffff82111715613f9257613f91613f3b565b5b80604052505050565b6000613fa5613d73565b9050613fb18282613f6a565b919050565b600067ffffffffffffffff821115613fd157613fd0613f3b565b5b613fda82613e91565b9050602081019050919050565b82818337600083830152505050565b600061400961400484613fb6565b613f9b565b90508281526020810184848401111561402557614024613f36565b5b614030848285613fe7565b509392505050565b600082601f83011261404d5761404c613f31565b5b813561405d848260208601613ff6565b91505092915050565b60006020828403121561407c5761407b613d7d565b5b600082013567ffffffffffffffff81111561409a57614099613d82565b5b6140a684828501614038565b91505092915050565b6000819050919050565b6140c2816140af565b81146140cd57600080fd5b50565b6000813590506140df816140b9565b92915050565b6000602082840312156140fb576140fa613d7d565b5b6000614109848285016140d0565b91505092915050565b61411b816140af565b82525050565b60006020820190506141366000830184614112565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006141678261413c565b9050919050565b6141778161415c565b811461418257600080fd5b50565b6000813590506141948161416e565b92915050565b600080604083850312156141b1576141b0613d7d565b5b60006141bf858286016140d0565b92505060206141d085828601614185565b9150509250929050565b6141e381613efd565b81146141ee57600080fd5b50565b600081359050614200816141da565b92915050565b60006020828403121561421c5761421b613d7d565b5b600061422a848285016141f1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061427357614272614233565b5b50565b600081905061428482614262565b919050565b600061429482614276565b9050919050565b6142a481614289565b82525050565b600060408201905081810360008301526142c48185613ea2565b90506142d3602083018461429b565b9392505050565b600080600080608085870312156142f4576142f3613d7d565b5b600061430287828801614185565b945050602085013567ffffffffffffffff81111561432357614322613d82565b5b61432f87828801614038565b935050604085013567ffffffffffffffff8111156143505761434f613d82565b5b61435c87828801614038565b925050606085013567ffffffffffffffff81111561437d5761437c613d82565b5b61438987828801614038565b91505092959194509250565b600080600080608085870312156143af576143ae613d7d565b5b60006143bd878288016141f1565b945050602085013567ffffffffffffffff8111156143de576143dd613d82565b5b6143ea87828801614038565b93505060406143fb878288016141f1565b925050606085013567ffffffffffffffff81111561441c5761441b613d82565b5b61442887828801614038565b91505092959194509250565b61443d8161415c565b82525050565b60006020820190506144586000830184614434565b92915050565b60006020828403121561447457614473613d7d565b5b600061448284828501614185565b91505092915050565b6000806000606084860312156144a4576144a3613d7d565b5b60006144b2868287016141f1565b93505060206144c3868287016141f1565b925050604084013567ffffffffffffffff8111156144e4576144e3613d82565b5b6144f086828701614038565b9150509250925092565b600067ffffffffffffffff82111561451557614514613f3b565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff8211156145505761454f613f3b565b5b602082029050602081019050919050565b6000604082840312156145775761457661452b565b5b6145816040613f9b565b90506000614591848285016141f1565b600083015250602082013567ffffffffffffffff8111156145b5576145b4614530565b5b6145c184828501614038565b60208301525092915050565b60006145e06145db84614535565b613f9b565b9050808382526020820190506020840283018581111561460357614602614526565b5b835b8181101561464a57803567ffffffffffffffff81111561462857614627613f31565b5b8086016146358982614561565b85526020850194505050602081019050614605565b5050509392505050565b600082601f83011261466957614668613f31565b5b81356146798482602086016145cd565b91505092915050565b600060ff82169050919050565b61469881614682565b81146146a357600080fd5b50565b6000813590506146b58161468f565b92915050565b600060c082840312156146d1576146d061452b565b5b6146db60c0613f9b565b905060006146eb848285016141f1565b600083015250602082013567ffffffffffffffff81111561470f5761470e614530565b5b61471b84828501614654565b602083015250604061472f848285016141f1565b6040830152506060614743848285016146a6565b6060830152506080614757848285016140d0565b60808301525060a061476b848285016140d0565b60a08301525092915050565b600061478a614785846144fa565b613f9b565b905080838252602082019050602084028301858111156147ad576147ac614526565b5b835b818110156147f457803567ffffffffffffffff8111156147d2576147d1613f31565b5b8086016147df89826146bb565b855260208501945050506020810190506147af565b5050509392505050565b600082601f83011261481357614812613f31565b5b8135614823848260208601614777565b91505092915050565b60006020828403121561484257614841613d7d565b5b600082013567ffffffffffffffff8111156148605761485f613d82565b5b61486c848285016147fe565b91505092915050565b600067ffffffffffffffff8211156148905761488f613f3b565b5b602082029050602081019050919050565b6000604082840312156148b7576148b661452b565b5b6148c16040613f9b565b9050600082013567ffffffffffffffff8111156148e1576148e0614530565b5b6148ed84828501614038565b6000830152506020614901848285016141f1565b60208301525092915050565b6000604082840312156149235761492261452b565b5b61492d6040613f9b565b9050600082013567ffffffffffffffff81111561494d5761494c614530565b5b614959848285016148a1565b600083015250602082013567ffffffffffffffff81111561497d5761497c614530565b5b61498984828501614654565b60208301525092915050565b60006149a86149a384614875565b613f9b565b905080838252602082019050602084028301858111156149cb576149ca614526565b5b835b81811015614a1257803567ffffffffffffffff8111156149f0576149ef613f31565b5b8086016149fd898261490d565b855260208501945050506020810190506149cd565b5050509392505050565b600082601f830112614a3157614a30613f31565b5b8135614a41848260208601614995565b91505092915050565b600060208284031215614a6057614a5f613d7d565b5b600082013567ffffffffffffffff811115614a7e57614a7d613d82565b5b614a8a84828501614a1c565b91505092915050565b6000606082019050614aa86000830186613f07565b614ab56020830185613f07565b8181036040830152614ac78184613ea2565b9050949350505050565b600067ffffffffffffffff821115614aec57614aeb613f3b565b5b602082029050602081019050919050565b60038110614b0a57600080fd5b50565b600081359050614b1c81614afd565b92915050565b600060408284031215614b3857614b3761452b565b5b614b426040613f9b565b9050600082013567ffffffffffffffff811115614b6257614b61614530565b5b614b6e84828501614038565b6000830152506020614b8284828501614b0d565b60208301525092915050565b6000614ba1614b9c84614ad1565b613f9b565b90508083825260208201905060208402830185811115614bc457614bc3614526565b5b835b81811015614c0b57803567ffffffffffffffff811115614be957614be8613f31565b5b808601614bf68982614b22565b85526020850194505050602081019050614bc6565b5050509392505050565b600082601f830112614c2a57614c29613f31565b5b8135614c3a848260208601614b8e565b91505092915050565b600060208284031215614c5957614c58613d7d565b5b600082013567ffffffffffffffff811115614c7757614c76613d82565b5b614c8384828501614c15565b91505092915050565b600067ffffffffffffffff821115614ca757614ca6613f3b565b5b602082029050602081019050919050565b600060208284031215614cce57614ccd61452b565b5b614cd86020613f9b565b9050600082013567ffffffffffffffff811115614cf857614cf7614530565b5b614d0484828501614654565b60008301525092915050565b6000614d23614d1e84614c8c565b613f9b565b90508083825260208201905060208402830185811115614d4657614d45614526565b5b835b81811015614d8d57803567ffffffffffffffff811115614d6b57614d6a613f31565b5b808601614d788982614cb8565b85526020850194505050602081019050614d48565b5050509392505050565b600082601f830112614dac57614dab613f31565b5b8135614dbc848260208601614d10565b91505092915050565b600060208284031215614ddb57614dda613d7d565b5b600082013567ffffffffffffffff811115614df957614df8613d82565b5b614e0584828501614d97565b91505092915050565b600067ffffffffffffffff821115614e2957614e28613f3b565b5b602082029050602081019050919050565b600060408284031215614e5057614e4f61452b565b5b614e5a6040613f9b565b9050600082013567ffffffffffffffff811115614e7a57614e79614530565b5b614e8684828501614038565b6000830152506020614e9a84828501614b0d565b60208301525092915050565b6000614eb9614eb484614e0e565b613f9b565b90508083825260208201905060208402830185811115614edc57614edb614526565b5b835b81811015614f2357803567ffffffffffffffff811115614f0157614f00613f31565b5b808601614f0e8982614e3a565b85526020850194505050602081019050614ede565b5050509392505050565b600082601f830112614f4257614f41613f31565b5b8135614f52848260208601614ea6565b91505092915050565b600060208284031215614f7157614f70613d7d565b5b600082013567ffffffffffffffff811115614f8f57614f8e613d82565b5b614f9b84828501614f2d565b91505092915050565b600067ffffffffffffffff821115614fbf57614fbe613f3b565b5b602082029050602081019050919050565b6000614fe3614fde84614fa4565b613f9b565b9050808382526020820190506020840283018581111561500657615005614526565b5b835b8181101561502f578061501b88826141f1565b845260208401935050602081019050615008565b5050509392505050565b600082601f83011261504e5761504d613f31565b5b813561505e848260208601614fd0565b91505092915050565b60006020828403121561507d5761507c613d7d565b5b600082013567ffffffffffffffff81111561509b5761509a613d82565b5b6150a784828501615039565b91505092915050565b600060408201905081810360008301526150ca8185613ea2565b90506150d96020830184614434565b9392505050565b600080604083850312156150f7576150f6613d7d565b5b6000615105858286016141f1565b925050602083013567ffffffffffffffff81111561512657615125613d82565b5b61513285828601614038565b9150509250929050565b600060408201905081810360008301526151568185613ea2565b90506151656020830184613f07565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806151b357607f821691505b602082108114156151c7576151c661516c565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000615229602f83613e4d565b9150615234826151cd565b604082019050919050565b600060208201905081810360008301526152588161521c565b9050919050565b7f6e6f74206465706c6f7965720000000000000000000000000000000000000000600082015250565b6000615295600c83613e4d565b91506152a08261525f565b602082019050919050565b600060208201905081810360008301526152c481615288565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546152f88161519b565b61530281866152cb565b9450600182166000811461531d576001811461532e57615361565b60ff19831686528186019350615361565b615337856152d6565b60005b838110156153595781548189015260018201915060208101905061533a565b838801955050505b50505092915050565b600061537582613e42565b61537f81856152cb565b935061538f818560208601613e5e565b80840191505092915050565b60006153a782856152eb565b91506153b3828461536a565b91508190509392505050565b7f2200000000000000000000000000000000000000000000000000000000000000815250565b60006153f0826153bf565b600182019150615400828461536a565b915061540b826153bf565b60018201915081905092915050565b7f2000000000000000000000000000000000000000000000000000000000000000815250565b600061544c828761536a565b91506154578261541a565b600182019150615467828661536a565b91506154728261541a565b600182019150615482828561536a565b915061548e828461536a565b915081905095945050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006154d2601883613e4d565b91506154dd8261549c565b602082019050919050565b60006020820190508181036000830152615501816154c5565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000615564602983613e4d565b915061556f82615508565b604082019050919050565b6000602082019050818103600083015261559381615557565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f7369676e44617461206861732065787069726564000000000000000000000000600082015250565b60006155ff601483613e4d565b915061560a826155c9565b602082019050919050565b6000602082019050818103600083015261562e816155f2565b9050919050565b6000615641828561536a565b915061564d828461536a565b91508190509392505050565b7f70726564696361746520756e646566696e656400000000000000000000000000600082015250565b600061568f601383613e4d565b915061569a82615659565b602082019050919050565b600060208201905081810360008301526156be81615682565b9050919050565b60006156d1828461536a565b915081905092915050565b7f616c726561647920657869737400000000000000000000000000000000000000600082015250565b6000615712600d83613e4d565b915061571d826156dc565b602082019050919050565b6000602082019050818103600083015261574181615705565b9050919050565b6000615754828661536a565b9150615760828561536a565b915061576c828461536a565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006157b382613efd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156157e6576157e5615779565b5b600182019050919050565b7f7369676e44617461206e6f742066726f6d2073696e6765720000000000000000600082015250565b6000615827601883613e4d565b9150615832826157f1565b602082019050919050565b600060208201905081810360008301526158568161581a565b9050919050565b7f73656d617469632f6d6574616461746100000000000000000000000000000000815250565b600061588f828461536a565b915061589a8261585d565b60108201915081905092915050565b50565b60006158b9600083613e4d565b91506158c4826158a9565b600082019050919050565b600060208201905081810360008301526158e8816158ac565b9050919050565b7f7072656469636174652063616e206e6f7420656d707479000000000000000000600082015250565b6000615925601783613e4d565b9150615930826158ef565b602082019050919050565b6000602082019050818103600083015261595481615918565b9050919050565b6000602082019050615970600083018461429b565b92915050565b7f707265646963617465547970652063616e206e6f7420656d7074790000000000600082015250565b60006159ac601b83613e4d565b91506159b782615976565b602082019050919050565b600060208201905081810360008301526159db8161599f565b9050919050565b7f636c6173732063616e206e6f7420656d70747900000000000000000000000000600082015250565b6000615a18601383613e4d565b9150615a23826159e2565b602082019050919050565b60006020820190508181036000830152615a4781615a0b565b9050919050565b7f636c61737320616c726561647920657869737400000000000000000000000000600082015250565b6000615a84601383613e4d565b9150615a8f82615a4e565b602082019050919050565b60006020820190508181036000830152615ab381615a77565b9050919050565b7f6e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b6000615af0600983613e4d565b9150615afb82615aba565b602082019050919050565b60006020820190508181036000830152615b1f81615ae3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600081905092915050565b6000615b7682615b55565b615b808185615b60565b9350615b90818560208601613e5e565b80840191505092915050565b6000819050919050565b615bb7615bb2826140af565b615b9c565b82525050565b6000615bc98285615b6b565b9150615bd58284615ba6565b6020820191508190509392505050565b615bee81614682565b82525050565b6000608082019050615c096000830187614112565b615c166020830186615be5565b615c236040830185614112565b615c306060830184614112565b95945050505050565b7f6e6f742068617665207065726d697373696f6e00000000000000000000000000600082015250565b6000615c6f601383613e4d565b9150615c7a82615c39565b602082019050919050565b60006020820190508181036000830152615c9e81615c62565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615cdb6017836152cb565b9150615ce682615ca5565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000615d276011836152cb565b9150615d3282615cf1565b601182019050919050565b6000615d4882615cce565b9150615d54828561536a565b9150615d5f82615d1a565b9150615d6b828461536a565b91508190509392505050565b6000615d8282613efd565b9150615d8d83613efd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615dc257615dc1615779565b5b828201905092915050565b6000615dd882613efd565b9150615de383613efd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615e1c57615e1b615779565b5b828202905092915050565b6000615e3282613efd565b91506000821415615e4657615e45615779565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000615e87602083613e4d565b9150615e9282615e51565b602082019050919050565b60006020820190508181036000830152615eb681615e7a565b9050919050565b6000615ec882613efd565b9150615ed383613efd565b925082821015615ee657615ee5615779565b5b82820390509291505056fe307830303030303030303030303030303030303030303030303030303030303030303030303030303030307830303030303030303030303030303030303030303030303030303030303030303030303030303031a264697066735822122083767feeb5688eccc4ed38c2b5b4218112a70a320cf27e2e74f4cc19dea4438d64736f6c634300080c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102bb5760003560e01c806395d89b4111610182578063d66fe70e116100e9578063f142128f116100a2578063f89c24691161007c578063f89c246914610924578063fc9ab2c914610954578063fe4ba8af14610984578063ff846fb9146109a2576102bb565b8063f142128f146108a4578063f2166eb6146108c2578063f31d9f30146108f3576102bb565b8063d66fe70e146107cd578063d95ba8fe146107e9578063e06f10b814610807578063e1b2252a14610838578063e997d6d814610856578063ec3a0ccc14610874576102bb565b8063bd99b97f1161013b578063bd99b97f146106f9578063c87b56dd14610729578063c91b764f14610759578063cf09e0d014610775578063d547741f14610793578063d5f39488146107af576102bb565b806395d89b4114610639578063a0bcfc7f14610657578063a217fddf14610673578063a24d2c8814610691578063b386c9e1146106c1578063b80f55c9146106dd576102bb565b806362add01c116102265780637880da4b116101df5780637880da4b1461056557806381ca11c61461058357806386255f201461059f57806391d14854146105d157806394c8ad4c14610601578063950c63791461061d576102bb565b806362add01c1461046b578063630941e11461049b5780636352211e146104b957806370a08231146104e957806375f6324614610519578063772a25b914610549576102bb565b806323ad87671161027857806323ad876714610398578063248a9ca3146103b65780632f2ff15d146103e657806336568abe146104025780634c6fbd491461041e5780635f1e6f6d1461044f576102bb565b806301ffc9a7146102c057806306fdde03146102f057806318160ddd1461030e5780631bbfdc621461032c5780631d63ff2b1461035c5780632069e4d11461037a575b600080fd5b6102da60048036038101906102d59190613ddf565b6109c0565b6040516102e79190613e27565b60405180910390f35b6102f8610a2a565b6040516103059190613edb565b60405180910390f35b610316610abc565b6040516103239190613f16565b60405180910390f35b61034660048036038101906103419190614066565b610ac2565b6040516103539190613edb565b60405180910390f35b610364610b78565b6040516103719190613edb565b60405180910390f35b610382610b94565b60405161038f9190613f16565b60405180910390f35b6103a0610b9a565b6040516103ad9190613f16565b60405180910390f35b6103d060048036038101906103cb91906140e5565b610ba0565b6040516103dd9190614121565b60405180910390f35b61040060048036038101906103fb919061419a565b610bbf565b005b61041c6004803603810190610417919061419a565b610be0565b005b61043860048036038101906104339190614206565b610c63565b6040516104469291906142aa565b60405180910390f35b610469600480360381019061046491906142da565b610d1c565b005b61048560048036038101906104809190614395565b610e28565b6040516104929190613edb565b60405180910390f35b6104a3610fe8565b6040516104b09190613f16565b60405180910390f35b6104d360048036038101906104ce9190614206565b610fee565b6040516104e09190614443565b60405180910390f35b61050360048036038101906104fe919061445e565b611075565b6040516105109190613f16565b60405180910390f35b610533600480360381019061052e919061448b565b61112d565b6040516105409190613f16565b60405180910390f35b610563600480360381019061055e919061482c565b611175565b005b61056d611535565b60405161057a9190613edb565b60405180910390f35b61059d60048036038101906105989190614a4a565b611563565b005b6105b960048036038101906105b49190614206565b611718565b6040516105c893929190614a93565b60405180910390f35b6105eb60048036038101906105e6919061419a565b6117ca565b6040516105f89190613e27565b60405180910390f35b61061b60048036038101906106169190614c43565b611834565b005b61063760048036038101906106329190614dc5565b6119b8565b005b610641611b49565b60405161064e9190613edb565b60405180910390f35b610671600480360381019061066c9190614066565b611bdb565b005b61067b611bfd565b6040516106889190614121565b60405180910390f35b6106ab60048036038101906106a69190614066565b611c04565b6040516106b89190613f16565b60405180910390f35b6106db60048036038101906106d69190614f5b565b611c32565b005b6106f760048036038101906106f29190615067565b611d97565b005b610713600480360381019061070e9190614206565b611e74565b6040516107209190613f16565b60405180910390f35b610743600480360381019061073e9190614206565b611e92565b6040516107509190613edb565b60405180910390f35b610773600480360381019061076e9190614a4a565b611efa565b005b61077d6120b3565b60405161078a9190613f16565b60405180910390f35b6107ad60048036038101906107a8919061419a565b6120b9565b005b6107b76120da565b6040516107c49190614443565b60405180910390f35b6107e760048036038101906107e29190615067565b612100565b005b6107f1612185565b6040516107fe9190613f16565b60405180910390f35b610821600480360381019061081c919061482c565b61218a565b60405161082f9291906150b0565b60405180910390f35b6108406123f0565b60405161084d9190614443565b60405180910390f35b61085e612416565b60405161086b9190613f16565b60405180910390f35b61088e600480360381019061088991906150e0565b61241c565b60405161089b9190613f16565b60405180910390f35b6108ac612515565b6040516108b99190613f16565b60405180910390f35b6108dc60048036038101906108d79190614206565b61251a565b6040516108ea9291906142aa565b60405180910390f35b61090d60048036038101906109089190614206565b6125d3565b60405161091b92919061513c565b60405180910390f35b61093e600480360381019061093991906150e0565b61267f565b60405161094b9190613f16565b60405180910390f35b61096e60048036038101906109699190614066565b6126ba565b60405161097b9190613f16565b60405180910390f35b61098c6126e8565b6040516109999190613edb565b60405180910390f35b6109aa612721565b6040516109b79190613edb565b60405180910390f35b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060018054610a399061519b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a659061519b565b8015610ab25780601f10610a8757610100808354040283529160200191610ab2565b820191906000526020600020905b815481529060010190602001808311610a9557829003601f168201915b5050505050905090565b60125481565b6017818051602081018201805184825260208301602085012081835280955050505050506000915090508054610af79061519b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b239061519b565b8015610b705780601f10610b4557610100808354040283529160200191610b70565b820191906000526020600020905b815481529060010190602001808311610b5357829003601f168201915b505050505081565b6040518060600160405280602a8152602001615ef2602a913981565b600e5481565b600b5481565b6000806000838152602001908152602001600020600101549050919050565b610bc882610ba0565b610bd18161273d565b610bdb8383612751565b505050565b610be8612831565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4c9061523f565b60405180910390fd5b610c5f8282612839565b5050565b6006602052806000526040600020600091509050806000018054610c869061519b565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb29061519b565b8015610cff5780601f10610cd457610100808354040283529160200191610cff565b820191906000526020600020905b815481529060010190602001808311610ce257829003601f168201915b5050505050908060010160009054906101000a900460ff16905082565b3373ffffffffffffffffffffffffffffffffffffffff16601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da3906152ab565b60405180910390fd5b610db96000801b85612751565b610dc28361291a565b610df2604051806040016040528084815260200160006002811115610dea57610de9614233565b5b815250612934565b610e22604051806040016040528083815260200160006002811115610e1a57610e19614233565b5b815250612a33565b50505050565b606060006006600087815260200190815260200160002060000185604051602001610e5492919061539b565b60405160208183030381529060405290506000600c60008681526020019081526020016000206000018054610e889061519b565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb49061519b565b8015610f015780601f10610ed657610100808354040283529160200191610f01565b820191906000526020600020905b815481529060010190602001808311610ee457829003601f168201915b5050505050905060016002811115610f1c57610f1b614233565b5b600c600087815260200190815260200160002060010160009054906101000a900460ff166002811115610f5257610f51614233565b5b1415610f7b5783604051602001610f6991906153e5565b60405160208183030381529060405293505b60008282866040518060400160405280600381526020017f202e200000000000000000000000000000000000000000000000000000000000815250604051602001610fc99493929190615440565b6040516020818303038152906040529050809350505050949350505050565b60145481565b600080610ffa83612b38565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561106c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611063906154e8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd9061557a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f6020528260005260406000206020528160005260406000208180516020810182018051848252602083016020850120818352809550505050505060009250925050505481565b60005b81518110156115315760008282815181106111965761119561559a565b5b60200260200101519050428160400151116111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90615615565b60405180910390fd5b60008160000151905060006111fe8360400151612b75565b61120783612b75565b604051602001611218929190615635565b604051602081830303815290604052905060005b83602001515181101561137a576000846020015182815181106112525761125161559a565b5b60200260200101519050600e54816000015111156112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c906156a5565b60405180910390fd5b6000600f600086815260200190815260200160002060008360000151815260200190815260200160002082602001516040516112e191906156c5565b90815260200160405180910390205414611330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132790615728565b60405180910390fd5b8261133e8260000151612b75565b826020015160405160200161135593929190615748565b6040516020818303038152906040529250508080611372906157a8565b91505061122c565b5060006113bb8260405160200161139191906156c5565b60405160208183030381529060405280519060200120856060015186608001518760a00151612d8c565b9050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461144d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114449061583d565b60405180910390fd5b61151a3384600960008860000151815260200190815260200160002060000180546114779061519b565b80601f01602080910402602001604051908101604052809291908181526020018280546114a39061519b565b80156114f05780601f106114c5576101008083540402835291602001916114f0565b820191906000526020600020905b8154815290600101906020018083116114d357829003601f168201915b50505050506009600089600001518152602001908152602001600020600101548860200151612e55565b505050508080611529906157a8565b915050611178565b5050565b606061153f613091565b60405160200161154f9190615883565b604051602081830303815290604052905090565b61156f6000801b610ba0565b6115788161273d565b60005b82518110156117135760008382815181106115995761159861559a565b5b6020026020010151905060006115bf82600001516020015183600001516000015161241c565b905060005b8260200151518110156116dc576000836020015182815181106115ea576115e961559a565b5b60200260200101519050600e548160000151111561163d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611634906156a5565b60405180910390fd5b6000600f6000858152602001908152602001600020600083600001518152602001908152602001600020826020015160405161167991906156c5565b908152602001604051809103902054146116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf90615728565b60405180910390fd5b5080806116d4906157a8565b9150506115c4565b506116fe33828460000151600001518560000151602001518660200151612e55565b5050808061170b906157a8565b91505061157b565b505050565b60106020528060005260406000206000915090508060000154908060010154908060020180546117479061519b565b80601f01602080910402602001604051908101604052809291908181526020018280546117739061519b565b80156117c05780601f10611795576101008083540402835291602001916117c0565b820191906000526020600020905b8154815290600101906020018083116117a357829003601f168201915b5050505050905083565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118406000801b610ba0565b6118498161273d565b60005b82518110156119b357600083828151811061186a5761186961559a565b5b60200260200101519050604051602001611883906158cf565b6040516020818303038152906040528051906020012081600001516040516020016118ae9190613edb565b604051602081830303815290604052805190602001201415611905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fc9061593b565b60405180910390fd5b604051602001611914906158cf565b60405160208183030381529060405280519060200120816020015160405160200161193f919061595b565b604051602081830303815290604052805190602001201415611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d906159c2565b60405180910390fd5b61199f81612a33565b5080806119ab906157a8565b91505061184c565b505050565b60006119cd60016119c833613123565b61241c565b905060005b8251811015611b445760008382815181106119f0576119ef61559a565b5b6020026020010151905060005b816000015151811015611b1557600082600001518281518110611a2357611a2261559a565b5b60200260200101519050600e5481600001511115611a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6d906156a5565b60405180910390fd5b6000600f60008781526020019081526020016000206000836000015181526020019081526020016000208260200151604051611ab291906156c5565b90815260200160405180910390205414611b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af890615728565b60405180910390fd5b508080611b0d906157a8565b9150506119fd565b50611b303384611b2433613123565b60018560000151612e55565b508080611b3c906157a8565b9150506119d2565b505050565b606060028054611b589061519b565b80601f0160208091040260200160405190810160405280929190818152602001828054611b849061519b565b8015611bd15780601f10611ba657610100808354040283529160200191611bd1565b820191906000526020600020905b815481529060010190602001808311611bb457829003601f168201915b5050505050905090565b611be76000801b610ba0565b611bf08161273d565b611bf98261291a565b5050565b6000801b81565b6007818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b611c3e6000801b610ba0565b611c478161273d565b60005b8251811015611d92576000838281518110611c6857611c6761559a565b5b60200260200101519050604051602001611c81906158cf565b604051602081830303815290604052805190602001208160000151604051602001611cac9190613edb565b604051602081830303815290604052805190602001201415611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa90615a2e565b60405180910390fd5b60006008541480611d365750600060078260000151604051611d2591906156c5565b908152602001604051809103902054145b611d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6c90615a9a565b60405180910390fd5b611d7e81612934565b508080611d8a906157a8565b915050611c4a565b505050565b60005b8151811015611e70576000611dc8838381518110611dbb57611dba61559a565b5b6020026020010151612b38565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f90615b06565b60405180910390fd5b611e5c81848481518110611e4f57611e4e61559a565b5b6020026020010151613150565b508080611e68906157a8565b915050611d9a565b5050565b60116020528060005260406000206000915090508060000154905081565b6060611e9d826134b5565b6000611ea7613091565b90506000815111611ec75760405180602001604052806000815250611ef2565b80611ed184612b75565b604051602001611ee2929190615635565b6040516020818303038152906040525b915050919050565b60005b81518110156120af576000828281518110611f1b57611f1a61559a565b5b60200260200101519050611f3f816000015160200151826000015160000151613500565b6000611f5b82600001516020015183600001516000015161241c565b905060005b82602001515181101561207857600083602001518281518110611f8657611f8561559a565b5b60200260200101519050600e5481600001511115611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd0906156a5565b60405180910390fd5b6000600f6000858152602001908152602001600020600083600001518152602001908152602001600020826020015160405161201591906156c5565b90815260200160405180910390205414612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205b90615728565b60405180910390fd5b508080612070906157a8565b915050611f60565b5061209a33828460000151600001518560000151602001518660200151612e55565b505080806120a7906157a8565b915050611efd565b5050565b60135481565b6120c282610ba0565b6120cb8161273d565b6120d58383612839565b505050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61210c6000801b610ba0565b6121158161273d565b60005b82518110156121805760006121468483815181106121395761213861559a565b5b6020026020010151612b38565b905061216c8185848151811061215f5761215e61559a565b5b6020026020010151613150565b508080612178906157a8565b915050612118565b505050565b600181565b6060600080600090505b83518110156123ea5760008482815181106121b2576121b161559a565b5b6020026020010151905042816040015111612202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f990615615565b60405180910390fd5b6000816000015190506122188260400151612b75565b61222182612b75565b604051602001612232929190615635565b604051602081830303815290604052945060005b8260200151518110156123945760008360200151828151811061226c5761226b61559a565b5b60200260200101519050600e54816000015111156122bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b6906156a5565b60405180910390fd5b6000600f600085815260200190815260200160002060008360000151815260200190815260200160002082602001516040516122fb91906156c5565b9081526020016040518091039020541461234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190615728565b60405180910390fd5b866123588260000151612b75565b826020015160405160200161236f93929190615748565b604051602081830303815290604052965050808061238c906157a8565b915050612246565b506123d3856040516020016123a991906156c5565b60405160208183030381529060405280519060200120836060015184608001518560a00151612d8c565b9350505080806123e2906157a8565b915050612194565b50915091565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b600080600a60008581526020019081526020016000208360405161244091906156c5565b9081526020016040518091039020549050600081141561250b57600b600081548092919061246d906157a8565b9190505550600b54600a60008681526020019081526020016000208460405161249691906156c5565b90815260200160405180910390208190555060405180604001604052808481526020018581525060096000600b54815260200190815260200160002060008201518160000190805190602001906124ee929190613cd0565b5060208201518160010155905050600b54905061250a816135ef565b5b8091505092915050565b600181565b600c60205280600052604060002060009150905080600001805461253d9061519b565b80601f01602080910402602001604051908101604052809291908181526020018280546125699061519b565b80156125b65780601f1061258b576101008083540402835291602001916125b6565b820191906000526020600020905b81548152906001019060200180831161259957829003601f168201915b5050505050908060010160009054906101000a900460ff16905082565b60096020528060005260406000206000915090508060000180546125f69061519b565b80601f01602080910402602001604051908101604052809291908181526020018280546126229061519b565b801561266f5780601f106126445761010080835404028352916020019161266f565b820191906000526020600020905b81548152906001019060200180831161265257829003601f168201915b5050505050908060010154905082565b600a60205281600052604060002081805160208101820180518482526020830160208501208183528095505050505050600091509150505481565b600d818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6040518060400160405280600381526020017f202e20000000000000000000000000000000000000000000000000000000000081525081565b6040518060600160405280602a8152602001615f1c602a913981565b61274e81612749612831565b613630565b50565b61275b82826117ca565b61282d57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506127d2612831565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b61284382826117ca565b1561291657600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506128bb612831565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b8060059080519060200190612930929190613cd0565b5050565b60086000815480929190612947906157a8565b919050555080600660006008548152602001908152602001600020600082015181600001908051906020019061297e929190613cd0565b5060208201518160010160006101000a81548160ff021916908360028111156129aa576129a9614233565b5b0217905550905050600854600782600001516040516129c991906156c5565b9081526020016040518091039020819055506008543373ffffffffffffffffffffffffffffffffffffffff167f057900bc8d4669fac4fc0d5cd76146ce7b3927bff1bb6b7d2bf9b258fc5d2e048360000151604051612a289190613edb565b60405180910390a350565b600e6000815480929190612a46906157a8565b919050555080600c6000600e5481526020019081526020016000206000820151816000019080519060200190612a7d929190613cd0565b5060208201518160010160006101000a81548160ff02191690836002811115612aa957612aa8614233565b5b0217905550905050600e54600d8260000151604051612ac891906156c5565b908152602001604051809103902081905550600e543373ffffffffffffffffffffffffffffffffffffffff167f5b44e327309fe9fd659b2f5fa0cc3a027af24df460bc66902e8c7a4722e912ef83600001518460200151604051612b2d9291906142aa565b60405180910390a350565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b606060006001905060008390507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008110612bd9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008181612bcf57612bce615b26565b5b0490506040820191505b6d04ee2d6d415b85acef81000000008110612c16576d04ee2d6d415b85acef81000000008181612c0c57612c0b615b26565b5b0490506020820191505b662386f26fc100008110612c4557662386f26fc100008181612c3b57612c3a615b26565b5b0490506010820191505b6305f5e1008110612c6e576305f5e1008181612c6457612c63615b26565b5b0490506008820191505b6127108110612c93576127108181612c8957612c88615b26565b5b0490506004820191505b60648110612cb65760648181612cac57612cab615b26565b5b0490506002820191505b600a8110612cc5576001820191505b60008267ffffffffffffffff811115612ce157612ce0613f3b565b5b6040519080825280601f01601f191660200182016040528015612d135781602001600182028036833780820191505090505b509050600083602001820190505b600115612d80578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a87061a8153600a8681612d6a57612d69615b26565b5b0495506000861415612d7b57612d80565b612d21565b81945050505050919050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060008187604051602001612ddc929190615bbd565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051612e199493929190615bf4565b6020604051602081039080840390855afa158015612e3b573d6000803e3d6000fd5b505050602060405103519050809350505050949350505050565b60126000815480929190612e68906157a8565b9190505550600060125490506000604051806020016040528060008152509050600060116000848152602001908152602001600020905086816000018190555060005b8451811015612fc8576000858281518110612ec957612ec861559a565b5b6020026020010151905082600101819080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001019080519060200190612f27929190613cd0565b50505084600f60008b81526020019081526020016000206000836000015181526020019081526020016000208260200151604051612f6591906156c5565b9081526020016040518091039020819055506000612f8d888a84600001518560200151610e28565b90508481604051602001612fa2929190615635565b604051602081830303815290604052945050508080612fc0906157a8565b915050612eab565b50612fd383896136b5565b612fdc8861370b565b823373ffffffffffffffffffffffffffffffffffffffff167f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a846040516130239190613edb565b60405180910390a3828873ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050505050565b6060600580546130a09061519b565b80601f01602080910402602001604051908101604052809291908181526020018280546130cc9061519b565b80156131195780601f106130ee57610100808354040283529160200191613119565b820191906000526020600020905b8154815290600101906020018083116130fc57829003601f168201915b5050505050905090565b60606131498273ffffffffffffffffffffffffffffffffffffffff16601460ff1661379d565b9050919050565b613159826139d9565b61316281613a6b565b6000601160008381526020019081526020016000206040518060400160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561327f5783829060005260206000209060020201604051806040016040529081600082015481526020016001820180546131ee9061519b565b80601f016020809104026020016040519081016040528092919081815260200182805461321a9061519b565b80156132675780601f1061323c57610100808354040283529160200191613267565b820191906000526020600020905b81548152906001019060200180831161324a57829003601f168201915b505050505081525050815260200190600101906131b1565b50505050815250509050600060096000836000015181526020019081526020016000206040518060400160405290816000820180546132bd9061519b565b80601f01602080910402602001604051908101604052809291908181526020018280546132e99061519b565b80156133365780601f1061330b57610100808354040283529160200191613336565b820191906000526020600020905b81548152906001019060200180831161331957829003601f168201915b505050505081526020016001820154815250509050600060405180602001604052806000815250905060005b8360200151518110156133eb576000846020015182815181106133885761338761559a565b5b6020026020010151905060006133b08560200151866000015184600001518560200151610e28565b905083816040516020016133c5929190615635565b6040516020818303038152906040529350505080806133e3906157a8565b915050613362565b50838573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167feab88a0b2198f2928ade5fb787115a9a6ffbbf3705277143953a7c26769157ff8460405161344a9190613edb565b60405180910390a4838573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6134be81613aa4565b6134fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f4906154e8565b60405180910390fd5b50565b6000600a60008481526020019081526020016000208260405161352391906156c5565b908152602001604051809103902054905060008111156135ea5761354681613ae5565b806135aa57506000600f60008381526020019081526020016000206000600181526020019081526020016000206040518060600160405280602a8152602001615f1c602a913960405161359991906156c5565b908152602001604051809103902054115b6135e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e090615c85565b60405180910390fd5b5b505050565b600060405180606001604052808381526020016001815260200161361233613123565b815250905061362c3361362433613123565b600184613b3a565b5050565b61363a82826117ca565b6136b15761364781613123565b6136558360001c602061379d565b604051602001613666929190615d3d565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a89190613edb565b60405180910390fd5b5050565b806003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137579190615d77565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6060600060028360026137b09190615dcd565b6137ba9190615d77565b67ffffffffffffffff8111156137d3576137d2613f3b565b5b6040519080825280601f01601f1916602001820160405280156138055781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061383d5761383c61559a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106138a1576138a061559a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026138e19190615dcd565b6138eb9190615d77565b90505b600181111561398b577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061392d5761392c61559a565b5b1a60f81b8282815181106139445761394361559a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061398490615e27565b90506138ee565b50600084146139cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c690615e9d565b60405180910390fd5b8091505092915050565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a259190615ebd565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6003600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b60008073ffffffffffffffffffffffffffffffffffffffff16613ac683612b38565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600080600f6000848152602001908152602001600020600060018152602001908152602001600020613b1633613123565b604051613b2391906156c5565b908152602001604051809103902054119050919050565b60126000815480929190613b4d906157a8565b91905055506000601254905080600f6000846000015181526020019081526020016000206000846020015181526020019081526020016000208360400151604051613b9891906156c5565b908152602001604051809103902081905550816010600083815260200190815260200160002060008201518160000155602082015181600101556040820151816002019080519060200190613bee929190613cd0565b50905050613bfc81866136b5565b613c058561370b565b6000613c1b848685602001518660400151610e28565b9050813373ffffffffffffffffffffffffffffffffffffffff167f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a83604051613c649190613edb565b60405180910390a3818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b828054613cdc9061519b565b90600052602060002090601f016020900481019282613cfe5760008555613d45565b82601f10613d1757805160ff1916838001178555613d45565b82800160010185558215613d45579182015b82811115613d44578251825591602001919060010190613d29565b5b509050613d529190613d56565b5090565b5b80821115613d6f576000816000905550600101613d57565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613dbc81613d87565b8114613dc757600080fd5b50565b600081359050613dd981613db3565b92915050565b600060208284031215613df557613df4613d7d565b5b6000613e0384828501613dca565b91505092915050565b60008115159050919050565b613e2181613e0c565b82525050565b6000602082019050613e3c6000830184613e18565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e7c578082015181840152602081019050613e61565b83811115613e8b576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ead82613e42565b613eb78185613e4d565b9350613ec7818560208601613e5e565b613ed081613e91565b840191505092915050565b60006020820190508181036000830152613ef58184613ea2565b905092915050565b6000819050919050565b613f1081613efd565b82525050565b6000602082019050613f2b6000830184613f07565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f7382613e91565b810181811067ffffffffffffffff82111715613f9257613f91613f3b565b5b80604052505050565b6000613fa5613d73565b9050613fb18282613f6a565b919050565b600067ffffffffffffffff821115613fd157613fd0613f3b565b5b613fda82613e91565b9050602081019050919050565b82818337600083830152505050565b600061400961400484613fb6565b613f9b565b90508281526020810184848401111561402557614024613f36565b5b614030848285613fe7565b509392505050565b600082601f83011261404d5761404c613f31565b5b813561405d848260208601613ff6565b91505092915050565b60006020828403121561407c5761407b613d7d565b5b600082013567ffffffffffffffff81111561409a57614099613d82565b5b6140a684828501614038565b91505092915050565b6000819050919050565b6140c2816140af565b81146140cd57600080fd5b50565b6000813590506140df816140b9565b92915050565b6000602082840312156140fb576140fa613d7d565b5b6000614109848285016140d0565b91505092915050565b61411b816140af565b82525050565b60006020820190506141366000830184614112565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006141678261413c565b9050919050565b6141778161415c565b811461418257600080fd5b50565b6000813590506141948161416e565b92915050565b600080604083850312156141b1576141b0613d7d565b5b60006141bf858286016140d0565b92505060206141d085828601614185565b9150509250929050565b6141e381613efd565b81146141ee57600080fd5b50565b600081359050614200816141da565b92915050565b60006020828403121561421c5761421b613d7d565b5b600061422a848285016141f1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061427357614272614233565b5b50565b600081905061428482614262565b919050565b600061429482614276565b9050919050565b6142a481614289565b82525050565b600060408201905081810360008301526142c48185613ea2565b90506142d3602083018461429b565b9392505050565b600080600080608085870312156142f4576142f3613d7d565b5b600061430287828801614185565b945050602085013567ffffffffffffffff81111561432357614322613d82565b5b61432f87828801614038565b935050604085013567ffffffffffffffff8111156143505761434f613d82565b5b61435c87828801614038565b925050606085013567ffffffffffffffff81111561437d5761437c613d82565b5b61438987828801614038565b91505092959194509250565b600080600080608085870312156143af576143ae613d7d565b5b60006143bd878288016141f1565b945050602085013567ffffffffffffffff8111156143de576143dd613d82565b5b6143ea87828801614038565b93505060406143fb878288016141f1565b925050606085013567ffffffffffffffff81111561441c5761441b613d82565b5b61442887828801614038565b91505092959194509250565b61443d8161415c565b82525050565b60006020820190506144586000830184614434565b92915050565b60006020828403121561447457614473613d7d565b5b600061448284828501614185565b91505092915050565b6000806000606084860312156144a4576144a3613d7d565b5b60006144b2868287016141f1565b93505060206144c3868287016141f1565b925050604084013567ffffffffffffffff8111156144e4576144e3613d82565b5b6144f086828701614038565b9150509250925092565b600067ffffffffffffffff82111561451557614514613f3b565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff8211156145505761454f613f3b565b5b602082029050602081019050919050565b6000604082840312156145775761457661452b565b5b6145816040613f9b565b90506000614591848285016141f1565b600083015250602082013567ffffffffffffffff8111156145b5576145b4614530565b5b6145c184828501614038565b60208301525092915050565b60006145e06145db84614535565b613f9b565b9050808382526020820190506020840283018581111561460357614602614526565b5b835b8181101561464a57803567ffffffffffffffff81111561462857614627613f31565b5b8086016146358982614561565b85526020850194505050602081019050614605565b5050509392505050565b600082601f83011261466957614668613f31565b5b81356146798482602086016145cd565b91505092915050565b600060ff82169050919050565b61469881614682565b81146146a357600080fd5b50565b6000813590506146b58161468f565b92915050565b600060c082840312156146d1576146d061452b565b5b6146db60c0613f9b565b905060006146eb848285016141f1565b600083015250602082013567ffffffffffffffff81111561470f5761470e614530565b5b61471b84828501614654565b602083015250604061472f848285016141f1565b6040830152506060614743848285016146a6565b6060830152506080614757848285016140d0565b60808301525060a061476b848285016140d0565b60a08301525092915050565b600061478a614785846144fa565b613f9b565b905080838252602082019050602084028301858111156147ad576147ac614526565b5b835b818110156147f457803567ffffffffffffffff8111156147d2576147d1613f31565b5b8086016147df89826146bb565b855260208501945050506020810190506147af565b5050509392505050565b600082601f83011261481357614812613f31565b5b8135614823848260208601614777565b91505092915050565b60006020828403121561484257614841613d7d565b5b600082013567ffffffffffffffff8111156148605761485f613d82565b5b61486c848285016147fe565b91505092915050565b600067ffffffffffffffff8211156148905761488f613f3b565b5b602082029050602081019050919050565b6000604082840312156148b7576148b661452b565b5b6148c16040613f9b565b9050600082013567ffffffffffffffff8111156148e1576148e0614530565b5b6148ed84828501614038565b6000830152506020614901848285016141f1565b60208301525092915050565b6000604082840312156149235761492261452b565b5b61492d6040613f9b565b9050600082013567ffffffffffffffff81111561494d5761494c614530565b5b614959848285016148a1565b600083015250602082013567ffffffffffffffff81111561497d5761497c614530565b5b61498984828501614654565b60208301525092915050565b60006149a86149a384614875565b613f9b565b905080838252602082019050602084028301858111156149cb576149ca614526565b5b835b81811015614a1257803567ffffffffffffffff8111156149f0576149ef613f31565b5b8086016149fd898261490d565b855260208501945050506020810190506149cd565b5050509392505050565b600082601f830112614a3157614a30613f31565b5b8135614a41848260208601614995565b91505092915050565b600060208284031215614a6057614a5f613d7d565b5b600082013567ffffffffffffffff811115614a7e57614a7d613d82565b5b614a8a84828501614a1c565b91505092915050565b6000606082019050614aa86000830186613f07565b614ab56020830185613f07565b8181036040830152614ac78184613ea2565b9050949350505050565b600067ffffffffffffffff821115614aec57614aeb613f3b565b5b602082029050602081019050919050565b60038110614b0a57600080fd5b50565b600081359050614b1c81614afd565b92915050565b600060408284031215614b3857614b3761452b565b5b614b426040613f9b565b9050600082013567ffffffffffffffff811115614b6257614b61614530565b5b614b6e84828501614038565b6000830152506020614b8284828501614b0d565b60208301525092915050565b6000614ba1614b9c84614ad1565b613f9b565b90508083825260208201905060208402830185811115614bc457614bc3614526565b5b835b81811015614c0b57803567ffffffffffffffff811115614be957614be8613f31565b5b808601614bf68982614b22565b85526020850194505050602081019050614bc6565b5050509392505050565b600082601f830112614c2a57614c29613f31565b5b8135614c3a848260208601614b8e565b91505092915050565b600060208284031215614c5957614c58613d7d565b5b600082013567ffffffffffffffff811115614c7757614c76613d82565b5b614c8384828501614c15565b91505092915050565b600067ffffffffffffffff821115614ca757614ca6613f3b565b5b602082029050602081019050919050565b600060208284031215614cce57614ccd61452b565b5b614cd86020613f9b565b9050600082013567ffffffffffffffff811115614cf857614cf7614530565b5b614d0484828501614654565b60008301525092915050565b6000614d23614d1e84614c8c565b613f9b565b90508083825260208201905060208402830185811115614d4657614d45614526565b5b835b81811015614d8d57803567ffffffffffffffff811115614d6b57614d6a613f31565b5b808601614d788982614cb8565b85526020850194505050602081019050614d48565b5050509392505050565b600082601f830112614dac57614dab613f31565b5b8135614dbc848260208601614d10565b91505092915050565b600060208284031215614ddb57614dda613d7d565b5b600082013567ffffffffffffffff811115614df957614df8613d82565b5b614e0584828501614d97565b91505092915050565b600067ffffffffffffffff821115614e2957614e28613f3b565b5b602082029050602081019050919050565b600060408284031215614e5057614e4f61452b565b5b614e5a6040613f9b565b9050600082013567ffffffffffffffff811115614e7a57614e79614530565b5b614e8684828501614038565b6000830152506020614e9a84828501614b0d565b60208301525092915050565b6000614eb9614eb484614e0e565b613f9b565b90508083825260208201905060208402830185811115614edc57614edb614526565b5b835b81811015614f2357803567ffffffffffffffff811115614f0157614f00613f31565b5b808601614f0e8982614e3a565b85526020850194505050602081019050614ede565b5050509392505050565b600082601f830112614f4257614f41613f31565b5b8135614f52848260208601614ea6565b91505092915050565b600060208284031215614f7157614f70613d7d565b5b600082013567ffffffffffffffff811115614f8f57614f8e613d82565b5b614f9b84828501614f2d565b91505092915050565b600067ffffffffffffffff821115614fbf57614fbe613f3b565b5b602082029050602081019050919050565b6000614fe3614fde84614fa4565b613f9b565b9050808382526020820190506020840283018581111561500657615005614526565b5b835b8181101561502f578061501b88826141f1565b845260208401935050602081019050615008565b5050509392505050565b600082601f83011261504e5761504d613f31565b5b813561505e848260208601614fd0565b91505092915050565b60006020828403121561507d5761507c613d7d565b5b600082013567ffffffffffffffff81111561509b5761509a613d82565b5b6150a784828501615039565b91505092915050565b600060408201905081810360008301526150ca8185613ea2565b90506150d96020830184614434565b9392505050565b600080604083850312156150f7576150f6613d7d565b5b6000615105858286016141f1565b925050602083013567ffffffffffffffff81111561512657615125613d82565b5b61513285828601614038565b9150509250929050565b600060408201905081810360008301526151568185613ea2565b90506151656020830184613f07565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806151b357607f821691505b602082108114156151c7576151c661516c565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000615229602f83613e4d565b9150615234826151cd565b604082019050919050565b600060208201905081810360008301526152588161521c565b9050919050565b7f6e6f74206465706c6f7965720000000000000000000000000000000000000000600082015250565b6000615295600c83613e4d565b91506152a08261525f565b602082019050919050565b600060208201905081810360008301526152c481615288565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546152f88161519b565b61530281866152cb565b9450600182166000811461531d576001811461532e57615361565b60ff19831686528186019350615361565b615337856152d6565b60005b838110156153595781548189015260018201915060208101905061533a565b838801955050505b50505092915050565b600061537582613e42565b61537f81856152cb565b935061538f818560208601613e5e565b80840191505092915050565b60006153a782856152eb565b91506153b3828461536a565b91508190509392505050565b7f2200000000000000000000000000000000000000000000000000000000000000815250565b60006153f0826153bf565b600182019150615400828461536a565b915061540b826153bf565b60018201915081905092915050565b7f2000000000000000000000000000000000000000000000000000000000000000815250565b600061544c828761536a565b91506154578261541a565b600182019150615467828661536a565b91506154728261541a565b600182019150615482828561536a565b915061548e828461536a565b915081905095945050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006154d2601883613e4d565b91506154dd8261549c565b602082019050919050565b60006020820190508181036000830152615501816154c5565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000615564602983613e4d565b915061556f82615508565b604082019050919050565b6000602082019050818103600083015261559381615557565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f7369676e44617461206861732065787069726564000000000000000000000000600082015250565b60006155ff601483613e4d565b915061560a826155c9565b602082019050919050565b6000602082019050818103600083015261562e816155f2565b9050919050565b6000615641828561536a565b915061564d828461536a565b91508190509392505050565b7f70726564696361746520756e646566696e656400000000000000000000000000600082015250565b600061568f601383613e4d565b915061569a82615659565b602082019050919050565b600060208201905081810360008301526156be81615682565b9050919050565b60006156d1828461536a565b915081905092915050565b7f616c726561647920657869737400000000000000000000000000000000000000600082015250565b6000615712600d83613e4d565b915061571d826156dc565b602082019050919050565b6000602082019050818103600083015261574181615705565b9050919050565b6000615754828661536a565b9150615760828561536a565b915061576c828461536a565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006157b382613efd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156157e6576157e5615779565b5b600182019050919050565b7f7369676e44617461206e6f742066726f6d2073696e6765720000000000000000600082015250565b6000615827601883613e4d565b9150615832826157f1565b602082019050919050565b600060208201905081810360008301526158568161581a565b9050919050565b7f73656d617469632f6d6574616461746100000000000000000000000000000000815250565b600061588f828461536a565b915061589a8261585d565b60108201915081905092915050565b50565b60006158b9600083613e4d565b91506158c4826158a9565b600082019050919050565b600060208201905081810360008301526158e8816158ac565b9050919050565b7f7072656469636174652063616e206e6f7420656d707479000000000000000000600082015250565b6000615925601783613e4d565b9150615930826158ef565b602082019050919050565b6000602082019050818103600083015261595481615918565b9050919050565b6000602082019050615970600083018461429b565b92915050565b7f707265646963617465547970652063616e206e6f7420656d7074790000000000600082015250565b60006159ac601b83613e4d565b91506159b782615976565b602082019050919050565b600060208201905081810360008301526159db8161599f565b9050919050565b7f636c6173732063616e206e6f7420656d70747900000000000000000000000000600082015250565b6000615a18601383613e4d565b9150615a23826159e2565b602082019050919050565b60006020820190508181036000830152615a4781615a0b565b9050919050565b7f636c61737320616c726561647920657869737400000000000000000000000000600082015250565b6000615a84601383613e4d565b9150615a8f82615a4e565b602082019050919050565b60006020820190508181036000830152615ab381615a77565b9050919050565b7f6e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b6000615af0600983613e4d565b9150615afb82615aba565b602082019050919050565b60006020820190508181036000830152615b1f81615ae3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600081905092915050565b6000615b7682615b55565b615b808185615b60565b9350615b90818560208601613e5e565b80840191505092915050565b6000819050919050565b615bb7615bb2826140af565b615b9c565b82525050565b6000615bc98285615b6b565b9150615bd58284615ba6565b6020820191508190509392505050565b615bee81614682565b82525050565b6000608082019050615c096000830187614112565b615c166020830186615be5565b615c236040830185614112565b615c306060830184614112565b95945050505050565b7f6e6f742068617665207065726d697373696f6e00000000000000000000000000600082015250565b6000615c6f601383613e4d565b9150615c7a82615c39565b602082019050919050565b60006020820190508181036000830152615c9e81615c62565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615cdb6017836152cb565b9150615ce682615ca5565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000615d276011836152cb565b9150615d3282615cf1565b601182019050919050565b6000615d4882615cce565b9150615d54828561536a565b9150615d5f82615d1a565b9150615d6b828461536a565b91508190509392505050565b6000615d8282613efd565b9150615d8d83613efd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615dc257615dc1615779565b5b828201905092915050565b6000615dd882613efd565b9150615de383613efd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615e1c57615e1b615779565b5b828202905092915050565b6000615e3282613efd565b91506000821415615e4657615e45615779565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000615e87602083613e4d565b9150615e9282615e51565b602082019050919050565b60006020820190508181036000830152615eb681615e7a565b9050919050565b6000615ec882613efd565b9150615ed383613efd565b925082821015615ee657615ee5615779565b5b82820390509291505056fe307830303030303030303030303030303030303030303030303030303030303030303030303030303030307830303030303030303030303030303030303030303030303030303030303030303030303030303031a264697066735822122083767feeb5688eccc4ed38c2b5b4218112a70a320cf27e2e74f4cc19dea4438d64736f6c634300080c0033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.