Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
91 APES
Holders
91
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 APESLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ApeSquadPosterNFT
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-01 */ // Sources flattened with hardhat v2.9.1 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @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; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @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); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @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; } } // File contracts/ERC721Opt.sol pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintToDeadAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error TransferToDeadAddress(); error UnableGetTokenOwnerByIndex(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 1 (e.g. 1, 2, 3..). */ contract ERC721Opt is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; uint256 internal _nextTokenId = 1; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owners details // An empty struct value does not necessarily mean the token is unowned. See ownerOf implementation for details. mapping(uint256 => address) internal _owners; // Mapping owner address to balances 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; // Address to use for burned accounting address constant DEAD_ADDR = 0x000000000000000000000000000000000000dEaD; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { // Counter underflow is impossible as burned cannot be incremented // more than _nextTokenId - 1 times unchecked { return (_nextTokenId - 1) - balanceOf(DEAD_ADDR); } } /** * @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) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address owner) { if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken(); unchecked { for (uint256 curr = tokenId;; curr--) { owner = _owners[curr]; if (owner != address(0)) { 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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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 = ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) revert ApprovalCallerNotOwnerNorApproved(); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _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 { _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 { _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) revert TransferToNonERC721ReceiverImplementer(); } function _isApprovedOrOwner(address sender, uint256 tokenId) internal view virtual returns (bool) { address owner = ownerOf(tokenId); return (sender == owner || getApproved(tokenId) == sender || isApprovedForAll(owner, sender)); } /** * @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`), */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return tokenId > 0 && tokenId < _nextTokenId && _owners[tokenId] != DEAD_ADDR; } function _mint(address to, uint256 quantity) internal virtual { _mint(to, quantity, '', false); } function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal virtual { uint256 startTokenId = _nextTokenId; if (to == address(0)) revert MintToZeroAddress(); if (to == DEAD_ADDR) revert MintToDeadAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance overflow if current value + quantity > 1.56e77 (2**256) - 1 // updatedIndex overflows if _nextTokenId + quantity > 1.56e77 (2**256) - 1 unchecked { _balances[to] += quantity; _owners[startTokenId] = to; uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { if (!_checkOnERC721Received(address(0), to, updatedIndex, _data)) revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _nextTokenId = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { address owner = ownerOf(tokenId); bool isApprovedOrOwner = (_msgSender() == owner || isApprovedForAll(owner, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (owner != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); if (to == DEAD_ADDR) revert TransferToDeadAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, owner); // Underflow of the sender's balance is impossible because we check for // owner above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; // If the owner slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_owners[nextTokenId] == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _nextTokenId) { _owners[nextTokenId] = owner; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, 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 = ownerOf(tokenId); _beforeTokenTransfers(owner, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, owner); // Underflow of the sender's balance is impossible because we check for // owner above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _balances[owner] -= 1; _balances[DEAD_ADDR] += 1; _owners[tokenId] = DEAD_ADDR; // If the owner slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_owners[nextTokenId] == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _nextTokenId) { _owners[nextTokenId] = owner; } } } emit Transfer(owner, address(0), tokenId); _afterTokenTransfers(owner, address(0), tokenId, 1); } /** * @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 TransferToNonERC721ReceiverImplementer(); else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File contracts/extensions/ERC721OptOwnersExplicit.sol pragma solidity ^0.8.4; error AllOwnersHaveBeenSet(); error QuantityMustBeNonZero(); error NoTokensMintedYet(); abstract contract ERC721OptOwnersExplicit is ERC721Opt { uint256 public nextOwnerToExplicitlySet = 1; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { if (quantity == 0) revert QuantityMustBeNonZero(); if (_nextTokenId == 1) revert NoTokensMintedYet(); uint256 _nextOwnerToExplicitlySet = nextOwnerToExplicitlySet; if (_nextOwnerToExplicitlySet >= _nextTokenId) revert AllOwnersHaveBeenSet(); // Index underflow is impossible. // Counter or index overflow is incredibly unrealistic. unchecked { uint256 endIndex = _nextOwnerToExplicitlySet + quantity - 1; // Set the end index to be the last token index if (endIndex + 1 > _nextTokenId) { endIndex = _nextTokenId - 1; } for (uint256 i = _nextOwnerToExplicitlySet; i <= endIndex; i++) { if (_owners[i] == address(0) && _owners[i] != DEAD_ADDR) { address ownership = ownerOf(i); _owners[i] = ownership; } } nextOwnerToExplicitlySet = endIndex + 1; } } } // File contracts/extensions/ERC721OptBurnable.sol pragma solidity ^0.8.4; error BurnCallerNotOwnerNorApproved(); /** * @title ERC721Opt Burnable Token * @dev ERC721Opt Token that can be irreversibly burned (destroyed). */ abstract contract ERC721OptBurnable is ERC721Opt { /** * @dev Burns `tokenId`. See {ERC721Opt-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { if (!_isApprovedOrOwner(_msgSender(), tokenId)) revert BurnCallerNotOwnerNorApproved(); _burn(tokenId); } } // File contracts/extensions/ERC721OptBatchBurnable.sol pragma solidity ^0.8.4; /** * @title ERC721Opt Batch Burnable Token * @dev ERC721Opt Token that can be irreversibly batch burned (destroyed). */ abstract contract ERC721OptBatchBurnable is ERC721OptBurnable { /** * @dev Perform burn on a batch of tokens */ function batchBurn(uint16[] memory tokenIds) public virtual { for (uint16 i = 0; i < tokenIds.length; ++i) { if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert BurnCallerNotOwnerNorApproved(); _burn(tokenIds[i]); } } } // File contracts/extensions/ERC721OptBatchTransferable.sol pragma solidity ^0.8.4; /** * @title ERC721Opt Batch Transferable Token * @dev ERC721Opt Token that can be batch transfered */ abstract contract ERC721OptBatchTransferable is ERC721Opt { /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint16[] tokenIds ); /** * @dev Perform transferFrom on a batch of tokens */ function batchTransferFrom( address from, address to, uint16[] memory tokenIds ) public virtual { for (uint16 i = 0; i < tokenIds.length; ++i) { if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert TransferCallerNotOwnerNorApproved(); transferFrom(from, to, tokenIds[i]); } emit TransferBatch(_msgSender(), from, to, tokenIds); } /** * @dev Perform safeTransferFrom on a batch of tokens */ function safeBatchTransferFrom( address from, address to, uint16[] memory tokenIds ) public virtual { safeBatchTransferFrom(from, to, tokenIds, ''); } /** * @dev Perform safeTransferFrom on a batch of tokens */ function safeBatchTransferFrom( address from, address to, uint16[] memory tokenIds, bytes memory _data ) public virtual { for (uint256 i = 0; i < tokenIds.length; ++i) { if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert TransferCallerNotOwnerNorApproved(); safeTransferFrom(from, to, tokenIds[i], _data); } emit TransferBatch(_msgSender(), from, to, tokenIds); } } // File contracts/OpenSea.sol pragma solidity ^0.8.4; contract OpenSeaOwnableDelegateProxy {} contract OpenSeaProxyRegistry { mapping(address => OpenSeaOwnableDelegateProxy) public proxies; } // File contracts/ApeSquadCharacterSheetNFT.sol pragma solidity ^0.8.4; error CharacterSheetTypeQueryForNonexistentToken(); error OnlyMintersCanMintCharacterSheets(); error InvalidPurchaseCharacterSheetTypeId(); error AllCharacterSheetsOfTypeMinted(); error NoCharacterSheetMintAmountProvided(); error InvalidUpdateCharacterSheetLengthsDontMatch(); error InvalidUpdateCharacterSheetTypeId(); contract ApeSquadCharacterSheetNFT is Ownable, ERC721Opt, ERC721OptOwnersExplicit, ERC721OptBatchBurnable, ERC721OptBatchTransferable { using Strings for uint256; struct CharacterSheetPurchase { uint16 characterSheetTypeId; uint16 amount; } struct CharacterSheetType { string name; uint16 maxCharacterSheets; uint16 minted; } /* Base URI for token URIs */ string public baseURI; /* OpenSea user account proxy */ address public openSeaProxyRegistryAddress; /* Minter addressess */ mapping(address => bool) public minters; CharacterSheetType[] public characterSheetTypes; /* mapping of each token id to characterSheet type */ mapping(uint256 => uint16) _tokenIdCharacterSheetTypes; /* mapping of each token id to rarity. 0 = common, 1 = rare, 2 = legendary */ mapping(uint256 => uint8) public characterSheetRarity; constructor(string memory name_, string memory symbol_, string memory _initialBaseURI, address _openSeaProxyRegistryAddress, address[] memory _minters) ERC721Opt(name_, symbol_) { baseURI = _initialBaseURI; openSeaProxyRegistryAddress = _openSeaProxyRegistryAddress; for (uint256 i; i < _minters.length; i++) { minters[_minters[i]] = true; } _addCharacterSheet("Alex", 250); _addCharacterSheet("Borg", 250); _addCharacterSheet("Dax", 250); _addCharacterSheet("Kanoa", 250); _addCharacterSheet("Kazz", 250); } /** * @dev Get characterSheetType count */ function characterSheetTypeCount() public view returns (uint256) { return characterSheetTypes.length; } /** * @dev Get characterSheets left for sale */ function characterSheetsLeft(uint16 characterSheetTypeId) public view returns (uint256) { return characterSheetTypes[characterSheetTypeId].maxCharacterSheets - characterSheetTypes[characterSheetTypeId].minted; } /** * @dev Get the characterSheet type for a specific tokenId */ function tokenCharacterSheetType(uint256 tokenId) public view returns (string memory) { if (!_exists(tokenId)) revert CharacterSheetTypeQueryForNonexistentToken(); return characterSheetTypes[_tokenIdCharacterSheetTypes[tokenId]].name; } /** * @dev Override to if default approved for OS proxy accounts or normal approval */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { // Whitelist OpenSea proxy contract for easy trading. OpenSeaProxyRegistry openSeaProxyRegistry = OpenSeaProxyRegistry( openSeaProxyRegistryAddress ); if (address(openSeaProxyRegistry.proxies(owner)) == operator) { return true; } return ERC721Opt.isApprovedForAll(owner, operator); } /** * @dev Override to change the baseURI used in tokenURI */ function _baseURI() internal view virtual override returns (string memory) { return baseURI; } /** * @dev Override to change tokenURI format */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(_baseURI(), tokenId.toString(), '.json')) : ''; } /** * @dev Mint of specific characterSheet type to address. */ function mint(address to, CharacterSheetPurchase[] calldata characterSheetPurchases) public { if(!minters[msg.sender]) revert OnlyMintersCanMintCharacterSheets(); uint256 amountToMint; uint256 tokenId = _nextTokenId; for (uint16 i; i < characterSheetPurchases.length; i++) { CharacterSheetPurchase memory p = characterSheetPurchases[i]; if(p.characterSheetTypeId >= characterSheetTypes.length) revert InvalidPurchaseCharacterSheetTypeId(); if(p.amount > characterSheetsLeft(characterSheetPurchases[i].characterSheetTypeId)) revert AllCharacterSheetsOfTypeMinted(); characterSheetTypes[p.characterSheetTypeId].minted += p.amount; amountToMint += p.amount; for (uint16 j; j < p.amount; j++) { _tokenIdCharacterSheetTypes[tokenId++] = p.characterSheetTypeId; } } if(amountToMint == 0) revert NoCharacterSheetMintAmountProvided(); _safeMint(to, amountToMint, ''); } /** * @dev Mint of specific poster type to address. */ function mintType(address to, uint16 characterSheetTypeId, uint16 amount) public { if(!minters[msg.sender]) revert OnlyMintersCanMintCharacterSheets(); if(amount == 0) revert NoCharacterSheetMintAmountProvided(); uint256 tokenId = _nextTokenId; if(characterSheetTypeId >= characterSheetTypes.length) revert InvalidPurchaseCharacterSheetTypeId(); if(amount > characterSheetsLeft(characterSheetTypeId)) revert AllCharacterSheetsOfTypeMinted(); characterSheetTypes[characterSheetTypeId].minted += amount; for (uint16 i; i < amount; i++) { _tokenIdCharacterSheetTypes[tokenId++] = characterSheetTypeId; } _safeMint(to, amount, ''); } /** * @dev Set the base uri for token metadata */ function setBaseURI(string memory _newBaseURI) external onlyOwner { baseURI = _newBaseURI; } /** * @dev Set minter status for addresses */ function setMinters(address[] calldata addresses, bool allowed) external onlyOwner { for(uint256 i; i < addresses.length; i++) { minters[addresses[i]] = allowed; } } /** * @dev Add new characterSheet */ function _addCharacterSheet(string memory name, uint16 maxCharacterSheets) internal { CharacterSheetType memory cs; cs.name = name; cs.maxCharacterSheets = maxCharacterSheets; characterSheetTypes.push(cs); } /** * @dev Add new characterSheet */ function addCharacterSheet(string calldata name, uint16 maxCharacterSheets) external onlyOwner { _addCharacterSheet(name, maxCharacterSheets); } /** * @dev Update characterSheet names */ function updateCharacterSheetNames(uint16[] calldata characterSheetTypeIds, string[] calldata names) external onlyOwner { if(characterSheetTypeIds.length != names.length) revert InvalidUpdateCharacterSheetLengthsDontMatch(); for (uint16 i; i < characterSheetTypeIds.length; i++) { if(characterSheetTypeIds[i] >= characterSheetTypes.length) revert InvalidUpdateCharacterSheetTypeId(); characterSheetTypes[characterSheetTypeIds[i]].name = names[i]; } } /** * @dev Update available characterSheets */ function updateMaxCharacterSheets(uint16[] calldata characterSheetTypeIds, uint16[] calldata maxCharacterSheets) external onlyOwner { if(characterSheetTypeIds.length != maxCharacterSheets.length) revert InvalidUpdateCharacterSheetLengthsDontMatch(); for (uint16 i; i < characterSheetTypeIds.length; i++) { if(characterSheetTypeIds[i] >= characterSheetTypes.length) revert InvalidUpdateCharacterSheetTypeId(); characterSheetTypes[characterSheetTypeIds[i]].maxCharacterSheets = maxCharacterSheets[i]; } } /** * @dev Upate Rarities on chain for future staking */ function updateRarities(uint8 rarity, uint256[] calldata tokenIds) external onlyOwner { if (rarity == 0) { for(uint256 i; i < tokenIds.length; i++) { if (tokenIds[i] >= _nextTokenId) continue; delete characterSheetRarity[tokenIds[i]]; } } else { for(uint256 i; i < tokenIds.length; i++) { if (tokenIds[i] >= _nextTokenId) continue; characterSheetRarity[tokenIds[i]] = rarity; } } } /** * @dev Force update all owners for better transfers */ function updateOwners(uint256 quantity) external onlyOwner { _setOwnersExplicit(quantity); } } // File contracts/ApeSquadPosterNFT.sol pragma solidity ^0.8.4; error PosterTypeQueryForNonexistentToken(); error OnlyMintersCanMintPosters(); error InvalidPurchasePosterTypeId(); error AllPostersOfTypeMinted(); error NoPosterMintAmountProvided(); error InvalidUpdatePosterLengthsDontMatch(); error InvalidUpdatePosterTypeId(); contract ApeSquadPosterNFT is Ownable, ERC721Opt, ERC721OptOwnersExplicit, ERC721OptBatchBurnable, ERC721OptBatchTransferable { using Strings for uint256; struct PosterPurchase { uint16 posterTypeId; uint16 amount; } struct PosterType { string name; uint16 maxPosters; uint16 minted; } /* Base URI for token URIs */ string public baseURI; /* OpenSea user account proxy */ address public openSeaProxyRegistryAddress; /* Minter addressess */ mapping(address => bool) public minters; PosterType[] public posterTypes; /* mapping of each token id to poster type */ mapping(uint256 => uint16) _tokenIdPosterTypes; /* mapping of each token id to rarity. 0 = common, 1 = rare, 2 = legendary */ mapping(uint256 => uint8) public posterRarity; constructor(string memory name_, string memory symbol_, string memory _initialBaseURI, address _openSeaProxyRegistryAddress, address[] memory _minters) ERC721Opt(name_, symbol_) { baseURI = _initialBaseURI; openSeaProxyRegistryAddress = _openSeaProxyRegistryAddress; for (uint256 i; i < _minters.length; i++) { minters[_minters[i]] = true; } _addPoster("Season 1", 1250); } /** * @dev Get posterType count */ function posterTypeCount() public view returns (uint256) { return posterTypes.length; } /** * @dev Get posters left for sale */ function postersLeft(uint16 posterTypeId) public view returns (uint256) { return posterTypes[posterTypeId].maxPosters - posterTypes[posterTypeId].minted; } /** * @dev Get the poster type for a specific tokenId */ function tokenPosterType(uint256 tokenId) public view returns (string memory) { if (!_exists(tokenId)) revert PosterTypeQueryForNonexistentToken(); return posterTypes[_tokenIdPosterTypes[tokenId]].name; } /** * @dev Override to if default approved for OS proxy accounts or normal approval */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { // Whitelist OpenSea proxy contract for easy trading. OpenSeaProxyRegistry openSeaProxyRegistry = OpenSeaProxyRegistry( openSeaProxyRegistryAddress ); if (address(openSeaProxyRegistry.proxies(owner)) == operator) { return true; } return ERC721Opt.isApprovedForAll(owner, operator); } /** * @dev Override to change the baseURI used in tokenURI */ function _baseURI() internal view virtual override returns (string memory) { return baseURI; } /** * @dev Override to change tokenURI format */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(_baseURI(), tokenId.toString(), '.json')) : ''; } /** * @dev Mint of specific poster type to address. */ function mint(address to, PosterPurchase[] calldata posterPurchases) public { if(!minters[msg.sender]) revert OnlyMintersCanMintPosters(); uint256 amountToMint; uint256 tokenId = _nextTokenId; for (uint16 i; i < posterPurchases.length; i++) { PosterPurchase memory p = posterPurchases[i]; if(p.posterTypeId >= posterTypes.length) revert InvalidPurchasePosterTypeId(); if(p.amount > postersLeft(posterPurchases[i].posterTypeId)) revert AllPostersOfTypeMinted(); posterTypes[p.posterTypeId].minted += p.amount; amountToMint += p.amount; for (uint16 j; j < p.amount; j++) { _tokenIdPosterTypes[tokenId++] = p.posterTypeId; } } if(amountToMint == 0) revert NoPosterMintAmountProvided(); _safeMint(to, amountToMint, ''); } /** * @dev Mint of specific poster type to address. */ function mintType(address to, uint16 posterTypeId, uint16 amount) public { if(!minters[msg.sender]) revert OnlyMintersCanMintPosters(); if(amount == 0) revert NoPosterMintAmountProvided(); uint256 tokenId = _nextTokenId; if(posterTypeId >= posterTypes.length) revert InvalidPurchasePosterTypeId(); if(amount > postersLeft(posterTypeId)) revert AllPostersOfTypeMinted(); posterTypes[posterTypeId].minted += amount; for (uint16 i; i < amount; i++) { _tokenIdPosterTypes[tokenId++] = posterTypeId; } _safeMint(to, amount, ''); } /** * @dev Set the base uri for token metadata */ function setBaseURI(string memory _newBaseURI) external onlyOwner { baseURI = _newBaseURI; } /** * @dev Set minter status for addresses */ function setMinters(address[] calldata addresses, bool allowed) external onlyOwner { for(uint256 i; i < addresses.length; i++) { minters[addresses[i]] = allowed; } } /** * @dev Add new poster */ function _addPoster(string memory name, uint16 maxPosters) internal { PosterType memory p; p.name = name; p.maxPosters = maxPosters; posterTypes.push(p); } /** * @dev Add new poster */ function addPoster(string calldata name, uint16 maxPosters) external onlyOwner { _addPoster(name, maxPosters); } /** * @dev Update poster names */ function updatePosterNames(uint16[] calldata posterTypeIds, string[] calldata names) external onlyOwner { if(posterTypeIds.length != names.length) revert InvalidUpdatePosterLengthsDontMatch(); for (uint16 i; i < posterTypeIds.length; i++) { if(posterTypeIds[i] >= posterTypes.length) revert InvalidUpdatePosterTypeId(); posterTypes[posterTypeIds[i]].name = names[i]; } } /** * @dev Update available posters */ function updateMaxPosters(uint16[] calldata posterTypeIds, uint16[] calldata maxPosters) external onlyOwner { if(posterTypeIds.length != maxPosters.length) revert InvalidUpdatePosterLengthsDontMatch(); for (uint16 i; i < posterTypeIds.length; i++) { if(posterTypeIds[i] >= posterTypes.length) revert InvalidUpdatePosterTypeId(); posterTypes[posterTypeIds[i]].maxPosters = maxPosters[i]; } } /** * @dev Upate Rarities on chain for future staking */ function updateRarities(uint8 rarity, uint256[] calldata tokenIds) external onlyOwner { if (rarity == 0) { for(uint256 i; i < tokenIds.length; i++) { if (tokenIds[i] >= _nextTokenId) continue; delete posterRarity[tokenIds[i]]; } } else { for(uint256 i; i < tokenIds.length; i++) { if (tokenIds[i] >= _nextTokenId) continue; posterRarity[tokenIds[i]] = rarity; } } } /** * @dev Force update all owners for better transfers */ function updateOwners(uint256 quantity) external onlyOwner { _setOwnersExplicit(quantity); } } // File contracts/ApeSquadMinter.sol pragma solidity ^0.8.0; contract ApeSquadMinter is Ownable { /* Character Sheet NFT contract */ ApeSquadCharacterSheetNFT characterSheetNFTContract; /* Poster NFT contract */ ApeSquadPosterNFT posterNFTContract; /* Is Sale Active */ bool public saleIsActive; /* silver cards reserved for marketing */ mapping(uint16 => uint16) public reservedCharacterSheets; /* posters reserved for marketing */ uint16 public reservedSeason1Posters = 2; /* Price for character sheets */ uint256 public characterSheetPrice = 0.08 ether; /* NFT Contracts that can get free poster */ address[] public freeSeason1PosterNftContracts; /* Mapping of claimed posters */ mapping(address => bool) public season1PosterClaimed; constructor( ApeSquadCharacterSheetNFT _characterSheetNFTContract, ApeSquadPosterNFT _posterNFTContract, address[] memory _freeSeason1PosterNftContracts ) { characterSheetNFTContract = _characterSheetNFTContract; posterNFTContract = _posterNFTContract; for (uint16 i; i < characterSheetNFTContract.characterSheetTypeCount(); i++) { reservedCharacterSheets[i] = 6; } freeSeason1PosterNftContracts = _freeSeason1PosterNftContracts; } function mint(ApeSquadCharacterSheetNFT.CharacterSheetPurchase[] calldata characterSheetPurchases, bool freeSeason1Poster) external payable { require(msg.sender == tx.origin, 'Only EOA'); require(saleIsActive, 'Regular sale is not active'); uint256 totalAmount; for (uint16 i; i < characterSheetPurchases.length; i++) { require( characterSheetPurchases[i].amount <= characterSheetNFTContract.characterSheetsLeft(characterSheetPurchases[i].characterSheetTypeId) - reservedCharacterSheets[characterSheetPurchases[i].characterSheetTypeId], 'Sold Out' ); totalAmount += characterSheetPurchases[i].amount; } if (freeSeason1Poster) { require(!season1PosterClaimed[msg.sender], 'Season 1 Poster already claimed'); bool valid = totalAmount > 0 || characterSheetNFTContract.balanceOf(msg.sender) > 0; if (totalAmount == 0 && characterSheetNFTContract.balanceOf(msg.sender) == 0) { for (uint256 i; i < freeSeason1PosterNftContracts.length; i++) { valid = valid || IERC721(freeSeason1PosterNftContracts[i]).balanceOf(msg.sender) > 0; if (valid) break; } } require(valid, 'Season 1 Poster requirements not met'); season1PosterClaimed[msg.sender] = true; } require( msg.value >= (totalAmount * characterSheetPrice), 'Ether value sent is not correct' ); if(totalAmount > 0) { characterSheetNFTContract.mint(msg.sender, characterSheetPurchases); } if (freeSeason1Poster) { posterNFTContract.mintType(msg.sender, 0, 1); } } function flipSaleState() external onlyOwner { saleIsActive = !saleIsActive; } function setReserves(uint16[] calldata _characterSheetTypeIds, uint16[] calldata _characterSheetAmounts, uint16 _season1PosterAmount) external onlyOwner { require( _characterSheetTypeIds.length == _characterSheetAmounts.length, 'Character Sheet Type Ids length should match Amounts length' ); for (uint16 i; i < _characterSheetTypeIds.length; i++) { require( _characterSheetTypeIds[i] < characterSheetNFTContract.characterSheetTypeCount(), 'Character Sheet Type Id should be with in range' ); reservedCharacterSheets[_characterSheetTypeIds[i]] = _characterSheetAmounts[i]; } reservedSeason1Posters = _season1PosterAmount; } function setFreeSeason1PosterNftContracts(address[] calldata _freeSeason1PosterNftContracts) external onlyOwner { freeSeason1PosterNftContracts = _freeSeason1PosterNftContracts; } function setPrice(uint256 _characterSheetPrice) external onlyOwner { characterSheetPrice = _characterSheetPrice; } function reserveMint(uint16[] calldata _characterSheetTypeIds, uint16[] calldata _characterSheetAmounts, uint16 season1Posters, address[] calldata to) external onlyOwner { require( _characterSheetTypeIds.length == _characterSheetAmounts.length, 'Character Sheet Type Ids length should match Amounts length' ); for (uint16 i; i < _characterSheetTypeIds.length; i++) { require( (_characterSheetAmounts[i] * to.length) <= reservedCharacterSheets[_characterSheetTypeIds[i]], 'Not enough reserve left for team' ); } require( (season1Posters * to.length) <= reservedSeason1Posters, 'Not enough reserve left for team' ); for (uint16 i = 0; i < to.length; i++) { for (uint16 j; j < _characterSheetTypeIds.length; j++) { characterSheetNFTContract.mintType(to[i], _characterSheetTypeIds[j], _characterSheetAmounts[j]); } if (season1Posters > 0 ) { posterNFTContract.mintType(to[i], 0, season1Posters); } } for (uint16 i; i < _characterSheetTypeIds.length; i++) { reservedCharacterSheets[_characterSheetTypeIds[i]] -= uint16(_characterSheetAmounts[i] * to.length); } reservedSeason1Posters -= uint16(season1Posters * to.length); } function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"_initialBaseURI","type":"string"},{"internalType":"address","name":"_openSeaProxyRegistryAddress","type":"address"},{"internalType":"address[]","name":"_minters","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllOwnersHaveBeenSet","type":"error"},{"inputs":[],"name":"AllPostersOfTypeMinted","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"BurnCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"InvalidPurchasePosterTypeId","type":"error"},{"inputs":[],"name":"InvalidUpdatePosterLengthsDontMatch","type":"error"},{"inputs":[],"name":"InvalidUpdatePosterTypeId","type":"error"},{"inputs":[],"name":"MintToDeadAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NoPosterMintAmountProvided","type":"error"},{"inputs":[],"name":"NoTokensMintedYet","type":"error"},{"inputs":[],"name":"OnlyMintersCanMintPosters","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"PosterTypeQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"QuantityMustBeNonZero","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToDeadAddress","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"TransferBatch","type":"event"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint16","name":"maxPosters","type":"uint16"}],"name":"addPoster","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","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":[{"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":"to","type":"address"},{"components":[{"internalType":"uint16","name":"posterTypeId","type":"uint16"},{"internalType":"uint16","name":"amount","type":"uint16"}],"internalType":"struct ApeSquadPosterNFT.PosterPurchase[]","name":"posterPurchases","type":"tuple[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"posterTypeId","type":"uint16"},{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"mintType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openSeaProxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"posterRarity","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"posterTypeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"posterTypes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint16","name":"maxPosters","type":"uint16"},{"internalType":"uint16","name":"minted","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"posterTypeId","type":"uint16"}],"name":"postersLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setMinters","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":"tokenId","type":"uint256"}],"name":"tokenPosterType","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint16[]","name":"posterTypeIds","type":"uint16[]"},{"internalType":"uint16[]","name":"maxPosters","type":"uint16[]"}],"name":"updateMaxPosters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"updateOwners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"posterTypeIds","type":"uint16[]"},{"internalType":"string[]","name":"names","type":"string[]"}],"name":"updatePosterNames","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"rarity","type":"uint8"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"updateRarities","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001805560016008553480156200001a57600080fd5b506040516200364e3803806200364e8339810160408190526200003d91620003e9565b84846200004a3362000151565b81516200005f90600290602085019062000248565b5080516200007590600390602084019062000248565b505083516200008d9150600990602086019062000248565b50600a80546001600160a01b0319166001600160a01b03841617905560005b815181101562000118576001600b6000848481518110620000d157620000d162000529565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806200010f816200053f565b915050620000ac565b50604080518082019091526008815267536561736f6e203160c01b602082015262000146906104e2620001a1565b5050505050620005a6565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051606081018252600091810182905283815261ffff8316602080830191909152600c80546001810182559352815180519293849360029091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701926200021092849291019062000248565b5060208201516001909101805460409093015161ffff908116620100000263ffffffff19909416921691909117919091179055505050565b828054620002569062000569565b90600052602060002090601f0160209004810192826200027a5760008555620002c5565b82601f106200029557805160ff1916838001178555620002c5565b82800160010185558215620002c5579182015b82811115620002c5578251825591602001919060010190620002a8565b50620002d3929150620002d7565b5090565b5b80821115620002d35760008155600101620002d8565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200032f576200032f620002ee565b604052919050565b600082601f8301126200034957600080fd5b81516001600160401b03811115620003655762000365620002ee565b60206200037b601f8301601f1916820162000304565b82815285828487010111156200039057600080fd5b60005b83811015620003b057858101830151828201840152820162000393565b83811115620003c25760008385840101525b5095945050505050565b80516001600160a01b0381168114620003e457600080fd5b919050565b600080600080600060a086880312156200040257600080fd5b85516001600160401b03808211156200041a57600080fd5b6200042889838a0162000337565b96506020915081880151818111156200044057600080fd5b6200044e8a828b0162000337565b9650506040880151818111156200046457600080fd5b620004728a828b0162000337565b9550506200048360608901620003cc565b93506080880151818111156200049857600080fd5b8801601f81018a13620004aa57600080fd5b805182811115620004bf57620004bf620002ee565b8060051b9250620004d284840162000304565b818152928201840192848101908c851115620004ed57600080fd5b928501925b8484101562000516576200050684620003cc565b82529285019290850190620004f2565b8096505050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200056257634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c908216806200057e57607f821691505b60208210811415620005a057634e487b7160e01b600052602260045260246000fd5b50919050565b61309880620005b66000396000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c8063715018a61161017b578063c6b2dd9f116100d8578063df7dd9751161008c578063f2fde38b11610071578063f2fde38b146105b9578063f46eccc4146105cc578063f7a885c9146105ef57600080fd5b8063df7dd97514610593578063e985e9c5146105a657600080fd5b8063c87b56dd116100bd578063c87b56dd1461056f578063cd86d6a014610582578063d7224ba01461058a57600080fd5b8063c6b2dd9f14610549578063c83072381461055c57600080fd5b80639b9cf33b1161012f578063b7f47d3211610114578063b7f47d3214610510578063b88d4fde14610523578063c5bdcb9f1461053657600080fd5b80639b9cf33b146104ea578063a22cb465146104fd57600080fd5b80638da5cb5b116101605780638da5cb5b146104be5780638f5ea8da146104cf57806395d89b41146104e257600080fd5b8063715018a6146104a35780638754101c146104ab57600080fd5b806330f685f01161022957806361a70469116101dd5780636b4ae1f6116101c25780636b4ae1f6146104755780636c0360eb1461048857806370a082311461049057600080fd5b806361a704691461044f5780636352211e1461046257600080fd5b806342966c681161020e57806342966c6814610416578063534778891461042957806355f804b31461043c57600080fd5b806330f685f0146103f057806342842e0e1461040357600080fd5b806318160ddd1161028057806323b872dd1161026557806323b872dd146103a857806328d55c8c146103bb5780632ef7c967146103dd57600080fd5b806318160ddd1461037f57806318d9f85f1461039557600080fd5b8063081812fc116102b1578063081812fc1461030a578063095ea7b3146103355780630de64d6b1461034a57600080fd5b806301ffc9a7146102cd57806306fdde03146102f5575b600080fd5b6102e06102db36600461255a565b610602565b60405190151581526020015b60405180910390f35b6102fd610654565b6040516102ec91906125d6565b61031d6103183660046125e9565b6106e6565b6040516001600160a01b0390911681526020016102ec565b610348610343366004612617565b61072a565b005b61036d6103583660046125e9565b600e6020526000908152604090205460ff1681565b60405160ff90911681526020016102ec565b6103876107b8565b6040519081526020016102ec565b6103876103a336600461265a565b6107d0565b6103486103b6366004612675565b61084c565b6103ce6103c93660046125e9565b610857565b6040516102ec939291906126b6565b6103486103eb3660046126e4565b610921565b6103486103fe366004612775565b610aac565b610348610411366004612675565b610c15565b6103486104243660046125e9565b610c30565b6102fd6104373660046125e9565b610c63565b61034861044a366004612880565b610d54565b61034861045d366004612775565b610db3565b61031d6104703660046125e9565b610f24565b6103486104833660046128c9565b610f7d565b6102fd611006565b61038761049e366004612941565b611094565b6103486110d9565b6103486104b93660046129e5565b61112d565b6000546001600160a01b031661031d565b6103486104dd3660046129e5565b611223565b6102fd61123e565b6103486104f8366004612a47565b61124d565b61034861050b366004612a8c565b6112bd565b600a5461031d906001600160a01b031681565b610348610531366004612ae1565b611353565b610348610544366004612b4d565b611387565b6103486105573660046125e9565b6115ab565b61034861056a366004612bd5565b6115fc565b6102fd61057d3660046125e9565b6116b5565b600c54610387565b61038760085481565b6103486105a1366004612c20565b61173f565b6102e06105b4366004612c7b565b611892565b6103486105c7366004612941565b611953565b6102e06105da366004612941565b600b6020526000908152604090205460ff1681565b6103486105fd366004612cb4565b611a20565b60006001600160e01b031982166380ac58cd60e01b148061063357506001600160e01b03198216635b5e139f60e01b145b8061064e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461066390612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461068f90612d31565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050905090565b60006106f182611afa565b61070e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061073582610f24565b9050806001600160a01b0316836001600160a01b0316141561076a5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061078a57506107888133611892565b155b156107a8576040516367d9dca160e11b815260040160405180910390fd5b6107b3838383611b36565b505050565b60006107c561dead611094565b600180540303905090565b6000600c8261ffff16815481106107e9576107e9612d6c565b906000526020600020906002020160010160029054906101000a900461ffff16600c8361ffff168154811061082057610820612d6c565b6000918252602090912060016002909202010154610842919061ffff16612d98565b61ffff1692915050565b6107b3838383611b92565b600c818154811061086757600080fd5b906000526020600020906002020160009150905080600001805461088a90612d31565b80601f01602080910402602001604051908101604052809291908181526020018280546108b690612d31565b80156109035780601f106108d857610100808354040283529160200191610903565b820191906000526020600020905b8154815290600101906020018083116108e657829003601f168201915b5050506001909301549192505061ffff808216916201000090041683565b336000908152600b602052604090205460ff1661095157604051636eb6d98760e01b815260040160405180910390fd5b61ffff8116610973576040516331d1901d60e21b815260040160405180910390fd5b600154600c5461ffff84161061099c57604051630f5fbd9f60e01b815260040160405180910390fd5b6109a5836107d0565b8261ffff1611156109c957604051631855313360e01b815260040160405180910390fd5b81600c8461ffff16815481106109e1576109e1612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff16610a0e9190612dbb565b92506101000a81548161ffff021916908361ffff16021790555060005b8261ffff168161ffff161015610a875783600d600084610a4a81612de1565b9550815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508080610a7f90612dfc565b915050610a2b565b50610aa6848361ffff1660405180602001604052806000815250611d64565b50505050565b6000546001600160a01b03163314610af95760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064015b60405180910390fd5b828114610b19576040516321d3252f60e21b815260040160405180910390fd5b60005b61ffff8116841115610c0e57600c54858561ffff8416818110610b4157610b41612d6c565b9050602002016020810190610b56919061265a565b61ffff1610610b78576040516330ad51cb60e01b815260040160405180910390fd5b82828261ffff16818110610b8e57610b8e612d6c565b9050602002810190610ba09190612e1e565b600c87878561ffff16818110610bb857610bb8612d6c565b9050602002016020810190610bcd919061265a565b61ffff1681548110610be157610be1612d6c565b60009182526020909120610bfb9360029092020191612437565b5080610c0681612dfc565b915050610b1c565b5050505050565b6107b383838360405180602001604052806000815250611353565b610c3a3382611d71565b610c575760405163871b97e160e01b815260040160405180910390fd5b610c6081611dc8565b50565b6060610c6e82611afa565b610c8b576040516331cbbc9760e01b815260040160405180910390fd5b6000828152600d6020526040902054600c8054909161ffff16908110610cb357610cb3612d6c565b90600052602060002090600202016000018054610ccf90612d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610cfb90612d31565b8015610d485780601f10610d1d57610100808354040283529160200191610d48565b820191906000526020600020905b815481529060010190602001808311610d2b57829003601f168201915b50505050509050919050565b6000546001600160a01b03163314610d9c5760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b8051610daf9060099060208401906124bb565b5050565b6000546001600160a01b03163314610dfb5760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b828114610e1b576040516321d3252f60e21b815260040160405180910390fd5b60005b61ffff8116841115610c0e57600c54858561ffff8416818110610e4357610e43612d6c565b9050602002016020810190610e58919061265a565b61ffff1610610e7a576040516330ad51cb60e01b815260040160405180910390fd5b82828261ffff16818110610e9057610e90612d6c565b9050602002016020810190610ea5919061265a565b600c86868461ffff16818110610ebd57610ebd612d6c565b9050602002016020810190610ed2919061265a565b61ffff1681548110610ee657610ee6612d6c565b906000526020600020906002020160010160006101000a81548161ffff021916908361ffff1602179055508080610f1c90612dfc565b915050610e1e565b6000610f2f82611afa565b610f4c57604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600460205260409020546001600160a01b031691508115610f745750919050565b60001901610f4e565b6000546001600160a01b03163314610fc55760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b6107b383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250611ecc915050565b6009805461101390612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461103f90612d31565b801561108c5780601f106110615761010080835404028352916020019161108c565b820191906000526020600020905b81548152906001019060200180831161106f57829003601f168201915b505050505081565b60006001600160a01b0382166110bd576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b031633146111215760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b61112b6000611f71565b565b60005b81518161ffff1610156111c257611169335b838361ffff168151811061115857611158612d6c565b602002602001015161ffff16611d71565b61118657604051632ce44b5f60e11b815260040160405180910390fd5b6111b28484848461ffff16815181106111a1576111a1612d6c565b602002602001015161ffff1661084c565b6111bb81612dfc565b9050611130565b50816001600160a01b0316836001600160a01b03166111de3390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d204846040516112169190612e65565b60405180910390a4505050565b6107b383838360405180602001604052806000815250611a20565b60606003805461066390612d31565b60005b81518161ffff161015610daf5761126633611142565b6112835760405163871b97e160e01b815260040160405180910390fd5b6112ad828261ffff168151811061129c5761129c612d6c565b602002602001015161ffff16611dc8565b6112b681612dfc565b9050611250565b6001600160a01b0382163314156112e75760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61135e848484611b92565b61136a84848484611fc1565b610aa6576040516368d2bf6b60e11b815260040160405180910390fd5b336000908152600b602052604090205460ff166113b757604051636eb6d98760e01b815260040160405180910390fd5b600154600090815b61ffff811684111561157257600085858361ffff168181106113e3576113e3612d6c565b9050604002018036038101906113f99190612ead565b600c54815191925061ffff9091161061142557604051630f5fbd9f60e01b815260040160405180910390fd5b61145486868461ffff1681811061143e5761143e612d6c565b6103a3926020604090920201908101915061265a565b816020015161ffff16111561147c57604051631855313360e01b815260040160405180910390fd5b8060200151600c826000015161ffff168154811061149c5761149c612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff166114c99190612dbb565b92506101000a81548161ffff021916908361ffff160217905550806020015161ffff16846114f79190612f08565b935060005b816020015161ffff168161ffff16101561155d578151600d60008661152081612de1565b9750815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550808061155590612dfc565b9150506114fc565b5050808061156a90612dfc565b9150506113bf565b5081611591576040516331d1901d60e21b815260040160405180910390fd5b610c0e858360405180602001604052806000815250611d64565b6000546001600160a01b031633146115f35760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b610c60816120c0565b6000546001600160a01b031633146116445760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b60005b82811015610aa65781600b600086868581811061166657611666612d6c565b905060200201602081019061167b9190612941565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806116ad81612de1565b915050611647565b60606116c082611afa565b6116dd57604051630a14c4b560e41b815260040160405180910390fd5b6000600980546116ec90612d31565b905011611708576040518060200160405280600081525061064e565b6117106121da565b611719836121e9565b60405160200161172a929190612f20565b60405160208183030381529060405292915050565b6000546001600160a01b031633146117875760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b60ff831661180a5760005b81811015610aa6576001548383838181106117af576117af612d6c565b90506020020135106117c0576117f8565b600e60008484848181106117d6576117d6612d6c565b60209081029290920135835250810191909152604001600020805460ff191690555b8061180281612de1565b915050611792565b60005b81811015610aa65760015483838381811061182a5761182a612d6c565b905060200201351061183b57611880565b83600e600085858581811061185257611852612d6c565b90506020020135815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505b8061188a81612de1565b91505061180d565b600a5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119089190612f77565b6001600160a01b0316141561192157600191505061064e565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b6000546001600160a01b0316331461199b5760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b6001600160a01b038116611a175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610af0565b610c6081611f71565b60005b8251811015611a9857611a423384838151811061115857611158612d6c565b611a5f57604051632ce44b5f60e11b815260040160405180910390fd5b611a888585858481518110611a7657611a76612d6c565b602002602001015161ffff1685611353565b611a9181612de1565b9050611a23565b50826001600160a01b0316846001600160a01b0316611ab43390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d20485604051611aec9190612e65565b60405180910390a450505050565b60008082118015611b0c575060015482105b801561064e57506000828152600460205260409020546001600160a01b031661dead141592915050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b9d82610f24565b90506000336001600160a01b0383161480611bbd5750611bbd8233611892565b80611bd8575033611bcd846106e6565b6001600160a01b0316145b905080611bf857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b0316826001600160a01b031614611c295760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611c5057604051633a954ecd60e21b815260040160405180910390fd5b6001600160a01b03841661dead1415611c7c57604051630278d60f60e11b815260040160405180910390fd5b611c8860008484611b36565b6001600160a01b038086166000908152600560209081526040808320805460001901905587841680845281842080546001908101909155888552600490935281842080546001600160a01b0319169091179055908601808352912054909116611d1d57600154811015611d1d57600081815260046020526040902080546001600160a01b0319166001600160a01b0385161790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610c0e565b6107b383838360016122ff565b600080611d7d83610f24565b9050806001600160a01b0316846001600160a01b03161480611db85750836001600160a01b0316611dad846106e6565b6001600160a01b0316145b8061194b575061194b8185611892565b6000611dd382610f24565b9050611de160008383611b36565b6001600160a01b03808216600090815260056020908152604080832080546000190190557f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80546001908101909155868452600490925280832080546001600160a01b03191661dead179055908501808352912054909116611e8f57600154811015611e8f57600081815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60408051606081018252600091810182905283815261ffff8316602080830191909152600c80546001810182559352815180519293849360029091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70192611f399284929101906124bb565b5060208201516001909101805460409093015161ffff908116620100000263ffffffff19909416921691909117919091179055505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156120b557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612005903390899088908890600401612f94565b6020604051808303816000875af1925050508015612040575060408051601f3d908101601f1916820190925261203d91810190612fd0565b60015b61209b573d80801561206e576040519150601f19603f3d011682016040523d82523d6000602084013e612073565b606091505b508051612093576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061194b565b506001949350505050565b806120de576040516356be441560e01b815260040160405180910390fd5b600154600114156121025760405163c0367cab60e01b815260040160405180910390fd5b600854600154811061212757604051630a596e2160e21b815260040160405180910390fd5b60015482820160001981019110156121425750600154600019015b815b8181116121cf576000818152600460205260409020546001600160a01b031615801561218957506000818152600460205260409020546001600160a01b031661dead14155b156121c757600061219982610f24565b600083815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055505b600101612144565b506001016008555050565b60606009805461066390612d31565b60608161220d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612237578061222181612de1565b91506122309050600a83613003565b9150612211565b60008167ffffffffffffffff811115612252576122526127e1565b6040519080825280601f01601f19166020018201604052801561227c576020820181803683370190505b5090505b841561194b57612291600183613017565b915061229e600a8661302e565b6122a9906030612f08565b60f81b8183815181106122be576122be612d6c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506122f8600a86613003565b9450612280565b6001546001600160a01b03851661232857604051622e076360e81b815260040160405180910390fd5b6001600160a01b03851661dead141561235457604051631617320f60e01b815260040160405180910390fd5b836123725760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03851660008181526005602090815260408083208054890190558483526004909152812080546001600160a01b03191690921790915581905b8581101561242e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612422576124056000888488611fc1565b612422576040516368d2bf6b60e11b815260040160405180910390fd5b600191820191016123b2565b50600155610c0e565b82805461244390612d31565b90600052602060002090601f01602090048101928261246557600085556124ab565b82601f1061247e5782800160ff198235161785556124ab565b828001600101855582156124ab579182015b828111156124ab578235825591602001919060010190612490565b506124b792915061252f565b5090565b8280546124c790612d31565b90600052602060002090601f0160209004810192826124e957600085556124ab565b82601f1061250257805160ff19168380011785556124ab565b828001600101855582156124ab579182015b828111156124ab578251825591602001919060010190612514565b5b808211156124b75760008155600101612530565b6001600160e01b031981168114610c6057600080fd5b60006020828403121561256c57600080fd5b813561257781612544565b9392505050565b60005b83811015612599578181015183820152602001612581565b83811115610aa65750506000910152565b600081518084526125c281602086016020860161257e565b601f01601f19169290920160200192915050565b60208152600061257760208301846125aa565b6000602082840312156125fb57600080fd5b5035919050565b6001600160a01b0381168114610c6057600080fd5b6000806040838503121561262a57600080fd5b823561263581612602565b946020939093013593505050565b803561ffff8116811461265557600080fd5b919050565b60006020828403121561266c57600080fd5b61257782612643565b60008060006060848603121561268a57600080fd5b833561269581612602565b925060208401356126a581612602565b929592945050506040919091013590565b6060815260006126c960608301866125aa565b61ffff94851660208401529290931660409091015292915050565b6000806000606084860312156126f957600080fd5b833561270481612602565b925061271260208501612643565b915061272060408501612643565b90509250925092565b60008083601f84011261273b57600080fd5b50813567ffffffffffffffff81111561275357600080fd5b6020830191508360208260051b850101111561276e57600080fd5b9250929050565b6000806000806040858703121561278b57600080fd5b843567ffffffffffffffff808211156127a357600080fd5b6127af88838901612729565b909650945060208701359150808211156127c857600080fd5b506127d587828801612729565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612820576128206127e1565b604052919050565b600067ffffffffffffffff831115612842576128426127e1565b612855601f8401601f19166020016127f7565b905082815283838301111561286957600080fd5b828260208301376000602084830101529392505050565b60006020828403121561289257600080fd5b813567ffffffffffffffff8111156128a957600080fd5b8201601f810184136128ba57600080fd5b61194b84823560208401612828565b6000806000604084860312156128de57600080fd5b833567ffffffffffffffff808211156128f657600080fd5b818601915086601f83011261290a57600080fd5b81358181111561291957600080fd5b87602082850101111561292b57600080fd5b6020928301955093506127209186019050612643565b60006020828403121561295357600080fd5b813561257781612602565b600082601f83011261296f57600080fd5b8135602067ffffffffffffffff82111561298b5761298b6127e1565b8160051b61299a8282016127f7565b92835284810182019282810190878511156129b457600080fd5b83870192505b848310156129da576129cb83612643565b825291830191908301906129ba565b979650505050505050565b6000806000606084860312156129fa57600080fd5b8335612a0581612602565b92506020840135612a1581612602565b9150604084013567ffffffffffffffff811115612a3157600080fd5b612a3d8682870161295e565b9150509250925092565b600060208284031215612a5957600080fd5b813567ffffffffffffffff811115612a7057600080fd5b61194b8482850161295e565b8035801515811461265557600080fd5b60008060408385031215612a9f57600080fd5b8235612aaa81612602565b9150612ab860208401612a7c565b90509250929050565b600082601f830112612ad257600080fd5b61257783833560208501612828565b60008060008060808587031215612af757600080fd5b8435612b0281612602565b93506020850135612b1281612602565b925060408501359150606085013567ffffffffffffffff811115612b3557600080fd5b612b4187828801612ac1565b91505092959194509250565b600080600060408486031215612b6257600080fd5b8335612b6d81612602565b9250602084013567ffffffffffffffff80821115612b8a57600080fd5b818601915086601f830112612b9e57600080fd5b813581811115612bad57600080fd5b8760208260061b8501011115612bc257600080fd5b6020830194508093505050509250925092565b600080600060408486031215612bea57600080fd5b833567ffffffffffffffff811115612c0157600080fd5b612c0d86828701612729565b9094509250612720905060208501612a7c565b600080600060408486031215612c3557600080fd5b833560ff81168114612c4657600080fd5b9250602084013567ffffffffffffffff811115612c6257600080fd5b612c6e86828701612729565b9497909650939450505050565b60008060408385031215612c8e57600080fd5b8235612c9981612602565b91506020830135612ca981612602565b809150509250929050565b60008060008060808587031215612cca57600080fd5b8435612cd581612602565b93506020850135612ce581612602565b9250604085013567ffffffffffffffff80821115612d0257600080fd5b612d0e8883890161295e565b93506060870135915080821115612d2457600080fd5b50612b4187828801612ac1565b600181811c90821680612d4557607f821691505b60208210811415612d6657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600061ffff83811690831681811015612db357612db3612d82565b039392505050565b600061ffff808316818516808303821115612dd857612dd8612d82565b01949350505050565b6000600019821415612df557612df5612d82565b5060010190565b600061ffff80831681811415612e1457612e14612d82565b6001019392505050565b6000808335601e19843603018112612e3557600080fd5b83018035915067ffffffffffffffff821115612e5057600080fd5b60200191503681900382131561276e57600080fd5b6020808252825182820181905260009190848201906040850190845b81811015612ea157835161ffff1683529284019291840191600101612e81565b50909695505050505050565b600060408284031215612ebf57600080fd5b6040516040810181811067ffffffffffffffff82111715612ee257612ee26127e1565b604052612eee83612643565b8152612efc60208401612643565b60208201529392505050565b60008219821115612f1b57612f1b612d82565b500190565b60008351612f3281846020880161257e565b835190830190612f4681836020880161257e565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600060208284031215612f8957600080fd5b815161257781612602565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612fc660808301846125aa565b9695505050505050565b600060208284031215612fe257600080fd5b815161257781612544565b634e487b7160e01b600052601260045260246000fd5b60008261301257613012612fed565b500490565b60008282101561302957613029612d82565b500390565b60008261303d5761303d612fed565b50069056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122070518d2da60eaf9c13cddb2780d4621fc402a79caf02f808fb199df4bcfafba864736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000008417065537175616400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044150455300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f68747470733a2f2f717478613465377a786b2e657865637574652d6170692e75732d656173742d312e616d617a6f6e6177732e636f6d2f706f73746572732f0000000000000000000000000000000000000000000000000000000000000000010000000000000000000000006ab6b9c8ed19a464722198e8f4ef113e10c298b8
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102c85760003560e01c8063715018a61161017b578063c6b2dd9f116100d8578063df7dd9751161008c578063f2fde38b11610071578063f2fde38b146105b9578063f46eccc4146105cc578063f7a885c9146105ef57600080fd5b8063df7dd97514610593578063e985e9c5146105a657600080fd5b8063c87b56dd116100bd578063c87b56dd1461056f578063cd86d6a014610582578063d7224ba01461058a57600080fd5b8063c6b2dd9f14610549578063c83072381461055c57600080fd5b80639b9cf33b1161012f578063b7f47d3211610114578063b7f47d3214610510578063b88d4fde14610523578063c5bdcb9f1461053657600080fd5b80639b9cf33b146104ea578063a22cb465146104fd57600080fd5b80638da5cb5b116101605780638da5cb5b146104be5780638f5ea8da146104cf57806395d89b41146104e257600080fd5b8063715018a6146104a35780638754101c146104ab57600080fd5b806330f685f01161022957806361a70469116101dd5780636b4ae1f6116101c25780636b4ae1f6146104755780636c0360eb1461048857806370a082311461049057600080fd5b806361a704691461044f5780636352211e1461046257600080fd5b806342966c681161020e57806342966c6814610416578063534778891461042957806355f804b31461043c57600080fd5b806330f685f0146103f057806342842e0e1461040357600080fd5b806318160ddd1161028057806323b872dd1161026557806323b872dd146103a857806328d55c8c146103bb5780632ef7c967146103dd57600080fd5b806318160ddd1461037f57806318d9f85f1461039557600080fd5b8063081812fc116102b1578063081812fc1461030a578063095ea7b3146103355780630de64d6b1461034a57600080fd5b806301ffc9a7146102cd57806306fdde03146102f5575b600080fd5b6102e06102db36600461255a565b610602565b60405190151581526020015b60405180910390f35b6102fd610654565b6040516102ec91906125d6565b61031d6103183660046125e9565b6106e6565b6040516001600160a01b0390911681526020016102ec565b610348610343366004612617565b61072a565b005b61036d6103583660046125e9565b600e6020526000908152604090205460ff1681565b60405160ff90911681526020016102ec565b6103876107b8565b6040519081526020016102ec565b6103876103a336600461265a565b6107d0565b6103486103b6366004612675565b61084c565b6103ce6103c93660046125e9565b610857565b6040516102ec939291906126b6565b6103486103eb3660046126e4565b610921565b6103486103fe366004612775565b610aac565b610348610411366004612675565b610c15565b6103486104243660046125e9565b610c30565b6102fd6104373660046125e9565b610c63565b61034861044a366004612880565b610d54565b61034861045d366004612775565b610db3565b61031d6104703660046125e9565b610f24565b6103486104833660046128c9565b610f7d565b6102fd611006565b61038761049e366004612941565b611094565b6103486110d9565b6103486104b93660046129e5565b61112d565b6000546001600160a01b031661031d565b6103486104dd3660046129e5565b611223565b6102fd61123e565b6103486104f8366004612a47565b61124d565b61034861050b366004612a8c565b6112bd565b600a5461031d906001600160a01b031681565b610348610531366004612ae1565b611353565b610348610544366004612b4d565b611387565b6103486105573660046125e9565b6115ab565b61034861056a366004612bd5565b6115fc565b6102fd61057d3660046125e9565b6116b5565b600c54610387565b61038760085481565b6103486105a1366004612c20565b61173f565b6102e06105b4366004612c7b565b611892565b6103486105c7366004612941565b611953565b6102e06105da366004612941565b600b6020526000908152604090205460ff1681565b6103486105fd366004612cb4565b611a20565b60006001600160e01b031982166380ac58cd60e01b148061063357506001600160e01b03198216635b5e139f60e01b145b8061064e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461066390612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461068f90612d31565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050905090565b60006106f182611afa565b61070e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061073582610f24565b9050806001600160a01b0316836001600160a01b0316141561076a5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061078a57506107888133611892565b155b156107a8576040516367d9dca160e11b815260040160405180910390fd5b6107b3838383611b36565b505050565b60006107c561dead611094565b600180540303905090565b6000600c8261ffff16815481106107e9576107e9612d6c565b906000526020600020906002020160010160029054906101000a900461ffff16600c8361ffff168154811061082057610820612d6c565b6000918252602090912060016002909202010154610842919061ffff16612d98565b61ffff1692915050565b6107b3838383611b92565b600c818154811061086757600080fd5b906000526020600020906002020160009150905080600001805461088a90612d31565b80601f01602080910402602001604051908101604052809291908181526020018280546108b690612d31565b80156109035780601f106108d857610100808354040283529160200191610903565b820191906000526020600020905b8154815290600101906020018083116108e657829003601f168201915b5050506001909301549192505061ffff808216916201000090041683565b336000908152600b602052604090205460ff1661095157604051636eb6d98760e01b815260040160405180910390fd5b61ffff8116610973576040516331d1901d60e21b815260040160405180910390fd5b600154600c5461ffff84161061099c57604051630f5fbd9f60e01b815260040160405180910390fd5b6109a5836107d0565b8261ffff1611156109c957604051631855313360e01b815260040160405180910390fd5b81600c8461ffff16815481106109e1576109e1612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff16610a0e9190612dbb565b92506101000a81548161ffff021916908361ffff16021790555060005b8261ffff168161ffff161015610a875783600d600084610a4a81612de1565b9550815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508080610a7f90612dfc565b915050610a2b565b50610aa6848361ffff1660405180602001604052806000815250611d64565b50505050565b6000546001600160a01b03163314610af95760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064015b60405180910390fd5b828114610b19576040516321d3252f60e21b815260040160405180910390fd5b60005b61ffff8116841115610c0e57600c54858561ffff8416818110610b4157610b41612d6c565b9050602002016020810190610b56919061265a565b61ffff1610610b78576040516330ad51cb60e01b815260040160405180910390fd5b82828261ffff16818110610b8e57610b8e612d6c565b9050602002810190610ba09190612e1e565b600c87878561ffff16818110610bb857610bb8612d6c565b9050602002016020810190610bcd919061265a565b61ffff1681548110610be157610be1612d6c565b60009182526020909120610bfb9360029092020191612437565b5080610c0681612dfc565b915050610b1c565b5050505050565b6107b383838360405180602001604052806000815250611353565b610c3a3382611d71565b610c575760405163871b97e160e01b815260040160405180910390fd5b610c6081611dc8565b50565b6060610c6e82611afa565b610c8b576040516331cbbc9760e01b815260040160405180910390fd5b6000828152600d6020526040902054600c8054909161ffff16908110610cb357610cb3612d6c565b90600052602060002090600202016000018054610ccf90612d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610cfb90612d31565b8015610d485780601f10610d1d57610100808354040283529160200191610d48565b820191906000526020600020905b815481529060010190602001808311610d2b57829003601f168201915b50505050509050919050565b6000546001600160a01b03163314610d9c5760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b8051610daf9060099060208401906124bb565b5050565b6000546001600160a01b03163314610dfb5760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b828114610e1b576040516321d3252f60e21b815260040160405180910390fd5b60005b61ffff8116841115610c0e57600c54858561ffff8416818110610e4357610e43612d6c565b9050602002016020810190610e58919061265a565b61ffff1610610e7a576040516330ad51cb60e01b815260040160405180910390fd5b82828261ffff16818110610e9057610e90612d6c565b9050602002016020810190610ea5919061265a565b600c86868461ffff16818110610ebd57610ebd612d6c565b9050602002016020810190610ed2919061265a565b61ffff1681548110610ee657610ee6612d6c565b906000526020600020906002020160010160006101000a81548161ffff021916908361ffff1602179055508080610f1c90612dfc565b915050610e1e565b6000610f2f82611afa565b610f4c57604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600460205260409020546001600160a01b031691508115610f745750919050565b60001901610f4e565b6000546001600160a01b03163314610fc55760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b6107b383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250611ecc915050565b6009805461101390612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461103f90612d31565b801561108c5780601f106110615761010080835404028352916020019161108c565b820191906000526020600020905b81548152906001019060200180831161106f57829003601f168201915b505050505081565b60006001600160a01b0382166110bd576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b031633146111215760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b61112b6000611f71565b565b60005b81518161ffff1610156111c257611169335b838361ffff168151811061115857611158612d6c565b602002602001015161ffff16611d71565b61118657604051632ce44b5f60e11b815260040160405180910390fd5b6111b28484848461ffff16815181106111a1576111a1612d6c565b602002602001015161ffff1661084c565b6111bb81612dfc565b9050611130565b50816001600160a01b0316836001600160a01b03166111de3390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d204846040516112169190612e65565b60405180910390a4505050565b6107b383838360405180602001604052806000815250611a20565b60606003805461066390612d31565b60005b81518161ffff161015610daf5761126633611142565b6112835760405163871b97e160e01b815260040160405180910390fd5b6112ad828261ffff168151811061129c5761129c612d6c565b602002602001015161ffff16611dc8565b6112b681612dfc565b9050611250565b6001600160a01b0382163314156112e75760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61135e848484611b92565b61136a84848484611fc1565b610aa6576040516368d2bf6b60e11b815260040160405180910390fd5b336000908152600b602052604090205460ff166113b757604051636eb6d98760e01b815260040160405180910390fd5b600154600090815b61ffff811684111561157257600085858361ffff168181106113e3576113e3612d6c565b9050604002018036038101906113f99190612ead565b600c54815191925061ffff9091161061142557604051630f5fbd9f60e01b815260040160405180910390fd5b61145486868461ffff1681811061143e5761143e612d6c565b6103a3926020604090920201908101915061265a565b816020015161ffff16111561147c57604051631855313360e01b815260040160405180910390fd5b8060200151600c826000015161ffff168154811061149c5761149c612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff166114c99190612dbb565b92506101000a81548161ffff021916908361ffff160217905550806020015161ffff16846114f79190612f08565b935060005b816020015161ffff168161ffff16101561155d578151600d60008661152081612de1565b9750815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550808061155590612dfc565b9150506114fc565b5050808061156a90612dfc565b9150506113bf565b5081611591576040516331d1901d60e21b815260040160405180910390fd5b610c0e858360405180602001604052806000815250611d64565b6000546001600160a01b031633146115f35760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b610c60816120c0565b6000546001600160a01b031633146116445760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b60005b82811015610aa65781600b600086868581811061166657611666612d6c565b905060200201602081019061167b9190612941565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806116ad81612de1565b915050611647565b60606116c082611afa565b6116dd57604051630a14c4b560e41b815260040160405180910390fd5b6000600980546116ec90612d31565b905011611708576040518060200160405280600081525061064e565b6117106121da565b611719836121e9565b60405160200161172a929190612f20565b60405160208183030381529060405292915050565b6000546001600160a01b031633146117875760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b60ff831661180a5760005b81811015610aa6576001548383838181106117af576117af612d6c565b90506020020135106117c0576117f8565b600e60008484848181106117d6576117d6612d6c565b60209081029290920135835250810191909152604001600020805460ff191690555b8061180281612de1565b915050611792565b60005b81811015610aa65760015483838381811061182a5761182a612d6c565b905060200201351061183b57611880565b83600e600085858581811061185257611852612d6c565b90506020020135815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505b8061188a81612de1565b91505061180d565b600a5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119089190612f77565b6001600160a01b0316141561192157600191505061064e565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b6000546001600160a01b0316331461199b5760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b6001600160a01b038116611a175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610af0565b610c6081611f71565b60005b8251811015611a9857611a423384838151811061115857611158612d6c565b611a5f57604051632ce44b5f60e11b815260040160405180910390fd5b611a888585858481518110611a7657611a76612d6c565b602002602001015161ffff1685611353565b611a9181612de1565b9050611a23565b50826001600160a01b0316846001600160a01b0316611ab43390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d20485604051611aec9190612e65565b60405180910390a450505050565b60008082118015611b0c575060015482105b801561064e57506000828152600460205260409020546001600160a01b031661dead141592915050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b9d82610f24565b90506000336001600160a01b0383161480611bbd5750611bbd8233611892565b80611bd8575033611bcd846106e6565b6001600160a01b0316145b905080611bf857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b0316826001600160a01b031614611c295760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611c5057604051633a954ecd60e21b815260040160405180910390fd5b6001600160a01b03841661dead1415611c7c57604051630278d60f60e11b815260040160405180910390fd5b611c8860008484611b36565b6001600160a01b038086166000908152600560209081526040808320805460001901905587841680845281842080546001908101909155888552600490935281842080546001600160a01b0319169091179055908601808352912054909116611d1d57600154811015611d1d57600081815260046020526040902080546001600160a01b0319166001600160a01b0385161790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610c0e565b6107b383838360016122ff565b600080611d7d83610f24565b9050806001600160a01b0316846001600160a01b03161480611db85750836001600160a01b0316611dad846106e6565b6001600160a01b0316145b8061194b575061194b8185611892565b6000611dd382610f24565b9050611de160008383611b36565b6001600160a01b03808216600090815260056020908152604080832080546000190190557f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80546001908101909155868452600490925280832080546001600160a01b03191661dead179055908501808352912054909116611e8f57600154811015611e8f57600081815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60408051606081018252600091810182905283815261ffff8316602080830191909152600c80546001810182559352815180519293849360029091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70192611f399284929101906124bb565b5060208201516001909101805460409093015161ffff908116620100000263ffffffff19909416921691909117919091179055505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156120b557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612005903390899088908890600401612f94565b6020604051808303816000875af1925050508015612040575060408051601f3d908101601f1916820190925261203d91810190612fd0565b60015b61209b573d80801561206e576040519150601f19603f3d011682016040523d82523d6000602084013e612073565b606091505b508051612093576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061194b565b506001949350505050565b806120de576040516356be441560e01b815260040160405180910390fd5b600154600114156121025760405163c0367cab60e01b815260040160405180910390fd5b600854600154811061212757604051630a596e2160e21b815260040160405180910390fd5b60015482820160001981019110156121425750600154600019015b815b8181116121cf576000818152600460205260409020546001600160a01b031615801561218957506000818152600460205260409020546001600160a01b031661dead14155b156121c757600061219982610f24565b600083815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055505b600101612144565b506001016008555050565b60606009805461066390612d31565b60608161220d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612237578061222181612de1565b91506122309050600a83613003565b9150612211565b60008167ffffffffffffffff811115612252576122526127e1565b6040519080825280601f01601f19166020018201604052801561227c576020820181803683370190505b5090505b841561194b57612291600183613017565b915061229e600a8661302e565b6122a9906030612f08565b60f81b8183815181106122be576122be612d6c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506122f8600a86613003565b9450612280565b6001546001600160a01b03851661232857604051622e076360e81b815260040160405180910390fd5b6001600160a01b03851661dead141561235457604051631617320f60e01b815260040160405180910390fd5b836123725760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03851660008181526005602090815260408083208054890190558483526004909152812080546001600160a01b03191690921790915581905b8581101561242e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612422576124056000888488611fc1565b612422576040516368d2bf6b60e11b815260040160405180910390fd5b600191820191016123b2565b50600155610c0e565b82805461244390612d31565b90600052602060002090601f01602090048101928261246557600085556124ab565b82601f1061247e5782800160ff198235161785556124ab565b828001600101855582156124ab579182015b828111156124ab578235825591602001919060010190612490565b506124b792915061252f565b5090565b8280546124c790612d31565b90600052602060002090601f0160209004810192826124e957600085556124ab565b82601f1061250257805160ff19168380011785556124ab565b828001600101855582156124ab579182015b828111156124ab578251825591602001919060010190612514565b5b808211156124b75760008155600101612530565b6001600160e01b031981168114610c6057600080fd5b60006020828403121561256c57600080fd5b813561257781612544565b9392505050565b60005b83811015612599578181015183820152602001612581565b83811115610aa65750506000910152565b600081518084526125c281602086016020860161257e565b601f01601f19169290920160200192915050565b60208152600061257760208301846125aa565b6000602082840312156125fb57600080fd5b5035919050565b6001600160a01b0381168114610c6057600080fd5b6000806040838503121561262a57600080fd5b823561263581612602565b946020939093013593505050565b803561ffff8116811461265557600080fd5b919050565b60006020828403121561266c57600080fd5b61257782612643565b60008060006060848603121561268a57600080fd5b833561269581612602565b925060208401356126a581612602565b929592945050506040919091013590565b6060815260006126c960608301866125aa565b61ffff94851660208401529290931660409091015292915050565b6000806000606084860312156126f957600080fd5b833561270481612602565b925061271260208501612643565b915061272060408501612643565b90509250925092565b60008083601f84011261273b57600080fd5b50813567ffffffffffffffff81111561275357600080fd5b6020830191508360208260051b850101111561276e57600080fd5b9250929050565b6000806000806040858703121561278b57600080fd5b843567ffffffffffffffff808211156127a357600080fd5b6127af88838901612729565b909650945060208701359150808211156127c857600080fd5b506127d587828801612729565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612820576128206127e1565b604052919050565b600067ffffffffffffffff831115612842576128426127e1565b612855601f8401601f19166020016127f7565b905082815283838301111561286957600080fd5b828260208301376000602084830101529392505050565b60006020828403121561289257600080fd5b813567ffffffffffffffff8111156128a957600080fd5b8201601f810184136128ba57600080fd5b61194b84823560208401612828565b6000806000604084860312156128de57600080fd5b833567ffffffffffffffff808211156128f657600080fd5b818601915086601f83011261290a57600080fd5b81358181111561291957600080fd5b87602082850101111561292b57600080fd5b6020928301955093506127209186019050612643565b60006020828403121561295357600080fd5b813561257781612602565b600082601f83011261296f57600080fd5b8135602067ffffffffffffffff82111561298b5761298b6127e1565b8160051b61299a8282016127f7565b92835284810182019282810190878511156129b457600080fd5b83870192505b848310156129da576129cb83612643565b825291830191908301906129ba565b979650505050505050565b6000806000606084860312156129fa57600080fd5b8335612a0581612602565b92506020840135612a1581612602565b9150604084013567ffffffffffffffff811115612a3157600080fd5b612a3d8682870161295e565b9150509250925092565b600060208284031215612a5957600080fd5b813567ffffffffffffffff811115612a7057600080fd5b61194b8482850161295e565b8035801515811461265557600080fd5b60008060408385031215612a9f57600080fd5b8235612aaa81612602565b9150612ab860208401612a7c565b90509250929050565b600082601f830112612ad257600080fd5b61257783833560208501612828565b60008060008060808587031215612af757600080fd5b8435612b0281612602565b93506020850135612b1281612602565b925060408501359150606085013567ffffffffffffffff811115612b3557600080fd5b612b4187828801612ac1565b91505092959194509250565b600080600060408486031215612b6257600080fd5b8335612b6d81612602565b9250602084013567ffffffffffffffff80821115612b8a57600080fd5b818601915086601f830112612b9e57600080fd5b813581811115612bad57600080fd5b8760208260061b8501011115612bc257600080fd5b6020830194508093505050509250925092565b600080600060408486031215612bea57600080fd5b833567ffffffffffffffff811115612c0157600080fd5b612c0d86828701612729565b9094509250612720905060208501612a7c565b600080600060408486031215612c3557600080fd5b833560ff81168114612c4657600080fd5b9250602084013567ffffffffffffffff811115612c6257600080fd5b612c6e86828701612729565b9497909650939450505050565b60008060408385031215612c8e57600080fd5b8235612c9981612602565b91506020830135612ca981612602565b809150509250929050565b60008060008060808587031215612cca57600080fd5b8435612cd581612602565b93506020850135612ce581612602565b9250604085013567ffffffffffffffff80821115612d0257600080fd5b612d0e8883890161295e565b93506060870135915080821115612d2457600080fd5b50612b4187828801612ac1565b600181811c90821680612d4557607f821691505b60208210811415612d6657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600061ffff83811690831681811015612db357612db3612d82565b039392505050565b600061ffff808316818516808303821115612dd857612dd8612d82565b01949350505050565b6000600019821415612df557612df5612d82565b5060010190565b600061ffff80831681811415612e1457612e14612d82565b6001019392505050565b6000808335601e19843603018112612e3557600080fd5b83018035915067ffffffffffffffff821115612e5057600080fd5b60200191503681900382131561276e57600080fd5b6020808252825182820181905260009190848201906040850190845b81811015612ea157835161ffff1683529284019291840191600101612e81565b50909695505050505050565b600060408284031215612ebf57600080fd5b6040516040810181811067ffffffffffffffff82111715612ee257612ee26127e1565b604052612eee83612643565b8152612efc60208401612643565b60208201529392505050565b60008219821115612f1b57612f1b612d82565b500190565b60008351612f3281846020880161257e565b835190830190612f4681836020880161257e565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600060208284031215612f8957600080fd5b815161257781612602565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612fc660808301846125aa565b9695505050505050565b600060208284031215612fe257600080fd5b815161257781612544565b634e487b7160e01b600052601260045260246000fd5b60008261301257613012612fed565b500490565b60008282101561302957613029612d82565b500390565b60008261303d5761303d612fed565b50069056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122070518d2da60eaf9c13cddb2780d4621fc402a79caf02f808fb199df4bcfafba864736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000008417065537175616400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044150455300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f68747470733a2f2f717478613465377a786b2e657865637574652d6170692e75732d656173742d312e616d617a6f6e6177732e636f6d2f706f73746572732f0000000000000000000000000000000000000000000000000000000000000000010000000000000000000000006ab6b9c8ed19a464722198e8f4ef113e10c298b8
-----Decoded View---------------
Arg [0] : name_ (string): ApeSquad
Arg [1] : symbol_ (string): APES
Arg [2] : _initialBaseURI (string): https://qtxa4e7zxk.execute-api.us-east-1.amazonaws.com/posters/
Arg [3] : _openSeaProxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [4] : _minters (address[]): 0x6AB6B9C8ed19A464722198E8f4ef113E10c298B8
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 4170655371756164000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 4150455300000000000000000000000000000000000000000000000000000000
Arg [9] : 000000000000000000000000000000000000000000000000000000000000003f
Arg [10] : 68747470733a2f2f717478613465377a786b2e657865637574652d6170692e75
Arg [11] : 732d656173742d312e616d617a6f6e6177732e636f6d2f706f73746572732f00
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [13] : 0000000000000000000000006ab6b9c8ed19a464722198e8f4ef113e10c298b8
Deployed Bytecode Sourcemap
53744:7755:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25389:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;25389:305:0;;;;;;;;26488:100;;;:::i;:::-;;;;;;;:::i;27965:212::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:55:1;;;1674:74;;1662:2;1647:18;27965:212:0;1528:226:1;27554:345:0;;;;;;:::i;:::-;;:::i;:::-;;54576:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2410:4:1;2398:17;;;2380:36;;2368:2;2353:18;54576:45:0;2238:184:1;25028:289:0;;;:::i;:::-;;;2573:25:1;;;2561:2;2546:18;25028:289:0;2427:177:1;55308:169:0;;;;;;:::i;:::-;;:::i;28838:170::-;;;;;;:::i;:::-;;:::i;54347:31::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;58151:656::-;;;;;;:::i;:::-;;:::i;59757:432::-;;;;;;:::i;:::-;;:::i;29079:185::-;;;;;;:::i;:::-;;:::i;41292:176::-;;;;;;:::i;:::-;;:::i;55559:229::-;;;;;;:::i;:::-;;:::i;58882:106::-;;;;;;:::i;:::-;;:::i;60251:452::-;;;;;;:::i;:::-;;:::i;26014:407::-;;;;;;:::i;:::-;;:::i;59572:126::-;;;;;;:::i;:::-;;:::i;54147:21::-;;;:::i;25758:194::-;;;;;;:::i;:::-;;:::i;2713:103::-;;;:::i;42762:427::-;;;;;;:::i;:::-;;:::i;2062:87::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;2062:87;;43274:196;;;;;;:::i;:::-;;:::i;26657:104::-;;;:::i;41829:273::-;;;;;;:::i;:::-;;:::i;28249:287::-;;;;;;:::i;:::-;;:::i;54215:42::-;;;;;-1:-1:-1;;;;;54215:42:0;;;29335:316;;;;;;:::i;:::-;;:::i;57139:931::-;;;;;;:::i;:::-;;:::i;61390:106::-;;;;;;:::i;:::-;;:::i;59059:201::-;;;;;;:::i;:::-;;:::i;56677:381::-;;;;;;:::i;:::-;;:::i;55142:101::-;55217:11;:18;55142:101;;39575:43;;;;;;60785:521;;;;;;:::i;:::-;;:::i;55900:508::-;;;;;;:::i;:::-;;:::i;2971:201::-;;;;;;:::i;:::-;;:::i;54299:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43555:472;;;;;;:::i;:::-;;:::i;25389:305::-;25491:4;-1:-1:-1;;;;;;25528:40:0;;-1:-1:-1;;;25528:40:0;;:105;;-1:-1:-1;;;;;;;25585:48:0;;-1:-1:-1;;;25585:48:0;25528:105;:158;;;-1:-1:-1;;;;;;;;;;22804:40:0;;;25650:36;25508:178;25389:305;-1:-1:-1;;25389:305:0:o;26488:100::-;26542:13;26575:5;26568:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26488:100;:::o;27965:212::-;28041:7;28066:16;28074:7;28066;:16::i;:::-;28061:64;;28091:34;;-1:-1:-1;;;28091:34:0;;;;;;;;;;;28061:64;-1:-1:-1;28145:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28145:24:0;;27965:212::o;27554:345::-;27635:13;27651:16;27659:7;27651;:16::i;:::-;27635:32;;27688:5;-1:-1:-1;;;;;27682:11:0;:2;-1:-1:-1;;;;;27682:11:0;;27678:48;;;27702:24;;-1:-1:-1;;;27702:24:0;;;;;;;;;;;27678:48;860:10;-1:-1:-1;;;;;27743:21:0;;;;;;:63;;-1:-1:-1;27769:37:0;27786:5;860:10;55900:508;:::i;27769:37::-;27768:38;27743:63;27739:111;;;27815:35;;-1:-1:-1;;;27815:35:0;;;;;;;;;;;27739:111;27863:28;27872:2;27876:7;27885:5;27863:8;:28::i;:::-;27624:275;27554:345;;:::o;25028:289::-;25080:7;25274:20;24785:42;25274:9;:20::i;:::-;25269:1;25254:12;;:16;25253:41;25246:48;;25028:289;:::o;55308:169::-;55371:7;55437:11;55449:12;55437:25;;;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;;;;;;;;;;;55398:11;55410:12;55398:25;;;;;;;;;;:::i;:::-;;;;;;;;;:36;:25;;;;;:36;;:71;;;:36;;:71;:::i;:::-;55391:78;;;55308:169;-1:-1:-1;;55308:169:0:o;28838:170::-;28972:28;28982:4;28988:2;28992:7;28972:9;:28::i;54347:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54347:31:0;;;;;;;-1:-1:-1;;54347:31:0;;;;;;;;;;:::o;58151:656::-;58247:10;58239:19;;;;:7;:19;;;;;;;;58235:59;;58267:27;;-1:-1:-1;;;58267:27:0;;;;;;;;;;;58235:59;58322:11;;;58319:51;;58342:28;;-1:-1:-1;;;58342:28:0;;;;;;;;;;;58319:51;58401:12;;58443:11;:18;58427:34;;;;58424:75;;58470:29;;-1:-1:-1;;;58470:29:0;;;;;;;;;;;58424:75;58524:25;58536:12;58524:11;:25::i;:::-;58515:6;:34;;;58512:70;;;58558:24;;-1:-1:-1;;;58558:24:0;;;;;;;;;;;58512:70;58631:6;58595:11;58607:12;58595:25;;;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;;:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;58655:8;58650:104;58669:6;58665:10;;:1;:10;;;58650:104;;;58730:12;58697:19;:30;58717:9;;;;:::i;:::-;;;58697:30;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;58677:3;;;;;:::i;:::-;;;;58650:104;;;;58774:25;58784:2;58788:6;58774:25;;;;;;;;;;;;;;:9;:25::i;:::-;58224:583;58151:656;;;:::o;59757:432::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;;;;;;;;;59875:36;;::::1;59872:85;;59920:37;;-1:-1:-1::0;;;59920:37:0::1;;;;;;;;;;;59872:85;59975:8;59970:212;59985:24;::::0;::::1;::::0;-1:-1:-1;59970:212:0::1;;;60054:11;:18:::0;60034:13;;:16:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:38;;;60031:77;;60081:27;;-1:-1:-1::0;;;60081:27:0::1;;;;;;;;;;;60031:77;60162:5;;60168:1;60162:8;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;60125:11;60137:13;;60151:1;60137:16;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;60125:29;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:45:::1;::::0;:29:::1;::::0;;::::1;;::::0;:45:::1;:::i;:::-;-1:-1:-1::0;60011:3:0;::::1;::::0;::::1;:::i;:::-;;;;59970:212;;;;59757:432:::0;;;;:::o;29079:185::-;29217:39;29234:4;29240:2;29244:7;29217:39;;;;;;;;;;;;:16;:39::i;41292:176::-;41354:41;860:10;41387:7;41354:18;:41::i;:::-;41349:86;;41404:31;;-1:-1:-1;;;41404:31:0;;;;;;;;;;;41349:86;41446:14;41452:7;41446:5;:14::i;:::-;41292:176;:::o;55559:229::-;55622:13;55653:16;55661:7;55653;:16::i;:::-;55648:66;;55678:36;;-1:-1:-1;;;55678:36:0;;;;;;;;;;;55648:66;55746:28;;;;:19;:28;;;;;;55734:11;:41;;:11;;55746:28;;;55734:41;;;;;;:::i;:::-;;;;;;;;;;;:46;;55727:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55559:229;;;:::o;58882:106::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;58959:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;58882:106:::0;:::o;60251:452::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;60373:41;;::::1;60370:90;;60423:37;;-1:-1:-1::0;;;60423:37:0::1;;;;;;;;;;;60370:90;60478:8;60473:223;60488:24;::::0;::::1;::::0;-1:-1:-1;60473:223:0::1;;;60557:11;:18:::0;60537:13;;:16:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:38;;;60534:77;;60584:27;;-1:-1:-1::0;;;60584:27:0::1;;;;;;;;;;;60534:77;60671:10;;60682:1;60671:13;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;60628:11;60640:13;;60654:1;60640:16;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;60628:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;:40;;;:56;;;;;;;;;;;;;;;;;;60514:3;;;;;:::i;:::-;;;;60473:223;;26014:407:::0;26086:13;26117:16;26125:7;26117;:16::i;:::-;26112:61;;26142:31;;-1:-1:-1;;;26142:31:0;;;;;;;;;;;26112:61;26231:7;26211:192;26276:13;;;;:7;:13;;;;;;-1:-1:-1;;;;;26276:13:0;;-1:-1:-1;26312:19:0;;26308:80;;26356:12;26014:407;;;:::o;26308:80::-;-1:-1:-1;;26241:6:0;26211:192;;59572:126;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;59662:28:::1;59673:4;;59662:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;59679:10:0;;-1:-1:-1;59662:10:0::1;::::0;-1:-1:-1;;59662:28:0:i:1;54147:21::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25758:194::-;25830:7;-1:-1:-1;;;;;25854:19:0;;25850:60;;25882:28;;-1:-1:-1;;;25882:28:0;;;;;;;;;;;25850:60;-1:-1:-1;;;;;;25928:16:0;;;;;:9;:16;;;;;;;25758:194::o;2713:103::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;2778:30:::1;2805:1;2778:18;:30::i;:::-;2713:103::o:0;42762:427::-;42906:8;42901:216;42924:8;:15;42920:1;:19;;;42901:216;;;42966:45;860:10;42985:12;42999:8;43008:1;42999:11;;;;;;;;;;:::i;:::-;;;;;;;42966:45;;:18;:45::i;:::-;42961:94;;43020:35;;-1:-1:-1;;;43020:35:0;;;;;;;;;;;42961:94;43070:35;43083:4;43089:2;43093:8;43102:1;43093:11;;;;;;;;;;:::i;:::-;;;;;;;43070:35;;:12;:35::i;:::-;42941:3;;;:::i;:::-;;;42901:216;;;;43168:2;-1:-1:-1;;;;;43134:47:0;43162:4;-1:-1:-1;;;;;43134:47:0;43148:12;860:10;;780:98;43148:12;-1:-1:-1;;;;;43134:47:0;;43172:8;43134:47;;;;;;:::i;:::-;;;;;;;;42762:427;;;:::o;43274:196::-;43417:45;43439:4;43445:2;43449:8;43417:45;;;;;;;;;;;;:21;:45::i;26657:104::-;26713:13;26746:7;26739:14;;;;;:::i;41829:273::-;41905:8;41900:195;41923:8;:15;41919:1;:19;;;41900:195;;;41965:45;860:10;41984:12;780:98;41965:45;41960:90;;42019:31;;-1:-1:-1;;;42019:31:0;;;;;;;;;;;41960:90;42065:18;42071:8;42080:1;42071:11;;;;;;;;;;:::i;:::-;;;;;;;42065:18;;:5;:18::i;:::-;41940:3;;;:::i;:::-;;;41900:195;;28249:287;-1:-1:-1;;;;;28348:24:0;;860:10;28348:24;28344:54;;;28381:17;;-1:-1:-1;;;28381:17:0;;;;;;;;;;;28344:54;860:10;28411:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;28411:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;28411:53:0;;;;;;;;;;28480:48;;540:41:1;;;28411:42:0;;860:10;28480:48;;513:18:1;28480:48:0;;;;;;;28249:287;;:::o;29335:316::-;29502:28;29512:4;29518:2;29522:7;29502:9;:28::i;:::-;29546:48;29569:4;29575:2;29579:7;29588:5;29546:22;:48::i;:::-;29541:102;;29603:40;;-1:-1:-1;;;29603:40:0;;;;;;;;;;;57139:931;57238:10;57230:19;;;;:7;:19;;;;;;;;57226:59;;57258:27;;-1:-1:-1;;;57258:27:0;;;;;;;;;;;57226:59;57349:12;;57298:20;;;57374:555;57389:26;;;;-1:-1:-1;57374:555:0;;;57437:23;57463:15;;57479:1;57463:18;;;;;;;;;:::i;:::-;;;;;;57437:44;;;;;;;;;;:::i;:::-;57519:11;:18;57501:14;;57437:44;;-1:-1:-1;57501:36:0;;;;;57498:77;;57546:29;;-1:-1:-1;;;57546:29:0;;;;;;;;;;;57498:77;57606:44;57618:15;;57634:1;57618:18;;;;;;;;;:::i;:::-;:31;;;:18;;;;;:31;;;;-1:-1:-1;57618:31:0;:::i;57606:44::-;57595:1;:8;;;:55;;;57592:91;;;57659:24;;-1:-1:-1;;;57659:24:0;;;;;;;;;;;57592:91;57738:1;:8;;;57700:11;57712:1;:14;;;57700:27;;;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57777:1;:8;;;57761:24;;;;;;;:::i;:::-;;;57807:8;57802:116;57821:1;:8;;;57817:12;;:1;:12;;;57802:116;;;57888:14;;57855:19;57888:14;57875:9;;;;:::i;:::-;;;57855:30;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;57831:3;;;;;:::i;:::-;;;;57802:116;;;;57422:507;57417:3;;;;;:::i;:::-;;;;57374:555;;;-1:-1:-1;57956:17:0;57953:57;;57982:28;;-1:-1:-1;;;57982:28:0;;;;;;;;;;;57953:57;58031:31;58041:2;58045:12;58031:31;;;;;;;;;;;;:9;:31::i;61390:106::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;61460:28:::1;61479:8;61460:18;:28::i;59059:201::-:0;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;59157:9:::1;59153:100;59168:20:::0;;::::1;59153:100;;;59234:7;59210;:21;59218:9;;59228:1;59218:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59210:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;59210:21:0;:31;;-1:-1:-1;;59210:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59190:3;::::1;::::0;::::1;:::i;:::-;;;;59153:100;;56677:381:::0;56795:13;56831:16;56839:7;56831;:16::i;:::-;56826:59;;56856:29;;-1:-1:-1;;;56856:29:0;;;;;;;;;;;56826:59;56942:1;56924:7;56918:21;;;;;:::i;:::-;;;:25;:132;;;;;;;;;;;;;;;;;56987:10;:8;:10::i;:::-;56999:18;:7;:16;:18::i;:::-;56970:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56898:152;56677:381;-1:-1:-1;;56677:381:0:o;60785:521::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;60886:11:::1;::::0;::::1;60882:417;;60918:9;60914:170;60929:19:::0;;::::1;60914:170;;;60993:12;;60978:8;;60987:1;60978:11;;;;;;;:::i;:::-;;;;;;;:27;60974:41;;61007:8;;60974:41;61043:12;:25;61056:8;;61065:1;61056:11;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;61043:25:::0;;-1:-1:-1;61043:25:0;::::1;::::0;;;;;;-1:-1:-1;61043:25:0;61036:32;;-1:-1:-1;;61036:32:0::1;::::0;;60914:170:::1;60950:3:::0;::::1;::::0;::::1;:::i;:::-;;;;60914:170;;60882:417;61120:9;61116:172;61131:19:::0;;::::1;61116:172;;;61195:12;;61180:8;;61189:1;61180:11;;;;;;;:::i;:::-;;;;;;;:27;61176:41;;61209:8;;61176:41;61266:6;61238:12;:25;61251:8;;61260:1;61251:11;;;;;;;:::i;:::-;;;;;;;61238:25;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;61116:172;61152:3:::0;::::1;::::0;::::1;:::i;:::-;;;;61116:172;;55900:508:::0;56189:27;;56250:35;;-1:-1:-1;;;56250:35:0;;-1:-1:-1;;;;;1692:55:1;;;56250:35:0;;;1674:74:1;56025:4:0;;56189:27;;;56242:56;;;;56189:27;;56250:28;;1647:18:1;;56250:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56242:56:0;;56238:100;;;56322:4;56315:11;;;;;56238:100;-1:-1:-1;;;;;28728:25:0;;;28704:4;28728:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;56357:43;56350:50;55900:508;-1:-1:-1;;;;55900:508:0:o;2971:201::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;-1:-1:-1;;;;;3060:22:0;::::1;3052:73;;;::::0;-1:-1:-1;;;3052:73:0;;19353:2:1;3052:73:0::1;::::0;::::1;19335:21:1::0;19392:2;19372:18;;;19365:30;19431:34;19411:18;;;19404:62;19502:8;19482:18;;;19475:36;19528:19;;3052:73:0::1;19151:402:1::0;3052:73:0::1;3136:28;3155:8;3136:18;:28::i;43555:472::-:0;43732:9;43727:228;43751:8;:15;43747:1;:19;43727:228;;;43793:45;860:10;43826:8;43835:1;43826:11;;;;;;;;:::i;43793:45::-;43788:94;;43847:35;;-1:-1:-1;;;43847:35:0;;;;;;;;;;;43788:94;43897:46;43914:4;43920:2;43924:8;43933:1;43924:11;;;;;;;;:::i;:::-;;;;;;;43897:46;;43937:5;43897:16;:46::i;:::-;43768:3;;;:::i;:::-;;;43727:228;;;;44006:2;-1:-1:-1;;;;;43972:47:0;44000:4;-1:-1:-1;;;;;43972:47:0;43986:12;860:10;;780:98;43986:12;-1:-1:-1;;;;;43972:47:0;;44010:8;43972:47;;;;;;:::i;:::-;;;;;;;;43555:472;;;;:::o;30195:167::-;30260:4;30294:1;30284:7;:11;:37;;;;;30309:12;;30299:7;:22;30284:37;:70;;;;-1:-1:-1;30325:16:0;;;;:7;:16;;;;;;-1:-1:-1;;;;;30325:16:0;24785:42;30325:29;;30277:77;30195:167;-1:-1:-1;;30195:167:0:o;34926:196::-;35041:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;35041:29:0;-1:-1:-1;;;;;35041:29:0;;;;;;;;;35086:28;;35041:24;;35086:28;;;;;;;34926:196;;;:::o;32937:1871::-;33052:13;33068:16;33076:7;33068;:16::i;:::-;33052:32;-1:-1:-1;33097:22:0;860:10;-1:-1:-1;;;;;33123:21:0;;;;:75;;-1:-1:-1;33161:37:0;33178:5;860:10;55900:508;:::i;33161:37::-;33123:128;;;-1:-1:-1;860:10:0;33215:20;33227:7;33215:11;:20::i;:::-;-1:-1:-1;;;;;33215:36:0;;33123:128;33097:155;;33270:17;33265:66;;33296:35;;-1:-1:-1;;;33296:35:0;;;;;;;;;;;33265:66;33355:4;-1:-1:-1;;;;;33346:13:0;:5;-1:-1:-1;;;;;33346:13:0;;33342:54;;33368:28;;-1:-1:-1;;;33368:28:0;;;;;;;;;;;33342:54;-1:-1:-1;;;;;33411:16:0;;33407:52;;33436:23;;-1:-1:-1;;;33436:23:0;;;;;;;;;;;33407:52;-1:-1:-1;;;;;33474:15:0;;24785:42;33474:15;33470:51;;;33498:23;;-1:-1:-1;;;33498:23:0;;;;;;;;;;;33470:51;33642:36;33659:1;33663:7;33672:5;33642:8;:36::i;:::-;-1:-1:-1;;;;;33970:15:0;;;;;;;:9;:15;;;;;;;;:20;;-1:-1:-1;;33970:20:0;;;34005:13;;;;;;;;;:18;;33989:1;34005:18;;;;;;34040:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34040:21:0;;;;;;34345:11;;;34375:20;;;;;;34345:11;;34375:20;34371:321;;34592:12;;34578:11;:26;34574:103;;;34629:20;;;;:7;:20;;;;;:28;;-1:-1:-1;;;;;;34629:28:0;-1:-1:-1;;;;;34629:28:0;;;;;34574:103;33945:758;34739:7;34735:2;-1:-1:-1;;;;;34720:27:0;34729:4;-1:-1:-1;;;;;34720:27:0;;;;;;;;;;;34758:42;58151:656;30968:171;31099:32;31105:2;31109:8;31119:5;31126:4;31099:5;:32::i;29659:281::-;29751:4;29768:13;29784:16;29792:7;29784;:16::i;:::-;29768:32;;29831:5;-1:-1:-1;;;;;29821:15:0;:6;-1:-1:-1;;;;;29821:15:0;;:62;;;;29877:6;-1:-1:-1;;;;;29853:30:0;:20;29865:7;29853:11;:20::i;:::-;-1:-1:-1;;;;;29853:30:0;;29821:62;:110;;;;29900:31;29917:5;29924:6;29900:16;:31::i;35351:1422::-;35411:13;35427:16;35435:7;35427;:16::i;:::-;35411:32;;35573:36;35590:1;35594:7;35603:5;35573:8;:36::i;:::-;-1:-1:-1;;;;;35901:16:0;;;;;;;:9;:16;;;;;;;;:21;;-1:-1:-1;;35901:21:0;;;35937:20;:25;;35921:1;35937:25;;;;;;35979:16;;;:7;:16;;;;;;:28;;-1:-1:-1;;;;;;35979:28:0;24785:42;35979:28;;;36291:11;;;36321:20;;;;;;36291:11;;36321:20;36317:322;;36538:12;;36524:11;:26;36520:104;;;36576:20;;;;:7;:20;;;;;:28;;-1:-1:-1;;;;;;36576:28:0;-1:-1:-1;;;;;36576:28:0;;;;;36520:104;-1:-1:-1;36667:36:0;;36695:7;;36691:1;;-1:-1:-1;;;;;36667:36:0;;;;;36691:1;;36667:36;58959:21:::1;58882:106:::0;:::o;59314:200::-;-1:-1:-1;;;;;;;;;;;;;;;59425:13:0;;;59449:25;;;-1:-1:-1;;;;59449:25:0;;;;59487:11;:19;;;;;;;;;;;;;-1:-1:-1;;;;59487:19:0;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59487:19:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59487:19:0;;;;;;;;;;;;;;;-1:-1:-1;;;59314:200:0:o;3332:191::-;3406:16;3425:6;;-1:-1:-1;;;;;3442:17:0;;;-1:-1:-1;;;;;;3442:17:0;;;;;;3475:40;;3425:6;;;;;;;3475:40;;3406:16;3475:40;3395:128;3332:191;:::o;37338:765::-;37493:4;-1:-1:-1;;;;;37514:13:0;;12717:19;:23;37510:586;;37550:72;;-1:-1:-1;;;37550:72:0;;-1:-1:-1;;;;;37550:36:0;;;;;:72;;860:10;;37601:4;;37607:7;;37616:5;;37550:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37550:72:0;;;;;;;;-1:-1:-1;;37550:72:0;;;;;;;;;;;;:::i;:::-;;;37546:495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37796:13:0;;37792:234;;37823:40;;-1:-1:-1;;;37823:40:0;;;;;;;;;;;37792:234;37976:6;37970:13;37961:6;37957:2;37953:15;37946:38;37546:495;-1:-1:-1;;;;;;37673:55:0;-1:-1:-1;;;37673:55:0;;-1:-1:-1;37666:62:0;;37510:586;-1:-1:-1;38080:4:0;37338:765;;;;;;:::o;39731:1074::-;39801:13;39797:49;;39823:23;;-1:-1:-1;;;39823:23:0;;;;;;;;;;;39797:49;39861:12;;39877:1;39861:17;39857:49;;;39887:19;;-1:-1:-1;;;39887:19:0;;;;;;;;;;;39857:49;39953:24;;40021:12;;39992:41;;39988:76;;40042:22;;-1:-1:-1;;;40042:22:0;;;;;;;;;;;39988:76;40268:1;40366:12;40229:36;;;-1:-1:-1;;40229:40:0;;;-1:-1:-1;40347:95:0;;;-1:-1:-1;40425:1:0;40410:12;-1:-1:-1;;40410:16:0;40347:95;40475:25;40458:273;40507:8;40502:1;:13;40458:273;;40567:1;40545:10;;;:7;:10;;;;;;-1:-1:-1;;;;;40545:10:0;:24;:51;;;;-1:-1:-1;40573:10:0;;;;:7;:10;;;;;;-1:-1:-1;;;;;40573:10:0;24785:42;40573:23;;40545:51;40541:175;;;40621:17;40641:10;40649:1;40641:7;:10::i;:::-;40674;;;;:7;:10;;;;;:22;;-1:-1:-1;;;;;;40674:22:0;-1:-1:-1;;;;;40674:22:0;;;;;;;;;;-1:-1:-1;40541:175:0;40517:3;;40458:273;;;-1:-1:-1;40785:1:0;40774:12;40747:24;:39;-1:-1:-1;;39731:1074:0:o;56495:108::-;56555:13;56588:7;56581:14;;;;;:::i;20065:723::-;20121:13;20342:10;20338:53;;-1:-1:-1;;20369:10:0;;;;;;;;;;;;-1:-1:-1;;;20369:10:0;;;;;20065:723::o;20338:53::-;20416:5;20401:12;20457:78;20464:9;;20457:78;;20490:8;;;;:::i;:::-;;-1:-1:-1;20513:10:0;;-1:-1:-1;20521:2:0;20513:10;;:::i;:::-;;;20457:78;;;20545:19;20577:6;20567:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20567:17:0;;20545:39;;20595:154;20602:10;;20595:154;;20629:11;20639:1;20629:11;;:::i;:::-;;-1:-1:-1;20698:10:0;20706:2;20698:5;:10;:::i;:::-;20685:24;;:2;:24;:::i;:::-;20672:39;;20655:6;20662;20655:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;20726:11:0;20735:2;20726:11;;:::i;:::-;;;20595:154;;31398:1285;31568:12;;-1:-1:-1;;;;;31595:16:0;;31591:48;;31620:19;;-1:-1:-1;;;31620:19:0;;;;;;;;;;;31591:48;-1:-1:-1;;;;;31654:15:0;;24785:42;31654:15;31650:47;;;31678:19;;-1:-1:-1;;;31678:19:0;;;;;;;;;;;31650:47;31712:13;31708:44;;31734:18;;-1:-1:-1;;;31734:18:0;;;;;;;;;;;31708:44;-1:-1:-1;;;;;32079:13:0;;;;;;:9;:13;;;;;;;;:25;;;;;;32121:21;;;:7;:21;;;;;:26;;-1:-1:-1;;;;;;32121:26:0;;;;;;;32129:12;;32216:332;32236:8;32232:1;:12;32216:332;;;32275:38;;32300:12;;-1:-1:-1;;;;;32275:38:0;;;32292:1;;32275:38;;32292:1;;32275:38;32336:4;32332:166;;;32370:59;32401:1;32405:2;32409:12;32423:5;32370:22;:59::i;:::-;32365:113;;32438:40;;-1:-1:-1;;;32438:40:0;;;;;;;;;;;32365:113;32518:14;;;;;32246:3;32216:332;;;-1:-1:-1;32564:12:0;:27;32615:60;58151:656;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1759:154::-;-1:-1:-1;;;;;1838:5:1;1834:54;1827:5;1824:65;1814:93;;1903:1;1900;1893:12;1918:315;1986:6;1994;2047:2;2035:9;2026:7;2022:23;2018:32;2015:52;;;2063:1;2060;2053:12;2015:52;2102:9;2089:23;2121:31;2146:5;2121:31;:::i;:::-;2171:5;2223:2;2208:18;;;;2195:32;;-1:-1:-1;;;1918:315:1:o;2609:159::-;2676:20;;2736:6;2725:18;;2715:29;;2705:57;;2758:1;2755;2748:12;2705:57;2609:159;;;:::o;2773:184::-;2831:6;2884:2;2872:9;2863:7;2859:23;2855:32;2852:52;;;2900:1;2897;2890:12;2852:52;2923:28;2941:9;2923:28;:::i;2962:456::-;3039:6;3047;3055;3108:2;3096:9;3087:7;3083:23;3079:32;3076:52;;;3124:1;3121;3114:12;3076:52;3163:9;3150:23;3182:31;3207:5;3182:31;:::i;:::-;3232:5;-1:-1:-1;3289:2:1;3274:18;;3261:32;3302:33;3261:32;3302:33;:::i;:::-;2962:456;;3354:7;;-1:-1:-1;;;3408:2:1;3393:18;;;;3380:32;;2962:456::o;3423:401::-;3624:2;3613:9;3606:21;3587:4;3644:45;3685:2;3674:9;3670:18;3662:6;3644:45;:::i;:::-;3708:6;3750:15;;;3745:2;3730:18;;3723:43;3802:15;;;;3797:2;3782:18;;;3775:43;3636:53;3423:401;-1:-1:-1;;3423:401:1:o;3829:391::-;3904:6;3912;3920;3973:2;3961:9;3952:7;3948:23;3944:32;3941:52;;;3989:1;3986;3979:12;3941:52;4028:9;4015:23;4047:31;4072:5;4047:31;:::i;:::-;4097:5;-1:-1:-1;4121:37:1;4154:2;4139:18;;4121:37;:::i;:::-;4111:47;;4177:37;4210:2;4199:9;4195:18;4177:37;:::i;:::-;4167:47;;3829:391;;;;;:::o;4225:366::-;4287:8;4297:6;4351:3;4344:4;4336:6;4332:17;4328:27;4318:55;;4369:1;4366;4359:12;4318:55;-1:-1:-1;4392:20:1;;4435:18;4424:30;;4421:50;;;4467:1;4464;4457:12;4421:50;4504:4;4496:6;4492:17;4480:29;;4564:3;4557:4;4547:6;4544:1;4540:14;4532:6;4528:27;4524:38;4521:47;4518:67;;;4581:1;4578;4571:12;4518:67;4225:366;;;;;:::o;4596:782::-;4729:6;4737;4745;4753;4806:2;4794:9;4785:7;4781:23;4777:32;4774:52;;;4822:1;4819;4812:12;4774:52;4862:9;4849:23;4891:18;4932:2;4924:6;4921:14;4918:34;;;4948:1;4945;4938:12;4918:34;4987:69;5048:7;5039:6;5028:9;5024:22;4987:69;:::i;:::-;5075:8;;-1:-1:-1;4961:95:1;-1:-1:-1;5163:2:1;5148:18;;5135:32;;-1:-1:-1;5179:16:1;;;5176:36;;;5208:1;5205;5198:12;5176:36;;5247:71;5310:7;5299:8;5288:9;5284:24;5247:71;:::i;:::-;4596:782;;;;-1:-1:-1;5337:8:1;-1:-1:-1;;;;4596:782:1:o;5383:127::-;5444:10;5439:3;5435:20;5432:1;5425:31;5475:4;5472:1;5465:15;5499:4;5496:1;5489:15;5515:275;5586:2;5580:9;5651:2;5632:13;;-1:-1:-1;;5628:27:1;5616:40;;5686:18;5671:34;;5707:22;;;5668:62;5665:88;;;5733:18;;:::i;:::-;5769:2;5762:22;5515:275;;-1:-1:-1;5515:275:1:o;5795:407::-;5860:5;5894:18;5886:6;5883:30;5880:56;;;5916:18;;:::i;:::-;5954:57;5999:2;5978:15;;-1:-1:-1;;5974:29:1;6005:4;5970:40;5954:57;:::i;:::-;5945:66;;6034:6;6027:5;6020:21;6074:3;6065:6;6060:3;6056:16;6053:25;6050:45;;;6091:1;6088;6081:12;6050:45;6140:6;6135:3;6128:4;6121:5;6117:16;6104:43;6194:1;6187:4;6178:6;6171:5;6167:18;6163:29;6156:40;5795:407;;;;;:::o;6207:451::-;6276:6;6329:2;6317:9;6308:7;6304:23;6300:32;6297:52;;;6345:1;6342;6335:12;6297:52;6385:9;6372:23;6418:18;6410:6;6407:30;6404:50;;;6450:1;6447;6440:12;6404:50;6473:22;;6526:4;6518:13;;6514:27;-1:-1:-1;6504:55:1;;6555:1;6552;6545:12;6504:55;6578:74;6644:7;6639:2;6626:16;6621:2;6617;6613:11;6578:74;:::i;7437:670::-;7516:6;7524;7532;7585:2;7573:9;7564:7;7560:23;7556:32;7553:52;;;7601:1;7598;7591:12;7553:52;7641:9;7628:23;7670:18;7711:2;7703:6;7700:14;7697:34;;;7727:1;7724;7717:12;7697:34;7765:6;7754:9;7750:22;7740:32;;7810:7;7803:4;7799:2;7795:13;7791:27;7781:55;;7832:1;7829;7822:12;7781:55;7872:2;7859:16;7898:2;7890:6;7887:14;7884:34;;;7914:1;7911;7904:12;7884:34;7961:7;7954:4;7945:6;7941:2;7937:15;7933:26;7930:39;7927:59;;;7982:1;7979;7972:12;7927:59;8013:4;8005:13;;;;-1:-1:-1;8037:6:1;-1:-1:-1;8062:39:1;;8080:20;;;-1:-1:-1;8062:39:1;:::i;8112:247::-;8171:6;8224:2;8212:9;8203:7;8199:23;8195:32;8192:52;;;8240:1;8237;8230:12;8192:52;8279:9;8266:23;8298:31;8323:5;8298:31;:::i;8364:716::-;8417:5;8470:3;8463:4;8455:6;8451:17;8447:27;8437:55;;8488:1;8485;8478:12;8437:55;8524:6;8511:20;8550:4;8573:18;8569:2;8566:26;8563:52;;;8595:18;;:::i;:::-;8641:2;8638:1;8634:10;8664:28;8688:2;8684;8680:11;8664:28;:::i;:::-;8726:15;;;8796;;;8792:24;;;8757:12;;;;8828:15;;;8825:35;;;8856:1;8853;8846:12;8825:35;8892:2;8884:6;8880:15;8869:26;;8904:147;8920:6;8915:3;8912:15;8904:147;;;8986:22;9004:3;8986:22;:::i;:::-;8974:35;;8937:12;;;;9029;;;;8904:147;;;9069:5;8364:716;-1:-1:-1;;;;;;;8364:716:1:o;9085:622::-;9186:6;9194;9202;9255:2;9243:9;9234:7;9230:23;9226:32;9223:52;;;9271:1;9268;9261:12;9223:52;9310:9;9297:23;9329:31;9354:5;9329:31;:::i;:::-;9379:5;-1:-1:-1;9436:2:1;9421:18;;9408:32;9449:33;9408:32;9449:33;:::i;:::-;9501:7;-1:-1:-1;9559:2:1;9544:18;;9531:32;9586:18;9575:30;;9572:50;;;9618:1;9615;9608:12;9572:50;9641:60;9693:7;9684:6;9673:9;9669:22;9641:60;:::i;:::-;9631:70;;;9085:622;;;;;:::o;9712:346::-;9795:6;9848:2;9836:9;9827:7;9823:23;9819:32;9816:52;;;9864:1;9861;9854:12;9816:52;9904:9;9891:23;9937:18;9929:6;9926:30;9923:50;;;9969:1;9966;9959:12;9923:50;9992:60;10044:7;10035:6;10024:9;10020:22;9992:60;:::i;10063:160::-;10128:20;;10184:13;;10177:21;10167:32;;10157:60;;10213:1;10210;10203:12;10228:315;10293:6;10301;10354:2;10342:9;10333:7;10329:23;10325:32;10322:52;;;10370:1;10367;10360:12;10322:52;10409:9;10396:23;10428:31;10453:5;10428:31;:::i;:::-;10478:5;-1:-1:-1;10502:35:1;10533:2;10518:18;;10502:35;:::i;:::-;10492:45;;10228:315;;;;;:::o;10548:221::-;10590:5;10643:3;10636:4;10628:6;10624:17;10620:27;10610:55;;10661:1;10658;10651:12;10610:55;10683:80;10759:3;10750:6;10737:20;10730:4;10722:6;10718:17;10683:80;:::i;10774:665::-;10869:6;10877;10885;10893;10946:3;10934:9;10925:7;10921:23;10917:33;10914:53;;;10963:1;10960;10953:12;10914:53;11002:9;10989:23;11021:31;11046:5;11021:31;:::i;:::-;11071:5;-1:-1:-1;11128:2:1;11113:18;;11100:32;11141:33;11100:32;11141:33;:::i;:::-;11193:7;-1:-1:-1;11247:2:1;11232:18;;11219:32;;-1:-1:-1;11302:2:1;11287:18;;11274:32;11329:18;11318:30;;11315:50;;;11361:1;11358;11351:12;11315:50;11384:49;11425:7;11416:6;11405:9;11401:22;11384:49;:::i;:::-;11374:59;;;10774:665;;;;;;;:::o;11444:784::-;11573:6;11581;11589;11642:2;11630:9;11621:7;11617:23;11613:32;11610:52;;;11658:1;11655;11648:12;11610:52;11697:9;11684:23;11716:31;11741:5;11716:31;:::i;:::-;11766:5;-1:-1:-1;11822:2:1;11807:18;;11794:32;11845:18;11875:14;;;11872:34;;;11902:1;11899;11892:12;11872:34;11940:6;11929:9;11925:22;11915:32;;11985:7;11978:4;11974:2;11970:13;11966:27;11956:55;;12007:1;12004;11997:12;11956:55;12047:2;12034:16;12073:2;12065:6;12062:14;12059:34;;;12089:1;12086;12079:12;12059:34;12142:7;12137:2;12127:6;12124:1;12120:14;12116:2;12112:23;12108:32;12105:45;12102:65;;;12163:1;12160;12153:12;12102:65;12194:2;12190;12186:11;12176:21;;12216:6;12206:16;;;;;11444:784;;;;;:::o;12233:504::-;12325:6;12333;12341;12394:2;12382:9;12373:7;12369:23;12365:32;12362:52;;;12410:1;12407;12400:12;12362:52;12450:9;12437:23;12483:18;12475:6;12472:30;12469:50;;;12515:1;12512;12505:12;12469:50;12554:69;12615:7;12606:6;12595:9;12591:22;12554:69;:::i;:::-;12642:8;;-1:-1:-1;12528:95:1;-1:-1:-1;12696:35:1;;-1:-1:-1;12727:2:1;12712:18;;12696:35;:::i;12742:593::-;12835:6;12843;12851;12904:2;12892:9;12883:7;12879:23;12875:32;12872:52;;;12920:1;12917;12910:12;12872:52;12959:9;12946:23;13009:4;13002:5;12998:16;12991:5;12988:27;12978:55;;13029:1;13026;13019:12;12978:55;13052:5;-1:-1:-1;13108:2:1;13093:18;;13080:32;13135:18;13124:30;;13121:50;;;13167:1;13164;13157:12;13121:50;13206:69;13267:7;13258:6;13247:9;13243:22;13206:69;:::i;:::-;12742:593;;13294:8;;-1:-1:-1;13180:95:1;;-1:-1:-1;;;;12742:593:1:o;13340:388::-;13408:6;13416;13469:2;13457:9;13448:7;13444:23;13440:32;13437:52;;;13485:1;13482;13475:12;13437:52;13524:9;13511:23;13543:31;13568:5;13543:31;:::i;:::-;13593:5;-1:-1:-1;13650:2:1;13635:18;;13622:32;13663:33;13622:32;13663:33;:::i;:::-;13715:7;13705:17;;;13340:388;;;;;:::o;13733:842::-;13852:6;13860;13868;13876;13929:3;13917:9;13908:7;13904:23;13900:33;13897:53;;;13946:1;13943;13936:12;13897:53;13985:9;13972:23;14004:31;14029:5;14004:31;:::i;:::-;14054:5;-1:-1:-1;14111:2:1;14096:18;;14083:32;14124:33;14083:32;14124:33;:::i;:::-;14176:7;-1:-1:-1;14234:2:1;14219:18;;14206:32;14257:18;14287:14;;;14284:34;;;14314:1;14311;14304:12;14284:34;14337:60;14389:7;14380:6;14369:9;14365:22;14337:60;:::i;:::-;14327:70;;14450:2;14439:9;14435:18;14422:32;14406:48;;14479:2;14469:8;14466:16;14463:36;;;14495:1;14492;14485:12;14463:36;;14518:51;14561:7;14550:8;14539:9;14535:24;14518:51;:::i;14580:380::-;14659:1;14655:12;;;;14702;;;14723:61;;14777:4;14769:6;14765:17;14755:27;;14723:61;14830:2;14822:6;14819:14;14799:18;14796:38;14793:161;;;14876:10;14871:3;14867:20;14864:1;14857:31;14911:4;14908:1;14901:15;14939:4;14936:1;14929:15;14793:161;;14580:380;;;:::o;14965:127::-;15026:10;15021:3;15017:20;15014:1;15007:31;15057:4;15054:1;15047:15;15081:4;15078:1;15071:15;15097:127;15158:10;15153:3;15149:20;15146:1;15139:31;15189:4;15186:1;15179:15;15213:4;15210:1;15203:15;15229:217;15268:4;15297:6;15353:10;;;;15323;;15375:12;;;15372:38;;;15390:18;;:::i;:::-;15427:13;;15229:217;-1:-1:-1;;;15229:217:1:o;15451:224::-;15490:3;15518:6;15551:2;15548:1;15544:10;15581:2;15578:1;15574:10;15612:3;15608:2;15604:12;15599:3;15596:21;15593:47;;;15620:18;;:::i;:::-;15656:13;;15451:224;-1:-1:-1;;;;15451:224:1:o;15680:135::-;15719:3;-1:-1:-1;;15740:17:1;;15737:43;;;15760:18;;:::i;:::-;-1:-1:-1;15807:1:1;15796:13;;15680:135::o;15820:197::-;15858:3;15886:6;15927:2;15920:5;15916:14;15954:2;15945:7;15942:15;15939:41;;;15960:18;;:::i;:::-;16009:1;15996:15;;15820:197;-1:-1:-1;;;15820:197:1:o;16383:522::-;16461:4;16467:6;16527:11;16514:25;16621:2;16617:7;16606:8;16590:14;16586:29;16582:43;16562:18;16558:68;16548:96;;16640:1;16637;16630:12;16548:96;16667:33;;16719:20;;;-1:-1:-1;16762:18:1;16751:30;;16748:50;;;16794:1;16791;16784:12;16748:50;16827:4;16815:17;;-1:-1:-1;16858:14:1;16854:27;;;16844:38;;16841:58;;;16895:1;16892;16885:12;16910:643;17079:2;17131:21;;;17201:13;;17104:18;;;17223:22;;;17050:4;;17079:2;17302:15;;;;17276:2;17261:18;;;17050:4;17345:182;17359:6;17356:1;17353:13;17345:182;;;17424:13;;17439:6;17420:26;17408:39;;17502:15;;;;17467:12;;;;17381:1;17374:9;17345:182;;;-1:-1:-1;17544:3:1;;16910:643;-1:-1:-1;;;;;;16910:643:1:o;17558:521::-;17649:6;17702:2;17690:9;17681:7;17677:23;17673:32;17670:52;;;17718:1;17715;17708:12;17670:52;17751:2;17745:9;17793:2;17785:6;17781:15;17862:6;17850:10;17847:22;17826:18;17814:10;17811:34;17808:62;17805:88;;;17873:18;;:::i;:::-;17909:2;17902:22;17948:28;17966:9;17948:28;:::i;:::-;17940:6;17933:44;18010:37;18043:2;18032:9;18028:18;18010:37;:::i;:::-;18005:2;17993:15;;17986:62;17997:6;17558:521;-1:-1:-1;;;17558:521:1:o;18084:128::-;18124:3;18155:1;18151:6;18148:1;18145:13;18142:39;;;18161:18;;:::i;:::-;-1:-1:-1;18197:9:1;;18084:128::o;18217:637::-;18497:3;18535:6;18529:13;18551:53;18597:6;18592:3;18585:4;18577:6;18573:17;18551:53;:::i;:::-;18667:13;;18626:16;;;;18689:57;18667:13;18626:16;18723:4;18711:17;;18689:57;:::i;:::-;18811:7;18768:20;;18797:22;;;18846:1;18835:13;;18217:637;-1:-1:-1;;;;18217:637:1:o;18859:287::-;18965:6;19018:2;19006:9;18997:7;18993:23;18989:32;18986:52;;;19034:1;19031;19024:12;18986:52;19066:9;19060:16;19085:31;19110:5;19085:31;:::i;19558:512::-;19752:4;-1:-1:-1;;;;;19862:2:1;19854:6;19850:15;19839:9;19832:34;19914:2;19906:6;19902:15;19897:2;19886:9;19882:18;19875:43;;19954:6;19949:2;19938:9;19934:18;19927:34;19997:3;19992:2;19981:9;19977:18;19970:31;20018:46;20059:3;20048:9;20044:19;20036:6;20018:46;:::i;:::-;20010:54;19558:512;-1:-1:-1;;;;;;19558:512:1:o;20075:249::-;20144:6;20197:2;20185:9;20176:7;20172:23;20168:32;20165:52;;;20213:1;20210;20203:12;20165:52;20245:9;20239:16;20264:30;20288:5;20264:30;:::i;20329:127::-;20390:10;20385:3;20381:20;20378:1;20371:31;20421:4;20418:1;20411:15;20445:4;20442:1;20435:15;20461:120;20501:1;20527;20517:35;;20532:18;;:::i;:::-;-1:-1:-1;20566:9:1;;20461:120::o;20586:125::-;20626:4;20654:1;20651;20648:8;20645:34;;;20659:18;;:::i;:::-;-1:-1:-1;20696:9:1;;20586:125::o;20716:112::-;20748:1;20774;20764:35;;20779:18;;:::i;:::-;-1:-1:-1;20813:9:1;;20716:112::o
Swarm Source
ipfs://70518d2da60eaf9c13cddb2780d4621fc402a79caf02f808fb199df4bcfafba8
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.