Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 24 from a total of 24 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Multicall | 15622082 | 843 days ago | IN | 0 ETH | 0.00160376 | ||||
Multicall | 15616512 | 844 days ago | IN | 0 ETH | 0.00058461 | ||||
Multicall | 15606422 | 845 days ago | IN | 0 ETH | 0.00111469 | ||||
Multicall | 15603764 | 846 days ago | IN | 0 ETH | 0.00028314 | ||||
Multicall | 15596266 | 847 days ago | IN | 0 ETH | 0.00121877 | ||||
Multicall | 15596197 | 847 days ago | IN | 0 ETH | 0.00134837 | ||||
Multicall | 15596149 | 847 days ago | IN | 0 ETH | 0.00129838 | ||||
Multicall | 15596108 | 847 days ago | IN | 0 ETH | 0.001113 | ||||
Multicall | 15593688 | 847 days ago | IN | 0 ETH | 0.00169539 | ||||
Multicall | 15591854 | 847 days ago | IN | 0 ETH | 0.00039796 | ||||
Multicall | 15591655 | 848 days ago | IN | 0 ETH | 0.0009078 | ||||
Multicall | 15587799 | 848 days ago | IN | 0 ETH | 0.00072165 | ||||
Multicall | 15587576 | 848 days ago | IN | 0 ETH | 0.00025705 | ||||
Multicall | 15587536 | 848 days ago | IN | 0 ETH | 0.00035148 | ||||
Multicall | 15584431 | 849 days ago | IN | 0 ETH | 0.00210374 | ||||
Multicall | 15582545 | 849 days ago | IN | 0 ETH | 0.00122151 | ||||
Multicall | 15580924 | 849 days ago | IN | 0 ETH | 0.00045903 | ||||
Multicall | 15580401 | 849 days ago | IN | 0 ETH | 0.00099403 | ||||
Multicall | 15579369 | 849 days ago | IN | 0 ETH | 0.00117614 | ||||
Multicall | 15579195 | 849 days ago | IN | 0 ETH | 0.00059357 | ||||
Multicall | 15579150 | 849 days ago | IN | 0 ETH | 0.00039202 | ||||
Multicall | 15579089 | 849 days ago | IN | 0 ETH | 0.00091926 | ||||
Multicall | 15578799 | 849 days ago | IN | 0 ETH | 0.00041687 | ||||
Multicall | 15578796 | 849 days ago | IN | 0 ETH | 0.00084873 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
PublicResolver
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-21 */ // File: @ensdomains/ens/contracts/ENS.sol pragma solidity >=0.4.24; interface ENS { // Logged when the owner of a node assigns a new owner to a subnode. event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); // Logged when the owner of a node transfers ownership to a new account. event Transfer(bytes32 indexed node, address owner); // Logged when the resolver for a node changes. event NewResolver(bytes32 indexed node, address resolver); // Logged when the TTL of a node changes event NewTTL(bytes32 indexed node, uint64 ttl); function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external; function setResolver(bytes32 node, address resolver) external; function setOwner(bytes32 node, address owner) external; function setTTL(bytes32 node, uint64 ttl) external; function owner(bytes32 node) external view returns (address); function resolver(bytes32 node) external view returns (address); function ttl(bytes32 node) external view returns (uint64); } // File: contracts/ResolverBase.sol pragma solidity ^0.5.0; contract ResolverBase { bytes4 private constant INTERFACE_META_ID = 0x01ffc9a7; function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == INTERFACE_META_ID; } function isAuthorised(bytes32 node) internal view returns(bool); modifier authorised(bytes32 node) { require(isAuthorised(node)); _; } function bytesToAddress(bytes memory b) internal pure returns(address payable a) { require(b.length == 20); assembly { a := div(mload(add(b, 32)), exp(256, 12)) } } function addressToBytes(address a) internal pure returns(bytes memory b) { b = new bytes(20); assembly { mstore(add(b, 32), mul(a, exp(256, 12))) } } } // File: contracts/profiles/ABIResolver.sol pragma solidity ^0.5.0; contract ABIResolver is ResolverBase { bytes4 constant private ABI_INTERFACE_ID = 0x2203ab56; event ABIChanged(bytes32 indexed node, uint256 indexed contentType); mapping(bytes32=>mapping(uint256=>bytes)) abis; /** * Sets the ABI associated with an ENS node. * Nodes may have one ABI of each content type. To remove an ABI, set it to * the empty string. * @param node The node to update. * @param contentType The content type of the ABI * @param data The ABI data. */ function setABI(bytes32 node, uint256 contentType, bytes calldata data) external authorised(node) { // Content types must be powers of 2 require(((contentType - 1) & contentType) == 0); abis[node][contentType] = data; emit ABIChanged(node, contentType); } /** * Returns the ABI associated with an ENS node. * Defined in EIP205. * @param node The ENS node to query * @param contentTypes A bitwise OR of the ABI formats accepted by the caller. * @return contentType The content type of the return value * @return data The ABI data */ function ABI(bytes32 node, uint256 contentTypes) external view returns (uint256, bytes memory) { mapping(uint256=>bytes) storage abiset = abis[node]; for (uint256 contentType = 1; contentType <= contentTypes; contentType <<= 1) { if ((contentType & contentTypes) != 0 && abiset[contentType].length > 0) { return (contentType, abiset[contentType]); } } return (0, bytes("")); } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == ABI_INTERFACE_ID || super.supportsInterface(interfaceID); } } // File: contracts/profiles/AddrResolver.sol pragma solidity ^0.5.0; contract AddrResolver is ResolverBase { bytes4 constant private ADDR_INTERFACE_ID = 0x3b3b57de; bytes4 constant private ADDRESS_INTERFACE_ID = 0xf1cb7e06; uint constant private COIN_TYPE_ETH = 60; event AddrChanged(bytes32 indexed node, address a); event AddressChanged(bytes32 indexed node, uint coinType, bytes newAddress); mapping(bytes32=>mapping(uint=>bytes)) _addresses; /** * Sets the address associated with an ENS node. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param a The address to set. */ function setAddr(bytes32 node, address a) external authorised(node) { setAddr(node, COIN_TYPE_ETH, addressToBytes(a)); } /** * Returns the address associated with an ENS node. * @param node The ENS node to query. * @return The associated address. */ function addr(bytes32 node) public view returns (address payable) { bytes memory a = addr(node, COIN_TYPE_ETH); if(a.length == 0) { return address(0); } return bytesToAddress(a); } function setAddr(bytes32 node, uint coinType, bytes memory a) public authorised(node) { emit AddressChanged(node, coinType, a); if(coinType == COIN_TYPE_ETH) { emit AddrChanged(node, bytesToAddress(a)); } _addresses[node][coinType] = a; } function addr(bytes32 node, uint coinType) public view returns(bytes memory) { return _addresses[node][coinType]; } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == ADDR_INTERFACE_ID || interfaceID == ADDRESS_INTERFACE_ID || super.supportsInterface(interfaceID); } } // File: contracts/profiles/ContentHashResolver.sol pragma solidity ^0.5.0; contract ContentHashResolver is ResolverBase { bytes4 constant private CONTENT_HASH_INTERFACE_ID = 0xbc1c58d1; event ContenthashChanged(bytes32 indexed node, bytes hash); mapping(bytes32=>bytes) hashes; /** * Sets the contenthash associated with an ENS node. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param hash The contenthash to set */ function setContenthash(bytes32 node, bytes calldata hash) external authorised(node) { hashes[node] = hash; emit ContenthashChanged(node, hash); } /** * Returns the contenthash associated with an ENS node. * @param node The ENS node to query. * @return The associated contenthash. */ function contenthash(bytes32 node) external view returns (bytes memory) { return hashes[node]; } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == CONTENT_HASH_INTERFACE_ID || super.supportsInterface(interfaceID); } } // File: @ensdomains/dnssec-oracle/contracts/BytesUtils.sol pragma solidity >0.4.23; library BytesUtils { /* * @dev Returns the keccak-256 hash of a byte range. * @param self The byte string to hash. * @param offset The position to start hashing at. * @param len The number of bytes to hash. * @return The hash of the byte range. */ function keccak(bytes memory self, uint offset, uint len) internal pure returns (bytes32 ret) { require(offset + len <= self.length); assembly { ret := keccak256(add(add(self, 32), offset), len) } } /* * @dev Returns a positive number if `other` comes lexicographically after * `self`, a negative number if it comes before, or zero if the * contents of the two bytes are equal. * @param self The first bytes to compare. * @param other The second bytes to compare. * @return The result of the comparison. */ function compare(bytes memory self, bytes memory other) internal pure returns (int) { return compare(self, 0, self.length, other, 0, other.length); } /* * @dev Returns a positive number if `other` comes lexicographically after * `self`, a negative number if it comes before, or zero if the * contents of the two bytes are equal. Comparison is done per-rune, * on unicode codepoints. * @param self The first bytes to compare. * @param offset The offset of self. * @param len The length of self. * @param other The second bytes to compare. * @param otheroffset The offset of the other string. * @param otherlen The length of the other string. * @return The result of the comparison. */ function compare(bytes memory self, uint offset, uint len, bytes memory other, uint otheroffset, uint otherlen) internal pure returns (int) { uint shortest = len; if (otherlen < len) shortest = otherlen; uint selfptr; uint otherptr; assembly { selfptr := add(self, add(offset, 32)) otherptr := add(other, add(otheroffset, 32)) } for (uint idx = 0; idx < shortest; idx += 32) { uint a; uint b; assembly { a := mload(selfptr) b := mload(otherptr) } if (a != b) { // Mask out irrelevant bytes and check again uint mask; if (shortest > 32) { mask = uint256(- 1); // aka 0xffffff.... } else { mask = ~(2 ** (8 * (32 - shortest + idx)) - 1); } uint diff = (a & mask) - (b & mask); if (diff != 0) return int(diff); } selfptr += 32; otherptr += 32; } return int(len) - int(otherlen); } /* * @dev Returns true if the two byte ranges are equal. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @param otherOffset The offset into the second byte range. * @param len The number of bytes to compare * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other, uint otherOffset, uint len) internal pure returns (bool) { return keccak(self, offset, len) == keccak(other, otherOffset, len); } /* * @dev Returns true if the two byte ranges are equal with offsets. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @param otherOffset The offset into the second byte range. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other, uint otherOffset) internal pure returns (bool) { return keccak(self, offset, self.length - offset) == keccak(other, otherOffset, other.length - otherOffset); } /* * @dev Compares a range of 'self' to all of 'other' and returns True iff * they are equal. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other) internal pure returns (bool) { return self.length >= offset + other.length && equals(self, offset, other, 0, other.length); } /* * @dev Returns true if the two byte ranges are equal. * @param self The first byte range to compare. * @param other The second byte range to compare. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, bytes memory other) internal pure returns(bool) { return self.length == other.length && equals(self, 0, other, 0, self.length); } /* * @dev Returns the 8-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 8 bits of the string, interpreted as an integer. */ function readUint8(bytes memory self, uint idx) internal pure returns (uint8 ret) { return uint8(self[idx]); } /* * @dev Returns the 16-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 16 bits of the string, interpreted as an integer. */ function readUint16(bytes memory self, uint idx) internal pure returns (uint16 ret) { require(idx + 2 <= self.length); assembly { ret := and(mload(add(add(self, 2), idx)), 0xFFFF) } } /* * @dev Returns the 32-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bits of the string, interpreted as an integer. */ function readUint32(bytes memory self, uint idx) internal pure returns (uint32 ret) { require(idx + 4 <= self.length); assembly { ret := and(mload(add(add(self, 4), idx)), 0xFFFFFFFF) } } /* * @dev Returns the 32 byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bytes of the string. */ function readBytes32(bytes memory self, uint idx) internal pure returns (bytes32 ret) { require(idx + 32 <= self.length); assembly { ret := mload(add(add(self, 32), idx)) } } /* * @dev Returns the 32 byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bytes of the string. */ function readBytes20(bytes memory self, uint idx) internal pure returns (bytes20 ret) { require(idx + 20 <= self.length); assembly { ret := and(mload(add(add(self, 32), idx)), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000) } } /* * @dev Returns the n byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes. * @param len The number of bytes. * @return The specified 32 bytes of the string. */ function readBytesN(bytes memory self, uint idx, uint len) internal pure returns (bytes32 ret) { require(len <= 32); require(idx + len <= self.length); assembly { let mask := not(sub(exp(256, sub(32, len)), 1)) ret := and(mload(add(add(self, 32), idx)), mask) } } function memcpy(uint dest, uint src, uint len) private pure { // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } /* * @dev Copies a substring into a new byte string. * @param self The byte string to copy from. * @param offset The offset to start copying at. * @param len The number of bytes to copy. */ function substring(bytes memory self, uint offset, uint len) internal pure returns(bytes memory) { require(offset + len <= self.length); bytes memory ret = new bytes(len); uint dest; uint src; assembly { dest := add(ret, 32) src := add(add(self, 32), offset) } memcpy(dest, src, len); return ret; } // Maps characters from 0x30 to 0x7A to their base32 values. // 0xFF represents invalid characters in that range. bytes constant base32HexTable = hex'00010203040506070809FFFFFFFFFFFFFF0A0B0C0D0E0F101112131415161718191A1B1C1D1E1FFFFFFFFFFFFFFFFFFFFF0A0B0C0D0E0F101112131415161718191A1B1C1D1E1F'; /** * @dev Decodes unpadded base32 data of up to one word in length. * @param self The data to decode. * @param off Offset into the string to start at. * @param len Number of characters to decode. * @return The decoded data, left aligned. */ function base32HexDecodeWord(bytes memory self, uint off, uint len) internal pure returns(bytes32) { require(len <= 52); uint ret = 0; uint8 decoded; for(uint i = 0; i < len; i++) { bytes1 char = self[off + i]; require(char >= 0x30 && char <= 0x7A); decoded = uint8(base32HexTable[uint(uint8(char)) - 0x30]); require(decoded <= 0x20); if(i == len - 1) { break; } ret = (ret << 5) | decoded; } uint bitlen = len * 5; if(len % 8 == 0) { // Multiple of 8 characters, no padding ret = (ret << 5) | decoded; } else if(len % 8 == 2) { // Two extra characters - 1 byte ret = (ret << 3) | (decoded >> 2); bitlen -= 2; } else if(len % 8 == 4) { // Four extra characters - 2 bytes ret = (ret << 1) | (decoded >> 4); bitlen -= 4; } else if(len % 8 == 5) { // Five extra characters - 3 bytes ret = (ret << 4) | (decoded >> 1); bitlen -= 1; } else if(len % 8 == 7) { // Seven extra characters - 4 bytes ret = (ret << 2) | (decoded >> 3); bitlen -= 3; } else { revert(); } return bytes32(ret << (256 - bitlen)); } } // File: @ensdomains/buffer/contracts/Buffer.sol pragma solidity >0.4.18; /** * @dev A library for working with mutable byte buffers in Solidity. * * Byte buffers are mutable and expandable, and provide a variety of primitives * for writing to them. At any time you can fetch a bytes object containing the * current contents of the buffer. The bytes object should not be stored between * operations, as it may change due to resizing of the buffer. */ library Buffer { /** * @dev Represents a mutable buffer. Buffers have a current value (buf) and * a capacity. The capacity may be longer than the current value, in * which case it can be extended without the need to allocate more memory. */ struct buffer { bytes buf; uint capacity; } /** * @dev Initializes a buffer with an initial capacity. * @param buf The buffer to initialize. * @param capacity The number of bytes of space to allocate the buffer. * @return The buffer, for chaining. */ function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) { if (capacity % 32 != 0) { capacity += 32 - (capacity % 32); } // Allocate space for the buffer data buf.capacity = capacity; assembly { let ptr := mload(0x40) mstore(buf, ptr) mstore(ptr, 0) mstore(0x40, add(32, add(ptr, capacity))) } return buf; } /** * @dev Initializes a new buffer from an existing bytes object. * Changes to the buffer may mutate the original value. * @param b The bytes object to initialize the buffer with. * @return A new buffer. */ function fromBytes(bytes memory b) internal pure returns(buffer memory) { buffer memory buf; buf.buf = b; buf.capacity = b.length; return buf; } function resize(buffer memory buf, uint capacity) private pure { bytes memory oldbuf = buf.buf; init(buf, capacity); append(buf, oldbuf); } function max(uint a, uint b) private pure returns(uint) { if (a > b) { return a; } return b; } /** * @dev Sets buffer length to 0. * @param buf The buffer to truncate. * @return The original buffer, for chaining.. */ function truncate(buffer memory buf) internal pure returns (buffer memory) { assembly { let bufptr := mload(buf) mstore(bufptr, 0) } return buf; } /** * @dev Writes a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The start offset to write to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) { require(len <= data.length); if (off + len > buf.capacity) { resize(buf, max(buf.capacity, len + off) * 2); } uint dest; uint src; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Start address = buffer address + offset + sizeof(buffer length) dest := add(add(bufptr, 32), off) // Update buffer length if we're extending it if gt(add(len, off), buflen) { mstore(bufptr, add(len, off)) } src := add(data, 32) } // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } return buf; } /** * @dev Appends a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, len); } /** * @dev Appends a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, data.length); } /** * @dev Writes a byte to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write the byte at. * @param data The data to append. * @return The original buffer, for chaining. */ function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) { if (off >= buf.capacity) { resize(buf, buf.capacity * 2); } assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Address = buffer address + sizeof(buffer length) + off let dest := add(add(bufptr, off), 32) mstore8(dest, data) // Update buffer length if we extended it if eq(off, buflen) { mstore(bufptr, add(buflen, 1)) } } return buf; } /** * @dev Appends a byte to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) { return writeUint8(buf, buf.buf.length, data); } /** * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would * exceed the capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @param len The number of bytes to write (left-aligned). * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) { if (len + off > buf.capacity) { resize(buf, (len + off) * 2); } uint mask = 256 ** len - 1; // Right-align data data = data >> (8 * (32 - len)); assembly { // Memory address of the buffer data let bufptr := mload(buf) // Address = buffer address + sizeof(buffer length) + off + len let dest := add(add(bufptr, off), len) mstore(dest, or(and(mload(dest), not(mask)), data)) // Update buffer length if we extended it if gt(add(off, len), mload(bufptr)) { mstore(bufptr, add(off, len)) } } return buf; } /** * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @return The original buffer, for chaining. */ function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) { return write(buf, off, bytes32(data), 20); } /** * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chhaining. */ function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, bytes32(data), 20); } /** * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, 32); } /** * @dev Writes an integer to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @param len The number of bytes to write (right-aligned). * @return The original buffer, for chaining. */ function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) { if (len + off > buf.capacity) { resize(buf, (len + off) * 2); } uint mask = 256 ** len - 1; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Address = buffer address + off + sizeof(buffer length) + len let dest := add(add(bufptr, off), len) mstore(dest, or(and(mload(dest), not(mask)), data)) // Update buffer length if we extended it if gt(add(off, len), mload(bufptr)) { mstore(bufptr, add(off, len)) } } return buf; } /** * @dev Appends a byte to the end of the buffer. Resizes if doing so would * exceed the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer. */ function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) { return writeInt(buf, buf.buf.length, data, len); } } // File: @ensdomains/dnssec-oracle/contracts/RRUtils.sol pragma solidity >0.4.23; /** * @dev RRUtils is a library that provides utilities for parsing DNS resource records. */ library RRUtils { using BytesUtils for *; using Buffer for *; /** * @dev Returns the number of bytes in the DNS name at 'offset' in 'self'. * @param self The byte array to read a name from. * @param offset The offset to start reading at. * @return The length of the DNS name at 'offset', in bytes. */ function nameLength(bytes memory self, uint offset) internal pure returns(uint) { uint idx = offset; while (true) { assert(idx < self.length); uint labelLen = self.readUint8(idx); idx += labelLen + 1; if (labelLen == 0) { break; } } return idx - offset; } /** * @dev Returns a DNS format name at the specified offset of self. * @param self The byte array to read a name from. * @param offset The offset to start reading at. * @return The name. */ function readName(bytes memory self, uint offset) internal pure returns(bytes memory ret) { uint len = nameLength(self, offset); return self.substring(offset, len); } /** * @dev Returns the number of labels in the DNS name at 'offset' in 'self'. * @param self The byte array to read a name from. * @param offset The offset to start reading at. * @return The number of labels in the DNS name at 'offset', in bytes. */ function labelCount(bytes memory self, uint offset) internal pure returns(uint) { uint count = 0; while (true) { assert(offset < self.length); uint labelLen = self.readUint8(offset); offset += labelLen + 1; if (labelLen == 0) { break; } count += 1; } return count; } /** * @dev An iterator over resource records. */ struct RRIterator { bytes data; uint offset; uint16 dnstype; uint16 class; uint32 ttl; uint rdataOffset; uint nextOffset; } /** * @dev Begins iterating over resource records. * @param self The byte string to read from. * @param offset The offset to start reading at. * @return An iterator object. */ function iterateRRs(bytes memory self, uint offset) internal pure returns (RRIterator memory ret) { ret.data = self; ret.nextOffset = offset; next(ret); } /** * @dev Returns true iff there are more RRs to iterate. * @param iter The iterator to check. * @return True iff the iterator has finished. */ function done(RRIterator memory iter) internal pure returns(bool) { return iter.offset >= iter.data.length; } /** * @dev Moves the iterator to the next resource record. * @param iter The iterator to advance. */ function next(RRIterator memory iter) internal pure { iter.offset = iter.nextOffset; if (iter.offset >= iter.data.length) { return; } // Skip the name uint off = iter.offset + nameLength(iter.data, iter.offset); // Read type, class, and ttl iter.dnstype = iter.data.readUint16(off); off += 2; iter.class = iter.data.readUint16(off); off += 2; iter.ttl = iter.data.readUint32(off); off += 4; // Read the rdata uint rdataLength = iter.data.readUint16(off); off += 2; iter.rdataOffset = off; iter.nextOffset = off + rdataLength; } /** * @dev Returns the name of the current record. * @param iter The iterator. * @return A new bytes object containing the owner name from the RR. */ function name(RRIterator memory iter) internal pure returns(bytes memory) { return iter.data.substring(iter.offset, nameLength(iter.data, iter.offset)); } /** * @dev Returns the rdata portion of the current record. * @param iter The iterator. * @return A new bytes object containing the RR's RDATA. */ function rdata(RRIterator memory iter) internal pure returns(bytes memory) { return iter.data.substring(iter.rdataOffset, iter.nextOffset - iter.rdataOffset); } /** * @dev Checks if a given RR type exists in a type bitmap. * @param self The byte string to read the type bitmap from. * @param offset The offset to start reading at. * @param rrtype The RR type to check for. * @return True if the type is found in the bitmap, false otherwise. */ function checkTypeBitmap(bytes memory self, uint offset, uint16 rrtype) internal pure returns (bool) { uint8 typeWindow = uint8(rrtype >> 8); uint8 windowByte = uint8((rrtype & 0xff) / 8); uint8 windowBitmask = uint8(uint8(1) << (uint8(7) - uint8(rrtype & 0x7))); for (uint off = offset; off < self.length;) { uint8 window = self.readUint8(off); uint8 len = self.readUint8(off + 1); if (typeWindow < window) { // We've gone past our window; it's not here. return false; } else if (typeWindow == window) { // Check this type bitmap if (len * 8 <= windowByte) { // Our type is past the end of the bitmap return false; } return (self.readUint8(off + windowByte + 2) & windowBitmask) != 0; } else { // Skip this type bitmap off += len + 2; } } return false; } function compareNames(bytes memory self, bytes memory other) internal pure returns (int) { if (self.equals(other)) { return 0; } uint off; uint otheroff; uint prevoff; uint otherprevoff; uint counts = labelCount(self, 0); uint othercounts = labelCount(other, 0); // Keep removing labels from the front of the name until both names are equal length while (counts > othercounts) { prevoff = off; off = progress(self, off); counts--; } while (othercounts > counts) { otherprevoff = otheroff; otheroff = progress(other, otheroff); othercounts--; } // Compare the last nonequal labels to each other while (counts > 0 && !self.equals(off, other, otheroff)) { prevoff = off; off = progress(self, off); otherprevoff = otheroff; otheroff = progress(other, otheroff); counts -= 1; } if (off == 0) { return -1; } if(otheroff == 0) { return 1; } return self.compare(prevoff + 1, self.readUint8(prevoff), other, otherprevoff + 1, other.readUint8(otherprevoff)); } function progress(bytes memory body, uint off) internal pure returns(uint) { return off + 1 + body.readUint8(off); } } // File: contracts/profiles/DNSResolver.sol pragma solidity ^0.5.0; contract DNSResolver is ResolverBase { using RRUtils for *; using BytesUtils for bytes; bytes4 constant private DNS_RECORD_INTERFACE_ID = 0xa8fa5682; // DNSRecordChanged is emitted whenever a given node/name/resource's RRSET is updated. event DNSRecordChanged(bytes32 indexed node, bytes name, uint16 resource, bytes record); // DNSRecordDeleted is emitted whenever a given node/name/resource's RRSET is deleted. event DNSRecordDeleted(bytes32 indexed node, bytes name, uint16 resource); // DNSZoneCleared is emitted whenever a given node's zone information is cleared. event DNSZoneCleared(bytes32 indexed node); // Version the mapping for each zone. This allows users who have lost // track of their entries to effectively delete an entire zone by bumping // the version number. // node => version mapping(bytes32=>uint256) private versions; // The records themselves. Stored as binary RRSETs // node => version => name => resource => data mapping(bytes32=>mapping(uint256=>mapping(bytes32=>mapping(uint16=>bytes)))) private records; // Count of number of entries for a given name. Required for DNS resolvers // when resolving wildcards. // node => version => name => number of records mapping(bytes32=>mapping(uint256=>mapping(bytes32=>uint16))) private nameEntriesCount; /** * Set one or more DNS records. Records are supplied in wire-format. * Records with the same node/name/resource must be supplied one after the * other to ensure the data is updated correctly. For example, if the data * was supplied: * a.example.com IN A 1.2.3.4 * a.example.com IN A 5.6.7.8 * www.example.com IN CNAME a.example.com. * then this would store the two A records for a.example.com correctly as a * single RRSET, however if the data was supplied: * a.example.com IN A 1.2.3.4 * www.example.com IN CNAME a.example.com. * a.example.com IN A 5.6.7.8 * then this would store the first A record, the CNAME, then the second A * record which would overwrite the first. * * @param node the namehash of the node for which to set the records * @param data the DNS wire format records to set */ function setDNSRecords(bytes32 node, bytes calldata data) external authorised(node) { uint16 resource = 0; uint256 offset = 0; bytes memory name; bytes memory value; bytes32 nameHash; // Iterate over the data to add the resource records for (RRUtils.RRIterator memory iter = data.iterateRRs(0); !iter.done(); iter.next()) { if (resource == 0) { resource = iter.dnstype; name = iter.name(); nameHash = keccak256(abi.encodePacked(name)); value = bytes(iter.rdata()); } else { bytes memory newName = iter.name(); if (resource != iter.dnstype || !name.equals(newName)) { setDNSRRSet(node, name, resource, data, offset, iter.offset - offset, value.length == 0); resource = iter.dnstype; offset = iter.offset; name = newName; nameHash = keccak256(name); value = bytes(iter.rdata()); } } } if (name.length > 0) { setDNSRRSet(node, name, resource, data, offset, data.length - offset, value.length == 0); } } /** * Obtain a DNS record. * @param node the namehash of the node for which to fetch the record * @param name the keccak-256 hash of the fully-qualified name for which to fetch the record * @param resource the ID of the resource as per https://en.wikipedia.org/wiki/List_of_DNS_record_types * @return the DNS record in wire format if present, otherwise empty */ function dnsRecord(bytes32 node, bytes32 name, uint16 resource) public view returns (bytes memory) { return records[node][versions[node]][name][resource]; } /** * Check if a given node has records. * @param node the namehash of the node for which to check the records * @param name the namehash of the node for which to check the records */ function hasDNSRecords(bytes32 node, bytes32 name) public view returns (bool) { return (nameEntriesCount[node][versions[node]][name] != 0); } /** * Clear all information for a DNS zone. * @param node the namehash of the node for which to clear the zone */ function clearDNSZone(bytes32 node) public authorised(node) { versions[node]++; emit DNSZoneCleared(node); } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == DNS_RECORD_INTERFACE_ID || super.supportsInterface(interfaceID); } function setDNSRRSet( bytes32 node, bytes memory name, uint16 resource, bytes memory data, uint256 offset, uint256 size, bool deleteRecord) private { uint256 version = versions[node]; bytes32 nameHash = keccak256(name); bytes memory rrData = data.substring(offset, size); if (deleteRecord) { if (records[node][version][nameHash][resource].length != 0) { nameEntriesCount[node][version][nameHash]--; } delete(records[node][version][nameHash][resource]); emit DNSRecordDeleted(node, name, resource); } else { if (records[node][version][nameHash][resource].length == 0) { nameEntriesCount[node][version][nameHash]++; } records[node][version][nameHash][resource] = rrData; emit DNSRecordChanged(node, name, resource, rrData); } } } // File: contracts/profiles/InterfaceResolver.sol pragma solidity ^0.5.0; contract InterfaceResolver is ResolverBase, AddrResolver { bytes4 constant private INTERFACE_INTERFACE_ID = bytes4(keccak256("interfaceImplementer(bytes32,bytes4)")); bytes4 private constant INTERFACE_META_ID = 0x01ffc9a7; event InterfaceChanged(bytes32 indexed node, bytes4 indexed interfaceID, address implementer); mapping(bytes32=>mapping(bytes4=>address)) interfaces; /** * Sets an interface associated with a name. * Setting the address to 0 restores the default behaviour of querying the contract at `addr()` for interface support. * @param node The node to update. * @param interfaceID The EIP 168 interface ID. * @param implementer The address of a contract that implements this interface for this node. */ function setInterface(bytes32 node, bytes4 interfaceID, address implementer) external authorised(node) { interfaces[node][interfaceID] = implementer; emit InterfaceChanged(node, interfaceID, implementer); } /** * Returns the address of a contract that implements the specified interface for this name. * If an implementer has not been set for this interfaceID and name, the resolver will query * the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that * contract implements EIP168 and returns `true` for the specified interfaceID, its address * will be returned. * @param node The ENS node to query. * @param interfaceID The EIP 168 interface ID to check for. * @return The address that implements this interface, or 0 if the interface is unsupported. */ function interfaceImplementer(bytes32 node, bytes4 interfaceID) external view returns (address) { address implementer = interfaces[node][interfaceID]; if(implementer != address(0)) { return implementer; } address a = addr(node); if(a == address(0)) { return address(0); } (bool success, bytes memory returnData) = a.staticcall(abi.encodeWithSignature("supportsInterface(bytes4)", INTERFACE_META_ID)); if(!success || returnData.length < 32 || returnData[31] == 0) { // EIP 168 not supported by target return address(0); } (success, returnData) = a.staticcall(abi.encodeWithSignature("supportsInterface(bytes4)", interfaceID)); if(!success || returnData.length < 32 || returnData[31] == 0) { // Specified interface not supported by target return address(0); } return a; } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == INTERFACE_INTERFACE_ID || super.supportsInterface(interfaceID); } } // File: contracts/profiles/NameResolver.sol pragma solidity ^0.5.0; contract NameResolver is ResolverBase { bytes4 constant private NAME_INTERFACE_ID = 0x691f3431; event NameChanged(bytes32 indexed node, string name); mapping(bytes32=>string) names; /** * Sets the name associated with an ENS node, for reverse records. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param name The name to set. */ function setName(bytes32 node, string calldata name) external authorised(node) { names[node] = name; emit NameChanged(node, name); } /** * Returns the name associated with an ENS node, for reverse records. * Defined in EIP181. * @param node The ENS node to query. * @return The associated name. */ function name(bytes32 node) external view returns (string memory) { return names[node]; } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == NAME_INTERFACE_ID || super.supportsInterface(interfaceID); } } // File: contracts/profiles/PubkeyResolver.sol pragma solidity ^0.5.0; contract PubkeyResolver is ResolverBase { bytes4 constant private PUBKEY_INTERFACE_ID = 0xc8690233; event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y); struct PublicKey { bytes32 x; bytes32 y; } mapping(bytes32=>PublicKey) pubkeys; /** * Sets the SECP256k1 public key associated with an ENS node. * @param node The ENS node to query * @param x the X coordinate of the curve point for the public key. * @param y the Y coordinate of the curve point for the public key. */ function setPubkey(bytes32 node, bytes32 x, bytes32 y) external authorised(node) { pubkeys[node] = PublicKey(x, y); emit PubkeyChanged(node, x, y); } /** * Returns the SECP256k1 public key associated with an ENS node. * Defined in EIP 619. * @param node The ENS node to query * @return x, y the X and Y coordinates of the curve point for the public key. */ function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y) { return (pubkeys[node].x, pubkeys[node].y); } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == PUBKEY_INTERFACE_ID || super.supportsInterface(interfaceID); } } // File: contracts/profiles/TextResolver.sol pragma solidity ^0.5.0; contract TextResolver is ResolverBase { bytes4 constant private TEXT_INTERFACE_ID = 0x59d1d43c; event TextChanged(bytes32 indexed node, string indexed indexedKey, string key); mapping(bytes32=>mapping(string=>string)) texts; /** * Sets the text data associated with an ENS node and key. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param key The key to set. * @param value The text data value to set. */ function setText(bytes32 node, string calldata key, string calldata value) external authorised(node) { texts[node][key] = value; emit TextChanged(node, key, key); } /** * Returns the text data associated with an ENS node and key. * @param node The ENS node to query. * @param key The text data key to query. * @return The associated text data. */ function text(bytes32 node, string calldata key) external view returns (string memory) { return texts[node][key]; } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == TEXT_INTERFACE_ID || super.supportsInterface(interfaceID); } } // File: contracts/PublicResolver.sol pragma solidity ^0.5.0; pragma experimental ABIEncoderV2; /** * A simple resolver anyone can use; only allows the owner of a node to set its * address. */ contract PublicResolver is ABIResolver, AddrResolver, ContentHashResolver, DNSResolver, InterfaceResolver, NameResolver, PubkeyResolver, TextResolver { ENS ens; /** * A mapping of authorisations. An address that is authorised for a name * may make any changes to the name that the owner could, but may not update * the set of authorisations. * (node, owner, caller) => isAuthorised */ mapping(bytes32=>mapping(address=>mapping(address=>bool))) public authorisations; event AuthorisationChanged(bytes32 indexed node, address indexed owner, address indexed target, bool isAuthorised); constructor(ENS _ens) public { ens = _ens; } /** * @dev Sets or clears an authorisation. * Authorisations are specific to the caller. Any account can set an authorisation * for any name, but the authorisation that is checked will be that of the * current owner of a name. Thus, transferring a name effectively clears any * existing authorisations, and new authorisations can be set in advance of * an ownership transfer if desired. * * @param node The name to change the authorisation on. * @param target The address that is to be authorised or deauthorised. * @param isAuthorised True if the address should be authorised, or false if it should be deauthorised. */ function setAuthorisation(bytes32 node, address target, bool isAuthorised) external { authorisations[node][msg.sender][target] = isAuthorised; emit AuthorisationChanged(node, msg.sender, target, isAuthorised); } function isAuthorised(bytes32 node) internal view returns(bool) { address owner = ens.owner(node); return owner == msg.sender || authorisations[node][owner][msg.sender]; } function multicall(bytes[] calldata data) external returns(bytes[] memory results) { results = new bytes[](data.length); for(uint i = 0; i < data.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(data[i]); require(success); results[i] = result; } return results; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"AuthorisationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"record","type":"bytes"}],"name":"DNSRecordChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"}],"name":"DNSRecordDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"DNSZoneCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"TextChanged","type":"event"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"authorisations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearDNSZone","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint16","name":"resource","type":"uint16"}],"name":"dnsRecord","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"hasDNSRecords","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setABI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"a","type":"address"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"setAuthorisation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setDNSRecords","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002abe38038062002abe83398101604081905262000034916200006d565b600a80546001600160a01b0319166001600160a01b0392909216919091179055620000d6565b80516200006781620000bc565b92915050565b6000602082840312156200008057600080fd5b60006200008e84846200005a565b949350505050565b60006200006782620000b0565b6000620000678262000096565b6001600160a01b031690565b620000c781620000a3565b8114620000d357600080fd5b50565b6129d880620000e66000396000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c8063691f3431116100e3578063bc1c58d11161008c578063e59d895d11610066578063e59d895d14610387578063f1cb7e061461039a578063f86bc879146103ad57610198565b8063bc1c58d114610340578063c869023314610353578063d5fa2b001461037457610198565b8063a8fa5682116100bd578063a8fa5682146102fa578063ac9650d81461030d578063ad5780af1461032d57610198565b8063691f3431146102c157806377372213146102d45780638b95dd71146102e757610198565b8063304e6ade116101455780634cbf6ba41161011f5780634cbf6ba41461027b57806359d1d43c1461028e578063623195b0146102ae57610198565b8063304e6ade146102425780633b3b57de146102555780633e9ce7941461026857610198565b8063124a319c11610176578063124a319c146101ee5780632203ab561461020e57806329cd62ea1461022f57610198565b806301ffc9a71461019d5780630af179d7146101c657806310f13a8c146101db575b600080fd5b6101b06101ab366004612504565b6103c0565b6040516101bd9190612730565b60405180910390f35b6101d96101d4366004612364565b61041e565b005b6101d96101e93660046123ba565b61060b565b6102016101fc366004612302565b6106b8565b6040516101bd9190612703565b61022161021c36600461224c565b6109f7565b6040516101bd9291906127f3565b6101d961023d36600461227c565b610b16565b6101d9610250366004612364565b610b96565b610201610263366004612164565b610bf5565b6101d9610276366004612209565b610c2a565b6101b061028936600461224c565b610ccf565b6102a161029c366004612364565b610d01565b6040516101bd9190612787565b6101d96102bc366004612441565b610dc3565b6102a16102cf366004612164565b610e3e565b6101d96102e2366004612364565b610edf565b6101d96102f53660046124a9565b610f3e565b6102a16103083660046122bf565b611003565b61032061031b366004612122565b611090565b6040516101bd919061271f565b6101d961033b366004612164565b6111d4565b6102a161034e366004612164565b611227565b610366610361366004612164565b61128f565b6040516101bd92919061274c565b6101d9610382366004612182565b6112a9565b6101d9610395366004612332565b6112d0565b6102a16103a836600461224c565b61139d565b6101b06103bb3660046121bc565b611446565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f59d1d43c00000000000000000000000000000000000000000000000000000000148061041657506104168261146c565b90505b919050565b82610428816114c2565b61043157600080fd5b60008060608082610440611e30565b61048a60008a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff6115d1169050565b90505b610496816115ec565b6105ae5761ffff86166104ee57806040015195506104b3816115fa565b9350836040516020016104c691906126ec565b6040516020818303038152906040528051906020012091506104e781611621565b92506105a0565b60606104f9826115fa565b9050816040015161ffff168761ffff161415806105235750610521858263ffffffff61164216565b155b1561059e576105778b86898d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050602087015189518c918290039015611660565b81604001519650816020015195508094508480519060200120925061059b82611621565b93505b505b6105a9816118c7565b61048d565b50825115610600576106008984878b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505088518b9250828f03915015611660565b505050505050505050565b84610615816114c2565b61061e57600080fd5b82826009600089815260200190815260200160002087876040516106439291906126df565b90815260405190819003602001902061065d929091611e7b565b50848460405161066e9291906126df565b6040518091039020867fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a755087876040516106a8929190612775565b60405180910390a3505050505050565b60008281526006602090815260408083207fffffffff000000000000000000000000000000000000000000000000000000008516845290915281205473ffffffffffffffffffffffffffffffffffffffff1680156107175790506109f1565b600061072285610bf5565b905073ffffffffffffffffffffffffffffffffffffffff811661074a576000925050506109f1565b600060608273ffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b60405160240161077d9190612767565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000179052516107fe91906126ec565b600060405180830381855afa9150503d8060008114610839576040519150601f19603f3d011682016040523d82523d6000602084013e61083e565b606091505b5091509150811580610851575060208151105b8061088d575080601f8151811061086457fe5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b1561089f5760009450505050506109f1565b8273ffffffffffffffffffffffffffffffffffffffff16866040516024016108c79190612767565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790525161094891906126ec565b600060405180830381855afa9150503d8060008114610983576040519150601f19603f3d011682016040523d82523d6000602084013e610988565b606091505b50909250905081158061099c575060208151105b806109d8575080601f815181106109af57fe5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b156109ea5760009450505050506109f1565b5090925050505b92915050565b600082815260208190526040812060609060015b848111610af85780851615801590610a4357506000818152602083905260409020546002600019610100600184161502019091160415155b15610af0576000818152602083815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845284939192839190830182828015610ade5780601f10610ab357610100808354040283529160200191610ade565b820191906000526020600020905b815481529060010190602001808311610ac157829003601f168201915b50505050509050935093505050610b0f565b60011b610a0b565b505060408051602081019091526000808252925090505b9250929050565b82610b20816114c2565b610b2957600080fd5b6040805180820182528481526020808201858152600088815260089092529083902091518255516001909101555184907f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e4690610b88908690869061274c565b60405180910390a250505050565b82610ba0816114c2565b610ba957600080fd5b6000848152600260205260409020610bc2908484611e7b565b50837fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d75788484604051610b88929190612775565b60006060610c0483603c61139d565b9050805160001415610c1a576000915050610419565b610c238161199a565b9392505050565b6000838152600b602090815260408083203380855290835281842073ffffffffffffffffffffffffffffffffffffffff871680865293529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515151790555190919085907fe1c5610a6e0cbe10764ecd182adcef1ec338dc4e199c99c32ce98f38e12791df90610cc2908690612730565b60405180910390a4505050565b600091825260056020908152604080842060038352818520548552825280842092845291905290205461ffff16151590565b6060600960008581526020019081526020016000208383604051610d269291906126df565b9081526040805160209281900383018120805460026001821615610100026000190190911604601f81018590048502830185019093528282529092909190830182828015610db55780601f10610d8a57610100808354040283529160200191610db5565b820191906000526020600020905b815481529060010190602001808311610d9857829003601f168201915b505050505090509392505050565b83610dcd816114c2565b610dd657600080fd5b6000198401841615610de757600080fd5b6000858152602081815260408083208784529091529020610e09908484611e7b565b50604051849086907faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe390600090a35050505050565b60008181526007602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610ed35780601f10610ea857610100808354040283529160200191610ed3565b820191906000526020600020905b815481529060010190602001808311610eb657829003601f168201915b50505050509050919050565b82610ee9816114c2565b610ef257600080fd5b6000848152600760205260409020610f0b908484611e7b565b50837fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f78484604051610b88929190612775565b82610f48816114c2565b610f5157600080fd5b837f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528484604051610f839291906127f3565b60405180910390a2603c831415610fd557837f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2610fbf8461199a565b604051610fcc9190612711565b60405180910390a25b600084815260016020908152604080832086845282529091208351610ffc92850190611f17565b5050505050565b6000838152600460209081526040808320600383528184205484528252808320858452825280832061ffff8516845282529182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610db55780601f10610d8a57610100808354040283529160200191610db5565b6040805182815260208084028201019091526060908280156110c657816020015b60608152602001906001900390816110b15790505b50905060005b828110156111cd5760006060308686858181106110e557fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe13684900301811261111f57600080fd5b9091016020810191503567ffffffffffffffff81111561113e57600080fd5b3681900382131561114e57600080fd5b60405161115c9291906126df565b600060405180830381855af49150503d8060008114611197576040519150601f19603f3d011682016040523d82523d6000602084013e61119c565b606091505b5091509150816111ab57600080fd5b808484815181106111b857fe5b602090810291909101015250506001016110cc565b5092915050565b806111de816114c2565b6111e757600080fd5b600082815260036020526040808220805460010190555183917fb757169b8492ca2f1c6619d9d76ce22803035c3b1d5f6930dffe7b127c1a198391a25050565b600081815260026020818152604092839020805484516001821615610100026000190190911693909304601f81018390048302840183019094528383526060939091830182828015610ed35780601f10610ea857610100808354040283529160200191610ed3565b600090815260086020526040902080546001909101549091565b816112b3816114c2565b6112bc57600080fd5b6112cb83603c6102f5856119c2565b505050565b826112da816114c2565b6112e357600080fd5b60008481526006602090815260408083207fffffffff00000000000000000000000000000000000000000000000000000000871680855292529182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055905185907f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa9061138f908690612703565b60405180910390a350505050565b600082815260016020818152604080842085855282529283902080548451600294821615610100026000190190911693909304601f810183900483028401830190945283835260609390918301828280156114395780601f1061140e57610100808354040283529160200191611439565b820191906000526020600020905b81548152906001019060200180831161141c57829003601f168201915b5050505050905092915050565b600b60209081526000938452604080852082529284528284209052825290205460ff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fc86902330000000000000000000000000000000000000000000000000000000014806104165750610416826119fb565b600a546040517f02571be3000000000000000000000000000000000000000000000000000000008152600091829173ffffffffffffffffffffffffffffffffffffffff909116906302571be39061151d90869060040161273e565b60206040518083038186803b15801561153557600080fd5b505afa158015611549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061156d91908101906120fc565b905073ffffffffffffffffffffffffffffffffffffffff8116331480610c2357506000838152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452825280832033845290915290205460ff16915050919050565b6115d9611e30565b82815260c081018290526109f1816118c7565b805151602090910151101590565b60208101518151606091610416916116129082611a51565b8451919063ffffffff611a9816565b60a081015160c082015182516060926104169281900363ffffffff611a9816565b600081518351148015610c235750610c238360008460008751611afa565b600087815260036020908152604090912054875191880191909120606061168e87878763ffffffff611a9816565b905083156117a85760008a81526004602090815260408083208684528252808320858452825280832061ffff8c16845290915290205460026000196101006001841615020190911604156117335760008a81526005602090815260408083208684528252808320858452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000811661ffff918216600019019091161790555b60008a81526004602090815260408083208684528252808320858452825280832061ffff8c168452909152812061176991611f85565b897f03528ed0c2a3ebc993b12ce3c16bb382f9c7d88ef7d8a1bf290eaf35955a12078a8a60405161179b929190612798565b60405180910390a26118bb565b60008a81526004602090815260408083208684528252808320858452825280832061ffff8c168452909152902054600260001961010060018416150201909116046118425760008a815260056020908152604080832086845282528083208584529091529020805461ffff808216600101167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009091161790555b60008a81526004602090815260408083208684528252808320858452825280832061ffff8c1684528252909120825161187d92840190611f17565b50897f52a608b3303a48862d07a73d82fa221318c0027fbbcfb1b2329bface3f19ff2b8a8a846040516118b2939291906127b8565b60405180910390a25b50505050505050505050565b60c081015160208201819052815151116118e057611997565b60006118f482600001518360200151611a51565b602083015183519101915061190f908263ffffffff611b1d16565b61ffff166040830152815160029190910190611931908263ffffffff611b1d16565b61ffff166060830152815160029190910190611953908263ffffffff611b3d16565b63ffffffff908116608084015282516004929092019160009161197991908490611b1d16565b600283810160a086015261ffff9190911690920190910160c0830152505b50565b600081516014146119aa57600080fd5b50602001516c01000000000000000000000000900490565b6040805160148082528183019092526060916020820181803883395050506c010000000000000000000000009290920260208301525090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f691f3431000000000000000000000000000000000000000000000000000000001480610416575061041682611b5f565b6000815b83518110611a5f57fe5b6000611a71858363ffffffff611bc416565b60ff1691820160010191905080611a885750611a8e565b50611a55565b9190910392915050565b606083518284011115611aaa57600080fd5b6060826040519080825280601f01601f191660200182016040528015611ad7576020820181803883390190505b50905060208082019086860101611aef828287611be2565b509095945050505050565b6000611b07848484611c3e565b611b12878785611c3e565b149695505050505050565b60008251826002011115611b3057600080fd5b50016002015161ffff1690565b60008251826004011115611b5057600080fd5b50016004015163ffffffff1690565b6000604051611b6d906126f8565b60405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610416575061041682611c5a565b6000828281518110611bd257fe5b016020015160f81c905092915050565b5b60208110611c205781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611be3565b905182516020929092036101000a6000190180199091169116179052565b600083518284011115611c5057600080fd5b5091016020012090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fa8fa568200000000000000000000000000000000000000000000000000000000148061041657506104168260007fffffffff0000000000000000000000000000000000000000000000000000000082167fbc1c58d100000000000000000000000000000000000000000000000000000000148061041657506104168260007fffffffff0000000000000000000000000000000000000000000000000000000082167f3b3b57de000000000000000000000000000000000000000000000000000000001480611d8f57507fffffffff0000000000000000000000000000000000000000000000000000000082167ff1cb7e0600000000000000000000000000000000000000000000000000000000145b8061041657506104168260007fffffffff0000000000000000000000000000000000000000000000000000000082167f2203ab5600000000000000000000000000000000000000000000000000000000148061041657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610416565b6040518060e001604052806060815260200160008152602001600061ffff168152602001600061ffff168152602001600063ffffffff16815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611eda578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555611f07565b82800160010185558215611f07579182015b82811115611f07578235825591602001919060010190611eec565b50611f13929150611fc5565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611f5857805160ff1916838001178555611f07565b82800160010185558215611f07579182015b82811115611f07578251825591602001919060010190611f6a565b50805460018160011615610100020316600290046000825580601f10611fab5750611997565b601f01602090049060005260206000209081019061199791905b611fdf91905b80821115611f135760008155600101611fcb565b90565b80356109f18161295d565b80516109f18161295d565b60008083601f84011261200a57600080fd5b50813567ffffffffffffffff81111561202257600080fd5b602083019150836020820283011115610b0f57600080fd5b80356109f181612971565b80356109f18161297a565b80356109f181612983565b60008083601f84011261206d57600080fd5b50813567ffffffffffffffff81111561208557600080fd5b602083019150836001820283011115610b0f57600080fd5b600082601f8301126120ae57600080fd5b81356120c16120bc8261283a565b612813565b915080825260208301602083018583830111156120dd57600080fd5b6120e88382846128f9565b50505092915050565b80356109f18161298c565b60006020828403121561210e57600080fd5b600061211a8484611fed565b949350505050565b6000806020838503121561213557600080fd5b823567ffffffffffffffff81111561214c57600080fd5b61215885828601611ff8565b92509250509250929050565b60006020828403121561217657600080fd5b600061211a8484612045565b6000806040838503121561219557600080fd5b60006121a18585612045565b92505060206121b285828601611fe2565b9150509250929050565b6000806000606084860312156121d157600080fd5b60006121dd8686612045565b93505060206121ee86828701611fe2565b92505060406121ff86828701611fe2565b9150509250925092565b60008060006060848603121561221e57600080fd5b600061222a8686612045565b935050602061223b86828701611fe2565b92505060406121ff8682870161203a565b6000806040838503121561225f57600080fd5b600061226b8585612045565b92505060206121b285828601612045565b60008060006060848603121561229157600080fd5b600061229d8686612045565b93505060206122ae86828701612045565b92505060406121ff86828701612045565b6000806000606084860312156122d457600080fd5b60006122e08686612045565b93505060206122f186828701612045565b92505060406121ff868287016120f1565b6000806040838503121561231557600080fd5b60006123218585612045565b92505060206121b285828601612050565b60008060006060848603121561234757600080fd5b60006123538686612045565b93505060206121ee86828701612050565b60008060006040848603121561237957600080fd5b60006123858686612045565b935050602084013567ffffffffffffffff8111156123a257600080fd5b6123ae8682870161205b565b92509250509250925092565b6000806000806000606086880312156123d257600080fd5b60006123de8888612045565b955050602086013567ffffffffffffffff8111156123fb57600080fd5b6124078882890161205b565b9450945050604086013567ffffffffffffffff81111561242657600080fd5b6124328882890161205b565b92509250509295509295909350565b6000806000806060858703121561245757600080fd5b60006124638787612045565b945050602061247487828801612045565b935050604085013567ffffffffffffffff81111561249157600080fd5b61249d8782880161205b565b95989497509550505050565b6000806000606084860312156124be57600080fd5b60006124ca8686612045565b93505060206124db86828701612045565b925050604084013567ffffffffffffffff8111156124f857600080fd5b6121ff8682870161209d565b60006020828403121561251657600080fd5b600061211a8484612050565b6000610c23838361261a565b612537816128e8565b82525050565b61253781612893565b600061255182612886565b61255b818561288a565b93508360208202850161256d85612880565b8060005b858110156125a7578484038952815161258a8582612522565b945061259583612880565b60209a909a0199925050600101612571565b5091979650505050505050565b6125378161289e565b61253781611fdf565b612537816128a3565b60006125db838561288a565b93506125e88385846128f9565b6125f183612935565b9093019392505050565b60006126078385610419565b93506126148385846128f9565b50500190565b600061262582612886565b61262f818561288a565b935061263f818560208601612905565b6125f181612935565b600061265382612886565b61265d8185610419565b935061266d818560208601612905565b9290920192915050565b6000612684602483610419565b7f696e74657266616365496d706c656d656e74657228627974657333322c62797481527f6573342900000000000000000000000000000000000000000000000000000000602082015260240192915050565b612537816128c8565b600061211a8284866125fb565b6000610c238284612648565b60006109f182612677565b602081016109f1828461253d565b602081016109f1828461252e565b60208082528101610c238184612546565b602081016109f182846125b4565b602081016109f182846125bd565b6040810161275a82856125bd565b610c2360208301846125bd565b602081016109f182846125c6565b6020808252810161211a8184866125cf565b60208082528101610c23818461261a565b604080825281016127a9818561261a565b9050610c2360208301846126d6565b606080825281016127c9818661261a565b90506127d860208301856126d6565b81810360408301526127ea818461261a565b95945050505050565b6040810161280182856125bd565b818103602083015261211a818461261a565b60405181810167ffffffffffffffff8111828210171561283257600080fd5b604052919050565b600067ffffffffffffffff82111561285157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b90815260200190565b6000610416826128cf565b151590565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61ffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b600061041682600061041682612893565b82818337506000910152565b60005b83811015612920578181015183820152602001612908565b8381111561292f576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b61296681612893565b811461199757600080fd5b6129668161289e565b61296681611fdf565b612966816128a3565b612966816128c856fea365627a7a72315820a34543b9e2df9201a793e2f372f5b17bdd62913b745d9d07ad5a33cb6e3e2b7a6c6578706572696d656e74616cf564736f6c6343000510004000000000000000000000000062fdb87fec340e5283fbc91312e9d237465a2b45
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101985760003560e01c8063691f3431116100e3578063bc1c58d11161008c578063e59d895d11610066578063e59d895d14610387578063f1cb7e061461039a578063f86bc879146103ad57610198565b8063bc1c58d114610340578063c869023314610353578063d5fa2b001461037457610198565b8063a8fa5682116100bd578063a8fa5682146102fa578063ac9650d81461030d578063ad5780af1461032d57610198565b8063691f3431146102c157806377372213146102d45780638b95dd71146102e757610198565b8063304e6ade116101455780634cbf6ba41161011f5780634cbf6ba41461027b57806359d1d43c1461028e578063623195b0146102ae57610198565b8063304e6ade146102425780633b3b57de146102555780633e9ce7941461026857610198565b8063124a319c11610176578063124a319c146101ee5780632203ab561461020e57806329cd62ea1461022f57610198565b806301ffc9a71461019d5780630af179d7146101c657806310f13a8c146101db575b600080fd5b6101b06101ab366004612504565b6103c0565b6040516101bd9190612730565b60405180910390f35b6101d96101d4366004612364565b61041e565b005b6101d96101e93660046123ba565b61060b565b6102016101fc366004612302565b6106b8565b6040516101bd9190612703565b61022161021c36600461224c565b6109f7565b6040516101bd9291906127f3565b6101d961023d36600461227c565b610b16565b6101d9610250366004612364565b610b96565b610201610263366004612164565b610bf5565b6101d9610276366004612209565b610c2a565b6101b061028936600461224c565b610ccf565b6102a161029c366004612364565b610d01565b6040516101bd9190612787565b6101d96102bc366004612441565b610dc3565b6102a16102cf366004612164565b610e3e565b6101d96102e2366004612364565b610edf565b6101d96102f53660046124a9565b610f3e565b6102a16103083660046122bf565b611003565b61032061031b366004612122565b611090565b6040516101bd919061271f565b6101d961033b366004612164565b6111d4565b6102a161034e366004612164565b611227565b610366610361366004612164565b61128f565b6040516101bd92919061274c565b6101d9610382366004612182565b6112a9565b6101d9610395366004612332565b6112d0565b6102a16103a836600461224c565b61139d565b6101b06103bb3660046121bc565b611446565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f59d1d43c00000000000000000000000000000000000000000000000000000000148061041657506104168261146c565b90505b919050565b82610428816114c2565b61043157600080fd5b60008060608082610440611e30565b61048a60008a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff6115d1169050565b90505b610496816115ec565b6105ae5761ffff86166104ee57806040015195506104b3816115fa565b9350836040516020016104c691906126ec565b6040516020818303038152906040528051906020012091506104e781611621565b92506105a0565b60606104f9826115fa565b9050816040015161ffff168761ffff161415806105235750610521858263ffffffff61164216565b155b1561059e576105778b86898d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050602087015189518c918290039015611660565b81604001519650816020015195508094508480519060200120925061059b82611621565b93505b505b6105a9816118c7565b61048d565b50825115610600576106008984878b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505088518b9250828f03915015611660565b505050505050505050565b84610615816114c2565b61061e57600080fd5b82826009600089815260200190815260200160002087876040516106439291906126df565b90815260405190819003602001902061065d929091611e7b565b50848460405161066e9291906126df565b6040518091039020867fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a755087876040516106a8929190612775565b60405180910390a3505050505050565b60008281526006602090815260408083207fffffffff000000000000000000000000000000000000000000000000000000008516845290915281205473ffffffffffffffffffffffffffffffffffffffff1680156107175790506109f1565b600061072285610bf5565b905073ffffffffffffffffffffffffffffffffffffffff811661074a576000925050506109f1565b600060608273ffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b60405160240161077d9190612767565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000179052516107fe91906126ec565b600060405180830381855afa9150503d8060008114610839576040519150601f19603f3d011682016040523d82523d6000602084013e61083e565b606091505b5091509150811580610851575060208151105b8061088d575080601f8151811061086457fe5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b1561089f5760009450505050506109f1565b8273ffffffffffffffffffffffffffffffffffffffff16866040516024016108c79190612767565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790525161094891906126ec565b600060405180830381855afa9150503d8060008114610983576040519150601f19603f3d011682016040523d82523d6000602084013e610988565b606091505b50909250905081158061099c575060208151105b806109d8575080601f815181106109af57fe5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b156109ea5760009450505050506109f1565b5090925050505b92915050565b600082815260208190526040812060609060015b848111610af85780851615801590610a4357506000818152602083905260409020546002600019610100600184161502019091160415155b15610af0576000818152602083815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845284939192839190830182828015610ade5780601f10610ab357610100808354040283529160200191610ade565b820191906000526020600020905b815481529060010190602001808311610ac157829003601f168201915b50505050509050935093505050610b0f565b60011b610a0b565b505060408051602081019091526000808252925090505b9250929050565b82610b20816114c2565b610b2957600080fd5b6040805180820182528481526020808201858152600088815260089092529083902091518255516001909101555184907f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e4690610b88908690869061274c565b60405180910390a250505050565b82610ba0816114c2565b610ba957600080fd5b6000848152600260205260409020610bc2908484611e7b565b50837fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d75788484604051610b88929190612775565b60006060610c0483603c61139d565b9050805160001415610c1a576000915050610419565b610c238161199a565b9392505050565b6000838152600b602090815260408083203380855290835281842073ffffffffffffffffffffffffffffffffffffffff871680865293529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515151790555190919085907fe1c5610a6e0cbe10764ecd182adcef1ec338dc4e199c99c32ce98f38e12791df90610cc2908690612730565b60405180910390a4505050565b600091825260056020908152604080842060038352818520548552825280842092845291905290205461ffff16151590565b6060600960008581526020019081526020016000208383604051610d269291906126df565b9081526040805160209281900383018120805460026001821615610100026000190190911604601f81018590048502830185019093528282529092909190830182828015610db55780601f10610d8a57610100808354040283529160200191610db5565b820191906000526020600020905b815481529060010190602001808311610d9857829003601f168201915b505050505090509392505050565b83610dcd816114c2565b610dd657600080fd5b6000198401841615610de757600080fd5b6000858152602081815260408083208784529091529020610e09908484611e7b565b50604051849086907faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe390600090a35050505050565b60008181526007602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610ed35780601f10610ea857610100808354040283529160200191610ed3565b820191906000526020600020905b815481529060010190602001808311610eb657829003601f168201915b50505050509050919050565b82610ee9816114c2565b610ef257600080fd5b6000848152600760205260409020610f0b908484611e7b565b50837fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f78484604051610b88929190612775565b82610f48816114c2565b610f5157600080fd5b837f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528484604051610f839291906127f3565b60405180910390a2603c831415610fd557837f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2610fbf8461199a565b604051610fcc9190612711565b60405180910390a25b600084815260016020908152604080832086845282529091208351610ffc92850190611f17565b5050505050565b6000838152600460209081526040808320600383528184205484528252808320858452825280832061ffff8516845282529182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610db55780601f10610d8a57610100808354040283529160200191610db5565b6040805182815260208084028201019091526060908280156110c657816020015b60608152602001906001900390816110b15790505b50905060005b828110156111cd5760006060308686858181106110e557fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe13684900301811261111f57600080fd5b9091016020810191503567ffffffffffffffff81111561113e57600080fd5b3681900382131561114e57600080fd5b60405161115c9291906126df565b600060405180830381855af49150503d8060008114611197576040519150601f19603f3d011682016040523d82523d6000602084013e61119c565b606091505b5091509150816111ab57600080fd5b808484815181106111b857fe5b602090810291909101015250506001016110cc565b5092915050565b806111de816114c2565b6111e757600080fd5b600082815260036020526040808220805460010190555183917fb757169b8492ca2f1c6619d9d76ce22803035c3b1d5f6930dffe7b127c1a198391a25050565b600081815260026020818152604092839020805484516001821615610100026000190190911693909304601f81018390048302840183019094528383526060939091830182828015610ed35780601f10610ea857610100808354040283529160200191610ed3565b600090815260086020526040902080546001909101549091565b816112b3816114c2565b6112bc57600080fd5b6112cb83603c6102f5856119c2565b505050565b826112da816114c2565b6112e357600080fd5b60008481526006602090815260408083207fffffffff00000000000000000000000000000000000000000000000000000000871680855292529182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055905185907f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa9061138f908690612703565b60405180910390a350505050565b600082815260016020818152604080842085855282529283902080548451600294821615610100026000190190911693909304601f810183900483028401830190945283835260609390918301828280156114395780601f1061140e57610100808354040283529160200191611439565b820191906000526020600020905b81548152906001019060200180831161141c57829003601f168201915b5050505050905092915050565b600b60209081526000938452604080852082529284528284209052825290205460ff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fc86902330000000000000000000000000000000000000000000000000000000014806104165750610416826119fb565b600a546040517f02571be3000000000000000000000000000000000000000000000000000000008152600091829173ffffffffffffffffffffffffffffffffffffffff909116906302571be39061151d90869060040161273e565b60206040518083038186803b15801561153557600080fd5b505afa158015611549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061156d91908101906120fc565b905073ffffffffffffffffffffffffffffffffffffffff8116331480610c2357506000838152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452825280832033845290915290205460ff16915050919050565b6115d9611e30565b82815260c081018290526109f1816118c7565b805151602090910151101590565b60208101518151606091610416916116129082611a51565b8451919063ffffffff611a9816565b60a081015160c082015182516060926104169281900363ffffffff611a9816565b600081518351148015610c235750610c238360008460008751611afa565b600087815260036020908152604090912054875191880191909120606061168e87878763ffffffff611a9816565b905083156117a85760008a81526004602090815260408083208684528252808320858452825280832061ffff8c16845290915290205460026000196101006001841615020190911604156117335760008a81526005602090815260408083208684528252808320858452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000811661ffff918216600019019091161790555b60008a81526004602090815260408083208684528252808320858452825280832061ffff8c168452909152812061176991611f85565b897f03528ed0c2a3ebc993b12ce3c16bb382f9c7d88ef7d8a1bf290eaf35955a12078a8a60405161179b929190612798565b60405180910390a26118bb565b60008a81526004602090815260408083208684528252808320858452825280832061ffff8c168452909152902054600260001961010060018416150201909116046118425760008a815260056020908152604080832086845282528083208584529091529020805461ffff808216600101167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009091161790555b60008a81526004602090815260408083208684528252808320858452825280832061ffff8c1684528252909120825161187d92840190611f17565b50897f52a608b3303a48862d07a73d82fa221318c0027fbbcfb1b2329bface3f19ff2b8a8a846040516118b2939291906127b8565b60405180910390a25b50505050505050505050565b60c081015160208201819052815151116118e057611997565b60006118f482600001518360200151611a51565b602083015183519101915061190f908263ffffffff611b1d16565b61ffff166040830152815160029190910190611931908263ffffffff611b1d16565b61ffff166060830152815160029190910190611953908263ffffffff611b3d16565b63ffffffff908116608084015282516004929092019160009161197991908490611b1d16565b600283810160a086015261ffff9190911690920190910160c0830152505b50565b600081516014146119aa57600080fd5b50602001516c01000000000000000000000000900490565b6040805160148082528183019092526060916020820181803883395050506c010000000000000000000000009290920260208301525090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f691f3431000000000000000000000000000000000000000000000000000000001480610416575061041682611b5f565b6000815b83518110611a5f57fe5b6000611a71858363ffffffff611bc416565b60ff1691820160010191905080611a885750611a8e565b50611a55565b9190910392915050565b606083518284011115611aaa57600080fd5b6060826040519080825280601f01601f191660200182016040528015611ad7576020820181803883390190505b50905060208082019086860101611aef828287611be2565b509095945050505050565b6000611b07848484611c3e565b611b12878785611c3e565b149695505050505050565b60008251826002011115611b3057600080fd5b50016002015161ffff1690565b60008251826004011115611b5057600080fd5b50016004015163ffffffff1690565b6000604051611b6d906126f8565b60405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610416575061041682611c5a565b6000828281518110611bd257fe5b016020015160f81c905092915050565b5b60208110611c205781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611be3565b905182516020929092036101000a6000190180199091169116179052565b600083518284011115611c5057600080fd5b5091016020012090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fa8fa568200000000000000000000000000000000000000000000000000000000148061041657506104168260007fffffffff0000000000000000000000000000000000000000000000000000000082167fbc1c58d100000000000000000000000000000000000000000000000000000000148061041657506104168260007fffffffff0000000000000000000000000000000000000000000000000000000082167f3b3b57de000000000000000000000000000000000000000000000000000000001480611d8f57507fffffffff0000000000000000000000000000000000000000000000000000000082167ff1cb7e0600000000000000000000000000000000000000000000000000000000145b8061041657506104168260007fffffffff0000000000000000000000000000000000000000000000000000000082167f2203ab5600000000000000000000000000000000000000000000000000000000148061041657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610416565b6040518060e001604052806060815260200160008152602001600061ffff168152602001600061ffff168152602001600063ffffffff16815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611eda578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555611f07565b82800160010185558215611f07579182015b82811115611f07578235825591602001919060010190611eec565b50611f13929150611fc5565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611f5857805160ff1916838001178555611f07565b82800160010185558215611f07579182015b82811115611f07578251825591602001919060010190611f6a565b50805460018160011615610100020316600290046000825580601f10611fab5750611997565b601f01602090049060005260206000209081019061199791905b611fdf91905b80821115611f135760008155600101611fcb565b90565b80356109f18161295d565b80516109f18161295d565b60008083601f84011261200a57600080fd5b50813567ffffffffffffffff81111561202257600080fd5b602083019150836020820283011115610b0f57600080fd5b80356109f181612971565b80356109f18161297a565b80356109f181612983565b60008083601f84011261206d57600080fd5b50813567ffffffffffffffff81111561208557600080fd5b602083019150836001820283011115610b0f57600080fd5b600082601f8301126120ae57600080fd5b81356120c16120bc8261283a565b612813565b915080825260208301602083018583830111156120dd57600080fd5b6120e88382846128f9565b50505092915050565b80356109f18161298c565b60006020828403121561210e57600080fd5b600061211a8484611fed565b949350505050565b6000806020838503121561213557600080fd5b823567ffffffffffffffff81111561214c57600080fd5b61215885828601611ff8565b92509250509250929050565b60006020828403121561217657600080fd5b600061211a8484612045565b6000806040838503121561219557600080fd5b60006121a18585612045565b92505060206121b285828601611fe2565b9150509250929050565b6000806000606084860312156121d157600080fd5b60006121dd8686612045565b93505060206121ee86828701611fe2565b92505060406121ff86828701611fe2565b9150509250925092565b60008060006060848603121561221e57600080fd5b600061222a8686612045565b935050602061223b86828701611fe2565b92505060406121ff8682870161203a565b6000806040838503121561225f57600080fd5b600061226b8585612045565b92505060206121b285828601612045565b60008060006060848603121561229157600080fd5b600061229d8686612045565b93505060206122ae86828701612045565b92505060406121ff86828701612045565b6000806000606084860312156122d457600080fd5b60006122e08686612045565b93505060206122f186828701612045565b92505060406121ff868287016120f1565b6000806040838503121561231557600080fd5b60006123218585612045565b92505060206121b285828601612050565b60008060006060848603121561234757600080fd5b60006123538686612045565b93505060206121ee86828701612050565b60008060006040848603121561237957600080fd5b60006123858686612045565b935050602084013567ffffffffffffffff8111156123a257600080fd5b6123ae8682870161205b565b92509250509250925092565b6000806000806000606086880312156123d257600080fd5b60006123de8888612045565b955050602086013567ffffffffffffffff8111156123fb57600080fd5b6124078882890161205b565b9450945050604086013567ffffffffffffffff81111561242657600080fd5b6124328882890161205b565b92509250509295509295909350565b6000806000806060858703121561245757600080fd5b60006124638787612045565b945050602061247487828801612045565b935050604085013567ffffffffffffffff81111561249157600080fd5b61249d8782880161205b565b95989497509550505050565b6000806000606084860312156124be57600080fd5b60006124ca8686612045565b93505060206124db86828701612045565b925050604084013567ffffffffffffffff8111156124f857600080fd5b6121ff8682870161209d565b60006020828403121561251657600080fd5b600061211a8484612050565b6000610c23838361261a565b612537816128e8565b82525050565b61253781612893565b600061255182612886565b61255b818561288a565b93508360208202850161256d85612880565b8060005b858110156125a7578484038952815161258a8582612522565b945061259583612880565b60209a909a0199925050600101612571565b5091979650505050505050565b6125378161289e565b61253781611fdf565b612537816128a3565b60006125db838561288a565b93506125e88385846128f9565b6125f183612935565b9093019392505050565b60006126078385610419565b93506126148385846128f9565b50500190565b600061262582612886565b61262f818561288a565b935061263f818560208601612905565b6125f181612935565b600061265382612886565b61265d8185610419565b935061266d818560208601612905565b9290920192915050565b6000612684602483610419565b7f696e74657266616365496d706c656d656e74657228627974657333322c62797481527f6573342900000000000000000000000000000000000000000000000000000000602082015260240192915050565b612537816128c8565b600061211a8284866125fb565b6000610c238284612648565b60006109f182612677565b602081016109f1828461253d565b602081016109f1828461252e565b60208082528101610c238184612546565b602081016109f182846125b4565b602081016109f182846125bd565b6040810161275a82856125bd565b610c2360208301846125bd565b602081016109f182846125c6565b6020808252810161211a8184866125cf565b60208082528101610c23818461261a565b604080825281016127a9818561261a565b9050610c2360208301846126d6565b606080825281016127c9818661261a565b90506127d860208301856126d6565b81810360408301526127ea818461261a565b95945050505050565b6040810161280182856125bd565b818103602083015261211a818461261a565b60405181810167ffffffffffffffff8111828210171561283257600080fd5b604052919050565b600067ffffffffffffffff82111561285157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b90815260200190565b6000610416826128cf565b151590565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61ffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b600061041682600061041682612893565b82818337506000910152565b60005b83811015612920578181015183820152602001612908565b8381111561292f576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b61296681612893565b811461199757600080fd5b6129668161289e565b61296681611fdf565b612966816128a3565b612966816128c856fea365627a7a72315820a34543b9e2df9201a793e2f372f5b17bdd62913b745d9d07ad5a33cb6e3e2b7a6c6578706572696d656e74616cf564736f6c63430005100040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000062fdb87fec340e5283fbc91312e9d237465a2b45
-----Decoded View---------------
Arg [0] : _ens (address): 0x62FdB87Fec340e5283Fbc91312e9d237465A2B45
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000062fdb87fec340e5283fbc91312e9d237465a2b45
Deployed Bytecode Sourcemap
49922:2222:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49922:2222:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49519:171;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39154:1291;;;;;;;;;:::i;:::-;;48970:187;;;;;;;;;:::i;44618:977::-;;;;;;;;;:::i;:::-;;;;;;;;3223:464;;;;;;;;;:::i;:::-;;;;;;;;;47617:172;;;;;;;;;:::i;6332:169::-;;;;;;;;;:::i;4890:234::-;;;;;;;;;:::i;51323:::-;;;;;;;;;:::i;41247:155::-;;;;;;;;;:::i;49382:129::-;;;;;;;;;:::i;:::-;;;;;;;;2594:298;;;;;;;;;:::i;46675:103::-;;;;;;;;;:::i;46312:155::-;;;;;;;;;:::i;5132:292::-;;;;;;;;;:::i;40856:170::-;;;;;;;;;:::i;51767:374::-;;;;;;;;;:::i;:::-;;;;;;;;41547:131;;;;;;;;;:::i;6675:110::-;;;;;;;;;:::i;48039:135::-;;;;;;;;;:::i;:::-;;;;;;;;;4590:134;;;;;;;;;:::i;43740:229::-;;;;;;;;;:::i;5432:129::-;;;;;;;;;:::i;50354:80::-;;;;;;;;;:::i;49519:171::-;49586:4;49610:32;;;49625:17;49610:32;;:72;;;49646:36;49670:11;49646:23;:36::i;:::-;49603:79;;49519:171;;;;:::o;39154:1291::-;39232:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;39249:15;;39308:17;;39249:15;39459:30;;:::i;:::-;39492:18;39508:1;39492:4;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39492:15:0;;:18;-1:-1:-1;;39492:18:0;:15;:18;;-1:-1:-1;39492:18:0:i;:::-;39459:51;;39454:838;39513:11;:4;:9;:11::i;:::-;39454:838;;39558:13;;;39554:727;;39603:4;:12;;;39592:23;;39641:11;:4;:9;:11::i;:::-;39634:18;;39709:4;39692:22;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;39692:22:0;;;39682:33;;;;;;39671:44;;39748:12;:4;:10;:12::i;:::-;39734:27;;39554:727;;;39802:20;39825:11;:4;:9;:11::i;:::-;39802:34;;39871:4;:12;;;39859:24;;:8;:24;;;;:49;;;-1:-1:-1;39888:20:0;:4;39900:7;39888:20;:11;:20;:::i;:::-;39887:21;39859:49;39855:411;;;39933:88;39945:4;39951;39957:8;39967:4;;39933:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;;;39981:11:0;;;;40003:12;;39973:6;;39981:20;;;;40003:17;39933:11;:88::i;:::-;40055:4;:12;;;40044:23;;40099:4;:11;;;40090:20;;40140:7;40133:14;;40191:4;40181:15;;;;;;40170:26;;40233:12;:4;:10;:12::i;:::-;40219:27;;39855:411;39554:727;;39526:11;:4;:9;:11::i;:::-;39454:838;;;-1:-1:-1;40306:11:0;;:15;40302:136;;40338:88;40350:4;40356;40362:8;40372:4;;40338:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;40408:12:0;;40378:6;;-1:-1:-1;40386:20:0;;;;-1:-1:-1;40408:17:0;40338:11;:88::i;:::-;1542:1;;;;;39154:1291;;;;:::o;48970:187::-;49065:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;49101:5;;49082;:11;49088:4;49082:11;;;;;;;;;;;49094:3;;49082:16;;;;;;;;;;;;;;;;;;;;;;:24;;:16;;:24;:::i;:::-;;49140:3;;49122:27;;;;;;;;;;;;;;;;49134:4;49122:27;49145:3;;49122:27;;;;;;;;;;;;;;;;48970:187;;;;;;:::o;44618:977::-;44705:7;44747:16;;;:10;:16;;;;;;;;:29;;;;;;;;;;;;;44790:25;;44787:75;;44839:11;-1:-1:-1;44832:18:0;;44787:75;44874:9;44886:10;44891:4;44886;:10::i;:::-;44874:22;-1:-1:-1;44910:15:0;;;44907:64;;44957:1;44942:17;;;;;;44907:64;44984:12;44998:23;45025:1;:12;;43173:10;45091:17;;45038:71;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;45038:71:0;;;49:4:-1;25:18;;61:17;;45038:71:0;182:15:-1;45038:71:0;179:29:-1;160:49;;45025:85:0;;;45038:71;45025:85;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;44983:127:0;;;;45125:7;45124:8;:34;;;;45156:2;45136:10;:17;:22;45124:34;:57;;;;45162:10;45173:2;45162:14;;;;;;;;;;;;;;:19;45124:57;45121:154;;;45261:1;45246:17;;;;;;;;45121:154;45311:1;:12;;45377:11;45324:65;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;45324:65:0;;;49:4:-1;25:18;;61:17;;45324:65:0;182:15:-1;45324:65:0;179:29:-1;160:49;;45311:79:0;;;45324:65;45311:79;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;45287:103:0;;-1:-1:-1;45287:103:0;-1:-1:-1;45404:8:0;;;:34;;;45436:2;45416:10;:17;:22;45404:34;:57;;;;45442:10;45453:2;45442:14;;;;;;;;;;;;;;:19;45404:57;45401:166;;;45553:1;45538:17;;;;;;;;45401:166;-1:-1:-1;45586:1:0;;-1:-1:-1;;;44618:977:0;;;;;:::o;3223:464::-;3295:7;3370:10;;;;;;;;;;3304:12;;3420:1;3393:253;3438:12;3423:11;:27;3393:253;;3491:26;;;3490:33;;;;:67;;-1:-1:-1;3556:1:0;3527:19;;;;;;;;;;:26;;-1:-1:-1;;3527:26:0;;;;;;;;;;;:30;;3490:67;3486:149;;;3599:19;;;;;;;;;;;;;3578:41;;;;;;-1:-1:-1;;3578:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3586:11;;3599:19;;;;3578:41;;;3599:19;3578:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3486:149;3468:1;3452:17;3393:253;;;-1:-1:-1;;3669:9:0;;;;;;;;;3666:1;3669:9;;;3666:1;-1:-1:-1;3669:9:0;-1:-1:-1;3223:464:0;;;;;;:::o;47617:172::-;47692:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;47725:15;;;;;;;;;;;;;;;;;;-1:-1:-1;47709:13:0;;;:7;:13;;;;;;;:31;;;;;;;;;;47756:25;47717:4;;47756:25;;;;47735:1;;47738;;47756:25;;;;;;;;;;47617:172;;;;:::o;6332:169::-;6411:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;6428:12;;;;:6;:12;;;;;:19;;6443:4;;6428:19;:::i;:::-;;6482:4;6463:30;6488:4;;6463:30;;;;;;;;4890:234;4939:15;4967:14;4984:25;4989:4;4157:2;4984:4;:25::i;:::-;4967:42;;5023:1;:8;5035:1;5023:13;5020:62;;;5068:1;5053:17;;;;;5020:62;5099:17;5114:1;5099:14;:17::i;:::-;5092:24;4890:234;-1:-1:-1;;;4890:234:0:o;51323:::-;51418:20;;;;:14;:20;;;;;;;;51439:10;51418:32;;;;;;;;;;:40;;;;;;;;;;;:55;;;;;;;;;;51489:60;51418:40;;51439:10;51418:20;;51489:60;;;;51418:55;;51489:60;;;;;;;;;;51323:234;;;:::o;41247:155::-;41319:4;41344:22;;;:16;:22;;;;;;;;41367:8;:14;;;;;;41344:38;;;;;;;:44;;;;;;;;;;;:49;;;41247:155::o;49382:129::-;49454:13;49487:5;:11;49493:4;49487:11;;;;;;;;;;;49499:3;;49487:16;;;;;;;;;;;;;;;;;;;;;;;;49480:23;;;;;;;;;-1:-1:-1;;49480:23:0;;;;;;;;;;;;;;;;;;;;;;;49487:16;;;;49480:23;;;49487:16;49480:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49382:129;;;;;:::o;2594:298::-;2686:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;-1:-1:-1;;2759:15:0;;2758:31;;2757:38;2749:47;;;;;;2809:4;:10;;;;;;;;;;;:23;;;;;;;;:30;;2835:4;;2809:30;:::i;:::-;-1:-1:-1;2855:29:0;;2872:11;;2866:4;;2855:29;;;;;2594:298;;;;;:::o;46675:103::-;46759:11;;;;:5;:11;;;;;;;;;46752:18;;;;;;-1:-1:-1;;46752:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46726:13;;46752:18;;;46759:11;46752:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46675:103;;;:::o;46312:155::-;46385:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;46402:11;;;;:5;:11;;;;;:18;;46416:4;;46402:18;:::i;:::-;;46448:4;46436:23;46454:4;;46436:23;;;;;;;;5132:292;5212:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;5249:4;5234:33;5255:8;5265:1;5234:33;;;;;;;;;;;;;;;;4157:2;5281:8;:25;5278:98;;;5340:4;5328:36;5346:17;5361:1;5346:14;:17::i;:::-;5328:36;;;;;;;;;;;;;;;5278:98;5386:16;;;;:10;:16;;;;;;;;:26;;;;;;;;:30;;;;;;;;:::i;:::-;;5132:292;;;;:::o;40856:170::-;40973:13;;;;:7;:13;;;;;;;;40987:8;:14;;;;;;40973:29;;;;;;;:35;;;;;;;;:45;;;;;;;;;;;40966:52;;;;;;-1:-1:-1;;40966:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40941:12;;40966:52;;;40973:45;40966:52;;;;;;;;;;;;;;;;;;;;;;;;51767:374;51871:24;;;;;;;;;;;;;;;;51826:22;;51883:4;51871:24;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51861:34:0;-1:-1:-1;51910:6:0;51906:203;51922:15;;;51906:203;;;51960:12;51974:19;52005:4;52024;;52029:1;52024:7;;;;;;;;;;;;-1:-1:-1;30:25;;92:48;100:14;96:29;;;92:48;68:73;;58:2;;155:1;152;145:12;58:2;174:33;;;69:4;55:19;;;-1:-1;16:22;93:18;82:30;;79:2;;;125:1;122;115:12;79:2;155:14;151:38;;;137:53;;134:2;;;203:1;200;193:12;134:2;51997:35:0;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;51959:73:0;;;;52055:7;52047:16;;;;;;52091:6;52078:7;52086:1;52078:10;;;;;;;;;;;;;;;;;:19;-1:-1:-1;;51939:3:0;;51906:203;;;-1:-1:-1;51767:374:0;;;;:::o;41547:131::-;41601:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;41618:14;;;;:8;:14;;;;;;:16;;;;;;41650:20;41627:4;;41650:20;;;41547:131;;:::o;6675:110::-;6765:12;;;;:6;:12;;;;;;;;;6758:19;;;;;;;;;;-1:-1:-1;;6758:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;6733:12;;6765;;6758:19;;6765:12;6758:19;;;;;;;;;;;;;;;;;;;;;;;;48039:135;48092:9;48133:13;;;:7;:13;;;;;:15;;48150;;;;;48133;;48039:135::o;4590:134::-;4652:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;4669:47;4677:4;4157:2;4698:17;4713:1;4698:14;:17::i;4669:47::-;4590:134;;;:::o;43740:229::-;43837:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;43854:16;;;;:10;:16;;;;;;;;:29;;;;;;;;;;;;:43;;;;;;;;;;43913:48;;43854:16;;43913:48;;;;43854:43;;43913:48;;;;;;;;;;43740:229;;;;:::o;5432:129::-;5527:16;;;;:10;:16;;;;;;;;:26;;;;;;;;;5520:33;;;;;;;;;;;-1:-1:-1;;5520:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;5495:12;;5527:26;;5520:33;;5527:26;5520:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5432:129;;;;:::o;50354:80::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48182:173::-;48249:4;48273:34;;;48288:19;48273:34;;:74;;;48311:36;48335:11;48311:23;:36::i;51565:194::-;51656:3;;:15;;;;;51623:4;;;;51656:3;;;;;:9;;:15;;51666:4;;51656:15;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51656:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51656:15:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51656:15:0;;;;;;;;;51640:31;-1:-1:-1;51689:19:0;;;51698:10;51689:19;;:62;;-1:-1:-1;51712:20:0;;;;:14;:20;;;;;;;;:27;;;;;;;;;;51740:10;51712:39;;;;;;;;;;51682:69;;;51565:194;;;:::o;31826:186::-;31901:21;;:::i;:::-;31935:15;;;31961:14;;;:23;;;31995:9;31935:3;31995:4;:9::i;32190:123::-;32289:9;;:16;32274:11;;;;;:31;;;32190:123::o;33329:168::-;33441:11;;;;33465:9;;33389:12;;33421:68;;33454:34;;33441:11;33454:10;:34::i;:::-;33421:9;;;:68;;:19;:68;:::i;33677:174::-;33790:16;;;;33808:15;;;;33770:9;;33738:12;;33770:73;;33808:34;;;33770:73;:19;:73;:::i;12079:178::-;12156:4;12195:5;:12;12180:4;:11;:27;:69;;;;;12211:38;12218:4;12224:1;12227:5;12234:1;12237:4;:11;12211:6;:38::i;41871:990::-;42098:15;42116:14;;;:8;:14;;;;;;;;;42160:15;;;;;;;;;42186:19;42208:28;:4;42223:6;42231:4;42208:28;:14;:28;:::i;:::-;42186:50;;42251:12;42247:607;;;42284:13;;;;:7;:13;;;;;;;;:22;;;;;;;;:32;;;;;;;;:42;;;;;;;;;;:49;;-1:-1:-1;;42284:49:0;;;;;;;;;;;:54;42280:138;;42359:22;;;;:16;:22;;;;;;;;:31;;;;;;;;:41;;;;;;;;:43;;;;;;;;;-1:-1:-1;;42359:43:0;;;;;;;42280:138;42439:13;;;;:7;:13;;;;;;;;:22;;;;;;;;:32;;;;;;;;:42;;;;;;;;;;42432:50;;;:::i;:::-;42519:4;42502:38;42525:4;42531:8;42502:38;;;;;;;;;;;;;;;;42247:607;;;42577:13;;;;:7;:13;;;;;;;;:22;;;;;;;;:32;;;;;;;;:42;;;;;;;;;;:49;;-1:-1:-1;;42577:49:0;;;;;;;;;;;42573:138;;42652:22;;;;:16;:22;;;;;;;;:31;;;;;;;;:41;;;;;;;;:43;;;;;;;;;;;;;;;;42573:138;42725:13;;;;:7;:13;;;;;;;;:22;;;;;;;;:32;;;;;;;;:42;;;;;;;;;;:51;;;;;;;;:::i;:::-;;42813:4;42796:46;42819:4;42825:8;42835:6;42796:46;;;;;;;;;;;;;;;;;42247:607;41871:990;;;;;;;;;;:::o;32442:704::-;32519:15;;;;32505:11;;;:29;;;32564:9;;:16;-1:-1:-1;32545:70:0;;32597:7;;32545:70;32653:8;32678:34;32689:4;:9;;;32700:4;:11;;;32678:10;:34::i;:::-;32664:11;;;;32778:9;;32664:48;;;-1:-1:-1;32778:25:0;;32664:48;32778:25;:20;:25;:::i;:::-;32763:40;;:12;;;:40;32846:9;;32821:1;32814:8;;;;;32846:25;;32814:8;32846:25;:20;:25;:::i;:::-;32833:38;;:10;;;:38;32912:9;;32889:1;32882:8;;;;;32912:25;;32882:8;32912:25;:20;:25;:::i;:::-;32901:36;;;;:8;;;:36;33015:9;;32955:1;32948:8;;;;;32996:16;;33015:25;;:9;32948:8;;33015:20;:25;:::i;:::-;33058:1;33051:8;;;33070:16;;;:22;32996:44;;;;;33121:17;;;;;;33103:15;;;:35;-1:-1:-1;32442:704:0;;:::o;1559:209::-;1621:17;1659:1;:8;1671:2;1659:14;1651:23;;;;;;-1:-1:-1;1731:2:0;1724:10;1718:17;1737:12;1714:36;;;1694:67::o;1776:194::-;1864:13;;;1874:2;1864:13;;;;;;;;;1833:14;;1864:13;;;21:6:-1;;104:10;1864:13:0;87:34:-1;-1:-1;;;1938:12:0;1931:20;;;;1926:2;1919:10;;1912:40;-1:-1:-1;1931:20:0;1897:66::o;46786:171::-;46853:4;46877:32;;;46892:17;46877:32;;:72;;;46913:36;46937:11;46913:23;:36::i;29863:378::-;29937:4;29965:6;29982:222;30023:4;:11;30017:3;:17;30010:25;;;;30050:13;30066:19;:4;30081:3;30066:19;:14;:19;:::i;:::-;30050:35;;30100:19;;;30118:1;30100:19;;30050:35;-1:-1:-1;30138:13:0;30134:59;;30172:5;;;30134:59;29982:222;;;;30221:12;;;;;29863:378;-1:-1:-1;;29863:378:0:o;15956:407::-;16039:12;16088:4;:11;16081:3;16072:6;:12;:27;;16064:36;;;;;;16113:16;16142:3;16132:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;16132:14:0;87:34:-1;135:17;;-1:-1;16132:14:0;-1:-1:-1;16113:33:0;-1:-1:-1;16239:2:0;16230:12;;;;16263:26;;;;16310:22;16230:12;16263:26;16328:3;16310:6;:22::i;:::-;-1:-1:-1;16352:3:0;;15956:407;-1:-1:-1;;;;;15956:407:0:o;10409:211::-;10528:4;10581:31;10588:5;10595:11;10608:3;10581:6;:31::i;:::-;10552:25;10559:4;10565:6;10573:3;10552:6;:25::i;:::-;:60;;10409:211;-1:-1:-1;;;;;;10409:211:0:o;12883:228::-;12955:10;12997:4;:11;12986:3;12992:1;12986:7;:22;;12978:31;;;;;;-1:-1:-1;13061:22:0;13075:1;13061:22;13055:29;13086:6;13051:42;;13029:75::o;13363:232::-;13435:10;13477:4;:11;13466:3;13472:1;13466:7;:22;;13458:31;;;;;;-1:-1:-1;13541:22:0;13555:1;13541:22;13535:29;13566:10;13531:46;;13509:79::o;45603:176::-;45670:4;43072:49;;;;;;;;;;;;;;45694:37;;;:11;:37;;;;:77;;;;45735:36;45759:11;45735:23;:36::i;12507:124::-;12578:9;12613:4;12618:3;12613:9;;;;;;;;;;;;;;;-1:-1:-1;12507:124:0;;;;:::o;15162:566::-;15284:171;15298:2;15291:3;:9;15284:171;;15369:10;;15356:24;;15417:2;15409:10;;;;15434:9;;;;15302;;15284:171;;;15587:10;;15643:11;;15520:2;:8;;;;15512:3;:17;-1:-1:-1;;15512:21:0;15599:9;;15583:26;;;15639:22;;15688:21;15675:35;;15553:168::o;7358:243::-;7439:11;7487:4;:11;7480:3;7471:6;:12;:27;;7463:36;;;;;;-1:-1:-1;7551:26:0;;7565:2;7551:26;7541:42;;7519:75::o;41686:177::-;41753:4;41777:38;;;41792:23;41777:38;;:78;;;41819:36;41843:11;6860:4;6884:40;;;6899:25;6884:40;;:80;;;6928:36;6952:11;5636:4;5660:32;;;5675:17;5660:32;;:71;;-1:-1:-1;5696:35:0;;;5711:20;5696:35;5660:71;:111;;;;5735:36;5759:11;3762:4;3786:31;;;3801:16;3786:31;;:71;;-1:-1:-1;1354:17:0;1339:32;;;;3821:36;1248:131::o;49922:2222::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49922:2222:0;;;-1:-1:-1;49922:2222:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;142:134;220:13;;238:33;220:13;238:33;;299:359;;;436:3;429:4;421:6;417:17;413:27;403:2;;454:1;451;444:12;403:2;-1:-1;474:20;;514:18;503:30;;500:2;;;546:1;543;536:12;500:2;580:4;572:6;568:17;556:29;;631:3;623:4;615:6;611:17;601:8;597:32;594:41;591:2;;;648:1;645;638:12;666:124;730:20;;755:30;730:20;755:30;;797:130;864:20;;889:33;864:20;889:33;;934:128;1000:20;;1025:32;1000:20;1025:32;;1083:336;;;1197:3;1190:4;1182:6;1178:17;1174:27;1164:2;;1215:1;1212;1205:12;1164:2;-1:-1;1235:20;;1275:18;1264:30;;1261:2;;;1307:1;1304;1297:12;1261:2;1341:4;1333:6;1329:17;1317:29;;1392:3;1384:4;1376:6;1372:17;1362:8;1358:32;1355:41;1352:2;;;1409:1;1406;1399:12;1428:440;;1529:3;1522:4;1514:6;1510:17;1506:27;1496:2;;1547:1;1544;1537:12;1496:2;1584:6;1571:20;1606:64;1621:48;1662:6;1621:48;;;1606:64;;;1597:73;;1690:6;1683:5;1676:21;1726:4;1718:6;1714:17;1759:4;1752:5;1748:16;1794:3;1785:6;1780:3;1776:16;1773:25;1770:2;;;1811:1;1808;1801:12;1770:2;1821:41;1855:6;1850:3;1845;1821:41;;;1489:379;;;;;;;;2236:128;2302:20;;2327:32;2302:20;2327:32;;2508:263;;2623:2;2611:9;2602:7;2598:23;2594:32;2591:2;;;2639:1;2636;2629:12;2591:2;2674:1;2691:64;2747:7;2727:9;2691:64;;;2681:74;2585:186;-1:-1;;;;2585:186;2778:411;;;2924:2;2912:9;2903:7;2899:23;2895:32;2892:2;;;2940:1;2937;2930:12;2892:2;2975:31;;3026:18;3015:30;;3012:2;;;3058:1;3055;3048:12;3012:2;3086:87;3165:7;3156:6;3145:9;3141:22;3086:87;;;3076:97;;;;2954:225;2886:303;;;;;;3196:241;;3300:2;3288:9;3279:7;3275:23;3271:32;3268:2;;;3316:1;3313;3306:12;3268:2;3351:1;3368:53;3413:7;3393:9;3368:53;;3444:366;;;3565:2;3553:9;3544:7;3540:23;3536:32;3533:2;;;3581:1;3578;3571:12;3533:2;3616:1;3633:53;3678:7;3658:9;3633:53;;;3623:63;;3595:97;3723:2;3741:53;3786:7;3777:6;3766:9;3762:22;3741:53;;;3731:63;;3702:98;3527:283;;;;;;3817:491;;;;3955:2;3943:9;3934:7;3930:23;3926:32;3923:2;;;3971:1;3968;3961:12;3923:2;4006:1;4023:53;4068:7;4048:9;4023:53;;;4013:63;;3985:97;4113:2;4131:53;4176:7;4167:6;4156:9;4152:22;4131:53;;;4121:63;;4092:98;4221:2;4239:53;4284:7;4275:6;4264:9;4260:22;4239:53;;;4229:63;;4200:98;3917:391;;;;;;4315:485;;;;4450:2;4438:9;4429:7;4425:23;4421:32;4418:2;;;4466:1;4463;4456:12;4418:2;4501:1;4518:53;4563:7;4543:9;4518:53;;;4508:63;;4480:97;4608:2;4626:53;4671:7;4662:6;4651:9;4647:22;4626:53;;;4616:63;;4587:98;4716:2;4734:50;4776:7;4767:6;4756:9;4752:22;4734:50;;4807:366;;;4928:2;4916:9;4907:7;4903:23;4899:32;4896:2;;;4944:1;4941;4934:12;4896:2;4979:1;4996:53;5041:7;5021:9;4996:53;;;4986:63;;4958:97;5086:2;5104:53;5149:7;5140:6;5129:9;5125:22;5104:53;;5180:491;;;;5318:2;5306:9;5297:7;5293:23;5289:32;5286:2;;;5334:1;5331;5324:12;5286:2;5369:1;5386:53;5431:7;5411:9;5386:53;;;5376:63;;5348:97;5476:2;5494:53;5539:7;5530:6;5519:9;5515:22;5494:53;;;5484:63;;5455:98;5584:2;5602:53;5647:7;5638:6;5627:9;5623:22;5602:53;;5678:489;;;;5815:2;5803:9;5794:7;5790:23;5786:32;5783:2;;;5831:1;5828;5821:12;5783:2;5866:1;5883:53;5928:7;5908:9;5883:53;;;5873:63;;5845:97;5973:2;5991:53;6036:7;6027:6;6016:9;6012:22;5991:53;;;5981:63;;5952:98;6081:2;6099:52;6143:7;6134:6;6123:9;6119:22;6099:52;;6174:364;;;6294:2;6282:9;6273:7;6269:23;6265:32;6262:2;;;6310:1;6307;6300:12;6262:2;6345:1;6362:53;6407:7;6387:9;6362:53;;;6352:63;;6324:97;6452:2;6470:52;6514:7;6505:6;6494:9;6490:22;6470:52;;6545:489;;;;6682:2;6670:9;6661:7;6657:23;6653:32;6650:2;;;6698:1;6695;6688:12;6650:2;6733:1;6750:53;6795:7;6775:9;6750:53;;;6740:63;;6712:97;6840:2;6858:52;6902:7;6893:6;6882:9;6878:22;6858:52;;7041:490;;;;7181:2;7169:9;7160:7;7156:23;7152:32;7149:2;;;7197:1;7194;7187:12;7149:2;7232:1;7249:53;7294:7;7274:9;7249:53;;;7239:63;;7211:97;7367:2;7356:9;7352:18;7339:32;7391:18;7383:6;7380:30;7377:2;;;7423:1;7420;7413:12;7377:2;7451:64;7507:7;7498:6;7487:9;7483:22;7451:64;;;7441:74;;;;7318:203;7143:388;;;;;;8037:743;;;;;;8215:2;8203:9;8194:7;8190:23;8186:32;8183:2;;;8231:1;8228;8221:12;8183:2;8266:1;8283:53;8328:7;8308:9;8283:53;;;8273:63;;8245:97;8401:2;8390:9;8386:18;8373:32;8425:18;8417:6;8414:30;8411:2;;;8457:1;8454;8447:12;8411:2;8485:65;8542:7;8533:6;8522:9;8518:22;8485:65;;;8475:75;;;;8352:204;8615:2;8604:9;8600:18;8587:32;8639:18;8631:6;8628:30;8625:2;;;8671:1;8668;8661:12;8625:2;8699:65;8756:7;8747:6;8736:9;8732:22;8699:65;;;8689:75;;;;8566:204;8177:603;;;;;;;;;9160:615;;;;;9317:2;9305:9;9296:7;9292:23;9288:32;9285:2;;;9333:1;9330;9323:12;9285:2;9368:1;9385:53;9430:7;9410:9;9385:53;;;9375:63;;9347:97;9475:2;9493:53;9538:7;9529:6;9518:9;9514:22;9493:53;;;9483:63;;9454:98;9611:2;9600:9;9596:18;9583:32;9635:18;9627:6;9624:30;9621:2;;;9667:1;9664;9657:12;9621:2;9695:64;9751:7;9742:6;9731:9;9727:22;9695:64;;;9279:496;;;;-1:-1;9685:74;-1:-1;;;;9279:496;9782:595;;;;9929:2;9917:9;9908:7;9904:23;9900:32;9897:2;;;9945:1;9942;9935:12;9897:2;9980:1;9997:53;10042:7;10022:9;9997:53;;;9987:63;;9959:97;10087:2;10105:53;10150:7;10141:6;10130:9;10126:22;10105:53;;;10095:63;;10066:98;10223:2;10212:9;10208:18;10195:32;10247:18;10239:6;10236:30;10233:2;;;10279:1;10276;10269:12;10233:2;10299:62;10353:7;10344:6;10333:9;10329:22;10299:62;;10384:239;;10487:2;10475:9;10466:7;10462:23;10458:32;10455:2;;;10503:1;10500;10493:12;10455:2;10538:1;10555:52;10599:7;10579:9;10555:52;;10631:177;;10742:60;10798:3;10790:6;10742:60;;10816:142;10907:45;10946:5;10907:45;;;10902:3;10895:58;10889:69;;;10965:137;11064:32;11090:5;11064:32;;11256:888;;11411:59;11464:5;11411:59;;;11483:91;11567:6;11562:3;11483:91;;;11476:98;;11597:3;11639:4;11631:6;11627:17;11622:3;11618:27;11666:61;11721:5;11666:61;;;11747:7;11775:1;11760:345;11785:6;11782:1;11779:13;11760:345;;;11847:9;11841:4;11837:20;11832:3;11825:33;11892:6;11886:13;11914:74;11983:4;11968:13;11914:74;;;11906:82;;12005:65;12063:6;12005:65;;;12093:4;12084:14;;;;;11995:75;-1:-1;;11807:1;11800:9;11760:345;;;-1:-1;12118:4;;11390:754;-1:-1;;;;;;;11390:754;12152:104;12229:21;12244:5;12229:21;;12263:113;12346:24;12364:5;12346:24;;12383:110;12464:23;12481:5;12464:23;;12523:297;;12637:70;12700:6;12695:3;12637:70;;;12630:77;;12719:43;12755:6;12750:3;12743:5;12719:43;;;12784:29;12806:6;12784:29;;;12775:39;;;;12623:197;-1:-1;;;12623:197;12851:306;;12979:88;13060:6;13055:3;12979:88;;;12972:95;;13079:43;13115:6;13110:3;13103:5;13079:43;;;-1:-1;;13135:16;;12965:192;13165:343;;13275:38;13307:5;13275:38;;;13325:70;13388:6;13383:3;13325:70;;;13318:77;;13400:52;13445:6;13440:3;13433:4;13426:5;13422:16;13400:52;;;13473:29;13495:6;13473:29;;13515:356;;13643:38;13675:5;13643:38;;;13693:88;13774:6;13769:3;13693:88;;;13686:95;;13786:52;13831:6;13826:3;13819:4;13812:5;13808:16;13786:52;;;13850:16;;;;;13623:248;-1:-1;;13623:248;15234:409;;15412:85;15494:2;15489:3;15412:85;;;15530:34;15510:55;;15599:6;15594:2;15585:12;;15578:28;15634:2;15625:12;;15398:245;-1:-1;;15398:245;15651:110;15732:23;15749:5;15732:23;;15888:274;;16038:99;16133:3;16124:6;16116;16038:99;;16169:262;;16313:93;16402:3;16393:6;16313:93;;16731:372;;16930:148;17074:3;16930:148;;17110:213;17228:2;17213:18;;17242:71;17217:9;17286:6;17242:71;;17330:229;17456:2;17441:18;;17470:79;17445:9;17522:6;17470:79;;17818:381;17996:2;18010:47;;;17981:18;;18071:118;17981:18;18175:6;18071:118;;18206:201;18318:2;18303:18;;18332:65;18307:9;18370:6;18332:65;;18414:213;18532:2;18517:18;;18546:71;18521:9;18590:6;18546:71;;18634:324;18780:2;18765:18;;18794:71;18769:9;18838:6;18794:71;;;18876:72;18944:2;18933:9;18929:18;18920:6;18876:72;;18965:209;19081:2;19066:18;;19095:69;19070:9;19137:6;19095:69;;19181:317;19327:2;19341:47;;;19312:18;;19402:86;19312:18;19474:6;19466;19402:86;;19505:297;19641:2;19655:47;;;19626:18;;19716:76;19626:18;19778:6;19716:76;;19809:404;19971:2;19985:47;;;19956:18;;20046:76;19956:18;20108:6;20046:76;;;20038:84;;20133:70;20199:2;20188:9;20184:18;20175:6;20133:70;;20220:599;20428:2;20442:47;;;20413:18;;20503:76;20413:18;20565:6;20503:76;;;20495:84;;20590:70;20656:2;20645:9;20641:18;20632:6;20590:70;;;20708:9;20702:4;20698:20;20693:2;20682:9;20678:18;20671:48;20733:76;20804:4;20795:6;20733:76;;;20725:84;20399:420;-1:-1;;;;;20399:420;21462:408;21626:2;21611:18;;21640:71;21615:9;21684:6;21640:71;;;21759:9;21753:4;21749:20;21744:2;21733:9;21729:18;21722:48;21784:76;21855:4;21846:6;21784:76;;21877:256;21939:2;21933:9;21965:17;;;22040:18;22025:34;;22061:22;;;22022:62;22019:2;;;22097:1;22094;22087:12;22019:2;22113;22106:22;21917:216;;-1:-1;21917:216;22140:321;;22283:18;22275:6;22272:30;22269:2;;;22315:1;22312;22305:12;22269:2;-1:-1;22446:4;22382;22359:17;;;;22378:9;22355:33;22436:15;;22206:255;22468:156;22597:4;22588:14;;22545:79;22631:142;22739:12;;22710:63;23282:183;23405:19;;;23454:4;23445:14;;23398:67;24284:91;;24346:24;24364:5;24346:24;;24488:85;24554:13;24547:21;;24530:43;24659:144;24731:66;24720:78;;24703:100;24810:84;24882:6;24871:18;;24854:40;24901:121;24974:42;24963:54;;24946:76;25108:129;;25195:37;25226:5;25244:121;25323:37;25354:5;25323:37;;25488:145;25569:6;25564:3;25559;25546:30;-1:-1;25625:1;25607:16;;25600:27;25539:94;25642:268;25707:1;25714:101;25728:6;25725:1;25722:13;25714:101;;;25795:11;;;25789:18;25776:11;;;25769:39;25750:2;25743:10;25714:101;;;25830:6;25827:1;25824:13;25821:2;;;25895:1;25886:6;25881:3;25877:16;25870:27;25821:2;25691:219;;;;;25918:97;26006:2;25986:14;26002:7;25982:28;;25966:49;26023:117;26092:24;26110:5;26092:24;;;26085:5;26082:35;26072:2;;26131:1;26128;26121:12;26147:111;26213:21;26228:5;26213:21;;26265:117;26334:24;26352:5;26334:24;;26389:115;26457:23;26474:5;26457:23;;26511:115;26579:23;26596:5;26579:23;
Swarm Source
bzzr://a34543b9e2df9201a793e2f372f5b17bdd62913b745d9d07ad5a33cb6e3e2b7a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.