- Contract name:
- Web3Entry
- Optimization enabled
- true
- Compiler version
- v0.8.10+commit.fc410830
- Optimization runs
- 200
- Verified at
- 2022-12-05T09:13:30.255119Z
contracts/Web3Entry.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import "./Web3EntryBase.sol";import "./libraries/OP.sol";contract Web3Entry is Web3EntryBase {using EnumerableSet for EnumerableSet.AddressSet;// characterId => operator => permissionsBitMapmapping(uint256 => mapping(address => uint256)) internal _operatorsPermissionBitMap; // slot 25// characterId => noteId => operator => permissionsBitMap4Notemapping(uint256 => mapping(uint256 => mapping(address => uint256)))internal _operatorsPermission4NoteBitMap; // slot 26/*** @notice Grant an address as an operator and authorize it with custom permissions.* @param characterId ID of your character that you want to authorize.* @param operator Address to grant operator permissions to.* @param permissionBitMap Bitmap used for finer grained operator permissions controls.* @dev Every bit in permissionBitMap stands for a corresponding method in Web3Entry. more details in OP.sol.*/function grantOperatorPermissions(uint256 characterId,address operator,uint256 permissionBitMap) external override {_validateCallerIsCharacterOwner(characterId);if (permissionBitMap == 0) {_operatorsByCharacter[characterId].remove(operator);} else {_operatorsByCharacter[characterId].add(operator);}_setOperatorPermissions(characterId, operator, permissionBitMap);}/*** @notice Grant an address as an operator and authorize it with custom permissions for a single note.* @param characterId ID of your character that you want to authorize.
contracts/libraries/PostLogic.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import "./DataTypes.sol";import "./Events.sol";import "../interfaces/ILinkModule4Note.sol";import "../interfaces/IMintModule4Note.sol";import "../interfaces/IMintNFT.sol";import "@openzeppelin/contracts/proxy/Clones.sol";import "@openzeppelin/contracts/utils/Strings.sol";library PostLogic {using Strings for uint256;function postNoteWithLink(DataTypes.PostNoteData calldata vars,uint256 noteId,bytes32 linkItemType,bytes32 linkKey,bytes calldata data,mapping(uint256 => mapping(uint256 => DataTypes.Note)) storage _noteByIdByCharacter) external {uint256 characterId = vars.characterId;// save noteif (linkItemType != bytes32(0)) {_noteByIdByCharacter[characterId][noteId].linkItemType = linkItemType;_noteByIdByCharacter[characterId][noteId].linkKey = linkKey;}_noteByIdByCharacter[characterId][noteId].contentUri = vars.contentUri;_noteByIdByCharacter[characterId][noteId].linkModule = vars.linkModule;_noteByIdByCharacter[characterId][noteId].mintModule = vars.mintModule;// init link moduleif (vars.linkModule != address(0)) {bytes memory linkModuleReturnData = ILinkModule4Note(vars.linkModule).initializeLinkModule(characterId, noteId, vars.linkModuleInitData);emit Events.SetLinkModule4Note(characterId,noteId,
@openzeppelin/contracts/utils/Strings.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)pragma solidity ^0.8.0;/*** @dev String operations.*/library Strings {bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";uint8 private constant _ADDRESS_LENGTH = 20;/*** @dev Converts a `uint256` to its ASCII `string` decimal representation.*/function toString(uint256 value) internal pure returns (string memory) {// Inspired by OraclizeAPI's implementation - MIT licence// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.solif (value == 0) {return "0";}uint256 temp = value;uint256 digits;while (temp != 0) {digits++;temp /= 10;}bytes memory buffer = new bytes(digits);while (value != 0) {digits -= 1;buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));value /= 10;}return string(buffer);}/*** @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.*/function toHexString(uint256 value) internal pure returns (string memory) {
contracts/interfaces/ILinkModule4Linklist.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;interface ILinkModule4Linklist {function initializeLinkModule(uint256 tokenId, bytes calldata data)externalreturns (bytes memory);function processLink(address account,uint256 tokenId,bytes calldata data) external;}
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)pragma solidity ^0.8.0;/*** @dev Provides information about the current execution context, including the* sender of the transaction and its data. While these are generally available* via msg.sender and msg.data, they should not be accessed in such a direct* manner, since when dealing with meta-transactions the account sending and* paying for execution may not be the actual sender (as far as an application* is concerned).** This contract is only required for intermediate, library-like contracts.*/abstract contract Context {function _msgSender() internal view virtual returns (address) {return msg.sender;}function _msgData() internal view virtual returns (bytes calldata) {return msg.data;}}
contracts/interfaces/ILinkModule4Address.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;interface ILinkModule4Address {function initializeLinkModule(address account, bytes calldata data)externalreturns (bytes memory);function processLink(address account,uint256 noteId,bytes calldata data) external;}
contracts/interfaces/IMintNFT.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;interface IMintNFT {function initialize(uint256 characterId,uint256 noteId,address web3Entry,string calldata name,string calldata symbol) external;function mint(address to) external returns (uint256);function getSourcePublicationPointer() external view returns (uint256, uint256);}
@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)pragma solidity ^0.8.0;import "../IERC721.sol";/*** @title ERC-721 Non-Fungible Token Standard, optional metadata extension* @dev See https://eips.ethereum.org/EIPS/eip-721*/interface IERC721Metadata is IERC721 {/*** @dev Returns the token collection name.*/function name() external view returns (string memory);/*** @dev Returns the token collection symbol.*/function symbol() external view returns (string memory);/*** @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.*/function tokenURI(uint256 tokenId) external view returns (string memory);}
contracts/interfaces/ILinklist.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import "../libraries/DataTypes.sol";interface ILinklist {function mint(uint256 characterId,bytes32 linkType,uint256 tokenId) external;function setUri(uint256 tokenId, string memory _uri) external;/////////////////////////////////// linking Character/////////////////////////////////function addLinkingCharacterId(uint256 tokenId, uint256 toCharacterId) external;function removeLinkingCharacterId(uint256 tokenId, uint256 toCharacterId) external;function getLinkingCharacterIds(uint256 tokenId) external view returns (uint256[] memory);function getLinkingCharacterListLength(uint256 tokenId) external view returns (uint256);function getOwnerCharacterId(uint256 tokenId) external view returns (uint256);/////////////////////////////////// linking Note/////////////////////////////////function addLinkingNote(uint256 tokenId,uint256 toCharacterId,uint256 toNoteId) external returns (bytes32);function removeLinkingNote(uint256 tokenId,uint256 toCharacterId,uint256 toNoteId
contracts/base/NFTBase.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import "./ERC721Enumerable.sol";import "../libraries/Events.sol";abstract contract NFTBase is ERC721Enumerable {function _initialize(string calldata name, string calldata symbol) internal {ERC721.__ERC721_Init(name, symbol);emit Events.BaseInitialized(name, symbol, block.timestamp);}function burn(uint256 tokenId) public virtual {require(_isApprovedOrOwner(msg.sender, tokenId), "NFTBase: NotOwnerOrApproved");_burn(tokenId);}}
@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)pragma solidity ^0.8.0;import "../IERC721.sol";/*** @title ERC-721 Non-Fungible Token Standard, optional enumeration extension* @dev See https://eips.ethereum.org/EIPS/eip-721*/interface IERC721Enumerable is IERC721 {/*** @dev Returns the total amount of tokens stored by the contract.*/function totalSupply() external view returns (uint256);/*** @dev Returns a token ID owned by `owner` at a given `index` of its token list.* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.*/function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);/*** @dev Returns a token ID at a given `index` of all the tokens stored by the contract.* Use along with {totalSupply} to enumerate all tokens.*/function tokenByIndex(uint256 index) external view returns (uint256);}
@openzeppelin/contracts/proxy/utils/Initializable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)pragma solidity ^0.8.2;import "../../utils/Address.sol";/*** @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.** The initialization functions use a version number. Once a version number is used, it is consumed and cannot be* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in* case an upgrade adds a module that needs to be initialized.** For example:** [.hljs-theme-light.nopadding]* ```* contract MyToken is ERC20Upgradeable {* function initialize() initializer public {* __ERC20_init("MyToken", "MTK");* }* }* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {* function initializeV2() reinitializer(2) public {* __ERC20Permit_init("MyToken");* }* }* ```** TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.** CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.** [CAUTION]* ====
@openzeppelin/contracts/token/ERC721/IERC721.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)pragma solidity ^0.8.0;import "../../utils/introspection/IERC165.sol";/*** @dev Required interface of an ERC721 compliant contract.*/interface IERC721 is IERC165 {/*** @dev Emitted when `tokenId` token is transferred from `from` to `to`.*/event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);/*** @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.*/event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);/*** @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.*/event ApprovalForAll(address indexed owner, address indexed operator, bool approved);/*** @dev Returns the number of tokens in ``owner``'s account.*/function balanceOf(address owner) external view returns (uint256 balance);/*** @dev Returns the owner of the `tokenId` token.** Requirements:** - `tokenId` must exist.*/function ownerOf(uint256 tokenId) external view returns (address owner);/**
@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)pragma solidity ^0.8.0;/*** @title ERC721 token receiver interface* @dev Interface for any contract that wants to support safeTransfers* from ERC721 asset contracts.*/interface IERC721Receiver {/*** @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}* by `operator` from `from`, this function is called.** It must return its Solidity selector to confirm the token transfer.* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.** The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.*/function onERC721Received(address operator,address from,uint256 tokenId,bytes calldata data) external returns (bytes4);}
@openzeppelin/contracts/utils/introspection/IERC165.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)pragma solidity ^0.8.0;/*** @dev Interface of the ERC165 standard, as defined in the* https://eips.ethereum.org/EIPS/eip-165[EIP].** Implementers can declare support of contract interfaces, which can then be* queried by others ({ERC165Checker}).** For an implementation, see {ERC165}.*/interface IERC165 {/*** @dev Returns true if this contract implements the interface defined by* `interfaceId`. See the corresponding* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]* to learn more about how these ids are created.** This function call must use less than 30 000 gas.*/function supportsInterface(bytes4 interfaceId) external view returns (bool);}
contracts/base/ERC721Enumerable.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";import "./ERC721.sol";abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {// Mapping from owner to list of owned token IDsmapping(address => mapping(uint256 => uint256)) private _ownedTokens;// Mapping from token ID to index of the owner tokens listmapping(uint256 => uint256) private _ownedTokensIndex;// Array with all token ids, used for enumerationuint256[] private _allTokens;// Mapping from token id to position in the allTokens arraymapping(uint256 => uint256) private _allTokensIndex;/*** @dev See {IERC165-supportsInterface}.*/function supportsInterface(bytes4 interfaceId)publicviewvirtualoverride(IERC165, ERC721)returns (bool){returninterfaceId == type(IERC721Enumerable).interfaceId ||super.supportsInterface(interfaceId);}/*** @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.*/function tokenOfOwnerByIndex(address owner, uint256 index)publicview
contracts/libraries/LinkLogic.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import "./Events.sol";import "./DataTypes.sol";import "../interfaces/ILinklist.sol";import "../interfaces/ILinkModule4Character.sol";import "../interfaces/ILinkModule4Note.sol";import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";library LinkLogic {using EnumerableSet for EnumerableSet.Bytes32Set;function linkCharacter(uint256 fromCharacterId,uint256 toCharacterId,bytes32 linkType,bytes memory data,address linker,address linklist,address linkModule,mapping(uint256 => mapping(bytes32 => uint256)) storage _attachedLinklists) external {uint256 linklistId = _mintLinklist(fromCharacterId, linkType, linklist, _attachedLinklists);// add to link listILinklist(linklist).addLinkingCharacterId(linklistId, toCharacterId);// process link moduleif (linkModule != address(0)) {tryILinkModule4Character(linkModule).processLink(linker, toCharacterId, data){} catch {}}emit Events.LinkCharacter(linker, fromCharacterId, toCharacterId, linkType, linklistId);}function unlinkCharacter(
contracts/libraries/Constants.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;library Constants {uint8 internal constant MAX_HANDLE_LENGTH = 31;uint8 internal constant MIN_HANDLE_LENGTH = 3;// note link item type// "Character"bytes32 constant NoteLinkTypeCharacter =0x4368617261637465720000000000000000000000000000000000000000000000;// "Address"bytes32 constant NoteLinkTypeAddress =0x4164647265737300000000000000000000000000000000000000000000000000;// "Linklist"bytes32 constant NoteLinkTypeLinklist =0x4c696e6b6c697374000000000000000000000000000000000000000000000000;// "Note"bytes32 constant NoteLinkTypeNote =0x4e6f746500000000000000000000000000000000000000000000000000000000;// "ERC721"bytes32 constant NoteLinkTypeERC721 =0x4552433732310000000000000000000000000000000000000000000000000000;// "AnyUri"bytes32 constant NoteLinkTypeAnyUri =0x416e795572690000000000000000000000000000000000000000000000000000;}
contracts/interfaces/IWeb3Entry.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import "../libraries/DataTypes.sol";interface IWeb3Entry {function initialize(string calldata _name,string calldata _symbol,address _linklistContract,address _mintNFTImpl,address _periphery,address resolver) external;/////////////////////////////////////////////////////////// EXTERNAL VIEW FUNCTIONS////////////////////////////////////////////////////////function createCharacter(DataTypes.CreateCharacterData calldata vars) external;function setHandle(uint256 characterId, string calldata newHandle) external;function setSocialToken(uint256 characterId, address tokenAddress) external;function setCharacterUri(uint256 characterId, string calldata newUri) external;function setPrimaryCharacterId(uint256 characterId) external;function grantOperatorPermissions(uint256 characterId,address operator,uint256 permissionBitMap) external;function grantOperatorPermissions4Note(uint256 characterId,uint256 noteId,address operator,uint256 permissionBitMap
contracts/interfaces/ILinkModule4Character.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;interface ILinkModule4Character {function initializeLinkModule(uint256 characterId, bytes calldata data)externalreturns (bytes memory);function processLink(address caller,uint256 characterId,bytes calldata data) external;}
contracts/libraries/Events.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;library Events {event BaseInitialized(string name, string symbol, uint256 timestamp);event Web3EntryInitialized(uint256 timestamp);event LinklistNFTInitialized(uint256 timestamp);event MintNFTInitialized(uint256 characterId, uint256 noteId, uint256 timestamp);event CharacterCreated(uint256 indexed characterId,address indexed creator,address indexed to,string handle,uint256 timestamp);event SetPrimaryCharacterId(address indexed account,uint256 indexed characterId,uint256 indexed oldCharacterId);event SetHandle(address indexed account, uint256 indexed characterId, string newHandle);event SetSocialToken(address indexed account,uint256 indexed characterId,address indexed tokenAddress);event SetOperator(uint256 indexed characterId, address indexed operator, uint256 timestamp);event AddOperator(uint256 indexed characterId, address indexed operator, uint256 timestamp);event RemoveOperator(uint256 indexed characterId, address indexed operator, uint256 timestamp);
contracts/interfaces/IMintModule4Note.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;interface IMintModule4Note {function initializeMintModule(uint256 characterId,uint256 noteId,bytes calldata data) external returns (bytes memory);function processMint(address to,uint256 characterId,uint256 noteId,bytes calldata data) external;}
contracts/interfaces/ILinkModule4Note.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;interface ILinkModule4Note {function initializeLinkModule(uint256 characterId,uint256 noteId,bytes calldata data) external returns (bytes memory);function processLink(address caller,uint256 characterId,uint256 noteId,bytes calldata data) external;}
contracts/libraries/CharacterLogic.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import "./DataTypes.sol";import "./Events.sol";import "./Constants.sol";import "../interfaces/ILinkModule4Character.sol";import "../interfaces/ILinklist.sol";import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";library CharacterLogic {using EnumerableSet for EnumerableSet.Bytes32Set;function createCharacter(DataTypes.CreateCharacterData calldata vars,bool validateHandle,uint256 characterId,mapping(bytes32 => uint256) storage _characterIdByHandleHash,mapping(uint256 => DataTypes.Character) storage _characterById) external {if (validateHandle) {_validateHandle(vars.handle);}bytes32 handleHash = keccak256(bytes(vars.handle));require(_characterIdByHandleHash[handleHash] == 0, "HandleExists");_characterIdByHandleHash[handleHash] = characterId;_characterById[characterId].characterId = characterId;_characterById[characterId].handle = vars.handle;_characterById[characterId].uri = vars.uri;// init link moduleif (vars.linkModule != address(0)) {_characterById[characterId].linkModule = vars.linkModule;ILinkModule4Character(vars.linkModule).initializeLinkModule(characterId,vars.linkModuleInitData
contracts/libraries/DataTypes.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;library DataTypes {struct MigrateData {address account;string handle;string uri;address[] toAddresses;bytes32 linkType;}struct CreateCharacterData {address to;string handle;string uri;address linkModule;bytes linkModuleInitData;}struct createThenLinkCharacterData {uint256 fromCharacterId;address to;bytes32 linkType;}struct linkNoteData {uint256 fromCharacterId;uint256 toCharacterId;uint256 toNoteId;bytes32 linkType;bytes data;}struct unlinkNoteData {uint256 fromCharacterId;uint256 toCharacterId;uint256 toNoteId;bytes32 linkType;}
@openzeppelin/contracts/utils/Address.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)pragma solidity ^0.8.1;/*** @dev Collection of functions related to the address type*/library Address {/*** @dev Returns true if `account` is a contract.** [IMPORTANT]* ====* It is unsafe to assume that an address for which this function returns* false is an externally-owned account (EOA) and not a contract.** Among others, `isContract` will return false for the following* types of addresses:** - an externally-owned account* - a contract in construction* - an address where a contract will be created* - an address where a contract lived, but was destroyed* ====** [IMPORTANT]* ====* You shouldn't rely on `isContract` to protect against flash loan attacks!** Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract* constructor.* ====*/function isContract(address account) internal view returns (bool) {// This method relies on extcodesize/address.code.length, which returns 0// for contracts in construction, since the code is only stored at the end// of the constructor execution.return account.code.length > 0;
contracts/libraries/LinkModuleLogic.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import "./Events.sol";import "./DataTypes.sol";import "../interfaces/IMintModule4Note.sol";import "../interfaces/ILinkModule4Note.sol";import "../interfaces/ILinkModule4ERC721.sol";import "../interfaces/ILinkModule4Linklist.sol";import "../interfaces/ILinkModule4Address.sol";library LinkModuleLogic {function setLinkModule4Note(uint256 characterId,uint256 noteId,address linkModule,bytes calldata linkModuleInitData,mapping(uint256 => mapping(uint256 => DataTypes.Note)) storage _noteByIdByCharacter) external {require(!_noteByIdByCharacter[characterId][noteId].locked, "NoteLocked");if (linkModule != address(0)) {_noteByIdByCharacter[characterId][noteId].linkModule = linkModule;bytes memory returnData = ILinkModule4Note(linkModule).initializeLinkModule(characterId,noteId,linkModuleInitData);emit Events.SetLinkModule4Note(characterId,noteId,linkModule,returnData,block.timestamp);}}
contracts/libraries/OP.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;/*** @dev every uint8 stands for a single method in Web3Entry.sol.* For most cases, we recommend simply granting operators the OPERATOR_SIGN_PERMISSION_BITMAP,* which gives operator full permissions aside from owner permissions and future permissions, but for* those who're more aware of access control, the custom permission bitmap is all yours,* and you can find every customizable methods below.* `OPERATOR_SIGN_PERMISSION_BITMAP` have access to all methods in `OPERATOR_SYNC_PERMISSION_BITMAP`* plus more permissions for signing.* Permissions are laid out in a increasing order of power.* so the bitmap looks like this:* | opSync | opSign | future | owner |* |------------|------------|------------|----------|* |255------236|235------176|175-------21|20-------0|*/library OP {// [0,20] for owner permissionuint8 internal constant SET_HANDLE = 0;uint8 internal constant SET_SOCIAL_TOKEN = 1;uint8 internal constant GRANT_OPERATOR_PERMISSIONS = 2;// [21, 175] are reserved for future// [176, 235] for operator sign permissionsuint8 internal constant SET_CHARACTER_URI = 176;uint8 internal constant SET_LINK_LIST_URI = 177;uint8 internal constant LINK_CHARACTER = 178;uint8 internal constant UNLINK_CHARACTER = 179;uint8 internal constant CREATE_THEN_LINK_CHARACTER = 180;uint8 internal constant LINK_NOTE = 181;uint8 internal constant UNLINK_NOTE = 182;uint8 internal constant LINK_ERC721 = 183;uint8 internal constant UNLINK_ERC721 = 184;uint8 internal constant LINK_ADDRESS = 185;
contracts/Web3EntryBase.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import "./base/NFTBase.sol";import "./interfaces/IWeb3Entry.sol";import "./interfaces/ILinklist.sol";import "./interfaces/ILinkModule4Note.sol";import "./interfaces/IResolver.sol";import "./storage/Web3EntryStorage.sol";import "./storage/Web3EntryExtendStorage.sol";import "./libraries/DataTypes.sol";import "./libraries/Constants.sol";import "./libraries/Events.sol";import "./libraries/CharacterLogic.sol";import "./libraries/PostLogic.sol";import "./libraries/LinkModuleLogic.sol";import "./libraries/LinkLogic.sol";import "./libraries/OP.sol";import "@openzeppelin/contracts/proxy/utils/Initializable.sol";import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";contract Web3EntryBase isIWeb3Entry,NFTBase,Web3EntryStorage,Initializable,Web3EntryExtendStorage{using Strings for uint256;using EnumerableSet for EnumerableSet.Bytes32Set;using EnumerableSet for EnumerableSet.AddressSet;uint256 internal constant REVISION = 4;function initialize(string calldata _name,string calldata _symbol,address _linklistContract,address _mintNFTImpl,
@openzeppelin/contracts/utils/structs/EnumerableSet.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol)pragma solidity ^0.8.0;/*** @dev Library for managing* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive* types.** Sets have the following properties:** - Elements are added, removed, and checked for existence in constant time* (O(1)).* - Elements are enumerated in O(n). No guarantees are made on the ordering.** ```* contract Example {* // Add the library methods* using EnumerableSet for EnumerableSet.AddressSet;** // Declare a set state variable* EnumerableSet.AddressSet private mySet;* }* ```** As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)* and `uint256` (`UintSet`) are supported.** [WARNING]* ====* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable.* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.** In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet.* ====*/library EnumerableSet {// To implement this library for multiple types with as little code// repetition as possible, we write it in terms of a generic Set type with// bytes32 values.
contracts/interfaces/ILinkModule4ERC721.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;interface ILinkModule4ERC721 {function initializeLinkModule(address tokenAddress,uint256 tokenId,bytes calldata data) external returns (bytes memory);function processLink(address account,address tokenAddress,uint256 tokenId,bytes calldata data) external;}
contracts/base/ERC721.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import "@openzeppelin/contracts/token/ERC721/IERC721.sol";import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";import "@openzeppelin/contracts/utils/Address.sol";import "@openzeppelin/contracts/utils/Context.sol";import "@openzeppelin/contracts/utils/Strings.sol";import "@openzeppelin/contracts/utils/introspection/ERC165.sol";/*** @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including* the Metadata extension, but not including the Enumerable extension, which is available separately as* {ERC721Enumerable}.*/contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {using Address for address;using Strings for uint256;// Token namestring private _name;// Token symbolstring private _symbol;// Mapping from token ID to owner addressmapping(uint256 => address) private _owners;// Mapping owner address to token countmapping(address => uint256) private _balances;// Mapping from token ID to approved addressmapping(uint256 => address) private _tokenApprovals;// Mapping from owner to operator approvalsmapping(address => mapping(address => bool)) private _operatorApprovals;function __ERC721_Init(string calldata name_, string calldata symbol_) internal {_name = name_;
contracts/interfaces/IResolver.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;interface IResolver {function addENSRecords(string[] calldata labels, address[] calldata owners) external;function addRNSRecords(string[] calldata labels, address[] calldata owners) external;function deleteENSRecords(string[] calldata labels) external;function deleteRNSRecords(string[] calldata labels) external;function getENSRecord(string calldata label) external view returns (address);function getRNSRecord(string calldata label) external view returns (address);function getTotalENSCount() external view returns (uint256);function getTotalRNSCount() external view returns (uint256);}
contracts/storage/Web3EntryExtendStorage.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";contract Web3EntryExtendStorage {address internal periphery; // slot 21mapping(uint256 => address) internal _operatorByCharacter; // obsoleted slot 22address public resolver; // slot 23mapping(uint256 => EnumerableSet.AddressSet) internal _operatorsByCharacter; //slot 24}
contracts/storage/Web3EntryStorage.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import "../libraries/DataTypes.sol";contract Web3EntryStorage {// characterId => Charactermapping(uint256 => DataTypes.Character) internal _characterById;// handleHash => characterIdmapping(bytes32 => uint256) internal _characterIdByHandleHash;// address => characterIdmapping(address => uint256) internal _primaryCharacterByAddress;// characterId => (linkType => linklistId)mapping(uint256 => mapping(bytes32 => uint256)) internal _attachedLinklists;// characterId => noteId => Notemapping(uint256 => mapping(uint256 => DataTypes.Note)) internal _noteByIdByCharacter; // slot 14/////////////////////////////////// link modules/////////////////////////////////// tokenId => linkModule4Linklistmapping(uint256 => address) internal _linkModules4Linklist;// tokenAddress => tokenId => linkModule4ERC721mapping(address => mapping(uint256 => address)) internal _linkModules4ERC721;// address => linkModule4Addressmapping(address => address) internal _linkModules4Address;uint256 internal _characterCounter;// LinkList NFT token contractaddress internal _linklist;address internal MINT_NFT_IMPL;}
@openzeppelin/contracts/proxy/Clones.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (proxy/Clones.sol)pragma solidity ^0.8.0;/*** @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for* deploying minimal proxy contracts, also known as "clones".** > To simply and cheaply clone contract functionality in an immutable way, this standard specifies* > a minimal bytecode implementation that delegates all calls to a known, fixed address.** The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`* (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the* deterministic method.** _Available since v3.4._*/library Clones {/*** @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.** This function uses the create opcode, which should never revert.*/function clone(address implementation) internal returns (address instance) {/// @solidity memory-safe-assemblyassembly {let ptr := mload(0x40)mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)mstore(add(ptr, 0x14), shl(0x60, implementation))mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)instance := create(0, ptr, 0x37)}require(instance != address(0), "ERC1167: create failed");}/*** @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.** This function uses the create2 opcode and a `salt` to deterministically deploy* the clone. Using the same `implementation` and `salt` multiple time will revert, since
@openzeppelin/contracts/utils/introspection/ERC165.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)pragma solidity ^0.8.0;import "./IERC165.sol";/*** @dev Implementation of the {IERC165} interface.** Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check* for the additional interface id that will be supported. For example:** ```solidity* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);* }* ```** Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.*/abstract contract ERC165 is IERC165 {/*** @dev See {IERC165-supportsInterface}.*/function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {return interfaceId == type(IERC165).interfaceId;}}
Contract ABI
[{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"approved","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"bool","name":"approved","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"type":"uint8","name":"version","internalType":"uint8","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addOperator","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approve","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createCharacter","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.CreateCharacterData","components":[{"type":"address","name":"to","internalType":"address"},{"type":"string","name":"handle","internalType":"string"},{"type":"string","name":"uri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createThenLinkCharacter","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.createThenLinkCharacterData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deleteNote","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getApproved","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct DataTypes.Character","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"handle","internalType":"string"},{"type":"string","name":"uri","internalType":"string"},{"type":"uint256","name":"noteCount","internalType":"uint256"},{"type":"address","name":"socialToken","internalType":"address"},{"type":"address","name":"linkModule","internalType":"address"}]}],"name":"getCharacter","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct DataTypes.Character","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"handle","internalType":"string"},{"type":"string","name":"uri","internalType":"string"},{"type":"uint256","name":"noteCount","internalType":"uint256"},{"type":"address","name":"socialToken","internalType":"address"},{"type":"address","name":"linkModule","internalType":"address"}]}],"name":"getCharacterByHandle","inputs":[{"type":"string","name":"handle","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getCharacterUri","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getHandle","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getLinkModule4Address","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getLinkModule4ERC721","inputs":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getLinkModule4Linklist","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getLinklistContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getLinklistId","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getLinklistType","inputs":[{"type":"uint256","name":"linkListId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getLinklistUri","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct DataTypes.Note","components":[{"type":"bytes32","name":"linkItemType","internalType":"bytes32"},{"type":"bytes32","name":"linkKey","internalType":"bytes32"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"address","name":"mintNFT","internalType":"address"},{"type":"bool","name":"deleted","internalType":"bool"},{"type":"bool","name":"locked","internalType":"bool"}]}],"name":"getNote","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getOperatorPermissions","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getOperatorPermissions4Note","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"getOperators","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPrimaryCharacterId","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getRevision","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantOperatorPermissions","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"address","name":"operator","internalType":"address"},{"type":"uint256","name":"permissionBitMap","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantOperatorPermissions4Note","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"},{"type":"address","name":"operator","internalType":"address"},{"type":"uint256","name":"permissionBitMap","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_symbol","internalType":"string"},{"type":"address","name":"_linklistContract","internalType":"address"},{"type":"address","name":"_mintNFTImpl","internalType":"address"},{"type":"address","name":"_periphery","internalType":"address"},{"type":"address","name":"_resolver","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isApprovedForAll","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOperator","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isPrimaryCharacter","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"linkAddress","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.linkAddressData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"address","name":"ethAddress","internalType":"address"},{"type":"bytes32","name":"linkType","internalType":"bytes32"},{"type":"bytes","name":"data","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"linkAnyUri","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.linkAnyUriData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"string","name":"toUri","internalType":"string"},{"type":"bytes32","name":"linkType","internalType":"bytes32"},{"type":"bytes","name":"data","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"linkCharacter","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.linkCharacterData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"uint256","name":"toCharacterId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"},{"type":"bytes","name":"data","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"linkERC721","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.linkERC721Data","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"},{"type":"bytes","name":"data","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"linkLinklist","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.linkLinklistData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"uint256","name":"toLinkListId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"},{"type":"bytes","name":"data","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"linkNote","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.linkNoteData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"uint256","name":"toCharacterId","internalType":"uint256"},{"type":"uint256","name":"toNoteId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"},{"type":"bytes","name":"data","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"lockNote","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrateOperator","inputs":[{"type":"uint256[]","name":"characterIds","internalType":"uint256[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mintNote","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.MintNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"bytes","name":"mintModuleData","internalType":"bytes"}]}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ownerOf","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"postNote","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.PostNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"},{"type":"bool","name":"locked","internalType":"bool"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"postNote4Address","inputs":[{"type":"tuple","name":"noteData","internalType":"struct DataTypes.PostNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"},{"type":"bool","name":"locked","internalType":"bool"}]},{"type":"address","name":"ethAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"postNote4AnyUri","inputs":[{"type":"tuple","name":"postNoteData","internalType":"struct DataTypes.PostNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"},{"type":"bool","name":"locked","internalType":"bool"}]},{"type":"string","name":"uri","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"postNote4Character","inputs":[{"type":"tuple","name":"postNoteData","internalType":"struct DataTypes.PostNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"},{"type":"bool","name":"locked","internalType":"bool"}]},{"type":"uint256","name":"toCharacterId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"postNote4ERC721","inputs":[{"type":"tuple","name":"postNoteData","internalType":"struct DataTypes.PostNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"},{"type":"bool","name":"locked","internalType":"bool"}]},{"type":"tuple","name":"erc721","internalType":"struct DataTypes.ERC721Struct","components":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"erc721TokenId","internalType":"uint256"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"postNote4Linklist","inputs":[{"type":"tuple","name":"noteData","internalType":"struct DataTypes.PostNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"},{"type":"bool","name":"locked","internalType":"bool"}]},{"type":"uint256","name":"toLinklistId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"postNote4Note","inputs":[{"type":"tuple","name":"postNoteData","internalType":"struct DataTypes.PostNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"},{"type":"bool","name":"locked","internalType":"bool"}]},{"type":"tuple","name":"note","internalType":"struct DataTypes.NoteStruct","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeOperator","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"resolver","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setApprovalForAll","inputs":[{"type":"address","name":"operator","internalType":"address"},{"type":"bool","name":"approved","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCharacterUri","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"newUri","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setHandle","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"newHandle","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLinkModule4Address","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.setLinkModule4AddressData","components":[{"type":"address","name":"account","internalType":"address"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLinkModule4Linklist","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.setLinkModule4LinklistData","components":[{"type":"uint256","name":"linklistId","internalType":"uint256"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLinklistUri","inputs":[{"type":"uint256","name":"linklistId","internalType":"uint256"},{"type":"string","name":"uri","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMintModule4Note","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.setMintModule4NoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNoteUri","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"},{"type":"string","name":"newUri","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setOperator","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPrimaryCharacterId","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSocialToken","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"address","name":"tokenAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenByIndex","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenOfOwnerByIndex","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"tokenURI","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlinkAddress","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.unlinkAddressData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"address","name":"ethAddress","internalType":"address"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlinkAnyUri","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.unlinkAnyUriData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"string","name":"toUri","internalType":"string"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlinkCharacter","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.unlinkCharacterData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"uint256","name":"toCharacterId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlinkERC721","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.unlinkERC721Data","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlinkLinklist","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.unlinkLinklistData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"uint256","name":"toLinkListId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlinkNote","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.unlinkNoteData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"uint256","name":"toCharacterId","internalType":"uint256"},{"type":"uint256","name":"toNoteId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50615fb480620000216000396000f3fe608060405234801561001057600080fd5b506004361061045f5760003560e01c8063867884e61161024c578063c053f6b811610146578063e56f2fe4116100c3578063ef0828ab11610087578063ef0828ab14610ada578063f2ad807514610aed578063f316bacd14610b00578063f6479d7714610b13578063fe9299fb14610b2657600080fd5b8063e56f2fe414610a52578063e7a1c1c014610a65578063e985e9c514610a78578063ec81d19414610ab4578063ed84c34514610ac757600080fd5b8063d23b320b1161010a578063d23b320b146109ce578063d70e10c6146109e1578063dabb053114610a0c578063db491e8014610a1f578063dca2713514610a3f57600080fd5b8063c053f6b814610971578063c2a6fe3b14610982578063c87b56dd14610995578063cb8e757e146109a8578063cd69fe61146109bb57600080fd5b80639864c307116101d4578063a6e6178d11610198578063a6e6178d14610912578063a7ccb4bf14610925578063af90b11214610938578063b88d4fde1461094b578063b9d328451461095e57600080fd5b80639864c307146108a65780639a4dec18146108b95780639a50248d146108cc578063a22cb465146108ec578063a48047ba146108ff57600080fd5b806392f7070b1161021b57806392f7070b1461082f57806393f057e514610842578063952be0ef1461085557806395d89b411461088b57806395d9fa7d1461089357600080fd5b8063867884e6146107e35780638734bbfc146107f65780638b4ca06a1461080957806392ef445d1461081c57600080fd5b80632f745c591161035d57806347f94de7116102e55780636352211e116102a95780636352211e146107775780636bf55d5f1461078a57806370a08231146107aa57806374f345cf146107bd5780637d46a713146107d057600080fd5b806347f94de7146107185780634f6ccce71461072b5780635a936d101461073e5780635fb8818314610751578063628b644a1461076457600080fd5b8063388f50831161032c578063388f5083146106b957806340ad34d8146106cc57806342842e0e146106df57806342966c68146106f257806344b82a241461070557600080fd5b80632f745c591461065457806331b9d08c14610667578063327b2a031461069357806333f06ee6146106a657600080fd5b80631316529d116103eb5780632209d145116103af5780632209d1451461059257806323b872dd146105c857806329c301c2146105db5780632abc6bf6146105ee5780632d8723b81461061757600080fd5b80631316529d14610540578063144a3e831461055157806318160ddd14610564578063188b04b31461056c578063206657f21461057f57600080fd5b806308cb68ff1161043257806308cb68ff146104df578063095ea7b3146104f45780630c4dd5f2146105075780630d18d07a1461051a5780630ff982441461052d57600080fd5b806301ffc9a71461046457806304f3bcec1461048c57806306fdde03146104b7578063081812fc146104cc575b600080fd5b6104776104723660046148fe565b610b4f565b60405190151581526020015b60405180910390f35b60175461049f906001600160a01b031681565b6040516001600160a01b039091168152602001610483565b6104bf610b7a565b6040516104839190614973565b61049f6104da366004614986565b610c0c565b6104f26104ed3660046149b7565b610ca6565b005b6104f2610502366004614a10565b610d3f565b6104f26105153660046149b7565b610e55565b6104f2610528366004614a3c565b610f5f565b6104f261053b366004614a6c565b610fd5565b60045b604051908152602001610483565b6104bf61055f366004614986565b6110d6565b600854610543565b6104f261057a366004614a9a565b6110e1565b6104f261058d366004614ace565b6111e0565b61049f6105a0366004614a10565b6001600160a01b03918216600090815260106020908152604080832093835292905220541690565b6104f26105d6366004614b06565b611231565b6105436105e9366004614b48565b611262565b6105436105fc366004614b7c565b6001600160a01b03166000908152600c602052604090205490565b610543610625366004614b99565b6000928352601a602090815260408085209385529281528284206001600160a01b039290921684525290205490565b610543610662366004614a10565b611310565b61049f610675366004614b7c565b6001600160a01b039081166000908152601160205260409020541690565b6105436106a1366004614be4565b6113a6565b6104f26106b4366004614c7a565b61156b565b6104f26106c7366004614a9a565b611652565b6104f26106da366004614cc5565b6116a7565b6104f26106ed366004614b06565b611723565b6104f2610700366004614986565b61173e565b610543610713366004614ce1565b6117db565b6104f2610726366004614c7a565b611853565b610543610739366004614986565b6118ba565b6104f261074c366004614a6c565b61194d565b6104f261075f366004614a9a565b6119df565b6104f2610772366004614d25565b611a34565b61049f610785366004614986565b611ac4565b61079d610798366004614986565b611b3b565b6040516104839190614d77565b6105436107b8366004614b7c565b611b55565b6104f26107cb366004614dc4565b611bdc565b6104f26107de366004614a3c565b611c62565b6104f26107f1366004614cc5565b611cd3565b610477610804366004614986565b611d45565b610543610817366004614986565b611d73565b6104f261082a366004614de6565b611ddf565b61054361083d366004614e5a565b611ecb565b6104f2610850366004614a6c565b611f61565b610543610863366004614a3c565b60009182526019602090815260408084206001600160a01b0393909316845291905290205490565b6104bf611fd2565b6104f26108a1366004614a3c565b611fe1565b6104f26108b4366004614a9a565b61203a565b6105436108c7366004614be4565b61208f565b6108df6108da366004614ea0565b612199565b6040516104839190614ee1565b6104f26108fa366004614f6d565b612348565b61047761090d366004614a3c565b612353565b6104f2610920366004614c7a565b61238e565b610543610933366004614a9a565b61240f565b610543610946366004614ce1565b6124b3565b6104f2610959366004615084565b6124f3565b6104f261096c366004615101565b61252b565b6013546001600160a01b031661049f565b6104f2610990366004614dc4565b6125fc565b6104bf6109a3366004614986565b61267a565b6104f26109b6366004615101565b61271f565b6104f26109c9366004615101565b612791565b6104f26109dc366004614a9a565b6127a5565b6105436109ef366004614dc4565b6000918252600d6020908152604080842092845291905290205490565b6108df610a1a366004614986565b612832565b610a32610a2d366004614dc4565b6129b9565b6040516104839190615135565b6104bf610a4d366004614986565b612b1a565b6104f2610a603660046151cb565b612b8c565b6104f2610a73366004614a3c565b612d41565b610477610a86366004615285565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6104bf610ac2366004614986565b612e03565b6104f2610ad53660046152b3565b612e23565b6104f2610ae83660046149b7565b612e9f565b6104f2610afb366004614986565b612f10565b610543610b0e3660046152f2565b612f5f565b6104f2610b21366004614a6c565b6130bd565b61049f610b34366004614986565b6000908152600f60205260409020546001600160a01b031690565b60006001600160e01b0319821663780e9d6360e01b1480610b745750610b7482613103565b92915050565b606060008054610b899061534d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb59061534d565b8015610c025780601f10610bd757610100808354040283529160200191610c02565b820191906000526020600020905b815481529060010190602001808311610be557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c8a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b7390e42fe92698ff28d29ab39692518e69b85ee38863dfc34f25610ccd6020840184614b7c565b610cdd6040850160208601614b7c565b610cea6040860186615382565b60116040518663ffffffff1660e01b8152600401610d0c9594939291906153f1565b60006040518083038186803b158015610d2457600080fd5b505af4158015610d38573d6000803e3d6000fd5b5050505050565b6000610d4a82611ac4565b9050806001600160a01b0316836001600160a01b03161415610db85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c81565b336001600160a01b0382161480610dd45750610dd48133610a86565b610e465760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c81565b610e508383613153565b505050565b6013546040516367880d6160e11b8152823560048201526000916001600160a01b03169063cf101ac290602401602060405180830381865afa158015610e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec39190615430565b9050610ed08160c16131c1565b7390e42fe92698ff28d29ab39692518e69b85ee388636252159e8335610efc6040860160208701614b7c565b610f096040870187615382565b600f6040518663ffffffff1660e01b8152600401610f2b959493929190615449565b60006040518083038186803b158015610f4357600080fd5b505af4158015610f57573d6000803e3d6000fd5b505050505050565b610f688261326d565b6000828152601860205260409020610f8090826132ee565b50610f8d8282600061330a565b806001600160a01b0316827faa9506a57073a80893a2d2fdd53f4bd49d281a8548f483ad230f2d5da7f6710c42604051610fc991815260200190565b60405180910390a35050565b610fe1813560b26131c1565b6040516331a9108f60e11b815281356004820152731a1153e8d53612cba1c4c98037fa4d680bb9894390633019fadd9083903090636352211e90602401602060405180830381865afa15801561103b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105f9190615474565b60135485356000908152600d60209081526040808320818a0135845282529182902054825160e088901b6001600160e01b031916815286356004820152918601356024830152949091013560448201526001600160a01b0392831660648201529116608482015260a481019190915260c401610d0c565b6060610b748261267a565b6110ed813560b26131c1565b6110fa8160200135613369565b731a1153e8d53612cba1c4c98037fa4d680bb9894363957f8a9882356020840135604085013561112d6060870187615382565b6040516331a9108f60e11b8152883560048201523090636352211e90602401602060405180830381865afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d9190615474565b6013546020808b01356000908152600a9091526040908190206005015490516001600160e01b031960e08b901b168152610d0c989796959493926001600160a01b03908116921690600d90600401615491565b6111e98361326d565b8061120c57600083815260186020526040902061120690836132ee565b50611226565b600083815260186020526040902061122490836133c2565b505b610e5083838361330a565b61123b33826133d7565b6112575760405162461bcd60e51b8152600401610c81906154eb565b610e508383836134ca565b6000611270823560ec6131c1565b81356000908152600a602052604081206003018054829061129090615552565b91829055506040516342a34a5360e01b815290915073ab40a9c08d412fc21e02fb92c4298f001ecc0fd7906342a34a53906112d990869085906000908190600e90600401615677565b60006040518083038186803b1580156112f157600080fd5b505af4158015611305573d6000803e3d6000fd5b509295945050505050565b600061131b83611b55565b821061137d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c81565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60006113b4833560ca6131c1565b6113ce6113c46020840184614b7c565b8360200135613671565b6013546545524337323160d01b906000906001600160a01b0316632ea24efc826113fb6020880188614b7c565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152602087013560448201526064016020604051808303816000875af1158015611451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114759190615430565b85356000908152600a6020526040812060030180549293509091829061149a90615552565b9182905550905073ab40a9c08d412fc21e02fb92c4298f001ecc0fd76342a34a53878386866114cc60208c018c614b7c565b8b602001356040516020016114ff92919060609290921b6bffffffffffffffffffffffff19168252601482015260340190565b604051602081830303815290604052600e6040518763ffffffff1660e01b8152600401611531969594939291906156bc565b60006040518083038186803b15801561154957600080fd5b505af415801561155d573d6000803e3d6000fd5b509298975050505050505050565b6013546040516367880d6160e11b8152600481018590526000916001600160a01b03169063cf101ac290602401602060405180830381865afa1580156115b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d99190615430565b90506115e68160b16131c1565b601354604051633c17845760e11b81526001600160a01b039091169063782f08ae9061161a90879087908790600401615707565b600060405180830381600087803b15801561163457600080fd5b505af1158015611648573d6000803e3d6000fd5b5050505050505050565b61165e813560b96131c1565b60135460405163e4bb4f2360e01b8152731a1153e8d53612cba1c4c98037fa4d680bb989439163e4bb4f2391610d0c9185916001600160a01b0390911690600d9060040161572a565b6116b3813560b66131c1565b60135460408051635cebf08d60e11b81528335600482015260208401356024820152908301356044820152606083013560648201526001600160a01b039091166084820152600d60a4820152731a1153e8d53612cba1c4c98037fa4d680bb989439063b9d7e11a9060c401610d0c565b610e50838383604051806020016040528060008152506124f3565b6000818152600a6020526040808220905161175c9160010190615798565b60408051918290039091206000818152600b6020908152838220829055858252600a90529182208281559092509061179760018301826147cd565b6117a56002830160006147cd565b50600060038201556004810180546001600160a01b03199081169091556005909101805490911690556117d782613721565b5050565b60006117e9833560c86131c1565b82356000908152600a60205260408120600301805467131a5b9adb1a5cdd60c21b9285929091829061181a90615552565b919050819055905073ab40a9c08d412fc21e02fb92c4298f001ecc0fd76342a34a53878386868a6040516020016114ff91815260200190565b61185e8360b06131c1565b6000838152600a6020526040902061187a906002018383614807565b50827f17d7c9f69270ba135480ef16837f38b9d37d3ab291cbd3ba03982290c663199783836040516118ad929190615834565b60405180910390a2505050565b60006118c560085490565b82106119285760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c81565b6008828154811061193b5761193b615848565b90600052602060002001549050919050565b611959813560be6131c1565b60135481356000818152600d60209081526040808320818701358085529083529281902054905163d862986560e01b8152600481019490945290850135602484015260448301919091526001600160a01b0390921660648201526084810191909152731a1153e8d53612cba1c4c98037fa4d680bb989439063d86298659060a401610d0c565b6119eb813560bb6131c1565b6013546040516332f107bf60e01b8152731a1153e8d53612cba1c4c98037fa4d680bb98943916332f107bf91610d0c9185916001600160a01b0390911690600d9060040161585e565b611a3f8460c36131c1565b611a4b84846002613780565b611a558484613867565b6040516001626802bf60e01b0319815273ab40a9c08d412fc21e02fb92c4298f001ecc0fd79063ff97fd4190611a98908790879087908790600e906004016158db565b60006040518083038186803b158015611ab057600080fd5b505af4158015611648573d6000803e3d6000fd5b6000818152600260205260408120546001600160a01b031680610b745760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c81565b6000818152601860205260409020606090610b749061391c565b60006001600160a01b038216611bc05760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c81565b506001600160a01b031660009081526003602052604090205490565b611be78260c46131c1565b611bf382826003613780565b611bfd8282613867565b6000828152600e60209081526040808320848452825291829020600501805460ff60a81b1916600160a81b179055905182815283917f036469f3e73c83520cdefa197d7a9c854c2f8bc0164b82e9f2bd4aa7e150fd3091015b60405180910390a25050565b611c6b8261326d565b6000828152601860205260409020611c8390826133c2565b50611c9782826001600160b01b031961330a565b806001600160a01b0316827f58f51b5bb567864de85c6a422b33491f2418924a44613d7b9341f58657bdd83342604051610fc991815260200190565b611cdf813560b86131c1565b60135481356000908152600d6020908152604080832060608601358452909152908190205490516317e9a8b160e31b8152731a1153e8d53612cba1c4c98037fa4d680bb989439263bf4d458892610d0c9286926001600160a01b031691906004016158fb565b600080611d5183611ac4565b6001600160a01b03166000908152600c60205260409020549290921492915050565b60135460405162fba02760e01b8152600481018390526000916001600160a01b03169062fba02790602401602060405180830381865afa158015611dbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b749190615430565b60005b81811015610e50576000838383818110611dfe57611dfe615848565b6020908102929092013560008181526016909352604090922054919250506001600160a01b03168015611e57576000828152601860205260409020611e4390826133c2565b50611e5782826001600160b01b031961330a565b6000828152601860205260408120611e6e9061391c565b905060005b8151811015611eb657611ea684838381518110611e9257611e92615848565b602002602001015160b0600019901b61330a565b611eaf81615552565b9050611e73565b5050505080611ec490615552565b9050611de2565b6000611ed9833560c76131c1565b82356000908152600a602052604081206003018054664164647265737360c81b926001600160a01b0386169290918290611f1290615552565b919050819055905073ab40a9c08d412fc21e02fb92c4298f001ecc0fd76342a34a53878386868a6040516020016114ff919060609190911b6bffffffffffffffffffffffff1916815260140190565b611f6d813560ba6131c1565b60135481356000908152600d6020908152604080832081860135845290915290819020549051633d7f9b3d60e11b8152731a1153e8d53612cba1c4c98037fa4d680bb9894392637aff367a92610d0c9286926001600160a01b0316919060040161594d565b606060018054610b899061534d565b611fec8260016131c1565b6040516384b44a2f60e01b8152600481018390526001600160a01b0382166024820152600a604482015273dce79680d403e5d0a0d9e99d9ee4bfc8b21c8f4a906384b44a2f90606401610f2b565b612046813560bd6131c1565b601354604051635fe5df1d60e11b8152731a1153e8d53612cba1c4c98037fa4d680bb989439163bfcbbe3a91610d0c9185916001600160a01b0390911690600d90600401615995565b600061209d833560c96131c1565b601354604051635cb46be760e01b81526000600482018190528435602483015260208501356044830152634e6f746560e01b9290916001600160a01b0390911690635cb46be7906064016020604051808303816000875af1158015612106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212a9190615430565b85356000908152600a6020526040812060030180549293509091829061214f90615552565b919050819055905073ab40a9c08d412fc21e02fb92c4298f001ecc0fd76342a34a53878386868a600001358b602001356040516020016114ff929190918252602082015260400190565b6121a161488b565b600083836040516121b39291906159f5565b604080519182900382206000818152600b602090815283822054808352600a82529184902060c08601909452835485526001840180549396509194939290840191906121fe9061534d565b80601f016020809104026020016040519081016040528092919081815260200182805461222a9061534d565b80156122775780601f1061224c57610100808354040283529160200191612277565b820191906000526020600020905b81548152906001019060200180831161225a57829003601f168201915b505050505081526020016002820180546122909061534d565b80601f01602080910402602001604051908101604052809291908181526020018280546122bc9061534d565b80156123095780601f106122de57610100808354040283529160200191612309565b820191906000526020600020905b8154815290600101906020018083116122ec57829003601f168201915b50505091835250506003820154602082015260048201546001600160a01b03908116604083015260059092015490911660609091015295945050505050565b6117d7338383613929565b60008281526019602090815260408083206001600160a01b03851684529091528120548015612383576001612386565b60005b949350505050565b6123998360006131c1565b60405163130f361d60e01b815273dce79680d403e5d0a0d9e99d9ee4bfc8b21c8f4a9063130f361d906123da90869086908690600b90600a90600401615a05565b60006040518083038186803b1580156123f257600080fd5b505af4158015612406573d6000803e3d6000fd5b50505050505050565b600061242082356020840135613867565b73ab40a9c08d412fc21e02fb92c4298f001ecc0fd7635be69415833560208501356124516060870160408801614b7c565b61245e6060880188615382565b6014546040516001600160e01b031960e089901b1681526124969695949392916001600160a01b031690600a90600e90600401615a33565b602060405180830381865af4158015611dbb573d6000803e3d6000fd5b60006124c1833560c66131c1565b82356000908152600a6020526040812060030180546821b430b930b1ba32b960b91b9285929091829061181a90615552565b6124fd33836133d7565b6125195760405162461bcd60e51b8152600401610c81906154eb565b612525848484846139f0565b50505050565b612537813560b56131c1565b61254981602001358260400135613867565b6040516331a9108f60e11b815281356004820152731a1153e8d53612cba1c4c98037fa4d680bb989439063018212d19083903090636352211e90602401602060405180830381865afa1580156125a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c79190615474565b6013546040516001600160e01b031960e086901b168152610d0c9392916001600160a01b031690600e90600d90600401615a81565b6126078260c56131c1565b61261382826004613780565b61261d8282613867565b6000828152600e60209081526040808320848452825291829020600501805460ff60a01b1916600160a01b179055905182815283917f4f1db9708b537c1d26a7af4b235fd079bf2342d92a276e27eb6c8717e8bbcf939101611c56565b6000818152600a6020526040902060020180546060919061269a9061534d565b80601f01602080910402602001604051908101604052809291908181526020018280546126c69061534d565b80156127135780601f106126e857610100808354040283529160200191612713565b820191906000526020600020905b8154815290600101906020018083116126f657829003601f168201915b50505050509050919050565b61272b813560b76131c1565b61274861273e6040830160208401614b7c565b8260400135613671565b601354604051638f3334ff60e01b8152731a1153e8d53612cba1c4c98037fa4d680bb9894391638f3334ff91610d0c9185916001600160a01b0390911690600d90600401615b00565b6127a261279d82615b63565b613a23565b50565b6127b1813560c26131c1565b6127c2813560208301356001613780565b6127d181356020830135613867565b7390e42fe92698ff28d29ab39692518e69b85ee3886320828a02823560208401356128026060860160408701614b7c565b61280f6060870187615382565b600e6040518763ffffffff1660e01b8152600401610d0c96959493929190615c16565b61283a61488b565b600a60008381526020019081526020016000206040518060c0016040529081600082015481526020016001820180546128729061534d565b80601f016020809104026020016040519081016040528092919081815260200182805461289e9061534d565b80156128eb5780601f106128c0576101008083540402835291602001916128eb565b820191906000526020600020905b8154815290600101906020018083116128ce57829003601f168201915b505050505081526020016002820180546129049061534d565b80601f01602080910402602001604051908101604052809291908181526020018280546129309061534d565b801561297d5780601f106129525761010080835404028352916020019161297d565b820191906000526020600020905b81548152906001019060200180831161296057829003601f168201915b50505091835250506003820154602082015260048201546001600160a01b03908116604083015260059092015490911660609091015292915050565b60408051610100808201835260008083526020808401829052606084860181905284018290526080840182905260a0840182905260c0840182905260e08401829052868252600e81528482208683528152908490208451928301855280548352600181015491830191909152600281018054939492939192840191612a3d9061534d565b80601f0160208091040260200160405190810160405280929190818152602001828054612a699061534d565b8015612ab65780601f10612a8b57610100808354040283529160200191612ab6565b820191906000526020600020905b815481529060010190602001808311612a9957829003601f168201915b505050918352505060038201546001600160a01b039081166020830152600483015481166040830152600590920154918216606082015260ff600160a01b8304811615156080830152600160a81b909204909116151560a090910152905092915050565b601354604051632b05429560e21b8152600481018390526060916001600160a01b03169063ac150a5490602401600060405180830381865afa158015612b64573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b749190810190615c57565b601454600160a81b900460ff1615808015612bb457506014546001600160a01b90910460ff16105b80612bd55750303b158015612bd55750601454600160a01b900460ff166001145b612c385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610c81565b6014805460ff60a01b1916600160a01b1790558015612c65576014805460ff60a81b1916600160a81b1790555b612c7189898989613af8565b601380546001600160a01b03199081166001600160a01b0388811691909117909255601480548216878416179055601580548216868416179055601780549091169184169190911790556040514281527f400175a56dd3710794078f7b9dbe8296ac94c5a248dfd51bb22ed4ab9eaa9fbf9060200160405180910390a18015612d36576014805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b612d4a8261326d565b6001600160a01b038116612d9b5760008281526016602090815260408083205460189092529091206001600160a01b0390911690612d8890826132ee565b50612d958382600061330a565b50612dc7565b6000828152601860205260409020612db390826133c2565b50612dc782826001600160b01b031961330a565b806001600160a01b0316827f691b92a93c526c4f5a357e56a33c33f6250f94e19e6c49be805800615c41493142604051610fc991815260200190565b6000818152600a6020526040902060010180546060919061269a9061534d565b612e2c8461326d565b612e368484613867565b6000848152601a6020908152604080832086845282528083206001600160a01b0386168085529083529281902084905551838152859187917f488a41148fb8f04fec9e8e1f936444b9b70c0f084a5242092d8b4b01f6163d80910160405180910390a450505050565b612eab813560bc6131c1565b60135481356000908152600d602090815260408083208186013584529091529081902054905163bf5c00c160e01b8152731a1153e8d53612cba1c4c98037fa4d680bb989439263bf5c00c192610d0c9286926001600160a01b03169190600401615cc4565b612f198161326d565b336000818152600c602052604080822080549085905590519092839285927fce95332e6082aebeb8058a7b56d1a109f67d6550552ed04d36aca4a6acd4d7de9190a45050565b6000612f6d843560cb6131c1565b601354604051633610bf0960e11b815265416e7955726960d01b916000916001600160a01b0390911690636c217e1290612faf90849089908990600401615707565b6020604051808303816000875af1158015612fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff29190615430565b86356000908152600a6020526040812060030180549293509091829061301790615552565b919050819055905073ab40a9c08d412fc21e02fb92c4298f001ecc0fd76342a34a53888386868b8b6040516020016130509291906159f5565b604051602081830303815290604052600e6040518763ffffffff1660e01b8152600401613082969594939291906156bc565b60006040518083038186803b15801561309a57600080fd5b505af41580156130ae573d6000803e3d6000fd5b50929998505050505050505050565b6130c9813560b46131c1565b6127a281356130de6040840160208501614b7c565b836040013560405180604001604052806002815260200161060f60f31b815250613b49565b60006001600160e01b031982166380ac58cd60e01b148061313457506001600160e01b03198216635b5e139f60e01b145b80610b7457506301ffc9a760e01b6001600160e01b0319831614610b74565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061318882611ac4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006131cc83611ac4565b9050336001600160a01b03821614806132025750326001600160a01b03821614801561320257506015546001600160a01b031633145b8061322b57506000838152601960209081526040808320338452909152902054600190831c8116145b610e505760405162461bcd60e51b81526020600482015260136024820152722737ba22b737bab3b42832b936b4b9b9b4b7b760691b6044820152606401610c81565b600061327882611ac4565b9050336001600160a01b03821614806132ae5750326001600160a01b0382161480156132ae57506015546001600160a01b031633145b6117d75760405162461bcd60e51b81526020600482015260116024820152702737ba21b430b930b1ba32b927bbb732b960791b6044820152606401610c81565b6000613303836001600160a01b038416613dc6565b9392505050565b60008381526019602090815260408083206001600160a01b038616808552908352928190208490555183815285917f4b0dcce4c30a5691ff14b7d4a8a27e2738b66289dc90120ebbc092812941bd2791015b60405180910390a3505050565b6000818152600260205260409020546001600160a01b03166127a25760405162461bcd60e51b81526020600482015260126024820152714368617261637465724e6f7445786973747360701b6044820152606401610c81565b6000613303836001600160a01b038416613eb9565b6000818152600260205260408120546001600160a01b03166134505760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c81565b600061345b83611ac4565b9050806001600160a01b0316846001600160a01b031614806134965750836001600160a01b031661348b84610c0c565b6001600160a01b0316145b8061238657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16612386565b826001600160a01b03166134dd82611ac4565b6001600160a01b0316146135415760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610c81565b6001600160a01b0382166135a35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c81565b6135ae838383613f08565b6135b9600082613153565b6001600160a01b03831660009081526003602052604081208054600192906135e2908490615d1c565b90915550506001600160a01b0382166000908152600360205260408120805460019290613610908490615d33565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6040516331a9108f60e11b8152600481018290526001600160a01b03831690636352211e90602401602060405180830381865afa1580156136b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136da9190615474565b6001600160a01b03166117d75760405162461bcd60e51b815260206004820152600f60248201526e5245433732314e6f7445786973747360881b6044820152606401610c81565b61372b33826133d7565b6137775760405162461bcd60e51b815260206004820152601b60248201527f4e4654426173653a204e6f744f776e65724f72417070726f76656400000000006044820152606401610c81565b6127a28161402c565b600061378b84611ac4565b9050336001600160a01b03821614806137c15750326001600160a01b0382161480156137c157506015546001600160a01b031633145b8061381b57506000848152601a602090815260408083208684528252808320338452909152902054600190831c8116148061381b57506000848152601a602090815260408083208684528252808320338452909152902054155b6125255760405162461bcd60e51b815260206004820152601e60248201527f4e6f74456e6f7567685065726d697373696f6e466f72546869734e6f746500006044820152606401610c81565b6000828152600e60209081526040808320848452909152902060050154600160a01b900460ff16156138cb5760405162461bcd60e51b815260206004820152600d60248201526c139bdd19525cd1195b195d1959609a1b6044820152606401610c81565b6000828152600a60205260409020600301548111156117d75760405162461bcd60e51b815260206004820152600d60248201526c4e6f74654e6f7445786973747360981b6044820152606401610c81565b60606000613303836140d3565b816001600160a01b0316836001600160a01b0316141561398b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c81565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910161335c565b6139fb8484846134ca565b613a078484848461412e565b6125255760405162461bcd60e51b8152600401610c8190615d4b565b6000601260008154613a3490615552565b91829055508251909150613a48908261422c565b604051632902741560e01b815273dce79680d403e5d0a0d9e99d9ee4bfc8b21c8f4a90632902741590613a8a9085906001908690600b90600a90600401615d9d565b60006040518083038186803b158015613aa257600080fd5b505af4158015613ab6573d6000803e3d6000fd5b505083516001600160a01b03166000908152600c6020526040902054151591506117d790505790516001600160a01b03166000908152600c6020526040902055565b613b0484848484614246565b7f414cd0b34676984f09a5f76ce9718d4062e50283abe0e7e274a9a5b4e0c99c308484848442604051613b3b959493929190615e46565b60405180910390a150505050565b6001600160a01b0383166000908152600c602052604090205415613bc55760405162461bcd60e51b815260206004820152602d60248201527f546172676574206164647265737320616c726561647920686173207072696d6160448201526c393c9031b430b930b1ba32b91760991b6064820152608401610c81565b6000601260008154613bd690615552565b91829055509050613be7848261422c565b73dce79680d403e5d0a0d9e99d9ee4bfc8b21c8f4a63290274156040518060a00160405280876001600160a01b03168152602001613c2f886001600160a01b0316601461425f565b815260200160405180602001604052806000815250815260200160006001600160a01b0316815260200160405180602001604052806000815250815250600084600b600a6040518663ffffffff1660e01b8152600401613c93959493929190615d9d565b60006040518083038186803b158015613cab57600080fd5b505af4158015613cbf573d6000803e3d6000fd5b505050506001600160a01b0384166000908152600c602052604090819020829055516331a9108f60e11b815260048101869052731a1153e8d53612cba1c4c98037fa4d680bb989439063957f8a989087908490879087903090636352211e90602401602060405180830381865afa158015613d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d629190615474565b6013546040516001600160e01b031960e089901b168152613d9a9695949392916001600160a01b031690600090600d90600401615e80565b60006040518083038186803b158015613db257600080fd5b505af4158015612d36573d6000803e3d6000fd5b60008181526001830160205260408120548015613eaf576000613dea600183615d1c565b8554909150600090613dfe90600190615d1c565b9050818114613e63576000866000018281548110613e1e57613e1e615848565b9060005260206000200154905080876000018481548110613e4157613e41615848565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613e7457613e74615ed8565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610b74565b6000915050610b74565b6000818152600183016020526040812054613f0057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b74565b506000610b74565b6000818152601860205260408120613f1f906143fa565b600083815260186020526040812091925090613f3a9061391c565b905060005b82811015613fe857600084815260196020526040812083518290859085908110613f6b57613f6b615848565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550613fd5828281518110613fac57613fac615848565b6020026020010151601860008781526020019081526020016000206132ee90919063ffffffff16565b5080613fe081615552565b915050613f3f565b506001600160a01b0385166000908152600c602052604090205415614021576001600160a01b0385166000908152600c60205260408120555b610d38858585614404565b600061403782611ac4565b905061404581600084613f08565b614050600083613153565b6001600160a01b0381166000908152600360205260408120805460019290614079908490615d1c565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561271357602002820191906000526020600020905b81548152602001906001019080831161410f5750505050509050919050565b60006001600160a01b0384163b1561422157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614172903390899088908890600401615eee565b6020604051808303816000875af19250505080156141ad575060408051601f3d908101601f191682019092526141aa91810190615f2b565b60015b614207573d8080156141db576040519150601f19603f3d011682016040523d82523d6000602084013e6141e0565b606091505b5080516141ff5760405162461bcd60e51b8152600401610c8190615d4b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612386565b506001949350505050565b6117d78282604051806020016040528060008152506144bc565b61425260008585614807565b50610d3860018383614807565b6060600061426e836002615f48565b614279906002615d33565b6001600160401b0381111561429057614290614f99565b6040519080825280601f01601f1916602001820160405280156142ba576020820181803683370190505b509050600360fc1b816000815181106142d5576142d5615848565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061430457614304615848565b60200101906001600160f81b031916908160001a9053506000614328846002615f48565b614333906001615d33565b90505b60018111156143ab576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061436757614367615848565b1a60f81b82828151811061437d5761437d615848565b60200101906001600160f81b031916908160001a90535060049490941c936143a481615f67565b9050614336565b5083156133035760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610c81565b6000610b74825490565b6001600160a01b03831661445f5761445a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614482565b816001600160a01b0316836001600160a01b0316146144825761448283826144ef565b6001600160a01b03821661449957610e508161458c565b826001600160a01b0316826001600160a01b031614610e5057610e50828261463b565b6144c6838361467f565b6144d3600084848461412e565b610e505760405162461bcd60e51b8152600401610c8190615d4b565b600060016144fc84611b55565b6145069190615d1c565b600083815260076020526040902054909150808214614559576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061459e90600190615d1c565b600083815260096020526040812054600880549394509092849081106145c6576145c6615848565b9060005260206000200154905080600883815481106145e7576145e7615848565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061461f5761461f615ed8565b6001900381819060005260206000200160009055905550505050565b600061464683611b55565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166146d55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c81565b6000818152600260205260409020546001600160a01b03161561473a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c81565b61474660008383613f08565b6001600160a01b038216600090815260036020526040812080546001929061476f908490615d33565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5080546147d99061534d565b6000825580601f106147e9575050565b601f0160209004906000526020600020908101906127a291906148d3565b8280546148139061534d565b90600052602060002090601f016020900481019282614835576000855561487b565b82601f1061484e5782800160ff1982351617855561487b565b8280016001018555821561487b579182015b8281111561487b578235825591602001919060010190614860565b506148879291506148d3565b5090565b6040518060c001604052806000815260200160608152602001606081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b5b8082111561488757600081556001016148d4565b6001600160e01b0319811681146127a257600080fd5b60006020828403121561491057600080fd5b8135613303816148e8565b60005b8381101561493657818101518382015260200161491e565b838111156125255750506000910152565b6000815180845261495f81602086016020860161491b565b601f01601f19169290920160200192915050565b6020815260006133036020830184614947565b60006020828403121561499857600080fd5b5035919050565b6000606082840312156149b157600080fd5b50919050565b6000602082840312156149c957600080fd5b81356001600160401b038111156149df57600080fd5b6123868482850161499f565b6001600160a01b03811681146127a257600080fd5b8035614a0b816149eb565b919050565b60008060408385031215614a2357600080fd5b8235614a2e816149eb565b946020939093013593505050565b60008060408385031215614a4f57600080fd5b823591506020830135614a61816149eb565b809150509250929050565b600060608284031215614a7e57600080fd5b613303838361499f565b6000608082840312156149b157600080fd5b600060208284031215614aac57600080fd5b81356001600160401b03811115614ac257600080fd5b61238684828501614a88565b600080600060608486031215614ae357600080fd5b833592506020840135614af5816149eb565b929592945050506040919091013590565b600080600060608486031215614b1b57600080fd5b8335614b26816149eb565b92506020840135614af5816149eb565b600060e082840312156149b157600080fd5b600060208284031215614b5a57600080fd5b81356001600160401b03811115614b7057600080fd5b61238684828501614b36565b600060208284031215614b8e57600080fd5b8135613303816149eb565b600080600060608486031215614bae57600080fd5b83359250602084013591506040840135614bc7816149eb565b809150509250925092565b6000604082840312156149b157600080fd5b60008060608385031215614bf757600080fd5b82356001600160401b03811115614c0d57600080fd5b614c1985828601614b36565b925050614c298460208501614bd2565b90509250929050565b60008083601f840112614c4457600080fd5b5081356001600160401b03811115614c5b57600080fd5b602083019150836020828501011115614c7357600080fd5b9250929050565b600080600060408486031215614c8f57600080fd5b8335925060208401356001600160401b03811115614cac57600080fd5b614cb886828701614c32565b9497909650939450505050565b600060808284031215614cd757600080fd5b6133038383614a88565b60008060408385031215614cf457600080fd5b82356001600160401b03811115614d0a57600080fd5b614d1685828601614b36565b95602094909401359450505050565b60008060008060608587031215614d3b57600080fd5b843593506020850135925060408501356001600160401b03811115614d5f57600080fd5b614d6b87828801614c32565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015614db85783516001600160a01b031683529284019291840191600101614d93565b50909695505050505050565b60008060408385031215614dd757600080fd5b50508035926020909101359150565b60008060208385031215614df957600080fd5b82356001600160401b0380821115614e1057600080fd5b818501915085601f830112614e2457600080fd5b813581811115614e3357600080fd5b8660208260051b8501011115614e4857600080fd5b60209290920196919550909350505050565b60008060408385031215614e6d57600080fd5b82356001600160401b03811115614e8357600080fd5b614e8f85828601614b36565b9250506020830135614a61816149eb565b60008060208385031215614eb357600080fd5b82356001600160401b03811115614ec957600080fd5b614ed585828601614c32565b90969095509350505050565b60208152815160208201526000602083015160c06040840152614f0760e0840182614947565b90506040840151601f19848303016060850152614f248282614947565b91505060608401516080840152608084015160018060a01b0380821660a08601528060a08701511660c086015250508091505092915050565b80358015158114614a0b57600080fd5b60008060408385031215614f8057600080fd5b8235614f8b816149eb565b9150614c2960208401614f5d565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b0381118282101715614fd157614fd1614f99565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614fff57614fff614f99565b604052919050565b60006001600160401b0382111561502057615020614f99565b50601f01601f191660200190565b600082601f83011261503f57600080fd5b813561505261504d82615007565b614fd7565b81815284602083860101111561506757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561509a57600080fd5b84356150a5816149eb565b935060208501356150b5816149eb565b92506040850135915060608501356001600160401b038111156150d757600080fd5b6150e38782880161502e565b91505092959194509250565b600060a082840312156149b157600080fd5b60006020828403121561511357600080fd5b81356001600160401b0381111561512957600080fd5b612386848285016150ef565b60208152815160208201526020820151604082015260006040830151610100806060850152615168610120850183614947565b9150606085015160018060a01b0380821660808701528060808801511660a0870152505060a08501516151a660c08601826001600160a01b03169052565b5060c085015180151560e08601525060e0850151801515858301525090949350505050565b60008060008060008060008060c0898b0312156151e757600080fd5b88356001600160401b03808211156151fe57600080fd5b61520a8c838d01614c32565b909a50985060208b013591508082111561522357600080fd5b506152308b828c01614c32565b9097509550506040890135615244816149eb565b93506060890135615254816149eb565b92506080890135615264816149eb565b915060a0890135615274816149eb565b809150509295985092959890939650565b6000806040838503121561529857600080fd5b82356152a3816149eb565b91506020830135614a61816149eb565b600080600080608085870312156152c957600080fd5b843593506020850135925060408501356152e2816149eb565b9396929550929360600135925050565b60008060006040848603121561530757600080fd5b83356001600160401b038082111561531e57600080fd5b61532a87838801614b36565b9450602086013591508082111561534057600080fd5b50614cb886828701614c32565b600181811c9082168061536157607f821691505b602082108114156149b157634e487b7160e01b600052602260045260246000fd5b6000808335601e1984360301811261539957600080fd5b8301803591506001600160401b038211156153b357600080fd5b602001915036819003821315614c7357600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0386811682528516602082015260806040820181905260009061541e90830185876153c8565b90508260608301529695505050505050565b60006020828403121561544257600080fd5b5051919050565b8581526001600160a01b038516602082015260806040820181905260009061541e90830185876153c8565b60006020828403121561548657600080fd5b8151613303816149eb565b60006101008b83528a60208401528960408401528060608401526154b8818401898b6153c8565b6001600160a01b03978816608085015295871660a084015250509190931660c082015260e0019190915295945050505050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156155665761556661553c565b5060010190565b6000808335601e1984360301811261558457600080fd5b83016020810192503590506001600160401b038111156155a357600080fd5b803603831315614c7357600080fd5b8035825260006155c5602083018361556d565b60e060208601526155da60e0860182846153c8565b91505060408301356155eb816149eb565b6001600160a01b038181166040870152615608606086018661556d565b9250868403606088015261561d8484836153c8565b93505060808501359150615630826149eb565b16608085015261564360a084018461556d565b85830360a08701526156568382846153c8565b9250505061566660c08401614f5d565b151560c08501528091505092915050565b60c08152600061568a60c08301886155b2565b602083810197909752604083019590955250606081019290925281830360808301526000835260a09091015201919050565b60c0815260006156cf60c08301896155b2565b87602084015286604084015285606084015282810360808401526156f38186614947565b9150508260a0830152979650505050505050565b8381526040602082015260006157216040830184866153c8565b95945050505050565b606081528335606082015260006020850135615745816149eb565b6001600160a01b038181166080850152604087013560a085015261576c606088018861556d565b9250608060c086015261578360e0860184836153c8565b96909116602085015250505060400152919050565b600080835481600182811c9150808316806157b457607f831692505b60208084108214156157d457634e487b7160e01b86526022600452602486fd5b8180156157e857600181146157f957615826565b60ff19861689528489019650615826565b60008a81526020902060005b8681101561581e5781548b820152908501908301615805565b505084890196505b509498975050505050505050565b6020815260006123866020830184866153c8565b634e487b7160e01b600052603260045260246000fd5b60608152833560608201526000615878602086018661556d565b60808085015261588c60e0850182846153c8565b915050604086013560a08401526158a6606087018761556d565b848303605f190160c08601526158bd8382846153c8565b6001600160a01b039790971660208601525050505060400152919050565b85815284602082015260806040820152600061541e6080830185876153c8565b8335815260c081016020850135615911816149eb565b6001600160a01b039081166020840152604086810135908401526060958601359583019590955292909316608084015260a09092019190915290565b8335815260a081016020850135615963816149eb565b6001600160a01b0390811660208401526040958601359583019590955292909316606084015260809092019190915290565b606081528335606082015260208401356080820152604084013560a082015260006159c3606086018661556d565b608060c08501526159d860e0850182846153c8565b6001600160a01b0396909616602085015250505060400152919050565b8183823760009101908152919050565b858152608060208201526000615a1f6080830186886153c8565b604083019490945250606001529392505050565b888152876020820152600060018060a01b03808916604084015260e06060840152615a6260e08401888a6153c8565b951660808301525060a081019290925260c09091015295945050505050565b60a08152853560a0820152602086013560c0820152604086013560e082015260608601356101008201526000615aba608088018861556d565b60a0610120850152615ad1610140850182846153c8565b6001600160a01b0398891660208601529690971660408401525050606081019290925260809091015292915050565b606081528335606082015260006020850135615b1b816149eb565b60018060a01b038082166080850152604087013560a0850152606087013560c0850152615b4b608088018861556d565b925060a060e0860152615783610100860184836153c8565b600060a08236031215615b7557600080fd5b615b7d614faf565b615b8683614a00565b815260208301356001600160401b0380821115615ba257600080fd5b615bae3683870161502e565b60208401526040850135915080821115615bc757600080fd5b615bd33683870161502e565b6040840152615be460608601614a00565b60608401526080850135915080821115615bfd57600080fd5b50615c0a3682860161502e565b60808301525092915050565b86815285602082015260018060a01b038516604082015260a060608201526000615c4460a0830185876153c8565b9050826080830152979650505050505050565b600060208284031215615c6957600080fd5b81516001600160401b03811115615c7f57600080fd5b8201601f81018413615c9057600080fd5b8051615c9e61504d82615007565b818152856020838501011115615cb357600080fd5b61572182602083016020860161491b565b60608152833560608201526000615cde602086018661556d565b60606080850152615cf360c0850182846153c8565b60409788013560a08601526001600160a01b039690961660208501525050509092019190915290565b600082821015615d2e57615d2e61553c565b500390565b60008219821115615d4657615d4661553c565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60a08152600060018060a01b038088511660a0840152602088015160a060c0850152615dcd610140850182614947565b90506040890151609f19808684030160e0870152615deb8383614947565b92508360608c01511661010087015260808b0151935080868403016101208701525050615e188183614947565b92505050615e2a602083018715159052565b8460408301528360608301528260808301529695505050505050565b606081526000615e5a6060830187896153c8565b8281036020840152615e6d8186886153c8565b9150508260408301529695505050505050565b60006101008a8352896020840152886040840152806060840152615ea681840189614947565b6001600160a01b03978816608085015295871660a084015250509190931660c082015260e00191909152949350505050565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615f2190830184614947565b9695505050505050565b600060208284031215615f3d57600080fd5b8151613303816148e8565b6000816000190483118215151615615f6257615f6261553c565b500290565b600081615f7657615f7661553c565b50600019019056fea26469706673582212201040f63ce737d60f661965b4af9d1ba47eee41d92dbdaad28114f3f8b9e5d1be64736f6c634300080a0033
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061045f5760003560e01c8063867884e61161024c578063c053f6b811610146578063e56f2fe4116100c3578063ef0828ab11610087578063ef0828ab14610ada578063f2ad807514610aed578063f316bacd14610b00578063f6479d7714610b13578063fe9299fb14610b2657600080fd5b8063e56f2fe414610a52578063e7a1c1c014610a65578063e985e9c514610a78578063ec81d19414610ab4578063ed84c34514610ac757600080fd5b8063d23b320b1161010a578063d23b320b146109ce578063d70e10c6146109e1578063dabb053114610a0c578063db491e8014610a1f578063dca2713514610a3f57600080fd5b8063c053f6b814610971578063c2a6fe3b14610982578063c87b56dd14610995578063cb8e757e146109a8578063cd69fe61146109bb57600080fd5b80639864c307116101d4578063a6e6178d11610198578063a6e6178d14610912578063a7ccb4bf14610925578063af90b11214610938578063b88d4fde1461094b578063b9d328451461095e57600080fd5b80639864c307146108a65780639a4dec18146108b95780639a50248d146108cc578063a22cb465146108ec578063a48047ba146108ff57600080fd5b806392f7070b1161021b57806392f7070b1461082f57806393f057e514610842578063952be0ef1461085557806395d89b411461088b57806395d9fa7d1461089357600080fd5b8063867884e6146107e35780638734bbfc146107f65780638b4ca06a1461080957806392ef445d1461081c57600080fd5b80632f745c591161035d57806347f94de7116102e55780636352211e116102a95780636352211e146107775780636bf55d5f1461078a57806370a08231146107aa57806374f345cf146107bd5780637d46a713146107d057600080fd5b806347f94de7146107185780634f6ccce71461072b5780635a936d101461073e5780635fb8818314610751578063628b644a1461076457600080fd5b8063388f50831161032c578063388f5083146106b957806340ad34d8146106cc57806342842e0e146106df57806342966c68146106f257806344b82a241461070557600080fd5b80632f745c591461065457806331b9d08c14610667578063327b2a031461069357806333f06ee6146106a657600080fd5b80631316529d116103eb5780632209d145116103af5780632209d1451461059257806323b872dd146105c857806329c301c2146105db5780632abc6bf6146105ee5780632d8723b81461061757600080fd5b80631316529d14610540578063144a3e831461055157806318160ddd14610564578063188b04b31461056c578063206657f21461057f57600080fd5b806308cb68ff1161043257806308cb68ff146104df578063095ea7b3146104f45780630c4dd5f2146105075780630d18d07a1461051a5780630ff982441461052d57600080fd5b806301ffc9a71461046457806304f3bcec1461048c57806306fdde03146104b7578063081812fc146104cc575b600080fd5b6104776104723660046148fe565b610b4f565b60405190151581526020015b60405180910390f35b60175461049f906001600160a01b031681565b6040516001600160a01b039091168152602001610483565b6104bf610b7a565b6040516104839190614973565b61049f6104da366004614986565b610c0c565b6104f26104ed3660046149b7565b610ca6565b005b6104f2610502366004614a10565b610d3f565b6104f26105153660046149b7565b610e55565b6104f2610528366004614a3c565b610f5f565b6104f261053b366004614a6c565b610fd5565b60045b604051908152602001610483565b6104bf61055f366004614986565b6110d6565b600854610543565b6104f261057a366004614a9a565b6110e1565b6104f261058d366004614ace565b6111e0565b61049f6105a0366004614a10565b6001600160a01b03918216600090815260106020908152604080832093835292905220541690565b6104f26105d6366004614b06565b611231565b6105436105e9366004614b48565b611262565b6105436105fc366004614b7c565b6001600160a01b03166000908152600c602052604090205490565b610543610625366004614b99565b6000928352601a602090815260408085209385529281528284206001600160a01b039290921684525290205490565b610543610662366004614a10565b611310565b61049f610675366004614b7c565b6001600160a01b039081166000908152601160205260409020541690565b6105436106a1366004614be4565b6113a6565b6104f26106b4366004614c7a565b61156b565b6104f26106c7366004614a9a565b611652565b6104f26106da366004614cc5565b6116a7565b6104f26106ed366004614b06565b611723565b6104f2610700366004614986565b61173e565b610543610713366004614ce1565b6117db565b6104f2610726366004614c7a565b611853565b610543610739366004614986565b6118ba565b6104f261074c366004614a6c565b61194d565b6104f261075f366004614a9a565b6119df565b6104f2610772366004614d25565b611a34565b61049f610785366004614986565b611ac4565b61079d610798366004614986565b611b3b565b6040516104839190614d77565b6105436107b8366004614b7c565b611b55565b6104f26107cb366004614dc4565b611bdc565b6104f26107de366004614a3c565b611c62565b6104f26107f1366004614cc5565b611cd3565b610477610804366004614986565b611d45565b610543610817366004614986565b611d73565b6104f261082a366004614de6565b611ddf565b61054361083d366004614e5a565b611ecb565b6104f2610850366004614a6c565b611f61565b610543610863366004614a3c565b60009182526019602090815260408084206001600160a01b0393909316845291905290205490565b6104bf611fd2565b6104f26108a1366004614a3c565b611fe1565b6104f26108b4366004614a9a565b61203a565b6105436108c7366004614be4565b61208f565b6108df6108da366004614ea0565b612199565b6040516104839190614ee1565b6104f26108fa366004614f6d565b612348565b61047761090d366004614a3c565b612353565b6104f2610920366004614c7a565b61238e565b610543610933366004614a9a565b61240f565b610543610946366004614ce1565b6124b3565b6104f2610959366004615084565b6124f3565b6104f261096c366004615101565b61252b565b6013546001600160a01b031661049f565b6104f2610990366004614dc4565b6125fc565b6104bf6109a3366004614986565b61267a565b6104f26109b6366004615101565b61271f565b6104f26109c9366004615101565b612791565b6104f26109dc366004614a9a565b6127a5565b6105436109ef366004614dc4565b6000918252600d6020908152604080842092845291905290205490565b6108df610a1a366004614986565b612832565b610a32610a2d366004614dc4565b6129b9565b6040516104839190615135565b6104bf610a4d366004614986565b612b1a565b6104f2610a603660046151cb565b612b8c565b6104f2610a73366004614a3c565b612d41565b610477610a86366004615285565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6104bf610ac2366004614986565b612e03565b6104f2610ad53660046152b3565b612e23565b6104f2610ae83660046149b7565b612e9f565b6104f2610afb366004614986565b612f10565b610543610b0e3660046152f2565b612f5f565b6104f2610b21366004614a6c565b6130bd565b61049f610b34366004614986565b6000908152600f60205260409020546001600160a01b031690565b60006001600160e01b0319821663780e9d6360e01b1480610b745750610b7482613103565b92915050565b606060008054610b899061534d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb59061534d565b8015610c025780601f10610bd757610100808354040283529160200191610c02565b820191906000526020600020905b815481529060010190602001808311610be557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c8a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b7390e42fe92698ff28d29ab39692518e69b85ee38863dfc34f25610ccd6020840184614b7c565b610cdd6040850160208601614b7c565b610cea6040860186615382565b60116040518663ffffffff1660e01b8152600401610d0c9594939291906153f1565b60006040518083038186803b158015610d2457600080fd5b505af4158015610d38573d6000803e3d6000fd5b5050505050565b6000610d4a82611ac4565b9050806001600160a01b0316836001600160a01b03161415610db85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c81565b336001600160a01b0382161480610dd45750610dd48133610a86565b610e465760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c81565b610e508383613153565b505050565b6013546040516367880d6160e11b8152823560048201526000916001600160a01b03169063cf101ac290602401602060405180830381865afa158015610e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec39190615430565b9050610ed08160c16131c1565b7390e42fe92698ff28d29ab39692518e69b85ee388636252159e8335610efc6040860160208701614b7c565b610f096040870187615382565b600f6040518663ffffffff1660e01b8152600401610f2b959493929190615449565b60006040518083038186803b158015610f4357600080fd5b505af4158015610f57573d6000803e3d6000fd5b505050505050565b610f688261326d565b6000828152601860205260409020610f8090826132ee565b50610f8d8282600061330a565b806001600160a01b0316827faa9506a57073a80893a2d2fdd53f4bd49d281a8548f483ad230f2d5da7f6710c42604051610fc991815260200190565b60405180910390a35050565b610fe1813560b26131c1565b6040516331a9108f60e11b815281356004820152731a1153e8d53612cba1c4c98037fa4d680bb9894390633019fadd9083903090636352211e90602401602060405180830381865afa15801561103b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105f9190615474565b60135485356000908152600d60209081526040808320818a0135845282529182902054825160e088901b6001600160e01b031916815286356004820152918601356024830152949091013560448201526001600160a01b0392831660648201529116608482015260a481019190915260c401610d0c565b6060610b748261267a565b6110ed813560b26131c1565b6110fa8160200135613369565b731a1153e8d53612cba1c4c98037fa4d680bb9894363957f8a9882356020840135604085013561112d6060870187615382565b6040516331a9108f60e11b8152883560048201523090636352211e90602401602060405180830381865afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d9190615474565b6013546020808b01356000908152600a9091526040908190206005015490516001600160e01b031960e08b901b168152610d0c989796959493926001600160a01b03908116921690600d90600401615491565b6111e98361326d565b8061120c57600083815260186020526040902061120690836132ee565b50611226565b600083815260186020526040902061122490836133c2565b505b610e5083838361330a565b61123b33826133d7565b6112575760405162461bcd60e51b8152600401610c81906154eb565b610e508383836134ca565b6000611270823560ec6131c1565b81356000908152600a602052604081206003018054829061129090615552565b91829055506040516342a34a5360e01b815290915073ab40a9c08d412fc21e02fb92c4298f001ecc0fd7906342a34a53906112d990869085906000908190600e90600401615677565b60006040518083038186803b1580156112f157600080fd5b505af4158015611305573d6000803e3d6000fd5b509295945050505050565b600061131b83611b55565b821061137d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c81565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60006113b4833560ca6131c1565b6113ce6113c46020840184614b7c565b8360200135613671565b6013546545524337323160d01b906000906001600160a01b0316632ea24efc826113fb6020880188614b7c565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152602087013560448201526064016020604051808303816000875af1158015611451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114759190615430565b85356000908152600a6020526040812060030180549293509091829061149a90615552565b9182905550905073ab40a9c08d412fc21e02fb92c4298f001ecc0fd76342a34a53878386866114cc60208c018c614b7c565b8b602001356040516020016114ff92919060609290921b6bffffffffffffffffffffffff19168252601482015260340190565b604051602081830303815290604052600e6040518763ffffffff1660e01b8152600401611531969594939291906156bc565b60006040518083038186803b15801561154957600080fd5b505af415801561155d573d6000803e3d6000fd5b509298975050505050505050565b6013546040516367880d6160e11b8152600481018590526000916001600160a01b03169063cf101ac290602401602060405180830381865afa1580156115b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d99190615430565b90506115e68160b16131c1565b601354604051633c17845760e11b81526001600160a01b039091169063782f08ae9061161a90879087908790600401615707565b600060405180830381600087803b15801561163457600080fd5b505af1158015611648573d6000803e3d6000fd5b5050505050505050565b61165e813560b96131c1565b60135460405163e4bb4f2360e01b8152731a1153e8d53612cba1c4c98037fa4d680bb989439163e4bb4f2391610d0c9185916001600160a01b0390911690600d9060040161572a565b6116b3813560b66131c1565b60135460408051635cebf08d60e11b81528335600482015260208401356024820152908301356044820152606083013560648201526001600160a01b039091166084820152600d60a4820152731a1153e8d53612cba1c4c98037fa4d680bb989439063b9d7e11a9060c401610d0c565b610e50838383604051806020016040528060008152506124f3565b6000818152600a6020526040808220905161175c9160010190615798565b60408051918290039091206000818152600b6020908152838220829055858252600a90529182208281559092509061179760018301826147cd565b6117a56002830160006147cd565b50600060038201556004810180546001600160a01b03199081169091556005909101805490911690556117d782613721565b5050565b60006117e9833560c86131c1565b82356000908152600a60205260408120600301805467131a5b9adb1a5cdd60c21b9285929091829061181a90615552565b919050819055905073ab40a9c08d412fc21e02fb92c4298f001ecc0fd76342a34a53878386868a6040516020016114ff91815260200190565b61185e8360b06131c1565b6000838152600a6020526040902061187a906002018383614807565b50827f17d7c9f69270ba135480ef16837f38b9d37d3ab291cbd3ba03982290c663199783836040516118ad929190615834565b60405180910390a2505050565b60006118c560085490565b82106119285760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c81565b6008828154811061193b5761193b615848565b90600052602060002001549050919050565b611959813560be6131c1565b60135481356000818152600d60209081526040808320818701358085529083529281902054905163d862986560e01b8152600481019490945290850135602484015260448301919091526001600160a01b0390921660648201526084810191909152731a1153e8d53612cba1c4c98037fa4d680bb989439063d86298659060a401610d0c565b6119eb813560bb6131c1565b6013546040516332f107bf60e01b8152731a1153e8d53612cba1c4c98037fa4d680bb98943916332f107bf91610d0c9185916001600160a01b0390911690600d9060040161585e565b611a3f8460c36131c1565b611a4b84846002613780565b611a558484613867565b6040516001626802bf60e01b0319815273ab40a9c08d412fc21e02fb92c4298f001ecc0fd79063ff97fd4190611a98908790879087908790600e906004016158db565b60006040518083038186803b158015611ab057600080fd5b505af4158015611648573d6000803e3d6000fd5b6000818152600260205260408120546001600160a01b031680610b745760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c81565b6000818152601860205260409020606090610b749061391c565b60006001600160a01b038216611bc05760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c81565b506001600160a01b031660009081526003602052604090205490565b611be78260c46131c1565b611bf382826003613780565b611bfd8282613867565b6000828152600e60209081526040808320848452825291829020600501805460ff60a81b1916600160a81b179055905182815283917f036469f3e73c83520cdefa197d7a9c854c2f8bc0164b82e9f2bd4aa7e150fd3091015b60405180910390a25050565b611c6b8261326d565b6000828152601860205260409020611c8390826133c2565b50611c9782826001600160b01b031961330a565b806001600160a01b0316827f58f51b5bb567864de85c6a422b33491f2418924a44613d7b9341f58657bdd83342604051610fc991815260200190565b611cdf813560b86131c1565b60135481356000908152600d6020908152604080832060608601358452909152908190205490516317e9a8b160e31b8152731a1153e8d53612cba1c4c98037fa4d680bb989439263bf4d458892610d0c9286926001600160a01b031691906004016158fb565b600080611d5183611ac4565b6001600160a01b03166000908152600c60205260409020549290921492915050565b60135460405162fba02760e01b8152600481018390526000916001600160a01b03169062fba02790602401602060405180830381865afa158015611dbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b749190615430565b60005b81811015610e50576000838383818110611dfe57611dfe615848565b6020908102929092013560008181526016909352604090922054919250506001600160a01b03168015611e57576000828152601860205260409020611e4390826133c2565b50611e5782826001600160b01b031961330a565b6000828152601860205260408120611e6e9061391c565b905060005b8151811015611eb657611ea684838381518110611e9257611e92615848565b602002602001015160b0600019901b61330a565b611eaf81615552565b9050611e73565b5050505080611ec490615552565b9050611de2565b6000611ed9833560c76131c1565b82356000908152600a602052604081206003018054664164647265737360c81b926001600160a01b0386169290918290611f1290615552565b919050819055905073ab40a9c08d412fc21e02fb92c4298f001ecc0fd76342a34a53878386868a6040516020016114ff919060609190911b6bffffffffffffffffffffffff1916815260140190565b611f6d813560ba6131c1565b60135481356000908152600d6020908152604080832081860135845290915290819020549051633d7f9b3d60e11b8152731a1153e8d53612cba1c4c98037fa4d680bb9894392637aff367a92610d0c9286926001600160a01b0316919060040161594d565b606060018054610b899061534d565b611fec8260016131c1565b6040516384b44a2f60e01b8152600481018390526001600160a01b0382166024820152600a604482015273dce79680d403e5d0a0d9e99d9ee4bfc8b21c8f4a906384b44a2f90606401610f2b565b612046813560bd6131c1565b601354604051635fe5df1d60e11b8152731a1153e8d53612cba1c4c98037fa4d680bb989439163bfcbbe3a91610d0c9185916001600160a01b0390911690600d90600401615995565b600061209d833560c96131c1565b601354604051635cb46be760e01b81526000600482018190528435602483015260208501356044830152634e6f746560e01b9290916001600160a01b0390911690635cb46be7906064016020604051808303816000875af1158015612106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212a9190615430565b85356000908152600a6020526040812060030180549293509091829061214f90615552565b919050819055905073ab40a9c08d412fc21e02fb92c4298f001ecc0fd76342a34a53878386868a600001358b602001356040516020016114ff929190918252602082015260400190565b6121a161488b565b600083836040516121b39291906159f5565b604080519182900382206000818152600b602090815283822054808352600a82529184902060c08601909452835485526001840180549396509194939290840191906121fe9061534d565b80601f016020809104026020016040519081016040528092919081815260200182805461222a9061534d565b80156122775780601f1061224c57610100808354040283529160200191612277565b820191906000526020600020905b81548152906001019060200180831161225a57829003601f168201915b505050505081526020016002820180546122909061534d565b80601f01602080910402602001604051908101604052809291908181526020018280546122bc9061534d565b80156123095780601f106122de57610100808354040283529160200191612309565b820191906000526020600020905b8154815290600101906020018083116122ec57829003601f168201915b50505091835250506003820154602082015260048201546001600160a01b03908116604083015260059092015490911660609091015295945050505050565b6117d7338383613929565b60008281526019602090815260408083206001600160a01b03851684529091528120548015612383576001612386565b60005b949350505050565b6123998360006131c1565b60405163130f361d60e01b815273dce79680d403e5d0a0d9e99d9ee4bfc8b21c8f4a9063130f361d906123da90869086908690600b90600a90600401615a05565b60006040518083038186803b1580156123f257600080fd5b505af4158015612406573d6000803e3d6000fd5b50505050505050565b600061242082356020840135613867565b73ab40a9c08d412fc21e02fb92c4298f001ecc0fd7635be69415833560208501356124516060870160408801614b7c565b61245e6060880188615382565b6014546040516001600160e01b031960e089901b1681526124969695949392916001600160a01b031690600a90600e90600401615a33565b602060405180830381865af4158015611dbb573d6000803e3d6000fd5b60006124c1833560c66131c1565b82356000908152600a6020526040812060030180546821b430b930b1ba32b960b91b9285929091829061181a90615552565b6124fd33836133d7565b6125195760405162461bcd60e51b8152600401610c81906154eb565b612525848484846139f0565b50505050565b612537813560b56131c1565b61254981602001358260400135613867565b6040516331a9108f60e11b815281356004820152731a1153e8d53612cba1c4c98037fa4d680bb989439063018212d19083903090636352211e90602401602060405180830381865afa1580156125a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c79190615474565b6013546040516001600160e01b031960e086901b168152610d0c9392916001600160a01b031690600e90600d90600401615a81565b6126078260c56131c1565b61261382826004613780565b61261d8282613867565b6000828152600e60209081526040808320848452825291829020600501805460ff60a01b1916600160a01b179055905182815283917f4f1db9708b537c1d26a7af4b235fd079bf2342d92a276e27eb6c8717e8bbcf939101611c56565b6000818152600a6020526040902060020180546060919061269a9061534d565b80601f01602080910402602001604051908101604052809291908181526020018280546126c69061534d565b80156127135780601f106126e857610100808354040283529160200191612713565b820191906000526020600020905b8154815290600101906020018083116126f657829003601f168201915b50505050509050919050565b61272b813560b76131c1565b61274861273e6040830160208401614b7c565b8260400135613671565b601354604051638f3334ff60e01b8152731a1153e8d53612cba1c4c98037fa4d680bb9894391638f3334ff91610d0c9185916001600160a01b0390911690600d90600401615b00565b6127a261279d82615b63565b613a23565b50565b6127b1813560c26131c1565b6127c2813560208301356001613780565b6127d181356020830135613867565b7390e42fe92698ff28d29ab39692518e69b85ee3886320828a02823560208401356128026060860160408701614b7c565b61280f6060870187615382565b600e6040518763ffffffff1660e01b8152600401610d0c96959493929190615c16565b61283a61488b565b600a60008381526020019081526020016000206040518060c0016040529081600082015481526020016001820180546128729061534d565b80601f016020809104026020016040519081016040528092919081815260200182805461289e9061534d565b80156128eb5780601f106128c0576101008083540402835291602001916128eb565b820191906000526020600020905b8154815290600101906020018083116128ce57829003601f168201915b505050505081526020016002820180546129049061534d565b80601f01602080910402602001604051908101604052809291908181526020018280546129309061534d565b801561297d5780601f106129525761010080835404028352916020019161297d565b820191906000526020600020905b81548152906001019060200180831161296057829003601f168201915b50505091835250506003820154602082015260048201546001600160a01b03908116604083015260059092015490911660609091015292915050565b60408051610100808201835260008083526020808401829052606084860181905284018290526080840182905260a0840182905260c0840182905260e08401829052868252600e81528482208683528152908490208451928301855280548352600181015491830191909152600281018054939492939192840191612a3d9061534d565b80601f0160208091040260200160405190810160405280929190818152602001828054612a699061534d565b8015612ab65780601f10612a8b57610100808354040283529160200191612ab6565b820191906000526020600020905b815481529060010190602001808311612a9957829003601f168201915b505050918352505060038201546001600160a01b039081166020830152600483015481166040830152600590920154918216606082015260ff600160a01b8304811615156080830152600160a81b909204909116151560a090910152905092915050565b601354604051632b05429560e21b8152600481018390526060916001600160a01b03169063ac150a5490602401600060405180830381865afa158015612b64573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b749190810190615c57565b601454600160a81b900460ff1615808015612bb457506014546001600160a01b90910460ff16105b80612bd55750303b158015612bd55750601454600160a01b900460ff166001145b612c385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610c81565b6014805460ff60a01b1916600160a01b1790558015612c65576014805460ff60a81b1916600160a81b1790555b612c7189898989613af8565b601380546001600160a01b03199081166001600160a01b0388811691909117909255601480548216878416179055601580548216868416179055601780549091169184169190911790556040514281527f400175a56dd3710794078f7b9dbe8296ac94c5a248dfd51bb22ed4ab9eaa9fbf9060200160405180910390a18015612d36576014805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b612d4a8261326d565b6001600160a01b038116612d9b5760008281526016602090815260408083205460189092529091206001600160a01b0390911690612d8890826132ee565b50612d958382600061330a565b50612dc7565b6000828152601860205260409020612db390826133c2565b50612dc782826001600160b01b031961330a565b806001600160a01b0316827f691b92a93c526c4f5a357e56a33c33f6250f94e19e6c49be805800615c41493142604051610fc991815260200190565b6000818152600a6020526040902060010180546060919061269a9061534d565b612e2c8461326d565b612e368484613867565b6000848152601a6020908152604080832086845282528083206001600160a01b0386168085529083529281902084905551838152859187917f488a41148fb8f04fec9e8e1f936444b9b70c0f084a5242092d8b4b01f6163d80910160405180910390a450505050565b612eab813560bc6131c1565b60135481356000908152600d602090815260408083208186013584529091529081902054905163bf5c00c160e01b8152731a1153e8d53612cba1c4c98037fa4d680bb989439263bf5c00c192610d0c9286926001600160a01b03169190600401615cc4565b612f198161326d565b336000818152600c602052604080822080549085905590519092839285927fce95332e6082aebeb8058a7b56d1a109f67d6550552ed04d36aca4a6acd4d7de9190a45050565b6000612f6d843560cb6131c1565b601354604051633610bf0960e11b815265416e7955726960d01b916000916001600160a01b0390911690636c217e1290612faf90849089908990600401615707565b6020604051808303816000875af1158015612fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff29190615430565b86356000908152600a6020526040812060030180549293509091829061301790615552565b919050819055905073ab40a9c08d412fc21e02fb92c4298f001ecc0fd76342a34a53888386868b8b6040516020016130509291906159f5565b604051602081830303815290604052600e6040518763ffffffff1660e01b8152600401613082969594939291906156bc565b60006040518083038186803b15801561309a57600080fd5b505af41580156130ae573d6000803e3d6000fd5b50929998505050505050505050565b6130c9813560b46131c1565b6127a281356130de6040840160208501614b7c565b836040013560405180604001604052806002815260200161060f60f31b815250613b49565b60006001600160e01b031982166380ac58cd60e01b148061313457506001600160e01b03198216635b5e139f60e01b145b80610b7457506301ffc9a760e01b6001600160e01b0319831614610b74565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061318882611ac4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006131cc83611ac4565b9050336001600160a01b03821614806132025750326001600160a01b03821614801561320257506015546001600160a01b031633145b8061322b57506000838152601960209081526040808320338452909152902054600190831c8116145b610e505760405162461bcd60e51b81526020600482015260136024820152722737ba22b737bab3b42832b936b4b9b9b4b7b760691b6044820152606401610c81565b600061327882611ac4565b9050336001600160a01b03821614806132ae5750326001600160a01b0382161480156132ae57506015546001600160a01b031633145b6117d75760405162461bcd60e51b81526020600482015260116024820152702737ba21b430b930b1ba32b927bbb732b960791b6044820152606401610c81565b6000613303836001600160a01b038416613dc6565b9392505050565b60008381526019602090815260408083206001600160a01b038616808552908352928190208490555183815285917f4b0dcce4c30a5691ff14b7d4a8a27e2738b66289dc90120ebbc092812941bd2791015b60405180910390a3505050565b6000818152600260205260409020546001600160a01b03166127a25760405162461bcd60e51b81526020600482015260126024820152714368617261637465724e6f7445786973747360701b6044820152606401610c81565b6000613303836001600160a01b038416613eb9565b6000818152600260205260408120546001600160a01b03166134505760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c81565b600061345b83611ac4565b9050806001600160a01b0316846001600160a01b031614806134965750836001600160a01b031661348b84610c0c565b6001600160a01b0316145b8061238657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16612386565b826001600160a01b03166134dd82611ac4565b6001600160a01b0316146135415760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610c81565b6001600160a01b0382166135a35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c81565b6135ae838383613f08565b6135b9600082613153565b6001600160a01b03831660009081526003602052604081208054600192906135e2908490615d1c565b90915550506001600160a01b0382166000908152600360205260408120805460019290613610908490615d33565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6040516331a9108f60e11b8152600481018290526001600160a01b03831690636352211e90602401602060405180830381865afa1580156136b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136da9190615474565b6001600160a01b03166117d75760405162461bcd60e51b815260206004820152600f60248201526e5245433732314e6f7445786973747360881b6044820152606401610c81565b61372b33826133d7565b6137775760405162461bcd60e51b815260206004820152601b60248201527f4e4654426173653a204e6f744f776e65724f72417070726f76656400000000006044820152606401610c81565b6127a28161402c565b600061378b84611ac4565b9050336001600160a01b03821614806137c15750326001600160a01b0382161480156137c157506015546001600160a01b031633145b8061381b57506000848152601a602090815260408083208684528252808320338452909152902054600190831c8116148061381b57506000848152601a602090815260408083208684528252808320338452909152902054155b6125255760405162461bcd60e51b815260206004820152601e60248201527f4e6f74456e6f7567685065726d697373696f6e466f72546869734e6f746500006044820152606401610c81565b6000828152600e60209081526040808320848452909152902060050154600160a01b900460ff16156138cb5760405162461bcd60e51b815260206004820152600d60248201526c139bdd19525cd1195b195d1959609a1b6044820152606401610c81565b6000828152600a60205260409020600301548111156117d75760405162461bcd60e51b815260206004820152600d60248201526c4e6f74654e6f7445786973747360981b6044820152606401610c81565b60606000613303836140d3565b816001600160a01b0316836001600160a01b0316141561398b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c81565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910161335c565b6139fb8484846134ca565b613a078484848461412e565b6125255760405162461bcd60e51b8152600401610c8190615d4b565b6000601260008154613a3490615552565b91829055508251909150613a48908261422c565b604051632902741560e01b815273dce79680d403e5d0a0d9e99d9ee4bfc8b21c8f4a90632902741590613a8a9085906001908690600b90600a90600401615d9d565b60006040518083038186803b158015613aa257600080fd5b505af4158015613ab6573d6000803e3d6000fd5b505083516001600160a01b03166000908152600c6020526040902054151591506117d790505790516001600160a01b03166000908152600c6020526040902055565b613b0484848484614246565b7f414cd0b34676984f09a5f76ce9718d4062e50283abe0e7e274a9a5b4e0c99c308484848442604051613b3b959493929190615e46565b60405180910390a150505050565b6001600160a01b0383166000908152600c602052604090205415613bc55760405162461bcd60e51b815260206004820152602d60248201527f546172676574206164647265737320616c726561647920686173207072696d6160448201526c393c9031b430b930b1ba32b91760991b6064820152608401610c81565b6000601260008154613bd690615552565b91829055509050613be7848261422c565b73dce79680d403e5d0a0d9e99d9ee4bfc8b21c8f4a63290274156040518060a00160405280876001600160a01b03168152602001613c2f886001600160a01b0316601461425f565b815260200160405180602001604052806000815250815260200160006001600160a01b0316815260200160405180602001604052806000815250815250600084600b600a6040518663ffffffff1660e01b8152600401613c93959493929190615d9d565b60006040518083038186803b158015613cab57600080fd5b505af4158015613cbf573d6000803e3d6000fd5b505050506001600160a01b0384166000908152600c602052604090819020829055516331a9108f60e11b815260048101869052731a1153e8d53612cba1c4c98037fa4d680bb989439063957f8a989087908490879087903090636352211e90602401602060405180830381865afa158015613d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d629190615474565b6013546040516001600160e01b031960e089901b168152613d9a9695949392916001600160a01b031690600090600d90600401615e80565b60006040518083038186803b158015613db257600080fd5b505af4158015612d36573d6000803e3d6000fd5b60008181526001830160205260408120548015613eaf576000613dea600183615d1c565b8554909150600090613dfe90600190615d1c565b9050818114613e63576000866000018281548110613e1e57613e1e615848565b9060005260206000200154905080876000018481548110613e4157613e41615848565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613e7457613e74615ed8565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610b74565b6000915050610b74565b6000818152600183016020526040812054613f0057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b74565b506000610b74565b6000818152601860205260408120613f1f906143fa565b600083815260186020526040812091925090613f3a9061391c565b905060005b82811015613fe857600084815260196020526040812083518290859085908110613f6b57613f6b615848565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550613fd5828281518110613fac57613fac615848565b6020026020010151601860008781526020019081526020016000206132ee90919063ffffffff16565b5080613fe081615552565b915050613f3f565b506001600160a01b0385166000908152600c602052604090205415614021576001600160a01b0385166000908152600c60205260408120555b610d38858585614404565b600061403782611ac4565b905061404581600084613f08565b614050600083613153565b6001600160a01b0381166000908152600360205260408120805460019290614079908490615d1c565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561271357602002820191906000526020600020905b81548152602001906001019080831161410f5750505050509050919050565b60006001600160a01b0384163b1561422157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614172903390899088908890600401615eee565b6020604051808303816000875af19250505080156141ad575060408051601f3d908101601f191682019092526141aa91810190615f2b565b60015b614207573d8080156141db576040519150601f19603f3d011682016040523d82523d6000602084013e6141e0565b606091505b5080516141ff5760405162461bcd60e51b8152600401610c8190615d4b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612386565b506001949350505050565b6117d78282604051806020016040528060008152506144bc565b61425260008585614807565b50610d3860018383614807565b6060600061426e836002615f48565b614279906002615d33565b6001600160401b0381111561429057614290614f99565b6040519080825280601f01601f1916602001820160405280156142ba576020820181803683370190505b509050600360fc1b816000815181106142d5576142d5615848565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061430457614304615848565b60200101906001600160f81b031916908160001a9053506000614328846002615f48565b614333906001615d33565b90505b60018111156143ab576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061436757614367615848565b1a60f81b82828151811061437d5761437d615848565b60200101906001600160f81b031916908160001a90535060049490941c936143a481615f67565b9050614336565b5083156133035760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610c81565b6000610b74825490565b6001600160a01b03831661445f5761445a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614482565b816001600160a01b0316836001600160a01b0316146144825761448283826144ef565b6001600160a01b03821661449957610e508161458c565b826001600160a01b0316826001600160a01b031614610e5057610e50828261463b565b6144c6838361467f565b6144d3600084848461412e565b610e505760405162461bcd60e51b8152600401610c8190615d4b565b600060016144fc84611b55565b6145069190615d1c565b600083815260076020526040902054909150808214614559576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061459e90600190615d1c565b600083815260096020526040812054600880549394509092849081106145c6576145c6615848565b9060005260206000200154905080600883815481106145e7576145e7615848565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061461f5761461f615ed8565b6001900381819060005260206000200160009055905550505050565b600061464683611b55565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166146d55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c81565b6000818152600260205260409020546001600160a01b03161561473a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c81565b61474660008383613f08565b6001600160a01b038216600090815260036020526040812080546001929061476f908490615d33565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5080546147d99061534d565b6000825580601f106147e9575050565b601f0160209004906000526020600020908101906127a291906148d3565b8280546148139061534d565b90600052602060002090601f016020900481019282614835576000855561487b565b82601f1061484e5782800160ff1982351617855561487b565b8280016001018555821561487b579182015b8281111561487b578235825591602001919060010190614860565b506148879291506148d3565b5090565b6040518060c001604052806000815260200160608152602001606081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b5b8082111561488757600081556001016148d4565b6001600160e01b0319811681146127a257600080fd5b60006020828403121561491057600080fd5b8135613303816148e8565b60005b8381101561493657818101518382015260200161491e565b838111156125255750506000910152565b6000815180845261495f81602086016020860161491b565b601f01601f19169290920160200192915050565b6020815260006133036020830184614947565b60006020828403121561499857600080fd5b5035919050565b6000606082840312156149b157600080fd5b50919050565b6000602082840312156149c957600080fd5b81356001600160401b038111156149df57600080fd5b6123868482850161499f565b6001600160a01b03811681146127a257600080fd5b8035614a0b816149eb565b919050565b60008060408385031215614a2357600080fd5b8235614a2e816149eb565b946020939093013593505050565b60008060408385031215614a4f57600080fd5b823591506020830135614a61816149eb565b809150509250929050565b600060608284031215614a7e57600080fd5b613303838361499f565b6000608082840312156149b157600080fd5b600060208284031215614aac57600080fd5b81356001600160401b03811115614ac257600080fd5b61238684828501614a88565b600080600060608486031215614ae357600080fd5b833592506020840135614af5816149eb565b929592945050506040919091013590565b600080600060608486031215614b1b57600080fd5b8335614b26816149eb565b92506020840135614af5816149eb565b600060e082840312156149b157600080fd5b600060208284031215614b5a57600080fd5b81356001600160401b03811115614b7057600080fd5b61238684828501614b36565b600060208284031215614b8e57600080fd5b8135613303816149eb565b600080600060608486031215614bae57600080fd5b83359250602084013591506040840135614bc7816149eb565b809150509250925092565b6000604082840312156149b157600080fd5b60008060608385031215614bf757600080fd5b82356001600160401b03811115614c0d57600080fd5b614c1985828601614b36565b925050614c298460208501614bd2565b90509250929050565b60008083601f840112614c4457600080fd5b5081356001600160401b03811115614c5b57600080fd5b602083019150836020828501011115614c7357600080fd5b9250929050565b600080600060408486031215614c8f57600080fd5b8335925060208401356001600160401b03811115614cac57600080fd5b614cb886828701614c32565b9497909650939450505050565b600060808284031215614cd757600080fd5b6133038383614a88565b60008060408385031215614cf457600080fd5b82356001600160401b03811115614d0a57600080fd5b614d1685828601614b36565b95602094909401359450505050565b60008060008060608587031215614d3b57600080fd5b843593506020850135925060408501356001600160401b03811115614d5f57600080fd5b614d6b87828801614c32565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015614db85783516001600160a01b031683529284019291840191600101614d93565b50909695505050505050565b60008060408385031215614dd757600080fd5b50508035926020909101359150565b60008060208385031215614df957600080fd5b82356001600160401b0380821115614e1057600080fd5b818501915085601f830112614e2457600080fd5b813581811115614e3357600080fd5b8660208260051b8501011115614e4857600080fd5b60209290920196919550909350505050565b60008060408385031215614e6d57600080fd5b82356001600160401b03811115614e8357600080fd5b614e8f85828601614b36565b9250506020830135614a61816149eb565b60008060208385031215614eb357600080fd5b82356001600160401b03811115614ec957600080fd5b614ed585828601614c32565b90969095509350505050565b60208152815160208201526000602083015160c06040840152614f0760e0840182614947565b90506040840151601f19848303016060850152614f248282614947565b91505060608401516080840152608084015160018060a01b0380821660a08601528060a08701511660c086015250508091505092915050565b80358015158114614a0b57600080fd5b60008060408385031215614f8057600080fd5b8235614f8b816149eb565b9150614c2960208401614f5d565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b0381118282101715614fd157614fd1614f99565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614fff57614fff614f99565b604052919050565b60006001600160401b0382111561502057615020614f99565b50601f01601f191660200190565b600082601f83011261503f57600080fd5b813561505261504d82615007565b614fd7565b81815284602083860101111561506757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561509a57600080fd5b84356150a5816149eb565b935060208501356150b5816149eb565b92506040850135915060608501356001600160401b038111156150d757600080fd5b6150e38782880161502e565b91505092959194509250565b600060a082840312156149b157600080fd5b60006020828403121561511357600080fd5b81356001600160401b0381111561512957600080fd5b612386848285016150ef565b60208152815160208201526020820151604082015260006040830151610100806060850152615168610120850183614947565b9150606085015160018060a01b0380821660808701528060808801511660a0870152505060a08501516151a660c08601826001600160a01b03169052565b5060c085015180151560e08601525060e0850151801515858301525090949350505050565b60008060008060008060008060c0898b0312156151e757600080fd5b88356001600160401b03808211156151fe57600080fd5b61520a8c838d01614c32565b909a50985060208b013591508082111561522357600080fd5b506152308b828c01614c32565b9097509550506040890135615244816149eb565b93506060890135615254816149eb565b92506080890135615264816149eb565b915060a0890135615274816149eb565b809150509295985092959890939650565b6000806040838503121561529857600080fd5b82356152a3816149eb565b91506020830135614a61816149eb565b600080600080608085870312156152c957600080fd5b843593506020850135925060408501356152e2816149eb565b9396929550929360600135925050565b60008060006040848603121561530757600080fd5b83356001600160401b038082111561531e57600080fd5b61532a87838801614b36565b9450602086013591508082111561534057600080fd5b50614cb886828701614c32565b600181811c9082168061536157607f821691505b602082108114156149b157634e487b7160e01b600052602260045260246000fd5b6000808335601e1984360301811261539957600080fd5b8301803591506001600160401b038211156153b357600080fd5b602001915036819003821315614c7357600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0386811682528516602082015260806040820181905260009061541e90830185876153c8565b90508260608301529695505050505050565b60006020828403121561544257600080fd5b5051919050565b8581526001600160a01b038516602082015260806040820181905260009061541e90830185876153c8565b60006020828403121561548657600080fd5b8151613303816149eb565b60006101008b83528a60208401528960408401528060608401526154b8818401898b6153c8565b6001600160a01b03978816608085015295871660a084015250509190931660c082015260e0019190915295945050505050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156155665761556661553c565b5060010190565b6000808335601e1984360301811261558457600080fd5b83016020810192503590506001600160401b038111156155a357600080fd5b803603831315614c7357600080fd5b8035825260006155c5602083018361556d565b60e060208601526155da60e0860182846153c8565b91505060408301356155eb816149eb565b6001600160a01b038181166040870152615608606086018661556d565b9250868403606088015261561d8484836153c8565b93505060808501359150615630826149eb565b16608085015261564360a084018461556d565b85830360a08701526156568382846153c8565b9250505061566660c08401614f5d565b151560c08501528091505092915050565b60c08152600061568a60c08301886155b2565b602083810197909752604083019590955250606081019290925281830360808301526000835260a09091015201919050565b60c0815260006156cf60c08301896155b2565b87602084015286604084015285606084015282810360808401526156f38186614947565b9150508260a0830152979650505050505050565b8381526040602082015260006157216040830184866153c8565b95945050505050565b606081528335606082015260006020850135615745816149eb565b6001600160a01b038181166080850152604087013560a085015261576c606088018861556d565b9250608060c086015261578360e0860184836153c8565b96909116602085015250505060400152919050565b600080835481600182811c9150808316806157b457607f831692505b60208084108214156157d457634e487b7160e01b86526022600452602486fd5b8180156157e857600181146157f957615826565b60ff19861689528489019650615826565b60008a81526020902060005b8681101561581e5781548b820152908501908301615805565b505084890196505b509498975050505050505050565b6020815260006123866020830184866153c8565b634e487b7160e01b600052603260045260246000fd5b60608152833560608201526000615878602086018661556d565b60808085015261588c60e0850182846153c8565b915050604086013560a08401526158a6606087018761556d565b848303605f190160c08601526158bd8382846153c8565b6001600160a01b039790971660208601525050505060400152919050565b85815284602082015260806040820152600061541e6080830185876153c8565b8335815260c081016020850135615911816149eb565b6001600160a01b039081166020840152604086810135908401526060958601359583019590955292909316608084015260a09092019190915290565b8335815260a081016020850135615963816149eb565b6001600160a01b0390811660208401526040958601359583019590955292909316606084015260809092019190915290565b606081528335606082015260208401356080820152604084013560a082015260006159c3606086018661556d565b608060c08501526159d860e0850182846153c8565b6001600160a01b0396909616602085015250505060400152919050565b8183823760009101908152919050565b858152608060208201526000615a1f6080830186886153c8565b604083019490945250606001529392505050565b888152876020820152600060018060a01b03808916604084015260e06060840152615a6260e08401888a6153c8565b951660808301525060a081019290925260c09091015295945050505050565b60a08152853560a0820152602086013560c0820152604086013560e082015260608601356101008201526000615aba608088018861556d565b60a0610120850152615ad1610140850182846153c8565b6001600160a01b0398891660208601529690971660408401525050606081019290925260809091015292915050565b606081528335606082015260006020850135615b1b816149eb565b60018060a01b038082166080850152604087013560a0850152606087013560c0850152615b4b608088018861556d565b925060a060e0860152615783610100860184836153c8565b600060a08236031215615b7557600080fd5b615b7d614faf565b615b8683614a00565b815260208301356001600160401b0380821115615ba257600080fd5b615bae3683870161502e565b60208401526040850135915080821115615bc757600080fd5b615bd33683870161502e565b6040840152615be460608601614a00565b60608401526080850135915080821115615bfd57600080fd5b50615c0a3682860161502e565b60808301525092915050565b86815285602082015260018060a01b038516604082015260a060608201526000615c4460a0830185876153c8565b9050826080830152979650505050505050565b600060208284031215615c6957600080fd5b81516001600160401b03811115615c7f57600080fd5b8201601f81018413615c9057600080fd5b8051615c9e61504d82615007565b818152856020838501011115615cb357600080fd5b61572182602083016020860161491b565b60608152833560608201526000615cde602086018661556d565b60606080850152615cf360c0850182846153c8565b60409788013560a08601526001600160a01b039690961660208501525050509092019190915290565b600082821015615d2e57615d2e61553c565b500390565b60008219821115615d4657615d4661553c565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60a08152600060018060a01b038088511660a0840152602088015160a060c0850152615dcd610140850182614947565b90506040890151609f19808684030160e0870152615deb8383614947565b92508360608c01511661010087015260808b0151935080868403016101208701525050615e188183614947565b92505050615e2a602083018715159052565b8460408301528360608301528260808301529695505050505050565b606081526000615e5a6060830187896153c8565b8281036020840152615e6d8186886153c8565b9150508260408301529695505050505050565b60006101008a8352896020840152886040840152806060840152615ea681840189614947565b6001600160a01b03978816608085015295871660a084015250509190931660c082015260e00191909152949350505050565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615f2190830184614947565b9695505050505050565b600060208284031215615f3d57600080fd5b8151613303816148e8565b6000816000190483118215151615615f6257615f6261553c565b500290565b600081615f7657615f7661553c565b50600019019056fea26469706673582212201040f63ce737d60f661965b4af9d1ba47eee41d92dbdaad28114f3f8b9e5d1be64736f6c634300080a0033