ERC-721
Overview
Max Total Supply
162 2024MK
Holders
43
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 2024MKLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
MK2024
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.26; /// @title On-Chain Space Rock: a collection of on-chain animation frames of the asteroid 2024 MK /// @notice Once all 241 frames are minted the complete animation will be included with all tokens /// @author germyjohn import "./ERC721.sol"; import "./Counters.sol"; import "./Ownable.sol"; import "./IERC2981.sol"; import "./IERC4906.sol"; interface IstorageTools{ function read(address) external view returns (bytes memory); function b64encode(bytes memory) external pure returns(string memory); } contract MK2024 is ERC721, IERC2981, IERC4906, Ownable { using Counters for Counters.Counter; address internal constant toolsAddress = 0x744F25b06DEbc03a909c8CED93Fa121C6c47B773; address internal constant backgroundAddress = 0xb99d83a0F54201a11746Eea706B8Cffb0564E577; address internal constant sprite1Address = 0x1527e3D026E2EcC80fC935d5754De0f556185C29; address internal constant sprite2Address = 0xc9Cd1E03FAa13d4E41001039cB2Aa7dE574120D3; Counters.Counter private supply; /// @notice the value to be sent for each mint uint256 public mintFee = 0.005 ether; /// @notice the max supply for this collection. this is the number of animation frames uint256 public maxSupply = 241; /// @notice minting state. can be changed by the toggleMint function. bool public mintEnabled = false; bool internal released = false; uint256 royaltyPercent = 4; string public externalURL = "https://nometa.online/asteroid"; string public constant description = "On June 29, 2024 at 13:49 UTC, the 150 meter wide asteroid 2024 MK " "passed us by at a mere 295,000 km. The original images were " "generated from radar data from the NASA Deep Space Network. " "They have been compressed and preserved here fully on-chain. " "Thank you for visiting, safe travels space rock."; string internal constant nameStart = "Asteroid 2024 MK Frame #"; constructor() payable ERC721('On-Chain Space Rock','2024MK') {} /* interface id for IERC2981: '0x2a55205a' */ /* interface id for IERC4906: '0x49064906' */ function supportsInterface(bytes4 interfaceId) public view override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC2981).interfaceId || interfaceId == bytes4(0x49064906) || super.supportsInterface(interfaceId); } receive() external payable {} modifier tokenExists(uint256 _tokenId) { require(_exists(_tokenId), "token does not exist"); _; } /// @notice returns the current number of tokens in the collection function totalSupply() external view returns (uint256) { return supply.current(); } /// @notice Mint given number of tokens /// @param _mints The number of tokens to mint. no limit function mint(uint256 _mints) external payable { address msgSender = msg.sender; uint256 mints = _mints; unchecked { require((supply.current() + mints) <= maxSupply, "exceeds max supply"); if (msgSender != owner()) { require(msg.value == mints * mintFee, "invald value for tranasction"); require(mintEnabled, "minting is disabled"); } for (uint256 count = 1; count <= mints; count++) { supply.increment(); uint256 tokenId = supply.current(); _safeMint(msgSender, tokenId); } } if (supply.current() == maxSupply) { release(); } } /// @notice returns the metadata for the given token id function tokenURI(uint256 _tokenId) public view virtual override tokenExists(_tokenId) returns (string memory) { uint256 tokenId = _tokenId; IstorageTools tools = IstorageTools(toolsAddress); string memory animation = ''; if (supply.current() == maxSupply || released) { animation = string.concat( '","animation_url":"', packAnimation() ); } return string.concat( 'data:application/json;base64,', tools.b64encode(bytes(string.concat( '{"name":"', getName(tokenId), '","description":"', description, '","credit":"Courtesy NASA/JPL-Caltech.",', '"external_url":"', externalURL, '","image":"', packImage(tokenId), animation, '"}' ))) ); } function packImage(uint256 _tokenId) internal view returns(string memory) { IstorageTools tools = IstorageTools(toolsAddress); return string.concat( "data:image/svg+xml;base64,", tools.b64encode(bytes(string.concat( '<svg id="s" width="640" height="640" xmlns="http://www.w3.org/2000/svg">', '<style>div{width:100%;height:100%;', 'background-size:auto 100%;background-repeat: no-repeat;', 'background-image:url("', assembleImage(), '");background-position-x:-', Strings.toString((_tokenId - 1) * 480), 'px;}</style>', '<rect width="100%" height="100%" fill="#000"/>', '<foreignObject x="80px" y="80px" width="480px" height="480px">', '<div xmlns="http://www.w3.org/1999/xhtml"></div>', '</foreignObject>', '<script type="text/javascript"><![CDATA[', 'let s=document.getElementById("s");if(s.parent==undefined)', 's.style="margin:calc((100vh - 640px)/2) auto;background-color:#222;"]]>', '</script></svg>' ))) ); } function packAnimation() internal view returns(string memory) { IstorageTools tools = IstorageTools(toolsAddress); return string.concat( "data:image/svg+xml;base64,", tools.b64encode(bytes(string.concat( '<svg id="s" width="1280" height="480" xmlns="http://www.w3.org/2000/svg" ', 'viewBox="0 0 320 120"><style>', 'div{width:100%;height:100%}' '.b{background-size:150%;background-image:url("', assembleBackground(), '");animation: b 25s linear infinite;}', '.a{background-size:auto 100%;', 'animation:f 12s steps(240) infinite;background-image:url("', assembleImage(),'")}', '.c{animation:p 10s linear infinite;transform: translateX(-50px)}', '@keyframes b {100%{background-position:-480px 0}}', '@keyframes f {100%{background-position:-7680px 0}}', '@keyframes p {100%{transform: translateX(100%)}}</style>', '<foreignObject width="100%" height="100%">', '<div class="b" xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>', '<foreignObject class="c" x="0" y="40%" width="32" height="32">', '<div class="a" xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject>', '<script type="text/javascript"><![CDATA[', 'let s=document.getElementById("s");if(s.parent==undefined)', 's.style="margin:calc((100vh - 480px)/2) auto;background-color:#222;"]]>', '</script></svg>' ))) ); } function assembleImage() internal view returns(string memory) { IstorageTools tools = IstorageTools(toolsAddress); bytes memory sprite = bytes.concat( tools.read(sprite1Address), tools.read(sprite2Address) ); return string.concat( "data:image/png;base64,", tools.b64encode(sprite) ); } function assembleBackground() internal view returns(string memory) { IstorageTools tools = IstorageTools(toolsAddress); bytes memory background = tools.read(backgroundAddress); return string.concat( "data:image/png;base64,", tools.b64encode(background) ); } function getName(uint256 _tokenId) internal pure returns(string memory) { return string.concat( nameStart, Strings.toString(_tokenId) ); } /// @notice called with the sale price to determine how much royalty is owed and to whom. /// @param _tokenId the NFT asset queried for royalty information /// @param _salePrice the sale price of the NFT asset specified by _tokenId /// @return receiver address of who should be sent the royalty payment /// @return royaltyAmount the royalty payment amount for _salePrice function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view tokenExists(_tokenId) returns(address receiver, uint256 royaltyAmount) { return (owner(), _salePrice * royaltyPercent / 100); } // owner control function release() internal { released = true; emit BatchMetadataUpdate(1, supply.current()); } /// @notice release the animation to all tokens if mint stalls. onlyOwner function justReleaseIt() external onlyOwner { release(); } /// @notice set the external website address. onlyOwner /// @param _url The new external url. function setExternalURL(string calldata _url) external onlyOwner { externalURL = _url; } /// @notice toggles mintEnabled function toggleMint() external onlyOwner { mintEnabled = !mintEnabled; } function withdraw() external onlyOwner { (bool success, ) = payable(owner()).call{value: address(this).balance}(""); require(success, "failed to withdraw"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; // from: https://eips.ethereum.org/EIPS/eip-2981#simple-summary import "./IERC165.sol"; /// /// @dev Interface for the NFT Royalty Standard /// interface IERC2981 is IERC165 { /// ERC165 bytes to add to interface array - set in parent contract /// implementing this standard /// /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; /// _registerInterface(_INTERFACE_ID_ERC2981); /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _tokenId - the NFT asset queried for royalty information /// @param _salePrice - the sale price of the NFT asset specified by _tokenId /// @return receiver - address of who should be sent the royalty payment /// @return royaltyAmount - the royalty payment amount for _salePrice function royaltyInfo( uint256 _tokenId, uint256 _salePrice ) external view returns ( address receiver, uint256 royaltyAmount ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.18; // from: https://eips.ethereum.org/EIPS/eip-4906 import "./IERC165.sol"; import "./IERC721.sol"; // interface id for IERC4906: '0x49064906' /// @title EIP-721 Metadata Update Extension interface IERC4906 is IERC165, IERC721 { /// @dev This event emits when the metadata of a token is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFT. event MetadataUpdate(uint256 _tokenId); /// @dev This event emits when the metadata of a range of tokens is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFTs. event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"externalURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"justReleaseIt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mints","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url","type":"string"}],"name":"setExternalURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6611c37937e0800060085560f1600955600a805461ffff191690556004600b5560c0604052601e60809081527f68747470733a2f2f6e6f6d6574612e6f6e6c696e652f61737465726f6964000060a052600c9061005c90826101d8565b506040518060400160405280601381526020017f4f6e2d436861696e20537061636520526f636b0000000000000000000000000081525060405180604001604052806006815260200165323032344d4b60d01b815250815f90816100c091906101d8565b5060016100cd82826101d8565b5050506100e66100e16100eb60201b60201c565b6100ef565b610292565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061016857607f821691505b60208210810361018657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156101d357805f5260205f20601f840160051c810160208510156101b15750805b601f840160051c820191505b818110156101d0575f81556001016101bd565b50505b505050565b81516001600160401b038111156101f1576101f1610140565b610205816101ff8454610154565b8461018c565b6020601f821160018114610237575f83156102205750848201515b5f19600385901b1c1916600184901b1784556101d0565b5f84815260208120601f198516915b828110156102665787850151825560209485019460019092019101610246565b508482101561028357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b612f418061029f5f395ff3fe6080604052600436106101b2575f3560e01c8063715018a6116100e7578063b99edfb211610087578063d3dd5fe011610062578063d3dd5fe014610498578063d5abeb01146104ac578063e985e9c5146104c1578063f2fde38b146104e0575f80fd5b8063b99edfb21461044c578063c87b56dd14610460578063d12397301461047f575f80fd5b806395d89b41116100c257806395d89b41146103e7578063a0712d68146103fb578063a22cb4651461040e578063b88d4fde1461042d575f80fd5b8063715018a6146103a25780637284e416146103b65780638da5cb5b146103ca575f80fd5b806323b872dd1161015257806342842e0e1161012d57806342842e0e146103315780636352211e146103505780636e0d39e41461036f57806370a0823114610383575f80fd5b806323b872dd146102c05780632a55205a146102df5780633ccfd60b1461031d575f80fd5b8063081812fc1161018d578063081812fc14610233578063095ea7b31461026a57806313966db51461028957806318160ddd146102ac575f80fd5b806301dbcd4a146101bd57806301ffc9a7146101de57806306fdde0314610212575f80fd5b366101b957005b5f80fd5b3480156101c8575f80fd5b506101dc6101d7366004611d14565b6104ff565b005b3480156101e9575f80fd5b506101fd6101f8366004611d97565b610544565b60405190151581526020015b60405180910390f35b34801561021d575f80fd5b506102266105bf565b6040516102099190611de7565b34801561023e575f80fd5b5061025261024d366004611df9565b61064e565b6040516001600160a01b039091168152602001610209565b348015610275575f80fd5b506101dc610284366004611e2b565b6106e1565b348015610294575f80fd5b5061029e60085481565b604051908152602001610209565b3480156102b7575f80fd5b5061029e6107f0565b3480156102cb575f80fd5b506101dc6102da366004611e53565b6107ff565b3480156102ea575f80fd5b506102fe6102f9366004611e8d565b610830565b604080516001600160a01b039093168352602083019190915201610209565b348015610328575f80fd5b506101dc6108c0565b34801561033c575f80fd5b506101dc61034b366004611e53565b610992565b34801561035b575f80fd5b5061025261036a366004611df9565b6109ac565b34801561037a575f80fd5b506101dc610a22565b34801561038e575f80fd5b5061029e61039d366004611ead565b610a56565b3480156103ad575f80fd5b506101dc610adb565b3480156103c1575f80fd5b50610226610b0e565b3480156103d5575f80fd5b506006546001600160a01b0316610252565b3480156103f2575f80fd5b50610226610b2d565b6101dc610409366004611df9565b610b3c565b348015610419575f80fd5b506101dc610428366004611ec6565b610c8c565b348015610438575f80fd5b506101dc610447366004611f6b565b610c9b565b348015610457575f80fd5b50610226610cd3565b34801561046b575f80fd5b5061022661047a366004611df9565b610d5f565b34801561048a575f80fd5b50600a546101fd9060ff1681565b3480156104a3575f80fd5b506101dc610f24565b3480156104b7575f80fd5b5061029e60095481565b3480156104cc575f80fd5b506101fd6104db36600461200f565b610f62565b3480156104eb575f80fd5b506101dc6104fa366004611ead565b610f8f565b6006546001600160a01b031633146105325760405162461bcd60e51b815260040161052990612040565b60405180910390fd5b600c61053f8284836120f2565b505050565b5f6001600160e01b031982166380ac58cd60e01b148061057457506001600160e01b03198216635b5e139f60e01b145b8061058f57506001600160e01b0319821663152a902d60e11b145b806105aa57506001600160e01b03198216632483248360e11b145b806105b957506105b982611027565b92915050565b60605f80546105cd90612075565b80601f01602080910402602001604051908101604052809291908181526020018280546105f990612075565b80156106445780601f1061061b57610100808354040283529160200191610644565b820191905f5260205f20905b81548152906001019060200180831161062757829003601f168201915b5050505050905090565b5f818152600260205260408120546001600160a01b03166106c65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610529565b505f908152600460205260409020546001600160a01b031690565b5f6106eb826109ac565b9050806001600160a01b0316836001600160a01b0316036107585760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610529565b336001600160a01b038216148061077457506107748133610f62565b6107e65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610529565b61053f8383611076565b5f6107fa60075490565b905090565b61080933826110e3565b6108255760405162461bcd60e51b8152600401610529906121ac565b61053f8383836111b8565b5f82815260026020526040812054819084906001600160a01b031661088e5760405162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610529565b6006546001600160a01b03166064600b54866108aa9190612211565b6108b4919061223c565b92509250509250929050565b6006546001600160a01b031633146108ea5760405162461bcd60e51b815260040161052990612040565b5f6108fd6006546001600160a01b031690565b6001600160a01b0316476040515f6040518083038185875af1925050503d805f8114610944576040519150601f19603f3d011682016040523d82523d5f602084013e610949565b606091505b505090508061098f5760405162461bcd60e51b81526020600482015260126024820152716661696c656420746f20776974686472617760701b6044820152606401610529565b50565b61053f83838360405180602001604052805f815250610c9b565b5f818152600260205260408120546001600160a01b0316806105b95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610529565b6006546001600160a01b03163314610a4c5760405162461bcd60e51b815260040161052990612040565b610a54611350565b565b5f6001600160a01b038216610ac05760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610529565b506001600160a01b03165f9081526003602052604090205490565b6006546001600160a01b03163314610b055760405162461bcd60e51b815260040161052990612040565b610a545f6113a5565b6040518061016001604052806101288152602001612de4610128913981565b6060600180546105cd90612075565b6009543390829081610b4d60075490565b011115610b915760405162461bcd60e51b815260206004820152601260248201527165786365656473206d617820737570706c7960701b6044820152606401610529565b6006546001600160a01b03838116911614610c415760085481023414610bf95760405162461bcd60e51b815260206004820152601c60248201527f696e76616c642076616c756520666f72207472616e61736374696f6e000000006044820152606401610529565b600a5460ff16610c415760405162461bcd60e51b81526020600482015260136024820152721b5a5b9d1a5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610529565b60015b818111610c7857610c59600780546001019055565b5f610c6360075490565b9050610c6f84826113f6565b50600101610c44565b506009546007540361053f5761053f611350565b610c9733838361140f565b5050565b610ca533836110e3565b610cc15760405162461bcd60e51b8152600401610529906121ac565b610ccd848484846114dc565b50505050565b600c8054610ce090612075565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0c90612075565b8015610d575780601f10610d2e57610100808354040283529160200191610d57565b820191905f5260205f20905b815481529060010190602001808311610d3a57829003601f168201915b505050505081565b606081610d82815f908152600260205260409020546001600160a01b0316151590565b610dc55760405162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610529565b60408051602081019091525f8152600954849173744f25b06debc03a909c8ced93fa121c6c47b77391610df760075490565b1480610e0a5750600a54610100900460ff165b15610e3957610e1761150f565b604051602001610e279190612266565b60405160208183030381529060405290505b816001600160a01b031663227183d8610e51856115de565b6040518061016001604052806101288152602001612de46101289139600c610e7888611646565b86604051602001610e8d95949392919061228d565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401610eb89190611de7565b5f60405180830381865afa158015610ed2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ef9919081019061240f565b604051602001610f099190612454565b60405160208183030381529060405294505050505b50919050565b6006546001600160a01b03163314610f4e5760405162461bcd60e51b815260040161052990612040565b600a805460ff19811660ff90911615179055565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b6006546001600160a01b03163314610fb95760405162461bcd60e51b815260040161052990612040565b6001600160a01b03811661101e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610529565b61098f816113a5565b5f6001600160e01b031982166380ac58cd60e01b148061105757506001600160e01b03198216635b5e139f60e01b145b806105b957506301ffc9a760e01b6001600160e01b03198316146105b9565b5f81815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906110aa826109ac565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f818152600260205260408120546001600160a01b031661115b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610529565b5f611165836109ac565b9050806001600160a01b0316846001600160a01b031614806111a05750836001600160a01b03166111958461064e565b6001600160a01b0316145b806111b057506111b08185610f62565b949350505050565b826001600160a01b03166111cb826109ac565b6001600160a01b03161461122f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610529565b6001600160a01b0382166112915760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610529565b61129b5f82611076565b6001600160a01b0383165f9081526003602052604081208054600192906112c3908490612485565b90915550506001600160a01b0382165f9081526003602052604081208054600192906112f0908490612498565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a805461ff0019166101001790557f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c600161138b60075490565b6040805192835260208301919091520160405180910390a1565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b610c97828260405180602001604052805f81525061172e565b816001600160a01b0316836001600160a01b0316036114705760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610529565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114e78484846111b8565b6114f384848484611760565b610ccd5760405162461bcd60e51b8152600401610529906124ab565b606073744f25b06debc03a909c8ced93fa121c6c47b7738063227183d861153461185d565b61153c611981565b60405160200161154d929190612537565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016115789190611de7565b5f60405180830381865afa158015611592573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115b9919081019061240f565b6040516020016115c99190612a2e565b60405160208183030381529060405291505090565b60606040518060400160405280601881526020017f41737465726f69642032303234204d4b204672616d652023000000000000000081525061161f83611ad8565b604051602001611630929190612a5f565b6040516020818303038152906040529050919050565b606073744f25b06debc03a909c8ced93fa121c6c47b7738063227183d861166b611981565b61168a611679600188612485565b611685906101e0612211565b611ad8565b60405160200161169b929190612a73565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016116c69190611de7565b5f60405180830381865afa1580156116e0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611707919081019061240f565b6040516020016117179190612a2e565b604051602081830303815290604052915050919050565b6117388383611bd5565b6117445f848484611760565b61053f5760405162461bcd60e51b8152600401610529906124ab565b5f6001600160a01b0384163b1561185257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906117a3903390899088908890600401612d23565b6020604051808303815f875af19250505080156117dd575060408051601f3d908101601f191682019092526117da91810190612d5f565b60015b611838573d80801561180a576040519150601f19603f3d011682016040523d82523d5f602084013e61180f565b606091505b5080515f036118305760405162461bcd60e51b8152600401610529906124ab565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506111b0565b506001949350505050565b604051635043d43f60e11b815273b99d83a0f54201a11746eea706b8cffb0564e577600482015260609073744f25b06debc03a909c8ced93fa121c6c47b773905f90829063a087a87e906024015f60405180830381865afa1580156118c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118eb919081019061240f565b60405163044e307b60e31b81529091506001600160a01b0383169063227183d89061191a908490600401611de7565b5f60405180830381865afa158015611934573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261195b919081019061240f565b60405160200161196b9190612d7a565b6040516020818303038152906040529250505090565b604051635043d43f60e11b8152731527e3d026e2ecc80fc935d5754de0f556185c29600482015260609073744f25b06debc03a909c8ced93fa121c6c47b773905f90829063a087a87e906024015f60405180830381865afa1580156119e8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a0f919081019061240f565b604051635043d43f60e11b815273c9cd1e03faa13d4e41001039cb2aa7de574120d360048201526001600160a01b0384169063a087a87e906024015f60405180830381865afa158015611a64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a8b919081019061240f565b604051602001611a9c929190612a5f565b60408051601f198184030181529082905263044e307b60e31b825291506001600160a01b0383169063227183d89061191a908490600401611de7565b6060815f03611afe5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611b275780611b1181612da4565b9150611b209050600a8361223c565b9150611b01565b5f8167ffffffffffffffff811115611b4157611b41611eff565b6040519080825280601f01601f191660200182016040528015611b6b576020820181803683370190505b5090505b84156111b057611b80600183612485565b9150611b8d600a86612dbc565b611b98906030612498565b60f81b818381518110611bad57611bad612dcf565b60200101906001600160f81b03191690815f1a905350611bce600a8661223c565b9450611b6f565b6001600160a01b038216611c2b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610529565b5f818152600260205260409020546001600160a01b031615611c8f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610529565b6001600160a01b0382165f908152600360205260408120805460019290611cb7908490612498565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f8060208385031215611d25575f80fd5b823567ffffffffffffffff811115611d3b575f80fd5b8301601f81018513611d4b575f80fd5b803567ffffffffffffffff811115611d61575f80fd5b856020828401011115611d72575f80fd5b6020919091019590945092505050565b6001600160e01b03198116811461098f575f80fd5b5f60208284031215611da7575f80fd5b8135611db281611d82565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f611db26020830184611db9565b5f60208284031215611e09575f80fd5b5035919050565b80356001600160a01b0381168114611e26575f80fd5b919050565b5f8060408385031215611e3c575f80fd5b611e4583611e10565b946020939093013593505050565b5f805f60608486031215611e65575f80fd5b611e6e84611e10565b9250611e7c60208501611e10565b929592945050506040919091013590565b5f8060408385031215611e9e575f80fd5b50508035926020909101359150565b5f60208284031215611ebd575f80fd5b611db282611e10565b5f8060408385031215611ed7575f80fd5b611ee083611e10565b915060208301358015158114611ef4575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611f3c57611f3c611eff565b604052919050565b5f67ffffffffffffffff821115611f5d57611f5d611eff565b50601f01601f191660200190565b5f805f8060808587031215611f7e575f80fd5b611f8785611e10565b9350611f9560208601611e10565b925060408501359150606085013567ffffffffffffffff811115611fb7575f80fd5b8501601f81018713611fc7575f80fd5b8035611fda611fd582611f44565b611f13565b818152886020838501011115611fee575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215612020575f80fd5b61202983611e10565b915061203760208401611e10565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061208957607f821691505b602082108103610f1e57634e487b7160e01b5f52602260045260245ffd5b601f82111561053f57805f5260205f20601f840160051c810160208510156120cc5750805b601f840160051c820191505b818110156120eb575f81556001016120d8565b5050505050565b67ffffffffffffffff83111561210a5761210a611eff565b61211e836121188354612075565b836120a7565b5f601f84116001811461214f575f85156121385750838201355b5f19600387901b1c1916600186901b1783556120eb565b5f83815260208120601f198716915b8281101561217e578685013582556020948501946001909201910161215e565b508682101561219a575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176105b9576105b96121fd565b634e487b7160e01b5f52601260045260245ffd5b5f8261224a5761224a612228565b500490565b5f81518060208401855e5f93019283525090919050565b7211161130b734b6b0ba34b7b72fbab936111d1160691b81525f611db2601383018461224f565b683d913730b6b2911d1160b91b81525f6122aa600983018861224f565b701116113232b9b1b934b83a34b7b7111d1160791b81526122ce601182018861224f565b7f222c22637265646974223a22436f757274657379204e4153412f4a504c2d43618152671b1d1958da0b888b60c21b60208201526f1132bc3a32b93730b62fbab936111d1160811b602882015286549091505f9061232b81612075565b600182168015612342576001811461235d57612390565b60ff1983166038860152603882151583028601019350612390565b895f5260205f205f5b8381101561238557815487820160380152600190910190602001612366565b505060388286010193505b50506a11161134b6b0b3b2911d1160a91b8252506123ba6123b4600b83018861224f565b8661224f565b9150506123cb8161227d60f01b9052565b600201979650505050505050565b5f6123e6611fd584611f44565b90508281528383830111156123f9575f80fd5b8282602083015e5f602084830101529392505050565b5f6020828403121561241f575f80fd5b815167ffffffffffffffff811115612435575f80fd5b8201601f81018413612445575f80fd5b6111b0848251602084016123d9565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f611db2601d83018461224f565b818103818111156105b9576105b96121fd565b808201808211156105b9576105b96121fd565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f3c73637269707420747970653d22746578742f6a617661736372697074223e3c815267215b43444154415b60c01b602082015260280190565b7f3c7376672069643d2273222077696474683d223132383022206865696768743d81527f223438302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32602082015268018181817b9bb3391160bd1b60408201527f76696577426f783d223020302033323020313230223e3c7374796c653e00000060498201527f6469767b77696474683a313030253b6865696768743a313030257d2e627b626160668201527f636b67726f756e642d73697a653a313530253b6261636b67726f756e642d696d60868201526830b3b29d3ab936141160b91b60a68201525f61265e61262760af84018661224f565b7f22293b616e696d6174696f6e3a206220323573206c696e65617220696e66696e8152646974653b7d60d81b602082015260250190565b7f2e617b6261636b67726f756e642d73697a653a6175746f20313030253b00000081527f616e696d6174696f6e3a6620313273207374657073283234302920696e66696e601d8201527f6974653b6261636b67726f756e642d696d6167653a75726c2822000000000000603d8201526126da605782018561224f565b6222297d60e81b81527f2e637b616e696d6174696f6e3a7020313073206c696e65617220696e66696e6960038201527f74653b7472616e73666f726d3a207472616e736c61746558282d35307078297d60238201527f406b65796672616d65732062207b313030257b6261636b67726f756e642d706f604382015270736974696f6e3a2d343830707820307d7d60781b60638201527f406b65796672616d65732066207b313030257b6261636b67726f756e642d706f607482015271736974696f6e3a2d37363830707820307d7d60701b60948201527f406b65796672616d65732070207b313030257b7472616e73666f726d3a20747260a68201527f616e736c617465582831303025297d7d3c2f7374796c653e000000000000000060c68201527f3c666f726569676e4f626a6563742077696474683d223130302522206865696760de82015269343a1e9118981812911f60b11b60fe8201527f3c64697620636c6173733d22622220786d6c6e733d22687474703a2f2f7777776101088201527f2e77332e6f72672f313939392f7868746d6c223e3c2f6469763e3c2f666f72656101288201526934b3b727b13532b1ba1f60b11b6101488201527f3c666f726569676e4f626a65637420636c6173733d22632220783d22302220796101528201527f3d22343025222077696474683d22333222206865696768743d223332223e00006101728201529050612a0d6129ae61295f61295a61019085017f3c64697620636c6173733d22612220786d6c6e733d22687474703a2f2f77777781527f2e77332e6f72672f313939392f7868746d6c223e3c2f6469763e3c2f666f726560208201526934b3b727b13532b1ba1f60b11b6040820152604a0190565b6124fd565b7f6c657420733d646f63756d656e742e676574456c656d656e744279496428227381527f22293b696628732e706172656e743d3d756e646566696e6564290000000000006020820152603a0190565b7f732e7374796c653d226d617267696e3a63616c6328283130307668202d20343881527f307078292f3229206175746f3b6261636b67726f756e642d636f6c6f723a233260208201526619191d912eae9f60c91b604082015260470190565b6e1e17b9b1b934b83a1f1e17b9bb339f60891b8152600f0195945050505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000081525f611db2601a83018461224f565b5f6111b0612a6d838661224f565b8461224f565b7f3c7376672069643d2273222077696474683d2236343022206865696768743d2281527f3634302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f3230602082015267181817b9bb33911f60c11b60408201527f3c7374796c653e6469767b77696474683a313030253b6865696768743a313030604882015261253b60f01b60688201527f6261636b67726f756e642d73697a653a6175746f20313030253b6261636b6772606a82019081527f6f756e642d7265706561743a206e6f2d7265706561743b000000000000000000608a8301525f9060a18301612b7481753130b1b5b3b937bab73216b4b6b0b3b29d3ab936141160511b9052565b612b81601682018761224f565b915050612bad817f22293b6261636b67726f756e642d706f736974696f6e2d783a2d0000000000009052565b612bba601a82018561224f565b6b383c1dbe9e17b9ba3cb6329f60a11b81527f3c726563742077696474683d223130302522206865696768743d223130302522600c8201526d103334b6361e911198181811179f60911b602c8201527f3c666f726569676e4f626a65637420783d22383070782220793d223830707822603a8201527f2077696474683d22343830707822206865696768743d223438307078223e0000605a8201527f3c64697620786d6c6e733d22687474703a2f2f7777772e77332e6f72672f313960788201526f1c9c97bc343a36b6111f1e17b234bb1f60811b6098820152905060a881016f1e17b337b932b4b3b727b13532b1ba1f60811b81529050612a0d612cc461295f601084016124fd565b7f732e7374796c653d226d617267696e3a63616c6328283130307668202d20363481527f307078292f3229206175746f3b6261636b67726f756e642d636f6c6f723a233260208201526619191d912eae9f60c91b604082015260470190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90612d5590830184611db9565b9695505050505050565b5f60208284031215612d6f575f80fd5b8151611db281611d82565b7519185d184e9a5b5859d94bdc1b99ced8985cd94d8d0b60521b81525f611db2601683018461224f565b5f60018201612db557612db56121fd565b5060010190565b5f82612dca57612dca612228565b500690565b634e487b7160e01b5f52603260045260245ffdfe4f6e204a756e652032392c20323032342061742031333a3439205554432c2074686520313530206d6574657220776964652061737465726f69642032303234204d4b207061737365642075732062792061742061206d657265203239352c303030206b6d2e20546865206f726967696e616c20696d6167657320776572652067656e6572617465642066726f6d20726164617220646174612066726f6d20746865204e4153412044656570205370616365204e6574776f726b2e20546865792068617665206265656e20636f6d7072657373656420616e642070726573657276656420686572652066756c6c79206f6e2d636861696e2e205468616e6b20796f7520666f72207669736974696e672c20736166652074726176656c7320737061636520726f636b2ea2646970667358221220c8b19a0d640516660f32d6b74052cf098cba17479689b67b709b858e435eec7864736f6c634300081a0033
Deployed Bytecode
0x6080604052600436106101b2575f3560e01c8063715018a6116100e7578063b99edfb211610087578063d3dd5fe011610062578063d3dd5fe014610498578063d5abeb01146104ac578063e985e9c5146104c1578063f2fde38b146104e0575f80fd5b8063b99edfb21461044c578063c87b56dd14610460578063d12397301461047f575f80fd5b806395d89b41116100c257806395d89b41146103e7578063a0712d68146103fb578063a22cb4651461040e578063b88d4fde1461042d575f80fd5b8063715018a6146103a25780637284e416146103b65780638da5cb5b146103ca575f80fd5b806323b872dd1161015257806342842e0e1161012d57806342842e0e146103315780636352211e146103505780636e0d39e41461036f57806370a0823114610383575f80fd5b806323b872dd146102c05780632a55205a146102df5780633ccfd60b1461031d575f80fd5b8063081812fc1161018d578063081812fc14610233578063095ea7b31461026a57806313966db51461028957806318160ddd146102ac575f80fd5b806301dbcd4a146101bd57806301ffc9a7146101de57806306fdde0314610212575f80fd5b366101b957005b5f80fd5b3480156101c8575f80fd5b506101dc6101d7366004611d14565b6104ff565b005b3480156101e9575f80fd5b506101fd6101f8366004611d97565b610544565b60405190151581526020015b60405180910390f35b34801561021d575f80fd5b506102266105bf565b6040516102099190611de7565b34801561023e575f80fd5b5061025261024d366004611df9565b61064e565b6040516001600160a01b039091168152602001610209565b348015610275575f80fd5b506101dc610284366004611e2b565b6106e1565b348015610294575f80fd5b5061029e60085481565b604051908152602001610209565b3480156102b7575f80fd5b5061029e6107f0565b3480156102cb575f80fd5b506101dc6102da366004611e53565b6107ff565b3480156102ea575f80fd5b506102fe6102f9366004611e8d565b610830565b604080516001600160a01b039093168352602083019190915201610209565b348015610328575f80fd5b506101dc6108c0565b34801561033c575f80fd5b506101dc61034b366004611e53565b610992565b34801561035b575f80fd5b5061025261036a366004611df9565b6109ac565b34801561037a575f80fd5b506101dc610a22565b34801561038e575f80fd5b5061029e61039d366004611ead565b610a56565b3480156103ad575f80fd5b506101dc610adb565b3480156103c1575f80fd5b50610226610b0e565b3480156103d5575f80fd5b506006546001600160a01b0316610252565b3480156103f2575f80fd5b50610226610b2d565b6101dc610409366004611df9565b610b3c565b348015610419575f80fd5b506101dc610428366004611ec6565b610c8c565b348015610438575f80fd5b506101dc610447366004611f6b565b610c9b565b348015610457575f80fd5b50610226610cd3565b34801561046b575f80fd5b5061022661047a366004611df9565b610d5f565b34801561048a575f80fd5b50600a546101fd9060ff1681565b3480156104a3575f80fd5b506101dc610f24565b3480156104b7575f80fd5b5061029e60095481565b3480156104cc575f80fd5b506101fd6104db36600461200f565b610f62565b3480156104eb575f80fd5b506101dc6104fa366004611ead565b610f8f565b6006546001600160a01b031633146105325760405162461bcd60e51b815260040161052990612040565b60405180910390fd5b600c61053f8284836120f2565b505050565b5f6001600160e01b031982166380ac58cd60e01b148061057457506001600160e01b03198216635b5e139f60e01b145b8061058f57506001600160e01b0319821663152a902d60e11b145b806105aa57506001600160e01b03198216632483248360e11b145b806105b957506105b982611027565b92915050565b60605f80546105cd90612075565b80601f01602080910402602001604051908101604052809291908181526020018280546105f990612075565b80156106445780601f1061061b57610100808354040283529160200191610644565b820191905f5260205f20905b81548152906001019060200180831161062757829003601f168201915b5050505050905090565b5f818152600260205260408120546001600160a01b03166106c65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610529565b505f908152600460205260409020546001600160a01b031690565b5f6106eb826109ac565b9050806001600160a01b0316836001600160a01b0316036107585760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610529565b336001600160a01b038216148061077457506107748133610f62565b6107e65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610529565b61053f8383611076565b5f6107fa60075490565b905090565b61080933826110e3565b6108255760405162461bcd60e51b8152600401610529906121ac565b61053f8383836111b8565b5f82815260026020526040812054819084906001600160a01b031661088e5760405162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610529565b6006546001600160a01b03166064600b54866108aa9190612211565b6108b4919061223c565b92509250509250929050565b6006546001600160a01b031633146108ea5760405162461bcd60e51b815260040161052990612040565b5f6108fd6006546001600160a01b031690565b6001600160a01b0316476040515f6040518083038185875af1925050503d805f8114610944576040519150601f19603f3d011682016040523d82523d5f602084013e610949565b606091505b505090508061098f5760405162461bcd60e51b81526020600482015260126024820152716661696c656420746f20776974686472617760701b6044820152606401610529565b50565b61053f83838360405180602001604052805f815250610c9b565b5f818152600260205260408120546001600160a01b0316806105b95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610529565b6006546001600160a01b03163314610a4c5760405162461bcd60e51b815260040161052990612040565b610a54611350565b565b5f6001600160a01b038216610ac05760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610529565b506001600160a01b03165f9081526003602052604090205490565b6006546001600160a01b03163314610b055760405162461bcd60e51b815260040161052990612040565b610a545f6113a5565b6040518061016001604052806101288152602001612de4610128913981565b6060600180546105cd90612075565b6009543390829081610b4d60075490565b011115610b915760405162461bcd60e51b815260206004820152601260248201527165786365656473206d617820737570706c7960701b6044820152606401610529565b6006546001600160a01b03838116911614610c415760085481023414610bf95760405162461bcd60e51b815260206004820152601c60248201527f696e76616c642076616c756520666f72207472616e61736374696f6e000000006044820152606401610529565b600a5460ff16610c415760405162461bcd60e51b81526020600482015260136024820152721b5a5b9d1a5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610529565b60015b818111610c7857610c59600780546001019055565b5f610c6360075490565b9050610c6f84826113f6565b50600101610c44565b506009546007540361053f5761053f611350565b610c9733838361140f565b5050565b610ca533836110e3565b610cc15760405162461bcd60e51b8152600401610529906121ac565b610ccd848484846114dc565b50505050565b600c8054610ce090612075565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0c90612075565b8015610d575780601f10610d2e57610100808354040283529160200191610d57565b820191905f5260205f20905b815481529060010190602001808311610d3a57829003601f168201915b505050505081565b606081610d82815f908152600260205260409020546001600160a01b0316151590565b610dc55760405162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610529565b60408051602081019091525f8152600954849173744f25b06debc03a909c8ced93fa121c6c47b77391610df760075490565b1480610e0a5750600a54610100900460ff165b15610e3957610e1761150f565b604051602001610e279190612266565b60405160208183030381529060405290505b816001600160a01b031663227183d8610e51856115de565b6040518061016001604052806101288152602001612de46101289139600c610e7888611646565b86604051602001610e8d95949392919061228d565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401610eb89190611de7565b5f60405180830381865afa158015610ed2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ef9919081019061240f565b604051602001610f099190612454565b60405160208183030381529060405294505050505b50919050565b6006546001600160a01b03163314610f4e5760405162461bcd60e51b815260040161052990612040565b600a805460ff19811660ff90911615179055565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b6006546001600160a01b03163314610fb95760405162461bcd60e51b815260040161052990612040565b6001600160a01b03811661101e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610529565b61098f816113a5565b5f6001600160e01b031982166380ac58cd60e01b148061105757506001600160e01b03198216635b5e139f60e01b145b806105b957506301ffc9a760e01b6001600160e01b03198316146105b9565b5f81815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906110aa826109ac565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f818152600260205260408120546001600160a01b031661115b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610529565b5f611165836109ac565b9050806001600160a01b0316846001600160a01b031614806111a05750836001600160a01b03166111958461064e565b6001600160a01b0316145b806111b057506111b08185610f62565b949350505050565b826001600160a01b03166111cb826109ac565b6001600160a01b03161461122f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610529565b6001600160a01b0382166112915760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610529565b61129b5f82611076565b6001600160a01b0383165f9081526003602052604081208054600192906112c3908490612485565b90915550506001600160a01b0382165f9081526003602052604081208054600192906112f0908490612498565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a805461ff0019166101001790557f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c600161138b60075490565b6040805192835260208301919091520160405180910390a1565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b610c97828260405180602001604052805f81525061172e565b816001600160a01b0316836001600160a01b0316036114705760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610529565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114e78484846111b8565b6114f384848484611760565b610ccd5760405162461bcd60e51b8152600401610529906124ab565b606073744f25b06debc03a909c8ced93fa121c6c47b7738063227183d861153461185d565b61153c611981565b60405160200161154d929190612537565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016115789190611de7565b5f60405180830381865afa158015611592573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115b9919081019061240f565b6040516020016115c99190612a2e565b60405160208183030381529060405291505090565b60606040518060400160405280601881526020017f41737465726f69642032303234204d4b204672616d652023000000000000000081525061161f83611ad8565b604051602001611630929190612a5f565b6040516020818303038152906040529050919050565b606073744f25b06debc03a909c8ced93fa121c6c47b7738063227183d861166b611981565b61168a611679600188612485565b611685906101e0612211565b611ad8565b60405160200161169b929190612a73565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016116c69190611de7565b5f60405180830381865afa1580156116e0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611707919081019061240f565b6040516020016117179190612a2e565b604051602081830303815290604052915050919050565b6117388383611bd5565b6117445f848484611760565b61053f5760405162461bcd60e51b8152600401610529906124ab565b5f6001600160a01b0384163b1561185257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906117a3903390899088908890600401612d23565b6020604051808303815f875af19250505080156117dd575060408051601f3d908101601f191682019092526117da91810190612d5f565b60015b611838573d80801561180a576040519150601f19603f3d011682016040523d82523d5f602084013e61180f565b606091505b5080515f036118305760405162461bcd60e51b8152600401610529906124ab565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506111b0565b506001949350505050565b604051635043d43f60e11b815273b99d83a0f54201a11746eea706b8cffb0564e577600482015260609073744f25b06debc03a909c8ced93fa121c6c47b773905f90829063a087a87e906024015f60405180830381865afa1580156118c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118eb919081019061240f565b60405163044e307b60e31b81529091506001600160a01b0383169063227183d89061191a908490600401611de7565b5f60405180830381865afa158015611934573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261195b919081019061240f565b60405160200161196b9190612d7a565b6040516020818303038152906040529250505090565b604051635043d43f60e11b8152731527e3d026e2ecc80fc935d5754de0f556185c29600482015260609073744f25b06debc03a909c8ced93fa121c6c47b773905f90829063a087a87e906024015f60405180830381865afa1580156119e8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a0f919081019061240f565b604051635043d43f60e11b815273c9cd1e03faa13d4e41001039cb2aa7de574120d360048201526001600160a01b0384169063a087a87e906024015f60405180830381865afa158015611a64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a8b919081019061240f565b604051602001611a9c929190612a5f565b60408051601f198184030181529082905263044e307b60e31b825291506001600160a01b0383169063227183d89061191a908490600401611de7565b6060815f03611afe5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611b275780611b1181612da4565b9150611b209050600a8361223c565b9150611b01565b5f8167ffffffffffffffff811115611b4157611b41611eff565b6040519080825280601f01601f191660200182016040528015611b6b576020820181803683370190505b5090505b84156111b057611b80600183612485565b9150611b8d600a86612dbc565b611b98906030612498565b60f81b818381518110611bad57611bad612dcf565b60200101906001600160f81b03191690815f1a905350611bce600a8661223c565b9450611b6f565b6001600160a01b038216611c2b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610529565b5f818152600260205260409020546001600160a01b031615611c8f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610529565b6001600160a01b0382165f908152600360205260408120805460019290611cb7908490612498565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f8060208385031215611d25575f80fd5b823567ffffffffffffffff811115611d3b575f80fd5b8301601f81018513611d4b575f80fd5b803567ffffffffffffffff811115611d61575f80fd5b856020828401011115611d72575f80fd5b6020919091019590945092505050565b6001600160e01b03198116811461098f575f80fd5b5f60208284031215611da7575f80fd5b8135611db281611d82565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f611db26020830184611db9565b5f60208284031215611e09575f80fd5b5035919050565b80356001600160a01b0381168114611e26575f80fd5b919050565b5f8060408385031215611e3c575f80fd5b611e4583611e10565b946020939093013593505050565b5f805f60608486031215611e65575f80fd5b611e6e84611e10565b9250611e7c60208501611e10565b929592945050506040919091013590565b5f8060408385031215611e9e575f80fd5b50508035926020909101359150565b5f60208284031215611ebd575f80fd5b611db282611e10565b5f8060408385031215611ed7575f80fd5b611ee083611e10565b915060208301358015158114611ef4575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611f3c57611f3c611eff565b604052919050565b5f67ffffffffffffffff821115611f5d57611f5d611eff565b50601f01601f191660200190565b5f805f8060808587031215611f7e575f80fd5b611f8785611e10565b9350611f9560208601611e10565b925060408501359150606085013567ffffffffffffffff811115611fb7575f80fd5b8501601f81018713611fc7575f80fd5b8035611fda611fd582611f44565b611f13565b818152886020838501011115611fee575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215612020575f80fd5b61202983611e10565b915061203760208401611e10565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061208957607f821691505b602082108103610f1e57634e487b7160e01b5f52602260045260245ffd5b601f82111561053f57805f5260205f20601f840160051c810160208510156120cc5750805b601f840160051c820191505b818110156120eb575f81556001016120d8565b5050505050565b67ffffffffffffffff83111561210a5761210a611eff565b61211e836121188354612075565b836120a7565b5f601f84116001811461214f575f85156121385750838201355b5f19600387901b1c1916600186901b1783556120eb565b5f83815260208120601f198716915b8281101561217e578685013582556020948501946001909201910161215e565b508682101561219a575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176105b9576105b96121fd565b634e487b7160e01b5f52601260045260245ffd5b5f8261224a5761224a612228565b500490565b5f81518060208401855e5f93019283525090919050565b7211161130b734b6b0ba34b7b72fbab936111d1160691b81525f611db2601383018461224f565b683d913730b6b2911d1160b91b81525f6122aa600983018861224f565b701116113232b9b1b934b83a34b7b7111d1160791b81526122ce601182018861224f565b7f222c22637265646974223a22436f757274657379204e4153412f4a504c2d43618152671b1d1958da0b888b60c21b60208201526f1132bc3a32b93730b62fbab936111d1160811b602882015286549091505f9061232b81612075565b600182168015612342576001811461235d57612390565b60ff1983166038860152603882151583028601019350612390565b895f5260205f205f5b8381101561238557815487820160380152600190910190602001612366565b505060388286010193505b50506a11161134b6b0b3b2911d1160a91b8252506123ba6123b4600b83018861224f565b8661224f565b9150506123cb8161227d60f01b9052565b600201979650505050505050565b5f6123e6611fd584611f44565b90508281528383830111156123f9575f80fd5b8282602083015e5f602084830101529392505050565b5f6020828403121561241f575f80fd5b815167ffffffffffffffff811115612435575f80fd5b8201601f81018413612445575f80fd5b6111b0848251602084016123d9565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f611db2601d83018461224f565b818103818111156105b9576105b96121fd565b808201808211156105b9576105b96121fd565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f3c73637269707420747970653d22746578742f6a617661736372697074223e3c815267215b43444154415b60c01b602082015260280190565b7f3c7376672069643d2273222077696474683d223132383022206865696768743d81527f223438302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32602082015268018181817b9bb3391160bd1b60408201527f76696577426f783d223020302033323020313230223e3c7374796c653e00000060498201527f6469767b77696474683a313030253b6865696768743a313030257d2e627b626160668201527f636b67726f756e642d73697a653a313530253b6261636b67726f756e642d696d60868201526830b3b29d3ab936141160b91b60a68201525f61265e61262760af84018661224f565b7f22293b616e696d6174696f6e3a206220323573206c696e65617220696e66696e8152646974653b7d60d81b602082015260250190565b7f2e617b6261636b67726f756e642d73697a653a6175746f20313030253b00000081527f616e696d6174696f6e3a6620313273207374657073283234302920696e66696e601d8201527f6974653b6261636b67726f756e642d696d6167653a75726c2822000000000000603d8201526126da605782018561224f565b6222297d60e81b81527f2e637b616e696d6174696f6e3a7020313073206c696e65617220696e66696e6960038201527f74653b7472616e73666f726d3a207472616e736c61746558282d35307078297d60238201527f406b65796672616d65732062207b313030257b6261636b67726f756e642d706f604382015270736974696f6e3a2d343830707820307d7d60781b60638201527f406b65796672616d65732066207b313030257b6261636b67726f756e642d706f607482015271736974696f6e3a2d37363830707820307d7d60701b60948201527f406b65796672616d65732070207b313030257b7472616e73666f726d3a20747260a68201527f616e736c617465582831303025297d7d3c2f7374796c653e000000000000000060c68201527f3c666f726569676e4f626a6563742077696474683d223130302522206865696760de82015269343a1e9118981812911f60b11b60fe8201527f3c64697620636c6173733d22622220786d6c6e733d22687474703a2f2f7777776101088201527f2e77332e6f72672f313939392f7868746d6c223e3c2f6469763e3c2f666f72656101288201526934b3b727b13532b1ba1f60b11b6101488201527f3c666f726569676e4f626a65637420636c6173733d22632220783d22302220796101528201527f3d22343025222077696474683d22333222206865696768743d223332223e00006101728201529050612a0d6129ae61295f61295a61019085017f3c64697620636c6173733d22612220786d6c6e733d22687474703a2f2f77777781527f2e77332e6f72672f313939392f7868746d6c223e3c2f6469763e3c2f666f726560208201526934b3b727b13532b1ba1f60b11b6040820152604a0190565b6124fd565b7f6c657420733d646f63756d656e742e676574456c656d656e744279496428227381527f22293b696628732e706172656e743d3d756e646566696e6564290000000000006020820152603a0190565b7f732e7374796c653d226d617267696e3a63616c6328283130307668202d20343881527f307078292f3229206175746f3b6261636b67726f756e642d636f6c6f723a233260208201526619191d912eae9f60c91b604082015260470190565b6e1e17b9b1b934b83a1f1e17b9bb339f60891b8152600f0195945050505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000081525f611db2601a83018461224f565b5f6111b0612a6d838661224f565b8461224f565b7f3c7376672069643d2273222077696474683d2236343022206865696768743d2281527f3634302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f3230602082015267181817b9bb33911f60c11b60408201527f3c7374796c653e6469767b77696474683a313030253b6865696768743a313030604882015261253b60f01b60688201527f6261636b67726f756e642d73697a653a6175746f20313030253b6261636b6772606a82019081527f6f756e642d7265706561743a206e6f2d7265706561743b000000000000000000608a8301525f9060a18301612b7481753130b1b5b3b937bab73216b4b6b0b3b29d3ab936141160511b9052565b612b81601682018761224f565b915050612bad817f22293b6261636b67726f756e642d706f736974696f6e2d783a2d0000000000009052565b612bba601a82018561224f565b6b383c1dbe9e17b9ba3cb6329f60a11b81527f3c726563742077696474683d223130302522206865696768743d223130302522600c8201526d103334b6361e911198181811179f60911b602c8201527f3c666f726569676e4f626a65637420783d22383070782220793d223830707822603a8201527f2077696474683d22343830707822206865696768743d223438307078223e0000605a8201527f3c64697620786d6c6e733d22687474703a2f2f7777772e77332e6f72672f313960788201526f1c9c97bc343a36b6111f1e17b234bb1f60811b6098820152905060a881016f1e17b337b932b4b3b727b13532b1ba1f60811b81529050612a0d612cc461295f601084016124fd565b7f732e7374796c653d226d617267696e3a63616c6328283130307668202d20363481527f307078292f3229206175746f3b6261636b67726f756e642d636f6c6f723a233260208201526619191d912eae9f60c91b604082015260470190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90612d5590830184611db9565b9695505050505050565b5f60208284031215612d6f575f80fd5b8151611db281611d82565b7519185d184e9a5b5859d94bdc1b99ced8985cd94d8d0b60521b81525f611db2601683018461224f565b5f60018201612db557612db56121fd565b5060010190565b5f82612dca57612dca612228565b500690565b634e487b7160e01b5f52603260045260245ffdfe4f6e204a756e652032392c20323032342061742031333a3439205554432c2074686520313530206d6574657220776964652061737465726f69642032303234204d4b207061737365642075732062792061742061206d657265203239352c303030206b6d2e20546865206f726967696e616c20696d6167657320776572652067656e6572617465642066726f6d20726164617220646174612066726f6d20746865204e4153412044656570205370616365204e6574776f726b2e20546865792068617665206265656e20636f6d7072657373656420616e642070726573657276656420686572652066756c6c79206f6e2d636861696e2e205468616e6b20796f7520666f72207669736974696e672c20736166652074726176656c7320737061636520726f636b2ea2646970667358221220c8b19a0d640516660f32d6b74052cf098cba17479689b67b709b858e435eec7864736f6c634300081a0033
Deployed Bytecode Sourcemap
566:9724:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9902:96;;;;;;;;;;-1:-1:-1;9902:96:11;;;;;:::i;:::-;;:::i;:::-;;2148:380;;;;;;;;;;-1:-1:-1;2148:380:11;;;;;:::i;:::-;;:::i;:::-;;;1157:14:14;;1150:22;1132:41;;1120:2;1105:18;2148:380:11;;;;;;;;2423:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3934:217::-;;;;;;;;;;-1:-1:-1;3934:217:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2120:32:14;;;2102:51;;2090:2;2075:18;3934:217:4;1956:203:14;3472:401:4;;;;;;;;;;-1:-1:-1;3472:401:4;;;;;:::i;:::-;;:::i;1107:36:11:-;;;;;;;;;;;;;;;;;;;2793:25:14;;;2781:2;2766:18;1107:36:11;2647:177:14;2745:91:11;;;;;;;;;;;;;:::i;4661:330:4:-;;;;;;;;;;-1:-1:-1;4661:330:4;;;;;:::i;:::-;;:::i;9289:238:11:-;;;;;;;;;;-1:-1:-1;9289:238:11;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3751:32:14;;;3733:51;;3815:2;3800:18;;3793:34;;;;3706:18;9289:238:11;3559:274:14;10119:168:11;;;;;;;;;;;;;:::i;5057:179:4:-;;;;;;;;;;-1:-1:-1;5057:179:4;;;;;:::i;:::-;;:::i;2126:235::-;;;;;;;;;;-1:-1:-1;2126:235:4;;;;;:::i;:::-;;:::i;9736:64:11:-;;;;;;;;;;;;;:::i;1864:205:4:-;;;;;;;;;;-1:-1:-1;1864:205:4;;;;;:::i;:::-;;:::i;1661:101:12:-;;;;;;;;;;;;;:::i;1505:407:11:-;;;;;;;;;;;;;:::i;1029:85:12:-;;;;;;;;;;-1:-1:-1;1101:6:12;;-1:-1:-1;;;;;1101:6:12;1029:85;;2585:102:4;;;;;;;;;;;;;:::i;2941:630:11:-;;;;;;:::i;:::-;;:::i;4218:153:4:-;;;;;;;;;;-1:-1:-1;4218:153:4;;;;;:::i;:::-;;:::i;5302:320::-;;;;;;;;;;-1:-1:-1;5302:320:4;;;;;:::i;:::-;;:::i;1441:60:11:-;;;;;;;;;;;;;:::i;3633:1077::-;;;;;;;;;;-1:-1:-1;3633:1077:11;;;;;:::i;:::-;;:::i;1342:31::-;;;;;;;;;;-1:-1:-1;1342:31:11;;;;;;;;10036:78;;;;;;;;;;;;;:::i;1236:30::-;;;;;;;;;;;;;;;;4437:162:4;;;;;;;;;;-1:-1:-1;4437:162:4;;;;;:::i;:::-;;:::i;1911:198:12:-;;;;;;;;;;-1:-1:-1;1911:198:12;;;;;:::i;:::-;;:::i;9902:96:11:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;;;;;;;;;9975:11:11::1;:18;9989:4:::0;;9975:11;:18:::1;:::i;:::-;;9902:96:::0;;:::o;2148:380::-;2250:4;-1:-1:-1;;;;;;2277:40:11;;-1:-1:-1;;;2277:40:11;;:100;;-1:-1:-1;;;;;;;2329:48:11;;-1:-1:-1;;;2329:48:11;2277:100;:153;;;-1:-1:-1;;;;;;;2389:41:11;;-1:-1:-1;;;2389:41:11;2277:153;:198;;;-1:-1:-1;;;;;;;2442:33:11;;-1:-1:-1;;;2442:33:11;2277:198;:246;;;;2487:36;2511:11;2487:23;:36::i;:::-;2262:261;2148:380;-1:-1:-1;;2148:380:11:o;2423:98:4:-;2477:13;2509:5;2502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2423:98;:::o;3934:217::-;4010:7;7182:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7182:16:4;4029:73;;;;-1:-1:-1;;;4029:73:4;;9183:2:14;4029:73:4;;;9165:21:14;9222:2;9202:18;;;9195:30;9261:34;9241:18;;;9234:62;-1:-1:-1;;;9312:18:14;;;9305:42;9364:19;;4029:73:4;8981:408:14;4029:73:4;-1:-1:-1;4120:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4120:24:4;;3934:217::o;3472:401::-;3552:13;3568:23;3583:7;3568:14;:23::i;:::-;3552:39;;3615:5;-1:-1:-1;;;;;3609:11:4;:2;-1:-1:-1;;;;;3609:11:4;;3601:57;;;;-1:-1:-1;;;3601:57:4;;9596:2:14;3601:57:4;;;9578:21:14;9635:2;9615:18;;;9608:30;9674:34;9654:18;;;9647:62;-1:-1:-1;;;9725:18:14;;;9718:31;9766:19;;3601:57:4;9394:397:14;3601:57:4;719:10:1;-1:-1:-1;;;;;3690:21:4;;;;:62;;-1:-1:-1;3715:37:4;3732:5;719:10:1;4437:162:4;:::i;3715:37::-;3669:165;;;;-1:-1:-1;;;3669:165:4;;9998:2:14;3669:165:4;;;9980:21:14;10037:2;10017:18;;;10010:30;10076:34;10056:18;;;10049:62;10147:26;10127:18;;;10120:54;10191:19;;3669:165:4;9796:420:14;3669:165:4;3845:21;3854:2;3858:7;3845:8;:21::i;2745:91:11:-;2791:7;2815:16;:6;918:14:2;;827:112;2815:16:11;2808:23;;2745:91;:::o;4661:330:4:-;4850:41;719:10:1;4883:7:4;4850:18;:41::i;:::-;4842:103;;;;-1:-1:-1;;;4842:103:4;;;;;;;:::i;:::-;4956:28;4966:4;4972:2;4976:7;4956:9;:28::i;9289:238:11:-;9424:16;7182::4;;;:7;:16;;;;;;9424::11;;9390:8;;-1:-1:-1;;;;;7182:16:4;2610:50:11;;;;-1:-1:-1;;;2610:50:11;;10841:2:14;2610:50:11;;;10823:21:14;10880:2;10860:18;;;10853:30;-1:-1:-1;;;10899:18:14;;;10892:50;10959:18;;2610:50:11;10639:344:14;2610:50:11;1101:6:12;;-1:-1:-1;;;;;1101:6:12;9518:3:11::1;9501:14;;9488:10;:27;;;;:::i;:::-;:33;;;;:::i;:::-;9471:51;;;;9289:238:::0;;;;;;:::o;10119:168::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;10165:12:11::1;10191:7;1101:6:12::0;;-1:-1:-1;;;;;1101:6:12;;1029:85;10191:7:11::1;-1:-1:-1::0;;;;;10183:21:11::1;10212;10183:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10164:74;;;10252:7;10244:38;;;::::0;-1:-1:-1;;;10244:38:11;;11962:2:14;10244:38:11::1;::::0;::::1;11944:21:14::0;12001:2;11981:18;;;11974:30;-1:-1:-1;;;12020:18:14;;;12013:48;12078:18;;10244:38:11::1;11760:342:14::0;10244:38:11::1;10158:129;10119:168::o:0;5057:179:4:-;5190:39;5207:4;5213:2;5217:7;5190:39;;;;;;;;;;;;:16;:39::i;2126:235::-;2198:7;2233:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2233:16:4;;2259:73;;;;-1:-1:-1;;;2259:73:4;;12309:2:14;2259:73:4;;;12291:21:14;12348:2;12328:18;;;12321:30;12387:34;12367:18;;;12360:62;-1:-1:-1;;;12438:18:14;;;12431:39;12487:19;;2259:73:4;12107:405:14;9736:64:11;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;9786:9:11::1;:7;:9::i;:::-;9736:64::o:0;1864:205:4:-;1936:7;-1:-1:-1;;;;;1963:19:4;;1955:74;;;;-1:-1:-1;;;1955:74:4;;12719:2:14;1955:74:4;;;12701:21:14;12758:2;12738:18;;;12731:30;12797:34;12777:18;;;12770:62;-1:-1:-1;;;12848:18:14;;;12841:40;12898:19;;1955:74:4;12517:406:14;1955:74:4;-1:-1:-1;;;;;;2046:16:4;;;;;:9;:16;;;;;;;1864:205::o;1661:101:12:-;1101:6;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;1505:407:11:-:0;;;;;;;;;;;;;;;;;;;:::o;2585:102:4:-;2641:13;2673:7;2666:14;;;;;:::i;2941:630:11:-;3114:9;;3014:10;;3046:6;;;3085:16;:6;918:14:2;;827:112;3085:16:11;:24;3084:39;;3076:70;;;;-1:-1:-1;;;3076:70:11;;13130:2:14;3076:70:11;;;13112:21:14;13169:2;13149:18;;;13142:30;-1:-1:-1;;;13188:18:14;;;13181:48;13246:18;;3076:70:11;12928:342:14;3076:70:11;1101:6:12;;-1:-1:-1;;;;;3158:20:11;;;1101:6:12;;3158:20:11;3154:167;;3219:7;;3211:5;:15;3198:9;:28;3190:69;;;;-1:-1:-1;;;3190:69:11;;13477:2:14;3190:69:11;;;13459:21:14;13516:2;13496:18;;;13489:30;13555;13535:18;;;13528:58;13603:18;;3190:69:11;13275:352:14;3190:69:11;3277:11;;;;3269:43;;;;-1:-1:-1;;;3269:43:11;;13834:2:14;3269:43:11;;;13816:21:14;13873:2;13853:18;;;13846:30;-1:-1:-1;;;13892:18:14;;;13885:49;13951:18;;3269:43:11;13632:343:14;3269:43:11;3349:1;3328:169;3361:5;3352;:14;3328:169;;3387:18;:6;1032:19:2;;1050:1;1032:19;;;945:123;3387:18:11;3415:15;3433:16;:6;918:14:2;;827:112;3433:16:11;3415:34;;3459:29;3469:9;3480:7;3459:9;:29::i;:::-;-1:-1:-1;3368:7:11;;3328:169;;;-1:-1:-1;3532:9:11;;3512:6;918:14:2;3512:29:11;3508:59;;3551:9;:7;:9::i;4218:153:4:-;4312:52;719:10:1;4345:8:4;4355;4312:18;:52::i;:::-;4218:153;;:::o;5302:320::-;5471:41;719:10:1;5504:7:4;5471:18;:41::i;:::-;5463:103;;;;-1:-1:-1;;;5463:103:4;;;;;;;:::i;:::-;5576:39;5590:4;5596:2;5600:7;5609:5;5576:13;:39::i;:::-;5302:320;;;;:::o;1441:60:11:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3633:1077::-;3737:13;3718:8;2618:17;2626:8;7159:4:4;7182:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7182:16:4;:30;;;7094:125;2618:17:11;2610:50;;;;-1:-1:-1;;;2610:50:11;;10841:2:14;2610:50:11;;;10823:21:14;10880:2;10860:18;;;10853:30;-1:-1:-1;;;10899:18:14;;;10892:50;10959:18;;2610:50:11;10639:344:14;2610:50:11;3845:28:::1;::::0;;::::1;::::0;::::1;::::0;;;3758:15:::1;3845:28:::0;;3903:9:::1;::::0;3776:8;;706:42:::1;::::0;3883:16:::1;:6;918:14:2::0;;827:112;3883:16:11::1;:29;:41;;;-1:-1:-1::0;3916:8:11::1;::::0;::::1;::::0;::::1;;;3883:41;3879:207;;;4036:15;:13;:15::i;:::-;3946:133;;;;;;;;:::i;:::-;;;;;;;;;;;;;3934:145;;3879:207;4186:5;-1:-1:-1::0;;;;;4186:15:11::1;;4280:16;4288:7;4280;:16::i;:::-;4363:11;;;;;;;;;;;;;;;;;4506;4578:18;4588:7;4578:9;:18::i;:::-;4620:9;4208:473;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4186:497;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;4186:497:11::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;4098:607;;;;;;;;:::i;:::-;;;;;;;;;;;;;4091:614;;;;;2666:1;3633:1077:::0;;;;:::o;10036:78::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;10098:11:11::1;::::0;;-1:-1:-1;;10083:26:11;::::1;10098:11;::::0;;::::1;10097:12;10083:26;::::0;;10036:78::o;4437:162:4:-;-1:-1:-1;;;;;4557:25:4;;;4534:4;4557:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4437:162::o;1911:198:12:-;1101:6;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:12;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:12;;18585:2:14;1991:73:12::1;::::0;::::1;18567:21:14::0;18624:2;18604:18;;;18597:30;18663:34;18643:18;;;18636:62;-1:-1:-1;;;18714:18:14;;;18707:36;18760:19;;1991:73:12::1;18383:402:14::0;1991:73:12::1;2074:28;2093:8;2074:18;:28::i;1505:300:4:-:0;1607:4;-1:-1:-1;;;;;;1642:40:4;;-1:-1:-1;;;1642:40:4;;:104;;-1:-1:-1;;;;;;;1698:48:4;;-1:-1:-1;;;1698:48:4;1642:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:3;;;1762:36:4;829:155:3;11103:171:4;11177:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11177:29:4;-1:-1:-1;;;;;11177:29:4;;;;;;;;:24;;11230:23;11177:24;11230:14;:23::i;:::-;-1:-1:-1;;;;;11221:46:4;;;;;;;;;;;11103:171;;:::o;7377:344::-;7470:4;7182:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7182:16:4;7486:73;;;;-1:-1:-1;;;7486:73:4;;18992:2:14;7486:73:4;;;18974:21:14;19031:2;19011:18;;;19004:30;19070:34;19050:18;;;19043:62;-1:-1:-1;;;19121:18:14;;;19114:42;19173:19;;7486:73:4;18790:408:14;7486:73:4;7569:13;7585:23;7600:7;7585:14;:23::i;:::-;7569:39;;7637:5;-1:-1:-1;;;;;7626:16:4;:7;-1:-1:-1;;;;;7626:16:4;;:51;;;;7670:7;-1:-1:-1;;;;;7646:31:4;:20;7658:7;7646:11;:20::i;:::-;-1:-1:-1;;;;;7646:31:4;;7626:51;:87;;;;7681:32;7698:5;7705:7;7681:16;:32::i;:::-;7618:96;7377:344;-1:-1:-1;;;;7377:344:4:o;10387:605::-;10541:4;-1:-1:-1;;;;;10514:31:4;:23;10529:7;10514:14;:23::i;:::-;-1:-1:-1;;;;;10514:31:4;;10506:81;;;;-1:-1:-1;;;10506:81:4;;19405:2:14;10506:81:4;;;19387:21:14;19444:2;19424:18;;;19417:30;19483:34;19463:18;;;19456:62;-1:-1:-1;;;19534:18:14;;;19527:35;19579:19;;10506:81:4;19203:401:14;10506:81:4;-1:-1:-1;;;;;10605:16:4;;10597:65;;;;-1:-1:-1;;;10597:65:4;;19811:2:14;10597:65:4;;;19793:21:14;19850:2;19830:18;;;19823:30;19889:34;19869:18;;;19862:62;-1:-1:-1;;;19940:18:14;;;19933:34;19984:19;;10597:65:4;19609:400:14;10597:65:4;10774:29;10791:1;10795:7;10774:8;:29::i;:::-;-1:-1:-1;;;;;10814:15:4;;;;;;:9;:15;;;;;:20;;10833:1;;10814:15;:20;;10833:1;;10814:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10844:13:4;;;;;;:9;:13;;;;;:18;;10861:1;;10844:13;:18;;10861:1;;10844:18;:::i;:::-;;;;-1:-1:-1;;10872:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10872:21:4;-1:-1:-1;;;;;10872:21:4;;;;;;;;;10909:27;;10872:16;;10909:27;;;;;;;9975:18:11::1;9902:96:::0;;:::o;9551:105::-;9585:8;:15;;-1:-1:-1;;9585:15:11;;;;;9611:40;9596:4;9634:16;:6;918:14:2;;827:112;9634:16:11;9611:40;;;20459:25:14;;;20515:2;20500:18;;20493:34;;;;20432:18;9611:40:11;;;;;;;9551:105::o;2263:187:12:-;2355:6;;;-1:-1:-1;;;;;2371:17:12;;;-1:-1:-1;;;;;;2371:17:12;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;8051:108:4:-;8126:26;8136:2;8140:7;8126:26;;;;;;;;;;;;:9;:26::i;11409:307::-;11559:8;-1:-1:-1;;;;;11550:17:4;:5;-1:-1:-1;;;;;11550:17:4;;11542:55;;;;-1:-1:-1;;;11542:55:4;;20740:2:14;11542:55:4;;;20722:21:14;20779:2;20759:18;;;20752:30;20818:27;20798:18;;;20791:55;20863:18;;11542:55:4;20538:349:14;11542:55:4;-1:-1:-1;;;;;11607:25:4;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11607:46:4;;;;;;;;;;11668:41;;1132::14;;;11668::4;;1105:18:14;11668:41:4;;;;;;;11409:307;;;:::o;6484:::-;6635:28;6645:4;6651:2;6655:7;6635:9;:28::i;:::-;6681:48;6704:4;6710:2;6714:7;6723:5;6681:22;:48::i;:::-;6673:111;;;;-1:-1:-1;;;6673:111:4;;;;;;;:::i;6073:1835:11:-;6120:13;706:42;;6284:15;6621:20;:18;:20::i;:::-;6867:15;:13;:15::i;:::-;6306:1573;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6284:1597;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6284:1597:11;;;;;;;;;;;;:::i;:::-;6203:1700;;;;;;;;:::i;:::-;;;;;;;;;;;;;6196:1707;;;6073:1835;:::o;8694:210::-;8751:13;8816:9;;;;;;;;;;;;;;;;;8849:26;8866:8;8849:16;:26::i;:::-;8779:120;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8772:127;;8694:210;;;:::o;4714:1355::-;4773:13;706:42;;4937:15;5283;:13;:15::i;:::-;5374:38;5392:12;5403:1;5392:8;:12;:::i;:::-;5391:20;;5408:3;5391:20;:::i;:::-;5374:16;:38::i;:::-;4959:1079;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4937:1103;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4937:1103:11;;;;;;;;;;;;:::i;:::-;4856:1206;;;;;;;;:::i;:::-;;;;;;;;;;;;;4849:1213;;;4714:1355;;;:::o;8380:311:4:-;8505:18;8511:2;8515:7;8505:5;:18::i;:::-;8554:54;8585:1;8589:2;8593:7;8602:5;8554:22;:54::i;:::-;8533:151;;;;-1:-1:-1;;;8533:151:4;;;;;;;:::i;12269:778::-;12419:4;-1:-1:-1;;;;;12439:13:4;;1465:19:0;:23;12435:606:4;;12474:72;;-1:-1:-1;;;12474:72:4;;-1:-1:-1;;;;;12474:36:4;;;;;:72;;719:10:1;;12525:4:4;;12531:7;;12540:5;;12474:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12474:72:4;;;;;;;;-1:-1:-1;;12474:72:4;;;;;;;;;;;;:::i;:::-;;;12470:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12713:6;:13;12730:1;12713:18;12709:266;;12755:60;;-1:-1:-1;;;12755:60:4;;;;;;;:::i;12709:266::-;12927:6;12921:13;12912:6;12908:2;12904:15;12897:38;12470:519;-1:-1:-1;;;;;;12596:51:4;-1:-1:-1;;;12596:51:4;;-1:-1:-1;12589:58:4;;12435:606;-1:-1:-1;13026:4:4;12269:778;;;;;;:::o;8359:331:11:-;8513:29;;-1:-1:-1;;;8513:29:11;;798:42;8513:29;;;2102:51:14;8411:13:11;;706:42;;8432:19;;706:42;;8513:10;;2075:18:14;;8513:29:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8513:29:11;;;;;;;;;;;;:::i;:::-;8636:27;;-1:-1:-1;;;8636:27:11;;8487:55;;-1:-1:-1;;;;;;8636:15:11;;;;;:27;;8487:55;;8636:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8636:27:11;;;;;;;;;;;;:::i;:::-;8555:130;;;;;;;;:::i;:::-;;;;;;;;;;;;;8548:137;;;;8359:331;:::o;7912:443::-;8099:26;;-1:-1:-1;;;8099:26:11;;887:42;8099:26;;;2102:51:14;7959:13:11;;706:42;;7980:19;;706:42;;8099:10;;2075:18:14;;8099:26:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8099:26:11;;;;;;;;;;;;:::i;:::-;8155;;-1:-1:-1;;;8155:26:11;;976:42;8155:26;;;2102:51:14;-1:-1:-1;;;;;8155:10:11;;;;;2075:18:14;;8155:26:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8155:26:11;;;;;;;;;;;;:::i;:::-;8057:154;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;8057:154:11;;;;;;;;;;-1:-1:-1;;;8305:23:11;;8057:154;-1:-1:-1;;;;;;8305:15:11;;;;;:23;;8057:154;;8305:23;;;:::i;328:703:13:-;384:13;601:5;610:1;601:10;597:51;;-1:-1:-1;;627:10:13;;;;;;;;;;;;-1:-1:-1;;;627:10:13;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:13;;-1:-1:-1;773:2:13;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:13;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:13;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:13;;;;;;;;-1:-1:-1;972:11:13;981:2;972:11;;:::i;:::-;;;844:150;;9013:427:4;-1:-1:-1;;;;;9092:16:4;;9084:61;;;;-1:-1:-1;;;9084:61:4;;35589:2:14;9084:61:4;;;35571:21:14;;;35608:18;;;35601:30;35667:34;35647:18;;;35640:62;35719:18;;9084:61:4;35387:356:14;9084:61:4;7159:4;7182:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7182:16:4;:30;9155:58;;;;-1:-1:-1;;;9155:58:4;;35950:2:14;9155:58:4;;;35932:21:14;35989:2;35969:18;;;35962:30;36028;36008:18;;;36001:58;36076:18;;9155:58:4;35748:352:14;9155:58:4;-1:-1:-1;;;;;9280:13:4;;;;;;:9;:13;;;;;:18;;9297:1;;9280:13;:18;;9297:1;;9280:18;:::i;:::-;;;;-1:-1:-1;;9308:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9308:21:4;-1:-1:-1;;;;;9308:21:4;;;;;;;;9345:33;;9308:16;;;9345:33;;9308:16;;9345:33;4218:153;;:::o;14:587:14:-;85:6;93;146:2;134:9;125:7;121:23;117:32;114:52;;;162:1;159;152:12;114:52;202:9;189:23;235:18;227:6;224:30;221:50;;;267:1;264;257:12;221:50;290:22;;343:4;335:13;;331:27;-1:-1:-1;321:55:14;;372:1;369;362:12;321:55;412:2;399:16;438:18;430:6;427:30;424:50;;;470:1;467;460:12;424:50;515:7;510:2;501:6;497:2;493:15;489:24;486:37;483:57;;;536:1;533;526:12;483:57;567:2;559:11;;;;;589:6;;-1:-1:-1;14:587:14;-1:-1:-1;;;14:587:14:o;606:131::-;-1:-1:-1;;;;;;680:32:14;;670:43;;660:71;;727:1;724;717:12;742:245;800:6;853:2;841:9;832:7;828:23;824:32;821:52;;;869:1;866;859:12;821:52;908:9;895:23;927:30;951:5;927:30;:::i;:::-;976:5;742:245;-1:-1:-1;;;742:245:14:o;1184:300::-;1237:3;1275:5;1269:12;1302:6;1297:3;1290:19;1358:6;1351:4;1344:5;1340:16;1333:4;1328:3;1324:14;1318:47;1410:1;1403:4;1394:6;1389:3;1385:16;1381:27;1374:38;1473:4;1466:2;1462:7;1457:2;1449:6;1445:15;1441:29;1436:3;1432:39;1428:50;1421:57;;;1184:300;;;;:::o;1489:231::-;1638:2;1627:9;1620:21;1601:4;1658:56;1710:2;1699:9;1695:18;1687:6;1658:56;:::i;1725:226::-;1784:6;1837:2;1825:9;1816:7;1812:23;1808:32;1805:52;;;1853:1;1850;1843:12;1805:52;-1:-1:-1;1898:23:14;;1725:226;-1:-1:-1;1725:226:14:o;2164:173::-;2232:20;;-1:-1:-1;;;;;2281:31:14;;2271:42;;2261:70;;2327:1;2324;2317:12;2261:70;2164:173;;;:::o;2342:300::-;2410:6;2418;2471:2;2459:9;2450:7;2446:23;2442:32;2439:52;;;2487:1;2484;2477:12;2439:52;2510:29;2529:9;2510:29;:::i;:::-;2500:39;2608:2;2593:18;;;;2580:32;;-1:-1:-1;;;2342:300:14:o;2829:374::-;2906:6;2914;2922;2975:2;2963:9;2954:7;2950:23;2946:32;2943:52;;;2991:1;2988;2981:12;2943:52;3014:29;3033:9;3014:29;:::i;:::-;3004:39;;3062:38;3096:2;3085:9;3081:18;3062:38;:::i;:::-;2829:374;;3052:48;;-1:-1:-1;;;3169:2:14;3154:18;;;;3141:32;;2829:374::o;3208:346::-;3276:6;3284;3337:2;3325:9;3316:7;3312:23;3308:32;3305:52;;;3353:1;3350;3343:12;3305:52;-1:-1:-1;;3398:23:14;;;3518:2;3503:18;;;3490:32;;-1:-1:-1;3208:346:14:o;3838:186::-;3897:6;3950:2;3938:9;3929:7;3925:23;3921:32;3918:52;;;3966:1;3963;3956:12;3918:52;3989:29;4008:9;3989:29;:::i;4029:347::-;4094:6;4102;4155:2;4143:9;4134:7;4130:23;4126:32;4123:52;;;4171:1;4168;4161:12;4123:52;4194:29;4213:9;4194:29;:::i;:::-;4184:39;;4273:2;4262:9;4258:18;4245:32;4320:5;4313:13;4306:21;4299:5;4296:32;4286:60;;4342:1;4339;4332:12;4286:60;4365:5;4355:15;;;4029:347;;;;;:::o;4381:127::-;4442:10;4437:3;4433:20;4430:1;4423:31;4473:4;4470:1;4463:15;4497:4;4494:1;4487:15;4513:275;4584:2;4578:9;4649:2;4630:13;;-1:-1:-1;;4626:27:14;4614:40;;4684:18;4669:34;;4705:22;;;4666:62;4663:88;;;4731:18;;:::i;:::-;4767:2;4760:22;4513:275;;-1:-1:-1;4513:275:14:o;4793:186::-;4841:4;4874:18;4866:6;4863:30;4860:56;;;4896:18;;:::i;:::-;-1:-1:-1;4962:2:14;4941:15;-1:-1:-1;;4937:29:14;4968:4;4933:40;;4793:186::o;4984:958::-;5079:6;5087;5095;5103;5156:3;5144:9;5135:7;5131:23;5127:33;5124:53;;;5173:1;5170;5163:12;5124:53;5196:29;5215:9;5196:29;:::i;:::-;5186:39;;5244:38;5278:2;5267:9;5263:18;5244:38;:::i;:::-;5234:48;-1:-1:-1;5351:2:14;5336:18;;5323:32;;-1:-1:-1;5430:2:14;5415:18;;5402:32;5457:18;5446:30;;5443:50;;;5489:1;5486;5479:12;5443:50;5512:22;;5565:4;5557:13;;5553:27;-1:-1:-1;5543:55:14;;5594:1;5591;5584:12;5543:55;5634:2;5621:16;5659:52;5675:35;5703:6;5675:35;:::i;:::-;5659:52;:::i;:::-;5734:6;5727:5;5720:21;5782:7;5777:2;5768:6;5764:2;5760:15;5756:24;5753:37;5750:57;;;5803:1;5800;5793:12;5750:57;5858:6;5853:2;5849;5845:11;5840:2;5833:5;5829:14;5816:49;5910:1;5905:2;5896:6;5889:5;5885:18;5881:27;5874:38;5931:5;5921:15;;;;;4984:958;;;;;;;:::o;5947:260::-;6015:6;6023;6076:2;6064:9;6055:7;6051:23;6047:32;6044:52;;;6092:1;6089;6082:12;6044:52;6115:29;6134:9;6115:29;:::i;:::-;6105:39;;6163:38;6197:2;6186:9;6182:18;6163:38;:::i;:::-;6153:48;;5947:260;;;;;:::o;6212:356::-;6414:2;6396:21;;;6433:18;;;6426:30;6492:34;6487:2;6472:18;;6465:62;6559:2;6544:18;;6212:356::o;6573:380::-;6652:1;6648:12;;;;6695;;;6716:61;;6770:4;6762:6;6758:17;6748:27;;6716:61;6823:2;6815:6;6812:14;6792:18;6789:38;6786:161;;6869:10;6864:3;6860:20;6857:1;6850:31;6904:4;6901:1;6894:15;6932:4;6929:1;6922:15;7084:518;7186:2;7181:3;7178:11;7175:421;;;7222:5;7219:1;7212:16;7266:4;7263:1;7253:18;7336:2;7324:10;7320:19;7317:1;7313:27;7307:4;7303:38;7372:4;7360:10;7357:20;7354:47;;;-1:-1:-1;7395:4:14;7354:47;7450:2;7445:3;7441:12;7438:1;7434:20;7428:4;7424:31;7414:41;;7505:81;7523:2;7516:5;7513:13;7505:81;;;7582:1;7568:16;;7549:1;7538:13;7505:81;;;7509:3;;7084:518;;;:::o;7778:1198::-;7902:18;7897:3;7894:27;7891:53;;;7924:18;;:::i;:::-;7953:94;8043:3;8003:38;8035:4;8029:11;8003:38;:::i;:::-;7997:4;7953:94;:::i;:::-;8073:1;8098:2;8093:3;8090:11;8115:1;8110:608;;;;8762:1;8779:3;8776:93;;;-1:-1:-1;8835:19:14;;;8822:33;8776:93;-1:-1:-1;;7735:1:14;7731:11;;;7727:24;7723:29;7713:40;7759:1;7755:11;;;7710:57;8882:78;;8083:887;;8110:608;7031:1;7024:14;;;7068:4;7055:18;;-1:-1:-1;;8146:17:14;;;8261:229;8275:7;8272:1;8269:14;8261:229;;;8364:19;;;8351:33;8336:49;;8471:4;8456:20;;;;8424:1;8412:14;;;;8291:12;8261:229;;;8265:3;8518;8509:7;8506:16;8503:159;;;8642:1;8638:6;8632:3;8626;8623:1;8619:11;8615:21;8611:34;8607:39;8594:9;8589:3;8585:19;8572:33;8568:79;8560:6;8553:95;8503:159;;;8705:1;8699:3;8696:1;8692:11;8688:19;8682:4;8675:33;8083:887;;7778:1198;;;:::o;10221:413::-;10423:2;10405:21;;;10462:2;10442:18;;;10435:30;10501:34;10496:2;10481:18;;10474:62;-1:-1:-1;;;10567:2:14;10552:18;;10545:47;10624:3;10609:19;;10221:413::o;10988:127::-;11049:10;11044:3;11040:20;11037:1;11030:31;11080:4;11077:1;11070:15;11104:4;11101:1;11094:15;11120:168;11193:9;;;11224;;11241:15;;;11235:22;;11221:37;11211:71;;11262:18;;:::i;11293:127::-;11354:10;11349:3;11345:20;11342:1;11335:31;11385:4;11382:1;11375:15;11409:4;11406:1;11399:15;11425:120;11465:1;11491;11481:35;;11496:18;;:::i;:::-;-1:-1:-1;11530:9:14;;11425:120::o;13980:212::-;14022:3;14060:5;14054:12;14104:6;14097:4;14090:5;14086:16;14081:3;14075:36;14166:1;14130:16;;14155:13;;;-1:-1:-1;14130:16:14;;13980:212;-1:-1:-1;13980:212:14:o;14197:364::-;-1:-1:-1;;;14437:63:14;;14419:3;14516:39;14551:2;14542:12;;14534:6;14516:39;:::i;14766:2218::-;-1:-1:-1;;;15658:43:14;;15640:3;15723:38;15758:1;15749:11;;15741:6;15723:38;:::i;:::-;-1:-1:-1;;;15770:61:14;;15850:41;15887:2;15876:14;;15868:6;15850:41;:::i;:::-;15911:66;15900:78;;-1:-1:-1;;;16002:2:14;15994:11;;15987:49;-1:-1:-1;;;16060:2:14;16052:11;;16045:65;16157:13;;15840:51;;-1:-1:-1;;;16193:36:14;16157:13;16193:36;:::i;:::-;16260:1;16245:17;;16271:149;;;;16434:1;16429:344;;;;16238:535;;16271:149;16331:3;16327:8;16316:9;16312:24;16307:2;16303;16299:11;16292:45;16407:2;16395:6;16388:14;16381:22;16373:6;16369:35;16365:2;16361:44;16357:53;16350:60;;16271:149;;16429:344;16460:6;16457:1;16450:17;16508:2;16505:1;16495:16;16533:1;16547:172;16561:6;16558:1;16555:13;16547:172;;;16647:14;;16630:10;;;16642:2;16626:19;16619:43;16703:1;16690:15;;;;16583:2;16576:10;16547:172;;;16551:3;;16760:2;16751:6;16747:2;16743:15;16739:24;16732:31;;16238:535;-1:-1:-1;;;;;14624:47:14;;-1:-1:-1;16838:66:14;16864:39;16899:2;16894:3;16890:12;16882:6;16864:39;:::i;:::-;16856:6;16838:66;:::i;:::-;16825:79;;;16913:36;16943:5;-1:-1:-1;;;14732:27:14;;14682:79;16913:36;16976:1;16965:13;;14766:2218;-1:-1:-1;;;;;;;14766:2218:14:o;17223:341::-;17299:5;17328:52;17344:35;17372:6;17344:35;:::i;17328:52::-;17319:61;;17403:6;17396:5;17389:21;17443:3;17434:6;17429:3;17425:16;17422:25;17419:45;;;17460:1;17457;17450:12;17419:45;17502:6;17497:3;17490:4;17483:5;17479:16;17473:36;17556:1;17549:4;17540:6;17533:5;17529:18;17525:29;17518:40;17223:341;;;;;:::o;17569:459::-;17649:6;17702:2;17690:9;17681:7;17677:23;17673:32;17670:52;;;17718:1;17715;17708:12;17670:52;17751:9;17745:16;17784:18;17776:6;17773:30;17770:50;;;17816:1;17813;17806:12;17770:50;17839:22;;17892:4;17884:13;;17880:27;-1:-1:-1;17870:55:14;;17921:1;17918;17911:12;17870:55;17944:78;18014:7;18009:2;18003:9;17998:2;17994;17990:11;17944:78;:::i;18033:345::-;18285:31;18280:3;18273:44;18255:3;18333:39;18368:2;18363:3;18359:12;18351:6;18333:39;:::i;20014:128::-;20081:9;;;20102:11;;;20099:37;;;20116:18;;:::i;20147:125::-;20212:9;;;20233:10;;;20230:36;;;20246:18;;:::i;20892:414::-;21094:2;21076:21;;;21133:2;21113:18;;;21106:30;21172:34;21167:2;21152:18;;21145:62;-1:-1:-1;;;21238:2:14;21223:18;;21216:48;21296:3;21281:19;;20892:414::o;23991:219::-;24068:66;24056:79;;-1:-1:-1;;;24160:2:14;24151:12;;24144:32;24201:2;24192:12;;23991:219::o;24894:3332::-;26981:66;26969:79;;27078:66;27073:2;27064:12;;27057:88;-1:-1:-1;;;27170:2:14;27161:12;;27154:52;27236:66;27231:2;27222:12;;27215:88;27334:34;27328:3;27319:13;;27312:57;27400:34;27394:3;27385:13;;27378:57;-1:-1:-1;;;27460:3:14;27451:13;;27444:53;-1:-1:-1;27519:71:14;27549:40;27584:3;27575:13;;27567:6;27549:40;:::i;:::-;21388:66;21376:79;;-1:-1:-1;;;21480:2:14;21471:12;;21464:29;21518:2;21509:12;;21311:216;27519:71;21602:31;21590:44;;21722:34;27724:2;27713:14;;21710:47;21787:66;21773:12;;;21766:88;27657:72;21870:12;;;27675:6;27657:72;:::i;:::-;-1:-1:-1;;;21951:30:14;;22069:34;28132:1;28121:13;;22057:47;22134:34;22120:12;;;22113:56;22285:34;22185:12;;;22273:47;-1:-1:-1;;;22336:12:14;;;22329:41;22486:34;22386:12;;;22474:47;-1:-1:-1;;;22537:12:14;;;22530:42;22688:34;22588:12;;;22676:47;22753:26;22739:12;;;22732:48;22896:66;22796:12;;;22884:79;-1:-1:-1;;;22979:12:14;;;22972:54;23142:66;23042:12;;;23130:79;23239:66;23225:12;;;23218:88;-1:-1:-1;;;23322:12:14;;;23315:34;23465:66;23365:12;;;23453:79;23562:66;23548:12;;;23541:88;21951:30;-1:-1:-1;27796:349:14;27821:323;27851:292;27881:261;23645:12;;;23745:66;23733:79;;23842:66;23837:2;23828:12;;23821:88;-1:-1:-1;;;23934:2:14;23925:12;;23918:34;23977:2;23968:12;;23668:318;27881:261;27851:292;:::i;:::-;24292:66;24280:79;;24389:66;24384:2;24375:12;;24368:88;24481:2;24472:12;;24215:275;27821:323;24567:66;24555:79;;24664:34;24659:2;24650:12;;24643:56;-1:-1:-1;;;24724:2:14;24715:12;;24708:48;24781:2;24772:12;;24495:295;27796:349;-1:-1:-1;;;24853:30:14;;28217:2;28206:14;;;-1:-1:-1;;;;;24894:3332:14:o;28231:342::-;28483:28;28478:3;28471:41;28453:3;28528:39;28563:2;28558:3;28554:12;28546:6;28528:39;:::i;28578:267::-;28757:3;28782:57;28808:30;28834:3;28826:6;28808:30;:::i;:::-;28800:6;28782:57;:::i;30416:2748::-;31989:66;31977:79;;32086:66;32081:2;32072:12;;32065:88;-1:-1:-1;;;32178:2:14;32169:12;;32162:50;32242:34;32237:2;32228:12;;32221:56;-1:-1:-1;;;32302:3:14;32293:13;;32286:27;32394:34;32344:3;32335:13;;32380:49;;;32461:25;32445:14;;;32438:49;-1:-1:-1;;32505:14:14;;;32528:36;32505:14;-1:-1:-1;;;28908:68:14;;28850:132;32528:36;32586:41;32623:2;32616:5;32612:14;32604:6;32586:41;:::i;:::-;32573:54;;;32636:36;32666:5;29057:66;29045:79;;28987:143;32636:36;32694:41;32731:2;32724:5;32720:14;32712:6;32694:41;:::i;:::-;-1:-1:-1;;;29185:27:14;;29296:66;32903:2;32892:14;;29284:79;-1:-1:-1;;;29379:12:14;;;29372:62;29550:66;29450:12;;;29538:79;29647:66;29633:12;;;29626:88;29830:66;29730:12;;;29818:79;-1:-1:-1;;;29913:12:14;;;29906:66;29185:27;-1:-1:-1;29988:12:14;;;-1:-1:-1;;;30069:31:14;;32789:120;-1:-1:-1;32976:107:14;33006:76;33036:45;33077:2;33070:5;33066:14;33036:45;:::i;33006:76::-;30188:66;30176:79;;30285:34;30280:2;30271:12;;30264:56;-1:-1:-1;;;30345:2:14;30336:12;;30329:48;30402:2;30393:12;;30111:300;33169:496;-1:-1:-1;;;;;33400:32:14;;;33382:51;;33469:32;;33464:2;33449:18;;33442:60;33533:2;33518:18;;33511:34;;;33581:3;33576:2;33561:18;;33554:31;;;-1:-1:-1;;33602:57:14;;33639:19;;33631:6;33602:57;:::i;:::-;33594:65;33169:496;-1:-1:-1;;;;;;33169:496:14:o;33670:249::-;33739:6;33792:2;33780:9;33771:7;33767:23;33763:32;33760:52;;;33808:1;33805;33798:12;33760:52;33840:9;33834:16;33859:30;33883:5;33859:30;:::i;34387:338::-;-1:-1:-1;;;34634:3:14;34627:37;34609:3;34680:39;34715:2;34710:3;34706:12;34698:6;34680:39;:::i;34998:135::-;35037:3;35058:17;;;35055:43;;35078:18;;:::i;:::-;-1:-1:-1;35125:1:14;35114:13;;34998:135::o;35138:112::-;35170:1;35196;35186:35;;35201:18;;:::i;:::-;-1:-1:-1;35235:9:14;;35138:112::o;35255:127::-;35316:10;35311:3;35307:20;35304:1;35297:31;35347:4;35344:1;35337:15;35371:4;35368:1;35361:15
Swarm Source
ipfs://c8b19a0d640516660f32d6b74052cf098cba17479689b67b709b858e435eec78
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.