Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
NounsComposer
Compiler Version
v0.8.15+commit.e14f2714
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 /// @title The Nouns composer /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░██░░░████░░██░░░████░░░ * * ░░██████░░░████████░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * *********************************/ pragma solidity ^0.8.6; import { ReentrancyGuardUpgradeable } from '@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol'; import { OwnableUpgradeable } from '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol'; import { ERC1155HolderUpgradeable } from '@openzeppelin/contracts-upgradeable/token/ERC1155/utils/ERC1155HolderUpgradeable.sol'; import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import { IERC1155 } from "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import { INounsToken } from '../../interfaces/INounsToken.sol'; import { ISVGRenderer } from '../../interfaces/ISVGRenderer.sol'; import { INounsComposer } from './interfaces/INounsComposer.sol'; import { IComposablePart } from '../items/interfaces/IComposablePart.sol'; contract NounsComposer is INounsComposer, ERC1155HolderUpgradeable, ReentrancyGuardUpgradeable, OwnableUpgradeable { // The Nouns ERC721 token contract INounsToken public nouns; // Composed Child Tokens, token_id, position1 mapping(uint256 => mapping(uint16 => ChildToken)) public composedChildTokens; // tokenId => array of child contract mapping(uint256 => address[]) public childContracts; // tokenId => (child address => array of child tokens) mapping(uint256 => mapping(address => uint256[])) public childTokens; // tokenId => (child address => contract index) mapping(uint256 => mapping(address => uint256)) public childContractIndex; // tokenId => (child address => (child token => ChildTokenState(index, balance, position1)) mapping(uint256 => mapping(address => mapping(uint256 => ChildTokenState))) public childTokenState; /** * @notice Initialize the composer and base contracts, and populate configuration values. * @dev This function can only be called once. */ function initialize( INounsToken _nouns ) external initializer { __ReentrancyGuard_init(); __Ownable_init(); nouns = _nouns; } function getChildContracts(uint256 _tokenId) external view returns (address[] memory) { return childContracts[_tokenId]; } function getChildTokens(uint256 _tokenId, address _childTokenAddress) external view returns (uint256[] memory) { return childTokens[_tokenId][_childTokenAddress]; } function getChildContractCount(uint256 _tokenId) external view returns (uint256) { return childContracts[_tokenId].length; } function getChildTokenCount(uint256 _tokenId, address _childTokenAddress) external view returns (uint256) { return childTokens[_tokenId][_childTokenAddress].length; } function getChildTokenState(uint256 _tokenId, address _childTokenAddress, uint256 _childTokenId) external view returns (ChildTokenState memory) { return childTokenState[_tokenId][_childTokenAddress][_childTokenId]; } function getChildTokenStateBatch(uint256 _tokenId, address[] calldata _childTokenAddresses, uint256[] calldata _childTokenIds) external view returns (ChildTokenState[] memory) { uint256 len = _childTokenAddresses.length; ChildTokenState[] memory batchTokenStates = new ChildTokenState[](len); for (uint256 i = 0; i < len;) { batchTokenStates[i] = childTokenState[_tokenId][_childTokenAddresses[i]][_childTokenIds[i]]; unchecked { i++; } } return batchTokenStates; } function getComposedChild(uint256 _tokenId, uint16 _position1) external view returns (ChildToken memory) { return composedChildTokens[_tokenId][_position1]; } function getComposedChildBatch(uint256 _tokenId, uint16 _position1Start, uint16 _position1End) external view returns (ChildToken[] memory) { require(_position1End > _position1Start, "NounsComposer: invalid position range"); uint16 len = _position1End - _position1Start + 1; ChildToken[] memory batchTokens = new ChildToken[](len); for (uint16 i = 0; i < len;) { batchTokens[i] = composedChildTokens[_tokenId][_position1Start + i]; unchecked { i++; } } return batchTokens; } function childExists(uint256 _tokenId, address _childTokenAddress, uint256 _childTokenId) external view returns (bool) { return _childExists(_tokenId, _childTokenAddress, _childTokenId); } /* * Receive and Transfer Child Tokens * */ function receiveChild(uint256 _tokenId, TokenTransferParams calldata _child) external nonReentrant { require(_isApprovedOrOwner(_msgSender(), _tokenId), "NounsComposer: caller is not token owner nor approved"); _receiveChild(_tokenId, _child.tokenAddress, _child.tokenId, _child.amount); } function receiveChildBatch(uint256 _tokenId, TokenTransferParams[] calldata _children) external nonReentrant { require(_isApprovedOrOwner(_msgSender(), _tokenId), "NounsComposer: caller is not token owner nor approved"); _receiveChildBatch(_tokenId, _children); } function receiveAndComposeChild(uint256 _tokenId, TokenFullParams calldata _child) external nonReentrant { require(_isApprovedOrOwner(_msgSender(), _tokenId), "NounsComposer: caller is not token owner nor approved"); _receiveChild(_tokenId, _child.tokenAddress, _child.tokenId, _child.amount); _composeChild(_tokenId, _child.tokenAddress, _child.tokenId, _child.position1, _child.boundTop1, _child.boundLeft1); } function receiveAndComposeChildBatch(uint256 _tokenId, TokenFullParams[] calldata _children) external nonReentrant { require(_isApprovedOrOwner(_msgSender(), _tokenId), "NounsComposer: caller is not token owner nor approved"); _receiveChildBatch(_tokenId, _children); _composeChildBatch(_tokenId, _children); } function receiveAndComposeChildBatchMixed(uint256 _tokenId, TokenTransferParams[] calldata _childrenReceive, TokenPositionParams[] calldata _childrenCompose) external nonReentrant { require(_isApprovedOrOwner(_msgSender(), _tokenId), "NounsComposer: caller is not token owner nor approved"); _receiveChildBatch(_tokenId, _childrenReceive); _composeChildBatch(_tokenId, _childrenCompose); } function _receiveChildBatch(uint256 _tokenId, TokenTransferParams[] calldata _children) internal { uint256 len = _children.length; for (uint256 i = 0; i < len;) { _receiveChild(_tokenId, _children[i].tokenAddress, _children[i].tokenId, _children[i].amount); unchecked { i++; } } } function _receiveChildBatch(uint256 _tokenId, TokenFullParams[] calldata _children) internal { uint256 len = _children.length; for (uint256 i = 0; i < len;) { _receiveChild(_tokenId, _children[i].tokenAddress, _children[i].tokenId, _children[i].amount); unchecked { i++; } } } function _receiveChild(uint256 _tokenId, address _childTokenAddress, uint256 _childTokenId, uint256 _childAmount) internal { uint256 childTokensLength = childTokens[_tokenId][_childTokenAddress].length; if (childTokensLength == 0) { childContractIndex[_tokenId][_childTokenAddress] = childContracts[_tokenId].length; childContracts[_tokenId].push(_childTokenAddress); } uint256 childTokenBalance = childTokenState[_tokenId][_childTokenAddress][_childTokenId].balance; if (childTokenBalance == 0) { childTokenState[_tokenId][_childTokenAddress][_childTokenId] = ChildTokenState(_childAmount, uint64(childTokensLength), 0, 0, 0); childTokens[_tokenId][_childTokenAddress].push(_childTokenId); } else { childTokenState[_tokenId][_childTokenAddress][_childTokenId].balance += _childAmount; } _callTransferFrom(_msgSender(), address(this), _childTokenAddress, _childTokenId, _childAmount); emit ChildReceived(_tokenId, _msgSender(), _childTokenAddress, _childTokenId, _childAmount); } function transferChild(uint256 _tokenId, address _to, TokenTransferParams calldata _child) external nonReentrant { require(_isApprovedOrOwner(_msgSender(), _tokenId), "NounsComposer: caller is not token owner nor approved"); require(_to != address(0), "NounsComposer: transfer to the zero address"); _transferChild(_tokenId, _to, _child.tokenAddress, _child.tokenId, _child.amount); } function transferChildBatch(uint256 _tokenId, address _to, TokenTransferParams[] calldata _children) external nonReentrant { require(_isApprovedOrOwner(_msgSender(), _tokenId), "NounsComposer: caller is not token owner nor approved"); require(_to != address(0), "NounsComposer: transfer to the zero address"); uint256 len = _children.length; for (uint256 i = 0; i < len;) { _transferChild(_tokenId, _to, _children[i].tokenAddress, _children[i].tokenId, _children[i].amount); unchecked { i++; } } } function _transferChild(uint256 _tokenId, address _to, address _childTokenAddress, uint256 _childTokenId, uint256 _childAmount) internal { ChildTokenState memory childState = childTokenState[_tokenId][_childTokenAddress][_childTokenId]; uint256 tokenIndex = childState.index; require(childState.balance >= _childAmount, "NounsComposer: insufficient balance for transfer"); if (childState.position1 > 0) { _removeComposedChild(_tokenId, (childState.position1)); } uint256 newChildBalance; unchecked { newChildBalance = childState.balance - _childAmount; } childTokenState[_tokenId][_childTokenAddress][_childTokenId].balance = newChildBalance; if (newChildBalance == 0) { // remove token uint256 lastTokenIndex = childTokens[_tokenId][_childTokenAddress].length - 1; uint256 lastToken = childTokens[_tokenId][_childTokenAddress][lastTokenIndex]; if (_childTokenId != lastToken) { childTokens[_tokenId][_childTokenAddress][tokenIndex] = lastToken; childTokenState[_tokenId][_childTokenAddress][lastToken].index = uint64(tokenIndex); } childTokens[_tokenId][_childTokenAddress].pop(); delete childTokenState[_tokenId][_childTokenAddress][_childTokenId]; if (lastTokenIndex == 0) { // remove contract uint256 lastContractIndex = childContracts[_tokenId].length - 1; address lastContract = childContracts[_tokenId][lastContractIndex]; if (_childTokenAddress != lastContract) { uint256 contractIndex = childContractIndex[_tokenId][_childTokenAddress]; childContracts[_tokenId][contractIndex] = lastContract; childContractIndex[_tokenId][lastContract] = contractIndex; } childContracts[_tokenId].pop(); delete childContractIndex[_tokenId][_childTokenAddress]; } } _callTransferFrom(address(this), _to, _childTokenAddress, _childTokenId, _childAmount); emit ChildTransferred(_tokenId, _to, _childTokenAddress, _childTokenId, _childAmount); } function _callTransferFrom(address _from, address _to, address _childTokenAddress, uint256 _childTokenId, uint256 _childAmount) internal { IERC165 introContract = IERC165(_childTokenAddress); if (introContract.supportsInterface(type(IERC1155).interfaceId)) { IERC1155(_childTokenAddress).safeTransferFrom(_from, _to, _childTokenId, _childAmount, "0x0"); } else if (introContract.supportsInterface(type(IERC20).interfaceId)) { IERC20(_childTokenAddress).transferFrom(_from, _to, _childAmount); } else if (introContract.supportsInterface(type(IERC721).interfaceId)) { IERC721(_childTokenAddress).transferFrom(_from, _to, _childTokenId); } else { revert("NounsComposer: unsupported token type"); } } /* * Child Part Composition * */ function composeChild(uint256 _tokenId, TokenPositionParams calldata _child) external { require(_isApprovedOrOwner(_msgSender(), _tokenId), "NounsComposer: caller is not token owner nor approved"); require(_childExists(_tokenId, _child.tokenAddress, _child.tokenId), "NounsComposer: compose query for nonexistent child"); _composeChild(_tokenId, _child.tokenAddress, _child.tokenId, _child.position1, _child.boundTop1, _child.boundLeft1); } function composeChildBatch(uint256 _tokenId, TokenPositionParams[] calldata _children) external { require(_isApprovedOrOwner(_msgSender(), _tokenId), "NounsComposer: caller is not token owner nor approved"); _composeChildBatch(_tokenId, _children); } function removeComposedChild(uint256 _tokenId, uint16 _position1) external { require(_isApprovedOrOwner(_msgSender(), _tokenId), "NounsComposer: caller is not token owner nor approved"); require(composedChildTokens[_tokenId][_position1].tokenAddress != address(0), "NounsComposer: compose query for nonexistent child"); _removeComposedChild(_tokenId, _position1); } function removeComposedChildBatch(uint256 _tokenId, uint16[] calldata _position1s) external { require(_isApprovedOrOwner(_msgSender(), _tokenId), "NounsComposer: caller is not token owner nor approved"); uint256 len = _position1s.length; for (uint256 i = 0; i < len;) { require(composedChildTokens[_tokenId][_position1s[i]].tokenAddress != address(0), "NounsComposer: compose query for nonexistent child"); _removeComposedChild(_tokenId, _position1s[i]); unchecked { i++; } } } function _composeChild(uint256 _tokenId, address _childTokenAddress, uint256 _childTokenId, uint16 _position1, uint8 _boundTop1, uint8 _boundLeft1) internal { ChildTokenState memory childState = childTokenState[_tokenId][_childTokenAddress][_childTokenId]; //first, check if source child token is being moved from an existing position if (childState.position1 != 0 && childState.position1 != _position1) { _removeComposedChild(_tokenId, childState.position1); } //this allows for parts to be removed via batch compose calls if (_position1 == 0) { return; } //then, check to see if the target position has a child token, if so, clear it if (composedChildTokens[_tokenId][_position1].tokenAddress != address(0)) { _removeComposedChild(_tokenId, _position1); } composedChildTokens[_tokenId][_position1] = ChildToken(_childTokenAddress, _childTokenId); childState.position1 = _position1; childState.boundTop1 = _boundTop1; childState.boundLeft1 = _boundLeft1; childTokenState[_tokenId][_childTokenAddress][_childTokenId] = childState; emit CompositionAdded(_tokenId, _childTokenAddress, _childTokenId, _position1, _boundTop1, _boundLeft1); } function _composeChildBatch(uint256 _tokenId, TokenPositionParams[] calldata _children) internal { uint256 len = _children.length; for (uint256 i = 0; i < len;) { require(_childExists(_tokenId, _children[i].tokenAddress, _children[i].tokenId), "NounsComposer: compose query for nonexistent child"); _composeChild(_tokenId, _children[i].tokenAddress, _children[i].tokenId, _children[i].position1, _children[i].boundTop1, _children[i].boundLeft1); unchecked { i++; } } } function _composeChildBatch(uint256 _tokenId, TokenFullParams[] calldata _children) internal { uint256 len = _children.length; for (uint256 i = 0; i < len;) { require(_childExists(_tokenId, _children[i].tokenAddress, _children[i].tokenId), "NounsComposer: compose query for nonexistent child"); _composeChild(_tokenId, _children[i].tokenAddress, _children[i].tokenId, _children[i].position1, _children[i].boundTop1, _children[i].boundLeft1); unchecked { i++; } } } function _removeComposedChild(uint256 _tokenId, uint16 _position1) internal { ChildToken memory child = composedChildTokens[_tokenId][_position1]; delete composedChildTokens[_tokenId][_position1]; ChildTokenState memory childState = childTokenState[_tokenId][child.tokenAddress][child.tokenId]; childState.position1 = 0; childState.boundTop1 = 0; childState.boundLeft1 = 0; childTokenState[_tokenId][child.tokenAddress][child.tokenId] = childState; emit CompositionRemoved(_tokenId, child.tokenAddress, child.tokenId, _position1); } /* * Called by NounsComposableDescriptor * */ function getParts(uint256 _tokenId) external view returns (ISVGRenderer.Part[] memory) { //current configuration supports 16 composed items uint16 maxParts = 16; ISVGRenderer.Part[] memory parts = new ISVGRenderer.Part[](maxParts); for (uint16 i = 0; i < maxParts;) { ChildToken memory child = composedChildTokens[_tokenId][i + 1]; //position is a 1-based index if (child.tokenAddress != address(0)) { ISVGRenderer.Part memory part = IComposablePart(child.tokenAddress).getPart(child.tokenId); ChildTokenState memory childState = childTokenState[_tokenId][child.tokenAddress][child.tokenId]; if (childState.boundTop1 > 0) { uint8 boundTop1 = childState.boundTop1 - 1; //top is a 1-based index //shift the part's bounding box uint8 top = uint8(part.image[1]); uint8 bottom = uint8(part.image[3]); if (boundTop1 < top) { top -= (top - boundTop1); bottom -= (top - boundTop1); } else if (boundTop1 > top) { top += (boundTop1 - top); bottom += (boundTop1 - top); } part.image[1] = bytes1(top); part.image[3] = bytes1(bottom); } if (childState.boundLeft1 > 0) { uint8 boundLeft1 = childState.boundLeft1 - 1; //left is a 1-based index //shift the part's bounding box uint8 right = uint8(part.image[2]); uint8 left = uint8(part.image[4]); if (boundLeft1 < left) { right -= (left - boundLeft1); left -= (left - boundLeft1); } else if (boundLeft1 > left) { right += (boundLeft1 - left); left += (boundLeft1 - left); } part.image[2] = bytes1(right); part.image[4] = bytes1(left); } parts[i] = part; } unchecked { i++; } } return parts; } function hasParts(uint256 _tokenId) external view returns (bool) { //current configuration supports 16 composed items uint16 maxParts = 16; for (uint16 i = 0; i < maxParts;) { if (composedChildTokens[_tokenId][i + 1].tokenAddress != address(0)) { return true; } unchecked { i++; } } return false; } function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { address owner = nouns.ownerOf(tokenId); return (spender == owner || nouns.getApproved(tokenId) == spender || nouns.isApprovedForAll(owner, spender)); } function _childExists(uint256 _tokenId, address _childTokenAddress, uint256 _childTokenId) internal view returns (bool) { return childTokenState[_tokenId][_childTokenAddress][_childTokenId].balance > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC1155/utils/ERC1155Holder.sol) pragma solidity ^0.8.0; import "./ERC1155ReceiverUpgradeable.sol"; import "../../../proxy/utils/Initializable.sol"; /** * @dev _Available since v3.1._ */ contract ERC1155HolderUpgradeable is Initializable, ERC1155ReceiverUpgradeable { function __ERC1155Holder_init() internal initializer { __ERC165_init_unchained(); __ERC1155Receiver_init_unchained(); __ERC1155Holder_init_unchained(); } function __ERC1155Holder_init_unchained() internal initializer { } function onERC1155Received( address, address, uint256, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] memory, uint256[] memory, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.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); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: GPL-3.0 /// @title Interface for NounsToken /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░██░░░████░░██░░░████░░░ * * ░░██████░░░████████░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * *********************************/ pragma solidity ^0.8.6; import { IERC721 } from '@openzeppelin/contracts/token/ERC721/IERC721.sol'; import { INounsDescriptorMinimal } from './INounsDescriptorMinimal.sol'; import { INounsSeeder } from './INounsSeeder.sol'; interface INounsToken is IERC721 { event NounCreated(uint256 indexed tokenId, INounsSeeder.Seed seed); event NounBurned(uint256 indexed tokenId); event NoundersDAOUpdated(address noundersDAO); event MinterUpdated(address minter); event MinterLocked(); event DescriptorUpdated(INounsDescriptorMinimal descriptor); event DescriptorLocked(); event SeederUpdated(INounsSeeder seeder); event SeederLocked(); function mint() external returns (uint256); function burn(uint256 tokenId) external; function dataURI(uint256 tokenId) external returns (string memory); function setNoundersDAO(address noundersDAO) external; function setMinter(address minter) external; function lockMinter() external; function setDescriptor(INounsDescriptorMinimal descriptor) external; function lockDescriptor() external; function setSeeder(INounsSeeder seeder) external; function lockSeeder() external; }
// SPDX-License-Identifier: GPL-3.0 /// @title Interface for SVGRenderer /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░██░░░████░░██░░░████░░░ * * ░░██████░░░████████░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * *********************************/ pragma solidity ^0.8.6; interface ISVGRenderer { struct Part { bytes image; bytes palette; } struct SVGParams { Part[] parts; string background; } function generateSVG(SVGParams memory params) external view returns (string memory svg); function generateSVGPart(Part memory part) external view returns (string memory partialSVG); function generateSVGParts(Part[] memory parts) external view returns (string memory partialSVG); }
// SPDX-License-Identifier: GPL-3.0 /// @title Interface for Nouns Composer /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░██░░░████░░██░░░████░░░ * * ░░██████░░░████████░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * *********************************/ pragma solidity ^0.8.6; import { ISVGRenderer } from '../../../interfaces/ISVGRenderer.sol'; interface INounsComposer { struct ChildToken { address tokenAddress; uint256 tokenId; } struct ChildTokenState { uint256 balance; uint64 index; uint16 position1; //position is a 1-based index uint8 boundTop1; //top is a 1-based index uint8 boundLeft1; //left is a 1-based index } struct TokenTransferParams { address tokenAddress; uint256 tokenId; uint256 amount; } struct TokenPositionParams { address tokenAddress; uint256 tokenId; uint16 position1; //position is a 1-based index uint8 boundTop1; //top is a 1-based index uint8 boundLeft1; //left is a 1-based index } struct TokenFullParams { address tokenAddress; uint256 tokenId; uint256 amount; uint16 position1; //position is a 1-based index uint8 boundTop1; //top is a 1-based index uint8 boundLeft1; //left is a 1-based index } event ChildReceived(uint256 indexed tokenId, address indexed from, address indexed childTokenAddress, uint256 childTokenId, uint256 amount); event ChildTransferred(uint256 indexed tokenId, address indexed to, address indexed childTokenAddress, uint256 childTokenId, uint256 amount); event CompositionAdded(uint256 indexed tokenId, address indexed childTokenAddress, uint256 indexed childTokenId, uint16 position1, uint8 boundTop1, uint8 boundLeft1); event CompositionRemoved(uint256 indexed tokenId, address indexed childTokenAddress, uint256 indexed childTokenId, uint16 position1); function getChildContracts(uint256 _tokenId) external view returns (address[] memory); function getChildTokens(uint256 _tokenId, address _childTokenAddress) external view returns (uint256[] memory); function getChildContractCount(uint256 _tokenId) external view returns (uint256); function getChildTokenCount(uint256 _tokenId, address _childTokenAddress) external view returns (uint256); function getChildTokenState(uint256 _tokenId, address _childTokenAddress, uint256 _childTokenId) external view returns (ChildTokenState memory); function getChildTokenStateBatch(uint256 _tokenId, address[] calldata _childTokenAddresses, uint256[] calldata _childTokenIds) external view returns (ChildTokenState[] memory); function getComposedChild(uint256 tokenId, uint16 position1) external view returns (ChildToken memory); function getComposedChildBatch(uint256 _tokenId, uint16 _position1Start, uint16 _position1End) external view returns (ChildToken[] memory); function childExists(uint256 _tokenId, address _childTokenAddress, uint256 _childTokenId) external view returns (bool); function receiveChild(uint256 _tokenId, TokenTransferParams calldata _child) external; function receiveChildBatch(uint256 _tokenId, TokenTransferParams[] calldata _children) external; function receiveAndComposeChild(uint256 _tokenId, TokenFullParams calldata _child) external; function receiveAndComposeChildBatch(uint256 _tokenId, TokenFullParams[] calldata _children) external; function receiveAndComposeChildBatchMixed(uint256 _tokenId, TokenTransferParams[] calldata _childrenReceive, TokenPositionParams[] calldata _childrenCompose) external; function transferChild(uint256 _tokenId, address _to, TokenTransferParams calldata _child) external; function transferChildBatch(uint256 _tokenId, address _to, TokenTransferParams[] calldata _children) external; function composeChild(uint256 _tokenId, TokenPositionParams calldata _child) external; function composeChildBatch(uint256 _tokenId, TokenPositionParams[] calldata _children) external; function removeComposedChild(uint256 _tokenId, uint16 _position1) external; function removeComposedChildBatch(uint256 _tokenId, uint16[] calldata _position1s) external; function getParts(uint256 _tokenId) external view returns (ISVGRenderer.Part[] memory); function hasParts(uint256 _tokenId) external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0 /// @title Interface for a Composable Part /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░██░░░████░░██░░░████░░░ * * ░░██████░░░████████░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * *********************************/ pragma solidity ^0.8.6; import { ISVGRenderer } from '../../../interfaces/ISVGRenderer.sol'; interface IComposablePart { function getPart(uint256 tokenId) external view returns (ISVGRenderer.Part memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; /** * @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 a proxied contract can't have 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. * * 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] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC1155/utils/ERC1155Receiver.sol) pragma solidity ^0.8.0; import "../IERC1155ReceiverUpgradeable.sol"; import "../../../utils/introspection/ERC165Upgradeable.sol"; import "../../../proxy/utils/Initializable.sol"; /** * @dev _Available since v3.1._ */ abstract contract ERC1155ReceiverUpgradeable is Initializable, ERC165Upgradeable, IERC1155ReceiverUpgradeable { function __ERC1155Receiver_init() internal initializer { __ERC165_init_unchained(); __ERC1155Receiver_init_unchained(); } function __ERC1155Receiver_init_unchained() internal initializer { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId || super.supportsInterface(interfaceId); } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal initializer { __ERC165_init_unchained(); } function __ERC165_init_unchained() internal initializer { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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 IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0 /// @title Common interface for NounsDescriptor versions, as used by NounsToken and NounsSeeder. /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░██░░░████░░██░░░████░░░ * * ░░██████░░░████████░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * *********************************/ pragma solidity ^0.8.6; import { INounsSeeder } from './INounsSeeder.sol'; interface INounsDescriptorMinimal { /// /// USED BY TOKEN /// function tokenURI(uint256 tokenId, INounsSeeder.Seed memory seed) external view returns (string memory); function dataURI(uint256 tokenId, INounsSeeder.Seed memory seed) external view returns (string memory); /// /// USED BY SEEDER /// function backgroundCount() external view returns (uint256); function bodyCount() external view returns (uint256); function accessoryCount() external view returns (uint256); function headCount() external view returns (uint256); function glassesCount() external view returns (uint256); }
// SPDX-License-Identifier: GPL-3.0 /// @title Interface for NounsSeeder /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░██░░░████░░██░░░████░░░ * * ░░██████░░░████████░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░██░░██░░░████░░██░░░████░░░ * * ░░░░░░█████████░░█████████░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * *********************************/ pragma solidity ^0.8.6; import { INounsDescriptorMinimal } from './INounsDescriptorMinimal.sol'; interface INounsSeeder { struct Seed { uint48 background; uint48 body; uint48 accessory; uint48 head; uint48 glasses; } function generateSeed(uint256 nounId, INounsDescriptorMinimal descriptor) external view returns (Seed memory); }
{ "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"childTokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"childTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ChildReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"childTokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"childTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ChildTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"childTokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"childTokenId","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"position1","type":"uint16"},{"indexed":false,"internalType":"uint8","name":"boundTop1","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"boundLeft1","type":"uint8"}],"name":"CompositionAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"childTokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"childTokenId","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"position1","type":"uint16"}],"name":"CompositionRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"childContractIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"childContracts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_childTokenAddress","type":"address"},{"internalType":"uint256","name":"_childTokenId","type":"uint256"}],"name":"childExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"childTokenState","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint64","name":"index","type":"uint64"},{"internalType":"uint16","name":"position1","type":"uint16"},{"internalType":"uint8","name":"boundTop1","type":"uint8"},{"internalType":"uint8","name":"boundLeft1","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"childTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint16","name":"position1","type":"uint16"},{"internalType":"uint8","name":"boundTop1","type":"uint8"},{"internalType":"uint8","name":"boundLeft1","type":"uint8"}],"internalType":"struct INounsComposer.TokenPositionParams","name":"_child","type":"tuple"}],"name":"composeChild","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint16","name":"position1","type":"uint16"},{"internalType":"uint8","name":"boundTop1","type":"uint8"},{"internalType":"uint8","name":"boundLeft1","type":"uint8"}],"internalType":"struct INounsComposer.TokenPositionParams[]","name":"_children","type":"tuple[]"}],"name":"composeChildBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"composedChildTokens","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getChildContractCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getChildContracts","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_childTokenAddress","type":"address"}],"name":"getChildTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_childTokenAddress","type":"address"},{"internalType":"uint256","name":"_childTokenId","type":"uint256"}],"name":"getChildTokenState","outputs":[{"components":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint64","name":"index","type":"uint64"},{"internalType":"uint16","name":"position1","type":"uint16"},{"internalType":"uint8","name":"boundTop1","type":"uint8"},{"internalType":"uint8","name":"boundLeft1","type":"uint8"}],"internalType":"struct INounsComposer.ChildTokenState","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address[]","name":"_childTokenAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_childTokenIds","type":"uint256[]"}],"name":"getChildTokenStateBatch","outputs":[{"components":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint64","name":"index","type":"uint64"},{"internalType":"uint16","name":"position1","type":"uint16"},{"internalType":"uint8","name":"boundTop1","type":"uint8"},{"internalType":"uint8","name":"boundLeft1","type":"uint8"}],"internalType":"struct INounsComposer.ChildTokenState[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_childTokenAddress","type":"address"}],"name":"getChildTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint16","name":"_position1","type":"uint16"}],"name":"getComposedChild","outputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct INounsComposer.ChildToken","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint16","name":"_position1Start","type":"uint16"},{"internalType":"uint16","name":"_position1End","type":"uint16"}],"name":"getComposedChildBatch","outputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct INounsComposer.ChildToken[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getParts","outputs":[{"components":[{"internalType":"bytes","name":"image","type":"bytes"},{"internalType":"bytes","name":"palette","type":"bytes"}],"internalType":"struct ISVGRenderer.Part[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"hasParts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract INounsToken","name":"_nouns","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nouns","outputs":[{"internalType":"contract INounsToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint16","name":"position1","type":"uint16"},{"internalType":"uint8","name":"boundTop1","type":"uint8"},{"internalType":"uint8","name":"boundLeft1","type":"uint8"}],"internalType":"struct INounsComposer.TokenFullParams","name":"_child","type":"tuple"}],"name":"receiveAndComposeChild","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint16","name":"position1","type":"uint16"},{"internalType":"uint8","name":"boundTop1","type":"uint8"},{"internalType":"uint8","name":"boundLeft1","type":"uint8"}],"internalType":"struct INounsComposer.TokenFullParams[]","name":"_children","type":"tuple[]"}],"name":"receiveAndComposeChildBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct INounsComposer.TokenTransferParams[]","name":"_childrenReceive","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint16","name":"position1","type":"uint16"},{"internalType":"uint8","name":"boundTop1","type":"uint8"},{"internalType":"uint8","name":"boundLeft1","type":"uint8"}],"internalType":"struct INounsComposer.TokenPositionParams[]","name":"_childrenCompose","type":"tuple[]"}],"name":"receiveAndComposeChildBatchMixed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct INounsComposer.TokenTransferParams","name":"_child","type":"tuple"}],"name":"receiveChild","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct INounsComposer.TokenTransferParams[]","name":"_children","type":"tuple[]"}],"name":"receiveChildBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint16","name":"_position1","type":"uint16"}],"name":"removeComposedChild","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint16[]","name":"_position1s","type":"uint16[]"}],"name":"removeComposedChildBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct INounsComposer.TokenTransferParams","name":"_child","type":"tuple"}],"name":"transferChild","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct INounsComposer.TokenTransferParams[]","name":"_children","type":"tuple[]"}],"name":"transferChildBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50614df0806100206000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c80639eaddb3111610145578063c9bf5985116100bd578063efcddfac1161008c578063f2fde38b11610071578063f2fde38b146107e7578063f3df547d146107fa578063f7478ce81461080d57600080fd5b8063efcddfac1461079c578063f23a6e61146107af57600080fd5b8063c9bf59851461071f578063d6e94cf214610732578063dfa6151014610752578063ef3655391461078957600080fd5b8063bc197c8111610114578063c4a85029116100f9578063c4a85029146106d9578063c4d66de8146106ec578063c5d57fd8146106ff57600080fd5b8063bc197c811461065d578063bd3f6b94146106c657600080fd5b80639eaddb3114610611578063a2363b6b14610624578063a8fa47d414610637578063af9c04451461064a57600080fd5b80633030ed9c116101d85780637bc972bf116101a7578063988e00881161018c578063988e0088146105265780639a5e4a58146105925780639e28236a146105b357600080fd5b80637bc972bf146105025780638da5cb5b1461051557600080fd5b80633030ed9c1461049a578063512937b6146104d45780635f5fdeec146104e7578063715018a6146104fa57600080fd5b80631f3a8d05116102145780631f3a8d051461035957806322ec0b191461036c57806328f365711461038c5780632de45f181461046e57600080fd5b806301ffc9a71461024657806306b22e521461026e57806311bd666114610283578063167dcd16146102a3575b600080fd5b610259610254366004613fee565b61082d565b60405190151581526020015b60405180910390f35b61028161027c366004614083565b6108c6565b005b6102966102913660046140cf565b6109b4565b60405161026591906140e8565b61031c6102b136600461414a565b6101326020908152600093845260408085208252928452828420905282529020805460019091015467ffffffffffffffff81169061ffff680100000000000000008204169060ff6a010000000000000000000082048116916b01000000000000000000000090041685565b6040805195865267ffffffffffffffff909416602086015261ffff9092169284019290925260ff918216606084015216608082015260a001610265565b610281610367366004614182565b610a21565b61037f61037a3660046141f5565b610bfb565b6040516102659190614231565b61046161039a36600461414a565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506000838152610132602090815260408083206001600160a01b03861684528252808320848452825291829020825160a0810184528154815260019091015467ffffffffffffffff81169282019290925261ffff680100000000000000008304169281019290925260ff6a01000000000000000000008204811660608401526b0100000000000000000000009091041660808201529392505050565b6040516102659190614291565b61012d54610482906001600160a01b031681565b6040516001600160a01b039091168152602001610265565b6104c66104a83660046142de565b61013160209081526000928352604080842090915290825290205481565b604051908152602001610265565b6102816104e2366004614353565b610d95565b6102816104f53660046143d7565b610f23565b610281611018565b61025961051036600461414a565b61107e565b60fb546001600160a01b0316610482565b610585610534366004614451565b6040805180820182526000808252602091820181905293845261012e815281842061ffff93909316845291825291829020825180840190935280546001600160a01b03168352600101549082015290565b604051610265919061447d565b6104c66105a03660046140cf565b600090815261012f602052604090205490565b6105f26105c1366004614451565b61012e602090815260009283526040808420909152908252902080546001909101546001600160a01b039091169082565b604080516001600160a01b039093168352602083019190915201610265565b61025961061f3660046140cf565b6110b5565b61028161063236600461449d565b611125565b6102816106453660046144dc565b6111b0565b610281610658366004614451565b611298565b61069561066b3660046146b9565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610265565b6102816106d4366004614767565b6113bd565b6104826106e736600461479f565b611503565b6102816106fa3660046147c1565b61153c565b61071261070d3660046140cf565b61165f565b604051610265919061483a565b61028161072d3660046148f5565b611b66565b6107456107403660046142de565b611cd5565b604051610265919061492b565b6104c66107603660046142de565b6000918252610130602090815260408084206001600160a01b0393909316845291905290205490565b610281610797366004614963565b611d4a565b6104c66107aa36600461414a565b611ec5565b6106956107bd36600461498d565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b6102816107f53660046147c1565b611f04565b6102816108083660046149f6565b611fe6565b61082061081b366004614a1a565b6120c9565b6040516102659190614a83565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806108c057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60026097540361091d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b600260975561092d335b84612290565b61099f5760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b6109aa838383612463565b5050600160975550565b600081815261012f6020908152604091829020805483518184028101840190945280845260609392830182828015610a1557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f7575b50505050509050919050565b600260975403610a735760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610914565b6002609755610a823385612290565b610af45760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b6001600160a01b038316610b705760405162461bcd60e51b815260206004820152602b60248201527f4e6f756e73436f6d706f7365723a207472616e7366657220746f20746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610914565b8060005b81811015610bee57610be68686868685818110610b9357610b93614b04565b610ba992602060609092020190810191506147c1565b878786818110610bbb57610bbb614b04565b90506060020160200135888887818110610bd757610bd7614b04565b905060600201604001356124e0565b600101610b74565b5050600160975550505050565b60608261ffff168261ffff1611610c7a5760405162461bcd60e51b815260206004820152602560248201527f4e6f756e73436f6d706f7365723a20696e76616c696420706f736974696f6e2060448201527f72616e67650000000000000000000000000000000000000000000000000000006064820152608401610914565b6000610c868484614b62565b610c91906001614b85565b905060008161ffff1667ffffffffffffffff811115610cb257610cb261455b565b604051908082528060200260200182016040528015610cf757816020015b6040805180820190915260008082526020820152815260200190600190039081610cd05790505b50905060005b8261ffff168161ffff161015610d8b57600087815261012e6020526040812090610d278389614b85565b61ffff90811682526020808301939093526040918201600020825180840190935280546001600160a01b031683526001015492820192909252835190918491908416908110610d7857610d78614b04565b6020908102919091010152600101610cfd565b5095945050505050565b610d9e33610927565b610e105760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b8060005b81811015610f1c57600085815261012e6020526040812081868685818110610e3e57610e3e614b04565b9050602002016020810190610e539190614bab565b61ffff1681526020810191909152604001600020546001600160a01b031603610ee45760405162461bcd60e51b815260206004820152603260248201527f4e6f756e73436f6d706f7365723a20636f6d706f736520717565727920666f7260448201527f206e6f6e6578697374656e74206368696c6400000000000000000000000000006064820152608401610914565b610f1485858584818110610efa57610efa614b04565b9050602002016020810190610f0f9190614bab565b612a37565b600101610e14565b5050505050565b600260975403610f755760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610914565b6002609755610f843386612290565b610ff65760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b611001858585612463565b61100c858383612d7b565b50506001609755505050565b60fb546001600160a01b031633146110725760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610914565b61107c6000612f41565b565b6000838152610132602090815260408083206001600160a01b0386168452825280832084845290915281205415155b949350505050565b60006010815b8161ffff168161ffff16101561111b57600084815261012e60205260408120816110e6846001614b85565b61ffff1681526020810191909152604001600020546001600160a01b031614611113575060019392505050565b6001016110bb565b5060009392505050565b61112e33610927565b6111a05760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b6111ab838383612d7b565b505050565b6002609754036112025760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610914565b600260975561121033610927565b6112825760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b61128d838383612fab565b6109aa838383613028565b6112a3335b83612290565b6113155760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b600082815261012e6020908152604080832061ffff851684529091529020546001600160a01b03166113af5760405162461bcd60e51b815260206004820152603260248201527f4e6f756e73436f6d706f7365723a20636f6d706f736520717565727920666f7260448201527f206e6f6e6578697374656e74206368696c6400000000000000000000000000006064820152608401610914565b6113b98282612a37565b5050565b60026097540361140f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610914565b600260975561141d3361129d565b61148f5760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b6114af826114a060208401846147c1565b836020013584604001356131ee565b6114fa826114c060208401846147c1565b60208401356114d56080860160608701614bab565b6114e560a0870160808801614bc6565b6114f560c0880160a08901614bc6565b6134a1565b50506001609755565b61012f602052816000526040600020818154811061152057600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff1680611555575060005460ff16155b6115c75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610914565b600054610100900460ff161580156115e9576000805461ffff19166101011790555b6115f16137bf565b6115f96138a5565b61012d80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841617905580156113b957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050565b60408051601080825261022082019092526060919060009082816020015b604080518082019091526060808252602082015281526020019060019003908161167d57905050905060005b8261ffff168161ffff161015611b5e57600085815261012e60205260408120816116d4846001614b85565b61ffff1681526020808201929092526040908101600020815180830190925280546001600160a01b031680835260019091015492820192909252915015611b5557805160208201516040517f304fe35000000000000000000000000000000000000000000000000000000000815260048101919091526000916001600160a01b03169063304fe35090602401600060405180830381865afa15801561177d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117a59190810190614c2e565b60008881526101326020908152604080832086516001600160a01b031684528252808320868301518452825291829020825160a0810184528154815260019091015467ffffffffffffffff81169282019290925261ffff680100000000000000008304169281019290925260ff6a010000000000000000000082048116606084018190526b01000000000000000000000090920416608083015291925090156119b75760006001826060015161185b9190614cd5565b90506000836000015160018151811061187657611876614b04565b01602001518451805160f89290921c9250600091600390811061189b5761189b614b04565b016020015160f81c905060ff82811690841610156118e4576118bd8383614cd5565b6118c79083614cd5565b91506118d38383614cd5565b6118dd9082614cd5565b905061191f565b8160ff168360ff16111561191f576118fc8284614cd5565b6119069083614cf8565b91506119128284614cd5565b61191c9082614cf8565b90505b8160f81b856000015160018151811061193a5761193a614b04565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060f81b856000015160038151811061198457611984614b04565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505050505b608081015160ff1615611b30576000600182608001516119d79190614cd5565b9050600083600001516002815181106119f2576119f2614b04565b01602001518451805160f89290921c92506000916004908110611a1757611a17614b04565b016020015160f81c905060ff8316811115611a5d57611a368382614cd5565b611a409083614cd5565b9150611a4c8382614cd5565b611a569082614cd5565b9050611a98565b8060ff168360ff161115611a9857611a758184614cd5565b611a7f9083614cf8565b9150611a8b8184614cd5565b611a959082614cf8565b90505b8160f81b8560000151600281518110611ab357611ab3614b04565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060f81b8560000151600481518110611afd57611afd614b04565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505050505b81858561ffff1681518110611b4757611b47614b04565b602002602001018190525050505b506001016116a9565b509392505050565b600260975403611bb85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610914565b6002609755611bc633610927565b611c385760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b6001600160a01b038216611cb45760405162461bcd60e51b815260206004820152602b60248201527f4e6f756e73436f6d706f7365723a207472616e7366657220746f20746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610914565b6109aa8383611cc660208501856147c1565b846020013585604001356124e0565b6000828152610130602090815260408083206001600160a01b0385168452825291829020805483518184028101840190945280845260609392830182828015611d3d57602002820191906000526020600020905b815481526020019060010190808311611d29575b5050505050905092915050565b611d533361129d565b611dc55760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b611e0d82611dd660208401846147c1565b83602001356000928352610132602090815260408085206001600160a01b0394909416855292815282842091845252902054151590565b611e7f5760405162461bcd60e51b815260206004820152603260248201527f4e6f756e73436f6d706f7365723a20636f6d706f736520717565727920666f7260448201527f206e6f6e6578697374656e74206368696c6400000000000000000000000000006064820152608401610914565b6113b982611e9060208401846147c1565b6020840135611ea56060860160408701614bab565b611eb56080870160608801614bc6565b6114f560a0880160808901614bc6565b6101306020528260005260406000206020528160005260406000208181548110611eee57600080fd5b9060005260206000200160009250925050505481565b60fb546001600160a01b03163314611f5e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610914565b6001600160a01b038116611fda5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610914565b611fe381612f41565b50565b6002609754036120385760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610914565b60026097556120463361129d565b6120b85760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b6114fa826114a060208401846147c1565b60608360008167ffffffffffffffff8111156120e7576120e761455b565b60405190808252806020026020018201604052801561215e57816020015b6040805160a0810182526000808252602080830182905292820181905260608201819052608082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816121055790505b50905060005b82811015612284576000898152610132602052604081209089898481811061218e5761218e614b04565b90506020020160208101906121a391906147c1565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008787848181106121d7576121d7614b04565b60209081029290920135835250818101929092526040908101600020815160a0810183528154815260019091015467ffffffffffffffff81169382019390935261ffff680100000000000000008404169181019190915260ff6a01000000000000000000008304811660608301526b0100000000000000000000009092049091166080820152825183908390811061227157612271614b04565b6020908102919091010152600101612164565b50979650505050505050565b61012d546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810183905260009182916001600160a01b0390911690636352211e90602401602060405180830381865afa1580156122f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231c9190614d1d565b9050806001600160a01b0316846001600160a01b031614806123cd575061012d546040517f081812fc000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b0386811692169063081812fc90602401602060405180830381865afa15801561239e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c29190614d1d565b6001600160a01b0316145b806110ad575061012d546040517fe985e9c50000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015286811660248301529091169063e985e9c590604401602060405180830381865afa15801561243f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ad9190614d3a565b8060005b81811015610f1c576124d88585858481811061248557612485614b04565b61249b92602060609092020190810191506147c1565b8686858181106124ad576124ad614b04565b905060600201602001358787868181106124c9576124c9614b04565b905060600201604001356131ee565b600101612467565b6000858152610132602090815260408083206001600160a01b03871684528252808320858452825291829020825160a081018452815480825260019092015467ffffffffffffffff811693820184905261ffff680100000000000000008204169482019490945260ff6a01000000000000000000008504811660608301526b01000000000000000000000090940490931660808401528311156125eb5760405162461bcd60e51b815260206004820152603060248201527f4e6f756e73436f6d706f7365723a20696e73756666696369656e742062616c6160448201527f6e636520666f72207472616e73666572000000000000000000000000000000006064820152608401610914565b604082015161ffff161561260757612607878360400151612a37565b81516000888152610132602090815260408083206001600160a01b038a1684528252808320888452909152812091859003918290558190036129c9576000888152610130602090815260408083206001600160a01b038a16845290915281205461267390600190614d5c565b60008a8152610130602090815260408083206001600160a01b038c168452909152812080549293509091839081106126ad576126ad614b04565b906000526020600020015490508087146127665760008a8152610130602090815260408083206001600160a01b038c16845290915290208054829190869081106126f9576126f9614b04565b6000918252602080832091909101929092558b8152610132825260408082206001600160a01b038c16835283528082208483529092522060010180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86161790555b60008a8152610130602090815260408083206001600160a01b038c168452909152902080548061279857612798614d73565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081018390559092019092558b8252610132815260408083206001600160a01b038c16845282528083208a8452909152812081815560010180547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690558290036129c65760008a815261012f602052604081205461284690600190614d5c565b60008c815261012f60205260408120805492935090918390811061286c5761286c614b04565b6000918252602090912001546001600160a01b0390811691508a16811461292a5760008c8152610131602090815260408083206001600160a01b038e1684528252808320548f845261012f9092529091208054839190839081106128d2576128d2614b04565b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039485161790558f825261013181526040808320938616835292905220555b60008c815261012f6020526040902080548061294857612948614d73565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559092019092558d8252610131815260408083206001600160a01b038e16845290915281205550505b50505b6129d63088888888613962565b856001600160a01b0316876001600160a01b0316897f389ff528894938684df5b82afec158e6353447d0537d3843c472997aa38186838888604051612a25929190918252602082015260400190565b60405180910390a45050505050505050565b600061012e600084815260200190815260200160002060008361ffff1661ffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182015481525050905061012e600084815260200190815260200160002060008361ffff1661ffff168152602001908152602001600020600080820160006101000a8154906001600160a01b0302191690556001820160009055505060006101326000858152602001908152602001600020600083600001516001600160a01b03166001600160a01b031681526020019081526020016000206000836020015181526020019081526020016000206040518060a0016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900461ffff1661ffff1661ffff16815260200160018201600a9054906101000a900460ff1660ff1660ff16815260200160018201600b9054906101000a900460ff1660ff1660ff168152505090506000816040019061ffff16908161ffff16815250506000816060019060ff16908160ff16815250506000816080019060ff16908160ff1681525050806101326000868152602001908152602001600020600084600001516001600160a01b03166001600160a01b031681526020019081526020016000206000846020015181526020019081526020016000206000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548161ffff021916908361ffff160217905550606082015181600101600a6101000a81548160ff021916908360ff160217905550608082015181600101600b6101000a81548160ff021916908360ff160217905550905050816020015182600001516001600160a01b0316857fa7e63e17bfdc4d4104d4912e5b3af22af014c7844058bc7d5bb2a4f2fe209e8286604051612d6d919061ffff91909116815260200190565b60405180910390a450505050565b8060005b81811015610f1c57612e0185858584818110612d9d57612d9d614b04565b612db392602060a09092020190810191506147c1565b868685818110612dc557612dc5614b04565b905060a00201602001356000928352610132602090815260408085206001600160a01b0394909416855292815282842091845252902054151590565b612e735760405162461bcd60e51b815260206004820152603260248201527f4e6f756e73436f6d706f7365723a20636f6d706f736520717565727920666f7260448201527f206e6f6e6578697374656e74206368696c6400000000000000000000000000006064820152608401610914565b612f3985858584818110612e8957612e89614b04565b612e9f92602060a09092020190810191506147c1565b868685818110612eb157612eb1614b04565b905060a0020160200135878786818110612ecd57612ecd614b04565b905060a002016040016020810190612ee59190614bab565b888887818110612ef757612ef7614b04565b905060a002016060016020810190612f0f9190614bc6565b898988818110612f2157612f21614b04565b905060a0020160800160208101906114f59190614bc6565b600101612d7f565b60fb80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8060005b81811015610f1c5761302085858584818110612fcd57612fcd614b04565b612fe392602060c09092020190810191506147c1565b868685818110612ff557612ff5614b04565b905060c002016020013587878681811061301157613011614b04565b905060c00201604001356131ee565b600101612faf565b8060005b81811015610f1c576130ae8585858481811061304a5761304a614b04565b61306092602060c09092020190810191506147c1565b86868581811061307257613072614b04565b905060c00201602001356000928352610132602090815260408085206001600160a01b0394909416855292815282842091845252902054151590565b6131205760405162461bcd60e51b815260206004820152603260248201527f4e6f756e73436f6d706f7365723a20636f6d706f736520717565727920666f7260448201527f206e6f6e6578697374656e74206368696c6400000000000000000000000000006064820152608401610914565b6131e68585858481811061313657613136614b04565b61314c92602060c09092020190810191506147c1565b86868581811061315e5761315e614b04565b905060c002016020013587878681811061317a5761317a614b04565b905060c0020160600160208101906131929190614bab565b8888878181106131a4576131a4614b04565b905060c0020160800160208101906131bc9190614bc6565b8989888181106131ce576131ce614b04565b905060c0020160a00160208101906114f59190614bc6565b60010161302c565b6000848152610130602090815260408083206001600160a01b03871684529091528120549081900361328457600085815261012f60208181526040808420805461013184528286206001600160a01b038b16808852908552928620819055938352600184018155845292200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690911790555b6000858152610132602090815260408083206001600160a01b0388168452825280832086845290915281205490819003613403576040805160a08101825284815267ffffffffffffffff8481166020808401918252600084860181815260608601828152608087018381528e845261013285528884206001600160a01b038f168086529086528985208e8652865289852098518955955160019889018054945193519251919098167fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000909416939093176801000000000000000061ffff90931692909202919091177fffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffff166a010000000000000000000060ff928316027fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff16176b0100000000000000000000009190921602179093558a835261013081528483209183529081529281208054928301815581529190912001849055613444565b6000868152610132602090815260408083206001600160a01b038916845282528083208784529091528120805485929061343e908490614da2565b90915550505b6134513330878787613962565b60408051858152602081018590526001600160a01b03871691339189917f3a6c712121b766145eded1fd33f9b326a67bf83849a720ad70ee3756972b04e2910160405180910390a4505050505050565b6000868152610132602090815260408083206001600160a01b03891684528252808320878452825291829020825160a0810184528154815260019091015467ffffffffffffffff81169282019290925261ffff6801000000000000000083041692810183905260ff6a01000000000000000000008304811660608301526b0100000000000000000000009092049091166080820152901580159061355157508361ffff16816040015161ffff1614155b1561356457613564878260400151612a37565b8361ffff1660000361357657506137b7565b600087815261012e6020908152604080832061ffff881684529091529020546001600160a01b0316156135ad576135ad8785612a37565b6040518060400160405280876001600160a01b031681526020018681525061012e600089815260200190815260200160002060008661ffff1661ffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015590505083816040019061ffff16908161ffff168152505082816060019060ff16908160ff168152505081816080019060ff16908160ff16815250508061013260008981526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008781526020019081526020016000206000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548161ffff021916908361ffff160217905550606082015181600101600a6101000a81548160ff021916908360ff160217905550608082015181600101600b6101000a81548160ff021916908360ff16021790555090505084866001600160a01b0316887fe632604ba8a0d64c57c5661270eba360bb0d2852bc5a41f205784b0ea57c42b68787876040516137ad9392919061ffff93909316835260ff918216602084015216604082015260600190565b60405180910390a4505b505050505050565b600054610100900460ff16806137d8575060005460ff16155b61384a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610914565b600054610100900460ff1615801561386c576000805461ffff19166101011790555b613874613d78565b8015611fe357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff16806138be575060005460ff16155b6139305760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610914565b600054610100900460ff16158015613952576000805461ffff19166101011790555b61395a613e5b565b613874613f38565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fd9b67a2600000000000000000000000000000000000000000000000000000000600482015283906001600160a01b038216906301ffc9a790602401602060405180830381865afa1580156139e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a059190614d3a565b15613ace576040517ff242432a0000000000000000000000000000000000000000000000000000000081526001600160a01b0387811660048301528681166024830152604482018590526064820184905260a06084830152600360a48301527f307830000000000000000000000000000000000000000000000000000000000060c483015285169063f242432a9060e4015b600060405180830381600087803b158015613ab157600080fd5b505af1158015613ac5573d6000803e3d6000fd5b505050506137b7565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f36372b070000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015613b4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b6f9190614d3a565b15613c0e576040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0387811660048301528681166024830152604482018490528516906323b872dd906064016020604051808303816000875af1158015613be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c089190614d3a565b506137b7565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015613c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613caf9190614d3a565b15613d0a576040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0387811660048301528681166024830152604482018590528516906323b872dd90606401613a97565b60405162461bcd60e51b815260206004820152602560248201527f4e6f756e73436f6d706f7365723a20756e737570706f7274656420746f6b656e60448201527f20747970650000000000000000000000000000000000000000000000000000006064820152608401610914565b600054610100900460ff1680613d91575060005460ff16155b613e035760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610914565b600054610100900460ff16158015613e25576000805461ffff19166101011790555b60016097558015611fe357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680613e74575060005460ff16155b613ee65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610914565b600054610100900460ff16158015613874576000805461ffff19166101011790558015611fe357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680613f51575060005460ff16155b613fc35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610914565b600054610100900460ff16158015613fe5576000805461ffff19166101011790555b61387433612f41565b60006020828403121561400057600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461403057600080fd5b9392505050565b60008083601f84011261404957600080fd5b50813567ffffffffffffffff81111561406157600080fd5b60208301915083602060608302850101111561407c57600080fd5b9250929050565b60008060006040848603121561409857600080fd5b83359250602084013567ffffffffffffffff8111156140b657600080fd5b6140c286828701614037565b9497909650939450505050565b6000602082840312156140e157600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156141295783516001600160a01b031683529284019291840191600101614104565b50909695505050505050565b6001600160a01b0381168114611fe357600080fd5b60008060006060848603121561415f57600080fd5b83359250602084013561417181614135565b929592945050506040919091013590565b6000806000806060858703121561419857600080fd5b8435935060208501356141aa81614135565b9250604085013567ffffffffffffffff8111156141c657600080fd5b6141d287828801614037565b95989497509550505050565b803561ffff811681146141f057600080fd5b919050565b60008060006060848603121561420a57600080fd5b8335925061421a602085016141de565b9150614228604085016141de565b90509250925092565b602080825282518282018190526000919060409081850190868401855b828110156142845761427484835180516001600160a01b03168252602090810151910152565b928401929085019060010161424e565b5091979650505050505050565b60a081016108c082848051825267ffffffffffffffff602082015116602083015261ffff604082015116604083015260ff606082015116606083015260ff60808201511660808301525050565b600080604083850312156142f157600080fd5b82359150602083013561430381614135565b809150509250929050565b60008083601f84011261432057600080fd5b50813567ffffffffffffffff81111561433857600080fd5b6020830191508360208260051b850101111561407c57600080fd5b60008060006040848603121561436857600080fd5b83359250602084013567ffffffffffffffff81111561438657600080fd5b6140c28682870161430e565b60008083601f8401126143a457600080fd5b50813567ffffffffffffffff8111156143bc57600080fd5b60208301915083602060a08302850101111561407c57600080fd5b6000806000806000606086880312156143ef57600080fd5b85359450602086013567ffffffffffffffff8082111561440e57600080fd5b61441a89838a01614037565b9096509450604088013591508082111561443357600080fd5b5061444088828901614392565b969995985093965092949392505050565b6000806040838503121561446457600080fd5b82359150614474602084016141de565b90509250929050565b81516001600160a01b0316815260208083015190820152604081016108c0565b6000806000604084860312156144b257600080fd5b83359250602084013567ffffffffffffffff8111156144d057600080fd5b6140c286828701614392565b6000806000604084860312156144f157600080fd5b83359250602084013567ffffffffffffffff8082111561451057600080fd5b818601915086601f83011261452457600080fd5b81358181111561453357600080fd5b87602060c08302850101111561454857600080fd5b6020830194508093505050509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156145b3576145b361455b565b604052919050565b600082601f8301126145cc57600080fd5b8135602067ffffffffffffffff8211156145e8576145e861455b565b8160051b6145f782820161458a565b928352848101820192828101908785111561461157600080fd5b83870192505b8483101561463057823582529183019190830190614617565b979650505050505050565b600067ffffffffffffffff8211156146555761465561455b565b50601f01601f191660200190565b600082601f83011261467457600080fd5b81356146876146828261463b565b61458a565b81815284602083860101111561469c57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156146d157600080fd5b85356146dc81614135565b945060208601356146ec81614135565b9350604086013567ffffffffffffffff8082111561470957600080fd5b61471589838a016145bb565b9450606088013591508082111561472b57600080fd5b61473789838a016145bb565b9350608088013591508082111561474d57600080fd5b5061475a88828901614663565b9150509295509295909350565b60008082840360e081121561477b57600080fd5b8335925060c0601f198201121561479157600080fd5b506020830190509250929050565b600080604083850312156147b257600080fd5b50508035926020909101359150565b6000602082840312156147d357600080fd5b813561403081614135565b60005b838110156147f95781810151838201526020016147e1565b83811115614808576000848401525b50505050565b600081518084526148268160208601602086016147de565b601f01601f19169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156148cf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0898403018552815180518785526148a38886018261480e565b91890151858303868b01529190506148bb818361480e565b968901969450505090860190600101614861565b509098975050505050505050565b6000606082840312156148ef57600080fd5b50919050565b600080600060a0848603121561490a57600080fd5b83359250602084013561491c81614135565b915061422885604086016148dd565b6020808252825182820181905260009190848201906040850190845b8181101561412957835183529284019291840191600101614947565b60008082840360c081121561497757600080fd5b8335925060a0601f198201121561479157600080fd5b600080600080600060a086880312156149a557600080fd5b85356149b081614135565b945060208601356149c081614135565b93506040860135925060608601359150608086013567ffffffffffffffff8111156149ea57600080fd5b61475a88828901614663565b60008060808385031215614a0957600080fd5b8235915061447484602085016148dd565b600080600080600060608688031215614a3257600080fd5b85359450602086013567ffffffffffffffff80821115614a5157600080fd5b614a5d89838a0161430e565b90965094506040880135915080821115614a7657600080fd5b506144408882890161430e565b6020808252825182820181905260009190848201906040850190845b8181101561412957614af18385518051825267ffffffffffffffff602082015116602083015261ffff604082015116604083015260ff606082015116606083015260ff60808201511660808301525050565b9284019260a09290920191600101614a9f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061ffff83811690831681811015614b7d57614b7d614b33565b039392505050565b600061ffff808316818516808303821115614ba257614ba2614b33565b01949350505050565b600060208284031215614bbd57600080fd5b614030826141de565b600060208284031215614bd857600080fd5b813560ff8116811461403057600080fd5b600082601f830112614bfa57600080fd5b8151614c086146828261463b565b818152846020838601011115614c1d57600080fd5b6110ad8260208301602087016147de565b600060208284031215614c4057600080fd5b815167ffffffffffffffff80821115614c5857600080fd5b9083019060408286031215614c6c57600080fd5b604051604081018181108382111715614c8757614c8761455b565b604052825182811115614c9957600080fd5b614ca587828601614be9565b825250602083015182811115614cba57600080fd5b614cc687828601614be9565b60208301525095945050505050565b600060ff821660ff841680821015614cef57614cef614b33565b90039392505050565b600060ff821660ff84168060ff03821115614d1557614d15614b33565b019392505050565b600060208284031215614d2f57600080fd5b815161403081614135565b600060208284031215614d4c57600080fd5b8151801515811461403057600080fd5b600082821015614d6e57614d6e614b33565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008219821115614db557614db5614b33565b50019056fea2646970667358221220635cdb0991eea010ef78772906b00530b59cabafdb9115010696d109b758888064736f6c634300080f0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102415760003560e01c80639eaddb3111610145578063c9bf5985116100bd578063efcddfac1161008c578063f2fde38b11610071578063f2fde38b146107e7578063f3df547d146107fa578063f7478ce81461080d57600080fd5b8063efcddfac1461079c578063f23a6e61146107af57600080fd5b8063c9bf59851461071f578063d6e94cf214610732578063dfa6151014610752578063ef3655391461078957600080fd5b8063bc197c8111610114578063c4a85029116100f9578063c4a85029146106d9578063c4d66de8146106ec578063c5d57fd8146106ff57600080fd5b8063bc197c811461065d578063bd3f6b94146106c657600080fd5b80639eaddb3114610611578063a2363b6b14610624578063a8fa47d414610637578063af9c04451461064a57600080fd5b80633030ed9c116101d85780637bc972bf116101a7578063988e00881161018c578063988e0088146105265780639a5e4a58146105925780639e28236a146105b357600080fd5b80637bc972bf146105025780638da5cb5b1461051557600080fd5b80633030ed9c1461049a578063512937b6146104d45780635f5fdeec146104e7578063715018a6146104fa57600080fd5b80631f3a8d05116102145780631f3a8d051461035957806322ec0b191461036c57806328f365711461038c5780632de45f181461046e57600080fd5b806301ffc9a71461024657806306b22e521461026e57806311bd666114610283578063167dcd16146102a3575b600080fd5b610259610254366004613fee565b61082d565b60405190151581526020015b60405180910390f35b61028161027c366004614083565b6108c6565b005b6102966102913660046140cf565b6109b4565b60405161026591906140e8565b61031c6102b136600461414a565b6101326020908152600093845260408085208252928452828420905282529020805460019091015467ffffffffffffffff81169061ffff680100000000000000008204169060ff6a010000000000000000000082048116916b01000000000000000000000090041685565b6040805195865267ffffffffffffffff909416602086015261ffff9092169284019290925260ff918216606084015216608082015260a001610265565b610281610367366004614182565b610a21565b61037f61037a3660046141f5565b610bfb565b6040516102659190614231565b61046161039a36600461414a565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506000838152610132602090815260408083206001600160a01b03861684528252808320848452825291829020825160a0810184528154815260019091015467ffffffffffffffff81169282019290925261ffff680100000000000000008304169281019290925260ff6a01000000000000000000008204811660608401526b0100000000000000000000009091041660808201529392505050565b6040516102659190614291565b61012d54610482906001600160a01b031681565b6040516001600160a01b039091168152602001610265565b6104c66104a83660046142de565b61013160209081526000928352604080842090915290825290205481565b604051908152602001610265565b6102816104e2366004614353565b610d95565b6102816104f53660046143d7565b610f23565b610281611018565b61025961051036600461414a565b61107e565b60fb546001600160a01b0316610482565b610585610534366004614451565b6040805180820182526000808252602091820181905293845261012e815281842061ffff93909316845291825291829020825180840190935280546001600160a01b03168352600101549082015290565b604051610265919061447d565b6104c66105a03660046140cf565b600090815261012f602052604090205490565b6105f26105c1366004614451565b61012e602090815260009283526040808420909152908252902080546001909101546001600160a01b039091169082565b604080516001600160a01b039093168352602083019190915201610265565b61025961061f3660046140cf565b6110b5565b61028161063236600461449d565b611125565b6102816106453660046144dc565b6111b0565b610281610658366004614451565b611298565b61069561066b3660046146b9565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610265565b6102816106d4366004614767565b6113bd565b6104826106e736600461479f565b611503565b6102816106fa3660046147c1565b61153c565b61071261070d3660046140cf565b61165f565b604051610265919061483a565b61028161072d3660046148f5565b611b66565b6107456107403660046142de565b611cd5565b604051610265919061492b565b6104c66107603660046142de565b6000918252610130602090815260408084206001600160a01b0393909316845291905290205490565b610281610797366004614963565b611d4a565b6104c66107aa36600461414a565b611ec5565b6106956107bd36600461498d565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b6102816107f53660046147c1565b611f04565b6102816108083660046149f6565b611fe6565b61082061081b366004614a1a565b6120c9565b6040516102659190614a83565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806108c057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60026097540361091d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b600260975561092d335b84612290565b61099f5760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b6109aa838383612463565b5050600160975550565b600081815261012f6020908152604091829020805483518184028101840190945280845260609392830182828015610a1557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f7575b50505050509050919050565b600260975403610a735760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610914565b6002609755610a823385612290565b610af45760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b6001600160a01b038316610b705760405162461bcd60e51b815260206004820152602b60248201527f4e6f756e73436f6d706f7365723a207472616e7366657220746f20746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610914565b8060005b81811015610bee57610be68686868685818110610b9357610b93614b04565b610ba992602060609092020190810191506147c1565b878786818110610bbb57610bbb614b04565b90506060020160200135888887818110610bd757610bd7614b04565b905060600201604001356124e0565b600101610b74565b5050600160975550505050565b60608261ffff168261ffff1611610c7a5760405162461bcd60e51b815260206004820152602560248201527f4e6f756e73436f6d706f7365723a20696e76616c696420706f736974696f6e2060448201527f72616e67650000000000000000000000000000000000000000000000000000006064820152608401610914565b6000610c868484614b62565b610c91906001614b85565b905060008161ffff1667ffffffffffffffff811115610cb257610cb261455b565b604051908082528060200260200182016040528015610cf757816020015b6040805180820190915260008082526020820152815260200190600190039081610cd05790505b50905060005b8261ffff168161ffff161015610d8b57600087815261012e6020526040812090610d278389614b85565b61ffff90811682526020808301939093526040918201600020825180840190935280546001600160a01b031683526001015492820192909252835190918491908416908110610d7857610d78614b04565b6020908102919091010152600101610cfd565b5095945050505050565b610d9e33610927565b610e105760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b8060005b81811015610f1c57600085815261012e6020526040812081868685818110610e3e57610e3e614b04565b9050602002016020810190610e539190614bab565b61ffff1681526020810191909152604001600020546001600160a01b031603610ee45760405162461bcd60e51b815260206004820152603260248201527f4e6f756e73436f6d706f7365723a20636f6d706f736520717565727920666f7260448201527f206e6f6e6578697374656e74206368696c6400000000000000000000000000006064820152608401610914565b610f1485858584818110610efa57610efa614b04565b9050602002016020810190610f0f9190614bab565b612a37565b600101610e14565b5050505050565b600260975403610f755760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610914565b6002609755610f843386612290565b610ff65760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b611001858585612463565b61100c858383612d7b565b50506001609755505050565b60fb546001600160a01b031633146110725760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610914565b61107c6000612f41565b565b6000838152610132602090815260408083206001600160a01b0386168452825280832084845290915281205415155b949350505050565b60006010815b8161ffff168161ffff16101561111b57600084815261012e60205260408120816110e6846001614b85565b61ffff1681526020810191909152604001600020546001600160a01b031614611113575060019392505050565b6001016110bb565b5060009392505050565b61112e33610927565b6111a05760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b6111ab838383612d7b565b505050565b6002609754036112025760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610914565b600260975561121033610927565b6112825760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b61128d838383612fab565b6109aa838383613028565b6112a3335b83612290565b6113155760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b600082815261012e6020908152604080832061ffff851684529091529020546001600160a01b03166113af5760405162461bcd60e51b815260206004820152603260248201527f4e6f756e73436f6d706f7365723a20636f6d706f736520717565727920666f7260448201527f206e6f6e6578697374656e74206368696c6400000000000000000000000000006064820152608401610914565b6113b98282612a37565b5050565b60026097540361140f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610914565b600260975561141d3361129d565b61148f5760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b6114af826114a060208401846147c1565b836020013584604001356131ee565b6114fa826114c060208401846147c1565b60208401356114d56080860160608701614bab565b6114e560a0870160808801614bc6565b6114f560c0880160a08901614bc6565b6134a1565b50506001609755565b61012f602052816000526040600020818154811061152057600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff1680611555575060005460ff16155b6115c75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610914565b600054610100900460ff161580156115e9576000805461ffff19166101011790555b6115f16137bf565b6115f96138a5565b61012d80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841617905580156113b957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050565b60408051601080825261022082019092526060919060009082816020015b604080518082019091526060808252602082015281526020019060019003908161167d57905050905060005b8261ffff168161ffff161015611b5e57600085815261012e60205260408120816116d4846001614b85565b61ffff1681526020808201929092526040908101600020815180830190925280546001600160a01b031680835260019091015492820192909252915015611b5557805160208201516040517f304fe35000000000000000000000000000000000000000000000000000000000815260048101919091526000916001600160a01b03169063304fe35090602401600060405180830381865afa15801561177d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117a59190810190614c2e565b60008881526101326020908152604080832086516001600160a01b031684528252808320868301518452825291829020825160a0810184528154815260019091015467ffffffffffffffff81169282019290925261ffff680100000000000000008304169281019290925260ff6a010000000000000000000082048116606084018190526b01000000000000000000000090920416608083015291925090156119b75760006001826060015161185b9190614cd5565b90506000836000015160018151811061187657611876614b04565b01602001518451805160f89290921c9250600091600390811061189b5761189b614b04565b016020015160f81c905060ff82811690841610156118e4576118bd8383614cd5565b6118c79083614cd5565b91506118d38383614cd5565b6118dd9082614cd5565b905061191f565b8160ff168360ff16111561191f576118fc8284614cd5565b6119069083614cf8565b91506119128284614cd5565b61191c9082614cf8565b90505b8160f81b856000015160018151811061193a5761193a614b04565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060f81b856000015160038151811061198457611984614b04565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505050505b608081015160ff1615611b30576000600182608001516119d79190614cd5565b9050600083600001516002815181106119f2576119f2614b04565b01602001518451805160f89290921c92506000916004908110611a1757611a17614b04565b016020015160f81c905060ff8316811115611a5d57611a368382614cd5565b611a409083614cd5565b9150611a4c8382614cd5565b611a569082614cd5565b9050611a98565b8060ff168360ff161115611a9857611a758184614cd5565b611a7f9083614cf8565b9150611a8b8184614cd5565b611a959082614cf8565b90505b8160f81b8560000151600281518110611ab357611ab3614b04565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060f81b8560000151600481518110611afd57611afd614b04565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505050505b81858561ffff1681518110611b4757611b47614b04565b602002602001018190525050505b506001016116a9565b509392505050565b600260975403611bb85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610914565b6002609755611bc633610927565b611c385760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b6001600160a01b038216611cb45760405162461bcd60e51b815260206004820152602b60248201527f4e6f756e73436f6d706f7365723a207472616e7366657220746f20746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610914565b6109aa8383611cc660208501856147c1565b846020013585604001356124e0565b6000828152610130602090815260408083206001600160a01b0385168452825291829020805483518184028101840190945280845260609392830182828015611d3d57602002820191906000526020600020905b815481526020019060010190808311611d29575b5050505050905092915050565b611d533361129d565b611dc55760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b611e0d82611dd660208401846147c1565b83602001356000928352610132602090815260408085206001600160a01b0394909416855292815282842091845252902054151590565b611e7f5760405162461bcd60e51b815260206004820152603260248201527f4e6f756e73436f6d706f7365723a20636f6d706f736520717565727920666f7260448201527f206e6f6e6578697374656e74206368696c6400000000000000000000000000006064820152608401610914565b6113b982611e9060208401846147c1565b6020840135611ea56060860160408701614bab565b611eb56080870160608801614bc6565b6114f560a0880160808901614bc6565b6101306020528260005260406000206020528160005260406000208181548110611eee57600080fd5b9060005260206000200160009250925050505481565b60fb546001600160a01b03163314611f5e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610914565b6001600160a01b038116611fda5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610914565b611fe381612f41565b50565b6002609754036120385760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610914565b60026097556120463361129d565b6120b85760405162461bcd60e51b815260206004820152603560248201527f4e6f756e73436f6d706f7365723a2063616c6c6572206973206e6f7420746f6b60448201527f656e206f776e6572206e6f7220617070726f76656400000000000000000000006064820152608401610914565b6114fa826114a060208401846147c1565b60608360008167ffffffffffffffff8111156120e7576120e761455b565b60405190808252806020026020018201604052801561215e57816020015b6040805160a0810182526000808252602080830182905292820181905260608201819052608082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816121055790505b50905060005b82811015612284576000898152610132602052604081209089898481811061218e5761218e614b04565b90506020020160208101906121a391906147c1565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008787848181106121d7576121d7614b04565b60209081029290920135835250818101929092526040908101600020815160a0810183528154815260019091015467ffffffffffffffff81169382019390935261ffff680100000000000000008404169181019190915260ff6a01000000000000000000008304811660608301526b0100000000000000000000009092049091166080820152825183908390811061227157612271614b04565b6020908102919091010152600101612164565b50979650505050505050565b61012d546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810183905260009182916001600160a01b0390911690636352211e90602401602060405180830381865afa1580156122f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231c9190614d1d565b9050806001600160a01b0316846001600160a01b031614806123cd575061012d546040517f081812fc000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b0386811692169063081812fc90602401602060405180830381865afa15801561239e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c29190614d1d565b6001600160a01b0316145b806110ad575061012d546040517fe985e9c50000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015286811660248301529091169063e985e9c590604401602060405180830381865afa15801561243f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ad9190614d3a565b8060005b81811015610f1c576124d88585858481811061248557612485614b04565b61249b92602060609092020190810191506147c1565b8686858181106124ad576124ad614b04565b905060600201602001358787868181106124c9576124c9614b04565b905060600201604001356131ee565b600101612467565b6000858152610132602090815260408083206001600160a01b03871684528252808320858452825291829020825160a081018452815480825260019092015467ffffffffffffffff811693820184905261ffff680100000000000000008204169482019490945260ff6a01000000000000000000008504811660608301526b01000000000000000000000090940490931660808401528311156125eb5760405162461bcd60e51b815260206004820152603060248201527f4e6f756e73436f6d706f7365723a20696e73756666696369656e742062616c6160448201527f6e636520666f72207472616e73666572000000000000000000000000000000006064820152608401610914565b604082015161ffff161561260757612607878360400151612a37565b81516000888152610132602090815260408083206001600160a01b038a1684528252808320888452909152812091859003918290558190036129c9576000888152610130602090815260408083206001600160a01b038a16845290915281205461267390600190614d5c565b60008a8152610130602090815260408083206001600160a01b038c168452909152812080549293509091839081106126ad576126ad614b04565b906000526020600020015490508087146127665760008a8152610130602090815260408083206001600160a01b038c16845290915290208054829190869081106126f9576126f9614b04565b6000918252602080832091909101929092558b8152610132825260408082206001600160a01b038c16835283528082208483529092522060010180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86161790555b60008a8152610130602090815260408083206001600160a01b038c168452909152902080548061279857612798614d73565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081018390559092019092558b8252610132815260408083206001600160a01b038c16845282528083208a8452909152812081815560010180547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690558290036129c65760008a815261012f602052604081205461284690600190614d5c565b60008c815261012f60205260408120805492935090918390811061286c5761286c614b04565b6000918252602090912001546001600160a01b0390811691508a16811461292a5760008c8152610131602090815260408083206001600160a01b038e1684528252808320548f845261012f9092529091208054839190839081106128d2576128d2614b04565b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039485161790558f825261013181526040808320938616835292905220555b60008c815261012f6020526040902080548061294857612948614d73565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559092019092558d8252610131815260408083206001600160a01b038e16845290915281205550505b50505b6129d63088888888613962565b856001600160a01b0316876001600160a01b0316897f389ff528894938684df5b82afec158e6353447d0537d3843c472997aa38186838888604051612a25929190918252602082015260400190565b60405180910390a45050505050505050565b600061012e600084815260200190815260200160002060008361ffff1661ffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182015481525050905061012e600084815260200190815260200160002060008361ffff1661ffff168152602001908152602001600020600080820160006101000a8154906001600160a01b0302191690556001820160009055505060006101326000858152602001908152602001600020600083600001516001600160a01b03166001600160a01b031681526020019081526020016000206000836020015181526020019081526020016000206040518060a0016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900461ffff1661ffff1661ffff16815260200160018201600a9054906101000a900460ff1660ff1660ff16815260200160018201600b9054906101000a900460ff1660ff1660ff168152505090506000816040019061ffff16908161ffff16815250506000816060019060ff16908160ff16815250506000816080019060ff16908160ff1681525050806101326000868152602001908152602001600020600084600001516001600160a01b03166001600160a01b031681526020019081526020016000206000846020015181526020019081526020016000206000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548161ffff021916908361ffff160217905550606082015181600101600a6101000a81548160ff021916908360ff160217905550608082015181600101600b6101000a81548160ff021916908360ff160217905550905050816020015182600001516001600160a01b0316857fa7e63e17bfdc4d4104d4912e5b3af22af014c7844058bc7d5bb2a4f2fe209e8286604051612d6d919061ffff91909116815260200190565b60405180910390a450505050565b8060005b81811015610f1c57612e0185858584818110612d9d57612d9d614b04565b612db392602060a09092020190810191506147c1565b868685818110612dc557612dc5614b04565b905060a00201602001356000928352610132602090815260408085206001600160a01b0394909416855292815282842091845252902054151590565b612e735760405162461bcd60e51b815260206004820152603260248201527f4e6f756e73436f6d706f7365723a20636f6d706f736520717565727920666f7260448201527f206e6f6e6578697374656e74206368696c6400000000000000000000000000006064820152608401610914565b612f3985858584818110612e8957612e89614b04565b612e9f92602060a09092020190810191506147c1565b868685818110612eb157612eb1614b04565b905060a0020160200135878786818110612ecd57612ecd614b04565b905060a002016040016020810190612ee59190614bab565b888887818110612ef757612ef7614b04565b905060a002016060016020810190612f0f9190614bc6565b898988818110612f2157612f21614b04565b905060a0020160800160208101906114f59190614bc6565b600101612d7f565b60fb80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8060005b81811015610f1c5761302085858584818110612fcd57612fcd614b04565b612fe392602060c09092020190810191506147c1565b868685818110612ff557612ff5614b04565b905060c002016020013587878681811061301157613011614b04565b905060c00201604001356131ee565b600101612faf565b8060005b81811015610f1c576130ae8585858481811061304a5761304a614b04565b61306092602060c09092020190810191506147c1565b86868581811061307257613072614b04565b905060c00201602001356000928352610132602090815260408085206001600160a01b0394909416855292815282842091845252902054151590565b6131205760405162461bcd60e51b815260206004820152603260248201527f4e6f756e73436f6d706f7365723a20636f6d706f736520717565727920666f7260448201527f206e6f6e6578697374656e74206368696c6400000000000000000000000000006064820152608401610914565b6131e68585858481811061313657613136614b04565b61314c92602060c09092020190810191506147c1565b86868581811061315e5761315e614b04565b905060c002016020013587878681811061317a5761317a614b04565b905060c0020160600160208101906131929190614bab565b8888878181106131a4576131a4614b04565b905060c0020160800160208101906131bc9190614bc6565b8989888181106131ce576131ce614b04565b905060c0020160a00160208101906114f59190614bc6565b60010161302c565b6000848152610130602090815260408083206001600160a01b03871684529091528120549081900361328457600085815261012f60208181526040808420805461013184528286206001600160a01b038b16808852908552928620819055938352600184018155845292200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690911790555b6000858152610132602090815260408083206001600160a01b0388168452825280832086845290915281205490819003613403576040805160a08101825284815267ffffffffffffffff8481166020808401918252600084860181815260608601828152608087018381528e845261013285528884206001600160a01b038f168086529086528985208e8652865289852098518955955160019889018054945193519251919098167fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000909416939093176801000000000000000061ffff90931692909202919091177fffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffff166a010000000000000000000060ff928316027fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff16176b0100000000000000000000009190921602179093558a835261013081528483209183529081529281208054928301815581529190912001849055613444565b6000868152610132602090815260408083206001600160a01b038916845282528083208784529091528120805485929061343e908490614da2565b90915550505b6134513330878787613962565b60408051858152602081018590526001600160a01b03871691339189917f3a6c712121b766145eded1fd33f9b326a67bf83849a720ad70ee3756972b04e2910160405180910390a4505050505050565b6000868152610132602090815260408083206001600160a01b03891684528252808320878452825291829020825160a0810184528154815260019091015467ffffffffffffffff81169282019290925261ffff6801000000000000000083041692810183905260ff6a01000000000000000000008304811660608301526b0100000000000000000000009092049091166080820152901580159061355157508361ffff16816040015161ffff1614155b1561356457613564878260400151612a37565b8361ffff1660000361357657506137b7565b600087815261012e6020908152604080832061ffff881684529091529020546001600160a01b0316156135ad576135ad8785612a37565b6040518060400160405280876001600160a01b031681526020018681525061012e600089815260200190815260200160002060008661ffff1661ffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015590505083816040019061ffff16908161ffff168152505082816060019060ff16908160ff168152505081816080019060ff16908160ff16815250508061013260008981526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008781526020019081526020016000206000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548161ffff021916908361ffff160217905550606082015181600101600a6101000a81548160ff021916908360ff160217905550608082015181600101600b6101000a81548160ff021916908360ff16021790555090505084866001600160a01b0316887fe632604ba8a0d64c57c5661270eba360bb0d2852bc5a41f205784b0ea57c42b68787876040516137ad9392919061ffff93909316835260ff918216602084015216604082015260600190565b60405180910390a4505b505050505050565b600054610100900460ff16806137d8575060005460ff16155b61384a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610914565b600054610100900460ff1615801561386c576000805461ffff19166101011790555b613874613d78565b8015611fe357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff16806138be575060005460ff16155b6139305760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610914565b600054610100900460ff16158015613952576000805461ffff19166101011790555b61395a613e5b565b613874613f38565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fd9b67a2600000000000000000000000000000000000000000000000000000000600482015283906001600160a01b038216906301ffc9a790602401602060405180830381865afa1580156139e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a059190614d3a565b15613ace576040517ff242432a0000000000000000000000000000000000000000000000000000000081526001600160a01b0387811660048301528681166024830152604482018590526064820184905260a06084830152600360a48301527f307830000000000000000000000000000000000000000000000000000000000060c483015285169063f242432a9060e4015b600060405180830381600087803b158015613ab157600080fd5b505af1158015613ac5573d6000803e3d6000fd5b505050506137b7565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f36372b070000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015613b4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b6f9190614d3a565b15613c0e576040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0387811660048301528681166024830152604482018490528516906323b872dd906064016020604051808303816000875af1158015613be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c089190614d3a565b506137b7565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015613c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613caf9190614d3a565b15613d0a576040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0387811660048301528681166024830152604482018590528516906323b872dd90606401613a97565b60405162461bcd60e51b815260206004820152602560248201527f4e6f756e73436f6d706f7365723a20756e737570706f7274656420746f6b656e60448201527f20747970650000000000000000000000000000000000000000000000000000006064820152608401610914565b600054610100900460ff1680613d91575060005460ff16155b613e035760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610914565b600054610100900460ff16158015613e25576000805461ffff19166101011790555b60016097558015611fe357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680613e74575060005460ff16155b613ee65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610914565b600054610100900460ff16158015613874576000805461ffff19166101011790558015611fe357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680613f51575060005460ff16155b613fc35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610914565b600054610100900460ff16158015613fe5576000805461ffff19166101011790555b61387433612f41565b60006020828403121561400057600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461403057600080fd5b9392505050565b60008083601f84011261404957600080fd5b50813567ffffffffffffffff81111561406157600080fd5b60208301915083602060608302850101111561407c57600080fd5b9250929050565b60008060006040848603121561409857600080fd5b83359250602084013567ffffffffffffffff8111156140b657600080fd5b6140c286828701614037565b9497909650939450505050565b6000602082840312156140e157600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156141295783516001600160a01b031683529284019291840191600101614104565b50909695505050505050565b6001600160a01b0381168114611fe357600080fd5b60008060006060848603121561415f57600080fd5b83359250602084013561417181614135565b929592945050506040919091013590565b6000806000806060858703121561419857600080fd5b8435935060208501356141aa81614135565b9250604085013567ffffffffffffffff8111156141c657600080fd5b6141d287828801614037565b95989497509550505050565b803561ffff811681146141f057600080fd5b919050565b60008060006060848603121561420a57600080fd5b8335925061421a602085016141de565b9150614228604085016141de565b90509250925092565b602080825282518282018190526000919060409081850190868401855b828110156142845761427484835180516001600160a01b03168252602090810151910152565b928401929085019060010161424e565b5091979650505050505050565b60a081016108c082848051825267ffffffffffffffff602082015116602083015261ffff604082015116604083015260ff606082015116606083015260ff60808201511660808301525050565b600080604083850312156142f157600080fd5b82359150602083013561430381614135565b809150509250929050565b60008083601f84011261432057600080fd5b50813567ffffffffffffffff81111561433857600080fd5b6020830191508360208260051b850101111561407c57600080fd5b60008060006040848603121561436857600080fd5b83359250602084013567ffffffffffffffff81111561438657600080fd5b6140c28682870161430e565b60008083601f8401126143a457600080fd5b50813567ffffffffffffffff8111156143bc57600080fd5b60208301915083602060a08302850101111561407c57600080fd5b6000806000806000606086880312156143ef57600080fd5b85359450602086013567ffffffffffffffff8082111561440e57600080fd5b61441a89838a01614037565b9096509450604088013591508082111561443357600080fd5b5061444088828901614392565b969995985093965092949392505050565b6000806040838503121561446457600080fd5b82359150614474602084016141de565b90509250929050565b81516001600160a01b0316815260208083015190820152604081016108c0565b6000806000604084860312156144b257600080fd5b83359250602084013567ffffffffffffffff8111156144d057600080fd5b6140c286828701614392565b6000806000604084860312156144f157600080fd5b83359250602084013567ffffffffffffffff8082111561451057600080fd5b818601915086601f83011261452457600080fd5b81358181111561453357600080fd5b87602060c08302850101111561454857600080fd5b6020830194508093505050509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156145b3576145b361455b565b604052919050565b600082601f8301126145cc57600080fd5b8135602067ffffffffffffffff8211156145e8576145e861455b565b8160051b6145f782820161458a565b928352848101820192828101908785111561461157600080fd5b83870192505b8483101561463057823582529183019190830190614617565b979650505050505050565b600067ffffffffffffffff8211156146555761465561455b565b50601f01601f191660200190565b600082601f83011261467457600080fd5b81356146876146828261463b565b61458a565b81815284602083860101111561469c57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156146d157600080fd5b85356146dc81614135565b945060208601356146ec81614135565b9350604086013567ffffffffffffffff8082111561470957600080fd5b61471589838a016145bb565b9450606088013591508082111561472b57600080fd5b61473789838a016145bb565b9350608088013591508082111561474d57600080fd5b5061475a88828901614663565b9150509295509295909350565b60008082840360e081121561477b57600080fd5b8335925060c0601f198201121561479157600080fd5b506020830190509250929050565b600080604083850312156147b257600080fd5b50508035926020909101359150565b6000602082840312156147d357600080fd5b813561403081614135565b60005b838110156147f95781810151838201526020016147e1565b83811115614808576000848401525b50505050565b600081518084526148268160208601602086016147de565b601f01601f19169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156148cf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0898403018552815180518785526148a38886018261480e565b91890151858303868b01529190506148bb818361480e565b968901969450505090860190600101614861565b509098975050505050505050565b6000606082840312156148ef57600080fd5b50919050565b600080600060a0848603121561490a57600080fd5b83359250602084013561491c81614135565b915061422885604086016148dd565b6020808252825182820181905260009190848201906040850190845b8181101561412957835183529284019291840191600101614947565b60008082840360c081121561497757600080fd5b8335925060a0601f198201121561479157600080fd5b600080600080600060a086880312156149a557600080fd5b85356149b081614135565b945060208601356149c081614135565b93506040860135925060608601359150608086013567ffffffffffffffff8111156149ea57600080fd5b61475a88828901614663565b60008060808385031215614a0957600080fd5b8235915061447484602085016148dd565b600080600080600060608688031215614a3257600080fd5b85359450602086013567ffffffffffffffff80821115614a5157600080fd5b614a5d89838a0161430e565b90965094506040880135915080821115614a7657600080fd5b506144408882890161430e565b6020808252825182820181905260009190848201906040850190845b8181101561412957614af18385518051825267ffffffffffffffff602082015116602083015261ffff604082015116604083015260ff606082015116606083015260ff60808201511660808301525050565b9284019260a09290920191600101614a9f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061ffff83811690831681811015614b7d57614b7d614b33565b039392505050565b600061ffff808316818516808303821115614ba257614ba2614b33565b01949350505050565b600060208284031215614bbd57600080fd5b614030826141de565b600060208284031215614bd857600080fd5b813560ff8116811461403057600080fd5b600082601f830112614bfa57600080fd5b8151614c086146828261463b565b818152846020838601011115614c1d57600080fd5b6110ad8260208301602087016147de565b600060208284031215614c4057600080fd5b815167ffffffffffffffff80821115614c5857600080fd5b9083019060408286031215614c6c57600080fd5b604051604081018181108382111715614c8757614c8761455b565b604052825182811115614c9957600080fd5b614ca587828601614be9565b825250602083015182811115614cba57600080fd5b614cc687828601614be9565b60208301525095945050505050565b600060ff821660ff841680821015614cef57614cef614b33565b90039392505050565b600060ff821660ff84168060ff03821115614d1557614d15614b33565b019392505050565b600060208284031215614d2f57600080fd5b815161403081614135565b600060208284031215614d4c57600080fd5b8151801515811461403057600080fd5b600082821015614d6e57614d6e614b33565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008219821115614db557614db5614b33565b50019056fea2646970667358221220635cdb0991eea010ef78772906b00530b59cabafdb9115010696d109b758888064736f6c634300080f0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.