ERC-721
NFT
Overview
Max Total Supply
822 EC
Holders
226
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 ECLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EvolvedCamels
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-01 */ // SPDX-License-Identifier: GPL-3.0 // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.9; /** * @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/Context.sol pragma solidity ^0.8.9; /** * @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/Ownable.sol pragma solidity ^0.8.9; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.9; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @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/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.9; /** * @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/utils/introspection/IERC165.sol pragma solidity ^0.8.9; /** * @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/utils/introspection/ERC165.sol pragma solidity ^0.8.9; /** * @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: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.9; /** * @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/extensions/IERC721Metadata.sol pragma solidity ^0.8.9; /** * @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); } pragma solidity >=0.8.9; // to enable certain compiler features contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; //Mapping para atribuirle un URI para cada token mapping(uint256 => string) internal id_to_URI; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } pragma solidity ^0.8.9; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } pragma solidity ^0.8.9; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // Creator: Chiru Labs pragma solidity ^0.8.9; /** * @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 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). * * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 internal currentIndex; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), 'ERC721A: global index out of bounds'); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), 'ERC721A: owner index out of bounds'); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert('ERC721A: unable to get token of owner by index'); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), 'ERC721A: balance query for the zero address'); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require(owner != address(0), 'ERC721A: number minted query for the zero address'); return uint256(_addressData[owner].numberMinted); } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), 'ERC721A: owner query for nonexistent token'); unchecked { for (uint256 curr = tokenId; curr >= 0; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } revert('ERC721A: unable to determine the owner of token'); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, 'ERC721A: approval to current owner'); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721A: approve caller is not owner nor approved for all' ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), 'ERC721A: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), 'ERC721A: approve to caller'); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _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 override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _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 { _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 { uint256 startTokenId = currentIndex; require(to != address(0), 'ERC721A: mint to the zero address'); require(quantity != 0, 'ERC721A: quantity must be greater than 0'); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1 unchecked { _addressData[to].balance += uint128(quantity); _addressData[to].numberMinted += uint128(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { require( _checkOnERC721Received(address(0), to, updatedIndex, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } updatedIndex++; } currentIndex = 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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved'); require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner'); require(to != address(0), 'ERC721A: transfer to the zero address'); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership 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 (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } 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 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('ERC721A: transfer to non ERC721Receiver implementer'); } 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 {} } // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) contract EvolvedCamels is ERC721A, Ownable { using Strings for uint256; //declares the maximum amount of tokens that can be minted, total and in presale uint256 public maxTotalTokens; //initial part of the URI for the metadata string private _currentBaseURI; //cost of mints depending on state of sale uint private mintCostPresale = 0.06 ether; uint private mintCostPublicSale = 0.08 ether; //maximum amount of mints allowed per person uint256 public maxMintPresale = 2; uint256 public maxMintPublicSale = 3; //the amount of reserved mints that have currently been executed by creator and giveaways uint private _reservedMints; //the maximum amount of reserved mints allowed for creator and giveaways uint private maxReservedMints = 222; //dummy address that we use to sign the mint transaction to make sure it is valid address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c; uint256 internal presaleLaunchTime; uint256 internal publicSaleLaunchTime; uint256 internal revealTime; //dictates if sale is paused or not bool private paused_; //dictates if OG Sale is open bool private OGpaused_; //amount of mints that each address has executed mapping(address => uint256) public mintsPerAddress; //amount of OG mints that each address has executed mapping(address => uint256) private OGmintsPerAddress; IERC721 private CrazyCamels; //current state os sale enum State {NoSale, Presale, PublicSale} //defines the uri for when the NFTs have not been yet revealed string public unrevealedURI; //declaring initial values for variables constructor() ERC721A('Evolved Camels', 'EC') { maxTotalTokens = 2222; CrazyCamels = IERC721(0x062c74E593CE3C6574F126A1a35Ab55Dffdd63A6); //0x062c74E593CE3C6574F126A1a35Ab55Dffdd63A6 unrevealedURI = "ipfs://.../"; } //in case somebody accidentaly sends funds or transaction to contract receive() payable external {} fallback() payable external { revert(); } //visualize baseURI function _baseURI() internal view virtual override returns (string memory) { return _currentBaseURI; } //change baseURI in case needed for IPFS function changeBaseURI(string memory baseURI_) public onlyOwner { _currentBaseURI = baseURI_; } function changeUnrevealedURI(string memory unrevealedURI_) public onlyOwner { unrevealedURI = unrevealedURI_; } function switchToPresale() public onlyOwner { require(saleState() == State.NoSale, 'Sale is already Open!'); presaleLaunchTime = block.timestamp; } function switchToPublicSale() public onlyOwner { require(saleState() == State.Presale, 'Sale must be in Presale!'); publicSaleLaunchTime = block.timestamp; } modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) { require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' ); _; } /* * @dev Verifies if message was signed by owner to give access to _add for this contract. * Assumes Geth signature prefix. * @param _add Address of agent with access * @param _v ECDSA signature parameter v. * @param _r ECDSA signature parameters r. * @param _s ECDSA signature parameters s. * @return Validity of access message for a given address. */ function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) { bytes32 hash = keccak256(abi.encodePacked(address(this), _add)); return dummy == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s); } //mint a @param number of NFTs in public sale function OGSaleMint(uint256 number) public { require(!OGpaused_, "Sale is closed!"); require(totalSupply() + number <= maxTotalTokens - (maxReservedMints - _reservedMints), "Not enough NFTs left to mint.."); require(OGmintsPerAddress[msg.sender] + number <= CrazyCamels.balanceOf(msg.sender), "1 Mint per Crazy Camel NFT Owned!"); _safeMint(msg.sender, number); OGmintsPerAddress[msg.sender] += number; } //mint a @param number of NFTs in presale function presaleMint(uint256 number, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v, _r, _s) public payable { require(!paused_, "Sale is paused!"); State saleState_ = saleState(); require(saleState_ == State.Presale, "Sale in not open yet!"); require(totalSupply() + number <= maxTotalTokens - (maxReservedMints - _reservedMints), "Not enough NFTs left to mint.."); require(mintsPerAddress[msg.sender] + number <= maxMintPresale, "Maximum Mints per Address exceeded!"); require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs"); _safeMint(msg.sender, number); mintsPerAddress[msg.sender] += number; } //mint a @param number of NFTs in public sale function publicSaleMint(uint256 number) public payable { require(!paused_, "Sale is paused!"); State saleState_ = saleState(); require(saleState_ == State.PublicSale, "Public Sale in not open yet!"); require(totalSupply() + number <= maxTotalTokens - (maxReservedMints - _reservedMints), "Not enough NFTs left to mint.."); require(mintsPerAddress[msg.sender] + number <= maxMintPublicSale, "Maximum Mints per Address exceeded!"); require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs!"); _safeMint(msg.sender, number); mintsPerAddress[msg.sender] += number; } function tokenURI(uint256 tokenId_) public view virtual override returns (string memory) { require(_exists(tokenId_), "ERC721Metadata: URI query for nonexistent token"); //check to see that 24 hours have passed since beginning of publicsale launch if (revealTime == 0) { return unrevealedURI; } else { string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId_.toString(), '.json')) : ""; } } //reserved NFTs for creator function reservedMint(uint number, address recipient) public onlyOwner { require(_reservedMints + number <= maxReservedMints, "Not enough Reserved NFTs left to mint.."); _safeMint(recipient, number); mintsPerAddress[recipient] += number; _reservedMints += number; } //se the current account balance function accountBalance() public onlyOwner view returns(uint) { return address(this).balance; } //retrieve all funds recieved from minting function withdraw() public onlyOwner { uint256 balance = accountBalance(); require(balance > 0, 'No Funds to withdraw, Balance is 0'); _withdraw(payable(0x256390D941187F536Dd56Ba224e779786c6265A0), (balance * 66) / 100); _withdraw(payable(0xF22305ad50E7b36A81EF08d0995Ef3F3788b20F0), accountBalance()); } //send the percentage of funds to a shareholder´s wallet function _withdraw(address payable account, uint256 amount) internal { (bool sent, ) = account.call{value: amount}(""); require(sent, "Failed to send Ether"); } //change the dummy account used for signing transactions function changeDummy(address _dummy) public onlyOwner { dummy = _dummy; } //to see the total amount of reserved mints left function reservedMintsLeft() public onlyOwner view returns(uint) { return maxReservedMints - _reservedMints; } //see current state of sale //see the current state of the sale function saleState() public view returns(State){ if (presaleLaunchTime == 0) { return State.NoSale; } else if (publicSaleLaunchTime == 0) { return State.Presale; } else { return State.PublicSale; } } //gets the cost of current mint function mintCost() public view returns(uint) { State saleState_ = saleState(); if (saleState_ != State.PublicSale) { return mintCostPresale; } else { return mintCostPublicSale; } } //ability to change the mint cost of the current sale function changeMintCost(uint256 newCost) public onlyOwner { State saleState_ = saleState(); if (saleState_ != State.PublicSale) { mintCostPresale = newCost; } else { mintCostPublicSale = newCost; } } //ability to change the max mint of the current sale function changeMaxMint(uint256 newMax) public onlyOwner { require(newMax > 0, "Max Mint cannot be 0!"); State saleState_ = saleState(); if (saleState_ != State.PublicSale) { maxMintPresale = newMax; } else { maxMintPublicSale = newMax; } } //add to the total amount of nft that are able to be minted function addTokens(uint number) public onlyOwner { require(number > 0, "Cannot add 0 tokens!"); maxTotalTokens += number; } //see when NFTs will be revealed function timeOfReveal() public view returns(uint256) { require(revealTime != 0, 'NFT Reveal Time has not been determined yet!'); return revealTime; } function reveal() public onlyOwner { require(revealTime == 0, "Collection has already been revealed!"); revealTime = block.timestamp; } function isPaused() public view returns(bool) { return paused_; } function togglePause() public onlyOwner { paused_ = !paused_; } function isOGPaused() public view returns(bool){ return OGpaused_; } function toggleOGPause() public onlyOwner { OGpaused_ = !OGpaused_; } function OGMintsLeft(address account) public view returns(uint) { if (OGmintsPerAddress[account] >= CrazyCamels.balanceOf(account)) { return 0; } else { return CrazyCamels.balanceOf(account) - OGmintsPerAddress[account]; } } function balanceOfCrazyCamels(address account) public view returns(uint) { return CrazyCamels.balanceOf(account); } function changeCrazyCamels(address newCrazyCamels) public onlyOwner { require(newCrazyCamels != address(0), "Cannot be the 0 address!"); CrazyCamels = IERC721(newCrazyCamels); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OGMintsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"OGSaleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"addTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOfCrazyCamels","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCrazyCamels","type":"address"}],"name":"changeCrazyCamels","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dummy","type":"address"}],"name":"changeDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"changeMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"changeMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"changeUnrevealedURI","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":[],"name":"isOGPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reservedMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMintsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","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":[],"name":"saleState","outputs":[{"internalType":"enum EvolvedCamels.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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":"switchToPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchToPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeOfReveal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleOGPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405266d529ae9e860000600a5567011c37937e080000600b556002600c556003600d5560de600f55601080546001600160a01b0319167380e4929c869102140e69550bbecc20bed61b080c1790553480156200005d57600080fd5b50604080518082018252600e81526d45766f6c7665642043616d656c7360901b602080830191825283518085019094526002845261454360f01b908401528151919291620000ae916001916200019e565b508051620000c49060029060208401906200019e565b505050620000e1620000db6200014860201b60201c565b6200014c565b6108ae600855601780546001600160a01b03191673062c74e593ce3c6574f126a1a35ab55dffdd63a617905560408051808201909152600b8082526a697066733a2f2f2e2e2e2f60a81b602090920191825262000141916018916200019e565b5062000281565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001ac9062000244565b90600052602060002090601f016020900481019282620001d057600085556200021b565b82601f10620001eb57805160ff19168380011785556200021b565b828001600101855582156200021b579182015b828111156200021b578251825591602001919060010190620001fe565b50620002299291506200022d565b5090565b5b808211156200022957600081556001016200022e565b600181811c908216806200025957607f821691505b602082108114156200027b57634e487b7160e01b600052602260045260246000fd5b50919050565b61333680620002916000396000f3fe6080604052600436106102e85760003560e01c80637035bf1811610190578063b88d4fde116100dc578063dcd4e73211610095578063f2fde38b1161006f578063f2fde38b1461087d578063f8ccc3ce1461089d578063ff984994146108bd578063ffcd55a8146108d257600080fd5b8063dcd4e7321461080c578063e985e9c51461081f578063eab417821461086857600080fd5b8063b88d4fde14610762578063bdb4b84814610782578063c4ae316814610797578063c4d8b9df146107ac578063c6ed8990146107cc578063c87b56dd146107ec57600080fd5b806395d89b4111610149578063af1035de11610123578063af1035de14610702578063b0a1c1c414610722578063b187bd2614610737578063b3ab66b01461074f57600080fd5b806395d89b41146106b8578063a22cb465146106cd578063a475b5dd146106ed57600080fd5b80637035bf181461061b57806370a0823114610630578063715018a6146106505780637c76f698146106655780637f1921ef1461067a5780638da5cb5b1461069a57600080fd5b80633023eba61161024f5780634520e916116102085780634f6ccce7116101e25780634f6ccce7146105a35780635a4dd61c146105c3578063603f4d52146105d95780636352211e146105fb57600080fd5b80634520e9161461055c57806345cb2e521461057157806346e0d1ab1461058e57600080fd5b80633023eba61461049a57806332624114146104c757806339a0c6f9146104e75780633b478c2c146105075780633ccfd60b1461052757806342842e0e1461053c57600080fd5b806318160ddd116102a157806318160ddd146103e557806318df64031461040457806319734c8b1461042457806320c63e3b1461043a57806323b872dd1461045a5780632f745c591461047a57600080fd5b80630191a657146102f457806301ffc9a71461031657806306fdde031461034b578063081812fc1461036d578063092cd34a146103a5578063095ea7b3146103c557600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004612c6c565b6108e8565b005b34801561032257600080fd5b50610336610331366004612c9d565b61093d565b60405190151581526020015b60405180910390f35b34801561035757600080fd5b506103606109aa565b6040516103429190612d12565b34801561037957600080fd5b5061038d610388366004612d25565b610a3c565b6040516001600160a01b039091168152602001610342565b3480156103b157600080fd5b506103146103c0366004612d25565b610ac7565b3480156103d157600080fd5b506103146103e0366004612d3e565b610c7f565b3480156103f157600080fd5b506000545b604051908152602001610342565b34801561041057600080fd5b5061031461041f366004612d68565b610d97565b34801561043057600080fd5b506103f6600d5481565b34801561044657600080fd5b50610314610455366004612d25565b610e84565b34801561046657600080fd5b50610314610475366004612d94565b610f2b565b34801561048657600080fd5b506103f6610495366004612d3e565b610f36565b3480156104a657600080fd5b506103f66104b5366004612c6c565b60156020526000908152604090205481565b3480156104d357600080fd5b506103366104e2366004612de1565b611093565b3480156104f357600080fd5b50610314610502366004612eaf565b61119f565b34801561051357600080fd5b506103f6610522366004612c6c565b6111dc565b34801561053357600080fd5b5061031461131e565b34801561054857600080fd5b50610314610557366004612d94565b611406565b34801561056857600080fd5b506103f6611421565b34801561057d57600080fd5b50601454610100900460ff16610336565b34801561059a57600080fd5b50610314611463565b3480156105af57600080fd5b506103f66105be366004612d25565b6114aa565b3480156105cf57600080fd5b506103f660085481565b3480156105e557600080fd5b506105ee61150c565b6040516103429190612f0e565b34801561060757600080fd5b5061038d610616366004612d25565b611532565b34801561062757600080fd5b50610360611544565b34801561063c57600080fd5b506103f661064b366004612c6c565b6115d2565b34801561065c57600080fd5b50610314611663565b34801561067157600080fd5b506103f6611699565b34801561068657600080fd5b50610314610695366004612d25565b61170a565b3480156106a657600080fd5b506007546001600160a01b031661038d565b3480156106c457600080fd5b50610360611765565b3480156106d957600080fd5b506103146106e8366004612f36565b611774565b3480156106f957600080fd5b50610314611839565b34801561070e57600080fd5b5061031461071d366004612c6c565b6118c7565b34801561072e57600080fd5b506103f6611969565b34801561074357600080fd5b5060145460ff16610336565b61031461075d366004612d25565b61199b565b34801561076e57600080fd5b5061031461077d366004612f72565b611b7d565b34801561078e57600080fd5b506103f6611bb6565b3480156107a357600080fd5b50610314611bec565b3480156107b857600080fd5b506103146107c7366004612eaf565b611c2a565b3480156107d857600080fd5b506103146107e7366004612d25565b611c67565b3480156107f857600080fd5b50610360610807366004612d25565b611cea565b61031461081a366004612fee565b611e50565b34801561082b57600080fd5b5061033661083a366004613014565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561087457600080fd5b50610314612087565b34801561088957600080fd5b50610314610898366004612c6c565b612117565b3480156108a957600080fd5b506103f66108b8366004612c6c565b6121af565b3480156108c957600080fd5b5061031461222d565b3480156108de57600080fd5b506103f6600c5481565b6007546001600160a01b0316331461091b5760405162461bcd60e51b81526004016109129061303e565b60405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b148061096e57506001600160e01b03198216635b5e139f60e01b145b8061098957506001600160e01b0319821663780e9d6360e01b145b806109a457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546109b990613073565b80601f01602080910402602001604051908101604052809291908181526020018280546109e590613073565b8015610a325780601f10610a0757610100808354040283529160200191610a32565b820191906000526020600020905b815481529060010190602001808311610a1557829003601f168201915b5050505050905090565b6000610a49826000541190565b610aab5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610912565b506000908152600560205260409020546001600160a01b031690565b601454610100900460ff1615610b115760405162461bcd60e51b815260206004820152600f60248201526e53616c6520697320636c6f7365642160881b6044820152606401610912565b600e54600f54610b2191906130c4565b600854610b2e91906130c4565b81610b3860005490565b610b4291906130db565b1115610b605760405162461bcd60e51b8152600401610912906130f3565b6017546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610ba357600080fd5b505afa158015610bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdb919061312a565b33600090815260166020526040902054610bf69083906130db565b1115610c4e5760405162461bcd60e51b815260206004820152602160248201527f31204d696e7420706572204372617a792043616d656c204e4654204f776e65646044820152602160f81b6064820152608401610912565b610c5833826122c5565b3360009081526016602052604081208054839290610c779084906130db565b909155505050565b6000610c8a82611532565b9050806001600160a01b0316836001600160a01b03161415610cf95760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610912565b336001600160a01b0382161480610d155750610d15813361083a565b610d875760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610912565b610d928383836122df565b505050565b6007546001600160a01b03163314610dc15760405162461bcd60e51b81526004016109129061303e565b600f5482600e54610dd291906130db565b1115610e305760405162461bcd60e51b815260206004820152602760248201527f4e6f7420656e6f756768205265736572766564204e465473206c65667420746f6044820152661036b4b73a171760c91b6064820152608401610912565b610e3a81836122c5565b6001600160a01b03811660009081526015602052604081208054849290610e629084906130db565b9250508190555081600e6000828254610e7b91906130db565b90915550505050565b6007546001600160a01b03163314610eae5760405162461bcd60e51b81526004016109129061303e565b60008111610ef65760405162461bcd60e51b81526020600482015260156024820152744d6178204d696e742063616e6e6f7420626520302160581b6044820152606401610912565b6000610f0061150c565b90506002816002811115610f1657610f16612ef8565b14610f215750600c55565b600d8290555b5050565b610d9283838361233b565b6000610f41836115d2565b8210610f9a5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610912565b600080549080805b83811015611033576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610ff557805192505b876001600160a01b0316836001600160a01b0316141561102a5786841415611023575093506109a492505050565b6001909301925b50600101610fa2565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610912565b6040516bffffffffffffffffffffffff1930606090811b8216602084015286901b166034820152600090819060480160405160208183030381529060405280519060200120905060018160405160200161111991907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611177573d6000803e3d6000fd5b5050604051601f1901516010546001600160a01b03908116911614925050505b949350505050565b6007546001600160a01b031633146111c95760405162461bcd60e51b81526004016109129061303e565b8051610f27906009906020840190612bc5565b6017546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125a919061312a565b6001600160a01b0383166000908152601660205260409020541061128057506000919050565b6001600160a01b03828116600081815260166020526040908190205460175491516370a0823160e01b815260048101939093529216906370a082319060240160206040518083038186803b1580156112d757600080fd5b505afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f919061312a565b6109a491906130c4565b919050565b6007546001600160a01b031633146113485760405162461bcd60e51b81526004016109129061303e565b6000611352611969565b9050600081116113af5760405162461bcd60e51b815260206004820152602260248201527f4e6f2046756e647320746f2077697468647261772c2042616c616e6365206973604482015261020360f41b6064820152608401610912565b6113e373256390d941187f536dd56ba224e779786c6265a060646113d4846042613143565b6113de9190613178565b612620565b61140373f22305ad50e7b36a81ef08d0995ef3f3788b20f06113de611969565b50565b610d9283838360405180602001604052806000815250611b7d565b6007546000906001600160a01b0316331461144e5760405162461bcd60e51b81526004016109129061303e565b600e54600f5461145e91906130c4565b905090565b6007546001600160a01b0316331461148d5760405162461bcd60e51b81526004016109129061303e565b6014805461ff001981166101009182900460ff1615909102179055565b6000805482106115085760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610912565b5090565b60006011546000141561151f5750600090565b60125461152c5750600190565b50600290565b600061153d826126ba565b5192915050565b6018805461155190613073565b80601f016020809104026020016040519081016040528092919081815260200182805461157d90613073565b80156115ca5780601f1061159f576101008083540402835291602001916115ca565b820191906000526020600020905b8154815290600101906020018083116115ad57829003601f168201915b505050505081565b60006001600160a01b03821661163e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610912565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b0316331461168d5760405162461bcd60e51b81526004016109129061303e565b6116976000612791565b565b6000601354600014156117035760405162461bcd60e51b815260206004820152602c60248201527f4e46542052657665616c2054696d6520686173206e6f74206265656e2064657460448201526b65726d696e6564207965742160a01b6064820152608401610912565b5060135490565b6007546001600160a01b031633146117345760405162461bcd60e51b81526004016109129061303e565b600061173e61150c565b9050600281600281111561175457611754612ef8565b1461175f5750600a55565b50600b55565b6060600280546109b990613073565b6001600160a01b0382163314156117cd5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610912565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146118635760405162461bcd60e51b81526004016109129061303e565b601354156118c15760405162461bcd60e51b815260206004820152602560248201527f436f6c6c656374696f6e2068617320616c7265616479206265656e2072657665604482015264616c65642160d81b6064820152608401610912565b42601355565b6007546001600160a01b031633146118f15760405162461bcd60e51b81526004016109129061303e565b6001600160a01b0381166119475760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420626520746865203020616464726573732100000000000000006044820152606401610912565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6007546000906001600160a01b031633146119965760405162461bcd60e51b81526004016109129061303e565b504790565b60145460ff16156119e05760405162461bcd60e51b815260206004820152600f60248201526e53616c65206973207061757365642160881b6044820152606401610912565b60006119ea61150c565b90506002816002811115611a0057611a00612ef8565b14611a4d5760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632053616c6520696e206e6f74206f70656e2079657421000000006044820152606401610912565b600e54600f54611a5d91906130c4565b600854611a6a91906130c4565b82611a7460005490565b611a7e91906130db565b1115611a9c5760405162461bcd60e51b8152600401610912906130f3565b600d5433600090815260156020526040902054611aba9084906130db565b1115611ad85760405162461bcd60e51b81526004016109129061318c565b81611ae1611bb6565b611aeb9190613143565b341015611b545760405162461bcd60e51b815260206004820152603160248201527f4e6f742073756666696369656e7420457468657220746f206d696e74207468696044820152707320616d6f756e74206f66204e4654732160781b6064820152608401610912565b611b5e33836122c5565b3360009081526015602052604081208054849290610e7b9084906130db565b611b8884848461233b565b611b94848484846127e3565b611bb05760405162461bcd60e51b8152600401610912906131cf565b50505050565b600080611bc161150c565b90506002816002811115611bd757611bd7612ef8565b14611be4575050600a5490565b5050600b5490565b6007546001600160a01b03163314611c165760405162461bcd60e51b81526004016109129061303e565b6014805460ff19811660ff90911615179055565b6007546001600160a01b03163314611c545760405162461bcd60e51b81526004016109129061303e565b8051610f27906018906020840190612bc5565b6007546001600160a01b03163314611c915760405162461bcd60e51b81526004016109129061303e565b60008111611cd85760405162461bcd60e51b815260206004820152601460248201527343616e6e6f7420616464203020746f6b656e732160601b6044820152606401610912565b8060086000828254610c7791906130db565b6060611cf7826000541190565b611d5b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610912565b601354611df45760188054611d6f90613073565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9b90613073565b8015611de85780601f10611dbd57610100808354040283529160200191611de8565b820191906000526020600020905b815481529060010190602001808311611dcb57829003601f168201915b50505050509050919050565b6000611dfe6128ed565b90506000815111611e1e5760405180602001604052806000815250611e49565b80611e28846128fc565b604051602001611e39929190613222565b6040516020818303038152906040525b9392505050565b828282611e5f33848484611093565b611e9f5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964205369676e617475726560781b6044820152606401610912565b60145460ff1615611ee45760405162461bcd60e51b815260206004820152600f60248201526e53616c65206973207061757365642160881b6044820152606401610912565b6000611eee61150c565b90506001816002811115611f0457611f04612ef8565b14611f495760405162461bcd60e51b815260206004820152601560248201527453616c6520696e206e6f74206f70656e207965742160581b6044820152606401610912565b600e54600f54611f5991906130c4565b600854611f6691906130c4565b88611f7060005490565b611f7a91906130db565b1115611f985760405162461bcd60e51b8152600401610912906130f3565b600c5433600090815260156020526040902054611fb6908a906130db565b1115611fd45760405162461bcd60e51b81526004016109129061318c565b87611fdd611bb6565b611fe79190613143565b34101561204f5760405162461bcd60e51b815260206004820152603060248201527f4e6f742073756666696369656e7420457468657220746f206d696e742074686960448201526f7320616d6f756e74206f66204e46547360801b6064820152608401610912565b61205933896122c5565b33600090815260156020526040812080548a92906120789084906130db565b90915550505050505050505050565b6007546001600160a01b031633146120b15760405162461bcd60e51b81526004016109129061303e565b60006120bb61150c565b60028111156120cc576120cc612ef8565b146121115760405162461bcd60e51b815260206004820152601560248201527453616c6520697320616c7265616479204f70656e2160581b6044820152606401610912565b42601155565b6007546001600160a01b031633146121415760405162461bcd60e51b81526004016109129061303e565b6001600160a01b0381166121a65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610912565b61140381612791565b6017546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b1580156121f557600080fd5b505afa158015612209573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a4919061312a565b6007546001600160a01b031633146122575760405162461bcd60e51b81526004016109129061303e565b600161226161150c565b600281111561227257612272612ef8565b146122bf5760405162461bcd60e51b815260206004820152601860248201527f53616c65206d75737420626520696e2050726573616c652100000000000000006044820152606401610912565b42601255565b610f278282604051806020016040528060008152506129fa565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612346826126ba565b80519091506000906001600160a01b0316336001600160a01b0316148061237d57503361237284610a3c565b6001600160a01b0316145b8061238f5750815161238f903361083a565b9050806123f95760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610912565b846001600160a01b031682600001516001600160a01b03161461246d5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610912565b6001600160a01b0384166124d15760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610912565b6124e160008484600001516122df565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff16021790559086018083529120549091166125d657612589816000541190565b156125d6578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461266d576040519150601f19603f3d011682016040523d82523d6000602084013e612672565b606091505b5050905080610d925760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610912565b60408051808201909152600080825260208201526126d9826000541190565b6127385760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610912565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612787579392505050565b506000190161273a565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156128e557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612827903390899088908890600401613261565b602060405180830381600087803b15801561284157600080fd5b505af1925050508015612871575060408051601f3d908101601f1916820190925261286e9181019061329e565b60015b6128cb573d80801561289f576040519150601f19603f3d011682016040523d82523d6000602084013e6128a4565b606091505b5080516128c35760405162461bcd60e51b8152600401610912906131cf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611197565b506001611197565b6060600980546109b990613073565b6060816129205750506040805180820190915260018152600360fc1b602082015290565b8160005b811561294a5780612934816132bb565b91506129439050600a83613178565b9150612924565b60008167ffffffffffffffff81111561296557612965612e23565b6040519080825280601f01601f19166020018201604052801561298f576020820181803683370190505b5090505b8415611197576129a46001836130c4565b91506129b1600a866132d6565b6129bc9060306130db565b60f81b8183815181106129d1576129d16132ea565b60200101906001600160f81b031916908160001a9053506129f3600a86613178565b9450612993565b610d9283838360016000546001600160a01b038516612a655760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610912565b83612ac35760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610912565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b85811015612bbc5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612bb057612b9460008884886127e3565b612bb05760405162461bcd60e51b8152600401610912906131cf565b60019182019101612b41565b50600055612619565b828054612bd190613073565b90600052602060002090601f016020900481019282612bf35760008555612c39565b82601f10612c0c57805160ff1916838001178555612c39565b82800160010185558215612c39579182015b82811115612c39578251825591602001919060010190612c1e565b506115089291505b808211156115085760008155600101612c41565b80356001600160a01b038116811461131957600080fd5b600060208284031215612c7e57600080fd5b611e4982612c55565b6001600160e01b03198116811461140357600080fd5b600060208284031215612caf57600080fd5b8135611e4981612c87565b60005b83811015612cd5578181015183820152602001612cbd565b83811115611bb05750506000910152565b60008151808452612cfe816020860160208601612cba565b601f01601f19169290920160200192915050565b602081526000611e496020830184612ce6565b600060208284031215612d3757600080fd5b5035919050565b60008060408385031215612d5157600080fd5b612d5a83612c55565b946020939093013593505050565b60008060408385031215612d7b57600080fd5b82359150612d8b60208401612c55565b90509250929050565b600080600060608486031215612da957600080fd5b612db284612c55565b9250612dc060208501612c55565b9150604084013590509250925092565b803560ff8116811461131957600080fd5b60008060008060808587031215612df757600080fd5b612e0085612c55565b9350612e0e60208601612dd0565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612e5457612e54612e23565b604051601f8501601f19908116603f01168101908282118183101715612e7c57612e7c612e23565b81604052809350858152868686011115612e9557600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612ec157600080fd5b813567ffffffffffffffff811115612ed857600080fd5b8201601f81018413612ee957600080fd5b61119784823560208401612e39565b634e487b7160e01b600052602160045260246000fd5b6020810160038310612f3057634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215612f4957600080fd5b612f5283612c55565b915060208301358015158114612f6757600080fd5b809150509250929050565b60008060008060808587031215612f8857600080fd5b612f9185612c55565b9350612f9f60208601612c55565b925060408501359150606085013567ffffffffffffffff811115612fc257600080fd5b8501601f81018713612fd357600080fd5b612fe287823560208401612e39565b91505092959194509250565b6000806000806080858703121561300457600080fd5b84359350612e0e60208601612dd0565b6000806040838503121561302757600080fd5b61303083612c55565b9150612d8b60208401612c55565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061308757607f821691505b602082108114156130a857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156130d6576130d66130ae565b500390565b600082198211156130ee576130ee6130ae565b500190565b6020808252601e908201527f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000604082015260600190565b60006020828403121561313c57600080fd5b5051919050565b600081600019048311821515161561315d5761315d6130ae565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261318757613187613162565b500490565b60208082526023908201527f4d6178696d756d204d696e74732070657220416464726573732065786365656460408201526265642160e81b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351613234818460208801612cba565b835190830190613248818360208801612cba565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061329490830184612ce6565b9695505050505050565b6000602082840312156132b057600080fd5b8151611e4981612c87565b60006000198214156132cf576132cf6130ae565b5060010190565b6000826132e5576132e5613162565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220462e65485a491786d1f035036b29302870b9162be7aa9e37bfa615116084cbca64736f6c63430008090033
Deployed Bytecode
0x6080604052600436106102e85760003560e01c80637035bf1811610190578063b88d4fde116100dc578063dcd4e73211610095578063f2fde38b1161006f578063f2fde38b1461087d578063f8ccc3ce1461089d578063ff984994146108bd578063ffcd55a8146108d257600080fd5b8063dcd4e7321461080c578063e985e9c51461081f578063eab417821461086857600080fd5b8063b88d4fde14610762578063bdb4b84814610782578063c4ae316814610797578063c4d8b9df146107ac578063c6ed8990146107cc578063c87b56dd146107ec57600080fd5b806395d89b4111610149578063af1035de11610123578063af1035de14610702578063b0a1c1c414610722578063b187bd2614610737578063b3ab66b01461074f57600080fd5b806395d89b41146106b8578063a22cb465146106cd578063a475b5dd146106ed57600080fd5b80637035bf181461061b57806370a0823114610630578063715018a6146106505780637c76f698146106655780637f1921ef1461067a5780638da5cb5b1461069a57600080fd5b80633023eba61161024f5780634520e916116102085780634f6ccce7116101e25780634f6ccce7146105a35780635a4dd61c146105c3578063603f4d52146105d95780636352211e146105fb57600080fd5b80634520e9161461055c57806345cb2e521461057157806346e0d1ab1461058e57600080fd5b80633023eba61461049a57806332624114146104c757806339a0c6f9146104e75780633b478c2c146105075780633ccfd60b1461052757806342842e0e1461053c57600080fd5b806318160ddd116102a157806318160ddd146103e557806318df64031461040457806319734c8b1461042457806320c63e3b1461043a57806323b872dd1461045a5780632f745c591461047a57600080fd5b80630191a657146102f457806301ffc9a71461031657806306fdde031461034b578063081812fc1461036d578063092cd34a146103a5578063095ea7b3146103c557600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004612c6c565b6108e8565b005b34801561032257600080fd5b50610336610331366004612c9d565b61093d565b60405190151581526020015b60405180910390f35b34801561035757600080fd5b506103606109aa565b6040516103429190612d12565b34801561037957600080fd5b5061038d610388366004612d25565b610a3c565b6040516001600160a01b039091168152602001610342565b3480156103b157600080fd5b506103146103c0366004612d25565b610ac7565b3480156103d157600080fd5b506103146103e0366004612d3e565b610c7f565b3480156103f157600080fd5b506000545b604051908152602001610342565b34801561041057600080fd5b5061031461041f366004612d68565b610d97565b34801561043057600080fd5b506103f6600d5481565b34801561044657600080fd5b50610314610455366004612d25565b610e84565b34801561046657600080fd5b50610314610475366004612d94565b610f2b565b34801561048657600080fd5b506103f6610495366004612d3e565b610f36565b3480156104a657600080fd5b506103f66104b5366004612c6c565b60156020526000908152604090205481565b3480156104d357600080fd5b506103366104e2366004612de1565b611093565b3480156104f357600080fd5b50610314610502366004612eaf565b61119f565b34801561051357600080fd5b506103f6610522366004612c6c565b6111dc565b34801561053357600080fd5b5061031461131e565b34801561054857600080fd5b50610314610557366004612d94565b611406565b34801561056857600080fd5b506103f6611421565b34801561057d57600080fd5b50601454610100900460ff16610336565b34801561059a57600080fd5b50610314611463565b3480156105af57600080fd5b506103f66105be366004612d25565b6114aa565b3480156105cf57600080fd5b506103f660085481565b3480156105e557600080fd5b506105ee61150c565b6040516103429190612f0e565b34801561060757600080fd5b5061038d610616366004612d25565b611532565b34801561062757600080fd5b50610360611544565b34801561063c57600080fd5b506103f661064b366004612c6c565b6115d2565b34801561065c57600080fd5b50610314611663565b34801561067157600080fd5b506103f6611699565b34801561068657600080fd5b50610314610695366004612d25565b61170a565b3480156106a657600080fd5b506007546001600160a01b031661038d565b3480156106c457600080fd5b50610360611765565b3480156106d957600080fd5b506103146106e8366004612f36565b611774565b3480156106f957600080fd5b50610314611839565b34801561070e57600080fd5b5061031461071d366004612c6c565b6118c7565b34801561072e57600080fd5b506103f6611969565b34801561074357600080fd5b5060145460ff16610336565b61031461075d366004612d25565b61199b565b34801561076e57600080fd5b5061031461077d366004612f72565b611b7d565b34801561078e57600080fd5b506103f6611bb6565b3480156107a357600080fd5b50610314611bec565b3480156107b857600080fd5b506103146107c7366004612eaf565b611c2a565b3480156107d857600080fd5b506103146107e7366004612d25565b611c67565b3480156107f857600080fd5b50610360610807366004612d25565b611cea565b61031461081a366004612fee565b611e50565b34801561082b57600080fd5b5061033661083a366004613014565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561087457600080fd5b50610314612087565b34801561088957600080fd5b50610314610898366004612c6c565b612117565b3480156108a957600080fd5b506103f66108b8366004612c6c565b6121af565b3480156108c957600080fd5b5061031461222d565b3480156108de57600080fd5b506103f6600c5481565b6007546001600160a01b0316331461091b5760405162461bcd60e51b81526004016109129061303e565b60405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b148061096e57506001600160e01b03198216635b5e139f60e01b145b8061098957506001600160e01b0319821663780e9d6360e01b145b806109a457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546109b990613073565b80601f01602080910402602001604051908101604052809291908181526020018280546109e590613073565b8015610a325780601f10610a0757610100808354040283529160200191610a32565b820191906000526020600020905b815481529060010190602001808311610a1557829003601f168201915b5050505050905090565b6000610a49826000541190565b610aab5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610912565b506000908152600560205260409020546001600160a01b031690565b601454610100900460ff1615610b115760405162461bcd60e51b815260206004820152600f60248201526e53616c6520697320636c6f7365642160881b6044820152606401610912565b600e54600f54610b2191906130c4565b600854610b2e91906130c4565b81610b3860005490565b610b4291906130db565b1115610b605760405162461bcd60e51b8152600401610912906130f3565b6017546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610ba357600080fd5b505afa158015610bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdb919061312a565b33600090815260166020526040902054610bf69083906130db565b1115610c4e5760405162461bcd60e51b815260206004820152602160248201527f31204d696e7420706572204372617a792043616d656c204e4654204f776e65646044820152602160f81b6064820152608401610912565b610c5833826122c5565b3360009081526016602052604081208054839290610c779084906130db565b909155505050565b6000610c8a82611532565b9050806001600160a01b0316836001600160a01b03161415610cf95760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610912565b336001600160a01b0382161480610d155750610d15813361083a565b610d875760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610912565b610d928383836122df565b505050565b6007546001600160a01b03163314610dc15760405162461bcd60e51b81526004016109129061303e565b600f5482600e54610dd291906130db565b1115610e305760405162461bcd60e51b815260206004820152602760248201527f4e6f7420656e6f756768205265736572766564204e465473206c65667420746f6044820152661036b4b73a171760c91b6064820152608401610912565b610e3a81836122c5565b6001600160a01b03811660009081526015602052604081208054849290610e629084906130db565b9250508190555081600e6000828254610e7b91906130db565b90915550505050565b6007546001600160a01b03163314610eae5760405162461bcd60e51b81526004016109129061303e565b60008111610ef65760405162461bcd60e51b81526020600482015260156024820152744d6178204d696e742063616e6e6f7420626520302160581b6044820152606401610912565b6000610f0061150c565b90506002816002811115610f1657610f16612ef8565b14610f215750600c55565b600d8290555b5050565b610d9283838361233b565b6000610f41836115d2565b8210610f9a5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610912565b600080549080805b83811015611033576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610ff557805192505b876001600160a01b0316836001600160a01b0316141561102a5786841415611023575093506109a492505050565b6001909301925b50600101610fa2565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610912565b6040516bffffffffffffffffffffffff1930606090811b8216602084015286901b166034820152600090819060480160405160208183030381529060405280519060200120905060018160405160200161111991907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611177573d6000803e3d6000fd5b5050604051601f1901516010546001600160a01b03908116911614925050505b949350505050565b6007546001600160a01b031633146111c95760405162461bcd60e51b81526004016109129061303e565b8051610f27906009906020840190612bc5565b6017546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125a919061312a565b6001600160a01b0383166000908152601660205260409020541061128057506000919050565b6001600160a01b03828116600081815260166020526040908190205460175491516370a0823160e01b815260048101939093529216906370a082319060240160206040518083038186803b1580156112d757600080fd5b505afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f919061312a565b6109a491906130c4565b919050565b6007546001600160a01b031633146113485760405162461bcd60e51b81526004016109129061303e565b6000611352611969565b9050600081116113af5760405162461bcd60e51b815260206004820152602260248201527f4e6f2046756e647320746f2077697468647261772c2042616c616e6365206973604482015261020360f41b6064820152608401610912565b6113e373256390d941187f536dd56ba224e779786c6265a060646113d4846042613143565b6113de9190613178565b612620565b61140373f22305ad50e7b36a81ef08d0995ef3f3788b20f06113de611969565b50565b610d9283838360405180602001604052806000815250611b7d565b6007546000906001600160a01b0316331461144e5760405162461bcd60e51b81526004016109129061303e565b600e54600f5461145e91906130c4565b905090565b6007546001600160a01b0316331461148d5760405162461bcd60e51b81526004016109129061303e565b6014805461ff001981166101009182900460ff1615909102179055565b6000805482106115085760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610912565b5090565b60006011546000141561151f5750600090565b60125461152c5750600190565b50600290565b600061153d826126ba565b5192915050565b6018805461155190613073565b80601f016020809104026020016040519081016040528092919081815260200182805461157d90613073565b80156115ca5780601f1061159f576101008083540402835291602001916115ca565b820191906000526020600020905b8154815290600101906020018083116115ad57829003601f168201915b505050505081565b60006001600160a01b03821661163e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610912565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b0316331461168d5760405162461bcd60e51b81526004016109129061303e565b6116976000612791565b565b6000601354600014156117035760405162461bcd60e51b815260206004820152602c60248201527f4e46542052657665616c2054696d6520686173206e6f74206265656e2064657460448201526b65726d696e6564207965742160a01b6064820152608401610912565b5060135490565b6007546001600160a01b031633146117345760405162461bcd60e51b81526004016109129061303e565b600061173e61150c565b9050600281600281111561175457611754612ef8565b1461175f5750600a55565b50600b55565b6060600280546109b990613073565b6001600160a01b0382163314156117cd5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610912565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146118635760405162461bcd60e51b81526004016109129061303e565b601354156118c15760405162461bcd60e51b815260206004820152602560248201527f436f6c6c656374696f6e2068617320616c7265616479206265656e2072657665604482015264616c65642160d81b6064820152608401610912565b42601355565b6007546001600160a01b031633146118f15760405162461bcd60e51b81526004016109129061303e565b6001600160a01b0381166119475760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420626520746865203020616464726573732100000000000000006044820152606401610912565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6007546000906001600160a01b031633146119965760405162461bcd60e51b81526004016109129061303e565b504790565b60145460ff16156119e05760405162461bcd60e51b815260206004820152600f60248201526e53616c65206973207061757365642160881b6044820152606401610912565b60006119ea61150c565b90506002816002811115611a0057611a00612ef8565b14611a4d5760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632053616c6520696e206e6f74206f70656e2079657421000000006044820152606401610912565b600e54600f54611a5d91906130c4565b600854611a6a91906130c4565b82611a7460005490565b611a7e91906130db565b1115611a9c5760405162461bcd60e51b8152600401610912906130f3565b600d5433600090815260156020526040902054611aba9084906130db565b1115611ad85760405162461bcd60e51b81526004016109129061318c565b81611ae1611bb6565b611aeb9190613143565b341015611b545760405162461bcd60e51b815260206004820152603160248201527f4e6f742073756666696369656e7420457468657220746f206d696e74207468696044820152707320616d6f756e74206f66204e4654732160781b6064820152608401610912565b611b5e33836122c5565b3360009081526015602052604081208054849290610e7b9084906130db565b611b8884848461233b565b611b94848484846127e3565b611bb05760405162461bcd60e51b8152600401610912906131cf565b50505050565b600080611bc161150c565b90506002816002811115611bd757611bd7612ef8565b14611be4575050600a5490565b5050600b5490565b6007546001600160a01b03163314611c165760405162461bcd60e51b81526004016109129061303e565b6014805460ff19811660ff90911615179055565b6007546001600160a01b03163314611c545760405162461bcd60e51b81526004016109129061303e565b8051610f27906018906020840190612bc5565b6007546001600160a01b03163314611c915760405162461bcd60e51b81526004016109129061303e565b60008111611cd85760405162461bcd60e51b815260206004820152601460248201527343616e6e6f7420616464203020746f6b656e732160601b6044820152606401610912565b8060086000828254610c7791906130db565b6060611cf7826000541190565b611d5b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610912565b601354611df45760188054611d6f90613073565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9b90613073565b8015611de85780601f10611dbd57610100808354040283529160200191611de8565b820191906000526020600020905b815481529060010190602001808311611dcb57829003601f168201915b50505050509050919050565b6000611dfe6128ed565b90506000815111611e1e5760405180602001604052806000815250611e49565b80611e28846128fc565b604051602001611e39929190613222565b6040516020818303038152906040525b9392505050565b828282611e5f33848484611093565b611e9f5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964205369676e617475726560781b6044820152606401610912565b60145460ff1615611ee45760405162461bcd60e51b815260206004820152600f60248201526e53616c65206973207061757365642160881b6044820152606401610912565b6000611eee61150c565b90506001816002811115611f0457611f04612ef8565b14611f495760405162461bcd60e51b815260206004820152601560248201527453616c6520696e206e6f74206f70656e207965742160581b6044820152606401610912565b600e54600f54611f5991906130c4565b600854611f6691906130c4565b88611f7060005490565b611f7a91906130db565b1115611f985760405162461bcd60e51b8152600401610912906130f3565b600c5433600090815260156020526040902054611fb6908a906130db565b1115611fd45760405162461bcd60e51b81526004016109129061318c565b87611fdd611bb6565b611fe79190613143565b34101561204f5760405162461bcd60e51b815260206004820152603060248201527f4e6f742073756666696369656e7420457468657220746f206d696e742074686960448201526f7320616d6f756e74206f66204e46547360801b6064820152608401610912565b61205933896122c5565b33600090815260156020526040812080548a92906120789084906130db565b90915550505050505050505050565b6007546001600160a01b031633146120b15760405162461bcd60e51b81526004016109129061303e565b60006120bb61150c565b60028111156120cc576120cc612ef8565b146121115760405162461bcd60e51b815260206004820152601560248201527453616c6520697320616c7265616479204f70656e2160581b6044820152606401610912565b42601155565b6007546001600160a01b031633146121415760405162461bcd60e51b81526004016109129061303e565b6001600160a01b0381166121a65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610912565b61140381612791565b6017546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b1580156121f557600080fd5b505afa158015612209573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a4919061312a565b6007546001600160a01b031633146122575760405162461bcd60e51b81526004016109129061303e565b600161226161150c565b600281111561227257612272612ef8565b146122bf5760405162461bcd60e51b815260206004820152601860248201527f53616c65206d75737420626520696e2050726573616c652100000000000000006044820152606401610912565b42601255565b610f278282604051806020016040528060008152506129fa565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612346826126ba565b80519091506000906001600160a01b0316336001600160a01b0316148061237d57503361237284610a3c565b6001600160a01b0316145b8061238f5750815161238f903361083a565b9050806123f95760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610912565b846001600160a01b031682600001516001600160a01b03161461246d5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610912565b6001600160a01b0384166124d15760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610912565b6124e160008484600001516122df565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff16021790559086018083529120549091166125d657612589816000541190565b156125d6578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461266d576040519150601f19603f3d011682016040523d82523d6000602084013e612672565b606091505b5050905080610d925760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610912565b60408051808201909152600080825260208201526126d9826000541190565b6127385760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610912565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612787579392505050565b506000190161273a565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156128e557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612827903390899088908890600401613261565b602060405180830381600087803b15801561284157600080fd5b505af1925050508015612871575060408051601f3d908101601f1916820190925261286e9181019061329e565b60015b6128cb573d80801561289f576040519150601f19603f3d011682016040523d82523d6000602084013e6128a4565b606091505b5080516128c35760405162461bcd60e51b8152600401610912906131cf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611197565b506001611197565b6060600980546109b990613073565b6060816129205750506040805180820190915260018152600360fc1b602082015290565b8160005b811561294a5780612934816132bb565b91506129439050600a83613178565b9150612924565b60008167ffffffffffffffff81111561296557612965612e23565b6040519080825280601f01601f19166020018201604052801561298f576020820181803683370190505b5090505b8415611197576129a46001836130c4565b91506129b1600a866132d6565b6129bc9060306130db565b60f81b8183815181106129d1576129d16132ea565b60200101906001600160f81b031916908160001a9053506129f3600a86613178565b9450612993565b610d9283838360016000546001600160a01b038516612a655760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610912565b83612ac35760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610912565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b85811015612bbc5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612bb057612b9460008884886127e3565b612bb05760405162461bcd60e51b8152600401610912906131cf565b60019182019101612b41565b50600055612619565b828054612bd190613073565b90600052602060002090601f016020900481019282612bf35760008555612c39565b82601f10612c0c57805160ff1916838001178555612c39565b82800160010185558215612c39579182015b82811115612c39578251825591602001919060010190612c1e565b506115089291505b808211156115085760008155600101612c41565b80356001600160a01b038116811461131957600080fd5b600060208284031215612c7e57600080fd5b611e4982612c55565b6001600160e01b03198116811461140357600080fd5b600060208284031215612caf57600080fd5b8135611e4981612c87565b60005b83811015612cd5578181015183820152602001612cbd565b83811115611bb05750506000910152565b60008151808452612cfe816020860160208601612cba565b601f01601f19169290920160200192915050565b602081526000611e496020830184612ce6565b600060208284031215612d3757600080fd5b5035919050565b60008060408385031215612d5157600080fd5b612d5a83612c55565b946020939093013593505050565b60008060408385031215612d7b57600080fd5b82359150612d8b60208401612c55565b90509250929050565b600080600060608486031215612da957600080fd5b612db284612c55565b9250612dc060208501612c55565b9150604084013590509250925092565b803560ff8116811461131957600080fd5b60008060008060808587031215612df757600080fd5b612e0085612c55565b9350612e0e60208601612dd0565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612e5457612e54612e23565b604051601f8501601f19908116603f01168101908282118183101715612e7c57612e7c612e23565b81604052809350858152868686011115612e9557600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612ec157600080fd5b813567ffffffffffffffff811115612ed857600080fd5b8201601f81018413612ee957600080fd5b61119784823560208401612e39565b634e487b7160e01b600052602160045260246000fd5b6020810160038310612f3057634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215612f4957600080fd5b612f5283612c55565b915060208301358015158114612f6757600080fd5b809150509250929050565b60008060008060808587031215612f8857600080fd5b612f9185612c55565b9350612f9f60208601612c55565b925060408501359150606085013567ffffffffffffffff811115612fc257600080fd5b8501601f81018713612fd357600080fd5b612fe287823560208401612e39565b91505092959194509250565b6000806000806080858703121561300457600080fd5b84359350612e0e60208601612dd0565b6000806040838503121561302757600080fd5b61303083612c55565b9150612d8b60208401612c55565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061308757607f821691505b602082108114156130a857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156130d6576130d66130ae565b500390565b600082198211156130ee576130ee6130ae565b500190565b6020808252601e908201527f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000604082015260600190565b60006020828403121561313c57600080fd5b5051919050565b600081600019048311821515161561315d5761315d6130ae565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261318757613187613162565b500490565b60208082526023908201527f4d6178696d756d204d696e74732070657220416464726573732065786365656460408201526265642160e81b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351613234818460208801612cba565b835190830190613248818360208801612cba565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061329490830184612ce6565b9695505050505050565b6000602082840312156132b057600080fd5b8151611e4981612c87565b60006000198214156132cf576132cf6130ae565b5060010190565b6000826132e5576132e5613162565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220462e65485a491786d1f035036b29302870b9162be7aa9e37bfa615116084cbca64736f6c63430008090033
Deployed Bytecode Sourcemap
54949:11155:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;57162:8;;;62787:87;;;;;;;;;;-1:-1:-1;62787:87:0;;;;;:::i;:::-;;:::i;:::-;;41710:372;;;;;;;;;;-1:-1:-1;41710:372:0;;;;;:::i;:::-;;:::i;:::-;;;934:14:1;;927:22;909:41;;897:2;882:18;41710:372:0;;;;;;;;43596:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45158:214::-;;;;;;;;;;-1:-1:-1;45158:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2061:32:1;;;2043:51;;2031:2;2016:18;45158:214:0;1897:203:1;58951:466:0;;;;;;;;;;-1:-1:-1;58951:466:0;;;;;:::i;:::-;;:::i;44679:413::-;;;;;;;;;;-1:-1:-1;44679:413:0;;;;;:::i;:::-;;:::i;39959:108::-;;;;;;;;;;-1:-1:-1;40020:7:0;40047:12;39959:108;;;2510:25:1;;;2498:2;2483:18;39959:108:0;2364:177:1;61568:319:0;;;;;;;;;;-1:-1:-1;61568:319:0;;;;;:::i;:::-;;:::i;55513:36::-;;;;;;;;;;;;;;;;64162:324;;;;;;;;;;-1:-1:-1;64162:324:0;;;;;:::i;:::-;;:::i;46034:170::-;;;;;;;;;;-1:-1:-1;46034:170:0;;;;;:::i;:::-;;:::i;40631:1007::-;;;;;;;;;;-1:-1:-1;40631:1007:0;;;;;:::i;:::-;;:::i;56300:50::-;;;;;;;;;;-1:-1:-1;56300:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;58586:306;;;;;;;;;;-1:-1:-1;58586:306:0;;;;;:::i;:::-;;:::i;57389:109::-;;;;;;;;;;-1:-1:-1;57389:109:0;;;;;:::i;:::-;;:::i;65454:291::-;;;;;;;;;;-1:-1:-1;65454:291:0;;;;;:::i;:::-;;:::i;62106:349::-;;;;;;;;;;;;;:::i;46275:185::-;;;;;;;;;;-1:-1:-1;46275:185:0;;;;;:::i;:::-;;:::i;62941:124::-;;;;;;;;;;;;;:::i;65269:82::-;;;;;;;;;;-1:-1:-1;65334:9:0;;;;;;;65269:82;;65359:83;;;;;;;;;;;;;:::i;40144:187::-;;;;;;;;;;-1:-1:-1;40144:187:0;;;;;:::i;:::-;;:::i;55129:29::-;;;;;;;;;;;;;;;;63151:297;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43405:124::-;;;;;;;;;;-1:-1:-1;43405:124:0;;;;;:::i;:::-;;:::i;56663:27::-;;;;;;;;;;;;;:::i;42146:221::-;;;;;;;;;;-1:-1:-1;42146:221:0;;;;;:::i;:::-;;:::i;4591:94::-;;;;;;;;;;;;;:::i;64751:172::-;;;;;;;;;;;;;:::i;63821:275::-;;;;;;;;;;-1:-1:-1;63821:275:0;;;;;:::i;:::-;;:::i;3940:87::-;;;;;;;;;;-1:-1:-1;4013:6:0;;-1:-1:-1;;;;;4013:6:0;3940:87;;43765:104;;;;;;;;;;;;;:::i;45444:288::-;;;;;;;;;;-1:-1:-1;45444:288:0;;;;;:::i;:::-;;:::i;64931:158::-;;;;;;;;;;;;;:::i;65894:200::-;;;;;;;;;;-1:-1:-1;65894:200:0;;;;;:::i;:::-;;:::i;61937:109::-;;;;;;;;;;;;;:::i;65097:79::-;;;;;;;;;;-1:-1:-1;65161:7:0;;;;65097:79;;60267:676;;;;;;:::i;:::-;;:::i;46531:355::-;;;;;;;;;;-1:-1:-1;46531:355:0;;;;;:::i;:::-;;:::i;63497:257::-;;;;;;;;;;;;;:::i;65184:77::-;;;;;;;;;;;;;:::i;57506:125::-;;;;;;;;;;-1:-1:-1;57506:125:0;;;;;:::i;:::-;;:::i;64559:146::-;;;;;;;;;;-1:-1:-1;64559:146:0;;;;;:::i;:::-;;:::i;60955:568::-;;;;;;;;;;-1:-1:-1;60955:568:0;;;;;:::i;:::-;;:::i;59476:732::-;;;;;;:::i;:::-;;:::i;45803:164::-;;;;;;;;;;-1:-1:-1;45803:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;45924:25:0;;;45900:4;45924:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45803:164;57639:170;;;;;;;;;;;;;:::i;4840:192::-;;;;;;;;;;-1:-1:-1;4840:192:0;;;;;:::i;:::-;;:::i;65753:129::-;;;;;;;;;;-1:-1:-1;65753:129:0;;;;;:::i;:::-;;:::i;57817:180::-;;;;;;;;;;;;;:::i;55473:33::-;;;;;;;;;;;;;;;;62787:87;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;;;;;;;;;62852:5:::1;:14:::0;;-1:-1:-1;;;;;;62852:14:0::1;-1:-1:-1::0;;;;;62852:14:0;;;::::1;::::0;;;::::1;::::0;;62787:87::o;41710:372::-;41812:4;-1:-1:-1;;;;;;41849:40:0;;-1:-1:-1;;;41849:40:0;;:105;;-1:-1:-1;;;;;;;41906:48:0;;-1:-1:-1;;;41906:48:0;41849:105;:172;;;-1:-1:-1;;;;;;;41971:50:0;;-1:-1:-1;;;41971:50:0;41849:172;:225;;;-1:-1:-1;;;;;;;;;;16031:40:0;;;42038:36;41829:245;41710:372;-1:-1:-1;;41710:372:0:o;43596:100::-;43650:13;43683:5;43676:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43596:100;:::o;45158:214::-;45226:7;45254:16;45262:7;47198:4;47232:12;-1:-1:-1;47222:22:0;47141:111;45254:16;45246:74;;;;-1:-1:-1;;;45246:74:0;;8026:2:1;45246:74:0;;;8008:21:1;8065:2;8045:18;;;8038:30;8104:34;8084:18;;;8077:62;-1:-1:-1;;;8155:18:1;;;8148:43;8208:19;;45246:74:0;7824:409:1;45246:74:0;-1:-1:-1;45340:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45340:24:0;;45158:214::o;58951:466::-;59014:9;;;;;;;59013:10;59005:38;;;;-1:-1:-1;;;59005:38:0;;8440:2:1;59005:38:0;;;8422:21:1;8479:2;8459:18;;;8452:30;-1:-1:-1;;;8498:18:1;;;8491:45;8553:18;;59005:38:0;8238:339:1;59005:38:0;59125:14;;59106:16;;:33;;;;:::i;:::-;59088:14;;:52;;;;:::i;:::-;59078:6;59062:13;40020:7;40047:12;;39959:108;59062:13;:22;;;;:::i;:::-;:78;;59054:121;;;;-1:-1:-1;;;59054:121:0;;;;;;;:::i;:::-;59236:11;;:33;;-1:-1:-1;;;59236:33:0;;59258:10;59236:33;;;2043:51:1;-1:-1:-1;;;;;59236:11:0;;;;:21;;2016:18:1;;59236:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59212:10;59194:29;;;;:17;:29;;;;;;:38;;59226:6;;59194:38;:::i;:::-;:75;;59186:121;;;;-1:-1:-1;;;59186:121:0;;9727:2:1;59186:121:0;;;9709:21:1;9766:2;9746:18;;;9739:30;9805:34;9785:18;;;9778:62;-1:-1:-1;;;9856:18:1;;;9849:31;9897:19;;59186:121:0;9525:397:1;59186:121:0;59328:29;59338:10;59350:6;59328:9;:29::i;:::-;59386:10;59368:29;;;;:17;:29;;;;;:39;;59401:6;;59368:29;:39;;59401:6;;59368:39;:::i;:::-;;;;-1:-1:-1;;;58951:466:0:o;44679:413::-;44752:13;44768:24;44784:7;44768:15;:24::i;:::-;44752:40;;44817:5;-1:-1:-1;;;;;44811:11:0;:2;-1:-1:-1;;;;;44811:11:0;;;44803:58;;;;-1:-1:-1;;;44803:58:0;;10129:2:1;44803:58:0;;;10111:21:1;10168:2;10148:18;;;10141:30;10207:34;10187:18;;;10180:62;-1:-1:-1;;;10258:18:1;;;10251:32;10300:19;;44803:58:0;9927:398:1;44803:58:0;2808:10;-1:-1:-1;;;;;44896:21:0;;;;:62;;-1:-1:-1;44921:37:0;44938:5;2808:10;45803:164;:::i;44921:37::-;44874:169;;;;-1:-1:-1;;;44874:169:0;;10532:2:1;44874:169:0;;;10514:21:1;10571:2;10551:18;;;10544:30;10610:34;10590:18;;;10583:62;10681:27;10661:18;;;10654:55;10726:19;;44874:169:0;10330:421:1;44874:169:0;45056:28;45065:2;45069:7;45078:5;45056:8;:28::i;:::-;44741:351;44679:413;;:::o;61568:319::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;61685:16:::1;;61675:6;61658:14;;:23;;;;:::i;:::-;:43;;61650:95;;;::::0;-1:-1:-1;;;61650:95:0;;10958:2:1;61650:95:0::1;::::0;::::1;10940:21:1::0;10997:2;10977:18;;;10970:30;11036:34;11016:18;;;11009:62;-1:-1:-1;;;11087:18:1;;;11080:37;11134:19;;61650:95:0::1;10756:403:1::0;61650:95:0::1;61758:28;61768:9;61779:6;61758:9;:28::i;:::-;-1:-1:-1::0;;;;;61797:26:0;::::1;;::::0;;;:15:::1;:26;::::0;;;;:36;;61827:6;;61797:26;:36:::1;::::0;61827:6;;61797:36:::1;:::i;:::-;;;;;;;;61862:6;61844:14;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;61568:319:0:o;64162:324::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;64246:1:::1;64237:6;:10;64229:44;;;::::0;-1:-1:-1;;;64229:44:0;;11366:2:1;64229:44:0::1;::::0;::::1;11348:21:1::0;11405:2;11385:18;;;11378:30;-1:-1:-1;;;11424:18:1;;;11417:51;11485:18;;64229:44:0::1;11164:345:1::0;64229:44:0::1;64284:16;64303:11;:9;:11::i;:::-;64284:30:::0;-1:-1:-1;64343:16:0::1;64329:10;:30;;;;;;;;:::i;:::-;;64325:154;;-1:-1:-1::0;64376:14:0::1;:23:::0;64162:324::o;64325:154::-:1;64441:17;:26:::0;;;64325:154:::1;64218:268;64162:324:::0;:::o;46034:170::-;46168:28;46178:4;46184:2;46188:7;46168:9;:28::i;40631:1007::-;40720:7;40756:16;40766:5;40756:9;:16::i;:::-;40748:5;:24;40740:71;;;;-1:-1:-1;;;40740:71:0;;11716:2:1;40740:71:0;;;11698:21:1;11755:2;11735:18;;;11728:30;11794:34;11774:18;;;11767:62;-1:-1:-1;;;11845:18:1;;;11838:32;11887:19;;40740:71:0;11514:398:1;40740:71:0;40822:22;40047:12;;;40822:22;;41085:466;41105:14;41101:1;:18;41085:466;;;41145:31;41179:14;;;:11;:14;;;;;;;;;41145:48;;;;;;;;;-1:-1:-1;;;;;41145:48:0;;;;;-1:-1:-1;;;41145:48:0;;;;;;;;;;;;41216:28;41212:111;;41289:14;;;-1:-1:-1;41212:111:0;41366:5;-1:-1:-1;;;;;41345:26:0;:17;-1:-1:-1;;;;;41345:26:0;;41341:195;;;41415:5;41400:11;:20;41396:85;;;-1:-1:-1;41456:1:0;-1:-1:-1;41449:8:0;;-1:-1:-1;;;41449:8:0;41396:85;41503:13;;;;;41341:195;-1:-1:-1;41121:3:0;;41085:466;;;-1:-1:-1;41574:56:0;;-1:-1:-1;;;41574:56:0;;12119:2:1;41574:56:0;;;12101:21:1;12158:2;12138:18;;;12131:30;12197:34;12177:18;;;12170:62;-1:-1:-1;;;12248:18:1;;;12241:44;12302:19;;41574:56:0;11917:410:1;58586:306:0;58727:37;;-1:-1:-1;;58752:4:0;12559:2:1;12555:15;;;12551:24;;58727:37:0;;;12539::1;12610:15;;;12606:24;12592:12;;;12585:46;58685:4:0;;;;12647:12:1;;58727:37:0;;;;;;;;;;;;58717:48;;;;;;58702:63;;58792:92;58865:4;58812:58;;;;;;;12912:66:1;12900:79;;13004:2;12995:12;;12988:28;;;;13041:2;13032:12;;12670:380;58812:58:0;;;;-1:-1:-1;;58812:58:0;;;;;;;;;58802:69;;58812:58;58802:69;;;;58792:92;;;;;;;;;13282:25:1;13355:4;13343:17;;13323:18;;;13316:45;13377:18;;;13370:34;;;13420:18;;;13413:34;;;13254:19;;58792:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58792:92:0;;-1:-1:-1;;58792:92:0;;58783:5;;-1:-1:-1;;;;;58783:5:0;;;:101;;;;-1:-1:-1;;;58586:306:0;;;;;;;:::o;57389:109::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;57464:26;;::::1;::::0;:15:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;65454:291::-:0;65563:11;;:30;;-1:-1:-1;;;65563:30:0;;-1:-1:-1;;;;;2061:32:1;;;65563:30:0;;;2043:51:1;65512:4:0;;65563:11;;:21;;2016:18:1;;65563:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;65533:26:0;;;;;;:17;:26;;;;;;:60;65529:209;;-1:-1:-1;65617:1:0;;65454:291;-1:-1:-1;65454:291:0:o;65529:209::-;-1:-1:-1;;;;;65700:26:0;;;;;;;:17;:26;;;;;;;;65667:11;;:30;;-1:-1:-1;;;65667:30:0;;;;;2043:51:1;;;;65700:26:0;65667:11;;:21;;2016:18:1;;65667:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;65529:209::-;65454:291;;;:::o;62106:349::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;62154:15:::1;62172:16;:14;:16::i;:::-;62154:34;;62217:1;62207:7;:11;62199:58;;;::::0;-1:-1:-1;;;62199:58:0;;13660:2:1;62199:58:0::1;::::0;::::1;13642:21:1::0;13699:2;13679:18;;;13672:30;13738:34;13718:18;;;13711:62;-1:-1:-1;;;13789:18:1;;;13782:32;13831:19;;62199:58:0::1;13458:398:1::0;62199:58:0::1;62270:84;62288:42;62350:3;62334:12;:7:::0;62344:2:::1;62334:12;:::i;:::-;62333:20;;;;:::i;:::-;62270:9;:84::i;:::-;62366:80;62384:42;62429:16;:14;:16::i;62366:80::-;62143:312;62106:349::o:0;46275:185::-;46413:39;46430:4;46436:2;46440:7;46413:39;;;;;;;;;;;;:16;:39::i;62941:124::-;4013:6;;63000:4;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;63043:14:::1;;63024:16;;:33;;;;:::i;:::-;63017:40;;62941:124:::0;:::o;65359:83::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;65425:9:::1;::::0;;-1:-1:-1;;65412:22:0;::::1;65425:9;::::0;;;::::1;;;65424:10;65412:22:::0;;::::1;;::::0;;65359:83::o;40144:187::-;40211:7;40047:12;;40239:5;:21;40231:69;;;;-1:-1:-1;;;40231:69:0;;14493:2:1;40231:69:0;;;14475:21:1;14532:2;14512:18;;;14505:30;14571:34;14551:18;;;14544:62;-1:-1:-1;;;14622:18:1;;;14615:33;14665:19;;40231:69:0;14291:399:1;40231:69:0;-1:-1:-1;40318:5:0;40144:187::o;63151:297::-;63192:5;63213:17;;63234:1;63213:22;63209:232;;;-1:-1:-1;63259:12:0;;63151:297::o;63209:232::-;63302:20;;63298:143;;-1:-1:-1;63351:13:0;;63151:297::o;63298:143::-;-1:-1:-1;63413:16:0;;63151:297::o;43405:124::-;43469:7;43496:20;43508:7;43496:11;:20::i;:::-;:25;;43405:124;-1:-1:-1;;43405:124:0:o;56663:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42146:221::-;42210:7;-1:-1:-1;;;;;42238:19:0;;42230:75;;;;-1:-1:-1;;;42230:75:0;;14897:2:1;42230:75:0;;;14879:21:1;14936:2;14916:18;;;14909:30;14975:34;14955:18;;;14948:62;-1:-1:-1;;;15026:18:1;;;15019:41;15077:19;;42230:75:0;14695:407:1;42230:75:0;-1:-1:-1;;;;;;42331:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;42331:27:0;;42146:221::o;4591:94::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;4656:21:::1;4674:1;4656:9;:21::i;:::-;4591:94::o:0;64751:172::-;64795:7;64823:10;;64837:1;64823:15;;64815:72;;;;-1:-1:-1;;;64815:72:0;;15309:2:1;64815:72:0;;;15291:21:1;15348:2;15328:18;;;15321:30;15387:34;15367:18;;;15360:62;-1:-1:-1;;;15438:18:1;;;15431:42;15490:19;;64815:72:0;15107:408:1;64815:72:0;-1:-1:-1;64905:10:0;;;64751:172::o;63821:275::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;63890:16:::1;63909:11;:9;:11::i;:::-;63890:30:::0;-1:-1:-1;63949:16:0::1;63935:10;:30;;;;;;;;:::i;:::-;;63931:158;;-1:-1:-1::0;63982:15:0::1;:25:::0;64162:324::o;63931:158::-:1;-1:-1:-1::0;64049:18:0::1;:28:::0;63821:275::o;43765:104::-;43821:13;43854:7;43847:14;;;;;:::i;45444:288::-;-1:-1:-1;;;;;45539:24:0;;2808:10;45539:24;;45531:63;;;;-1:-1:-1;;;45531:63:0;;15722:2:1;45531:63:0;;;15704:21:1;15761:2;15741:18;;;15734:30;15800:28;15780:18;;;15773:56;15846:18;;45531:63:0;15520:350:1;45531:63:0;2808:10;45607:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;45607:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;45607:53:0;;;;;;;;;;45676:48;;909:41:1;;;45607:42:0;;2808:10;45676:48;;882:18:1;45676:48:0;;;;;;;45444:288;;:::o;64931:158::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;64985:10:::1;::::0;:15;64977:65:::1;;;::::0;-1:-1:-1;;;64977:65:0;;16077:2:1;64977:65:0::1;::::0;::::1;16059:21:1::0;16116:2;16096:18;;;16089:30;16155:34;16135:18;;;16128:62;-1:-1:-1;;;16206:18:1;;;16199:35;16251:19;;64977:65:0::1;15875:401:1::0;64977:65:0::1;65066:15;65053:10;:28:::0;64931:158::o;65894:200::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65981:28:0;::::1;65973:65;;;::::0;-1:-1:-1;;;65973:65:0;;16483:2:1;65973:65:0::1;::::0;::::1;16465:21:1::0;16522:2;16502:18;;;16495:30;16561:26;16541:18;;;16534:54;16605:18;;65973:65:0::1;16281:348:1::0;65973:65:0::1;66049:11;:37:::0;;-1:-1:-1;;;;;;66049:37:0::1;-1:-1:-1::0;;;;;66049:37:0;;;::::1;::::0;;;::::1;::::0;;65894:200::o;61937:109::-;4013:6;;61993:4;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;-1:-1:-1;62017:21:0::1;61937:109:::0;:::o;60267:676::-;60342:7;;;;60341:8;60333:36;;;;-1:-1:-1;;;60333:36:0;;16836:2:1;60333:36:0;;;16818:21:1;16875:2;16855:18;;;16848:30;-1:-1:-1;;;16894:18:1;;;16887:45;16949:18;;60333:36:0;16634:339:1;60333:36:0;60380:16;60399:11;:9;:11::i;:::-;60380:30;-1:-1:-1;60443:16:0;60429:10;:30;;;;;;;;:::i;:::-;;60421:71;;;;-1:-1:-1;;;60421:71:0;;17180:2:1;60421:71:0;;;17162:21:1;17219:2;17199:18;;;17192:30;17258;17238:18;;;17231:58;17306:18;;60421:71:0;16978:352:1;60421:71:0;60574:14;;60555:16;;:33;;;;:::i;:::-;60537:14;;:52;;;;:::i;:::-;60527:6;60511:13;40020:7;40047:12;;39959:108;60511:13;:22;;;;:::i;:::-;:78;;60503:121;;;;-1:-1:-1;;;60503:121:0;;;;;;;:::i;:::-;60683:17;;60659:10;60643:27;;;;:15;:27;;;;;;:36;;60673:6;;60643:36;:::i;:::-;:57;;60635:105;;;;-1:-1:-1;;;60635:105:0;;;;;;;:::i;:::-;60785:6;60772:10;:8;:10::i;:::-;:19;;;;:::i;:::-;60759:9;:32;;60751:94;;;;-1:-1:-1;;;60751:94:0;;17941:2:1;60751:94:0;;;17923:21:1;17980:2;17960:18;;;17953:30;18019:34;17999:18;;;17992:62;-1:-1:-1;;;18070:18:1;;;18063:47;18127:19;;60751:94:0;17739:413:1;60751:94:0;60858:29;60868:10;60880:6;60858:9;:29::i;:::-;60914:10;60898:27;;;;:15;:27;;;;;:37;;60929:6;;60898:27;:37;;60929:6;;60898:37;:::i;46531:355::-;46690:28;46700:4;46706:2;46710:7;46690:9;:28::i;:::-;46751:48;46774:4;46780:2;46784:7;46793:5;46751:22;:48::i;:::-;46729:149;;;;-1:-1:-1;;;46729:149:0;;;;;;;:::i;:::-;46531:355;;;;:::o;63497:257::-;63537:4;63554:16;63573:11;:9;:11::i;:::-;63554:30;-1:-1:-1;63613:16:0;63599:10;:30;;;;;;;;:::i;:::-;;63595:152;;-1:-1:-1;;63653:15:0;;;63497:257::o;63595:152::-;-1:-1:-1;;63717:18:0;;;63497:257::o;65184:77::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;65246:7:::1;::::0;;-1:-1:-1;;65235:18:0;::::1;65246:7;::::0;;::::1;65245:8;65235:18;::::0;;65184:77::o;57506:125::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;57593:30;;::::1;::::0;:13:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;64559:146::-:0;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;64636:1:::1;64627:6;:10;64619:43;;;::::0;-1:-1:-1;;;64619:43:0;;18779:2:1;64619:43:0::1;::::0;::::1;18761:21:1::0;18818:2;18798:18;;;18791:30;-1:-1:-1;;;18837:18:1;;;18830:50;18897:18;;64619:43:0::1;18577:344:1::0;64619:43:0::1;64691:6;64673:14;;:24;;;;;;;:::i;60955:568::-:0;61029:13;61063:17;61071:8;47198:4;47232:12;-1:-1:-1;47222:22:0;47141:111;61063:17;61055:77;;;;-1:-1:-1;;;61055:77:0;;19128:2:1;61055:77:0;;;19110:21:1;19167:2;19147:18;;;19140:30;19206:34;19186:18;;;19179:62;-1:-1:-1;;;19257:18:1;;;19250:45;19312:19;;61055:77:0;18926:411:1;61055:77:0;61244:10;;61240:272;;61283:13;61276:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60955:568;;;:::o;61240:272::-;61348:21;61372:10;:8;:10::i;:::-;61348:34;;61428:1;61410:7;61404:21;:25;:96;;;;;;;;;;;;;;;;;61456:7;61465:19;:8;:17;:19::i;:::-;61439:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61404:96;61397:103;60955:568;-1:-1:-1;;;60955:568:0:o;59476:732::-;59563:2;59568;59572;58088:41;58109:10;58120:2;58123;58126;58088:20;:41::i;:::-;58079:73;;;;-1:-1:-1;;;58079:73:0;;20186:2:1;58079:73:0;;;20168:21:1;20225:2;20205:18;;;20198:30;-1:-1:-1;;;20244:18:1;;;20237:47;20301:18;;58079:73:0;19984:341:1;58079:73:0;59611:7:::1;::::0;::::1;;59610:8;59602:36;;;::::0;-1:-1:-1;;;59602:36:0;;16836:2:1;59602:36:0::1;::::0;::::1;16818:21:1::0;16875:2;16855:18;;;16848:30;-1:-1:-1;;;16894:18:1;;;16887:45;16949:18;;59602:36:0::1;16634:339:1::0;59602:36:0::1;59649:16;59668:11;:9;:11::i;:::-;59649:30:::0;-1:-1:-1;59712:13:0::1;59698:10;:27;;;;;;;;:::i;:::-;;59690:61;;;::::0;-1:-1:-1;;;59690:61:0;;20532:2:1;59690:61:0::1;::::0;::::1;20514:21:1::0;20571:2;20551:18;;;20544:30;-1:-1:-1;;;20590:18:1;;;20583:51;20651:18;;59690:61:0::1;20330:345:1::0;59690:61:0::1;59833:14;;59814:16;;:33;;;;:::i;:::-;59796:14;;:52;;;;:::i;:::-;59786:6;59770:13;40020:7:::0;40047:12;;39959:108;59770:13:::1;:22;;;;:::i;:::-;:78;;59762:121;;;;-1:-1:-1::0;;;59762:121:0::1;;;;;;;:::i;:::-;59942:14;::::0;59918:10:::1;59902:27;::::0;;;:15:::1;:27;::::0;;;;;:36:::1;::::0;59932:6;;59902:36:::1;:::i;:::-;:54;;59894:102;;;;-1:-1:-1::0;;;59894:102:0::1;;;;;;;:::i;:::-;60041:6;60028:10;:8;:10::i;:::-;:19;;;;:::i;:::-;60015:9;:32;;60007:93;;;::::0;-1:-1:-1;;;60007:93:0;;20882:2:1;60007:93:0::1;::::0;::::1;20864:21:1::0;20921:2;20901:18;;;20894:30;20960:34;20940:18;;;20933:62;-1:-1:-1;;;21011:18:1;;;21004:46;21067:19;;60007:93:0::1;20680:412:1::0;60007:93:0::1;60121:29;60131:10;60143:6;60121:9;:29::i;:::-;60177:10;60161:27;::::0;;;:15:::1;:27;::::0;;;;:37;;60192:6;;60161:27;:37:::1;::::0;60192:6;;60161:37:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;;59476:732:0:o;57639:170::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;57717:12:::1;57702:11;:9;:11::i;:::-;:27;;;;;;;;:::i;:::-;;57694:61;;;::::0;-1:-1:-1;;;57694:61:0;;21299:2:1;57694:61:0::1;::::0;::::1;21281:21:1::0;21338:2;21318:18;;;21311:30;-1:-1:-1;;;21357:18:1;;;21350:51;21418:18;;57694:61:0::1;21097:345:1::0;57694:61:0::1;57786:15;57766:17;:35:::0;57639:170::o;4840:192::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4929:22:0;::::1;4921:73;;;::::0;-1:-1:-1;;;4921:73:0;;21649:2:1;4921:73:0::1;::::0;::::1;21631:21:1::0;21688:2;21668:18;;;21661:30;21727:34;21707:18;;;21700:62;-1:-1:-1;;;21778:18:1;;;21771:36;21824:19;;4921:73:0::1;21447:402:1::0;4921:73:0::1;5005:19;5015:8;5005:9;:19::i;65753:129::-:0;65844:11;;:30;;-1:-1:-1;;;65844:30:0;;-1:-1:-1;;;;;2061:32:1;;;65844:30:0;;;2043:51:1;65820:4:0;;65844:11;;:21;;2016:18:1;;65844:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;57817:180::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;57898:13:::1;57883:11;:9;:11::i;:::-;:28;;;;;;;;:::i;:::-;;57875:65;;;::::0;-1:-1:-1;;;57875:65:0;;22056:2:1;57875:65:0::1;::::0;::::1;22038:21:1::0;22095:2;22075:18;;;22068:30;22134:26;22114:18;;;22107:54;22178:18;;57875:65:0::1;21854:348:1::0;57875:65:0::1;57974:15;57951:20;:38:::0;57817:180::o;47260:104::-;47329:27;47339:2;47343:8;47329:27;;;;;;;;;;;;:9;:27::i;52061:196::-;52176:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;52176:29:0;-1:-1:-1;;;;;52176:29:0;;;;;;;;;52221:28;;52176:24;;52221:28;;;;;;;52061:196;;;:::o;49941:2002::-;50056:35;50094:20;50106:7;50094:11;:20::i;:::-;50169:18;;50056:58;;-1:-1:-1;50127:22:0;;-1:-1:-1;;;;;50153:34:0;2808:10;-1:-1:-1;;;;;50153:34:0;;:87;;;-1:-1:-1;2808:10:0;50204:20;50216:7;50204:11;:20::i;:::-;-1:-1:-1;;;;;50204:36:0;;50153:87;:154;;;-1:-1:-1;50274:18:0;;50257:50;;2808:10;45803:164;:::i;50257:50::-;50127:181;;50329:17;50321:80;;;;-1:-1:-1;;;50321:80:0;;22409:2:1;50321:80:0;;;22391:21:1;22448:2;22428:18;;;22421:30;22487:34;22467:18;;;22460:62;-1:-1:-1;;;22538:18:1;;;22531:48;22596:19;;50321:80:0;22207:414:1;50321:80:0;50444:4;-1:-1:-1;;;;;50422:26:0;:13;:18;;;-1:-1:-1;;;;;50422:26:0;;50414:77;;;;-1:-1:-1;;;50414:77:0;;22828:2:1;50414:77:0;;;22810:21:1;22867:2;22847:18;;;22840:30;22906:34;22886:18;;;22879:62;-1:-1:-1;;;22957:18:1;;;22950:36;23003:19;;50414:77:0;22626:402:1;50414:77:0;-1:-1:-1;;;;;50510:16:0;;50502:66;;;;-1:-1:-1;;;50502:66:0;;23235:2:1;50502:66:0;;;23217:21:1;23274:2;23254:18;;;23247:30;23313:34;23293:18;;;23286:62;-1:-1:-1;;;23364:18:1;;;23357:35;23409:19;;50502:66:0;23033:401:1;50502:66:0;50689:49;50706:1;50710:7;50719:13;:18;;;50689:8;:49::i;:::-;-1:-1:-1;;;;;51034:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;51034:31:0;;;-1:-1:-1;;;;;51034:31:0;;;-1:-1:-1;;51034:31:0;;;;;;;51080:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;51080:29:0;;;;;;;;;;;;;51126:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;51171:61:0;;;;-1:-1:-1;;;51216:15:0;51171:61;;;;;;51506:11;;;51536:24;;;;;:29;51506:11;;51536:29;51532:295;;51604:20;51612:11;47198:4;47232:12;-1:-1:-1;47222:22:0;47141:111;51604:20;51600:212;;;51681:18;;;51649:24;;;:11;:24;;;;;;;;:50;;51764:28;;;;51722:70;;-1:-1:-1;;;51722:70:0;-1:-1:-1;;;;;;51722:70:0;;;-1:-1:-1;;;;;51649:50:0;;;51722:70;;;;;;;51600:212;51009:829;51874:7;51870:2;-1:-1:-1;;;;;51855:27:0;51864:4;-1:-1:-1;;;;;51855:27:0;;;;;;;;;;;51893:42;50045:1898;;49941:2002;;;:::o;62530:183::-;62611:9;62626:7;-1:-1:-1;;;;;62626:12:0;62646:6;62626:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62610:47;;;62676:4;62668:37;;;;-1:-1:-1;;;62668:37:0;;23851:2:1;62668:37:0;;;23833:21:1;23890:2;23870:18;;;23863:30;-1:-1:-1;;;23909:18:1;;;23902:50;23969:18;;62668:37:0;23649:344:1;42806:537:0;-1:-1:-1;;;;;;;;;;;;;;;;;42909:16:0;42917:7;47198:4;47232:12;-1:-1:-1;47222:22:0;47141:111;42909:16;42901:71;;;;-1:-1:-1;;;42901:71:0;;24200:2:1;42901:71:0;;;24182:21:1;24239:2;24219:18;;;24212:30;24278:34;24258:18;;;24251:62;-1:-1:-1;;;24329:18:1;;;24322:40;24379:19;;42901:71:0;23998:406:1;42901:71:0;43030:7;43010:245;43077:31;43111:17;;;:11;:17;;;;;;;;;43077:51;;;;;;;;;-1:-1:-1;;;;;43077:51:0;;;;;-1:-1:-1;;;43077:51:0;;;;;;;;;;;;43151:28;43147:93;;43211:9;42806:537;-1:-1:-1;;;42806:537:0:o;43147:93::-;-1:-1:-1;;;43050:6:0;43010:245;;5040:173;5115:6;;;-1:-1:-1;;;;;5132:17:0;;;-1:-1:-1;;;;;;5132:17:0;;;;;;;5165:40;;5115:6;;;5132:17;5115:6;;5165:40;;5096:16;;5165:40;5085:128;5040:173;:::o;52822:804::-;52977:4;-1:-1:-1;;;;;52998:13:0;;6309:20;6357:8;52994:625;;53034:72;;-1:-1:-1;;;53034:72:0;;-1:-1:-1;;;;;53034:36:0;;;;;:72;;2808:10;;53085:4;;53091:7;;53100:5;;53034:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53034:72:0;;;;;;;;-1:-1:-1;;53034:72:0;;;;;;;;;;;;:::i;:::-;;;53030:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53280:13:0;;53276:273;;53323:61;;-1:-1:-1;;;53323:61:0;;;;;;;:::i;53276:273::-;53499:6;53493:13;53484:6;53480:2;53476:15;53469:38;53030:534;-1:-1:-1;;;;;;53157:55:0;-1:-1:-1;;;53157:55:0;;-1:-1:-1;53150:62:0;;52994:625;-1:-1:-1;53603:4:0;53596:11;;57215:116;57275:13;57308:15;57301:22;;;;;:::i;344:723::-;400:13;621:10;617:53;;-1:-1:-1;;648:10:0;;;;;;;;;;;;-1:-1:-1;;;648:10:0;;;;;344:723::o;617:53::-;695:5;680:12;736:78;743:9;;736:78;;769:8;;;;:::i;:::-;;-1:-1:-1;792:10:0;;-1:-1:-1;800:2:0;792:10;;:::i;:::-;;;736:78;;;824:19;856:6;846:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;846:17:0;;824:39;;874:154;881:10;;874:154;;908:11;918:1;908:11;;:::i;:::-;;-1:-1:-1;977:10:0;985:2;977:5;:10;:::i;:::-;964:24;;:2;:24;:::i;:::-;951:39;;934:6;941;934:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;934:56:0;;;;;;;;-1:-1:-1;1005:11:0;1014:2;1005:11;;:::i;:::-;;;874:154;;47727:163;47850:32;47856:2;47860:8;47870:5;47877:4;48288:20;48311:12;-1:-1:-1;;;;;48342:16:0;;48334:62;;;;-1:-1:-1;;;48334:62:0;;26164:2:1;48334:62:0;;;26146:21:1;26203:2;26183:18;;;26176:30;26242:34;26222:18;;;26215:62;-1:-1:-1;;;26293:18:1;;;26286:31;26334:19;;48334:62:0;25962:397:1;48334:62:0;48415:13;48407:66;;;;-1:-1:-1;;;48407:66:0;;26566:2:1;48407:66:0;;;26548:21:1;26605:2;26585:18;;;26578:30;26644:34;26624:18;;;26617:62;-1:-1:-1;;;26695:18:1;;;26688:38;26743:19;;48407:66:0;26364:404:1;48407:66:0;-1:-1:-1;;;;;48825:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;48825:45:0;;-1:-1:-1;;;;;48825:45:0;;;;;;;;;;48885:50;;;;;;;;;;;;;;48952:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;49002:66:0;;;;-1:-1:-1;;;49052:15:0;49002:66;;;;;;;48952:25;;49137:415;49157:8;49153:1;:12;49137:415;;;49196:38;;49221:12;;-1:-1:-1;;;;;49196:38:0;;;49213:1;;49196:38;;49213:1;;49196:38;49257:4;49253:249;;;49320:59;49351:1;49355:2;49359:12;49373:5;49320:22;:59::i;:::-;49286:196;;;;-1:-1:-1;;;49286:196:0;;;;;;;:::i;:::-;49522:14;;;;;49167:3;49137:415;;;-1:-1:-1;49568:12:0;:27;49619:60;46531:355;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:186;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:131::-;-1:-1:-1;;;;;;457:32:1;;447:43;;437:71;;504:1;501;494:12;519:245;577:6;630:2;618:9;609:7;605:23;601:32;598:52;;;646:1;643;636:12;598:52;685:9;672:23;704:30;728:5;704:30;:::i;961:258::-;1033:1;1043:113;1057:6;1054:1;1051:13;1043:113;;;1133:11;;;1127:18;1114:11;;;1107:39;1079:2;1072:10;1043:113;;;1174:6;1171:1;1168:13;1165:48;;;-1:-1:-1;;1209:1:1;1191:16;;1184:27;961:258::o;1224:::-;1266:3;1304:5;1298:12;1331:6;1326:3;1319:19;1347:63;1403:6;1396:4;1391:3;1387:14;1380:4;1373:5;1369:16;1347:63;:::i;:::-;1464:2;1443:15;-1:-1:-1;;1439:29:1;1430:39;;;;1471:4;1426:50;;1224:258;-1:-1:-1;;1224:258:1:o;1487:220::-;1636:2;1625:9;1618:21;1599:4;1656:45;1697:2;1686:9;1682:18;1674:6;1656:45;:::i;1712:180::-;1771:6;1824:2;1812:9;1803:7;1799:23;1795:32;1792:52;;;1840:1;1837;1830:12;1792:52;-1:-1:-1;1863:23:1;;1712:180;-1:-1:-1;1712:180:1:o;2105:254::-;2173:6;2181;2234:2;2222:9;2213:7;2209:23;2205:32;2202:52;;;2250:1;2247;2240:12;2202:52;2273:29;2292:9;2273:29;:::i;:::-;2263:39;2349:2;2334:18;;;;2321:32;;-1:-1:-1;;;2105:254:1:o;2546:::-;2614:6;2622;2675:2;2663:9;2654:7;2650:23;2646:32;2643:52;;;2691:1;2688;2681:12;2643:52;2727:9;2714:23;2704:33;;2756:38;2790:2;2779:9;2775:18;2756:38;:::i;:::-;2746:48;;2546:254;;;;;:::o;2805:328::-;2882:6;2890;2898;2951:2;2939:9;2930:7;2926:23;2922:32;2919:52;;;2967:1;2964;2957:12;2919:52;2990:29;3009:9;2990:29;:::i;:::-;2980:39;;3038:38;3072:2;3061:9;3057:18;3038:38;:::i;:::-;3028:48;;3123:2;3112:9;3108:18;3095:32;3085:42;;2805:328;;;;;:::o;3138:156::-;3204:20;;3264:4;3253:16;;3243:27;;3233:55;;3284:1;3281;3274:12;3299:393;3383:6;3391;3399;3407;3460:3;3448:9;3439:7;3435:23;3431:33;3428:53;;;3477:1;3474;3467:12;3428:53;3500:29;3519:9;3500:29;:::i;:::-;3490:39;;3548:36;3580:2;3569:9;3565:18;3548:36;:::i;:::-;3299:393;;3538:46;;-1:-1:-1;;;;3631:2:1;3616:18;;3603:32;;3682:2;3667:18;3654:32;;3299:393::o;3697:127::-;3758:10;3753:3;3749:20;3746:1;3739:31;3789:4;3786:1;3779:15;3813:4;3810:1;3803:15;3829:632;3894:5;3924:18;3965:2;3957:6;3954:14;3951:40;;;3971:18;;:::i;:::-;4046:2;4040:9;4014:2;4100:15;;-1:-1:-1;;4096:24:1;;;4122:2;4092:33;4088:42;4076:55;;;4146:18;;;4166:22;;;4143:46;4140:72;;;4192:18;;:::i;:::-;4232:10;4228:2;4221:22;4261:6;4252:15;;4291:6;4283;4276:22;4331:3;4322:6;4317:3;4313:16;4310:25;4307:45;;;4348:1;4345;4338:12;4307:45;4398:6;4393:3;4386:4;4378:6;4374:17;4361:44;4453:1;4446:4;4437:6;4429;4425:19;4421:30;4414:41;;;;3829:632;;;;;:::o;4466:451::-;4535:6;4588:2;4576:9;4567:7;4563:23;4559:32;4556:52;;;4604:1;4601;4594:12;4556:52;4644:9;4631:23;4677:18;4669:6;4666:30;4663:50;;;4709:1;4706;4699:12;4663:50;4732:22;;4785:4;4777:13;;4773:27;-1:-1:-1;4763:55:1;;4814:1;4811;4804:12;4763:55;4837:74;4903:7;4898:2;4885:16;4880:2;4876;4872:11;4837:74;:::i;4922:127::-;4983:10;4978:3;4974:20;4971:1;4964:31;5014:4;5011:1;5004:15;5038:4;5035:1;5028:15;5054:338;5196:2;5181:18;;5229:1;5218:13;;5208:144;;5274:10;5269:3;5265:20;5262:1;5255:31;5309:4;5306:1;5299:15;5337:4;5334:1;5327:15;5208:144;5361:25;;;5054:338;:::o;5397:347::-;5462:6;5470;5523:2;5511:9;5502:7;5498:23;5494:32;5491:52;;;5539:1;5536;5529:12;5491:52;5562:29;5581:9;5562:29;:::i;:::-;5552:39;;5641:2;5630:9;5626:18;5613:32;5688:5;5681:13;5674:21;5667:5;5664:32;5654:60;;5710:1;5707;5700:12;5654:60;5733:5;5723:15;;;5397:347;;;;;:::o;5749:667::-;5844:6;5852;5860;5868;5921:3;5909:9;5900:7;5896:23;5892:33;5889:53;;;5938:1;5935;5928:12;5889:53;5961:29;5980:9;5961:29;:::i;:::-;5951:39;;6009:38;6043:2;6032:9;6028:18;6009:38;:::i;:::-;5999:48;;6094:2;6083:9;6079:18;6066:32;6056:42;;6149:2;6138:9;6134:18;6121:32;6176:18;6168:6;6165:30;6162:50;;;6208:1;6205;6198:12;6162:50;6231:22;;6284:4;6276:13;;6272:27;-1:-1:-1;6262:55:1;;6313:1;6310;6303:12;6262:55;6336:74;6402:7;6397:2;6384:16;6379:2;6375;6371:11;6336:74;:::i;:::-;6326:84;;;5749:667;;;;;;;:::o;6421:387::-;6505:6;6513;6521;6529;6582:3;6570:9;6561:7;6557:23;6553:33;6550:53;;;6599:1;6596;6589:12;6550:53;6635:9;6622:23;6612:33;;6664:36;6696:2;6685:9;6681:18;6664:36;:::i;6813:260::-;6881:6;6889;6942:2;6930:9;6921:7;6917:23;6913:32;6910:52;;;6958:1;6955;6948:12;6910:52;6981:29;7000:9;6981:29;:::i;:::-;6971:39;;7029:38;7063:2;7052:9;7048:18;7029:38;:::i;7078:356::-;7280:2;7262:21;;;7299:18;;;7292:30;7358:34;7353:2;7338:18;;7331:62;7425:2;7410:18;;7078:356::o;7439:380::-;7518:1;7514:12;;;;7561;;;7582:61;;7636:4;7628:6;7624:17;7614:27;;7582:61;7689:2;7681:6;7678:14;7658:18;7655:38;7652:161;;;7735:10;7730:3;7726:20;7723:1;7716:31;7770:4;7767:1;7760:15;7798:4;7795:1;7788:15;7652:161;;7439:380;;;:::o;8582:127::-;8643:10;8638:3;8634:20;8631:1;8624:31;8674:4;8671:1;8664:15;8698:4;8695:1;8688:15;8714:125;8754:4;8782:1;8779;8776:8;8773:34;;;8787:18;;:::i;:::-;-1:-1:-1;8824:9:1;;8714:125::o;8844:128::-;8884:3;8915:1;8911:6;8908:1;8905:13;8902:39;;;8921:18;;:::i;:::-;-1:-1:-1;8957:9:1;;8844:128::o;8977:354::-;9179:2;9161:21;;;9218:2;9198:18;;;9191:30;9257:32;9252:2;9237:18;;9230:60;9322:2;9307:18;;8977:354::o;9336:184::-;9406:6;9459:2;9447:9;9438:7;9434:23;9430:32;9427:52;;;9475:1;9472;9465:12;9427:52;-1:-1:-1;9498:16:1;;9336:184;-1:-1:-1;9336:184:1:o;13861:168::-;13901:7;13967:1;13963;13959:6;13955:14;13952:1;13949:21;13944:1;13937:9;13930:17;13926:45;13923:71;;;13974:18;;:::i;:::-;-1:-1:-1;14014:9:1;;13861:168::o;14034:127::-;14095:10;14090:3;14086:20;14083:1;14076:31;14126:4;14123:1;14116:15;14150:4;14147:1;14140:15;14166:120;14206:1;14232;14222:35;;14237:18;;:::i;:::-;-1:-1:-1;14271:9:1;;14166:120::o;17335:399::-;17537:2;17519:21;;;17576:2;17556:18;;;17549:30;17615:34;17610:2;17595:18;;17588:62;-1:-1:-1;;;17681:2:1;17666:18;;17659:33;17724:3;17709:19;;17335:399::o;18157:415::-;18359:2;18341:21;;;18398:2;18378:18;;;18371:30;18437:34;18432:2;18417:18;;18410:62;-1:-1:-1;;;18503:2:1;18488:18;;18481:49;18562:3;18547:19;;18157:415::o;19342:637::-;19622:3;19660:6;19654:13;19676:53;19722:6;19717:3;19710:4;19702:6;19698:17;19676:53;:::i;:::-;19792:13;;19751:16;;;;19814:57;19792:13;19751:16;19848:4;19836:17;;19814:57;:::i;:::-;-1:-1:-1;;;19893:20:1;;19922:22;;;19971:1;19960:13;;19342:637;-1:-1:-1;;;;19342:637:1:o;24825:489::-;-1:-1:-1;;;;;25094:15:1;;;25076:34;;25146:15;;25141:2;25126:18;;25119:43;25193:2;25178:18;;25171:34;;;25241:3;25236:2;25221:18;;25214:31;;;25019:4;;25262:46;;25288:19;;25280:6;25262:46;:::i;:::-;25254:54;24825:489;-1:-1:-1;;;;;;24825:489:1:o;25319:249::-;25388:6;25441:2;25429:9;25420:7;25416:23;25412:32;25409:52;;;25457:1;25454;25447:12;25409:52;25489:9;25483:16;25508:30;25532:5;25508:30;:::i;25573:135::-;25612:3;-1:-1:-1;;25633:17:1;;25630:43;;;25653:18;;:::i;:::-;-1:-1:-1;25700:1:1;25689:13;;25573:135::o;25713:112::-;25745:1;25771;25761:35;;25776:18;;:::i;:::-;-1:-1:-1;25810:9:1;;25713:112::o;25830:127::-;25891:10;25886:3;25882:20;25879:1;25872:31;25922:4;25919:1;25912:15;25946:4;25943:1;25936:15
Swarm Source
ipfs://462e65485a491786d1f035036b29302870b9162be7aa9e37bfa615116084cbca
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.