ERC-721
NFT
Overview
Max Total Supply
108 NA
Holders
67
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
10 NALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NostalgicApes
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-07 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.11; /* * @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. */ library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @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); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @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); } /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * Available since v3.1. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * Available since v3.1. */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * Available since v3.1. */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * Available since v3.1. */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * Available since v3.3. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * Available since v3.3. */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * Available since v3.4. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * Available since v3.4. */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @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; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @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 tokenId); /** * @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); } /** * @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]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `ownedTokensIndex` mapping is _not updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } contract BlackLkisted is Ownable { mapping(address=>bool) isBlacklisted; function blackList(address _user) public onlyOwner { require(!isBlacklisted[_user], "user already blacklisted"); isBlacklisted[_user] = true; // emit events as well } function removeFromBlacklist(address _user) public onlyOwner { require(isBlacklisted[_user], "user already whitelisted"); isBlacklisted[_user] = false; // emit events as well } } contract Whitelist is BlackLkisted { mapping(address => bool) whitelist; event AddedToWhitelist(address indexed account); event RemovedFromWhitelist(address indexed account); modifier onlyWhitelisted() { require(isWhitelisted(msg.sender)); _; } function addToWhiteList(address _address) public onlyOwner { whitelist[_address] = true; emit AddedToWhitelist(_address); } function removeToWhiteList(address _address) public onlyOwner { whitelist[_address] = false; emit RemovedFromWhitelist(_address); } function isWhitelisted(address _address) public view returns(bool) { return whitelist[_address]; } } contract NostalgicApes is ERC721Enumerable, Whitelist { using SafeMath for uint256; uint256 public constant MAX_SUPPLY = 10000; string private _baseTokenURI = "ipfs://QmchYHgc4p5pw6jDk9pi9E8TQxv8PpZZq4DYBCkV5qkpFS/"; address payable public royaltyAddress; bool public hasSaleStarted = false; uint256 public minitingFees; uint256 public maxApesMint; uint256 public royalties; bool public revealed = false; constructor() ERC721("Nostalgic Apes", "NA") { royaltyAddress = payable(0x2922df85Ee4fc179986196af3dc5d4708A39ec4e); royalties=10; maxApesMint=100; } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } // Start Sale, we can start minting! function startSale() public onlyOwner { hasSaleStarted = true; } // Pause Sale function pauseSale() public onlyOwner { hasSaleStarted = false; } // Function for set the royalties function setRoyalties(uint256 _newfees) public onlyOwner{ royalties=_newfees; } // Function for set the Minting Fees function setMintFees(uint256 _minitingFees)public onlyOwner{ minitingFees=_minitingFees; } // Function for set the royalty Address function setRoyaltyAddress(address payable _newAddress)public onlyOwner{ royaltyAddress=_newAddress; } // Function for set the Max Minitng Apes function setMaxMintingApes(uint256 _numberOfAPes) public onlyOwner{ maxApesMint=_numberOfAPes; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function getBaseURI() public view returns (string memory) { return _baseTokenURI; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { string memory json=".json"; uint256 totalSupply = totalSupply(); require(_tokenId <= totalSupply, "That token hasn't been minted yet"); return string(abi.encodePacked(_baseTokenURI, Strings.toString(_tokenId),json)); } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } /* *@dev mint Fucntion is to mint the NFTS @dev _count is the number of NFTS you want to Mint */ function mint(uint256 _count) public payable { require(!isBlacklisted[msg.sender], "caller is backlisted"); uint256 totalSupply = totalSupply(); require(totalSupply <= MAX_SUPPLY, "Sold out"); require(hasSaleStarted == true, "Sale hasn't started"); require(totalSupply + _count <= MAX_SUPPLY, "Not enough tokens left"); require(_count <= maxApesMint, "Mint maxApesMint or fewer, please."); require(msg.value >= _count.mul(minitingFees), "The value submitted with this transaction is too low."); payable(owner()).transfer(msg.value); for (uint256 i=1; i <=_count; i++) { _safeMint(msg.sender, totalSupply + i); } } /* *@dev mintOwner Fucntion is to mint the NFTS for owner @dev _count is the number of NFTS you want to Mint */ function mintOwner(uint256 _count) public onlyOwner { uint256 totalSupply = totalSupply(); require(totalSupply < MAX_SUPPLY, "Sold out"); require(totalSupply + _count <= MAX_SUPPLY, "Not enough tokens left"); require(_count <= maxApesMint, "Mint maxApesMint or fewer, please."); for (uint256 i; i < _count; i++) { _safeMint(msg.sender, totalSupply + i); } } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AddedToWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RemovedFromWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"blackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxApesMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minitingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royalties","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfAPes","type":"uint256"}],"name":"setMaxMintingApes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minitingFees","type":"uint256"}],"name":"setMintFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newfees","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e0604052603660808181529062002bb160a03980516200002991600d916020909101906200015e565b50600e805460ff60a01b191690556012805460ff191690553480156200004e57600080fd5b50604080518082018252600e81526d4e6f7374616c676963204170657360901b6020808301918252835180850190945260028452614e4160f01b9084015281519192916200009f916000916200015e565b508051620000b59060019060208401906200015e565b505050620000d2620000cc6200010860201b60201c565b6200010c565b600e80546001600160a01b031916732922df85ee4fc179986196af3dc5d4708a39ec4e179055600a601155606460105562000241565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200016c9062000204565b90600052602060002090601f016020900481019282620001905760008555620001db565b82601f10620001ab57805160ff1916838001178555620001db565b82800160010185558215620001db579182015b82811115620001db578251825591602001919060010190620001be565b50620001e9929150620001ed565b5090565b5b80821115620001e95760008155600101620001ee565b600181811c908216806200021957607f821691505b602082108114156200023b57634e487b7160e01b600052602260045260246000fd5b50919050565b61296080620002516000396000f3fe60806040526004361061025c5760003560e01c80635183022711610144578063a0712d68116100b6578063c87b56dd1161007a578063c87b56dd146106ed578063e25ee66b1461070d578063e985e9c51461072d578063f053dc5c14610776578063f2fde38b1461078c578063f9366a04146107ac57600080fd5b8063a0712d6814610665578063a22cb46514610678578063ad2f852a14610698578063b66a0e5d146106b8578063b88d4fde146106cd57600080fd5b80636352211e116101085780636352211e146105c857806370a08231146105e8578063714c539814610608578063715018a61461061d5780638da5cb5b1461063257806395d89b411461065057600080fd5b80635183022714610543578063537df3b61461055d57806354a7b7fe1461057d57806355367ba91461059357806355f804b3146105a857600080fd5b80632b80183f116101dd5780633ccfd60b116101a15780633ccfd60b1461048157806342842e0e14610496578063438b6300146104b657806347ee0394146104e35780634838d165146105035780634f6ccce71461052357600080fd5b80632b80183f146103d25780632f745c59146103f257806332cb6b0c1461041257806333f88d22146104285780633af32abf1461044857600080fd5b8063095ea7b311610224578063095ea7b31461033257806318160ddd146103525780631c8b232d1461037157806323b872dd14610392578063289c33dc146103b257600080fd5b806301ffc9a71461026157806306b6f7e91461029657806306d254da146102b857806306fdde03146102d8578063081812fc146102fa575b600080fd5b34801561026d57600080fd5b5061028161027c36600461228a565b6107c2565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102b66102b13660046122a7565b6107ed565b005b3480156102c457600080fd5b506102b66102d33660046122d5565b610825565b3480156102e457600080fd5b506102ed610871565b60405161028d919061234a565b34801561030657600080fd5b5061031a6103153660046122a7565b610903565b6040516001600160a01b03909116815260200161028d565b34801561033e57600080fd5b506102b661034d36600461235d565b610998565b34801561035e57600080fd5b506008545b60405190815260200161028d565b34801561037d57600080fd5b50600e5461028190600160a01b900460ff1681565b34801561039e57600080fd5b506102b66103ad366004612389565b610aae565b3480156103be57600080fd5b506102b66103cd3660046122d5565b610adf565b3480156103de57600080fd5b506102b66103ed3660046122a7565b610b52565b3480156103fe57600080fd5b5061036361040d36600461235d565b610b81565b34801561041e57600080fd5b5061036361271081565b34801561043457600080fd5b506102b66104433660046122a7565b610c17565b34801561045457600080fd5b506102816104633660046122d5565b6001600160a01b03166000908152600c602052604090205460ff1690565b34801561048d57600080fd5b506102b6610d30565b3480156104a257600080fd5b506102b66104b1366004612389565b610d8d565b3480156104c257600080fd5b506104d66104d13660046122d5565b610da8565b60405161028d91906123ca565b3480156104ef57600080fd5b506102b66104fe3660046122d5565b610e4a565b34801561050f57600080fd5b506102b661051e3660046122d5565b610ec0565b34801561052f57600080fd5b5061036361053e3660046122a7565b610f77565b34801561054f57600080fd5b506012546102819060ff1681565b34801561056957600080fd5b506102b66105783660046122d5565b61100a565b34801561058957600080fd5b50610363600f5481565b34801561059f57600080fd5b506102b66110bd565b3480156105b457600080fd5b506102b66105c336600461249a565b6110f6565b3480156105d457600080fd5b5061031a6105e33660046122a7565b611133565b3480156105f457600080fd5b506103636106033660046122d5565b6111aa565b34801561061457600080fd5b506102ed611231565b34801561062957600080fd5b506102b6611240565b34801561063e57600080fd5b50600a546001600160a01b031661031a565b34801561065c57600080fd5b506102ed611276565b6102b66106733660046122a7565b611285565b34801561068457600080fd5b506102b66106933660046124e3565b6114cf565b3480156106a457600080fd5b50600e5461031a906001600160a01b031681565b3480156106c457600080fd5b506102b6611594565b3480156106d957600080fd5b506102b66106e8366004612521565b6115d3565b3480156106f957600080fd5b506102ed6107083660046122a7565b61160b565b34801561071957600080fd5b506102b66107283660046122a7565b6116c7565b34801561073957600080fd5b506102816107483660046125a1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561078257600080fd5b5061036360115481565b34801561079857600080fd5b506102b66107a73660046122d5565b6116f6565b3480156107b857600080fd5b5061036360105481565b60006001600160e01b0319821663780e9d6360e01b14806107e757506107e782611791565b92915050565b600a546001600160a01b031633146108205760405162461bcd60e51b8152600401610817906125cf565b60405180910390fd5b600f55565b600a546001600160a01b0316331461084f5760405162461bcd60e51b8152600401610817906125cf565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60606000805461088090612604565b80601f01602080910402602001604051908101604052809291908181526020018280546108ac90612604565b80156108f95780601f106108ce576101008083540402835291602001916108f9565b820191906000526020600020905b8154815290600101906020018083116108dc57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661097c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610817565b506000908152600460205260409020546001600160a01b031690565b60006109a382611133565b9050806001600160a01b0316836001600160a01b03161415610a115760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610817565b336001600160a01b0382161480610a2d5750610a2d8133610748565b610a9f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610817565b610aa983836117e1565b505050565b610ab8338261184f565b610ad45760405162461bcd60e51b81526004016108179061263f565b610aa9838383611946565b600a546001600160a01b03163314610b095760405162461bcd60e51b8152600401610817906125cf565b6001600160a01b0381166000818152600c6020526040808220805460ff19169055517fcdd2e9b91a56913d370075169cefa1602ba36be5301664f752192bb1709df7579190a250565b600a546001600160a01b03163314610b7c5760405162461bcd60e51b8152600401610817906125cf565b601155565b6000610b8c836111aa565b8210610bee5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610817565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610c415760405162461bcd60e51b8152600401610817906125cf565b6000610c4c60085490565b90506127108110610c8a5760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610817565b612710610c9783836126a6565b1115610cde5760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b6044820152606401610817565b601054821115610d005760405162461bcd60e51b8152600401610817906126be565b60005b82811015610aa957610d1e33610d1983856126a6565b611af1565b80610d2881612700565b915050610d03565b600a546001600160a01b03163314610d5a5760405162461bcd60e51b8152600401610817906125cf565b6040514790339082156108fc029083906000818181858888f19350505050158015610d89573d6000803e3d6000fd5b5050565b610aa9838383604051806020016040528060008152506115d3565b60606000610db5836111aa565b905060008167ffffffffffffffff811115610dd257610dd261240e565b604051908082528060200260200182016040528015610dfb578160200160208202803683370190505b50905060005b82811015610e4257610e138582610b81565b828281518110610e2557610e2561271b565b602090810291909101015280610e3a81612700565b915050610e01565b509392505050565b600a546001600160a01b03163314610e745760405162461bcd60e51b8152600401610817906125cf565b6001600160a01b0381166000818152600c6020526040808220805460ff19166001179055517fa850ae9193f515cbae8d35e8925bd2be26627fc91bce650b8652ed254e9cab039190a250565b600a546001600160a01b03163314610eea5760405162461bcd60e51b8152600401610817906125cf565b6001600160a01b0381166000908152600b602052604090205460ff1615610f535760405162461bcd60e51b815260206004820152601860248201527f7573657220616c726561647920626c61636b6c697374656400000000000000006044820152606401610817565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6000610f8260085490565b8210610fe55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610817565b60088281548110610ff857610ff861271b565b90600052602060002001549050919050565b600a546001600160a01b031633146110345760405162461bcd60e51b8152600401610817906125cf565b6001600160a01b0381166000908152600b602052604090205460ff1661109c5760405162461bcd60e51b815260206004820152601860248201527f7573657220616c72656164792077686974656c697374656400000000000000006044820152606401610817565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b600a546001600160a01b031633146110e75760405162461bcd60e51b8152600401610817906125cf565b600e805460ff60a01b19169055565b600a546001600160a01b031633146111205760405162461bcd60e51b8152600401610817906125cf565b8051610d8990600d9060208401906121db565b6000818152600260205260408120546001600160a01b0316806107e75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610817565b60006001600160a01b0382166112155760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610817565b506001600160a01b031660009081526003602052604090205490565b6060600d805461088090612604565b600a546001600160a01b0316331461126a5760405162461bcd60e51b8152600401610817906125cf565b6112746000611b0b565b565b60606001805461088090612604565b336000908152600b602052604090205460ff16156112dc5760405162461bcd60e51b815260206004820152601460248201527318d85b1b195c881a5cc8189858dadb1a5cdd195960621b6044820152606401610817565b60006112e760085490565b90506127108111156113265760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610817565b600e54600160a01b900460ff16151560011461137a5760405162461bcd60e51b815260206004820152601360248201527214d85b19481a185cdb89dd081cdd185c9d1959606a1b6044820152606401610817565b61271061138783836126a6565b11156113ce5760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b6044820152606401610817565b6010548211156113f05760405162461bcd60e51b8152600401610817906126be565b600f546113fe908390611b5d565b34101561146b5760405162461bcd60e51b815260206004820152603560248201527f5468652076616c7565207375626d69747465642077697468207468697320747260448201527430b739b0b1ba34b7b71034b9903a37b7903637bb9760591b6064820152608401610817565b600a546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156114a4573d6000803e3d6000fd5b5060015b828111610aa9576114bd33610d1983856126a6565b806114c781612700565b9150506114a8565b6001600160a01b0382163314156115285760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610817565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146115be5760405162461bcd60e51b8152600401610817906125cf565b600e805460ff60a01b1916600160a01b179055565b6115dd338361184f565b6115f95760405162461bcd60e51b81526004016108179061263f565b61160584848484611be3565b50505050565b604080518082019091526005815264173539b7b760d91b6020820152606090600061163560085490565b9050808411156116915760405162461bcd60e51b815260206004820152602160248201527f5468617420746f6b656e206861736e2774206265656e206d696e7465642079656044820152601d60fa1b6064820152608401610817565b600d61169c85611c16565b836040516020016116af9392919061274d565b60405160208183030381529060405292505050919050565b600a546001600160a01b031633146116f15760405162461bcd60e51b8152600401610817906125cf565b601055565b600a546001600160a01b031633146117205760405162461bcd60e51b8152600401610817906125cf565b6001600160a01b0381166117855760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610817565b61178e81611b0b565b50565b60006001600160e01b031982166380ac58cd60e01b14806117c257506001600160e01b03198216635b5e139f60e01b145b806107e757506301ffc9a760e01b6001600160e01b03198316146107e7565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061181682611133565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166118c85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610817565b60006118d383611133565b9050806001600160a01b0316846001600160a01b0316148061190e5750836001600160a01b031661190384610903565b6001600160a01b0316145b8061193e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661195982611133565b6001600160a01b0316146119c15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610817565b6001600160a01b038216611a235760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610817565b611a2e838383611d14565b611a396000826117e1565b6001600160a01b0383166000908152600360205260408120805460019290611a629084906127fe565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a909084906126a6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610d89828260405180602001604052806000815250611dcc565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611b6c575060006107e7565b6000611b788385612815565b905082611b85858361284a565b14611bdc5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610817565b9392505050565b611bee848484611946565b611bfa84848484611dff565b6116055760405162461bcd60e51b81526004016108179061285e565b606081611c3a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c645780611c4e81612700565b9150611c5d9050600a8361284a565b9150611c3e565b60008167ffffffffffffffff811115611c7f57611c7f61240e565b6040519080825280601f01601f191660200182016040528015611ca9576020820181803683370190505b5090505b841561193e57611cbe6001836127fe565b9150611ccb600a866128b0565b611cd69060306126a6565b60f81b818381518110611ceb57611ceb61271b565b60200101906001600160f81b031916908160001a905350611d0d600a8661284a565b9450611cad565b6001600160a01b038316611d6f57611d6a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611d92565b816001600160a01b0316836001600160a01b031614611d9257611d928382611efd565b6001600160a01b038216611da957610aa981611f9a565b826001600160a01b0316826001600160a01b031614610aa957610aa98282612049565b611dd6838361208d565b611de36000848484611dff565b610aa95760405162461bcd60e51b81526004016108179061285e565b60006001600160a01b0384163b15611ef257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e439033908990889088906004016128c4565b6020604051808303816000875af1925050508015611e7e575060408051601f3d908101601f19168201909252611e7b918101906128f7565b60015b611ed8573d808015611eac576040519150601f19603f3d011682016040523d82523d6000602084013e611eb1565b606091505b508051611ed05760405162461bcd60e51b81526004016108179061285e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061193e565b506001949350505050565b60006001611f0a846111aa565b611f1491906127fe565b600083815260076020526040902054909150808214611f67576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611fac906001906127fe565b60008381526009602052604081205460088054939450909284908110611fd457611fd461271b565b906000526020600020015490508060088381548110611ff557611ff561271b565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061202d5761202d612914565b6001900381819060005260206000200160009055905550505050565b6000612054836111aa565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166120e35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610817565b6000818152600260205260409020546001600160a01b0316156121485760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610817565b61215460008383611d14565b6001600160a01b038216600090815260036020526040812080546001929061217d9084906126a6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546121e790612604565b90600052602060002090601f016020900481019282612209576000855561224f565b82601f1061222257805160ff191683800117855561224f565b8280016001018555821561224f579182015b8281111561224f578251825591602001919060010190612234565b5061225b92915061225f565b5090565b5b8082111561225b5760008155600101612260565b6001600160e01b03198116811461178e57600080fd5b60006020828403121561229c57600080fd5b8135611bdc81612274565b6000602082840312156122b957600080fd5b5035919050565b6001600160a01b038116811461178e57600080fd5b6000602082840312156122e757600080fd5b8135611bdc816122c0565b60005b8381101561230d5781810151838201526020016122f5565b838111156116055750506000910152565b600081518084526123368160208601602086016122f2565b601f01601f19169290920160200192915050565b602081526000611bdc602083018461231e565b6000806040838503121561237057600080fd5b823561237b816122c0565b946020939093013593505050565b60008060006060848603121561239e57600080fd5b83356123a9816122c0565b925060208401356123b9816122c0565b929592945050506040919091013590565b6020808252825182820181905260009190848201906040850190845b81811015612402578351835292840192918401916001016123e6565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561243f5761243f61240e565b604051601f8501601f19908116603f011681019082821181831017156124675761246761240e565b8160405280935085815286868601111561248057600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156124ac57600080fd5b813567ffffffffffffffff8111156124c357600080fd5b8201601f810184136124d457600080fd5b61193e84823560208401612424565b600080604083850312156124f657600080fd5b8235612501816122c0565b91506020830135801515811461251657600080fd5b809150509250929050565b6000806000806080858703121561253757600080fd5b8435612542816122c0565b93506020850135612552816122c0565b925060408501359150606085013567ffffffffffffffff81111561257557600080fd5b8501601f8101871361258657600080fd5b61259587823560208401612424565b91505092959194509250565b600080604083850312156125b457600080fd5b82356125bf816122c0565b91506020830135612516816122c0565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061261857607f821691505b6020821081141561263957634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156126b9576126b9612690565b500190565b60208082526022908201527f4d696e74206d6178417065734d696e74206f722066657765722c20706c656173604082015261329760f11b606082015260800190565b600060001982141561271457612714612690565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600081516127438185602086016122f2565b9290920192915050565b600080855481600182811c91508083168061276957607f831692505b602080841082141561278957634e487b7160e01b86526022600452602486fd5b81801561279d57600181146127ae576127db565b60ff198616895284890196506127db565b60008c81526020902060005b868110156127d35781548b8201529085019083016127ba565b505084890196505b5050505050506127f46127ee8287612731565b85612731565b9695505050505050565b60008282101561281057612810612690565b500390565b600081600019048311821515161561282f5761282f612690565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261285957612859612834565b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000826128bf576128bf612834565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127f49083018461231e565b60006020828403121561290957600080fd5b8151611bdc81612274565b634e487b7160e01b600052603160045260246000fdfea26469706673582212206d47c9a077540d9913bc9db75c057d4c73a02996a3ea5d8b265a8fabe56b81ac64736f6c634300080b0033697066733a2f2f516d6368594867633470357077366a446b397069394538545178763850705a5a7134445942436b5635716b7046532f
Deployed Bytecode
0x60806040526004361061025c5760003560e01c80635183022711610144578063a0712d68116100b6578063c87b56dd1161007a578063c87b56dd146106ed578063e25ee66b1461070d578063e985e9c51461072d578063f053dc5c14610776578063f2fde38b1461078c578063f9366a04146107ac57600080fd5b8063a0712d6814610665578063a22cb46514610678578063ad2f852a14610698578063b66a0e5d146106b8578063b88d4fde146106cd57600080fd5b80636352211e116101085780636352211e146105c857806370a08231146105e8578063714c539814610608578063715018a61461061d5780638da5cb5b1461063257806395d89b411461065057600080fd5b80635183022714610543578063537df3b61461055d57806354a7b7fe1461057d57806355367ba91461059357806355f804b3146105a857600080fd5b80632b80183f116101dd5780633ccfd60b116101a15780633ccfd60b1461048157806342842e0e14610496578063438b6300146104b657806347ee0394146104e35780634838d165146105035780634f6ccce71461052357600080fd5b80632b80183f146103d25780632f745c59146103f257806332cb6b0c1461041257806333f88d22146104285780633af32abf1461044857600080fd5b8063095ea7b311610224578063095ea7b31461033257806318160ddd146103525780631c8b232d1461037157806323b872dd14610392578063289c33dc146103b257600080fd5b806301ffc9a71461026157806306b6f7e91461029657806306d254da146102b857806306fdde03146102d8578063081812fc146102fa575b600080fd5b34801561026d57600080fd5b5061028161027c36600461228a565b6107c2565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102b66102b13660046122a7565b6107ed565b005b3480156102c457600080fd5b506102b66102d33660046122d5565b610825565b3480156102e457600080fd5b506102ed610871565b60405161028d919061234a565b34801561030657600080fd5b5061031a6103153660046122a7565b610903565b6040516001600160a01b03909116815260200161028d565b34801561033e57600080fd5b506102b661034d36600461235d565b610998565b34801561035e57600080fd5b506008545b60405190815260200161028d565b34801561037d57600080fd5b50600e5461028190600160a01b900460ff1681565b34801561039e57600080fd5b506102b66103ad366004612389565b610aae565b3480156103be57600080fd5b506102b66103cd3660046122d5565b610adf565b3480156103de57600080fd5b506102b66103ed3660046122a7565b610b52565b3480156103fe57600080fd5b5061036361040d36600461235d565b610b81565b34801561041e57600080fd5b5061036361271081565b34801561043457600080fd5b506102b66104433660046122a7565b610c17565b34801561045457600080fd5b506102816104633660046122d5565b6001600160a01b03166000908152600c602052604090205460ff1690565b34801561048d57600080fd5b506102b6610d30565b3480156104a257600080fd5b506102b66104b1366004612389565b610d8d565b3480156104c257600080fd5b506104d66104d13660046122d5565b610da8565b60405161028d91906123ca565b3480156104ef57600080fd5b506102b66104fe3660046122d5565b610e4a565b34801561050f57600080fd5b506102b661051e3660046122d5565b610ec0565b34801561052f57600080fd5b5061036361053e3660046122a7565b610f77565b34801561054f57600080fd5b506012546102819060ff1681565b34801561056957600080fd5b506102b66105783660046122d5565b61100a565b34801561058957600080fd5b50610363600f5481565b34801561059f57600080fd5b506102b66110bd565b3480156105b457600080fd5b506102b66105c336600461249a565b6110f6565b3480156105d457600080fd5b5061031a6105e33660046122a7565b611133565b3480156105f457600080fd5b506103636106033660046122d5565b6111aa565b34801561061457600080fd5b506102ed611231565b34801561062957600080fd5b506102b6611240565b34801561063e57600080fd5b50600a546001600160a01b031661031a565b34801561065c57600080fd5b506102ed611276565b6102b66106733660046122a7565b611285565b34801561068457600080fd5b506102b66106933660046124e3565b6114cf565b3480156106a457600080fd5b50600e5461031a906001600160a01b031681565b3480156106c457600080fd5b506102b6611594565b3480156106d957600080fd5b506102b66106e8366004612521565b6115d3565b3480156106f957600080fd5b506102ed6107083660046122a7565b61160b565b34801561071957600080fd5b506102b66107283660046122a7565b6116c7565b34801561073957600080fd5b506102816107483660046125a1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561078257600080fd5b5061036360115481565b34801561079857600080fd5b506102b66107a73660046122d5565b6116f6565b3480156107b857600080fd5b5061036360105481565b60006001600160e01b0319821663780e9d6360e01b14806107e757506107e782611791565b92915050565b600a546001600160a01b031633146108205760405162461bcd60e51b8152600401610817906125cf565b60405180910390fd5b600f55565b600a546001600160a01b0316331461084f5760405162461bcd60e51b8152600401610817906125cf565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60606000805461088090612604565b80601f01602080910402602001604051908101604052809291908181526020018280546108ac90612604565b80156108f95780601f106108ce576101008083540402835291602001916108f9565b820191906000526020600020905b8154815290600101906020018083116108dc57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661097c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610817565b506000908152600460205260409020546001600160a01b031690565b60006109a382611133565b9050806001600160a01b0316836001600160a01b03161415610a115760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610817565b336001600160a01b0382161480610a2d5750610a2d8133610748565b610a9f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610817565b610aa983836117e1565b505050565b610ab8338261184f565b610ad45760405162461bcd60e51b81526004016108179061263f565b610aa9838383611946565b600a546001600160a01b03163314610b095760405162461bcd60e51b8152600401610817906125cf565b6001600160a01b0381166000818152600c6020526040808220805460ff19169055517fcdd2e9b91a56913d370075169cefa1602ba36be5301664f752192bb1709df7579190a250565b600a546001600160a01b03163314610b7c5760405162461bcd60e51b8152600401610817906125cf565b601155565b6000610b8c836111aa565b8210610bee5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610817565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610c415760405162461bcd60e51b8152600401610817906125cf565b6000610c4c60085490565b90506127108110610c8a5760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610817565b612710610c9783836126a6565b1115610cde5760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b6044820152606401610817565b601054821115610d005760405162461bcd60e51b8152600401610817906126be565b60005b82811015610aa957610d1e33610d1983856126a6565b611af1565b80610d2881612700565b915050610d03565b600a546001600160a01b03163314610d5a5760405162461bcd60e51b8152600401610817906125cf565b6040514790339082156108fc029083906000818181858888f19350505050158015610d89573d6000803e3d6000fd5b5050565b610aa9838383604051806020016040528060008152506115d3565b60606000610db5836111aa565b905060008167ffffffffffffffff811115610dd257610dd261240e565b604051908082528060200260200182016040528015610dfb578160200160208202803683370190505b50905060005b82811015610e4257610e138582610b81565b828281518110610e2557610e2561271b565b602090810291909101015280610e3a81612700565b915050610e01565b509392505050565b600a546001600160a01b03163314610e745760405162461bcd60e51b8152600401610817906125cf565b6001600160a01b0381166000818152600c6020526040808220805460ff19166001179055517fa850ae9193f515cbae8d35e8925bd2be26627fc91bce650b8652ed254e9cab039190a250565b600a546001600160a01b03163314610eea5760405162461bcd60e51b8152600401610817906125cf565b6001600160a01b0381166000908152600b602052604090205460ff1615610f535760405162461bcd60e51b815260206004820152601860248201527f7573657220616c726561647920626c61636b6c697374656400000000000000006044820152606401610817565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6000610f8260085490565b8210610fe55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610817565b60088281548110610ff857610ff861271b565b90600052602060002001549050919050565b600a546001600160a01b031633146110345760405162461bcd60e51b8152600401610817906125cf565b6001600160a01b0381166000908152600b602052604090205460ff1661109c5760405162461bcd60e51b815260206004820152601860248201527f7573657220616c72656164792077686974656c697374656400000000000000006044820152606401610817565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b600a546001600160a01b031633146110e75760405162461bcd60e51b8152600401610817906125cf565b600e805460ff60a01b19169055565b600a546001600160a01b031633146111205760405162461bcd60e51b8152600401610817906125cf565b8051610d8990600d9060208401906121db565b6000818152600260205260408120546001600160a01b0316806107e75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610817565b60006001600160a01b0382166112155760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610817565b506001600160a01b031660009081526003602052604090205490565b6060600d805461088090612604565b600a546001600160a01b0316331461126a5760405162461bcd60e51b8152600401610817906125cf565b6112746000611b0b565b565b60606001805461088090612604565b336000908152600b602052604090205460ff16156112dc5760405162461bcd60e51b815260206004820152601460248201527318d85b1b195c881a5cc8189858dadb1a5cdd195960621b6044820152606401610817565b60006112e760085490565b90506127108111156113265760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610817565b600e54600160a01b900460ff16151560011461137a5760405162461bcd60e51b815260206004820152601360248201527214d85b19481a185cdb89dd081cdd185c9d1959606a1b6044820152606401610817565b61271061138783836126a6565b11156113ce5760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b6044820152606401610817565b6010548211156113f05760405162461bcd60e51b8152600401610817906126be565b600f546113fe908390611b5d565b34101561146b5760405162461bcd60e51b815260206004820152603560248201527f5468652076616c7565207375626d69747465642077697468207468697320747260448201527430b739b0b1ba34b7b71034b9903a37b7903637bb9760591b6064820152608401610817565b600a546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156114a4573d6000803e3d6000fd5b5060015b828111610aa9576114bd33610d1983856126a6565b806114c781612700565b9150506114a8565b6001600160a01b0382163314156115285760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610817565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146115be5760405162461bcd60e51b8152600401610817906125cf565b600e805460ff60a01b1916600160a01b179055565b6115dd338361184f565b6115f95760405162461bcd60e51b81526004016108179061263f565b61160584848484611be3565b50505050565b604080518082019091526005815264173539b7b760d91b6020820152606090600061163560085490565b9050808411156116915760405162461bcd60e51b815260206004820152602160248201527f5468617420746f6b656e206861736e2774206265656e206d696e7465642079656044820152601d60fa1b6064820152608401610817565b600d61169c85611c16565b836040516020016116af9392919061274d565b60405160208183030381529060405292505050919050565b600a546001600160a01b031633146116f15760405162461bcd60e51b8152600401610817906125cf565b601055565b600a546001600160a01b031633146117205760405162461bcd60e51b8152600401610817906125cf565b6001600160a01b0381166117855760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610817565b61178e81611b0b565b50565b60006001600160e01b031982166380ac58cd60e01b14806117c257506001600160e01b03198216635b5e139f60e01b145b806107e757506301ffc9a760e01b6001600160e01b03198316146107e7565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061181682611133565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166118c85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610817565b60006118d383611133565b9050806001600160a01b0316846001600160a01b0316148061190e5750836001600160a01b031661190384610903565b6001600160a01b0316145b8061193e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661195982611133565b6001600160a01b0316146119c15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610817565b6001600160a01b038216611a235760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610817565b611a2e838383611d14565b611a396000826117e1565b6001600160a01b0383166000908152600360205260408120805460019290611a629084906127fe565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a909084906126a6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610d89828260405180602001604052806000815250611dcc565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611b6c575060006107e7565b6000611b788385612815565b905082611b85858361284a565b14611bdc5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610817565b9392505050565b611bee848484611946565b611bfa84848484611dff565b6116055760405162461bcd60e51b81526004016108179061285e565b606081611c3a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c645780611c4e81612700565b9150611c5d9050600a8361284a565b9150611c3e565b60008167ffffffffffffffff811115611c7f57611c7f61240e565b6040519080825280601f01601f191660200182016040528015611ca9576020820181803683370190505b5090505b841561193e57611cbe6001836127fe565b9150611ccb600a866128b0565b611cd69060306126a6565b60f81b818381518110611ceb57611ceb61271b565b60200101906001600160f81b031916908160001a905350611d0d600a8661284a565b9450611cad565b6001600160a01b038316611d6f57611d6a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611d92565b816001600160a01b0316836001600160a01b031614611d9257611d928382611efd565b6001600160a01b038216611da957610aa981611f9a565b826001600160a01b0316826001600160a01b031614610aa957610aa98282612049565b611dd6838361208d565b611de36000848484611dff565b610aa95760405162461bcd60e51b81526004016108179061285e565b60006001600160a01b0384163b15611ef257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e439033908990889088906004016128c4565b6020604051808303816000875af1925050508015611e7e575060408051601f3d908101601f19168201909252611e7b918101906128f7565b60015b611ed8573d808015611eac576040519150601f19603f3d011682016040523d82523d6000602084013e611eb1565b606091505b508051611ed05760405162461bcd60e51b81526004016108179061285e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061193e565b506001949350505050565b60006001611f0a846111aa565b611f1491906127fe565b600083815260076020526040902054909150808214611f67576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611fac906001906127fe565b60008381526009602052604081205460088054939450909284908110611fd457611fd461271b565b906000526020600020015490508060088381548110611ff557611ff561271b565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061202d5761202d612914565b6001900381819060005260206000200160009055905550505050565b6000612054836111aa565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166120e35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610817565b6000818152600260205260409020546001600160a01b0316156121485760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610817565b61215460008383611d14565b6001600160a01b038216600090815260036020526040812080546001929061217d9084906126a6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546121e790612604565b90600052602060002090601f016020900481019282612209576000855561224f565b82601f1061222257805160ff191683800117855561224f565b8280016001018555821561224f579182015b8281111561224f578251825591602001919060010190612234565b5061225b92915061225f565b5090565b5b8082111561225b5760008155600101612260565b6001600160e01b03198116811461178e57600080fd5b60006020828403121561229c57600080fd5b8135611bdc81612274565b6000602082840312156122b957600080fd5b5035919050565b6001600160a01b038116811461178e57600080fd5b6000602082840312156122e757600080fd5b8135611bdc816122c0565b60005b8381101561230d5781810151838201526020016122f5565b838111156116055750506000910152565b600081518084526123368160208601602086016122f2565b601f01601f19169290920160200192915050565b602081526000611bdc602083018461231e565b6000806040838503121561237057600080fd5b823561237b816122c0565b946020939093013593505050565b60008060006060848603121561239e57600080fd5b83356123a9816122c0565b925060208401356123b9816122c0565b929592945050506040919091013590565b6020808252825182820181905260009190848201906040850190845b81811015612402578351835292840192918401916001016123e6565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561243f5761243f61240e565b604051601f8501601f19908116603f011681019082821181831017156124675761246761240e565b8160405280935085815286868601111561248057600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156124ac57600080fd5b813567ffffffffffffffff8111156124c357600080fd5b8201601f810184136124d457600080fd5b61193e84823560208401612424565b600080604083850312156124f657600080fd5b8235612501816122c0565b91506020830135801515811461251657600080fd5b809150509250929050565b6000806000806080858703121561253757600080fd5b8435612542816122c0565b93506020850135612552816122c0565b925060408501359150606085013567ffffffffffffffff81111561257557600080fd5b8501601f8101871361258657600080fd5b61259587823560208401612424565b91505092959194509250565b600080604083850312156125b457600080fd5b82356125bf816122c0565b91506020830135612516816122c0565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061261857607f821691505b6020821081141561263957634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156126b9576126b9612690565b500190565b60208082526022908201527f4d696e74206d6178417065734d696e74206f722066657765722c20706c656173604082015261329760f11b606082015260800190565b600060001982141561271457612714612690565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600081516127438185602086016122f2565b9290920192915050565b600080855481600182811c91508083168061276957607f831692505b602080841082141561278957634e487b7160e01b86526022600452602486fd5b81801561279d57600181146127ae576127db565b60ff198616895284890196506127db565b60008c81526020902060005b868110156127d35781548b8201529085019083016127ba565b505084890196505b5050505050506127f46127ee8287612731565b85612731565b9695505050505050565b60008282101561281057612810612690565b500390565b600081600019048311821515161561282f5761282f612690565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261285957612859612834565b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000826128bf576128bf612834565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127f49083018461231e565b60006020828403121561290957600080fd5b8151611bdc81612274565b634e487b7160e01b600052603160045260246000fdfea26469706673582212206d47c9a077540d9913bc9db75c057d4c73a02996a3ea5d8b265a8fabe56b81ac64736f6c634300080b0033
Deployed Bytecode Sourcemap
47255:4223:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39862:224;;;;;;;;;;-1:-1:-1;39862:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;39862:224:0;;;;;;;;48443:104;;;;;;;;;;-1:-1:-1;48443:104:0;;;;;:::i;:::-;;:::i;:::-;;48600:116;;;;;;;;;;-1:-1:-1;48600:116:0;;;;;:::i;:::-;;:::i;26990:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28549:221::-;;;;;;;;;;-1:-1:-1;28549:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2126:32:1;;;2108:51;;2096:2;2081:18;28549:221:0;1962:203:1;28072:411:0;;;;;;;;;;-1:-1:-1;28072:411:0;;;;;:::i;:::-;;:::i;40502:113::-;;;;;;;;;;-1:-1:-1;40590:10:0;:17;40502:113;;;2644:25:1;;;2632:2;2617:18;40502:113:0;2498:177:1;47544:34:0;;;;;;;;;;-1:-1:-1;47544:34:0;;;;-1:-1:-1;;;47544:34:0;;;;;;29439:337;;;;;;;;;;-1:-1:-1;29439:337:0;;;;;:::i;:::-;;:::i;46974:154::-;;;;;;;;;;-1:-1:-1;46974:154:0;;;;;:::i;:::-;;:::i;48299:93::-;;;;;;;;;;-1:-1:-1;48299:93:0;;;;;:::i;:::-;;:::i;40170:256::-;;;;;;;;;;-1:-1:-1;40170:256:0;;;;;:::i;:::-;;:::i;47355:42::-;;;;;;;;;;;;47392:5;47355:42;;50887:440;;;;;;;;;;-1:-1:-1;50887:440:0;;;;;:::i;:::-;;:::i;47136:112::-;;;;;;;;;;-1:-1:-1;47136:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;47221:19:0;47197:4;47221:19;;;:9;:19;;;;;;;;;47136:112;51335:140;;;;;;;;;;;;;:::i;29847:185::-;;;;;;;;;;-1:-1:-1;29847:185:0;;;;;:::i;:::-;;:::i;49509:374::-;;;;;;;;;;-1:-1:-1;49509:374:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46820:146::-;;;;;;;;;;-1:-1:-1;46820:146:0;;;;;:::i;:::-;;:::i;46095:198::-;;;;;;;;;;-1:-1:-1;46095:198:0;;;;;:::i;:::-;;:::i;40692:233::-;;;;;;;;;;-1:-1:-1;40692:233:0;;;;;:::i;:::-;;:::i;47683:28::-;;;;;;;;;;-1:-1:-1;47683:28:0;;;;;;;;46305:208;;;;;;;;;;-1:-1:-1;46305:208:0;;;;;:::i;:::-;;:::i;47585:27::-;;;;;;;;;;;;;;;;48172:79;;;;;;;;;;;;;:::i;47910:102::-;;;;;;;;;;-1:-1:-1;47910:102:0;;;;;:::i;:::-;;:::i;26684:239::-;;;;;;;;;;-1:-1:-1;26684:239:0;;;;;:::i;:::-;;:::i;26414:208::-;;;;;;;;;;-1:-1:-1;26414:208:0;;;;;:::i;:::-;;:::i;49013:97::-;;;;;;;;;;;;;:::i;6606:94::-;;;;;;;;;;;;;:::i;5955:87::-;;;;;;;;;;-1:-1:-1;6028:6:0;;-1:-1:-1;;;;;6028:6:0;5955:87;;27159:104;;;;;;;;;;;;;:::i;50008:734::-;;;;;;:::i;:::-;;:::i;28842:295::-;;;;;;;;;;-1:-1:-1;28842:295:0;;;;;:::i;:::-;;:::i;47500:37::-;;;;;;;;;;-1:-1:-1;47500:37:0;;;;-1:-1:-1;;;;;47500:37:0;;;48067:78;;;;;;;;;;;;;:::i;30103:328::-;;;;;;;;;;-1:-1:-1;30103:328:0;;;;;:::i;:::-;;:::i;49122:379::-;;;;;;;;;;-1:-1:-1;49122:379:0;;;;;:::i;:::-;;:::i;48775:110::-;;;;;;;;;;-1:-1:-1;48775:110:0;;;;;:::i;:::-;;:::i;29208:164::-;;;;;;;;;;-1:-1:-1;29208:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29329:25:0;;;29305:4;29329:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29208:164;47652:24;;;;;;;;;;;;;;;;6855:192;;;;;;;;;;-1:-1:-1;6855:192:0;;;;;:::i;:::-;;:::i;47619:26::-;;;;;;;;;;;;;;;;39862:224;39964:4;-1:-1:-1;;;;;;39988:50:0;;-1:-1:-1;;;39988:50:0;;:90;;;40042:36;40066:11;40042:23;:36::i;:::-;39981:97;39862:224;-1:-1:-1;;39862:224:0:o;48443:104::-;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;;;;;;;;;48513:12:::1;:26:::0;48443:104::o;48600:116::-;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;48682:14:::1;:26:::0;;-1:-1:-1;;;;;;48682:26:0::1;-1:-1:-1::0;;;;;48682:26:0;;;::::1;::::0;;;::::1;::::0;;48600:116::o;26990:100::-;27044:13;27077:5;27070:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26990:100;:::o;28549:221::-;28625:7;32030:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32030:16:0;28645:73;;;;-1:-1:-1;;;28645:73:0;;8105:2:1;28645:73:0;;;8087:21:1;8144:2;8124:18;;;8117:30;8183:34;8163:18;;;8156:62;-1:-1:-1;;;8234:18:1;;;8227:42;8286:19;;28645:73:0;7903:408:1;28645:73:0;-1:-1:-1;28738:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28738:24:0;;28549:221::o;28072:411::-;28153:13;28169:23;28184:7;28169:14;:23::i;:::-;28153:39;;28217:5;-1:-1:-1;;;;;28211:11:0;:2;-1:-1:-1;;;;;28211:11:0;;;28203:57;;;;-1:-1:-1;;;28203:57:0;;8518:2:1;28203:57:0;;;8500:21:1;8557:2;8537:18;;;8530:30;8596:34;8576:18;;;8569:62;-1:-1:-1;;;8647:18:1;;;8640:31;8688:19;;28203:57:0;8316:397:1;28203:57:0;4911:10;-1:-1:-1;;;;;28295:21:0;;;;:62;;-1:-1:-1;28320:37:0;28337:5;4911:10;29208:164;:::i;28320:37::-;28273:168;;;;-1:-1:-1;;;28273:168:0;;8920:2:1;28273:168:0;;;8902:21:1;8959:2;8939:18;;;8932:30;8998:34;8978:18;;;8971:62;9069:26;9049:18;;;9042:54;9113:19;;28273:168:0;8718:420:1;28273:168:0;28454:21;28463:2;28467:7;28454:8;:21::i;:::-;28142:341;28072:411;;:::o;29439:337::-;29634:41;4911:10;29667:7;29634:18;:41::i;:::-;29626:103;;;;-1:-1:-1;;;29626:103:0;;;;;;;:::i;:::-;29740:28;29750:4;29756:2;29760:7;29740:9;:28::i;46974:154::-;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47047:19:0;::::1;47069:5;47047:19:::0;;;:9:::1;:19;::::0;;;;;:27;;-1:-1:-1;;47047:27:0::1;::::0;;47090:30;::::1;::::0;47069:5;47090:30:::1;46974:154:::0;:::o;48299:93::-;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;48366:9:::1;:18:::0;48299:93::o;40170:256::-;40267:7;40303:23;40320:5;40303:16;:23::i;:::-;40295:5;:31;40287:87;;;;-1:-1:-1;;;40287:87:0;;9763:2:1;40287:87:0;;;9745:21:1;9802:2;9782:18;;;9775:30;9841:34;9821:18;;;9814:62;-1:-1:-1;;;9892:18:1;;;9885:41;9943:19;;40287:87:0;9561:407:1;40287:87:0;-1:-1:-1;;;;;;40392:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40170:256::o;50887:440::-;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;50961:19:::1;50983:13;40590:10:::0;:17;;40502:113;50983:13:::1;50961:35;;47392:5;51015:11;:24;51007:45;;;::::0;-1:-1:-1;;;51007:45:0;;10175:2:1;51007:45:0::1;::::0;::::1;10157:21:1::0;10214:1;10194:18;;;10187:29;-1:-1:-1;;;10232:18:1;;;10225:38;10280:18;;51007:45:0::1;9973:331:1::0;51007:45:0::1;47392:5;51071:20;51085:6:::0;51071:11;:20:::1;:::i;:::-;:34;;51063:69;;;::::0;-1:-1:-1;;;51063:69:0;;10776:2:1;51063:69:0::1;::::0;::::1;10758:21:1::0;10815:2;10795:18;;;10788:30;-1:-1:-1;;;10834:18:1;;;10827:52;10896:18;;51063:69:0::1;10574:346:1::0;51063:69:0::1;51161:11;;51151:6;:21;;51143:68;;;;-1:-1:-1::0;;;51143:68:0::1;;;;;;;:::i;:::-;51227:9;51222:98;51242:6;51238:1;:10;51222:98;;;51270:38;51280:10;51292:15;51306:1:::0;51292:11;:15:::1;:::i;:::-;51270:9;:38::i;:::-;51250:3:::0;::::1;::::0;::::1;:::i;:::-;;;;51222:98;;51335:140:::0;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;51430:37:::1;::::0;51398:21:::1;::::0;51438:10:::1;::::0;51430:37;::::1;;;::::0;51398:21;;51383:12:::1;51430:37:::0;51383:12;51430:37;51398:21;51438:10;51430:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;51372:103;51335:140::o:0;29847:185::-;29985:39;30002:4;30008:2;30012:7;29985:39;;;;;;;;;;;;:16;:39::i;49509:374::-;49584:16;49618:23;49644:17;49654:6;49644:9;:17::i;:::-;49618:43;;49672:25;49714:15;49700:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49700:30:0;;49672:58;;49746:9;49741:113;49761:15;49757:1;:19;49741:113;;;49812:30;49832:6;49840:1;49812:19;:30::i;:::-;49798:8;49807:1;49798:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;49778:3;;;;:::i;:::-;;;;49741:113;;;-1:-1:-1;49867:8:0;49509:374;-1:-1:-1;;;49509:374:0:o;46820:146::-;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46890:19:0;::::1;;::::0;;;:9:::1;:19;::::0;;;;;:26;;-1:-1:-1;;46890:26:0::1;46912:4;46890:26;::::0;;46932;::::1;::::0;46890:19;46932:26:::1;46820:146:::0;:::o;46095:198::-;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46166:20:0;::::1;;::::0;;;:13:::1;:20;::::0;;;;;::::1;;46165:21;46157:58;;;::::0;-1:-1:-1;;;46157:58:0;;11802:2:1;46157:58:0::1;::::0;::::1;11784:21:1::0;11841:2;11821:18;;;11814:30;11880:26;11860:18;;;11853:54;11924:18;;46157:58:0::1;11600:348:1::0;46157:58:0::1;-1:-1:-1::0;;;;;46226:20:0::1;;::::0;;;:13:::1;:20;::::0;;;;:27;;-1:-1:-1;;46226:27:0::1;46249:4;46226:27;::::0;;46095:198::o;40692:233::-;40767:7;40803:30;40590:10;:17;;40502:113;40803:30;40795:5;:38;40787:95;;;;-1:-1:-1;;;40787:95:0;;12155:2:1;40787:95:0;;;12137:21:1;12194:2;12174:18;;;12167:30;12233:34;12213:18;;;12206:62;-1:-1:-1;;;12284:18:1;;;12277:42;12336:19;;40787:95:0;11953:408:1;40787:95:0;40900:10;40911:5;40900:17;;;;;;;;:::i;:::-;;;;;;;;;40893:24;;40692:233;;;:::o;46305:208::-;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46385:20:0;::::1;;::::0;;;:13:::1;:20;::::0;;;;;::::1;;46377:57;;;::::0;-1:-1:-1;;;46377:57:0;;12568:2:1;46377:57:0::1;::::0;::::1;12550:21:1::0;12607:2;12587:18;;;12580:30;12646:26;12626:18;;;12619:54;12690:18;;46377:57:0::1;12366:348:1::0;46377:57:0::1;-1:-1:-1::0;;;;;46445:20:0::1;46468:5;46445:20:::0;;;:13:::1;:20;::::0;;;;:28;;-1:-1:-1;;46445:28:0::1;::::0;;46305:208::o;48172:79::-;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;48221:14:::1;:22:::0;;-1:-1:-1;;;;48221:22:0::1;::::0;;48172:79::o;47910:102::-;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;47981:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;26684:239::-:0;26756:7;26792:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26792:16:0;26827:19;26819:73;;;;-1:-1:-1;;;26819:73:0;;12921:2:1;26819:73:0;;;12903:21:1;12960:2;12940:18;;;12933:30;12999:34;12979:18;;;12972:62;-1:-1:-1;;;13050:18:1;;;13043:39;13099:19;;26819:73:0;12719:405:1;26414:208:0;26486:7;-1:-1:-1;;;;;26514:19:0;;26506:74;;;;-1:-1:-1;;;26506:74:0;;13331:2:1;26506:74:0;;;13313:21:1;13370:2;13350:18;;;13343:30;13409:34;13389:18;;;13382:62;-1:-1:-1;;;13460:18:1;;;13453:40;13510:19;;26506:74:0;13129:406:1;26506:74:0;-1:-1:-1;;;;;;26598:16:0;;;;;:9;:16;;;;;;;26414:208::o;49013:97::-;49056:13;49089;49082:20;;;;;:::i;6606:94::-;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;6671:21:::1;6689:1;6671:9;:21::i;:::-;6606:94::o:0;27159:104::-;27215:13;27248:7;27241:14;;;;;:::i;50008:734::-;50089:10;50075:25;;;;:13;:25;;;;;;;;50074:26;50066:59;;;;-1:-1:-1;;;50066:59:0;;13742:2:1;50066:59:0;;;13724:21:1;13781:2;13761:18;;;13754:30;-1:-1:-1;;;13800:18:1;;;13793:50;13860:18;;50066:59:0;13540:344:1;50066:59:0;50137:19;50159:13;40590:10;:17;;40502:113;50159:13;50137:35;;47392:5;50191:11;:25;;50183:46;;;;-1:-1:-1;;;50183:46:0;;10175:2:1;50183:46:0;;;10157:21:1;10214:1;10194:18;;;10187:29;-1:-1:-1;;;10232:18:1;;;10225:38;10280:18;;50183:46:0;9973:331:1;50183:46:0;50248:14;;-1:-1:-1;;;50248:14:0;;;;:22;;50266:4;50248:22;50240:54;;;;-1:-1:-1;;;50240:54:0;;14091:2:1;50240:54:0;;;14073:21:1;14130:2;14110:18;;;14103:30;-1:-1:-1;;;14149:18:1;;;14142:49;14208:18;;50240:54:0;13889:343:1;50240:54:0;47392:5;50313:20;50327:6;50313:11;:20;:::i;:::-;:34;;50305:69;;;;-1:-1:-1;;;50305:69:0;;10776:2:1;50305:69:0;;;10758:21:1;10815:2;10795:18;;;10788:30;-1:-1:-1;;;10834:18:1;;;10827:52;10896:18;;50305:69:0;10574:346:1;50305:69:0;50403:11;;50393:6;:21;;50385:68;;;;-1:-1:-1;;;50385:68:0;;;;;;;:::i;:::-;50496:12;;50485:24;;:6;;:10;:24::i;:::-;50472:9;:37;;50464:103;;;;-1:-1:-1;;;50464:103:0;;14439:2:1;50464:103:0;;;14421:21:1;14478:2;14458:18;;;14451:30;14517:34;14497:18;;;14490:62;-1:-1:-1;;;14568:18:1;;;14561:51;14629:19;;50464:103:0;14237:417:1;50464:103:0;6028:6;;50578:36;;-1:-1:-1;;;;;6028:6:0;;;;50604:9;50578:36;;;;;;;;;50604:9;6028:6;50578:36;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50650:1:0;50635:100;50657:6;50653:1;:10;50635:100;;50685:38;50695:10;50707:15;50721:1;50707:11;:15;:::i;50685:38::-;50665:3;;;;:::i;:::-;;;;50635:100;;28842:295;-1:-1:-1;;;;;28945:24:0;;4911:10;28945:24;;28937:62;;;;-1:-1:-1;;;28937:62:0;;14861:2:1;28937:62:0;;;14843:21:1;14900:2;14880:18;;;14873:30;14939:27;14919:18;;;14912:55;14984:18;;28937:62:0;14659:349:1;28937:62:0;4911:10;29012:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29012:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;29012:53:0;;;;;;;;;;29081:48;;540:41:1;;;29012:42:0;;4911:10;29081:48;;513:18:1;29081:48:0;;;;;;;28842:295;;:::o;48067:78::-;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;48116:14:::1;:21:::0;;-1:-1:-1;;;;48116:21:0::1;-1:-1:-1::0;;;48116:21:0::1;::::0;;48067:78::o;30103:328::-;30278:41;4911:10;30311:7;30278:18;:41::i;:::-;30270:103;;;;-1:-1:-1;;;30270:103:0;;;;;;;:::i;:::-;30384:39;30398:4;30404:2;30408:7;30417:5;30384:13;:39::i;:::-;30103:328;;;;:::o;49122:379::-;49250:27;;;;;;;;;;;;-1:-1:-1;;;49250:27:0;;;;49224:13;;49250:19;49310:13;40590:10;:17;;40502:113;49310:13;49288:35;;49354:11;49342:8;:23;;49334:69;;;;-1:-1:-1;;;49334:69:0;;15215:2:1;49334:69:0;;;15197:21:1;15254:2;15234:18;;;15227:30;15293:34;15273:18;;;15266:62;-1:-1:-1;;;15344:18:1;;;15337:31;15385:19;;49334:69:0;15013:397:1;49334:69:0;49445:13;49460:26;49477:8;49460:16;:26::i;:::-;49487:4;49428:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49414:79;;;;49122:379;;;:::o;48775:110::-;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;48852:11:::1;:25:::0;48775:110::o;6855:192::-;6028:6;;-1:-1:-1;;;;;6028:6:0;4911:10;6175:23;6167:68;;;;-1:-1:-1;;;6167:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6944:22:0;::::1;6936:73;;;::::0;-1:-1:-1;;;6936:73:0;;17187:2:1;6936:73:0::1;::::0;::::1;17169:21:1::0;17226:2;17206:18;;;17199:30;17265:34;17245:18;;;17238:62;-1:-1:-1;;;17316:18:1;;;17309:36;17362:19;;6936:73:0::1;16985:402:1::0;6936:73:0::1;7020:19;7030:8;7020:9;:19::i;:::-;6855:192:::0;:::o;26045:305::-;26147:4;-1:-1:-1;;;;;;26184:40:0;;-1:-1:-1;;;26184:40:0;;:105;;-1:-1:-1;;;;;;;26241:48:0;;-1:-1:-1;;;26241:48:0;26184:105;:158;;;-1:-1:-1;;;;;;;;;;24763:40:0;;;26306:36;24654:157;35923:174;35998:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35998:29:0;-1:-1:-1;;;;;35998:29:0;;;;;;;;:24;;36052:23;35998:24;36052:14;:23::i;:::-;-1:-1:-1;;;;;36043:46:0;;;;;;;;;;;35923:174;;:::o;32235:348::-;32328:4;32030:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32030:16:0;32345:73;;;;-1:-1:-1;;;32345:73:0;;17594:2:1;32345:73:0;;;17576:21:1;17633:2;17613:18;;;17606:30;17672:34;17652:18;;;17645:62;-1:-1:-1;;;17723:18:1;;;17716:42;17775:19;;32345:73:0;17392:408:1;32345:73:0;32429:13;32445:23;32460:7;32445:14;:23::i;:::-;32429:39;;32498:5;-1:-1:-1;;;;;32487:16:0;:7;-1:-1:-1;;;;;32487:16:0;;:51;;;;32531:7;-1:-1:-1;;;;;32507:31:0;:20;32519:7;32507:11;:20::i;:::-;-1:-1:-1;;;;;32507:31:0;;32487:51;:87;;;-1:-1:-1;;;;;;29329:25:0;;;29305:4;29329:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32542:32;32479:96;32235:348;-1:-1:-1;;;;32235:348:0:o;35227:578::-;35386:4;-1:-1:-1;;;;;35359:31:0;:23;35374:7;35359:14;:23::i;:::-;-1:-1:-1;;;;;35359:31:0;;35351:85;;;;-1:-1:-1;;;35351:85:0;;18007:2:1;35351:85:0;;;17989:21:1;18046:2;18026:18;;;18019:30;18085:34;18065:18;;;18058:62;-1:-1:-1;;;18136:18:1;;;18129:39;18185:19;;35351:85:0;17805:405:1;35351:85:0;-1:-1:-1;;;;;35455:16:0;;35447:65;;;;-1:-1:-1;;;35447:65:0;;18417:2:1;35447:65:0;;;18399:21:1;18456:2;18436:18;;;18429:30;18495:34;18475:18;;;18468:62;-1:-1:-1;;;18546:18:1;;;18539:34;18590:19;;35447:65:0;18215:400:1;35447:65:0;35525:39;35546:4;35552:2;35556:7;35525:20;:39::i;:::-;35629:29;35646:1;35650:7;35629:8;:29::i;:::-;-1:-1:-1;;;;;35671:15:0;;;;;;:9;:15;;;;;:20;;35690:1;;35671:15;:20;;35690:1;;35671:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35702:13:0;;;;;;:9;:13;;;;;:18;;35719:1;;35702:13;:18;;35719:1;;35702:18;:::i;:::-;;;;-1:-1:-1;;35731:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35731:21:0;-1:-1:-1;;;;;35731:21:0;;;;;;;;;35770:27;;35731:16;;35770:27;;;;;;;35227:578;;;:::o;32925:110::-;33001:26;33011:2;33015:7;33001:26;;;;;;;;;;;;:9;:26::i;7055:173::-;7130:6;;;-1:-1:-1;;;;;7147:17:0;;;-1:-1:-1;;;;;;7147:17:0;;;;;;;7180:40;;7130:6;;;7147:17;7130:6;;7180:40;;7111:16;;7180:40;7100:128;7055:173;:::o;1656:471::-;1714:7;1959:6;1955:47;;-1:-1:-1;1989:1:0;1982:8;;1955:47;2014:9;2026:5;2030:1;2026;:5;:::i;:::-;2014:17;-1:-1:-1;2059:1:0;2050:5;2054:1;2014:17;2050:5;:::i;:::-;:10;2042:56;;;;-1:-1:-1;;;2042:56:0;;19382:2:1;2042:56:0;;;19364:21:1;19421:2;19401:18;;;19394:30;19460:34;19440:18;;;19433:62;-1:-1:-1;;;19511:18:1;;;19504:31;19552:19;;2042:56:0;19180:397:1;2042:56:0;2118:1;1656:471;-1:-1:-1;;;1656:471:0:o;31313:315::-;31470:28;31480:4;31486:2;31490:7;31470:9;:28::i;:::-;31517:48;31540:4;31546:2;31550:7;31559:5;31517:22;:48::i;:::-;31509:111;;;;-1:-1:-1;;;31509:111:0;;;;;;;:::i;22195:723::-;22251:13;22472:10;22468:53;;-1:-1:-1;;22499:10:0;;;;;;;;;;;;-1:-1:-1;;;22499:10:0;;;;;22195:723::o;22468:53::-;22546:5;22531:12;22587:78;22594:9;;22587:78;;22620:8;;;;:::i;:::-;;-1:-1:-1;22643:10:0;;-1:-1:-1;22651:2:0;22643:10;;:::i;:::-;;;22587:78;;;22675:19;22707:6;22697:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22697:17:0;;22675:39;;22725:154;22732:10;;22725:154;;22759:11;22769:1;22759:11;;:::i;:::-;;-1:-1:-1;22828:10:0;22836:2;22828:5;:10;:::i;:::-;22815:24;;:2;:24;:::i;:::-;22802:39;;22785:6;22792;22785:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;22785:56:0;;;;;;;;-1:-1:-1;22856:11:0;22865:2;22856:11;;:::i;:::-;;;22725:154;;41538:589;-1:-1:-1;;;;;41744:18:0;;41740:187;;41779:40;41811:7;42954:10;:17;;42927:24;;;;:15;:24;;;;;:44;;;42982:24;;;;;;;;;;;;42850:164;41779:40;41740:187;;;41849:2;-1:-1:-1;;;;;41841:10:0;:4;-1:-1:-1;;;;;41841:10:0;;41837:90;;41868:47;41901:4;41907:7;41868:32;:47::i;:::-;-1:-1:-1;;;;;41941:16:0;;41937:183;;41974:45;42011:7;41974:36;:45::i;41937:183::-;42047:4;-1:-1:-1;;;;;42041:10:0;:2;-1:-1:-1;;;;;42041:10:0;;42037:83;;42068:40;42096:2;42100:7;42068:27;:40::i;33262:321::-;33392:18;33398:2;33402:7;33392:5;:18::i;:::-;33443:54;33474:1;33478:2;33482:7;33491:5;33443:22;:54::i;:::-;33421:154;;;;-1:-1:-1;;;33421:154:0;;;;;;;:::i;36662:803::-;36817:4;-1:-1:-1;;;;;36838:13:0;;15192:20;15240:8;36834:624;;36874:72;;-1:-1:-1;;;36874:72:0;;-1:-1:-1;;;;;36874:36:0;;;;;:72;;4911:10;;36925:4;;36931:7;;36940:5;;36874:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36874:72:0;;;;;;;;-1:-1:-1;;36874:72:0;;;;;;;;;;;;:::i;:::-;;;36870:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37120:13:0;;37116:272;;37163:60;;-1:-1:-1;;;37163:60:0;;;;;;;:::i;37116:272::-;37338:6;37332:13;37323:6;37319:2;37315:15;37308:38;36870:533;-1:-1:-1;;;;;;36997:55:0;-1:-1:-1;;;36997:55:0;;-1:-1:-1;36990:62:0;;36834:624;-1:-1:-1;37442:4:0;36662:803;;;;;;:::o;43639:988::-;43905:22;43955:1;43930:22;43947:4;43930:16;:22::i;:::-;:26;;;;:::i;:::-;43967:18;43988:26;;;:17;:26;;;;;;43905:51;;-1:-1:-1;44121:28:0;;;44117:328;;-1:-1:-1;;;;;44188:18:0;;44166:19;44188:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44239:30;;;;;;:44;;;44356:30;;:17;:30;;;;;:43;;;44117:328;-1:-1:-1;44541:26:0;;;;:17;:26;;;;;;;;44534:33;;;-1:-1:-1;;;;;44585:18:0;;;;;:12;:18;;;;;:34;;;;;;;44578:41;43639:988::o;44922:1079::-;45200:10;:17;45175:22;;45200:21;;45220:1;;45200:21;:::i;:::-;45232:18;45253:24;;;:15;:24;;;;;;45626:10;:26;;45175:46;;-1:-1:-1;45253:24:0;;45175:46;;45626:26;;;;;;:::i;:::-;;;;;;;;;45604:48;;45690:11;45665:10;45676;45665:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;45770:28;;;:15;:28;;;;;;;:41;;;45942:24;;;;;45935:31;45977:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;44993:1008;;;44922:1079;:::o;42428:221::-;42513:14;42530:20;42547:2;42530:16;:20::i;:::-;-1:-1:-1;;;;;42561:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;42606:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42428:221:0:o;33919:382::-;-1:-1:-1;;;;;33999:16:0;;33991:61;;;;-1:-1:-1;;;33991:61:0;;21211:2:1;33991:61:0;;;21193:21:1;;;21230:18;;;21223:30;21289:34;21269:18;;;21262:62;21341:18;;33991:61:0;21009:356:1;33991:61:0;32006:4;32030:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32030:16:0;:30;34063:58;;;;-1:-1:-1;;;34063:58:0;;21572:2:1;34063:58:0;;;21554:21:1;21611:2;21591:18;;;21584:30;21650;21630:18;;;21623:58;21698:18;;34063:58:0;21370:352:1;34063:58:0;34134:45;34163:1;34167:2;34171:7;34134:20;:45::i;:::-;-1:-1:-1;;;;;34192:13:0;;;;;;:9;:13;;;;;:18;;34209:1;;34192:13;:18;;34209:1;;34192:18;:::i;:::-;;;;-1:-1:-1;;34221:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34221:21:0;-1:-1:-1;;;;;34221:21:0;;;;;;;;34260:33;;34221:16;;;34260:33;;34221:16;;34260:33;33919:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:180::-;651:6;704:2;692:9;683:7;679:23;675:32;672:52;;;720:1;717;710:12;672:52;-1:-1:-1;743:23:1;;592:180;-1:-1:-1;592:180:1:o;777:139::-;-1:-1:-1;;;;;860:31:1;;850:42;;840:70;;906:1;903;896:12;921:263;988:6;1041:2;1029:9;1020:7;1016:23;1012:32;1009:52;;;1057:1;1054;1047:12;1009:52;1096:9;1083:23;1115:39;1148:5;1115:39;:::i;1189:258::-;1261:1;1271:113;1285:6;1282:1;1279:13;1271:113;;;1361:11;;;1355:18;1342:11;;;1335:39;1307:2;1300:10;1271:113;;;1402:6;1399:1;1396:13;1393:48;;;-1:-1:-1;;1437:1:1;1419:16;;1412:27;1189:258::o;1452:269::-;1505:3;1543:5;1537:12;1570:6;1565:3;1558:19;1586:63;1642:6;1635:4;1630:3;1626:14;1619:4;1612:5;1608:16;1586:63;:::i;:::-;1703:2;1682:15;-1:-1:-1;;1678:29:1;1669:39;;;;1710:4;1665:50;;1452:269;-1:-1:-1;;1452:269:1:o;1726:231::-;1875:2;1864:9;1857:21;1838:4;1895:56;1947:2;1936:9;1932:18;1924:6;1895:56;:::i;2170:323::-;2238:6;2246;2299:2;2287:9;2278:7;2274:23;2270:32;2267:52;;;2315:1;2312;2305:12;2267:52;2354:9;2341:23;2373:39;2406:5;2373:39;:::i;:::-;2431:5;2483:2;2468:18;;;;2455:32;;-1:-1:-1;;;2170:323:1:o;2680:472::-;2757:6;2765;2773;2826:2;2814:9;2805:7;2801:23;2797:32;2794:52;;;2842:1;2839;2832:12;2794:52;2881:9;2868:23;2900:39;2933:5;2900:39;:::i;:::-;2958:5;-1:-1:-1;3015:2:1;3000:18;;2987:32;3028:41;2987:32;3028:41;:::i;:::-;2680:472;;3088:7;;-1:-1:-1;;;3142:2:1;3127:18;;;;3114:32;;2680:472::o;3417:632::-;3588:2;3640:21;;;3710:13;;3613:18;;;3732:22;;;3559:4;;3588:2;3811:15;;;;3785:2;3770:18;;;3559:4;3854:169;3868:6;3865:1;3862:13;3854:169;;;3929:13;;3917:26;;3998:15;;;;3963:12;;;;3890:1;3883:9;3854:169;;;-1:-1:-1;4040:3:1;;3417:632;-1:-1:-1;;;;;;3417:632:1:o;4054:127::-;4115:10;4110:3;4106:20;4103:1;4096:31;4146:4;4143:1;4136:15;4170:4;4167:1;4160:15;4186:632;4251:5;4281:18;4322:2;4314:6;4311:14;4308:40;;;4328:18;;:::i;:::-;4403:2;4397:9;4371:2;4457:15;;-1:-1:-1;;4453:24:1;;;4479:2;4449:33;4445:42;4433:55;;;4503:18;;;4523:22;;;4500:46;4497:72;;;4549:18;;:::i;:::-;4589:10;4585:2;4578:22;4618:6;4609:15;;4648:6;4640;4633:22;4688:3;4679:6;4674:3;4670:16;4667:25;4664:45;;;4705:1;4702;4695:12;4664:45;4755:6;4750:3;4743:4;4735:6;4731:17;4718:44;4810:1;4803:4;4794:6;4786;4782:19;4778:30;4771:41;;;;4186:632;;;;;:::o;4823:451::-;4892:6;4945:2;4933:9;4924:7;4920:23;4916:32;4913:52;;;4961:1;4958;4951:12;4913:52;5001:9;4988:23;5034:18;5026:6;5023:30;5020:50;;;5066:1;5063;5056:12;5020:50;5089:22;;5142:4;5134:13;;5130:27;-1:-1:-1;5120:55:1;;5171:1;5168;5161:12;5120:55;5194:74;5260:7;5255:2;5242:16;5237:2;5233;5229:11;5194:74;:::i;5279:424::-;5344:6;5352;5405:2;5393:9;5384:7;5380:23;5376:32;5373:52;;;5421:1;5418;5411:12;5373:52;5460:9;5447:23;5479:39;5512:5;5479:39;:::i;:::-;5537:5;-1:-1:-1;5594:2:1;5579:18;;5566:32;5636:15;;5629:23;5617:36;;5607:64;;5667:1;5664;5657:12;5607:64;5690:7;5680:17;;;5279:424;;;;;:::o;5932:811::-;6027:6;6035;6043;6051;6104:3;6092:9;6083:7;6079:23;6075:33;6072:53;;;6121:1;6118;6111:12;6072:53;6160:9;6147:23;6179:39;6212:5;6179:39;:::i;:::-;6237:5;-1:-1:-1;6294:2:1;6279:18;;6266:32;6307:41;6266:32;6307:41;:::i;:::-;6367:7;-1:-1:-1;6421:2:1;6406:18;;6393:32;;-1:-1:-1;6476:2:1;6461:18;;6448:32;6503:18;6492:30;;6489:50;;;6535:1;6532;6525:12;6489:50;6558:22;;6611:4;6603:13;;6599:27;-1:-1:-1;6589:55:1;;6640:1;6637;6630:12;6589:55;6663:74;6729:7;6724:2;6711:16;6706:2;6702;6698:11;6663:74;:::i;:::-;6653:84;;;5932:811;;;;;;;:::o;6748:404::-;6816:6;6824;6877:2;6865:9;6856:7;6852:23;6848:32;6845:52;;;6893:1;6890;6883:12;6845:52;6932:9;6919:23;6951:39;6984:5;6951:39;:::i;:::-;7009:5;-1:-1:-1;7066:2:1;7051:18;;7038:32;7079:41;7038:32;7079:41;:::i;7157:356::-;7359:2;7341:21;;;7378:18;;;7371:30;7437:34;7432:2;7417:18;;7410:62;7504:2;7489:18;;7157:356::o;7518:380::-;7597:1;7593:12;;;;7640;;;7661:61;;7715:4;7707:6;7703:17;7693:27;;7661:61;7768:2;7760:6;7757:14;7737:18;7734:38;7731:161;;;7814:10;7809:3;7805:20;7802:1;7795:31;7849:4;7846:1;7839:15;7877:4;7874:1;7867:15;7731:161;;7518:380;;;:::o;9143:413::-;9345:2;9327:21;;;9384:2;9364:18;;;9357:30;9423:34;9418:2;9403:18;;9396:62;-1:-1:-1;;;9489:2:1;9474:18;;9467:47;9546:3;9531:19;;9143:413::o;10309:127::-;10370:10;10365:3;10361:20;10358:1;10351:31;10401:4;10398:1;10391:15;10425:4;10422:1;10415:15;10441:128;10481:3;10512:1;10508:6;10505:1;10502:13;10499:39;;;10518:18;;:::i;:::-;-1:-1:-1;10554:9:1;;10441:128::o;10925:398::-;11127:2;11109:21;;;11166:2;11146:18;;;11139:30;11205:34;11200:2;11185:18;;11178:62;-1:-1:-1;;;11271:2:1;11256:18;;11249:32;11313:3;11298:19;;10925:398::o;11328:135::-;11367:3;-1:-1:-1;;11388:17:1;;11385:43;;;11408:18;;:::i;:::-;-1:-1:-1;11455:1:1;11444:13;;11328:135::o;11468:127::-;11529:10;11524:3;11520:20;11517:1;11510:31;11560:4;11557:1;11550:15;11584:4;11581:1;11574:15;15541:185;15583:3;15621:5;15615:12;15636:52;15681:6;15676:3;15669:4;15662:5;15658:16;15636:52;:::i;:::-;15704:16;;;;;15541:185;-1:-1:-1;;15541:185:1:o;15731:1249::-;15955:3;15984:1;16017:6;16011:13;16047:3;16069:1;16097:9;16093:2;16089:18;16079:28;;16157:2;16146:9;16142:18;16179;16169:61;;16223:4;16215:6;16211:17;16201:27;;16169:61;16249:2;16297;16289:6;16286:14;16266:18;16263:38;16260:165;;;-1:-1:-1;;;16324:33:1;;16380:4;16377:1;16370:15;16410:4;16331:3;16398:17;16260:165;16441:18;16468:104;;;;16586:1;16581:320;;;;16434:467;;16468:104;-1:-1:-1;;16501:24:1;;16489:37;;16546:16;;;;-1:-1:-1;16468:104:1;;16581:320;15488:1;15481:14;;;15525:4;15512:18;;16676:1;16690:165;16704:6;16701:1;16698:13;16690:165;;;16782:14;;16769:11;;;16762:35;16825:16;;;;16719:10;;16690:165;;;16694:3;;16884:6;16879:3;16875:16;16868:23;;16434:467;;;;;;;16917:57;16943:30;16969:3;16961:6;16943:30;:::i;:::-;16935:6;16917:57;:::i;:::-;16910:64;15731:1249;-1:-1:-1;;;;;;15731:1249:1:o;18620:125::-;18660:4;18688:1;18685;18682:8;18679:34;;;18693:18;;:::i;:::-;-1:-1:-1;18730:9:1;;18620:125::o;18750:168::-;18790:7;18856:1;18852;18848:6;18844:14;18841:1;18838:21;18833:1;18826:9;18819:17;18815:45;18812:71;;;18863:18;;:::i;:::-;-1:-1:-1;18903:9:1;;18750:168::o;18923:127::-;18984:10;18979:3;18975:20;18972:1;18965:31;19015:4;19012:1;19005:15;19039:4;19036:1;19029:15;19055:120;19095:1;19121;19111:35;;19126:18;;:::i;:::-;-1:-1:-1;19160:9:1;;19055:120::o;19582:414::-;19784:2;19766:21;;;19823:2;19803:18;;;19796:30;19862:34;19857:2;19842:18;;19835:62;-1:-1:-1;;;19928:2:1;19913:18;;19906:48;19986:3;19971:19;;19582:414::o;20001:112::-;20033:1;20059;20049:35;;20064:18;;:::i;:::-;-1:-1:-1;20098:9:1;;20001:112::o;20118:500::-;-1:-1:-1;;;;;20387:15:1;;;20369:34;;20439:15;;20434:2;20419:18;;20412:43;20486:2;20471:18;;20464:34;;;20534:3;20529:2;20514:18;;20507:31;;;20312:4;;20555:57;;20592:19;;20584:6;20555:57;:::i;20623:249::-;20692:6;20745:2;20733:9;20724:7;20720:23;20716:32;20713:52;;;20761:1;20758;20751:12;20713:52;20793:9;20787:16;20812:30;20836:5;20812:30;:::i;20877:127::-;20938:10;20933:3;20929:20;20926:1;20919:31;20969:4;20966:1;20959:15;20993:4;20990:1;20983:15
Swarm Source
ipfs://6d47c9a077540d9913bc9db75c057d4c73a02996a3ea5d8b265a8fabe56b81ac
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.