Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0.02222 ETH
Eth Value
$55.49 (@ $2,497.33/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 173 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint | 14637422 | 1040 days ago | IN | 0.02222 ETH | 0.0055415 | ||||
Withdraw | 14534268 | 1056 days ago | IN | 0 ETH | 0.0015832 | ||||
Mint | 14495941 | 1062 days ago | IN | 0.02222 ETH | 0.00498172 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 | ||||
Mint | 14495841 | 1062 days ago | IN | 0.02222 ETH | 0.00551295 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Blouns
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 100 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/interfaces/IERC2981.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "base64-sol/base64.sol"; interface ProxyRegistry { function proxies(address) external view returns (address); } contract Blouns is ERC721, IERC2981, Ownable { using Strings for uint256; ProxyRegistry public immutable proxyRegistry; string private _contractCID; mapping(uint256 => address) private _minter; uint256 public totalSupply; constructor(string memory contractCID) ERC721("Blouns", "BLOUN") { proxyRegistry = ProxyRegistry(0xa5409ec958C83C3f309868babACA7c86DCB077c1); //wyvernproxyregistry.eth _contractCID = contractCID; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } function contractURI() public view returns (string memory) { return string(abi.encodePacked('ipfs://', _contractCID)); } function setContractURI(string memory newContractCID) external onlyOwner { _contractCID = newContractCID; } function isApprovedForAll(address owner, address operator) override(ERC721) public view returns (bool) { if (proxyRegistry.proxies(owner) == operator) return true; return super.isApprovedForAll(owner, operator); } function minter(uint256 tokenId) public view returns (address) { require(_exists(tokenId), "URI query for nonexistent token"); while (_minter[tokenId] == address(0)) tokenId--; return _minter[tokenId]; } function tokenURI(uint256 tokenId) override public view returns (string memory) { address tokenMinter = minter(tokenId); // string[241] memory colors = ['000000', '00499C', '0079FC', '009C59', '00A556', '00FCFF', '018146', '027C92', '027EE6', '0385EB', '049D43', '068940', '0ADC4D', '0B5027', '1929F4', '1E3445', '1F1D29', '235476', '254EFB', '257CED', '26B1F3', '27A463', '2A86FD', '2B2834', '2B83F6', '2BB26B', '343235', '34AC80', '375DFC', '38DD56', '395ED1', '3A085B', '3F9323', '410D66', '4243F8', '42FFB0', '45FAFF', '49B38B', '4A5358', '4B4949', '4B65F7', '4BEA69', '4D271B', '505A5C', '535A15', '552D1D', '552E05', '554543', '555353', '5648ED', '58565C', '5A423F', '5A65FA', '5A6B7B', '5C25FB', '5D3500', '5D6061', '5FD4FB', '604666', '62616D', '63A0F9', '648DF9', '667AF9', '67B1E3', '6B3F39', '6B7212', '6E3206', '6F597A', '70E890', '71BDE4', '74580D', '757576', '767C0E', '76858B', '769CA9', '7CC4F2', '7D635E', '7E5243', '807F7E', '80A72D', '834398', '85634F', '867C1D', '876F69', '87E4D9', '8BC0C5', '8DD122', '8F785E', '903707', '909B0E', '962236', '97F2FB', '99E6DE', '9CB4B8', '9D8E6E', '9EB5E1', '9F21A0', '9F4B27', 'A19C9A', 'A28EF4', 'A38654', 'A3BAED', 'A3EFD0', 'A86F60', 'AA940C', 'AAA6A4', 'AB36BE', 'ABAAA8', 'ABF131', 'ADC8CC', 'AE3208', 'AE6C0A', 'B19E00', 'B2958D', 'B2A8A5', 'B87B11', 'B8CED2', 'B9185C', 'B91B43', 'B92B3C', 'BD2D24', 'C16710', 'C16923', 'C3A199', 'C4DA53', 'C5030E', 'C54E38', 'C5B9A1', 'CAA26A', 'CAEFF9', 'CBC1BC', 'CC0595', 'CD916D', 'CEC189', 'CFC2AB', 'CFC9B8', 'D08B11', 'D0AEA9', 'D18687', 'D19A54', 'D22209', 'D26451', 'D29607', 'D31E14', 'D32A09', 'D4A015', 'D4B7B2', 'D4CFC0', 'D56333', 'D596A6', 'D5D7E1', 'D62149', 'D6C3BE', 'D7D3CD', 'D8DADF', 'D9391F', 'DA42CB', 'DB8323', 'DCD8D3', 'DF2C39', 'E11833', 'E1D7D5', 'E2C8C0', 'E4A499', 'E4AFA3', 'E5E5DE', 'E7A32C', 'E8705B', 'E8E8E2', 'E9265C', 'E9BA12', 'EAB118', 'EC5B43', 'EEB78C', 'EED811', 'EEDC00', 'EFAD81', 'EFF2FA', 'F20422', 'F3322C', 'F38B7C', 'F39713', 'F39D44', 'F59B34', 'F5FCFF', 'F681E6', 'F71248', 'F78A18', 'F7913D', 'F82905', 'F83001', 'F86100', 'F89865', 'F8CE47', 'F8D689', 'F8DDB0', 'F938D8', 'F98F30', 'F9E8DD', 'F9F4E6', 'F9F5CB', 'F9F5E9', 'F9F6D1', 'FA5E20', 'FA6FE2', 'FB4694', 'FBC311', 'FBC800', 'FCCF25', 'FD8B5B', 'FDCEF2', 'FDE7F5', 'FDF008', 'FDF8FF', 'FE500C', 'FEB9D5', 'FEE3F3', 'FF0E0E', 'FF1A0B', 'FF1AD2', 'FF3A0E', 'FF638D', 'FF7216', 'FF82AD', 'FFA21E', 'FFAE1A', 'FFB913', 'FFC110', 'FFC5F0', 'FFC925', 'FFD067', 'FFE939', 'FFEF16', 'FFF006', 'FFF0BE', 'FFF0EE', 'FFF449', 'FFF671', 'FFFDF2', 'FFFDF4', 'FFFFFF']; string memory tokenString = tokenId.toString(); bytes memory image = '<svg width="2000" height="2000" version="1.1" xmlns="http://www.w3.org/2000/svg"><defs>'; uint256 layers = tokenId % 6 + 4; for (uint256 l = 0; l < layers; l++ ) { uint256 hash = uint256(keccak256(abi.encodePacked(tokenMinter, tokenId, l))); image = abi.encodePacked(image, '<radialGradient id="g', l.toString(), '" cx="0.', (1 + (hash >> 0) % 9).toString(),'" cy="0.', (1 + (hash >> 4) % 9).toString(), '" r="0.', (1 + (hash >> 8) % 9).toString()); image = abi.encodePacked(image, '" fx="0.', (6 + (hash >> 12) % 4).toString(), ((hash >> 14) % 9).toString(), '" fy="0.', (4 + (hash >> 18) % 6).toString(), ((hash >> 21) % 9).toString(), '" spreadMethod="', ['reflect', 'repeat', 'pad'][(hash >> 25) % 3], '">'); uint256 cs = (hash >> 27) % 3 + 2; for (uint256 c = 0; c < cs; c++) { image = abi.encodePacked(image, '<stop offset="', (100 - 100 / (c + 1)).toString() , '%" stop-color="#', colors[(hash >> (29 + c * 16)) % colors.length], l == 0 ? '' : ((hash >> (37 + c * 16)) % 9).toString(), l == 0 ? '' : ((hash >> (41 + c * 16)) % 9).toString(), '"/>'); } image = abi.encodePacked(image, '<stop offset="100%" stop-color="#', colors[(hash >> 29) % colors.length], (l == 0 ? '' : 'AA'), '"/></radialGradient>'); } uint256 hash2 = uint256(keccak256(abi.encodePacked(tokenMinter, tokenId))); string memory channel = ['R', 'G', 'B'][hash2 % 3]; image = abi.encodePacked(image, '</defs>', '<filter id="n"><feTurbulence baseFrequency="0.00', (1 + (hash2 >> 2) % 9).toString(),' 0.00', (1 + (hash2 >> 6) % 9).toString(),'" result="NOISE" numOctaves="3" /><feDisplacementMap in="SourceGraphic" in2="NOISE" scale="100" xChannelSelector="', channel, '" yChannelSelector="', channel, '"></feDisplacementMap></filter>', '<filter id="g" filterUnits="objectBoundingBox" x="-25%" y="-25%" width="150%" height="150%"><feTurbulence baseFrequency="0.1 0.1" result="NOISE" numOctaves="2" /><feDisplacementMap in="SourceGraphic" in2="NOISE" scale="0.66" xChannelSelector="R" yChannelSelector="B" result="tmp"></feDisplacementMap><feBlend in="tmp" in2="SourceGraphic" mode="overlay"/></filter>' ); for (uint256 l = 0; l < layers; l++) { uint256 hash = uint256(keccak256(abi.encodePacked(hash2, l))); image = abi.encodePacked(image, '<rect x="10%" y="9%" rx="', (250 + hash % 750).toString(), '" ry="', (250 + (hash >> 10) % 750).toString(), '" width="77%" height="77%" fill="url(#g', l.toString(), ')" filter="url(#n)"/>'); } image = abi.encodePacked(image, '<svg width="100%" height="100%" viewBox="-', (5 - (hash2 >> 18) % 3).toString(), ' -', (5 - (hash2 >> 20) % 3).toString(), ' 36 36" preserveAspectRatio="xMidYMid meet" filter="url(#g)">'); string[14] memory glassesColors = ['000000', 'd7d3cd', '2b83f6', '5648ed', '8dd122', '9cb4b8', 'e8705b', 'd19a54', 'b9185c', 'fe500c', 'f3322c', '4bea69', 'e8705b', 'ffef16']; string memory glassesPart1 = 'M11,12h2M18,12h2M11,13h2M18,13h2M11,14h2M18,14h2M11,15h2M18,15h2'; string memory glassesPart2 = 'M13,12h2M20,12h2M13,13h2M20,13h2M13,14h2M20,14h2M13,15h2M20,15h2'; uint256 glasses = (hash2 >> 22) % 21; if (glasses == 0) image = abi.encodePacked(image, '<path stroke="#ffc110" d="M10,11h6M10,12h1M15,12h1M10,13h1M15,13h1M7,14h1M10,14h1M15,14h1M7,15h1M10,15h1M15,15h1M10,16h6"/><path stroke="#f98f30" d="M17,11h6M17,12h1M22,12h1M17,13h1M22,13h1M17,14h1M22,14h1M17,15h1M22,15h1M17,16h6"/><path stroke="#ffffff" d="', glassesPart1, '"/><path stroke="#000000" d="', glassesPart2, '"/><path stroke="#f78a18" d="M7,13h3M16,13h1"/>'); else if (glasses == 1) image = abi.encodePacked(image, '<path stroke="#ff638d" d="M10,11h6M17,11h6M10,12h1M15,12h1M17,12h1M22,12h1M7,13h4M15,13h3M22,13h1M7,14h4M15,14h3M22,14h1M7,15h1M10,15h1M15,15h1M17,15h1M22,15h1M10,16h6M17,16h6"/><path stroke="#ffffff" d="', glassesPart1, '"/><path stroke="#000000" d="', glassesPart2, '"/>'); else if (glasses == 2) image = abi.encodePacked(image, '<path stroke="#000000" d="M10,11h6M17,11h6M10,12h1M13,12h3M17,12h1M20,12h3M7,13h4M13,13h5M20,13h3M7,14h1M10,14h1M13,14h3M17,14h1M20,14h3M7,15h1M10,15h1M13,15h3M17,15h1M20,15h3M10,16h6M17,16h6"/><path stroke="#ffffff" d="', glassesPart1, '"/>'); else if (glasses == 3) image = abi.encodePacked(image, '<path stroke="#000000" d="M10,11h6M17,11h6M10,12h3M14,12h2M17,12h3M21,12h2M7,13h16M7,14h1M10,14h1M12,14h2M15,14h1M17,14h1M19,14h2M22,14h1M7,15h1M10,15h6M17,15h6M10,16h6M17,16h6"/><path stroke="#ff0e0e" d="M13,12h1M20,12h1"/><path stroke="#0adc4d" d="M11,14h1M18,14h1"/><path stroke="#1929f4" d="M14,14h1M21,14h1"/>'); else if (glasses == 4) image = abi.encodePacked(image, '<path stroke="#000000" d="M10,11h6M17,11h6M10,12h4M15,12h1M17,12h4M22,12h1M7,13h7M15,13h6M22,13h1M7,14h1M10,14h6M17,14h6M7,15h1M10,15h6M17,15h6M10,16h6M17,16h6"/><path stroke="#ffffff" d="M14,12h1M21,12h1M14,13h1M21,13h1"/>'); else if (glasses <= 6) image = abi.encodePacked(image, '<path stroke="#', (glasses == 5 ? '068940' : 'ff638d'), '" d="M10,11h6M10,12h1M15,12h1M10,13h1M15,13h1M10,14h1M15,14h1M10,15h1M15,15h1M10,16h6"/><path stroke="#', (glasses == 5 ? '257ced' : 'cc0595'), '" d="M17,11h6M17,12h1M22,12h1M17,13h1M22,13h1M7,14h1M17,14h1M22,14h1M7,15h1M17,15h1M22,15h1M17,16h6"/><path stroke="#ffffff" d="', glassesPart1, '"/><path stroke="#000000" d="', glassesPart2, '"/><path stroke="#', (glasses == 5 ? '254efb' : 'ab36be'), '" d="M7,13h3M16,13h1"/>'); else image = abi.encodePacked(image, '<path stroke="#', glassesColors[glasses - 7], '" d="M10,11h6M17,11h6M10,12h1M15,12h1M17,12h1M22,12h1M7,13h4M15,13h3M22,13h1M7,14h1M10,14h1M15,14h1M17,14h1M22,14h1M7,15h1M10,15h1M15,15h1M17,15h1M22,15h1M10,16h6M17,16h6"/><path stroke="#', (glasses == 8 ? 'fdf8ff' : 'ffffff'), '" d="', glassesPart1, '"/><path stroke="#', (glasses == 7 ? 'ff0e0e' : '000000'), '" d="', glassesPart2, '"/>'); bytes memory color = abi.encodePacked( ((hash2 >> 42) % 3).toString(), ((hash2 >> 44) % 3).toString(), ((hash2 >> 46) % 3).toString(), ((hash2 >> 48) % 3).toString(), ((hash2 >> 50) % 3).toString(), ((hash2 >> 52) % 3).toString() ); for (uint256 i = 0; i < 2; i++) { image = abi.encodePacked(image, '<rect x="', (8 - i + (hash2 >> 27) % 6).toString(), '" y="', (20 - i + (hash2 >> 30) % 5).toString(), '" width="', (i == 1 ? 1 : 3 + (hash2 >> 33) % 3).toString(), '" height="1" transform="rotate(-', ((hash2 >> 35) % 2).toString(), '.', (1 + (hash2 >> 36) % 9).toString(), ',' ); image = abi.encodePacked(image, ((3 + (hash2 >> 40) % 3) / 2).toString(), ',0.5)" fill="#', color, '"/>' ); } image = abi.encodePacked(image, '</svg>', '</svg>' ); return string( abi.encodePacked( 'data:application/json;base64,', Base64.encode( bytes( abi.encodePacked('{"name":"Bloun ', tokenString, '", "description":"The beautiful on-chain Bloun was born, a CC0 tribute to the iconic Nouns project.", "image": "', 'data:image/svg+xml;base64,', Base64.encode(image), '", "attributes": {"trait_type": "Layers", "value": ', layers.toString(), '}}') ) ) ) ); } receive() external payable {} function mint(uint256 amount) external payable { uint256 supply = totalSupply; require(supply + amount <= 2222, "Max 2222 Blouns"); require(msg.value >= amount * 0.02222 ether, "Mint price 0.02222 ETH"); for (uint256 i = 0; i < amount; i++) { _mint(msg.sender, supply + i); } totalSupply = supply + amount; _minter[supply] = msg.sender; //one slot for all minted tokens } function royaltyInfo(uint256, uint256 _salePrice) override external view returns (address receiver, uint256 royaltyAmount) { receiver = address(this); royaltyAmount = _salePrice * 2222 / 100000; //2.222% } function withdraw(address token, uint256 amount) external { bool success; uint256 half = amount / 2; if (token == address(0)) { (success, ) = 0x908c5fBae8Dec9202d8fAF7cA0277E50b87ED03B.call{value: half}(""); require(success); (success, ) = 0x599b418AD25C7b11BFB6A9108bb03E0e0FF8e690.call{value: half}(""); require(success); } else { success = IERC20(token).transfer(0x908c5fBae8Dec9202d8fAF7cA0277E50b87ED03B, half); require(success); success = IERC20(token).transfer(0x599b418AD25C7b11BFB6A9108bb03E0e0FF8e690, half); require(success); } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides functions for encoding/decoding base64 library Base64 { string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; bytes internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000" hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000" hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000" hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE_ENCODE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { // read 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // write 4 characters mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and( input, 0x3F)))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } function decode(string memory _data) internal pure returns (bytes memory) { bytes memory data = bytes(_data); if (data.length == 0) return new bytes(0); require(data.length % 4 == 0, "invalid base64 decoder input"); // load the table into memory bytes memory table = TABLE_DECODE; // every 4 characters represent 3 bytes uint256 decodedLen = (data.length / 4) * 3; // add some extra buffer at the end required for the writing bytes memory result = new bytes(decodedLen + 32); assembly { // padding with '=' let lastBytes := mload(add(data, mload(data))) if eq(and(lastBytes, 0xFF), 0x3d) { decodedLen := sub(decodedLen, 1) if eq(and(lastBytes, 0xFFFF), 0x3d3d) { decodedLen := sub(decodedLen, 1) } } // set the actual output length mstore(result, decodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 4 characters at a time for {} lt(dataPtr, endPtr) {} { // read 4 characters dataPtr := add(dataPtr, 4) let input := mload(dataPtr) // write 3 bytes let output := add( add( shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)), shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))), add( shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)), and(mload(add(tablePtr, and( input , 0xFF))), 0xFF) ) ) mstore(resultPtr, shl(232, output)) resultPtr := add(resultPtr, 3) } } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol";
{ "optimizer": { "enabled": true, "runs": 100 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"contractCID","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistry","outputs":[{"internalType":"contract ProxyRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractCID","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200632b3803806200632b8339810160408190526200003491620001f9565b6040805180820182526006815265426c6f756e7360d01b602080830191825283518085019094526005845264212627aaa760d91b9084015281519192916200007f916000916200013d565b508051620000959060019060208401906200013d565b505050620000b2620000ac620000e760201b60201c565b620000eb565b73a5409ec958c83c3f309868babaca7c86dcb077c16080528051620000df9060079060208401906200013d565b505062000311565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200014b90620002d5565b90600052602060002090601f0160209004810192826200016f5760008555620001ba565b82601f106200018a57805160ff1916838001178555620001ba565b82800160010185558215620001ba579182015b82811115620001ba5782518255916020019190600101906200019d565b50620001c8929150620001cc565b5090565b5b80821115620001c85760008155600101620001cd565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156200020d57600080fd5b82516001600160401b03808211156200022557600080fd5b818501915085601f8301126200023a57600080fd5b8151818111156200024f576200024f620001e3565b604051601f8201601f19908116603f011681019083821181831017156200027a576200027a620001e3565b8160405282815288868487010111156200029357600080fd5b600093505b82841015620002b7578484018601518185018701529285019262000298565b82841115620002c95760008684830101525b98975050505050505050565b600181811c90821680620002ea57607f821691505b6020821081036200030b57634e487b7160e01b600052602260045260246000fd5b50919050565b608051615ff762000334600039600081816103ab01526134250152615ff76000f3fe60806040526004361061014f5760003560e01c8063938e3d7b116100b6578063b88d4fde1161006f578063b88d4fde146103cd578063c87b56dd146103ed578063e8a3d4851461040d578063e985e9c514610422578063f2fde38b14610442578063f3fef3a31461046257600080fd5b8063938e3d7b1461031157806395d89b4114610331578063a0712d6814610346578063a22cb46514610359578063ac8d856c14610379578063b50cbd9f1461039957600080fd5b80632a55205a116101085780632a55205a1461025057806342842e0e1461027e5780636352211e1461029e57806370a08231146102be578063715018a6146102de5780638da5cb5b146102f357600080fd5b806301ffc9a71461015b57806306fdde0314610190578063081812fc146101b2578063095ea7b3146101ea57806318160ddd1461020c57806323b872dd1461023057600080fd5b3661015657005b600080fd5b34801561016757600080fd5b5061017b610176366004614166565b610482565b60405190151581526020015b60405180910390f35b34801561019c57600080fd5b506101a56104ad565b60405161018791906141db565b3480156101be57600080fd5b506101d26101cd3660046141ee565b61053f565b6040516001600160a01b039091168152602001610187565b3480156101f657600080fd5b5061020a61020536600461421c565b6105cc565b005b34801561021857600080fd5b5061022260095481565b604051908152602001610187565b34801561023c57600080fd5b5061020a61024b366004614248565b6106dc565b34801561025c57600080fd5b5061027061026b366004614289565b61070d565b6040516101879291906142ab565b34801561028a57600080fd5b5061020a610299366004614248565b610733565b3480156102aa57600080fd5b506101d26102b93660046141ee565b61074e565b3480156102ca57600080fd5b506102226102d93660046142c4565b6107c5565b3480156102ea57600080fd5b5061020a61084c565b3480156102ff57600080fd5b506006546001600160a01b03166101d2565b34801561031d57600080fd5b5061020a61032c36600461436d565b610882565b34801561033d57600080fd5b506101a56108c3565b61020a6103543660046141ee565b6108d2565b34801561036557600080fd5b5061020a6103743660046143c4565b6109da565b34801561038557600080fd5b506101d26103943660046141ee565b6109e5565b3480156103a557600080fd5b506101d27f000000000000000000000000000000000000000000000000000000000000000081565b3480156103d957600080fd5b5061020a6103e83660046143fd565b610a86565b3480156103f957600080fd5b506101a56104083660046141ee565b610abe565b34801561041957600080fd5b506101a56133d7565b34801561042e57600080fd5b5061017b61043d36600461447d565b6133ff565b34801561044e57600080fd5b5061020a61045d3660046142c4565b6134d7565b34801561046e57600080fd5b5061020a61047d36600461421c565b613572565b60006001600160e01b0319821663152a902d60e11b14806104a757506104a782613789565b92915050565b6060600080546104bc906144ab565b80601f01602080910402602001604051908101604052809291908181526020018280546104e8906144ab565b80156105355780601f1061050a57610100808354040283529160200191610535565b820191906000526020600020905b81548152906001019060200180831161051857829003601f168201915b5050505050905090565b600061054a826137d9565b6105b05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105d78261074e565b9050806001600160a01b0316836001600160a01b0316036106445760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105a7565b336001600160a01b0382161480610660575061066081336133ff565b6106cd5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016105a7565b6106d783836137f6565b505050565b6106e63382613864565b6107025760405162461bcd60e51b81526004016105a7906144e5565b6106d783838361392e565b306000620186a0610720846108ae61454c565b61072a9190614581565b90509250929050565b6106d783838360405180602001604052806000815250610a86565b6000818152600260205260408120546001600160a01b0316806104a75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105a7565b60006001600160a01b0382166108305760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105a7565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146108765760405162461bcd60e51b81526004016105a790614595565b6108806000613ace565b565b6006546001600160a01b031633146108ac5760405162461bcd60e51b81526004016105a790614595565b80516108bf9060079060208401906140b7565b5050565b6060600180546104bc906144ab565b6009546108ae6108e283836145ca565b11156109225760405162461bcd60e51b815260206004820152600f60248201526e4d6178203232323220426c6f756e7360881b60448201526064016105a7565b61093382664ef0f8e6e8c00061454c565b34101561097b5760405162461bcd60e51b815260206004820152601660248201527509ad2dce840e0e4d2c6ca40605c6064646464408aa8960531b60448201526064016105a7565b60005b828110156109ab576109993361099483856145ca565b613b20565b806109a3816145e2565b91505061097e565b506109b682826145ca565b600955600090815260086020526040902080546001600160a01b0319163317905550565b6108bf338383613c53565b60006109f0826137d9565b610a3c5760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e0060448201526064016105a7565b6000828152600860205260409020546001600160a01b0316610a6a5781610a62816145fb565b925050610a3c565b506000908152600860205260409020546001600160a01b031690565b610a903383613864565b610aac5760405162461bcd60e51b81526004016105a7906144e5565b610ab884848484613d1d565b50505050565b60606000610acb836109e5565b60408051611e60810182526006611e2082018181526503030303030360d41b611e408401528252825180840184528181526530303439394360d01b60208281019190915280840191909152835180850185528281526530303739464360d01b8183015283850152835180850185528281526530303943353960d01b81830152606084015283518085018552828152651818209a9a9b60d11b818301526080840152835180850185528281526518182321a32360d11b8183015260a0840152835180850185528281526518189c189a1b60d11b8183015260c0840152835180850185528281526518191ba19c9960d11b8183015260e0840152835180850185528281526518191ba2a29b60d11b81830152610100840152835180850185528281526518199c1aa2a160d11b81830152610120840152835180850185528281526530343944343360d01b81830152610140840152835180850185528281526503036383934360d41b8183015261016084015283518085018552828152650c105110cd1160d21b81830152610180840152835180850185528281526530423530323760d01b818301526101a084015283518085018552828152650c4e4c8e518d60d21b818301526101c0840152835180850185528281526531453334343560d01b818301526101e0840152835180850185528281526531463144323960d01b81830152610200840152835180850185528281526519199a9a1b9b60d11b818301526102208401528351808501855282815265191a9a22a32160d11b8183015261024084015283518085018552828152650c8d4dd0d15160d21b81830152610260840152835180850185528281526532364231463360d01b81830152610280840152835180850185528281526532374134363360d01b818301526102a084015283518085018552828152650c904e0d919160d21b818301526102c084015283518085018552828152650c908c8e0ccd60d21b818301526102e0840152835180850185528281526519211c19a31b60d11b818301526103008401528351808501855282815265192121191b2160d11b81830152610320840152835180850185528281526533343332333560d01b81830152610340840152835180850185528281526503334414338360d41b81830152610360840152835180850185528281526533373544464360d01b818301526103808401528351808501855282815265199c22221a9b60d11b818301526103a0840152835180850185528281526533393545443160d01b818301526103c0840152835180850185528281526519a0981c1aa160d11b818301526103e0840152835180850185528281526533463933323360d01b8183015261040084015283518085018552828152651a1898221b1b60d11b8183015261042084015283518085018552828152650686468668c760d31b81830152610440840152835180850185528281526503432464642360d41b8183015261046084015283518085018552828152651a1aa320a32360d11b8183015261048084015283518085018552828152651a1ca1199c2160d11b818301526104a08401528351808501855282815265068826a666a760d31b818301526104c0840152835180850185528281526534423439343960d01b818301526104e0840152835180850185528281526534423635463760d01b81830152610500840152835180850185528281526534424541363960d01b8183015261052084015283518085018552828152651a22191b98a160d11b81830152610540840152835180850185528281526535303541354360d01b81830152610560840152835180850185528281526535333541313560d01b8183015261058084015283518085018552828152650d4d4c910c5160d21b818301526105a0840152835180850185528281526535353245303560d01b818301526105c0840152835180850185528281526535353435343360d01b818301526105e0840152835180850185528281526535353533353360d01b8183015261060084015283518085018552828152650d4d8d0e115160d21b81830152610620840152835180850185528281526535383536354360d01b8183015261064084015283518085018552828152651aa09a1919a360d11b81830152610660840152835180850185528281526535413635464160d01b8183015261068084015283518085018552828152651aa09b211ba160d11b818301526106a084015283518085018552828152651aa1991aa32160d11b818301526106c0840152835180850185528281526503544333530360d41b818301526106e0840152835180850185528281526535443630363160d01b8183015261070084015283518085018552828152651aa3221a232160d11b8183015261072084015283518085018552828152651b181a1b1b1b60d11b8183015261074084015283518085018552828152650d8c8d8c4d9160d21b81830152610760840152835180850185528281526536334130463960d01b81830152610780840152835180850185528281526536343844463960d01b818301526107a0840152835180850185528281526536363741463960d01b818301526107c0840152835180850185528281526536374231453360d01b818301526107e0840152835180850185528281526536423346333960d01b8183015261080084015283518085018552828152651b211b99189960d11b8183015261082084015283518085018552828152651b229999181b60d11b81830152610840840152835180850185528281526536463539374160d01b81830152610860840152835180850185528281526503730453839360d41b8183015261088084015283518085018552828152650dcc5091114d60d21b818301526108a084015283518085018552828152650dcd0d4e0c1160d21b818301526108c084015283518085018552828152651b9a9b9a9b9b60d11b818301526108e0840152835180850185528281526537363743304560d01b8183015261090084015283518085018552828152651b9b1c1a9c2160d11b81830152610920840152835180850185528281526537363943413960d01b8183015261094084015283518085018552828152651ba1a19a231960d11b81830152610960840152835180850185528281526537443633354560d01b81830152610980840152835180850185528281526537453532343360d01b818301526109a0840152835180850185528281526538303746374560d01b818301526109c084015283518085018552828152650e0c104dcc9160d21b818301526109e0840152835180850185528281526507066686672760d31b81830152610a0084015283518085018552828152651c1a9b199a2360d11b81830152610a2084015283518085018552828152650e0d8dd0cc5160d21b81830152610a40840152835180850185528281526538373646363960d01b81830152610a60840152835180850185528281526538374534443960d01b81830152610a80840152835180850185528281526538424330433560d01b81830152610aa084015283518085018552828152651c222218991960d11b81830152610ac0840152835180850185528281526538463738354560d01b81830152610ae0840152835180850185528281526539303337303760d01b81830152610b00840152835180850185528281526539303942304560d01b81830152610b2084015283518085018552828152651c9b1919199b60d11b81830152610b4084015283518085018552828152651c9ba319232160d11b81830152610b60840152835180850185528281526539394536444560d01b81830152610b80840152835180850185528281526507286846884760d31b81830152610ba0840152835180850185528281526539443845364560d01b81830152610bc0840152835180850185528281526539454235453160d01b81830152610be0840152835180850185528281526503946323141360d41b81830152610c00840152835180850185528281526539463442323760d01b81830152610c20840152835180850185528281526541313943394160d01b81830152610c408401528351808501855282815265104c8e11518d60d21b81830152610c608401528351808501855282815265104cce0d8d4d60d21b81830152610c808401528351808501855282815265104cd090515160d21b81830152610ca0840152835180850185528281526504133454644360d41b81830152610cc0840152835180850185528281526504138364636360d41b81830152610ce0840152835180850185528281526541413934304360d01b81830152610d0084015283518085018552828152651050504d904d60d21b81830152610d20840152835180850185528281526541423336424560d01b81830152610d40840152835180850185528281526508284828282760d31b81830152610d60840152835180850185528281526541424631333160d01b81830152610d80840152835180850185528281526541444338434360d01b81830152610da084015283518085018552828152650828a666460760d31b81830152610dc0840152835180850185528281526541453643304160d01b81830152610de0840152835180850185528281526504231394530360d41b81830152610e008401528351808501855282815265108c8e4d4e1160d21b81830152610e20840152835180850185528281526542324138413560d01b81830152610e40840152835180850185528281526542383742313160d01b81830152610e608401528351808501855282815265211c21a2a21960d11b81830152610e80840152835180850185528281526542393138354360d01b81830152610ea0840152835180850185528281526542393142343360d01b81830152610ec0840152835180850185528281526542393242334360d01b81830152610ee0840152835180850185528281526510910c910c8d60d21b81830152610f00840152835180850185528281526504331363731360d41b81830152610f20840152835180850185528281526543313639323360d01b81830152610f40840152835180850185528281526543334131393960d01b81830152610f60840152835180850185528281526543344441353360d01b81830152610f80840152835180850185528281526543353033304560d01b81830152610fa084015283518085018552828152650866a688a66760d31b81830152610fc0840152835180850185528281526543354239413160d01b81830152610fe0840152835180850185528281526543414132364160d01b81830152611000840152835180850185528281526543414546463960d01b81830152611020840152835180850185528281526543424331424360d01b81830152611040840152835180850185528281526543433035393560d01b81830152611060840152835180850185528281526510d10e4c4d9160d21b81830152611080840152835180850185528281526543454331383960d01b818301526110a0840152835180850185528281526521a3219920a160d11b818301526110c084015283518085018552828152650868c867284760d31b818301526110e0840152835180850185528281526544303842313160d01b81830152611100840152835180850185528281526544304145413960d01b81830152611120840152835180850185528281526544313836383760d01b818301526111408401528351808501855282815265110c4e504d4d60d21b81830152611160840152835180850185528281526544323232303960d01b81830152611180840152835180850185528281526544323634353160d01b818301526111a0840152835180850185528281526544323936303760d01b818301526111c08401528351808501855282815265110ccc514c4d60d21b818301526111e0840152835180850185528281526544333241303960d01b81830152611200840152835180850185528281526544344130313560d01b818301526112208401528351808501855282815265221a211ba11960d11b81830152611240840152835180850185528281526504434434643360d41b81830152611260840152835180850185528281526544353633333360d01b818301526112808401528351808501855282815265221a9c9b209b60d11b818301526112a0840152835180850185528281526544354437453160d01b818301526112c0840152835180850185528281526544363231343960d01b818301526112e0840152835180850185528281526544364333424560d01b818301526113008401528351808501855282815265110dd10cd0d160d21b818301526113208401528351808501855282815265221c2220a22360d11b818301526113408401528351808501855282815265221c999c98a360d11b81830152611360840152835180850185528281526522209a1921a160d11b81830152611380840152835180850185528281526544423833323360d01b818301526113a0840152835180850185528281526544434438443360d01b818301526113c0840152835180850185528281526544463243333960d01b818301526113e0840152835180850185528281526545313138333360d01b81830152611400840152835180850185528281526545314437443560d01b81830152611420840152835180850185528281526504532433843360d41b81830152611440840152835180850185528281526545344134393960d01b81830152611460840152835180850185528281526545344146413360d01b81830152611480840152835180850185528281526545354535444560d01b818301526114a0840152835180850185528281526545374133324360d01b818301526114c08401528351808501855282815265229c1b981aa160d11b818301526114e08401528351808501855282815265229c229c229960d11b81830152611500840152835180850185528281526545393236354360d01b818301526115208401528351808501855282815265229ca120989960d11b81830152611540840152835180850185528281526508a82846262760d31b81830152611560840152835180850185528281526545433542343360d01b81830152611580840152835180850185528281526545454237384360d01b818301526115a0840152835180850185528281526545454438313160d01b818301526115c0840152835180850185528281526504545444330360d41b818301526115e0840152835180850185528281526545464144383160d01b81830152611600840152835180850185528281526545464632464160d01b8183015261162084015283518085018552828152652319181a191960d11b81830152611640840152835180850185528281526546333332324360d01b81830152611660840152835180850185528281526546333842374360d01b81830152611680840152835180850185528281526546333937313360d01b818301526116a08401528351808501855282815265118cce510d0d60d21b818301526116c08401528351808501855282815265118d4e508ccd60d21b818301526116e08401528351808501855282815265231aa321a32360d11b818301526117008401528351808501855282815265231b1c18a29b60d11b81830152611720840152835180850185528281526508c6e626468760d31b81830152611740840152835180850185528281526508c6e708262760d31b818301526117608401528351808501855282815265118dce4c4cd160d21b81830152611780840152835180850185528281526546383239303560d01b818301526117a0840152835180850185528281526546383330303160d01b818301526117c0840152835180850185528281526504638363130360d41b818301526117e0840152835180850185528281526546383938363560d01b81830152611800840152835180850185528281526546384345343760d01b81830152611820840152835180850185528281526546384436383960d01b81830152611840840152835180850185528281526504638444442360d41b81830152611860840152835180850185528281526508c72667088760d31b81830152611880840152835180850185528281526504639384633360d41b818301526118a08401528351808501855282815265118e514e111160d21b818301526118c08401528351808501855282815265231ca31a229b60d11b818301526118e08401528351808501855282815265231ca31aa1a160d11b81830152611900840152835180850185528281526546394635453960d01b81830152611920840152835180850185528281526546394636443160d01b81830152611940840152835180850185528281526504641354532360d41b81830152611960840152835180850185528281526523209b23229960d11b81830152611980840152835180850185528281526511908d0d8e4d60d21b818301526119a0840152835180850185528281526546424333313160d01b818301526119c0840152835180850185528281526504642433830360d41b818301526119e0840152835180850185528281526546434346323560d01b81830152611a00840152835180850185528281526523221c211aa160d11b81830152611a208401528351808501855282815265232221a2a31960d11b81830152611a40840152835180850185528281526546444537463560d01b81830152611a60840152835180850185528281526508c888c6060760d31b81830152611a8084015283518085018552828152652322231c232360d11b81830152611aa0840152835180850185528281526546453530304360d01b81830152611ac0840152835180850185528281526546454239443560d01b81830152611ae0840152835180850185528281526546454533463360d01b81830152611b00840152835180850185528281526546463045304560d01b81830152611b208401528351808501855282815265232318a0982160d11b81830152611b408401528351808501855282815265232318a0a21960d11b81830152611b60840152835180850185528281526546463341304560d01b81830152611b80840152835180850185528281526511918d8cce1160d21b81830152611ba0840152835180850185528281526523231b99189b60d11b81830152611bc0840152835180850185528281526511918e0c905160d21b81830152611be0840152835180850185528281526546464132314560d01b81830152611c00840152835180850185528281526546464145314160d01b81830152611c20840152835180850185528281526546464239313360d01b81830152611c40840152835180850185528281526504646433131360d41b81830152611c60840152835180850185528281526504646433546360d41b81830152611c80840152835180850185528281526546464339323560d01b81830152611ca0840152835180850185528281526546464430363760d01b81830152611cc0840152835180850185528281526546464539333960d01b81830152611ce08401528351808501855282815265232322a3189b60d11b81830152611d00840152835180850185528281526523232318181b60d11b81830152611d20840152835180850185528281526546464630424560d01b81830152611d40840152835180850185528281526546464630454560d01b81830152611d60840152835180850185528281526546464634343960d01b81830152611d80840152835180850185528281526546464636373160d01b81830152611da0840152835180850185528281526523232322231960d11b81830152611dc0840152835180850185528281526511919191118d60d21b81830152611de084015283518085019094529083526523232323232360d11b90830152611e00810191909152909150600061272385613d50565b90506000604051806080016040528060578152602001615e6b605791399050600061274f600688614612565b61275a9060046145ca565b905060005b81811015612b1d576040516001600160601b0319606088901b16602082015260348101899052605481018290526000906074016040516020818303038152906040528051906020012060001c9050836127b783613d50565b6127d56127c5600985614612565b6127d09060016145ca565b613d50565b6127e76127c56009600487901c614612565b6127f96127c56009600888901c614612565b60405160200161280d959493929190614642565b60408051601f1981840301815291905293508361283d6128326004600c85901c614612565b6127d09060066145ca565b61284f6127d06009600e86901c614612565b61286c6128616006601287901c614612565b6127d09060046145ca565b61287e6127d06009601588901c614612565b6040518060600160405280604051806040016040528060078152602001661c99599b1958dd60ca1b8152508152602001604051806040016040528060068152602001651c995c19585d60d21b8152508152602001604051806040016040528060038152602001621c185960ea1b8152508152506003601988901c6129029190614612565b600381106129125761291261470f565b602002015160405160200161292c96959493929190614725565b60408051601f198184030181529190529350600061294f6003601b84901c614612565b61295a9060026145ca565b905060005b81811015612a87578561298c6129768360016145ca565b612981906064614581565b6127d09060646147fb565b8960f161299a85601061454c565b6129a590601d6145ca565b87901c6129b29190614612565b60f181106129c2576129c261470f565b602002015186156129fa576129f560096129dd86601061454c565b6129e89060256145ca565b88901c6127d09190614612565b612a0b565b604051806020016040528060008152505b8715612a3e57612a396009612a2187601061454c565b612a2c9060296145ca565b89901c6127d09190614612565b612a4f565b604051806020016040528060008152505b604051602001612a63959493929190614812565b60405160208183030381529060405295508080612a7f906145e2565b91505061295f565b508487612a9960f1601d86901c614612565b60f18110612aa957612aa961470f565b60200201518415612ad45760405180604001604052806002815260200161414160f01b815250612ae5565b604051806020016040528060008152505b604051602001612af7939291906148cb565b604051602081830303815290604052945050508080612b15906145e2565b91505061275f565b506040516001600160601b0319606087901b1660208201526034810188905260009060540160408051601f19818403018152828252805160209182012060a084018352600160608501818152602960f91b6080870152855283518085018552818152604760f81b818501528584015283518085018552908152602160f91b92810192909252918301529150600090612bb6600384614612565b60038110612bc657612bc661470f565b6020020151905083612be06127c56009600286901c614612565b612bf26127c56009600687901c614612565b8384604051602001612c08959493929190614966565b604051602081830303815290604052935060005b83811015612cbb576040805160208082018690528183018490528251808303840181526060909201909252805191012085612c67612c5c6102ee84614612565b6127d09060fa6145ca565b612c7a612c5c6102ee600a86901c614612565b612c8385613d50565b604051602001612c969493929190614cc5565b6040516020818303038152906040529550508080612cb3906145e2565b915050612c1c565b5083612cda612ccf6003601286901c614612565b6127d09060056147fb565b612cec612ccf6003601487901c614612565b604051602001612cfe93929190614db2565b60408051601f198184030181526102008301825260066101c084018181526503030303030360d41b6101e086015284528251808401845281815265190dd90cd8d960d21b60208281019190915285810191909152835180850185528281526519311c19b31b60d11b818301528585015283518085018552828152650d4d8d0e195960d21b8183015260608087019190915284518086018652838152651c323218991960d11b8184015260808701528451808601865283815265072c6c468c4760d31b8184015260a08701528451808601865283815265329c1b981ab160d11b81840181905260c08801919091528551808701875284815265190c4e584d4d60d21b8185015260e0880152855180870187528481526562393138356360d01b81850152610100880152855180870187528481526566653530306360d01b81850152610120880152855180870187528481526566333332326360d01b81850152610140880152855180870187528481526534626561363960d01b8185015261016088015285518087018752848152808401919091526101808701528451808601865292835265333332b3189b60d11b838301526101a0860192909252835191820184528382529197506000929091615f429083013990506000604051806060016040528060408152602001615f826040913990506000612f016015601688901c614612565b905080600003612f3657878383604051602001612f2093929190614e92565b6040516020818303038152906040529750613187565b80600103612f5357878383604051602001612f2093929190615063565b80600203612f6e578783604051602001612f209291906151d2565b80600303612f875787604051602001612f20919061530d565b80600403612fa05787604051602001612f209190615495565b600681116130a4578781600514612fd5576040518060400160405280600681526020016519998d8cce1960d21b815250612ff5565b6040518060400160405280600681526020016503036383934360d41b8152505b82600514613021576040518060400160405280600681526020016563633035393560d01b815250613041565b604051806040016040528060068152602001650c8d4dd8d95960d21b8152505b85858560051461306f576040518060400160405280600681526020016561623336626560d01b81525061308f565b60405180604001604052806006815260200165191a9a32b33160d11b8152505b604051602001612f20969594939291906155a8565b87846130b16007846147fb565b600e81106130c1576130c161470f565b6020020151826008146130f2576040518060400160405280600681526020016533333333333360d11b815250613112565b604051806040016040528060068152602001653332331c333360d11b8152505b858460071461313f576040518060400160405280600681526020016503030303030360d41b81525061315f565b6040518060400160405280600681526020016566663065306560d01b8152505b86604051602001613175969594939291906157aa565b60405160208183030381529060405297505b600061319b6127d06003602a8a901c614612565b6131ad6127d06003602c8b901c614612565b6131bf6127d06003602e8c901c614612565b6131d16127d0600360308d901c614612565b6131e36127d0600360328e901c614612565b6131f56127d0600360348f901c614612565b60405160200161320a96959493929190615917565b604051602081830303815290604052905060005b6002811015613346578961324f61323a6006601b8c901c614612565b6132458460086147fb565b6127d091906145ca565b61326c6132616005601e8d901c614612565b6132458560146147fb565b6132988460011461329157613286600360218e901c614612565b6127d09060036145ca565b6001613d50565b6132aa6127d0600260238f901c614612565b6132be600960248f901c6127c59190614612565b6040516020016132d396959493929190615996565b60408051601f1981840301815291905299508961330f60026132fa600360288d901c614612565b6133059060036145ca565b6127d09190614581565b8360405160200161332293929190615a88565b6040516020818303038152906040529950808061333e906145e2565b91505061321e565b50886040516020016133589190615af5565b60405160208183030381529060405298506133a58a6133768b613e51565b61337f8b613d50565b60405160200161339193929190615b27565b604051602081830303815290604052613e51565b6040516020016133b59190615c8b565b6040516020818303038152906040529c50505050505050505050505050919050565b606060076040516020016133eb9190615cd0565b604051602081830303815290604052905090565b60405163c455279160e01b81526001600160a01b038381166004830152600091818416917f0000000000000000000000000000000000000000000000000000000000000000169063c455279190602401602060405180830381865afa15801561346c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134909190615d84565b6001600160a01b0316036134a6575060016104a7565b6001600160a01b0380841660009081526005602090815260408083209386168352929052205460ff165b9392505050565b6006546001600160a01b031633146135015760405162461bcd60e51b81526004016105a790614595565b6001600160a01b0381166135665760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a7565b61356f81613ace565b50565b600080613580600284614581565b90506001600160a01b0384166136675760405173908c5fbae8dec9202d8faf7ca0277e50b87ed03b908290600081818185875af1925050503d80600081146135e4576040519150601f19603f3d011682016040523d82523d6000602084013e6135e9565b606091505b505080925050816135f957600080fd5b60405173599b418ad25c7b11bfb6a9108bb03e0e0ff8e690908290600081818185875af1925050503d806000811461364d576040519150601f19603f3d011682016040523d82523d6000602084013e613652565b606091505b5050809250508161366257600080fd5b610ab8565b60405163a9059cbb60e01b81526001600160a01b0385169063a9059cbb906136a99073908c5fbae8dec9202d8faf7ca0277e50b87ed03b9085906004016142ab565b6020604051808303816000875af11580156136c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ec9190615da1565b9150816136f857600080fd5b60405163a9059cbb60e01b81526001600160a01b0385169063a9059cbb9061373a9073599b418ad25c7b11bfb6a9108bb03e0e0ff8e6909085906004016142ab565b6020604051808303816000875af1158015613759573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061377d9190615da1565b915081610ab857600080fd5b60006001600160e01b031982166380ac58cd60e01b14806137ba57506001600160e01b03198216635b5e139f60e01b145b806104a757506301ffc9a760e01b6001600160e01b03198316146104a7565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061382b8261074e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061386f826137d9565b6138d05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105a7565b60006138db8361074e565b9050806001600160a01b0316846001600160a01b031614806139165750836001600160a01b031661390b8461053f565b6001600160a01b0316145b80613926575061392681856133ff565b949350505050565b826001600160a01b03166139418261074e565b6001600160a01b0316146139a95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016105a7565b6001600160a01b038216613a0b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105a7565b613a166000826137f6565b6001600160a01b0383166000908152600360205260408120805460019290613a3f9084906147fb565b90915550506001600160a01b0382166000908152600360205260408120805460019290613a6d9084906145ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216613b765760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105a7565b613b7f816137d9565b15613bcc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105a7565b6001600160a01b0382166000908152600360205260408120805460019290613bf59084906145ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b031603613cb05760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016105a7565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613d2884848461392e565b613d3484848484613fb6565b610ab85760405162461bcd60e51b81526004016105a790615dbe565b606081600003613d775750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613da15780613d8b816145e2565b9150613d9a9050600a83614581565b9150613d7b565b60008167ffffffffffffffff811115613dbc57613dbc6142e1565b6040519080825280601f01601f191660200182016040528015613de6576020820181803683370190505b5090505b841561392657613dfb6001836147fb565b9150613e08600a86614612565b613e139060306145ca565b60f81b818381518110613e2857613e2861470f565b60200101906001600160f81b031916908160001a905350613e4a600a86614581565b9450613dea565b60608151600003613e7057505060408051602081019091526000815290565b6000604051806060016040528060408152602001615f026040913990506000600384516002613e9f91906145ca565b613ea99190614581565b613eb490600461454c565b90506000613ec38260206145ca565b67ffffffffffffffff811115613edb57613edb6142e1565b6040519080825280601f01601f191660200182016040528015613f05576020820181803683370190505b509050818152600183018586518101602084015b81831015613f71576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101613f19565b600389510660018114613f8b5760028114613f9c57613fa8565b613d3d60f01b600119830152613fa8565b603d60f81b6000198301525b509398975050505050505050565b60006001600160a01b0384163b156140ac57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613ffa903390899088908890600401615e10565b6020604051808303816000875af1925050508015614035575060408051601f3d908101601f1916820190925261403291810190615e4d565b60015b614092573d808015614063576040519150601f19603f3d011682016040523d82523d6000602084013e614068565b606091505b50805160000361408a5760405162461bcd60e51b81526004016105a790615dbe565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613926565b506001949350505050565b8280546140c3906144ab565b90600052602060002090601f0160209004810192826140e5576000855561412b565b82601f106140fe57805160ff191683800117855561412b565b8280016001018555821561412b579182015b8281111561412b578251825591602001919060010190614110565b5061413792915061413b565b5090565b5b80821115614137576000815560010161413c565b6001600160e01b03198116811461356f57600080fd5b60006020828403121561417857600080fd5b81356134d081614150565b60005b8381101561419e578181015183820152602001614186565b83811115610ab85750506000910152565b600081518084526141c7816020860160208601614183565b601f01601f19169290920160200192915050565b6020815260006134d060208301846141af565b60006020828403121561420057600080fd5b5035919050565b6001600160a01b038116811461356f57600080fd5b6000806040838503121561422f57600080fd5b823561423a81614207565b946020939093013593505050565b60008060006060848603121561425d57600080fd5b833561426881614207565b9250602084013561427881614207565b929592945050506040919091013590565b6000806040838503121561429c57600080fd5b50508035926020909101359150565b6001600160a01b03929092168252602082015260400190565b6000602082840312156142d657600080fd5b81356134d081614207565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115614312576143126142e1565b604051601f8501601f19908116603f0116810190828211818310171561433a5761433a6142e1565b8160405280935085815286868601111561435357600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561437f57600080fd5b813567ffffffffffffffff81111561439657600080fd5b8201601f810184136143a757600080fd5b613926848235602084016142f7565b801515811461356f57600080fd5b600080604083850312156143d757600080fd5b82356143e281614207565b915060208301356143f2816143b6565b809150509250929050565b6000806000806080858703121561441357600080fd5b843561441e81614207565b9350602085013561442e81614207565b925060408501359150606085013567ffffffffffffffff81111561445157600080fd5b8501601f8101871361446257600080fd5b614471878235602084016142f7565b91505092959194509250565b6000806040838503121561449057600080fd5b823561449b81614207565b915060208301356143f281614207565b600181811c908216806144bf57607f821691505b6020821081036144df57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561456657614566614536565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826145905761459061456b565b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156145dd576145dd614536565b500190565b6000600182016145f4576145f4614536565b5060010190565b60008161460a5761460a614536565b506000190190565b6000826146215761462161456b565b500690565b60008151614638818560208601614183565b9290920192915050565b60008651614654818460208b01614183565b743c72616469616c4772616469656e742069643d226760581b9083019081528651614686816015840160208b01614183565b67111031bc1e91181760c11b6015929091019182015285516146af81601d840160208a01614183565b67111031bc9e91181760c11b601d929091019182015284516146d8816025840160208901614183565b661110391e91181760c91b60259290910191820152835161470081602c840160208801614183565b01602c01979650505050505050565b634e487b7160e01b600052603260045260246000fd5b6000875160206147388285838d01614183565b671110333c1e91181760c11b918401918252885161475c8160088501848d01614183565b88519201916147718160088501848c01614183565b671110333c9e91181760c11b6008939091019283015286516147998160108501848b01614183565b86519201916147ae8160108501848a01614183565b6f111039b83932b0b226b2ba3437b21e9160811b6010939091019283015284516147dd81838501848901614183565b61111f60f11b92019081019190915260220198975050505050505050565b60008282101561480d5761480d614536565b500390565b60008651614824818460208b01614183565b6d1e39ba37b81037b33339b2ba1e9160911b908301908152865161484f81600e840160208b01614183565b6f25222073746f702d636f6c6f723d222360801b600e9290910191820152855161488081601e840160208a01614183565b855191019061489681601e840160208901614183565b84519101906148ac81601e840160208801614183565b6211179f60e91b601e9290910191820152602101979650505050505050565b600084516148dd818460208901614183565b80830190507f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d228152602360f81b60208201528451614922816021840160208901614183565b8451910190614938816021840160208801614183565b7311179f1e17b930b234b0b623b930b234b2b73a1f60611b6021929091019182015260350195945050505050565b60008651614978818460208b01614183565b661e17b232b3399f60c91b9083019081527f3c66696c7465722069643d226e223e3c666554757262756c656e63652062617360078201526f0654672657175656e63793d22302e30360841b602782015286516149db816037840160208b01614183565b64020302e30360dc1b603792909101918201528551614a0181603c840160208a01614183565b7f2220726573756c743d224e4f49534522206e756d4f6374617665733d22332220603c92909101918201527f2f3e3c6665446973706c6163656d656e744d617020696e3d22536f7572636547605c8201527f7261706869632220696e323d224e4f49534522207363616c653d223130302220607c820152713c21b430b73732b629b2b632b1ba37b91e9160711b609c820152614cb9614afb614ad2614acc614aac60ae86018a614626565b7311103ca1b430b73732b629b2b632b1ba37b91e9160611b815260140190565b87614626565b7f223e3c2f6665446973706c6163656d656e744d61703e3c2f66696c7465723e008152601f0190565b7f3c66696c7465722069643d2267222066696c746572556e6974733d226f626a6581527f6374426f756e64696e67426f782220783d222d3235252220793d222d3235252260208201527f2077696474683d223135302522206865696768743d2231353025223e3c66655460408201527f757262756c656e636520626173654672657175656e63793d22302e3120302e3160608201527f2220726573756c743d224e4f49534522206e756d4f6374617665733d2232222060808201527f2f3e3c6665446973706c6163656d656e744d617020696e3d22536f757263654760a08201527f7261706869632220696e323d224e4f49534522207363616c653d22302e36362260c08201527f20784368616e6e656c53656c6563746f723d22522220794368616e6e656c536560e08201527f6c6563746f723d22422220726573756c743d22746d70223e3c2f6665446973706101008201527f6c6163656d656e744d61703e3c6665426c656e6420696e3d22746d702220696e6101208201527f323d22536f757263654772617068696322206d6f64653d226f7665726c6179226101408201526a179f1e17b334b63a32b91f60a91b61016082015261016b0190565b98975050505050505050565b60008551614cd7818460208a01614183565b781e3932b1ba103c1e9118981291103c9e911c929110393c1e9160391b9083019081528551614d0d816019840160208a01614183565b651110393c9e9160d11b601992909101918201528451614d3481601f840160208901614183565b7f222077696474683d2237372522206865696768743d22373725222066696c6c3d601f9290910191820152662275726c28236760c81b603f8201528351614d82816046840160208801614183565b741491103334b63a32b91e913ab9361411b71491179f60591b60469290910191820152605b019695505050505050565b60008451614dc4818460208901614183565b80830190507f3c7376672077696474683d223130302522206865696768743d2231303025222081526976696577426f783d222d60b01b60208201528451614e1281602a840160208901614183565b61202d60f01b602a92909101918201528351614e3581602c840160208801614183565b7f20333620333622207072657365727665417370656374526174696f3d22784d69602c92909101918201527f64594d6964206d656574222066696c7465723d2275726c28236729223e000000604c82015260690195945050505050565b60008451614ea4818460208901614183565b80830190507f3c70617468207374726f6b653d22236666633131302220643d224d31302c313181527f68364d31302c313268314d31352c313268314d31302c313368314d31352c313360208201527f68314d372c313468314d31302c313468314d31352c313468314d372c3135683160408201527f4d31302c313568314d31352c313568314d31302c31366836222f3e3c7061746860608201527f207374726f6b653d22236639386633302220643d224d31372c313168364d313760808201527f2c313268314d32322c313268314d31372c313368314d32322c313368314d313760a08201527f2c313468314d32322c313468314d31372c313568314d32322c313568314d313760c08201527f2c31366836222f3e3c70617468207374726f6b653d222366666666666622206460e0820152611e9160f11b6101008201526101028551614ff78183850160208a01614183565b614cb961502261501c8484870101600080516020615ec28339815191528152601d0190565b88614626565b7f222f3e3c70617468207374726f6b653d22236637386131382220643d224d372c81526e1899b419a6989b161899b41891179f60891b6020820152602f0190565b60008451615075818460208901614183565b80830190507f3c70617468207374726f6b653d22236666363338642220643d224d31302c313181527f68364d31372c313168364d31302c313268314d31352c313268314d31372c313260208201527f68314d32322c313268314d372c313368344d31352c313368334d32322c31336860408201527f314d372c313468344d31352c313468334d32322c313468314d372c313568314d60608201527f31302c313568314d31352c313568314d31372c313568314d32322c313568314d60808201527f31302c313668364d31372c31366836222f3e3c70617468207374726f6b653d2260a08201526b11b333333333331110321e9160a11b60c082015284516151838160cc840160208901614183565b600080516020615ec283398151915260cc929091019182015283516151af8160e9840160208801614183565b6151c760e9828401016211179f60e91b815260030190565b979650505050505050565b600083516151e4818460208801614183565b8083019050600080516020615ee283398151915281527f68364d31372c313168364d31302c313268314d31332c313268334d31372c313260208201527f68314d32302c313268334d372c313368344d31332c313368354d32302c31336860408201527f334d372c313468314d31302c313468314d31332c313468334d31372c3134683160608201527f4d32302c313468334d372c313568314d31302c313568314d31332c313568334d60808201527f31372c313568314d32302c313568334d31302c313668364d31372c313668362260a08201527f2f3e3c70617468207374726f6b653d22236666666666662220643d220000000060c082015283516152f18160dc840160208801614183565b6211179f60e91b60dc929091019182015260df01949350505050565b6000825161531f818460208701614183565b600080516020615ee28339815191529201918252507f68364d31372c313168364d31302c313268334d31342c313268324d31372c313260208201527f68334d32312c313268324d372c31336831364d372c313468314d31302c31346860408201527f314d31322c313468324d31352c313468314d31372c313468314d31392c31346860608201527f324d32322c313468314d372c313568314d31302c313568364d31372c3135683660808201527f4d31302c313668364d31372c31366836222f3e3c70617468207374726f6b653d60a08201527f22236666306530652220643d224d31332c313268314d32302c31326831222f3e60c08201527f3c70617468207374726f6b653d22233061646334642220643d224d31312c313460e08201527f68314d31382c31346831222f3e3c70617468207374726f6b653d2223313932396101008201527f66342220643d224d31342c313468314d32312c31346831222f3e00000000000061012082015261013a01919050565b600082516154a7818460208701614183565b600080516020615ee28339815191529201918252507f68364d31372c313168364d31302c313268344d31352c313268314d31372c313260208201527f68344d32322c313268314d372c313368374d31352c313368364d32322c31336860408201527f314d372c313468314d31302c313468364d31372c313468364d372c313568314d60608201527f31302c313568364d31372c313568364d31302c313668364d31372c313668362260808201527f2f3e3c70617468207374726f6b653d22236666666666662220643d224d31342c60a08201527f313268314d32312c313268314d31342c313368314d32312c31336831222f3e0060c082015260df01919050565b600087516155ba818460208c01614183565b6e3c70617468207374726f6b653d222360881b90830190815287516155e681600f840160208c01614183565b7f2220643d224d31302c313168364d31302c313268314d31352c313268314d3130600f92909101918201527f2c313368314d31352c313368314d31302c313468314d31352c313468314d3130602f8201527f2c313568314d31352c313568314d31302c31366836222f3e3c70617468207374604f82015266726f6b653d222360c81b606f8201528651615680816076840160208b01614183565b7f2220643d224d31372c313168364d31372c313268314d32322c313268314d3137607692909101918201527f2c313368314d32322c313368314d372c313468314d31372c313468314d32322c60968201527f313468314d372c313568314d31372c313568314d32322c313568314d31372c3160b68201527f366836222f3e3c70617468207374726f6b653d22236666666666662220643d2260d682015261579d61577a61577461575661575061573960f687018c614626565b600080516020615ec28339815191528152601d0190565b89614626565b71222f3e3c70617468207374726f6b653d222360701b815260120190565b86614626565b761110321e91269b961899b419a6989b161899b41891179f60491b815260170190565b9998505050505050505050565b600087516157bc818460208c01614183565b6e3c70617468207374726f6b653d222360881b90830190815287516157e881600f840160208c01614183565b7f2220643d224d31302c313168364d31372c313168364d31302c313268314d3135600f92909101918201527f2c313268314d31372c313268314d32322c313268314d372c313368344d31352c602f8201527f313368334d32322c313368314d372c313468314d31302c313468314d31352c31604f8201527f3468314d31372c313468314d32322c313468314d372c313568314d31302c3135606f8201527f68314d31352c313568314d31372c313568314d32322c313568314d31302c3136608f8201527f68364d31372c31366836222f3e3c70617468207374726f6b653d22230000000060af82015261579d6159086157746158f16157506157566159028360cb89018f614626565b641110321e9160d91b815260050190565b8c614626565b6211179f60e91b815260030190565b60008751602061592a8285838d01614183565b88519184019161593d8184848d01614183565b885192019161594f8184848c01614183565b87519201916159618184848b01614183565b86519201916159738184848a01614183565b85519201916159858184848901614183565b919091019998505050505050505050565b600087516159a8818460208c01614183565b681e3932b1ba103c1e9160b91b90830190815287516159ce816009840160208c01614183565b6411103c9e9160d91b6009929091019182015286516159f481600e840160208b01614183565b6811103bb4b23a341e9160b91b600e92909101918201528551615a1e816017840160208a01614183565b7f22206865696768743d223122207472616e73666f726d3d22726f74617465282d601792909101918201528451615a5c816037840160208901614183565b601760f91b6037929091019182015261579d615a7b6038830186614626565b600b60fa1b815260010190565b60008451615a9a818460208901614183565b845190830190615aae818360208901614183565b6d2c302e3529222066696c6c3d222360901b91019081528351615ad881600e840160208801614183565b6211179f60e91b600e929091019182015260110195945050505050565b60008251615b07818460208701614183565b651e17b9bb339f60d11b9201828152600681019290925250600c01919050565b6e03d913730b6b2911d11213637bab71608d1b81528351600090615b5281600f850160208901614183565b7f222c20226465736372697074696f6e223a225468652062656175746966756c20600f918401918201527f6f6e2d636861696e20426c6f756e2077617320626f726e2c2061204343302074602f8201527f72696275746520746f207468652069636f6e6963204e6f756e732070726f6a65604f8201526f31ba171116101134b6b0b3b2911d101160811b606f8201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000607f8201528451615c1a816099840160208901614183565b7f222c202261747472696275746573223a207b2274726169745f74797065223a2060999290910191820152720112630bcb2b939911610113b30b63ab2911d1606d1b60b98201528351615c748160cc840160208801614183565b6151c760cc82840101617d7d60f01b815260020190565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251615cc381601d850160208701614183565b91909101601d0192915050565b66697066733a2f2f60c81b8152600060076000845481600182811c915080831680615cfc57607f831692505b60208084108203615d1b57634e487b7160e01b86526022600452602486fd5b818015615d2f5760018114615d4457615d75565b60ff1986168a890152848a0188019650615d75565b60008b81526020902060005b86811015615d6b5781548c82018b0152908501908301615d50565b505087858b010196505b50949998505050505050505050565b600060208284031215615d9657600080fd5b81516134d081614207565b600060208284031215615db357600080fd5b81516134d0816143b6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615e43908301846141af565b9695505050505050565b600060208284031215615e5f57600080fd5b81516134d08161415056fe3c7376672077696474683d223230303022206865696768743d2232303030222076657273696f6e3d22312e312220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c646566733e222f3e3c70617468207374726f6b653d22233030303030302220643d220000003c70617468207374726f6b653d22233030303030302220643d224d31302c31314142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4d31312c313268324d31382c313268324d31312c313368324d31382c313368324d31312c313468324d31382c313468324d31312c313568324d31382c313568324d31332c313268324d32302c313268324d31332c313368324d32302c313368324d31332c313468324d32302c313468324d31332c313568324d32302c31356832a264697066735822122058381588fc6dfe88fbabd87bcaa215348f1ce38851e5f7f919c185abda2b624964736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002e516d594d6a5a554277703777704c74564d346852693659615863694c4c7a4733395a314a614c6f74694a51507037000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061014f5760003560e01c8063938e3d7b116100b6578063b88d4fde1161006f578063b88d4fde146103cd578063c87b56dd146103ed578063e8a3d4851461040d578063e985e9c514610422578063f2fde38b14610442578063f3fef3a31461046257600080fd5b8063938e3d7b1461031157806395d89b4114610331578063a0712d6814610346578063a22cb46514610359578063ac8d856c14610379578063b50cbd9f1461039957600080fd5b80632a55205a116101085780632a55205a1461025057806342842e0e1461027e5780636352211e1461029e57806370a08231146102be578063715018a6146102de5780638da5cb5b146102f357600080fd5b806301ffc9a71461015b57806306fdde0314610190578063081812fc146101b2578063095ea7b3146101ea57806318160ddd1461020c57806323b872dd1461023057600080fd5b3661015657005b600080fd5b34801561016757600080fd5b5061017b610176366004614166565b610482565b60405190151581526020015b60405180910390f35b34801561019c57600080fd5b506101a56104ad565b60405161018791906141db565b3480156101be57600080fd5b506101d26101cd3660046141ee565b61053f565b6040516001600160a01b039091168152602001610187565b3480156101f657600080fd5b5061020a61020536600461421c565b6105cc565b005b34801561021857600080fd5b5061022260095481565b604051908152602001610187565b34801561023c57600080fd5b5061020a61024b366004614248565b6106dc565b34801561025c57600080fd5b5061027061026b366004614289565b61070d565b6040516101879291906142ab565b34801561028a57600080fd5b5061020a610299366004614248565b610733565b3480156102aa57600080fd5b506101d26102b93660046141ee565b61074e565b3480156102ca57600080fd5b506102226102d93660046142c4565b6107c5565b3480156102ea57600080fd5b5061020a61084c565b3480156102ff57600080fd5b506006546001600160a01b03166101d2565b34801561031d57600080fd5b5061020a61032c36600461436d565b610882565b34801561033d57600080fd5b506101a56108c3565b61020a6103543660046141ee565b6108d2565b34801561036557600080fd5b5061020a6103743660046143c4565b6109da565b34801561038557600080fd5b506101d26103943660046141ee565b6109e5565b3480156103a557600080fd5b506101d27f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c181565b3480156103d957600080fd5b5061020a6103e83660046143fd565b610a86565b3480156103f957600080fd5b506101a56104083660046141ee565b610abe565b34801561041957600080fd5b506101a56133d7565b34801561042e57600080fd5b5061017b61043d36600461447d565b6133ff565b34801561044e57600080fd5b5061020a61045d3660046142c4565b6134d7565b34801561046e57600080fd5b5061020a61047d36600461421c565b613572565b60006001600160e01b0319821663152a902d60e11b14806104a757506104a782613789565b92915050565b6060600080546104bc906144ab565b80601f01602080910402602001604051908101604052809291908181526020018280546104e8906144ab565b80156105355780601f1061050a57610100808354040283529160200191610535565b820191906000526020600020905b81548152906001019060200180831161051857829003601f168201915b5050505050905090565b600061054a826137d9565b6105b05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105d78261074e565b9050806001600160a01b0316836001600160a01b0316036106445760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105a7565b336001600160a01b0382161480610660575061066081336133ff565b6106cd5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016105a7565b6106d783836137f6565b505050565b6106e63382613864565b6107025760405162461bcd60e51b81526004016105a7906144e5565b6106d783838361392e565b306000620186a0610720846108ae61454c565b61072a9190614581565b90509250929050565b6106d783838360405180602001604052806000815250610a86565b6000818152600260205260408120546001600160a01b0316806104a75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105a7565b60006001600160a01b0382166108305760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105a7565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146108765760405162461bcd60e51b81526004016105a790614595565b6108806000613ace565b565b6006546001600160a01b031633146108ac5760405162461bcd60e51b81526004016105a790614595565b80516108bf9060079060208401906140b7565b5050565b6060600180546104bc906144ab565b6009546108ae6108e283836145ca565b11156109225760405162461bcd60e51b815260206004820152600f60248201526e4d6178203232323220426c6f756e7360881b60448201526064016105a7565b61093382664ef0f8e6e8c00061454c565b34101561097b5760405162461bcd60e51b815260206004820152601660248201527509ad2dce840e0e4d2c6ca40605c6064646464408aa8960531b60448201526064016105a7565b60005b828110156109ab576109993361099483856145ca565b613b20565b806109a3816145e2565b91505061097e565b506109b682826145ca565b600955600090815260086020526040902080546001600160a01b0319163317905550565b6108bf338383613c53565b60006109f0826137d9565b610a3c5760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e0060448201526064016105a7565b6000828152600860205260409020546001600160a01b0316610a6a5781610a62816145fb565b925050610a3c565b506000908152600860205260409020546001600160a01b031690565b610a903383613864565b610aac5760405162461bcd60e51b81526004016105a7906144e5565b610ab884848484613d1d565b50505050565b60606000610acb836109e5565b60408051611e60810182526006611e2082018181526503030303030360d41b611e408401528252825180840184528181526530303439394360d01b60208281019190915280840191909152835180850185528281526530303739464360d01b8183015283850152835180850185528281526530303943353960d01b81830152606084015283518085018552828152651818209a9a9b60d11b818301526080840152835180850185528281526518182321a32360d11b8183015260a0840152835180850185528281526518189c189a1b60d11b8183015260c0840152835180850185528281526518191ba19c9960d11b8183015260e0840152835180850185528281526518191ba2a29b60d11b81830152610100840152835180850185528281526518199c1aa2a160d11b81830152610120840152835180850185528281526530343944343360d01b81830152610140840152835180850185528281526503036383934360d41b8183015261016084015283518085018552828152650c105110cd1160d21b81830152610180840152835180850185528281526530423530323760d01b818301526101a084015283518085018552828152650c4e4c8e518d60d21b818301526101c0840152835180850185528281526531453334343560d01b818301526101e0840152835180850185528281526531463144323960d01b81830152610200840152835180850185528281526519199a9a1b9b60d11b818301526102208401528351808501855282815265191a9a22a32160d11b8183015261024084015283518085018552828152650c8d4dd0d15160d21b81830152610260840152835180850185528281526532364231463360d01b81830152610280840152835180850185528281526532374134363360d01b818301526102a084015283518085018552828152650c904e0d919160d21b818301526102c084015283518085018552828152650c908c8e0ccd60d21b818301526102e0840152835180850185528281526519211c19a31b60d11b818301526103008401528351808501855282815265192121191b2160d11b81830152610320840152835180850185528281526533343332333560d01b81830152610340840152835180850185528281526503334414338360d41b81830152610360840152835180850185528281526533373544464360d01b818301526103808401528351808501855282815265199c22221a9b60d11b818301526103a0840152835180850185528281526533393545443160d01b818301526103c0840152835180850185528281526519a0981c1aa160d11b818301526103e0840152835180850185528281526533463933323360d01b8183015261040084015283518085018552828152651a1898221b1b60d11b8183015261042084015283518085018552828152650686468668c760d31b81830152610440840152835180850185528281526503432464642360d41b8183015261046084015283518085018552828152651a1aa320a32360d11b8183015261048084015283518085018552828152651a1ca1199c2160d11b818301526104a08401528351808501855282815265068826a666a760d31b818301526104c0840152835180850185528281526534423439343960d01b818301526104e0840152835180850185528281526534423635463760d01b81830152610500840152835180850185528281526534424541363960d01b8183015261052084015283518085018552828152651a22191b98a160d11b81830152610540840152835180850185528281526535303541354360d01b81830152610560840152835180850185528281526535333541313560d01b8183015261058084015283518085018552828152650d4d4c910c5160d21b818301526105a0840152835180850185528281526535353245303560d01b818301526105c0840152835180850185528281526535353435343360d01b818301526105e0840152835180850185528281526535353533353360d01b8183015261060084015283518085018552828152650d4d8d0e115160d21b81830152610620840152835180850185528281526535383536354360d01b8183015261064084015283518085018552828152651aa09a1919a360d11b81830152610660840152835180850185528281526535413635464160d01b8183015261068084015283518085018552828152651aa09b211ba160d11b818301526106a084015283518085018552828152651aa1991aa32160d11b818301526106c0840152835180850185528281526503544333530360d41b818301526106e0840152835180850185528281526535443630363160d01b8183015261070084015283518085018552828152651aa3221a232160d11b8183015261072084015283518085018552828152651b181a1b1b1b60d11b8183015261074084015283518085018552828152650d8c8d8c4d9160d21b81830152610760840152835180850185528281526536334130463960d01b81830152610780840152835180850185528281526536343844463960d01b818301526107a0840152835180850185528281526536363741463960d01b818301526107c0840152835180850185528281526536374231453360d01b818301526107e0840152835180850185528281526536423346333960d01b8183015261080084015283518085018552828152651b211b99189960d11b8183015261082084015283518085018552828152651b229999181b60d11b81830152610840840152835180850185528281526536463539374160d01b81830152610860840152835180850185528281526503730453839360d41b8183015261088084015283518085018552828152650dcc5091114d60d21b818301526108a084015283518085018552828152650dcd0d4e0c1160d21b818301526108c084015283518085018552828152651b9a9b9a9b9b60d11b818301526108e0840152835180850185528281526537363743304560d01b8183015261090084015283518085018552828152651b9b1c1a9c2160d11b81830152610920840152835180850185528281526537363943413960d01b8183015261094084015283518085018552828152651ba1a19a231960d11b81830152610960840152835180850185528281526537443633354560d01b81830152610980840152835180850185528281526537453532343360d01b818301526109a0840152835180850185528281526538303746374560d01b818301526109c084015283518085018552828152650e0c104dcc9160d21b818301526109e0840152835180850185528281526507066686672760d31b81830152610a0084015283518085018552828152651c1a9b199a2360d11b81830152610a2084015283518085018552828152650e0d8dd0cc5160d21b81830152610a40840152835180850185528281526538373646363960d01b81830152610a60840152835180850185528281526538374534443960d01b81830152610a80840152835180850185528281526538424330433560d01b81830152610aa084015283518085018552828152651c222218991960d11b81830152610ac0840152835180850185528281526538463738354560d01b81830152610ae0840152835180850185528281526539303337303760d01b81830152610b00840152835180850185528281526539303942304560d01b81830152610b2084015283518085018552828152651c9b1919199b60d11b81830152610b4084015283518085018552828152651c9ba319232160d11b81830152610b60840152835180850185528281526539394536444560d01b81830152610b80840152835180850185528281526507286846884760d31b81830152610ba0840152835180850185528281526539443845364560d01b81830152610bc0840152835180850185528281526539454235453160d01b81830152610be0840152835180850185528281526503946323141360d41b81830152610c00840152835180850185528281526539463442323760d01b81830152610c20840152835180850185528281526541313943394160d01b81830152610c408401528351808501855282815265104c8e11518d60d21b81830152610c608401528351808501855282815265104cce0d8d4d60d21b81830152610c808401528351808501855282815265104cd090515160d21b81830152610ca0840152835180850185528281526504133454644360d41b81830152610cc0840152835180850185528281526504138364636360d41b81830152610ce0840152835180850185528281526541413934304360d01b81830152610d0084015283518085018552828152651050504d904d60d21b81830152610d20840152835180850185528281526541423336424560d01b81830152610d40840152835180850185528281526508284828282760d31b81830152610d60840152835180850185528281526541424631333160d01b81830152610d80840152835180850185528281526541444338434360d01b81830152610da084015283518085018552828152650828a666460760d31b81830152610dc0840152835180850185528281526541453643304160d01b81830152610de0840152835180850185528281526504231394530360d41b81830152610e008401528351808501855282815265108c8e4d4e1160d21b81830152610e20840152835180850185528281526542324138413560d01b81830152610e40840152835180850185528281526542383742313160d01b81830152610e608401528351808501855282815265211c21a2a21960d11b81830152610e80840152835180850185528281526542393138354360d01b81830152610ea0840152835180850185528281526542393142343360d01b81830152610ec0840152835180850185528281526542393242334360d01b81830152610ee0840152835180850185528281526510910c910c8d60d21b81830152610f00840152835180850185528281526504331363731360d41b81830152610f20840152835180850185528281526543313639323360d01b81830152610f40840152835180850185528281526543334131393960d01b81830152610f60840152835180850185528281526543344441353360d01b81830152610f80840152835180850185528281526543353033304560d01b81830152610fa084015283518085018552828152650866a688a66760d31b81830152610fc0840152835180850185528281526543354239413160d01b81830152610fe0840152835180850185528281526543414132364160d01b81830152611000840152835180850185528281526543414546463960d01b81830152611020840152835180850185528281526543424331424360d01b81830152611040840152835180850185528281526543433035393560d01b81830152611060840152835180850185528281526510d10e4c4d9160d21b81830152611080840152835180850185528281526543454331383960d01b818301526110a0840152835180850185528281526521a3219920a160d11b818301526110c084015283518085018552828152650868c867284760d31b818301526110e0840152835180850185528281526544303842313160d01b81830152611100840152835180850185528281526544304145413960d01b81830152611120840152835180850185528281526544313836383760d01b818301526111408401528351808501855282815265110c4e504d4d60d21b81830152611160840152835180850185528281526544323232303960d01b81830152611180840152835180850185528281526544323634353160d01b818301526111a0840152835180850185528281526544323936303760d01b818301526111c08401528351808501855282815265110ccc514c4d60d21b818301526111e0840152835180850185528281526544333241303960d01b81830152611200840152835180850185528281526544344130313560d01b818301526112208401528351808501855282815265221a211ba11960d11b81830152611240840152835180850185528281526504434434643360d41b81830152611260840152835180850185528281526544353633333360d01b818301526112808401528351808501855282815265221a9c9b209b60d11b818301526112a0840152835180850185528281526544354437453160d01b818301526112c0840152835180850185528281526544363231343960d01b818301526112e0840152835180850185528281526544364333424560d01b818301526113008401528351808501855282815265110dd10cd0d160d21b818301526113208401528351808501855282815265221c2220a22360d11b818301526113408401528351808501855282815265221c999c98a360d11b81830152611360840152835180850185528281526522209a1921a160d11b81830152611380840152835180850185528281526544423833323360d01b818301526113a0840152835180850185528281526544434438443360d01b818301526113c0840152835180850185528281526544463243333960d01b818301526113e0840152835180850185528281526545313138333360d01b81830152611400840152835180850185528281526545314437443560d01b81830152611420840152835180850185528281526504532433843360d41b81830152611440840152835180850185528281526545344134393960d01b81830152611460840152835180850185528281526545344146413360d01b81830152611480840152835180850185528281526545354535444560d01b818301526114a0840152835180850185528281526545374133324360d01b818301526114c08401528351808501855282815265229c1b981aa160d11b818301526114e08401528351808501855282815265229c229c229960d11b81830152611500840152835180850185528281526545393236354360d01b818301526115208401528351808501855282815265229ca120989960d11b81830152611540840152835180850185528281526508a82846262760d31b81830152611560840152835180850185528281526545433542343360d01b81830152611580840152835180850185528281526545454237384360d01b818301526115a0840152835180850185528281526545454438313160d01b818301526115c0840152835180850185528281526504545444330360d41b818301526115e0840152835180850185528281526545464144383160d01b81830152611600840152835180850185528281526545464632464160d01b8183015261162084015283518085018552828152652319181a191960d11b81830152611640840152835180850185528281526546333332324360d01b81830152611660840152835180850185528281526546333842374360d01b81830152611680840152835180850185528281526546333937313360d01b818301526116a08401528351808501855282815265118cce510d0d60d21b818301526116c08401528351808501855282815265118d4e508ccd60d21b818301526116e08401528351808501855282815265231aa321a32360d11b818301526117008401528351808501855282815265231b1c18a29b60d11b81830152611720840152835180850185528281526508c6e626468760d31b81830152611740840152835180850185528281526508c6e708262760d31b818301526117608401528351808501855282815265118dce4c4cd160d21b81830152611780840152835180850185528281526546383239303560d01b818301526117a0840152835180850185528281526546383330303160d01b818301526117c0840152835180850185528281526504638363130360d41b818301526117e0840152835180850185528281526546383938363560d01b81830152611800840152835180850185528281526546384345343760d01b81830152611820840152835180850185528281526546384436383960d01b81830152611840840152835180850185528281526504638444442360d41b81830152611860840152835180850185528281526508c72667088760d31b81830152611880840152835180850185528281526504639384633360d41b818301526118a08401528351808501855282815265118e514e111160d21b818301526118c08401528351808501855282815265231ca31a229b60d11b818301526118e08401528351808501855282815265231ca31aa1a160d11b81830152611900840152835180850185528281526546394635453960d01b81830152611920840152835180850185528281526546394636443160d01b81830152611940840152835180850185528281526504641354532360d41b81830152611960840152835180850185528281526523209b23229960d11b81830152611980840152835180850185528281526511908d0d8e4d60d21b818301526119a0840152835180850185528281526546424333313160d01b818301526119c0840152835180850185528281526504642433830360d41b818301526119e0840152835180850185528281526546434346323560d01b81830152611a00840152835180850185528281526523221c211aa160d11b81830152611a208401528351808501855282815265232221a2a31960d11b81830152611a40840152835180850185528281526546444537463560d01b81830152611a60840152835180850185528281526508c888c6060760d31b81830152611a8084015283518085018552828152652322231c232360d11b81830152611aa0840152835180850185528281526546453530304360d01b81830152611ac0840152835180850185528281526546454239443560d01b81830152611ae0840152835180850185528281526546454533463360d01b81830152611b00840152835180850185528281526546463045304560d01b81830152611b208401528351808501855282815265232318a0982160d11b81830152611b408401528351808501855282815265232318a0a21960d11b81830152611b60840152835180850185528281526546463341304560d01b81830152611b80840152835180850185528281526511918d8cce1160d21b81830152611ba0840152835180850185528281526523231b99189b60d11b81830152611bc0840152835180850185528281526511918e0c905160d21b81830152611be0840152835180850185528281526546464132314560d01b81830152611c00840152835180850185528281526546464145314160d01b81830152611c20840152835180850185528281526546464239313360d01b81830152611c40840152835180850185528281526504646433131360d41b81830152611c60840152835180850185528281526504646433546360d41b81830152611c80840152835180850185528281526546464339323560d01b81830152611ca0840152835180850185528281526546464430363760d01b81830152611cc0840152835180850185528281526546464539333960d01b81830152611ce08401528351808501855282815265232322a3189b60d11b81830152611d00840152835180850185528281526523232318181b60d11b81830152611d20840152835180850185528281526546464630424560d01b81830152611d40840152835180850185528281526546464630454560d01b81830152611d60840152835180850185528281526546464634343960d01b81830152611d80840152835180850185528281526546464636373160d01b81830152611da0840152835180850185528281526523232322231960d11b81830152611dc0840152835180850185528281526511919191118d60d21b81830152611de084015283518085019094529083526523232323232360d11b90830152611e00810191909152909150600061272385613d50565b90506000604051806080016040528060578152602001615e6b605791399050600061274f600688614612565b61275a9060046145ca565b905060005b81811015612b1d576040516001600160601b0319606088901b16602082015260348101899052605481018290526000906074016040516020818303038152906040528051906020012060001c9050836127b783613d50565b6127d56127c5600985614612565b6127d09060016145ca565b613d50565b6127e76127c56009600487901c614612565b6127f96127c56009600888901c614612565b60405160200161280d959493929190614642565b60408051601f1981840301815291905293508361283d6128326004600c85901c614612565b6127d09060066145ca565b61284f6127d06009600e86901c614612565b61286c6128616006601287901c614612565b6127d09060046145ca565b61287e6127d06009601588901c614612565b6040518060600160405280604051806040016040528060078152602001661c99599b1958dd60ca1b8152508152602001604051806040016040528060068152602001651c995c19585d60d21b8152508152602001604051806040016040528060038152602001621c185960ea1b8152508152506003601988901c6129029190614612565b600381106129125761291261470f565b602002015160405160200161292c96959493929190614725565b60408051601f198184030181529190529350600061294f6003601b84901c614612565b61295a9060026145ca565b905060005b81811015612a87578561298c6129768360016145ca565b612981906064614581565b6127d09060646147fb565b8960f161299a85601061454c565b6129a590601d6145ca565b87901c6129b29190614612565b60f181106129c2576129c261470f565b602002015186156129fa576129f560096129dd86601061454c565b6129e89060256145ca565b88901c6127d09190614612565b612a0b565b604051806020016040528060008152505b8715612a3e57612a396009612a2187601061454c565b612a2c9060296145ca565b89901c6127d09190614612565b612a4f565b604051806020016040528060008152505b604051602001612a63959493929190614812565b60405160208183030381529060405295508080612a7f906145e2565b91505061295f565b508487612a9960f1601d86901c614612565b60f18110612aa957612aa961470f565b60200201518415612ad45760405180604001604052806002815260200161414160f01b815250612ae5565b604051806020016040528060008152505b604051602001612af7939291906148cb565b604051602081830303815290604052945050508080612b15906145e2565b91505061275f565b506040516001600160601b0319606087901b1660208201526034810188905260009060540160408051601f19818403018152828252805160209182012060a084018352600160608501818152602960f91b6080870152855283518085018552818152604760f81b818501528584015283518085018552908152602160f91b92810192909252918301529150600090612bb6600384614612565b60038110612bc657612bc661470f565b6020020151905083612be06127c56009600286901c614612565b612bf26127c56009600687901c614612565b8384604051602001612c08959493929190614966565b604051602081830303815290604052935060005b83811015612cbb576040805160208082018690528183018490528251808303840181526060909201909252805191012085612c67612c5c6102ee84614612565b6127d09060fa6145ca565b612c7a612c5c6102ee600a86901c614612565b612c8385613d50565b604051602001612c969493929190614cc5565b6040516020818303038152906040529550508080612cb3906145e2565b915050612c1c565b5083612cda612ccf6003601286901c614612565b6127d09060056147fb565b612cec612ccf6003601487901c614612565b604051602001612cfe93929190614db2565b60408051601f198184030181526102008301825260066101c084018181526503030303030360d41b6101e086015284528251808401845281815265190dd90cd8d960d21b60208281019190915285810191909152835180850185528281526519311c19b31b60d11b818301528585015283518085018552828152650d4d8d0e195960d21b8183015260608087019190915284518086018652838152651c323218991960d11b8184015260808701528451808601865283815265072c6c468c4760d31b8184015260a08701528451808601865283815265329c1b981ab160d11b81840181905260c08801919091528551808701875284815265190c4e584d4d60d21b8185015260e0880152855180870187528481526562393138356360d01b81850152610100880152855180870187528481526566653530306360d01b81850152610120880152855180870187528481526566333332326360d01b81850152610140880152855180870187528481526534626561363960d01b8185015261016088015285518087018752848152808401919091526101808701528451808601865292835265333332b3189b60d11b838301526101a0860192909252835191820184528382529197506000929091615f429083013990506000604051806060016040528060408152602001615f826040913990506000612f016015601688901c614612565b905080600003612f3657878383604051602001612f2093929190614e92565b6040516020818303038152906040529750613187565b80600103612f5357878383604051602001612f2093929190615063565b80600203612f6e578783604051602001612f209291906151d2565b80600303612f875787604051602001612f20919061530d565b80600403612fa05787604051602001612f209190615495565b600681116130a4578781600514612fd5576040518060400160405280600681526020016519998d8cce1960d21b815250612ff5565b6040518060400160405280600681526020016503036383934360d41b8152505b82600514613021576040518060400160405280600681526020016563633035393560d01b815250613041565b604051806040016040528060068152602001650c8d4dd8d95960d21b8152505b85858560051461306f576040518060400160405280600681526020016561623336626560d01b81525061308f565b60405180604001604052806006815260200165191a9a32b33160d11b8152505b604051602001612f20969594939291906155a8565b87846130b16007846147fb565b600e81106130c1576130c161470f565b6020020151826008146130f2576040518060400160405280600681526020016533333333333360d11b815250613112565b604051806040016040528060068152602001653332331c333360d11b8152505b858460071461313f576040518060400160405280600681526020016503030303030360d41b81525061315f565b6040518060400160405280600681526020016566663065306560d01b8152505b86604051602001613175969594939291906157aa565b60405160208183030381529060405297505b600061319b6127d06003602a8a901c614612565b6131ad6127d06003602c8b901c614612565b6131bf6127d06003602e8c901c614612565b6131d16127d0600360308d901c614612565b6131e36127d0600360328e901c614612565b6131f56127d0600360348f901c614612565b60405160200161320a96959493929190615917565b604051602081830303815290604052905060005b6002811015613346578961324f61323a6006601b8c901c614612565b6132458460086147fb565b6127d091906145ca565b61326c6132616005601e8d901c614612565b6132458560146147fb565b6132988460011461329157613286600360218e901c614612565b6127d09060036145ca565b6001613d50565b6132aa6127d0600260238f901c614612565b6132be600960248f901c6127c59190614612565b6040516020016132d396959493929190615996565b60408051601f1981840301815291905299508961330f60026132fa600360288d901c614612565b6133059060036145ca565b6127d09190614581565b8360405160200161332293929190615a88565b6040516020818303038152906040529950808061333e906145e2565b91505061321e565b50886040516020016133589190615af5565b60405160208183030381529060405298506133a58a6133768b613e51565b61337f8b613d50565b60405160200161339193929190615b27565b604051602081830303815290604052613e51565b6040516020016133b59190615c8b565b6040516020818303038152906040529c50505050505050505050505050919050565b606060076040516020016133eb9190615cd0565b604051602081830303815290604052905090565b60405163c455279160e01b81526001600160a01b038381166004830152600091818416917f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1169063c455279190602401602060405180830381865afa15801561346c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134909190615d84565b6001600160a01b0316036134a6575060016104a7565b6001600160a01b0380841660009081526005602090815260408083209386168352929052205460ff165b9392505050565b6006546001600160a01b031633146135015760405162461bcd60e51b81526004016105a790614595565b6001600160a01b0381166135665760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a7565b61356f81613ace565b50565b600080613580600284614581565b90506001600160a01b0384166136675760405173908c5fbae8dec9202d8faf7ca0277e50b87ed03b908290600081818185875af1925050503d80600081146135e4576040519150601f19603f3d011682016040523d82523d6000602084013e6135e9565b606091505b505080925050816135f957600080fd5b60405173599b418ad25c7b11bfb6a9108bb03e0e0ff8e690908290600081818185875af1925050503d806000811461364d576040519150601f19603f3d011682016040523d82523d6000602084013e613652565b606091505b5050809250508161366257600080fd5b610ab8565b60405163a9059cbb60e01b81526001600160a01b0385169063a9059cbb906136a99073908c5fbae8dec9202d8faf7ca0277e50b87ed03b9085906004016142ab565b6020604051808303816000875af11580156136c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ec9190615da1565b9150816136f857600080fd5b60405163a9059cbb60e01b81526001600160a01b0385169063a9059cbb9061373a9073599b418ad25c7b11bfb6a9108bb03e0e0ff8e6909085906004016142ab565b6020604051808303816000875af1158015613759573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061377d9190615da1565b915081610ab857600080fd5b60006001600160e01b031982166380ac58cd60e01b14806137ba57506001600160e01b03198216635b5e139f60e01b145b806104a757506301ffc9a760e01b6001600160e01b03198316146104a7565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061382b8261074e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061386f826137d9565b6138d05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105a7565b60006138db8361074e565b9050806001600160a01b0316846001600160a01b031614806139165750836001600160a01b031661390b8461053f565b6001600160a01b0316145b80613926575061392681856133ff565b949350505050565b826001600160a01b03166139418261074e565b6001600160a01b0316146139a95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016105a7565b6001600160a01b038216613a0b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105a7565b613a166000826137f6565b6001600160a01b0383166000908152600360205260408120805460019290613a3f9084906147fb565b90915550506001600160a01b0382166000908152600360205260408120805460019290613a6d9084906145ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216613b765760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105a7565b613b7f816137d9565b15613bcc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105a7565b6001600160a01b0382166000908152600360205260408120805460019290613bf59084906145ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b031603613cb05760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016105a7565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613d2884848461392e565b613d3484848484613fb6565b610ab85760405162461bcd60e51b81526004016105a790615dbe565b606081600003613d775750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613da15780613d8b816145e2565b9150613d9a9050600a83614581565b9150613d7b565b60008167ffffffffffffffff811115613dbc57613dbc6142e1565b6040519080825280601f01601f191660200182016040528015613de6576020820181803683370190505b5090505b841561392657613dfb6001836147fb565b9150613e08600a86614612565b613e139060306145ca565b60f81b818381518110613e2857613e2861470f565b60200101906001600160f81b031916908160001a905350613e4a600a86614581565b9450613dea565b60608151600003613e7057505060408051602081019091526000815290565b6000604051806060016040528060408152602001615f026040913990506000600384516002613e9f91906145ca565b613ea99190614581565b613eb490600461454c565b90506000613ec38260206145ca565b67ffffffffffffffff811115613edb57613edb6142e1565b6040519080825280601f01601f191660200182016040528015613f05576020820181803683370190505b509050818152600183018586518101602084015b81831015613f71576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101613f19565b600389510660018114613f8b5760028114613f9c57613fa8565b613d3d60f01b600119830152613fa8565b603d60f81b6000198301525b509398975050505050505050565b60006001600160a01b0384163b156140ac57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613ffa903390899088908890600401615e10565b6020604051808303816000875af1925050508015614035575060408051601f3d908101601f1916820190925261403291810190615e4d565b60015b614092573d808015614063576040519150601f19603f3d011682016040523d82523d6000602084013e614068565b606091505b50805160000361408a5760405162461bcd60e51b81526004016105a790615dbe565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613926565b506001949350505050565b8280546140c3906144ab565b90600052602060002090601f0160209004810192826140e5576000855561412b565b82601f106140fe57805160ff191683800117855561412b565b8280016001018555821561412b579182015b8281111561412b578251825591602001919060010190614110565b5061413792915061413b565b5090565b5b80821115614137576000815560010161413c565b6001600160e01b03198116811461356f57600080fd5b60006020828403121561417857600080fd5b81356134d081614150565b60005b8381101561419e578181015183820152602001614186565b83811115610ab85750506000910152565b600081518084526141c7816020860160208601614183565b601f01601f19169290920160200192915050565b6020815260006134d060208301846141af565b60006020828403121561420057600080fd5b5035919050565b6001600160a01b038116811461356f57600080fd5b6000806040838503121561422f57600080fd5b823561423a81614207565b946020939093013593505050565b60008060006060848603121561425d57600080fd5b833561426881614207565b9250602084013561427881614207565b929592945050506040919091013590565b6000806040838503121561429c57600080fd5b50508035926020909101359150565b6001600160a01b03929092168252602082015260400190565b6000602082840312156142d657600080fd5b81356134d081614207565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115614312576143126142e1565b604051601f8501601f19908116603f0116810190828211818310171561433a5761433a6142e1565b8160405280935085815286868601111561435357600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561437f57600080fd5b813567ffffffffffffffff81111561439657600080fd5b8201601f810184136143a757600080fd5b613926848235602084016142f7565b801515811461356f57600080fd5b600080604083850312156143d757600080fd5b82356143e281614207565b915060208301356143f2816143b6565b809150509250929050565b6000806000806080858703121561441357600080fd5b843561441e81614207565b9350602085013561442e81614207565b925060408501359150606085013567ffffffffffffffff81111561445157600080fd5b8501601f8101871361446257600080fd5b614471878235602084016142f7565b91505092959194509250565b6000806040838503121561449057600080fd5b823561449b81614207565b915060208301356143f281614207565b600181811c908216806144bf57607f821691505b6020821081036144df57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561456657614566614536565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826145905761459061456b565b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156145dd576145dd614536565b500190565b6000600182016145f4576145f4614536565b5060010190565b60008161460a5761460a614536565b506000190190565b6000826146215761462161456b565b500690565b60008151614638818560208601614183565b9290920192915050565b60008651614654818460208b01614183565b743c72616469616c4772616469656e742069643d226760581b9083019081528651614686816015840160208b01614183565b67111031bc1e91181760c11b6015929091019182015285516146af81601d840160208a01614183565b67111031bc9e91181760c11b601d929091019182015284516146d8816025840160208901614183565b661110391e91181760c91b60259290910191820152835161470081602c840160208801614183565b01602c01979650505050505050565b634e487b7160e01b600052603260045260246000fd5b6000875160206147388285838d01614183565b671110333c1e91181760c11b918401918252885161475c8160088501848d01614183565b88519201916147718160088501848c01614183565b671110333c9e91181760c11b6008939091019283015286516147998160108501848b01614183565b86519201916147ae8160108501848a01614183565b6f111039b83932b0b226b2ba3437b21e9160811b6010939091019283015284516147dd81838501848901614183565b61111f60f11b92019081019190915260220198975050505050505050565b60008282101561480d5761480d614536565b500390565b60008651614824818460208b01614183565b6d1e39ba37b81037b33339b2ba1e9160911b908301908152865161484f81600e840160208b01614183565b6f25222073746f702d636f6c6f723d222360801b600e9290910191820152855161488081601e840160208a01614183565b855191019061489681601e840160208901614183565b84519101906148ac81601e840160208801614183565b6211179f60e91b601e9290910191820152602101979650505050505050565b600084516148dd818460208901614183565b80830190507f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d228152602360f81b60208201528451614922816021840160208901614183565b8451910190614938816021840160208801614183565b7311179f1e17b930b234b0b623b930b234b2b73a1f60611b6021929091019182015260350195945050505050565b60008651614978818460208b01614183565b661e17b232b3399f60c91b9083019081527f3c66696c7465722069643d226e223e3c666554757262756c656e63652062617360078201526f0654672657175656e63793d22302e30360841b602782015286516149db816037840160208b01614183565b64020302e30360dc1b603792909101918201528551614a0181603c840160208a01614183565b7f2220726573756c743d224e4f49534522206e756d4f6374617665733d22332220603c92909101918201527f2f3e3c6665446973706c6163656d656e744d617020696e3d22536f7572636547605c8201527f7261706869632220696e323d224e4f49534522207363616c653d223130302220607c820152713c21b430b73732b629b2b632b1ba37b91e9160711b609c820152614cb9614afb614ad2614acc614aac60ae86018a614626565b7311103ca1b430b73732b629b2b632b1ba37b91e9160611b815260140190565b87614626565b7f223e3c2f6665446973706c6163656d656e744d61703e3c2f66696c7465723e008152601f0190565b7f3c66696c7465722069643d2267222066696c746572556e6974733d226f626a6581527f6374426f756e64696e67426f782220783d222d3235252220793d222d3235252260208201527f2077696474683d223135302522206865696768743d2231353025223e3c66655460408201527f757262756c656e636520626173654672657175656e63793d22302e3120302e3160608201527f2220726573756c743d224e4f49534522206e756d4f6374617665733d2232222060808201527f2f3e3c6665446973706c6163656d656e744d617020696e3d22536f757263654760a08201527f7261706869632220696e323d224e4f49534522207363616c653d22302e36362260c08201527f20784368616e6e656c53656c6563746f723d22522220794368616e6e656c536560e08201527f6c6563746f723d22422220726573756c743d22746d70223e3c2f6665446973706101008201527f6c6163656d656e744d61703e3c6665426c656e6420696e3d22746d702220696e6101208201527f323d22536f757263654772617068696322206d6f64653d226f7665726c6179226101408201526a179f1e17b334b63a32b91f60a91b61016082015261016b0190565b98975050505050505050565b60008551614cd7818460208a01614183565b781e3932b1ba103c1e9118981291103c9e911c929110393c1e9160391b9083019081528551614d0d816019840160208a01614183565b651110393c9e9160d11b601992909101918201528451614d3481601f840160208901614183565b7f222077696474683d2237372522206865696768743d22373725222066696c6c3d601f9290910191820152662275726c28236760c81b603f8201528351614d82816046840160208801614183565b741491103334b63a32b91e913ab9361411b71491179f60591b60469290910191820152605b019695505050505050565b60008451614dc4818460208901614183565b80830190507f3c7376672077696474683d223130302522206865696768743d2231303025222081526976696577426f783d222d60b01b60208201528451614e1281602a840160208901614183565b61202d60f01b602a92909101918201528351614e3581602c840160208801614183565b7f20333620333622207072657365727665417370656374526174696f3d22784d69602c92909101918201527f64594d6964206d656574222066696c7465723d2275726c28236729223e000000604c82015260690195945050505050565b60008451614ea4818460208901614183565b80830190507f3c70617468207374726f6b653d22236666633131302220643d224d31302c313181527f68364d31302c313268314d31352c313268314d31302c313368314d31352c313360208201527f68314d372c313468314d31302c313468314d31352c313468314d372c3135683160408201527f4d31302c313568314d31352c313568314d31302c31366836222f3e3c7061746860608201527f207374726f6b653d22236639386633302220643d224d31372c313168364d313760808201527f2c313268314d32322c313268314d31372c313368314d32322c313368314d313760a08201527f2c313468314d32322c313468314d31372c313568314d32322c313568314d313760c08201527f2c31366836222f3e3c70617468207374726f6b653d222366666666666622206460e0820152611e9160f11b6101008201526101028551614ff78183850160208a01614183565b614cb961502261501c8484870101600080516020615ec28339815191528152601d0190565b88614626565b7f222f3e3c70617468207374726f6b653d22236637386131382220643d224d372c81526e1899b419a6989b161899b41891179f60891b6020820152602f0190565b60008451615075818460208901614183565b80830190507f3c70617468207374726f6b653d22236666363338642220643d224d31302c313181527f68364d31372c313168364d31302c313268314d31352c313268314d31372c313260208201527f68314d32322c313268314d372c313368344d31352c313368334d32322c31336860408201527f314d372c313468344d31352c313468334d32322c313468314d372c313568314d60608201527f31302c313568314d31352c313568314d31372c313568314d32322c313568314d60808201527f31302c313668364d31372c31366836222f3e3c70617468207374726f6b653d2260a08201526b11b333333333331110321e9160a11b60c082015284516151838160cc840160208901614183565b600080516020615ec283398151915260cc929091019182015283516151af8160e9840160208801614183565b6151c760e9828401016211179f60e91b815260030190565b979650505050505050565b600083516151e4818460208801614183565b8083019050600080516020615ee283398151915281527f68364d31372c313168364d31302c313268314d31332c313268334d31372c313260208201527f68314d32302c313268334d372c313368344d31332c313368354d32302c31336860408201527f334d372c313468314d31302c313468314d31332c313468334d31372c3134683160608201527f4d32302c313468334d372c313568314d31302c313568314d31332c313568334d60808201527f31372c313568314d32302c313568334d31302c313668364d31372c313668362260a08201527f2f3e3c70617468207374726f6b653d22236666666666662220643d220000000060c082015283516152f18160dc840160208801614183565b6211179f60e91b60dc929091019182015260df01949350505050565b6000825161531f818460208701614183565b600080516020615ee28339815191529201918252507f68364d31372c313168364d31302c313268334d31342c313268324d31372c313260208201527f68334d32312c313268324d372c31336831364d372c313468314d31302c31346860408201527f314d31322c313468324d31352c313468314d31372c313468314d31392c31346860608201527f324d32322c313468314d372c313568314d31302c313568364d31372c3135683660808201527f4d31302c313668364d31372c31366836222f3e3c70617468207374726f6b653d60a08201527f22236666306530652220643d224d31332c313268314d32302c31326831222f3e60c08201527f3c70617468207374726f6b653d22233061646334642220643d224d31312c313460e08201527f68314d31382c31346831222f3e3c70617468207374726f6b653d2223313932396101008201527f66342220643d224d31342c313468314d32312c31346831222f3e00000000000061012082015261013a01919050565b600082516154a7818460208701614183565b600080516020615ee28339815191529201918252507f68364d31372c313168364d31302c313268344d31352c313268314d31372c313260208201527f68344d32322c313268314d372c313368374d31352c313368364d32322c31336860408201527f314d372c313468314d31302c313468364d31372c313468364d372c313568314d60608201527f31302c313568364d31372c313568364d31302c313668364d31372c313668362260808201527f2f3e3c70617468207374726f6b653d22236666666666662220643d224d31342c60a08201527f313268314d32312c313268314d31342c313368314d32312c31336831222f3e0060c082015260df01919050565b600087516155ba818460208c01614183565b6e3c70617468207374726f6b653d222360881b90830190815287516155e681600f840160208c01614183565b7f2220643d224d31302c313168364d31302c313268314d31352c313268314d3130600f92909101918201527f2c313368314d31352c313368314d31302c313468314d31352c313468314d3130602f8201527f2c313568314d31352c313568314d31302c31366836222f3e3c70617468207374604f82015266726f6b653d222360c81b606f8201528651615680816076840160208b01614183565b7f2220643d224d31372c313168364d31372c313268314d32322c313268314d3137607692909101918201527f2c313368314d32322c313368314d372c313468314d31372c313468314d32322c60968201527f313468314d372c313568314d31372c313568314d32322c313568314d31372c3160b68201527f366836222f3e3c70617468207374726f6b653d22236666666666662220643d2260d682015261579d61577a61577461575661575061573960f687018c614626565b600080516020615ec28339815191528152601d0190565b89614626565b71222f3e3c70617468207374726f6b653d222360701b815260120190565b86614626565b761110321e91269b961899b419a6989b161899b41891179f60491b815260170190565b9998505050505050505050565b600087516157bc818460208c01614183565b6e3c70617468207374726f6b653d222360881b90830190815287516157e881600f840160208c01614183565b7f2220643d224d31302c313168364d31372c313168364d31302c313268314d3135600f92909101918201527f2c313268314d31372c313268314d32322c313268314d372c313368344d31352c602f8201527f313368334d32322c313368314d372c313468314d31302c313468314d31352c31604f8201527f3468314d31372c313468314d32322c313468314d372c313568314d31302c3135606f8201527f68314d31352c313568314d31372c313568314d32322c313568314d31302c3136608f8201527f68364d31372c31366836222f3e3c70617468207374726f6b653d22230000000060af82015261579d6159086157746158f16157506157566159028360cb89018f614626565b641110321e9160d91b815260050190565b8c614626565b6211179f60e91b815260030190565b60008751602061592a8285838d01614183565b88519184019161593d8184848d01614183565b885192019161594f8184848c01614183565b87519201916159618184848b01614183565b86519201916159738184848a01614183565b85519201916159858184848901614183565b919091019998505050505050505050565b600087516159a8818460208c01614183565b681e3932b1ba103c1e9160b91b90830190815287516159ce816009840160208c01614183565b6411103c9e9160d91b6009929091019182015286516159f481600e840160208b01614183565b6811103bb4b23a341e9160b91b600e92909101918201528551615a1e816017840160208a01614183565b7f22206865696768743d223122207472616e73666f726d3d22726f74617465282d601792909101918201528451615a5c816037840160208901614183565b601760f91b6037929091019182015261579d615a7b6038830186614626565b600b60fa1b815260010190565b60008451615a9a818460208901614183565b845190830190615aae818360208901614183565b6d2c302e3529222066696c6c3d222360901b91019081528351615ad881600e840160208801614183565b6211179f60e91b600e929091019182015260110195945050505050565b60008251615b07818460208701614183565b651e17b9bb339f60d11b9201828152600681019290925250600c01919050565b6e03d913730b6b2911d11213637bab71608d1b81528351600090615b5281600f850160208901614183565b7f222c20226465736372697074696f6e223a225468652062656175746966756c20600f918401918201527f6f6e2d636861696e20426c6f756e2077617320626f726e2c2061204343302074602f8201527f72696275746520746f207468652069636f6e6963204e6f756e732070726f6a65604f8201526f31ba171116101134b6b0b3b2911d101160811b606f8201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000607f8201528451615c1a816099840160208901614183565b7f222c202261747472696275746573223a207b2274726169745f74797065223a2060999290910191820152720112630bcb2b939911610113b30b63ab2911d1606d1b60b98201528351615c748160cc840160208801614183565b6151c760cc82840101617d7d60f01b815260020190565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251615cc381601d850160208701614183565b91909101601d0192915050565b66697066733a2f2f60c81b8152600060076000845481600182811c915080831680615cfc57607f831692505b60208084108203615d1b57634e487b7160e01b86526022600452602486fd5b818015615d2f5760018114615d4457615d75565b60ff1986168a890152848a0188019650615d75565b60008b81526020902060005b86811015615d6b5781548c82018b0152908501908301615d50565b505087858b010196505b50949998505050505050505050565b600060208284031215615d9657600080fd5b81516134d081614207565b600060208284031215615db357600080fd5b81516134d0816143b6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615e43908301846141af565b9695505050505050565b600060208284031215615e5f57600080fd5b81516134d08161415056fe3c7376672077696474683d223230303022206865696768743d2232303030222076657273696f6e3d22312e312220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c646566733e222f3e3c70617468207374726f6b653d22233030303030302220643d220000003c70617468207374726f6b653d22233030303030302220643d224d31302c31314142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4d31312c313268324d31382c313268324d31312c313368324d31382c313368324d31312c313468324d31382c313468324d31312c313568324d31382c313568324d31332c313268324d32302c313268324d31332c313368324d32302c313368324d31332c313468324d32302c313468324d31332c313568324d32302c31356832a264697066735822122058381588fc6dfe88fbabd87bcaa215348f1ce38851e5f7f919c185abda2b624964736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002e516d594d6a5a554277703777704c74564d346852693659615863694c4c7a4733395a314a614c6f74694a51507037000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : contractCID (string): QmYMjZUBwp7wpLtVM4hRi6YaXciLLzG39Z1JaLotiJQPp7
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000002e
Arg [2] : 516d594d6a5a554277703777704c74564d346852693659615863694c4c7a4733
Arg [3] : 395a314a614c6f74694a51507037000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $2,497.33 | 0.0222 | $55.49 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.