Indexing Tokens - We're indexing this chain right now. Some of the counts may be inaccurate.

Contract Address Details

0xAE516fF923b7a28f8097b34cec4C07585431bfC2

Contract Name
RateLimitNFT
Creator
0x332443–f0c6a7 at 0xeb30b9–d2e5c1
Balance
0 LIT
Tokens
Fetching tokens...
Transactions
1 Transactions
Transfers
0 Transfers
Gas Used
29,108
Last Balance Update
2793400
Contract name:
RateLimitNFT




Optimization enabled
false
Compiler version
v0.8.17+commit.8df45f5f




Verified at
2023-06-09T06:46:06.753188Z

contracts/lit-node/RateLimitNFT.sol

//SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.17;
import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import { ERC721Burnable } from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol";
import { ERC721Enumerable } from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import { IERC721Enumerable } from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import { IERC721Metadata } from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import { Base64 } from "@openzeppelin/contracts/utils/Base64.sol";
import { Strings } from "@openzeppelin/contracts/utils/Strings.sol";
import "hardhat/console.sol";
/// @title Rate Limit NFT
///
/// @dev This is the contract for the Rate Limit NFTs
/// So the general idea here is that you can mint one of these NFTs to pay for service on Lit
/// And how it works, is that you can buy X requestsPerKilosecond over a period of time
/// 1 requestsPerKilosecond = 0.001 requests per second and
/// 1000 requestsPerKilosecond = 1 request per second
contract RateLimitNFT is
ERC721("Rate Limit Increases on Lit Protocol", "RLI"),
Ownable,
ERC721Burnable,
ERC721Enumerable,
ReentrancyGuard
{
using Strings for uint256;
/* ========== STATE VARIABLES ========== */
address public freeMintSigner;
uint256 public additionalRequestsPerKilosecondCost;
uint256 public tokenIdCounter;
uint256 public defaultRateLimitWindowSeconds = 60 * 60; // 60 mins
uint256 public RLIHolderRateLimitWindowSeconds = 5 * 60; // 5 mins
uint256 public freeRequestsPerRateLimitWindow = 10;
mapping(uint256 => RateLimit) public capacity;
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Address.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.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;
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/access/Ownable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/security/ReentrancyGuard.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/ERC721.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/IERC721.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol)
pragma solidity ^0.8.0;
import "../ERC721.sol";
import "../../../utils/Context.sol";
/**
* @title ERC721 Burnable Token
* @dev ERC721 Token that can be burned (destroyed).
*/
abstract contract ERC721Burnable is Context, ERC721 {
/**
* @dev Burns `tokenId`. See {ERC721-_burn}.
*
* Requirements:
*
* - The caller must own `tokenId` or be an approved operator.
*/
function burn(uint256 tokenId) public virtual {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_burn(tokenId);
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)
pragma solidity ^0.8.0;
import "../ERC721.sol";
import "./IERC721Enumerable.sol";
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Base64.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides a set of functions to operate with Base64 strings.
*
* _Available since v4.5._
*/
library Base64 {
/**
* @dev Base64 Encoding/Decoding Table
*/
string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/**
* @dev Converts a `bytes` to its Bytes64 `string` representation.
*/
function encode(bytes memory data) internal pure returns (string memory) {
/**
* Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
* https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
*/
if (data.length == 0) return "";
// Loads the table into memory
string memory table = _TABLE;
// Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
// and split into 4 numbers of 6 bits.
// The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
// - `data.length + 2` -> Round up
// - `/ 3` -> Number of 3-bytes chunks
// - `4 *` -> 4 characters for each chunk
string memory result = new string(4 * ((data.length + 2) / 3));
/// @solidity memory-safe-assembly
assembly {
// Prepare the lookup table (skip the first "length" byte)
let tablePtr := add(table, 1)
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Strings.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/introspection/ERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/introspection/IERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/math/Math.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

hardhat/console.sol

// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);
function _sendLogPayload(bytes memory payload) private view {
uint256 payloadLength = payload.length;
address consoleAddress = CONSOLE_ADDRESS;
assembly {
let payloadStart := add(payload, 32)
let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
}
}
function log() internal view {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int256 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
}
function logUint(uint256 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function logString(string memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"AdditionalRequestsPerKilosecondCostSet","inputs":[{"type":"uint256","name":"newAdditionalRequestsPerKilosecondCost","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"approved","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"bool","name":"approved","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"FreeMintSignerSet","inputs":[{"type":"address","name":"newFreeMintSigner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"FreeRequestsPerRateLimitWindowSet","inputs":[{"type":"uint256","name":"newFreeRequestsPerRateLimitWindow","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RLIHolderRateLimitWindowSecondsSet","inputs":[{"type":"uint256","name":"newRLIHolderRateLimitWindowSeconds","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"RateLimitWindowSecondsSet","inputs":[{"type":"uint256","name":"newRateLimitWindowSeconds","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"Withdrew","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"RLIHolderRateLimitWindowSeconds","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"additionalRequestsPerKilosecondCost","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approve","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculateCost","inputs":[{"type":"uint256","name":"requestsPerKilosecond","internalType":"uint256"},{"type":"uint256","name":"expiresAt","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculateRequestsPerKilosecond","inputs":[{"type":"uint256","name":"payingAmount","internalType":"uint256"},{"type":"uint256","name":"expiresAt","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"requestsPerKilosecond","internalType":"uint256"},{"type":"uint256","name":"expiresAt","internalType":"uint256"}],"name":"capacity","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"defaultRateLimitWindowSeconds","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"freeMint","inputs":[{"type":"uint256","name":"expiresAt","internalType":"uint256"},{"type":"uint256","name":"requestsPerKilosecond","internalType":"uint256"},{"type":"bytes32","name":"msgHash","internalType":"bytes32"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[],"name":"freeMintSigTest","inputs":[{"type":"uint256","name":"expiresAt","internalType":"uint256"},{"type":"uint256","name":"requestsPerKilosecond","internalType":"uint256"},{"type":"bytes32","name":"msgHash","internalType":"bytes32"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"freeMintSigner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"freeRequestsPerRateLimitWindow","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getApproved","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isApprovedForAll","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExpired","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mint","inputs":[{"type":"uint256","name":"expiresAt","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ownerOf","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"prefixed","inputs":[{"type":"bytes32","name":"hash","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"redeemedFreeMints","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAdditionalRequestsPerKilosecondCost","inputs":[{"type":"uint256","name":"newAdditionalRequestsPerKilosecondCost","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setApprovalForAll","inputs":[{"type":"address","name":"operator","internalType":"address"},{"type":"bool","name":"approved","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFreeMintSigner","inputs":[{"type":"address","name":"newFreeMintSigner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFreeRequestsPerRateLimitWindow","inputs":[{"type":"uint256","name":"newFreeRequestsPerRateLimitWindow","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRLIHolderRateLimitWindowSeconds","inputs":[{"type":"uint256","name":"newRLIHolderRateLimitWindowSeconds","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRateLimitWindowSeconds","inputs":[{"type":"uint256","name":"newRateLimitWindowSeconds","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenByIndex","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenIdCounter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenOfOwnerByIndex","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"tokenURI","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[]}]
            

Contract Creation Code

0x6080604052610e10600f5561012c601055600a6011553480156200002257600080fd5b506040518060600160405280602481526020016200586d602491396040518060400160405280600381526020017f524c490000000000000000000000000000000000000000000000000000000000815250816000908162000084919062000419565b50806001908162000096919062000419565b505050620000b9620000ad620000d160201b60201c565b620000d960201b60201c565b6001600b81905550620f4240600d8190555062000500565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200022157607f821691505b602082108103620002375762000236620001d9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002a17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000262565b620002ad868362000262565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002fa620002f4620002ee84620002c5565b620002cf565b620002c5565b9050919050565b6000819050919050565b6200031683620002d9565b6200032e620003258262000301565b8484546200026f565b825550505050565b600090565b6200034562000336565b620003528184846200030b565b505050565b5b818110156200037a576200036e6000826200033b565b60018101905062000358565b5050565b601f821115620003c95762000393816200023d565b6200039e8462000252565b81016020851015620003ae578190505b620003c6620003bd8562000252565b83018262000357565b50505b505050565b600082821c905092915050565b6000620003ee60001984600802620003ce565b1980831691505092915050565b6000620004098383620003db565b9150826002028217905092915050565b62000424826200019f565b67ffffffffffffffff81111562000440576200043f620001aa565b5b6200044c825462000208565b620004598282856200037e565b600060209050601f8311600181146200049157600084156200047c578287015190505b620004888582620003fb565b865550620004f8565b601f198416620004a1866200023d565b60005b82811015620004cb57848901518255600182019150602085019450602081019050620004a4565b86831015620004eb5784890151620004e7601f891682620003db565b8355505b6001600288020188555050505b505050505050565b61535d80620005106000396000f3fe6080604052600436106102465760003560e01c80634f6ccce711610139578063ab1bbeca116100b6578063ce3946961161007a578063ce394696146108cc578063d9548e5314610909578063e62a219514610946578063e985e9c51461096f578063f2fde38b146109ac578063fb24b22e146109d557610246565b8063ab1bbeca146107c0578063b88d4fde146107fe578063b94a210214610827578063ba45b2ba14610852578063c87b56dd1461088f57610246565b806395d89b41116100fd57806395d89b41146106d457806398bdf6f5146106ff578063995eebab1461072a578063a0712d6814610767578063a22cb4651461079757610246565b80634f6ccce7146105db5780636352211e1461061857806370a0823114610655578063715018a6146106925780638da5cb5b146106a957610246565b80632f745c59116101c75780633ccfd60b1161018b5780633ccfd60b1461051c57806342842e0e1461053357806342966c681461055c5780634659470d146105855780634a5f3acd146105b057610246565b80632f745c59146104275780633488ab131461046457806339f1a4f11461048d5780633b189852146104b65780633b1a72cc146104df57610246565b806318160ddd1161020e57806318160ddd146103425780631f2757131461036d57806323b872dd146103aa57806326894764146103d357806328b9b37c146103fe57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806311fc456214610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613215565b610a00565b60405161027f919061325d565b60405180910390f35b34801561029457600080fd5b5061029d610b3a565b6040516102aa9190613308565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613360565b610bcc565b6040516102e791906133ce565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613415565b610c12565b005b34801561032557600080fd5b50610340600480360381019061033b9190613360565b610d29565b005b34801561034e57600080fd5b50610357610d72565b6040516103649190613464565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f91906134b5565b610d7f565b6040516103a191906134f1565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc919061350c565b610daf565b005b3480156103df57600080fd5b506103e8610e0f565b6040516103f59190613464565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613360565b610e15565b005b34801561043357600080fd5b5061044e60048036038101906104499190613415565b610e5e565b60405161045b9190613464565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190613598565b610f03565b005b34801561049957600080fd5b506104b460048036038101906104af9190613360565b6110c8565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190613625565b611111565b005b3480156104eb57600080fd5b50610506600480360381019061050191906134b5565b6111a0565b604051610513919061325d565b60405180910390f35b34801561052857600080fd5b506105316111c0565b005b34801561053f57600080fd5b5061055a6004803603810190610555919061350c565b61128e565b005b34801561056857600080fd5b50610583600480360381019061057e9190613360565b6112ae565b005b34801561059157600080fd5b5061059a61130a565b6040516105a79190613464565b60405180910390f35b3480156105bc57600080fd5b506105c5611310565b6040516105d29190613464565b60405180910390f35b3480156105e757600080fd5b5061060260048036038101906105fd9190613360565b611316565b60405161060f9190613464565b60405180910390f35b34801561062457600080fd5b5061063f600480360381019061063a9190613360565b611387565b60405161064c91906133ce565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190613625565b61140d565b6040516106899190613464565b60405180910390f35b34801561069e57600080fd5b506106a76114c4565b005b3480156106b557600080fd5b506106be6114d8565b6040516106cb91906133ce565b60405180910390f35b3480156106e057600080fd5b506106e9611502565b6040516106f69190613308565b60405180910390f35b34801561070b57600080fd5b50610714611594565b6040516107219190613464565b60405180910390f35b34801561073657600080fd5b50610751600480360381019061074c9190613598565b61159a565b60405161075e9190613464565b60405180910390f35b610781600480360381019061077c9190613360565b61160e565b60405161078e9190613464565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b9919061367e565b6116f3565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613360565b611709565b6040516107f59291906136be565b60405180910390f35b34801561080a57600080fd5b506108256004803603810190610820919061381c565b61172d565b005b34801561083357600080fd5b5061083c61178f565b60405161084991906133ce565b60405180910390f35b34801561085e57600080fd5b506108796004803603810190610874919061389f565b6117b5565b6040516108869190613464565b60405180910390f35b34801561089b57600080fd5b506108b660048036038101906108b19190613360565b61183e565b6040516108c39190613308565b60405180910390f35b3480156108d857600080fd5b506108f360048036038101906108ee919061389f565b6118f5565b6040516109009190613464565b60405180910390f35b34801561091557600080fd5b50610930600480360381019061092b9190613360565b6119c1565b60405161093d919061325d565b60405180910390f35b34801561095257600080fd5b5061096d60048036038101906109689190613360565b6119e4565b005b34801561097b57600080fd5b50610996600480360381019061099191906138df565b611a2d565b6040516109a3919061325d565b60405180910390f35b3480156109b857600080fd5b506109d360048036038101906109ce9190613625565b611ac1565b005b3480156109e157600080fd5b506109ea611b44565b6040516109f79190613464565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610acb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b3357507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060008054610b499061394e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b759061394e565b8015610bc25780601f10610b9757610100808354040283529160200191610bc2565b820191906000526020600020905b815481529060010190602001808311610ba557829003601f168201915b5050505050905090565b6000610bd782611b4a565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1d82611387565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c84906139f1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cac611b95565b73ffffffffffffffffffffffffffffffffffffffff161480610cdb5750610cda81610cd5611b95565b611a2d565b5b610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1190613a83565b60405180910390fd5b610d248383611b9d565b505050565b610d31611c56565b80600f819055507f8113757de54f756eb308220e3f035727188560fd3230aaf1fbc24e5610fea1f881604051610d679190613464565b60405180910390a150565b6000600980549050905090565b600081604051602001610d929190613b1b565b604051602081830303815290604052805190602001209050919050565b610dc0610dba611b95565b82611cd4565b610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df690613bb3565b60405180910390fd5b610e0a838383611d69565b505050565b60115481565b610e1d611c56565b806011819055507fce84f3dad126a2cb9d67cdca12c64dc079f7a9a1a0728c5c4e16e4b5b2e4bc4d81604051610e539190613464565b60405180910390a150565b6000610e698361140d565b8210610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190613c45565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610f368787604051602001610f1b929190613c86565b60405160208183030381529060405280519060200120610d7f565b9050848114610f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7190613d4a565b60405180910390fd5b600060018686868660405160008152602001604052604051610f9f9493929190613d79565b6020604051602081039080840390855afa158015610fc1573d6000803e3d6000fd5b505050602060405103519050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461105d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105490613e56565b60405180910390fd5b6013600087815260200190815260200160002060009054906101000a900460ff16156110be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b590613ee8565b60405180910390fd5b5050505050505050565b6110d0611c56565b806010819055507fad40b1be79d0692234d4fb1d25a47b916b4754dda8187fc0aa1271b7d7adb040816040516111069190613464565b60405180910390a150565b611119611c56565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f65d3e06a561c77a07da59b8b2ca10214ae08fe21cc2953a90db0ac8b5b7c437160405160405180910390a250565b60136020528060005260406000206000915054906101000a900460ff1681565b6111c8611c56565b6111d0612062565b600047905060003373ffffffffffffffffffffffffffffffffffffffff16826040516111fb90613f39565b60006040518083038185875af1925050503d8060008114611238576040519150601f19603f3d011682016040523d82523d6000602084013e61123d565b606091505b505090508061124b57600080fd5b7fb6b476da71cea8275cac6b1720c04966afaff5e637472cedb6cbd32c43a232518260405161127a9190613464565b60405180910390a1505061128c6120b1565b565b6112a98383836040518060200160405280600081525061172d565b505050565b6112bf6112b9611b95565b82611cd4565b6112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590613bb3565b60405180910390fd5b611307816120bb565b50565b600d5481565b60105481565b6000611320610d72565b8210611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135890613fc0565b60405180910390fd5b6009828154811061137557611374613fe0565b5b90600052602060002001549050919050565b60008061139383612209565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb9061405b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361147d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611474906140ed565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114cc611c56565b6114d66000612246565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115119061394e565b80601f016020809104026020016040519081016040528092919081815260200182805461153d9061394e565b801561158a5780601f1061155f5761010080835404028352916020019161158a565b820191906000526020600020905b81548152906001019060200180831161156d57829003601f168201915b5050505050905090565b600e5481565b6000600e60008154809291906115af9061413c565b91905055506000600e5490506115c9888888888888610f03565b60016013600088815260200190815260200160002060006101000a81548160ff02191690831515021790555061160081888a61230c565b809150509695505050505050565b6000600e60008154809291906116239061413c565b91905055506000600e549050600061163b34856117b5565b9050600061164982866118f5565b905060003411801561165b5750803410155b61169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169190614242565b60405180910390fd5b600081116116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d4906142ae565b60405180910390fd5b6116e883838761230c565b829350505050919050565b6117056116fe611b95565b838361235a565b5050565b60126020528060005260406000206000915090508060000154908060010154905082565b61173e611738611b95565b83611cd4565b61177d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177490613bb3565b60405180910390fd5b611789848484846124c6565b50505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60004282116117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f090614340565b60405180910390fd5b600042836118079190614360565b905060006103e8600d548361181c9190614394565b6118269190614405565b856118319190614405565b9050809250505092915050565b606060006040518061048001604052806104568152602001614e926104569139905060006118ca826118856012600088815260200190815260200160002060010154612522565b6118a46012600089815260200190815260200160002060000154612522565b6040516020016118b693929190614703565b6040516020818303038152906040526125f0565b9050806040516020016118dd91906147ac565b60405160208183030381529060405292505050919050565b6000428211611939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193090614340565b60405180910390fd5b6000831161197c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197390614840565b60405180910390fd5b6000428361198a9190614360565b905060006103e8600d5483876119a09190614394565b6119aa9190614394565b6119b49190614405565b9050809250505092915050565b600042601260008481526020019081526020016000206001015411159050919050565b6119ec611c56565b80600d819055507f33e576b8e54523be9c9684e33c7144d859acb615dddc3874462fc0cc73f1ebe381604051611a229190613464565b60405180910390a150565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ac9611c56565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f906148d2565b60405180910390fd5b611b4181612246565b50565b600f5481565b611b5381612753565b611b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b899061405b565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c1083611387565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611c5e611b95565b73ffffffffffffffffffffffffffffffffffffffff16611c7c6114d8565b73ffffffffffffffffffffffffffffffffffffffff1614611cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc99061493e565b60405180910390fd5b565b600080611ce083611387565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d225750611d218185611a2d565b5b80611d6057508373ffffffffffffffffffffffffffffffffffffffff16611d4884610bcc565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d8982611387565b73ffffffffffffffffffffffffffffffffffffffff1614611ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd6906149d0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4590614a62565b60405180910390fd5b611e5b8383836001612794565b8273ffffffffffffffffffffffffffffffffffffffff16611e7b82611387565b73ffffffffffffffffffffffffffffffffffffffff1614611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec8906149d0565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461205d83838360016127a6565b505050565b6002600b54036120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209e90614ace565b60405180910390fd5b6002600b81905550565b6001600b81905550565b60006120c682611387565b90506120d6816000846001612794565b6120df82611387565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122058160008460016127a6565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61231633846127ac565b604051806040016040528083815260200182815250601260008581526020019081526020016000206000820151816000015560208201518160010155905050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bf90614b3a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124b9919061325d565b60405180910390a3505050565b6124d1848484611d69565b6124dd848484846127ca565b61251c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251390614bcc565b60405180910390fd5b50505050565b60606000600161253184612951565b01905060008167ffffffffffffffff8111156125505761254f6136f1565b5b6040519080825280601f01601f1916602001820160405280156125825781602001600182028036833780820191505090505b509050600082602001820190505b6001156125e5578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816125d9576125d86143d6565b5b04945060008503612590575b819350505050919050565b606060008251036126125760405180602001604052806000815250905061274e565b60006040518060600160405280604081526020016152e860409139905060006003600285516126419190614bec565b61264b9190614405565b60046126579190614394565b67ffffffffffffffff8111156126705761266f6136f1565b5b6040519080825280601f01601f1916602001820160405280156126a25781602001600182028036833780820191505090505b509050600182016020820185865187015b8082101561270e576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453600184019350506126b3565b505060038651066001811461272a576002811461273d57612745565b603d6001830353603d6002830353612745565b603d60018303535b50505080925050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661277583612209565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6127a084848484612aa4565b50505050565b50505050565b6127c6828260405180602001604052806000815250612c02565b5050565b60006127eb8473ffffffffffffffffffffffffffffffffffffffff16612c5d565b15612944578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612814611b95565b8786866040518563ffffffff1660e01b81526004016128369493929190614c6a565b6020604051808303816000875af192505050801561287257506040513d601f19601f8201168201806040525081019061286f9190614ccb565b60015b6128f4573d80600081146128a2576040519150601f19603f3d011682016040523d82523d6000602084013e6128a7565b606091505b5060008151036128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e390614bcc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612949565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106129af577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816129a5576129a46143d6565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106129ec576d04ee2d6d415b85acef810000000083816129e2576129e16143d6565b5b0492506020810190505b662386f26fc100008310612a1b57662386f26fc100008381612a1157612a106143d6565b5b0492506010810190505b6305f5e1008310612a44576305f5e1008381612a3a57612a396143d6565b5b0492506008810190505b6127108310612a69576127108381612a5f57612a5e6143d6565b5b0492506004810190505b60648310612a8c5760648381612a8257612a816143d6565b5b0492506002810190505b600a8310612a9b576001810190505b80915050919050565b612ab084848484612c80565b6001811115612af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aeb90614d6a565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612b3b57612b3681612c86565b612b7a565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612b7957612b788582612ccf565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612bbc57612bb781612e3c565b612bfb565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612bfa57612bf98482612f0d565b5b5b5050505050565b612c0c8383612f8c565b612c1960008484846127ca565b612c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4f90614bcc565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612cdc8461140d565b612ce69190614360565b9050600060086000848152602001908152602001600020549050818114612dcb576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612e509190614360565b90506000600a6000848152602001908152602001600020549050600060098381548110612e8057612e7f613fe0565b5b906000526020600020015490508060098381548110612ea257612ea1613fe0565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612ef157612ef0614d8a565b5b6001900381819060005260206000200160009055905550505050565b6000612f188361140d565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff290614e05565b60405180910390fd5b61300481612753565b15613044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303b90614e71565b60405180910390fd5b613052600083836001612794565b61305b81612753565b1561309b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309290614e71565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131a56000838360016127a6565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131f2816131bd565b81146131fd57600080fd5b50565b60008135905061320f816131e9565b92915050565b60006020828403121561322b5761322a6131b3565b5b600061323984828501613200565b91505092915050565b60008115159050919050565b61325781613242565b82525050565b6000602082019050613272600083018461324e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132b2578082015181840152602081019050613297565b60008484015250505050565b6000601f19601f8301169050919050565b60006132da82613278565b6132e48185613283565b93506132f4818560208601613294565b6132fd816132be565b840191505092915050565b6000602082019050818103600083015261332281846132cf565b905092915050565b6000819050919050565b61333d8161332a565b811461334857600080fd5b50565b60008135905061335a81613334565b92915050565b600060208284031215613376576133756131b3565b5b60006133848482850161334b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133b88261338d565b9050919050565b6133c8816133ad565b82525050565b60006020820190506133e360008301846133bf565b92915050565b6133f2816133ad565b81146133fd57600080fd5b50565b60008135905061340f816133e9565b92915050565b6000806040838503121561342c5761342b6131b3565b5b600061343a85828601613400565b925050602061344b8582860161334b565b9150509250929050565b61345e8161332a565b82525050565b60006020820190506134796000830184613455565b92915050565b6000819050919050565b6134928161347f565b811461349d57600080fd5b50565b6000813590506134af81613489565b92915050565b6000602082840312156134cb576134ca6131b3565b5b60006134d9848285016134a0565b91505092915050565b6134eb8161347f565b82525050565b600060208201905061350660008301846134e2565b92915050565b600080600060608486031215613525576135246131b3565b5b600061353386828701613400565b935050602061354486828701613400565b92505060406135558682870161334b565b9150509250925092565b600060ff82169050919050565b6135758161355f565b811461358057600080fd5b50565b6000813590506135928161356c565b92915050565b60008060008060008060c087890312156135b5576135b46131b3565b5b60006135c389828a0161334b565b96505060206135d489828a0161334b565b95505060406135e589828a016134a0565b94505060606135f689828a01613583565b935050608061360789828a016134a0565b92505060a061361889828a016134a0565b9150509295509295509295565b60006020828403121561363b5761363a6131b3565b5b600061364984828501613400565b91505092915050565b61365b81613242565b811461366657600080fd5b50565b60008135905061367881613652565b92915050565b60008060408385031215613695576136946131b3565b5b60006136a385828601613400565b92505060206136b485828601613669565b9150509250929050565b60006040820190506136d36000830185613455565b6136e06020830184613455565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613729826132be565b810181811067ffffffffffffffff82111715613748576137476136f1565b5b80604052505050565b600061375b6131a9565b90506137678282613720565b919050565b600067ffffffffffffffff821115613787576137866136f1565b5b613790826132be565b9050602081019050919050565b82818337600083830152505050565b60006137bf6137ba8461376c565b613751565b9050828152602081018484840111156137db576137da6136ec565b5b6137e684828561379d565b509392505050565b600082601f830112613803576138026136e7565b5b81356138138482602086016137ac565b91505092915050565b60008060008060808587031215613836576138356131b3565b5b600061384487828801613400565b945050602061385587828801613400565b93505060406138668782880161334b565b925050606085013567ffffffffffffffff811115613887576138866131b8565b5b613893878288016137ee565b91505092959194509250565b600080604083850312156138b6576138b56131b3565b5b60006138c48582860161334b565b92505060206138d58582860161334b565b9150509250929050565b600080604083850312156138f6576138f56131b3565b5b600061390485828601613400565b925050602061391585828601613400565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061396657607f821691505b6020821081036139795761397861391f565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006139db602183613283565b91506139e68261397f565b604082019050919050565b60006020820190508181036000830152613a0a816139ce565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613a6d603d83613283565b9150613a7882613a11565b604082019050919050565b60006020820190508181036000830152613a9c81613a60565b9050919050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613ae4601c83613aa3565b9150613aef82613aae565b601c82019050919050565b6000819050919050565b613b15613b108261347f565b613afa565b82525050565b6000613b2682613ad7565b9150613b328284613b04565b60208201915081905092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613b9d602d83613283565b9150613ba882613b41565b604082019050919050565b60006020820190508181036000830152613bcc81613b90565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613c2f602b83613283565b9150613c3a82613bd3565b604082019050919050565b60006020820190508181036000830152613c5e81613c22565b9050919050565b6000819050919050565b613c80613c7b8261332a565b613c65565b82525050565b6000613c928285613c6f565b602082019150613ca28284613c6f565b6020820191508190509392505050565b7f546865206d736748617368206973206e6f7420612068617368206f662074686560008201527f20657870697265734174202b2072657175657374735065724b696c6f7365636f60208201527f6e642e20204578706c61696e20796f757273656c662100000000000000000000604082015250565b6000613d34605683613283565b9150613d3f82613cb2565b606082019050919050565b60006020820190508181036000830152613d6381613d27565b9050919050565b613d738161355f565b82525050565b6000608082019050613d8e60008301876134e2565b613d9b6020830186613d6a565b613da860408301856134e2565b613db560608301846134e2565b95945050505050565b7f5468697320667265654d696e7420776173206e6f74207369676e65642062792060008201527f667265654d696e745369676e65722e2020486f7720656d626172617373696e6760208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b6000613e40604183613283565b9150613e4b82613dbe565b606082019050919050565b60006020820190508181036000830152613e6f81613e33565b9050919050565b7f5468697320667265654d696e742068617320616c7265616479206265656e207260008201527f656465656d65642e2020486f7720656d626172617373696e672e000000000000602082015250565b6000613ed2603a83613283565b9150613edd82613e76565b604082019050919050565b60006020820190508181036000830152613f0181613ec5565b9050919050565b600081905092915050565b50565b6000613f23600083613f08565b9150613f2e82613f13565b600082019050919050565b6000613f4482613f16565b9150819050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613faa602c83613283565b9150613fb582613f4e565b604082019050919050565b60006020820190508181036000830152613fd981613f9d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614045601883613283565b91506140508261400f565b602082019050919050565b6000602082019050818103600083015261407481614038565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006140d7602983613283565b91506140e28261407b565b604082019050919050565b60006020820190508181036000830152614106816140ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141478261332a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141795761417861410d565b5b600182019050919050565b7f596f75206d7573742073656e642074686520636f7374206f662074686973207260008201527f617465206c696d697420696e6372656173652e2020546f20636865636b20746860208201527f6520636f73742c20757365207468652063616c63756c617465436f737420667560408201527f6e6374696f6e2e00000000000000000000000000000000000000000000000000606082015250565b600061422c606783613283565b915061423782614184565b608082019050919050565b6000602082019050818103600083015261425b8161421f565b9050919050565b7f54686520636f7374206d7573742062652067726561746572207468616e203000600082015250565b6000614298601f83613283565b91506142a382614262565b602082019050919050565b600060208201905081810360008301526142c78161428b565b9050919050565b7f54686520657870697265734174206d75737420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061432a602383613283565b9150614335826142ce565b604082019050919050565b600060208201905081810360008301526143598161431d565b9050919050565b600061436b8261332a565b91506143768361332a565b925082820390508181111561438e5761438d61410d565b5b92915050565b600061439f8261332a565b91506143aa8361332a565b92508282026143b88161332a565b915082820484148315176143cf576143ce61410d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144108261332a565b915061441b8361332a565b92508261442b5761442a6143d6565b5b828204905092915050565b7f7b226e616d65223a20224c69742050726f746f636f6c2052617465204c696d6960008201527f7420496e637265617365222c20226465736372697074696f6e223a202254686960208201527f73204e465420656e7469746c65732074686520686f6c64657220746f2061207260408201527f617465206c696d697420696e637265617365206f6e20746865204c697420507260608201527f6f746f636f6c204e6574776f726b222c2022696d6167655f64617461223a2022608082015250565b600061450460a083613aa3565b915061450f82614436565b60a082019050919050565b600081519050919050565b60006145308261451a565b61453a8185613f08565b935061454a818560208601613294565b80840191505092915050565b7f222c2261747472696275746573223a205b7b22646973706c61795f747970652260008201527f3a202264617465222c202274726169745f74797065223a20224578706972617460208201527f696f6e2044617465222c202276616c7565223a20000000000000000000000000604082015250565b60006145d8605483613aa3565b91506145e382614556565b605482019050919050565b60006145f982613278565b6146038185613aa3565b9350614613818560208601613294565b80840191505092915050565b7f7d2c207b22646973706c61795f74797065223a20226e756d626572222c20227460008201527f726169745f74797065223a20224d696c6c69726571756573747320506572205360208201527f65636f6e64222c202276616c7565223a20000000000000000000000000000000604082015250565b60006146a1605183613aa3565b91506146ac8261461f565b605182019050919050565b7f7d5d7d0000000000000000000000000000000000000000000000000000000000600082015250565b60006146ed600383613aa3565b91506146f8826146b7565b600382019050919050565b600061470e826144f7565b915061471a8286614525565b9150614725826145cb565b915061473182856145ee565b915061473c82614694565b915061474882846145ee565b9150614753826146e0565b9150819050949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000614796601d83613aa3565b91506147a182614760565b601d82019050919050565b60006147b782614789565b91506147c382846145ee565b915081905092915050565b7f5468652072657175657374735065724b696c6f7365636f6e64206d757374206260008201527f652067726561746572207468616e203000000000000000000000000000000000602082015250565b600061482a603083613283565b9150614835826147ce565b604082019050919050565b600060208201905081810360008301526148598161481d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148bc602683613283565b91506148c782614860565b604082019050919050565b600060208201905081810360008301526148eb816148af565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614928602083613283565b9150614933826148f2565b602082019050919050565b600060208201905081810360008301526149578161491b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006149ba602583613283565b91506149c58261495e565b604082019050919050565b600060208201905081810360008301526149e9816149ad565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a4c602483613283565b9150614a57826149f0565b604082019050919050565b60006020820190508181036000830152614a7b81614a3f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614ab8601f83613283565b9150614ac382614a82565b602082019050919050565b60006020820190508181036000830152614ae781614aab565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614b24601983613283565b9150614b2f82614aee565b602082019050919050565b60006020820190508181036000830152614b5381614b17565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614bb6603283613283565b9150614bc182614b5a565b604082019050919050565b60006020820190508181036000830152614be581614ba9565b9050919050565b6000614bf78261332a565b9150614c028361332a565b9250828201905080821115614c1a57614c1961410d565b5b92915050565b600082825260208201905092915050565b6000614c3c8261451a565b614c468185614c20565b9350614c56818560208601613294565b614c5f816132be565b840191505092915050565b6000608082019050614c7f60008301876133bf565b614c8c60208301866133bf565b614c996040830185613455565b8181036060830152614cab8184614c31565b905095945050505050565b600081519050614cc5816131e9565b92915050565b600060208284031215614ce157614ce06131b3565b5b6000614cef84828501614cb6565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614d54603583613283565b9150614d5f82614cf8565b604082019050919050565b60006020820190508181036000830152614d8381614d47565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614def602083613283565b9150614dfa82614db9565b602082019050919050565b60006020820190508181036000830152614e1e81614de2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614e5b601c83613283565b9150614e6682614e25565b602082019050919050565b60006020820190508181036000830152614e8a81614e4e565b905091905056fe3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272077696474683d273130383027206865696768743d2731303830272066696c6c3d276e6f6e652720786d6c6e733a763d2768747470733a2f2f76656374612e696f2f6e616e6f273e3c7061746820643d274d3336332e303736203339322e323237732d2e3937372031382e3532342d33362e3837342037382e393437632d34312e3537362037302e3031382d34352e343831203135312e3937382d332e303137203232302e342038392e353231203134342e323435203333322e343831203134312e3532203432322e3535362e3038392033342e3833322d35342e3730372034342e3831362d3131372e3437392033322e3932342d3138312e323438203020302d32382e3831392d3133332e3134342d3132372e3233372d3231372e30393920312e35353320312e33303820352e3336392031392e31323220362e3130312032362e37323220322e3234312032332e3335342e3034352034372e3833382d372e3738372037302e3036322d352e3734362031362e33332d31332e3731312033302e3436372d32372e3137382034312e33363820302d332e3831312d2e3935342d31302e3633352d2e3937362d31322e3931382d2e3634342d34362e3530382d31382e3635392d38392e3538322d34382e3031312d3132352e3734332d32352e3634372d33312e3535322d36302e3831322d35332e3038392d39372e38342d36382e3933322e39333120332e31393120322e3636322031362e34313920322e3930362031392e30333320312e3930382032312e39353820322e3236332035322e3731332d2e3632312037342e363439732d372e3833322033332e3837382d31342e3535342035342e343431632d31302e3138342033312e3137352d32342e30352035342e3238352d34312e3632312038322e3030342d332e323420352e3039362d31322e3931332031392e3037382d31382e3038322032362e313436203020302d382e3839372d35362e3139312d34302e3636372d38372e393231682d2e3032327a272066696c6c3d2723303030272f3e3c7061746820643d274d3536322e352032372e32386c3431302e323739203233362e3837346331332e39323320382e3033392032322e352032322e3839352032322e352033382e393731763437332e373563302031362e3037362d382e3537372033302e3933322d32322e352033382e3937314c3536322e3520313035322e3732632d31332e39323320382e30342d33312e30373720382e30342d343520304c3130372e323231203831352e383436632d31332e3932332d382e3033392d32322e352d32322e3839352d32322e352d33382e393731762d3437332e37356134352034352030203020312032322e352d33382e3937314c3531372e352032372e323861343520343520302030203120343520307a27207374726f6b653d272330303027207374726f6b652d77696474683d2732342e3735272f3e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212206c22f94c6ed9d8c1b3628c5dd59ccea4bfbd677df7310b8a7bcba1f692bd8c5664736f6c6343000811003352617465204c696d697420496e63726561736573206f6e204c69742050726f746f636f6c

Deployed ByteCode

0x6080604052600436106102465760003560e01c80634f6ccce711610139578063ab1bbeca116100b6578063ce3946961161007a578063ce394696146108cc578063d9548e5314610909578063e62a219514610946578063e985e9c51461096f578063f2fde38b146109ac578063fb24b22e146109d557610246565b8063ab1bbeca146107c0578063b88d4fde146107fe578063b94a210214610827578063ba45b2ba14610852578063c87b56dd1461088f57610246565b806395d89b41116100fd57806395d89b41146106d457806398bdf6f5146106ff578063995eebab1461072a578063a0712d6814610767578063a22cb4651461079757610246565b80634f6ccce7146105db5780636352211e1461061857806370a0823114610655578063715018a6146106925780638da5cb5b146106a957610246565b80632f745c59116101c75780633ccfd60b1161018b5780633ccfd60b1461051c57806342842e0e1461053357806342966c681461055c5780634659470d146105855780634a5f3acd146105b057610246565b80632f745c59146104275780633488ab131461046457806339f1a4f11461048d5780633b189852146104b65780633b1a72cc146104df57610246565b806318160ddd1161020e57806318160ddd146103425780631f2757131461036d57806323b872dd146103aa57806326894764146103d357806328b9b37c146103fe57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806311fc456214610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613215565b610a00565b60405161027f919061325d565b60405180910390f35b34801561029457600080fd5b5061029d610b3a565b6040516102aa9190613308565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613360565b610bcc565b6040516102e791906133ce565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613415565b610c12565b005b34801561032557600080fd5b50610340600480360381019061033b9190613360565b610d29565b005b34801561034e57600080fd5b50610357610d72565b6040516103649190613464565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f91906134b5565b610d7f565b6040516103a191906134f1565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc919061350c565b610daf565b005b3480156103df57600080fd5b506103e8610e0f565b6040516103f59190613464565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613360565b610e15565b005b34801561043357600080fd5b5061044e60048036038101906104499190613415565b610e5e565b60405161045b9190613464565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190613598565b610f03565b005b34801561049957600080fd5b506104b460048036038101906104af9190613360565b6110c8565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190613625565b611111565b005b3480156104eb57600080fd5b50610506600480360381019061050191906134b5565b6111a0565b604051610513919061325d565b60405180910390f35b34801561052857600080fd5b506105316111c0565b005b34801561053f57600080fd5b5061055a6004803603810190610555919061350c565b61128e565b005b34801561056857600080fd5b50610583600480360381019061057e9190613360565b6112ae565b005b34801561059157600080fd5b5061059a61130a565b6040516105a79190613464565b60405180910390f35b3480156105bc57600080fd5b506105c5611310565b6040516105d29190613464565b60405180910390f35b3480156105e757600080fd5b5061060260048036038101906105fd9190613360565b611316565b60405161060f9190613464565b60405180910390f35b34801561062457600080fd5b5061063f600480360381019061063a9190613360565b611387565b60405161064c91906133ce565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190613625565b61140d565b6040516106899190613464565b60405180910390f35b34801561069e57600080fd5b506106a76114c4565b005b3480156106b557600080fd5b506106be6114d8565b6040516106cb91906133ce565b60405180910390f35b3480156106e057600080fd5b506106e9611502565b6040516106f69190613308565b60405180910390f35b34801561070b57600080fd5b50610714611594565b6040516107219190613464565b60405180910390f35b34801561073657600080fd5b50610751600480360381019061074c9190613598565b61159a565b60405161075e9190613464565b60405180910390f35b610781600480360381019061077c9190613360565b61160e565b60405161078e9190613464565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b9919061367e565b6116f3565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613360565b611709565b6040516107f59291906136be565b60405180910390f35b34801561080a57600080fd5b506108256004803603810190610820919061381c565b61172d565b005b34801561083357600080fd5b5061083c61178f565b60405161084991906133ce565b60405180910390f35b34801561085e57600080fd5b506108796004803603810190610874919061389f565b6117b5565b6040516108869190613464565b60405180910390f35b34801561089b57600080fd5b506108b660048036038101906108b19190613360565b61183e565b6040516108c39190613308565b60405180910390f35b3480156108d857600080fd5b506108f360048036038101906108ee919061389f565b6118f5565b6040516109009190613464565b60405180910390f35b34801561091557600080fd5b50610930600480360381019061092b9190613360565b6119c1565b60405161093d919061325d565b60405180910390f35b34801561095257600080fd5b5061096d60048036038101906109689190613360565b6119e4565b005b34801561097b57600080fd5b50610996600480360381019061099191906138df565b611a2d565b6040516109a3919061325d565b60405180910390f35b3480156109b857600080fd5b506109d360048036038101906109ce9190613625565b611ac1565b005b3480156109e157600080fd5b506109ea611b44565b6040516109f79190613464565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610acb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b3357507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060008054610b499061394e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b759061394e565b8015610bc25780601f10610b9757610100808354040283529160200191610bc2565b820191906000526020600020905b815481529060010190602001808311610ba557829003601f168201915b5050505050905090565b6000610bd782611b4a565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1d82611387565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c84906139f1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cac611b95565b73ffffffffffffffffffffffffffffffffffffffff161480610cdb5750610cda81610cd5611b95565b611a2d565b5b610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1190613a83565b60405180910390fd5b610d248383611b9d565b505050565b610d31611c56565b80600f819055507f8113757de54f756eb308220e3f035727188560fd3230aaf1fbc24e5610fea1f881604051610d679190613464565b60405180910390a150565b6000600980549050905090565b600081604051602001610d929190613b1b565b604051602081830303815290604052805190602001209050919050565b610dc0610dba611b95565b82611cd4565b610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df690613bb3565b60405180910390fd5b610e0a838383611d69565b505050565b60115481565b610e1d611c56565b806011819055507fce84f3dad126a2cb9d67cdca12c64dc079f7a9a1a0728c5c4e16e4b5b2e4bc4d81604051610e539190613464565b60405180910390a150565b6000610e698361140d565b8210610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190613c45565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610f368787604051602001610f1b929190613c86565b60405160208183030381529060405280519060200120610d7f565b9050848114610f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7190613d4a565b60405180910390fd5b600060018686868660405160008152602001604052604051610f9f9493929190613d79565b6020604051602081039080840390855afa158015610fc1573d6000803e3d6000fd5b505050602060405103519050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461105d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105490613e56565b60405180910390fd5b6013600087815260200190815260200160002060009054906101000a900460ff16156110be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b590613ee8565b60405180910390fd5b5050505050505050565b6110d0611c56565b806010819055507fad40b1be79d0692234d4fb1d25a47b916b4754dda8187fc0aa1271b7d7adb040816040516111069190613464565b60405180910390a150565b611119611c56565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f65d3e06a561c77a07da59b8b2ca10214ae08fe21cc2953a90db0ac8b5b7c437160405160405180910390a250565b60136020528060005260406000206000915054906101000a900460ff1681565b6111c8611c56565b6111d0612062565b600047905060003373ffffffffffffffffffffffffffffffffffffffff16826040516111fb90613f39565b60006040518083038185875af1925050503d8060008114611238576040519150601f19603f3d011682016040523d82523d6000602084013e61123d565b606091505b505090508061124b57600080fd5b7fb6b476da71cea8275cac6b1720c04966afaff5e637472cedb6cbd32c43a232518260405161127a9190613464565b60405180910390a1505061128c6120b1565b565b6112a98383836040518060200160405280600081525061172d565b505050565b6112bf6112b9611b95565b82611cd4565b6112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590613bb3565b60405180910390fd5b611307816120bb565b50565b600d5481565b60105481565b6000611320610d72565b8210611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135890613fc0565b60405180910390fd5b6009828154811061137557611374613fe0565b5b90600052602060002001549050919050565b60008061139383612209565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb9061405b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361147d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611474906140ed565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114cc611c56565b6114d66000612246565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115119061394e565b80601f016020809104026020016040519081016040528092919081815260200182805461153d9061394e565b801561158a5780601f1061155f5761010080835404028352916020019161158a565b820191906000526020600020905b81548152906001019060200180831161156d57829003601f168201915b5050505050905090565b600e5481565b6000600e60008154809291906115af9061413c565b91905055506000600e5490506115c9888888888888610f03565b60016013600088815260200190815260200160002060006101000a81548160ff02191690831515021790555061160081888a61230c565b809150509695505050505050565b6000600e60008154809291906116239061413c565b91905055506000600e549050600061163b34856117b5565b9050600061164982866118f5565b905060003411801561165b5750803410155b61169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169190614242565b60405180910390fd5b600081116116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d4906142ae565b60405180910390fd5b6116e883838761230c565b829350505050919050565b6117056116fe611b95565b838361235a565b5050565b60126020528060005260406000206000915090508060000154908060010154905082565b61173e611738611b95565b83611cd4565b61177d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177490613bb3565b60405180910390fd5b611789848484846124c6565b50505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60004282116117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f090614340565b60405180910390fd5b600042836118079190614360565b905060006103e8600d548361181c9190614394565b6118269190614405565b856118319190614405565b9050809250505092915050565b606060006040518061048001604052806104568152602001614e926104569139905060006118ca826118856012600088815260200190815260200160002060010154612522565b6118a46012600089815260200190815260200160002060000154612522565b6040516020016118b693929190614703565b6040516020818303038152906040526125f0565b9050806040516020016118dd91906147ac565b60405160208183030381529060405292505050919050565b6000428211611939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193090614340565b60405180910390fd5b6000831161197c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197390614840565b60405180910390fd5b6000428361198a9190614360565b905060006103e8600d5483876119a09190614394565b6119aa9190614394565b6119b49190614405565b9050809250505092915050565b600042601260008481526020019081526020016000206001015411159050919050565b6119ec611c56565b80600d819055507f33e576b8e54523be9c9684e33c7144d859acb615dddc3874462fc0cc73f1ebe381604051611a229190613464565b60405180910390a150565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ac9611c56565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f906148d2565b60405180910390fd5b611b4181612246565b50565b600f5481565b611b5381612753565b611b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b899061405b565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c1083611387565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611c5e611b95565b73ffffffffffffffffffffffffffffffffffffffff16611c7c6114d8565b73ffffffffffffffffffffffffffffffffffffffff1614611cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc99061493e565b60405180910390fd5b565b600080611ce083611387565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d225750611d218185611a2d565b5b80611d6057508373ffffffffffffffffffffffffffffffffffffffff16611d4884610bcc565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d8982611387565b73ffffffffffffffffffffffffffffffffffffffff1614611ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd6906149d0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4590614a62565b60405180910390fd5b611e5b8383836001612794565b8273ffffffffffffffffffffffffffffffffffffffff16611e7b82611387565b73ffffffffffffffffffffffffffffffffffffffff1614611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec8906149d0565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461205d83838360016127a6565b505050565b6002600b54036120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209e90614ace565b60405180910390fd5b6002600b81905550565b6001600b81905550565b60006120c682611387565b90506120d6816000846001612794565b6120df82611387565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122058160008460016127a6565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61231633846127ac565b604051806040016040528083815260200182815250601260008581526020019081526020016000206000820151816000015560208201518160010155905050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bf90614b3a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124b9919061325d565b60405180910390a3505050565b6124d1848484611d69565b6124dd848484846127ca565b61251c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251390614bcc565b60405180910390fd5b50505050565b60606000600161253184612951565b01905060008167ffffffffffffffff8111156125505761254f6136f1565b5b6040519080825280601f01601f1916602001820160405280156125825781602001600182028036833780820191505090505b509050600082602001820190505b6001156125e5578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816125d9576125d86143d6565b5b04945060008503612590575b819350505050919050565b606060008251036126125760405180602001604052806000815250905061274e565b60006040518060600160405280604081526020016152e860409139905060006003600285516126419190614bec565b61264b9190614405565b60046126579190614394565b67ffffffffffffffff8111156126705761266f6136f1565b5b6040519080825280601f01601f1916602001820160405280156126a25781602001600182028036833780820191505090505b509050600182016020820185865187015b8082101561270e576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453600184019350506126b3565b505060038651066001811461272a576002811461273d57612745565b603d6001830353603d6002830353612745565b603d60018303535b50505080925050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661277583612209565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6127a084848484612aa4565b50505050565b50505050565b6127c6828260405180602001604052806000815250612c02565b5050565b60006127eb8473ffffffffffffffffffffffffffffffffffffffff16612c5d565b15612944578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612814611b95565b8786866040518563ffffffff1660e01b81526004016128369493929190614c6a565b6020604051808303816000875af192505050801561287257506040513d601f19601f8201168201806040525081019061286f9190614ccb565b60015b6128f4573d80600081146128a2576040519150601f19603f3d011682016040523d82523d6000602084013e6128a7565b606091505b5060008151036128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e390614bcc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612949565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106129af577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816129a5576129a46143d6565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106129ec576d04ee2d6d415b85acef810000000083816129e2576129e16143d6565b5b0492506020810190505b662386f26fc100008310612a1b57662386f26fc100008381612a1157612a106143d6565b5b0492506010810190505b6305f5e1008310612a44576305f5e1008381612a3a57612a396143d6565b5b0492506008810190505b6127108310612a69576127108381612a5f57612a5e6143d6565b5b0492506004810190505b60648310612a8c5760648381612a8257612a816143d6565b5b0492506002810190505b600a8310612a9b576001810190505b80915050919050565b612ab084848484612c80565b6001811115612af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aeb90614d6a565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612b3b57612b3681612c86565b612b7a565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612b7957612b788582612ccf565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612bbc57612bb781612e3c565b612bfb565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612bfa57612bf98482612f0d565b5b5b5050505050565b612c0c8383612f8c565b612c1960008484846127ca565b612c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4f90614bcc565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612cdc8461140d565b612ce69190614360565b9050600060086000848152602001908152602001600020549050818114612dcb576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612e509190614360565b90506000600a6000848152602001908152602001600020549050600060098381548110612e8057612e7f613fe0565b5b906000526020600020015490508060098381548110612ea257612ea1613fe0565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612ef157612ef0614d8a565b5b6001900381819060005260206000200160009055905550505050565b6000612f188361140d565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff290614e05565b60405180910390fd5b61300481612753565b15613044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303b90614e71565b60405180910390fd5b613052600083836001612794565b61305b81612753565b1561309b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309290614e71565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131a56000838360016127a6565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131f2816131bd565b81146131fd57600080fd5b50565b60008135905061320f816131e9565b92915050565b60006020828403121561322b5761322a6131b3565b5b600061323984828501613200565b91505092915050565b60008115159050919050565b61325781613242565b82525050565b6000602082019050613272600083018461324e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132b2578082015181840152602081019050613297565b60008484015250505050565b6000601f19601f8301169050919050565b60006132da82613278565b6132e48185613283565b93506132f4818560208601613294565b6132fd816132be565b840191505092915050565b6000602082019050818103600083015261332281846132cf565b905092915050565b6000819050919050565b61333d8161332a565b811461334857600080fd5b50565b60008135905061335a81613334565b92915050565b600060208284031215613376576133756131b3565b5b60006133848482850161334b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133b88261338d565b9050919050565b6133c8816133ad565b82525050565b60006020820190506133e360008301846133bf565b92915050565b6133f2816133ad565b81146133fd57600080fd5b50565b60008135905061340f816133e9565b92915050565b6000806040838503121561342c5761342b6131b3565b5b600061343a85828601613400565b925050602061344b8582860161334b565b9150509250929050565b61345e8161332a565b82525050565b60006020820190506134796000830184613455565b92915050565b6000819050919050565b6134928161347f565b811461349d57600080fd5b50565b6000813590506134af81613489565b92915050565b6000602082840312156134cb576134ca6131b3565b5b60006134d9848285016134a0565b91505092915050565b6134eb8161347f565b82525050565b600060208201905061350660008301846134e2565b92915050565b600080600060608486031215613525576135246131b3565b5b600061353386828701613400565b935050602061354486828701613400565b92505060406135558682870161334b565b9150509250925092565b600060ff82169050919050565b6135758161355f565b811461358057600080fd5b50565b6000813590506135928161356c565b92915050565b60008060008060008060c087890312156135b5576135b46131b3565b5b60006135c389828a0161334b565b96505060206135d489828a0161334b565b95505060406135e589828a016134a0565b94505060606135f689828a01613583565b935050608061360789828a016134a0565b92505060a061361889828a016134a0565b9150509295509295509295565b60006020828403121561363b5761363a6131b3565b5b600061364984828501613400565b91505092915050565b61365b81613242565b811461366657600080fd5b50565b60008135905061367881613652565b92915050565b60008060408385031215613695576136946131b3565b5b60006136a385828601613400565b92505060206136b485828601613669565b9150509250929050565b60006040820190506136d36000830185613455565b6136e06020830184613455565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613729826132be565b810181811067ffffffffffffffff82111715613748576137476136f1565b5b80604052505050565b600061375b6131a9565b90506137678282613720565b919050565b600067ffffffffffffffff821115613787576137866136f1565b5b613790826132be565b9050602081019050919050565b82818337600083830152505050565b60006137bf6137ba8461376c565b613751565b9050828152602081018484840111156137db576137da6136ec565b5b6137e684828561379d565b509392505050565b600082601f830112613803576138026136e7565b5b81356138138482602086016137ac565b91505092915050565b60008060008060808587031215613836576138356131b3565b5b600061384487828801613400565b945050602061385587828801613400565b93505060406138668782880161334b565b925050606085013567ffffffffffffffff811115613887576138866131b8565b5b613893878288016137ee565b91505092959194509250565b600080604083850312156138b6576138b56131b3565b5b60006138c48582860161334b565b92505060206138d58582860161334b565b9150509250929050565b600080604083850312156138f6576138f56131b3565b5b600061390485828601613400565b925050602061391585828601613400565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061396657607f821691505b6020821081036139795761397861391f565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006139db602183613283565b91506139e68261397f565b604082019050919050565b60006020820190508181036000830152613a0a816139ce565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613a6d603d83613283565b9150613a7882613a11565b604082019050919050565b60006020820190508181036000830152613a9c81613a60565b9050919050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613ae4601c83613aa3565b9150613aef82613aae565b601c82019050919050565b6000819050919050565b613b15613b108261347f565b613afa565b82525050565b6000613b2682613ad7565b9150613b328284613b04565b60208201915081905092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613b9d602d83613283565b9150613ba882613b41565b604082019050919050565b60006020820190508181036000830152613bcc81613b90565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613c2f602b83613283565b9150613c3a82613bd3565b604082019050919050565b60006020820190508181036000830152613c5e81613c22565b9050919050565b6000819050919050565b613c80613c7b8261332a565b613c65565b82525050565b6000613c928285613c6f565b602082019150613ca28284613c6f565b6020820191508190509392505050565b7f546865206d736748617368206973206e6f7420612068617368206f662074686560008201527f20657870697265734174202b2072657175657374735065724b696c6f7365636f60208201527f6e642e20204578706c61696e20796f757273656c662100000000000000000000604082015250565b6000613d34605683613283565b9150613d3f82613cb2565b606082019050919050565b60006020820190508181036000830152613d6381613d27565b9050919050565b613d738161355f565b82525050565b6000608082019050613d8e60008301876134e2565b613d9b6020830186613d6a565b613da860408301856134e2565b613db560608301846134e2565b95945050505050565b7f5468697320667265654d696e7420776173206e6f74207369676e65642062792060008201527f667265654d696e745369676e65722e2020486f7720656d626172617373696e6760208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b6000613e40604183613283565b9150613e4b82613dbe565b606082019050919050565b60006020820190508181036000830152613e6f81613e33565b9050919050565b7f5468697320667265654d696e742068617320616c7265616479206265656e207260008201527f656465656d65642e2020486f7720656d626172617373696e672e000000000000602082015250565b6000613ed2603a83613283565b9150613edd82613e76565b604082019050919050565b60006020820190508181036000830152613f0181613ec5565b9050919050565b600081905092915050565b50565b6000613f23600083613f08565b9150613f2e82613f13565b600082019050919050565b6000613f4482613f16565b9150819050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613faa602c83613283565b9150613fb582613f4e565b604082019050919050565b60006020820190508181036000830152613fd981613f9d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614045601883613283565b91506140508261400f565b602082019050919050565b6000602082019050818103600083015261407481614038565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006140d7602983613283565b91506140e28261407b565b604082019050919050565b60006020820190508181036000830152614106816140ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141478261332a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141795761417861410d565b5b600182019050919050565b7f596f75206d7573742073656e642074686520636f7374206f662074686973207260008201527f617465206c696d697420696e6372656173652e2020546f20636865636b20746860208201527f6520636f73742c20757365207468652063616c63756c617465436f737420667560408201527f6e6374696f6e2e00000000000000000000000000000000000000000000000000606082015250565b600061422c606783613283565b915061423782614184565b608082019050919050565b6000602082019050818103600083015261425b8161421f565b9050919050565b7f54686520636f7374206d7573742062652067726561746572207468616e203000600082015250565b6000614298601f83613283565b91506142a382614262565b602082019050919050565b600060208201905081810360008301526142c78161428b565b9050919050565b7f54686520657870697265734174206d75737420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061432a602383613283565b9150614335826142ce565b604082019050919050565b600060208201905081810360008301526143598161431d565b9050919050565b600061436b8261332a565b91506143768361332a565b925082820390508181111561438e5761438d61410d565b5b92915050565b600061439f8261332a565b91506143aa8361332a565b92508282026143b88161332a565b915082820484148315176143cf576143ce61410d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144108261332a565b915061441b8361332a565b92508261442b5761442a6143d6565b5b828204905092915050565b7f7b226e616d65223a20224c69742050726f746f636f6c2052617465204c696d6960008201527f7420496e637265617365222c20226465736372697074696f6e223a202254686960208201527f73204e465420656e7469746c65732074686520686f6c64657220746f2061207260408201527f617465206c696d697420696e637265617365206f6e20746865204c697420507260608201527f6f746f636f6c204e6574776f726b222c2022696d6167655f64617461223a2022608082015250565b600061450460a083613aa3565b915061450f82614436565b60a082019050919050565b600081519050919050565b60006145308261451a565b61453a8185613f08565b935061454a818560208601613294565b80840191505092915050565b7f222c2261747472696275746573223a205b7b22646973706c61795f747970652260008201527f3a202264617465222c202274726169745f74797065223a20224578706972617460208201527f696f6e2044617465222c202276616c7565223a20000000000000000000000000604082015250565b60006145d8605483613aa3565b91506145e382614556565b605482019050919050565b60006145f982613278565b6146038185613aa3565b9350614613818560208601613294565b80840191505092915050565b7f7d2c207b22646973706c61795f74797065223a20226e756d626572222c20227460008201527f726169745f74797065223a20224d696c6c69726571756573747320506572205360208201527f65636f6e64222c202276616c7565223a20000000000000000000000000000000604082015250565b60006146a1605183613aa3565b91506146ac8261461f565b605182019050919050565b7f7d5d7d0000000000000000000000000000000000000000000000000000000000600082015250565b60006146ed600383613aa3565b91506146f8826146b7565b600382019050919050565b600061470e826144f7565b915061471a8286614525565b9150614725826145cb565b915061473182856145ee565b915061473c82614694565b915061474882846145ee565b9150614753826146e0565b9150819050949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000614796601d83613aa3565b91506147a182614760565b601d82019050919050565b60006147b782614789565b91506147c382846145ee565b915081905092915050565b7f5468652072657175657374735065724b696c6f7365636f6e64206d757374206260008201527f652067726561746572207468616e203000000000000000000000000000000000602082015250565b600061482a603083613283565b9150614835826147ce565b604082019050919050565b600060208201905081810360008301526148598161481d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148bc602683613283565b91506148c782614860565b604082019050919050565b600060208201905081810360008301526148eb816148af565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614928602083613283565b9150614933826148f2565b602082019050919050565b600060208201905081810360008301526149578161491b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006149ba602583613283565b91506149c58261495e565b604082019050919050565b600060208201905081810360008301526149e9816149ad565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a4c602483613283565b9150614a57826149f0565b604082019050919050565b60006020820190508181036000830152614a7b81614a3f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614ab8601f83613283565b9150614ac382614a82565b602082019050919050565b60006020820190508181036000830152614ae781614aab565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614b24601983613283565b9150614b2f82614aee565b602082019050919050565b60006020820190508181036000830152614b5381614b17565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614bb6603283613283565b9150614bc182614b5a565b604082019050919050565b60006020820190508181036000830152614be581614ba9565b9050919050565b6000614bf78261332a565b9150614c028361332a565b9250828201905080821115614c1a57614c1961410d565b5b92915050565b600082825260208201905092915050565b6000614c3c8261451a565b614c468185614c20565b9350614c56818560208601613294565b614c5f816132be565b840191505092915050565b6000608082019050614c7f60008301876133bf565b614c8c60208301866133bf565b614c996040830185613455565b8181036060830152614cab8184614c31565b905095945050505050565b600081519050614cc5816131e9565b92915050565b600060208284031215614ce157614ce06131b3565b5b6000614cef84828501614cb6565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614d54603583613283565b9150614d5f82614cf8565b604082019050919050565b60006020820190508181036000830152614d8381614d47565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614def602083613283565b9150614dfa82614db9565b602082019050919050565b60006020820190508181036000830152614e1e81614de2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614e5b601c83613283565b9150614e6682614e25565b602082019050919050565b60006020820190508181036000830152614e8a81614e4e565b905091905056fe3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272077696474683d273130383027206865696768743d2731303830272066696c6c3d276e6f6e652720786d6c6e733a763d2768747470733a2f2f76656374612e696f2f6e616e6f273e3c7061746820643d274d3336332e303736203339322e323237732d2e3937372031382e3532342d33362e3837342037382e393437632d34312e3537362037302e3031382d34352e343831203135312e3937382d332e303137203232302e342038392e353231203134342e323435203333322e343831203134312e3532203432322e3535362e3038392033342e3833322d35342e3730372034342e3831362d3131372e3437392033322e3932342d3138312e323438203020302d32382e3831392d3133332e3134342d3132372e3233372d3231372e30393920312e35353320312e33303820352e3336392031392e31323220362e3130312032362e37323220322e3234312032332e3335342e3034352034372e3833382d372e3738372037302e3036322d352e3734362031362e33332d31332e3731312033302e3436372d32372e3137382034312e33363820302d332e3831312d2e3935342d31302e3633352d2e3937362d31322e3931382d2e3634342d34362e3530382d31382e3635392d38392e3538322d34382e3031312d3132352e3734332d32352e3634372d33312e3535322d36302e3831322d35332e3038392d39372e38342d36382e3933322e39333120332e31393120322e3636322031362e34313920322e3930362031392e30333320312e3930382032312e39353820322e3236332035322e3731332d2e3632312037342e363439732d372e3833322033332e3837382d31342e3535342035342e343431632d31302e3138342033312e3137352d32342e30352035342e3238352d34312e3632312038322e3030342d332e323420352e3039362d31322e3931332031392e3037382d31382e3038322032362e313436203020302d382e3839372d35362e3139312d34302e3636372d38372e393231682d2e3032327a272066696c6c3d2723303030272f3e3c7061746820643d274d3536322e352032372e32386c3431302e323739203233362e3837346331332e39323320382e3033392032322e352032322e3839352032322e352033382e393731763437332e373563302031362e3037362d382e3537372033302e3933322d32322e352033382e3937314c3536322e3520313035322e3732632d31332e39323320382e30342d33312e30373720382e30342d343520304c3130372e323231203831352e383436632d31332e3932332d382e3033392d32322e352d32322e3839352d32322e352d33382e393731762d3437332e37356134352034352030203020312032322e352d33382e3937314c3531372e352032372e323861343520343520302030203120343520307a27207374726f6b653d272330303027207374726f6b652d77696474683d2732342e3735272f3e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212206c22f94c6ed9d8c1b3628c5dd59ccea4bfbd677df7310b8a7bcba1f692bd8c5664736f6c63430008110033