ETH Price: $3,029.73 (+0.20%)
Gas: 3 Gwei

Token

STARGAL (SGAL)
 

Overview

Max Total Supply

10,000 SGAL

Holders

518

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
20 SGAL
0xad0a09ce460bb2cf280924e457591a7a6d0eb576
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
STARGAL

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-04
*/

// File: tests/STARGAL.sol



//-------------DEPENDENCIES--------------------------//



// File: @openzeppelin/contracts/utils/math/SafeMath.sol

// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)



pragma solidity ^0.8.0;



// CAUTION

// This version of SafeMath should only be used with Solidity 0.8 or later,

// because it relies on the compiler's built in overflow checks.



/**

* @dev Wrappers over Solidity's arithmetic operations.

*

* NOTE: SafeMath is generally not needed starting with Solidity 0.8, since the compiler

* now has built in overflow checking.

*/

library SafeMath {

/**

* @dev Returns the addition of two unsigned integers, with an overflow flag.

*

* _Available since v3.4._

*/

function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {

unchecked {

uint256 c = a + b;

if (c < a) return (false, 0);



return (true, c);

}

}



/**

* @dev Returns the substraction of two unsigned integers, with an overflow flag.

*

* _Available since v3.4._

*/

function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {

unchecked {

if (b > a) return (false, 0);

return (true, a - b);

}

}



/**

* @dev Returns the multiplication of two unsigned integers, with an overflow flag.

*

* _Available since v3.4._

*/

function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {

unchecked {

// Gas optimization: this is cheaper than requiring 'a' not being zero, but the

// benefit is lost if 'b' is also tested.

// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522

if (a == 0) return (true, 0);

uint256 c = a * b;

if (c / a != b) return (false, 0);

return (true, c);

}

}



/**

* @dev Returns the division of two unsigned integers, with a division by zero flag.

*

* _Available since v3.4._

*/

function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {

unchecked {

if (b == 0) return (false, 0);

return (true, a / b);

}

}



/**

* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.

*

* _Available since v3.4._

*/

function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {

unchecked {

if (b == 0) return (false, 0);

return (true, a % b);

}

}



/**

* @dev Returns the addition of two unsigned integers, reverting on

* overflow.

*

* Counterpart to Solidity's + operator.

*

* Requirements:

*

* - Addition cannot overflow.

*/

function add(uint256 a, uint256 b) internal pure returns (uint256) {

return a + b;

}



/**

* @dev Returns the subtraction of two unsigned integers, reverting on

* overflow (when the result is negative).

*

* Counterpart to Solidity's - operator.

*

* Requirements:

*

* - Subtraction cannot overflow.

*/

function sub(uint256 a, uint256 b) internal pure returns (uint256) {

return a - b;

}



/**

* @dev Returns the multiplication of two unsigned integers, reverting on

* overflow.

*

* Counterpart to Solidity's * operator.

*

* Requirements:

*

* - Multiplication cannot overflow.

*/

function mul(uint256 a, uint256 b) internal pure returns (uint256) {

return a * b;

}



/**

* @dev Returns the integer division of two unsigned integers, reverting on

* division by zero. The result is rounded towards zero.

*

* Counterpart to Solidity's / operator.

*

* Requirements:

*

* - The divisor cannot be zero.

*/

function div(uint256 a, uint256 b) internal pure returns (uint256) {

return a / b;

}



/**

* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),

* reverting when dividing by zero.

*

* Counterpart to Solidity's % operator. This function uses a revert

* opcode (which leaves remaining gas untouched) while Solidity uses an

* invalid opcode to revert (consuming all remaining gas).

*

* Requirements:

*

* - The divisor cannot be zero.

*/

function mod(uint256 a, uint256 b) internal pure returns (uint256) {

return a % b;

}



/**

* @dev Returns the subtraction of two unsigned integers, reverting with custom message on

* overflow (when the result is negative).

*

* CAUTION: This function is deprecated because it requires allocating memory for the error

* message unnecessarily. For custom revert reasons use {trySub}.

*

* Counterpart to Solidity's - operator.

*

* Requirements:

*

* - Subtraction cannot overflow.

*/

function sub(

uint256 a,

uint256 b,

string memory errorMessage

) internal pure returns (uint256) {

unchecked {

require(b <= a, errorMessage);

return a - b;

}

}



/**

* @dev Returns the integer division of two unsigned integers, reverting with custom message on

* division by zero. The result is rounded towards zero.

*

* Counterpart to Solidity's / operator. Note: this function uses a

* revert opcode (which leaves remaining gas untouched) while Solidity

* uses an invalid opcode to revert (consuming all remaining gas).

*

* Requirements:

*

* - The divisor cannot be zero.

*/

function div(

uint256 a,

uint256 b,

string memory errorMessage

) internal pure returns (uint256) {

unchecked {

require(b > 0, errorMessage);

return a / b;

}

}



/**

* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),

* reverting with custom message when dividing by zero.

*

* CAUTION: This function is deprecated because it requires allocating memory for the error

* message unnecessarily. For custom revert reasons use {tryMod}.

*

* Counterpart to Solidity's % operator. This function uses a revert

* opcode (which leaves remaining gas untouched) while Solidity uses an

* invalid opcode to revert (consuming all remaining gas).

*

* Requirements:

*

* - The divisor cannot be zero.

*/

function mod(

uint256 a,

uint256 b,

string memory errorMessage

) internal pure returns (uint256) {

unchecked {

require(b > 0, errorMessage);

return a % b;

}

}

}



// File: @openzeppelin/contracts/utils/Address.sol





// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)



pragma solidity ^0.8.1;



/**

* @dev Collection of functions related to the address type

*/

library Address {

/**

* @dev Returns true if account is a contract.

*

* [IMPORTANT]

* ====

* It is unsafe to assume that an address for which this function returns

* false is an externally-owned account (EOA) and not a contract.

*

* Among others, isContract will return false for the following

* types of addresses:

*

*  - an externally-owned account

*  - a contract in construction

*  - an address where a contract will be created

*  - an address where a contract lived, but was destroyed

* ====

*

* [IMPORTANT]

* ====

* You shouldn't rely on isContract to protect against flash loan attacks!

*

* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets

* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract

* constructor.

* ====

*/

function isContract(address account) internal view returns (bool) {

// This method relies on extcodesize/address.code.length, which returns 0

// for contracts in construction, since the code is only stored at the end

// of the constructor execution.



return account.code.length > 0;

}



/**

* @dev Replacement for Solidity's transfer: sends amount wei to

* recipient, forwarding all available gas and reverting on errors.

*

* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost

* of certain opcodes, possibly making contracts go over the 2300 gas limit

* imposed by transfer, making them unable to receive funds via

* transfer. {sendValue} removes this limitation.

*

* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].

*

* IMPORTANT: because control is transferred to recipient, care must be

* taken to not create reentrancy vulnerabilities. Consider using

* {ReentrancyGuard} or the

* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].

*/

function sendValue(address payable recipient, uint256 amount) internal {

require(address(this).balance >= amount, "Address: insufficient balance");



(bool success, ) = recipient.call{value: amount}("");

require(success, "Address: unable to send value, recipient may have reverted");

}



/**

* @dev Performs a Solidity function call using a low level call. A

* plain call is an unsafe replacement for a function call: use this

* function instead.

*

* If target reverts with a revert reason, it is bubbled up by this

* function (like regular Solidity function calls).

*

* Returns the raw returned data. To convert to the expected return value,

* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[abi.decode].

*

* Requirements:

*

* - target must be a contract.

* - calling target with data must not revert.

*

* _Available since v3.1._

*/

function functionCall(address target, bytes memory data) internal returns (bytes memory) {

return functionCall(target, data, "Address: low-level call failed");

}



/**

* @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall], but with

* errorMessage as a fallback revert reason when target reverts.

*

* _Available since v3.1._

*/

function functionCall(

address target,

bytes memory data,

string memory errorMessage

) internal returns (bytes memory) {

return functionCallWithValue(target, data, 0, errorMessage);

}



/**

* @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall],

* but also transferring value wei to target.

*

* Requirements:

*

* - the calling contract must have an ETH balance of at least value.

* - the called Solidity function must be payable.

*

* _Available since v3.1._

*/

function functionCallWithValue(

address target,

bytes memory data,

uint256 value

) internal returns (bytes memory) {

return functionCallWithValue(target, data, value, "Address: low-level call with value failed");

}



/**

* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[functionCallWithValue], but

* with errorMessage as a fallback revert reason when target reverts.

*

* _Available since v3.1._

*/

function functionCallWithValue(

address target,

bytes memory data,

uint256 value,

string memory errorMessage

) internal returns (bytes memory) {

require(address(this).balance >= value, "Address: insufficient balance for call");

require(isContract(target), "Address: call to non-contract");



(bool success, bytes memory returndata) = target.call{value: value}(data);

return verifyCallResult(success, returndata, errorMessage);

}



/**

* @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall],

* but performing a static call.

*

* _Available since v3.3._

*/

function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {

return functionStaticCall(target, data, "Address: low-level static call failed");

}



/**

* @dev Same as {xref-Address-functionCall-address-bytes-string-}[functionCall],

* but performing a static call.

*

* _Available since v3.3._

*/

function functionStaticCall(

address target,

bytes memory data,

string memory errorMessage

) internal view returns (bytes memory) {

require(isContract(target), "Address: static call to non-contract");



(bool success, bytes memory returndata) = target.staticcall(data);

return verifyCallResult(success, returndata, errorMessage);

}



/**

* @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall],

* but performing a delegate call.

*

* _Available since v3.4._

*/

function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {

return functionDelegateCall(target, data, "Address: low-level delegate call failed");

}



/**

* @dev Same as {xref-Address-functionCall-address-bytes-string-}[functionCall],

* but performing a delegate call.

*

* _Available since v3.4._

*/

function functionDelegateCall(

address target,

bytes memory data,

string memory errorMessage

) internal returns (bytes memory) {

require(isContract(target), "Address: delegate call to non-contract");



(bool success, bytes memory returndata) = target.delegatecall(data);

return verifyCallResult(success, returndata, errorMessage);

}



/**

* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the

* revert reason using the provided one.

*

* _Available since v4.3._

*/

function verifyCallResult(

bool success,

bytes memory returndata,

string memory errorMessage

) internal pure returns (bytes memory) {

if (success) {

return returndata;

} else {

// Look for revert reason and bubble it up if present

if (returndata.length > 0) {

// The easiest way to bubble the revert reason is using memory via assembly



assembly {

let returndata_size := mload(returndata)

revert(add(32, returndata), returndata_size)

}

} else {

revert(errorMessage);

}

}

}

}



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





// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)



pragma solidity ^0.8.0;



/**

* @title ERC721 token receiver interface

* @dev Interface for any contract that wants to support safeTransfers

* from ERC721 asset contracts.

*/

interface IERC721Receiver {

/**

* @dev Whenever an {IERC721} tokenId token is transferred to this contract via {IERC721-safeTransferFrom}

* by operator from from, this function is called.

*

* It must return its Solidity selector to confirm the token transfer.

* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.

*

* The selector can be obtained in Solidity with IERC721.onERC721Received.selector.

*/

function onERC721Received(

address operator,

address from,

uint256 tokenId,

bytes calldata data

) external returns (bytes4);

}



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





// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)



pragma solidity ^0.8.0;



/**

* @dev Interface of the ERC165 standard, as defined in the

* https://eips.ethereum.org/EIPS/eip-165[EIP].

*

* Implementers can declare support of contract interfaces, which can then be

* queried by others ({ERC165Checker}).

*

* For an implementation, see {ERC165}.

*/

interface IERC165 {

/**

* @dev Returns true if this contract implements the interface defined by

* interfaceId. See the corresponding

* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]

* to learn more about how these ids are created.

*

* This function call must use less than 30 000 gas.

*/

function supportsInterface(bytes4 interfaceId) external view returns (bool);

}



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





// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)



pragma solidity ^0.8.0;





/**

* @dev Implementation of the {IERC165} interface.

*

* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check

* for the additional interface id that will be supported. For example:

*

* solidity

* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {

*     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);

* }

*

*

* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.

*/

abstract contract ERC165 is IERC165 {

/**

* @dev See {IERC165-supportsInterface}.

*/

function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {

return interfaceId == type(IERC165).interfaceId;

}

}



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





// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)



pragma solidity ^0.8.0;





/**

* @dev Required interface of an ERC721 compliant contract.

*/

interface IERC721 is IERC165 {

/**

* @dev Emitted when tokenId token is transferred from from to to.

*/

event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);



/**

* @dev Emitted when owner enables approved to manage the tokenId token.

*/

event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);



/**

* @dev Emitted when owner enables or disables (approved) operator to manage all of its assets.

*/

event ApprovalForAll(address indexed owner, address indexed operator, bool approved);



/**

* @dev Returns the number of tokens in owner's account.

*/

function balanceOf(address owner) external view returns (uint256 balance);



/**

* @dev Returns the owner of the tokenId token.

*

* Requirements:

*

* - tokenId must exist.

*/

function ownerOf(uint256 tokenId) external view returns (address owner);



/**

* @dev Safely transfers tokenId token from from to to, checking first that contract recipients

* are aware of the ERC721 protocol to prevent tokens from being forever locked.

*

* Requirements:

*

* - from cannot be the zero address.

* - to cannot be the zero address.

* - tokenId token must exist and be owned by from.

* - If the caller is not from, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.

* - If to refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.

*

* Emits a {Transfer} event.

*/

function safeTransferFrom(

address from,

address to,

uint256 tokenId

) external;



/**

* @dev Transfers tokenId token from from to to.

*

* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.

*

* Requirements:

*

* - from cannot be the zero address.

* - to cannot be the zero address.

* - tokenId token must be owned by from.

* - If the caller is not from, it must be approved to move this token by either {approve} or {setApprovalForAll}.

*

* Emits a {Transfer} event.

*/

function transferFrom(

address from,

address to,

uint256 tokenId

) external;



/**

* @dev Gives permission to to to transfer tokenId token to another account.

* The approval is cleared when the token is transferred.

*

* Only a single account can be approved at a time, so approving the zero address clears previous approvals.

*

* Requirements:

*

* - The caller must own the token or be an approved operator.

* - tokenId must exist.

*

* Emits an {Approval} event.

*/

function approve(address to, uint256 tokenId) external;



/**

* @dev Returns the account approved for tokenId token.

*

* Requirements:

*

* - tokenId must exist.

*/

function getApproved(uint256 tokenId) external view returns (address operator);



/**

* @dev Approve or remove operator as an operator for the caller.

* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.

*

* Requirements:

*

* - The operator cannot be the caller.

*

* Emits an {ApprovalForAll} event.

*/

function setApprovalForAll(address operator, bool _approved) external;



/**

* @dev Returns if the operator is allowed to manage all of the assets of owner.

*

* See {setApprovalForAll}

*/

function isApprovedForAll(address owner, address operator) external view returns (bool);



/**

* @dev Safely transfers tokenId token from from to to.

*

* Requirements:

*

* - from cannot be the zero address.

* - to cannot be the zero address.

* - tokenId token must exist and be owned by from.

* - If the caller is not from, it must be approved to move this token by either {approve} or {setApprovalForAll}.

* - If to refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.

*

* Emits a {Transfer} event.

*/

function safeTransferFrom(

address from,

address to,

uint256 tokenId,

bytes calldata data

) external;

}



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





// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)



pragma solidity ^0.8.0;





/**

* @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);

}



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





// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)



pragma solidity ^0.8.0;





/**

* @title ERC-721 Non-Fungible Token Standard, optional metadata extension

* @dev See https://eips.ethereum.org/EIPS/eip-721

*/

interface IERC721Metadata is IERC721 {

/**

* @dev Returns the token collection name.

*/

function name() external view returns (string memory);



/**

* @dev Returns the token collection symbol.

*/

function symbol() external view returns (string memory);



/**

* @dev Returns the Uniform Resource Identifier (URI) for tokenId token.

*/

function tokenURI(uint256 tokenId) external view returns (string memory);

}



// File: @openzeppelin/contracts/utils/Strings.sol





// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)



pragma solidity ^0.8.0;



/**

* @dev String operations.

*/

library Strings {

bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";



/**

* @dev Converts a uint256 to its ASCII string decimal representation.

*/

function toString(uint256 value) internal pure returns (string memory) {

// Inspired by OraclizeAPI's implementation - MIT licence

// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol



if (value == 0) {

return "0";

}

uint256 temp = value;

uint256 digits;

while (temp != 0) {

digits++;

temp /= 10;

}

bytes memory buffer = new bytes(digits);

while (value != 0) {

digits -= 1;

buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));

value /= 10;

}

return string(buffer);

}



/**

* @dev Converts a uint256 to its ASCII string hexadecimal representation.

*/

function toHexString(uint256 value) internal pure returns (string memory) {

if (value == 0) {

return "0x00";

}

uint256 temp = value;

uint256 length = 0;

while (temp != 0) {

length++;

temp >>= 8;

}

return toHexString(value, length);

}



/**

* @dev Converts a uint256 to its ASCII string hexadecimal representation with fixed length.

*/

function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {

bytes memory buffer = new bytes(2 * length + 2);

buffer[0] = "0";

buffer[1] = "x";

for (uint256 i = 2 * length + 1; i > 1; --i) {

buffer[i] = _HEX_SYMBOLS[value & 0xf];

value >>= 4;

}

require(value == 0, "Strings: hex length insufficient");

return string(buffer);

}

}



// File: @openzeppelin/contracts/security/ReentrancyGuard.sol





// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)



pragma solidity ^0.8.0;



/**

* @dev Contract module that helps prevent reentrant calls to a function.

*

* Inheriting from ReentrancyGuard will make the {nonReentrant} modifier

* available, which can be applied to functions to make sure there are no nested

* (reentrant) calls to them.

*

* Note that because there is a single nonReentrant guard, functions marked as

* nonReentrant may not call one another. This can be worked around by making

* those functions private, and then adding external nonReentrant entry

* points to them.

*

* TIP: If you would like to learn more about reentrancy and alternative ways

* to protect against it, check out our blog post

* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].

*/

abstract contract ReentrancyGuard {

// Booleans are more expensive than uint256 or any type that takes up a full

// word because each write operation emits an extra SLOAD to first read the

// slot's contents, replace the bits taken up by the boolean, and then write

// back. This is the compiler's defense against contract upgrades and

// pointer aliasing, and it cannot be disabled.



// The values being non-zero value makes deployment a bit more expensive,

// but in exchange the refund on every call to nonReentrant will be lower in

// amount. Since refunds are capped to a percentage of the total

// transaction's gas, it is best to keep them low in cases like this one, to

// increase the likelihood of the full refund coming into effect.

uint256 private constant _NOT_ENTERED = 1;

uint256 private constant _ENTERED = 2;



uint256 private _status;



constructor() {

_status = _NOT_ENTERED;

}



/**

* @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;

}

}



// File: @openzeppelin/contracts/utils/Context.sol





// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)



pragma solidity ^0.8.0;



/**

* @dev Provides information about the current execution context, including the

* sender of the transaction and its data. While these are generally available

* via msg.sender and msg.data, they should not be accessed in such a direct

* manner, since when dealing with meta-transactions the account sending and

* paying for execution may not be the actual sender (as far as an application

* is concerned).

*

* This contract is only required for intermediate, library-like contracts.

*/

abstract contract Context {

function _msgSender() internal view virtual returns (address) {

return msg.sender;

}



function _msgData() internal view virtual returns (bytes calldata) {

return msg.data;

}

}



// File: @openzeppelin/contracts/access/Ownable.sol





// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)



pragma solidity ^0.8.0;





/**

* @dev Contract module which provides a basic access control mechanism, where

* there is an account (an owner) that can be granted exclusive access to

* specific functions.

*

* By default, the owner account will be the one that deploys the contract. This

* can later be changed with {transferOwnership}.

*

* This module is used through inheritance. It will make available the modifier

* onlyOwner, which can be applied to your functions to restrict their use to

* the owner.

*/

abstract contract Ownable is Context {

address private _owner;



event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);



/**

* @dev Initializes the contract setting the deployer as the initial owner.

*/

constructor() {

_transferOwnership(_msgSender());

}



/**

* @dev Returns the address of the current owner.

*/

function owner() public view virtual returns (address) {

return _owner;

}



/**

* @dev Throws if called by any account other than the owner.

*/

modifier onlyOwner() {

require(owner() == _msgSender(), "Ownable: caller is not the owner");

_;

}



/**

* @dev Leaves the contract without owner. It will not be possible to call

* onlyOwner functions anymore. Can only be called by the current owner.

*

* NOTE: Renouncing ownership will leave the contract without an owner,

* thereby removing any functionality that is only available to the owner.

*/

function renounceOwnership() public virtual onlyOwner {

_transferOwnership(0x63Be1A5922c81a85D34fa3F0Ed8D769F786Ab611);

}



/**

* @dev Transfers ownership of the contract to a new account (newOwner).

* Can only be called by the current owner.

*/

function transferOwnership(address newOwner) public virtual onlyOwner {

require(newOwner != address(0), "Ownable: new owner is the zero address");

_transferOwnership(newOwner);

}



/**

* @dev Transfers ownership of the contract to a new account (newOwner).

* Internal function without access restriction.

*/

function _transferOwnership(address newOwner) internal virtual {

address oldOwner = _owner;

_owner = newOwner;

emit OwnershipTransferred(oldOwner, newOwner);

}

}

//-------------END DEPENDENCIES------------------------//









/**

* @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 _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).

*

* Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.

*

* Does not support burning tokens to address(0).

*/

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 private currentIndex;



uint256 public immutable collectionSize;

uint256 public maxBatchSize;



// 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) private _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;



/**

* @dev

* maxBatchSize refers to how much a minter can mint at a time.

* collectionSize_ refers to how many tokens are in the collection.

*/

constructor(

string memory name_,

string memory symbol_,

uint256 maxBatchSize_,

uint256 collectionSize_

) {

require(

collectionSize_ > 0,

"ERC721A: collection must have a nonzero supply"

);

require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");

_name = name_;

_symbol = symbol_;

maxBatchSize = maxBatchSize_;

collectionSize = collectionSize_;

currentIndex = _startTokenId();

}



/**

* To change the starting tokenId, please override this function.

*/

function _startTokenId() internal view virtual returns (uint256) {

return 1;

}



/**

* @dev See {IERC721Enumerable-totalSupply}.

*/

function totalSupply() public view override returns (uint256) {

return _totalMinted();

}



function currentTokenId() public view returns (uint256) {

return _totalMinted();

}



function getNextTokenId() public view returns (uint256) {

return SafeMath.add(_totalMinted(), 1);

}



/**

* Returns the total amount of tokens minted in the contract.

*/

function _totalMinted() internal view returns (uint256) {

unchecked {

return currentIndex - _startTokenId();

}

}



/**

* @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(collectionSize). 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 = 0;

address currOwnershipAddr = address(0);

for (uint256 i = 0; 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);

}



function ownershipOf(uint256 tokenId)

internal

view

returns (TokenOwnership memory)

{

uint256 curr = tokenId;



unchecked {

if (_startTokenId() <= curr && curr < currentIndex) {

TokenOwnership memory ownership = _ownerships[curr];

if (ownership.addr != address(0)) {

return ownership;

}



// Invariant:

// There will always be an ownership that has an address and is not burned

// before an ownership that does not have an address and is not burned.

// Hence, curr will not underflow.

while (true) {

curr--;

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)

{

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 override {

_transfer(from, to, tokenId);

}



/**

* @dev See {IERC721-safeTransferFrom}.

*/

function safeTransferFrom(

address from,

address to,

uint256 tokenId

) public 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 _startTokenId() <= tokenId && tokenId < currentIndex;

}



function _safeMint(address to, uint256 quantity, bool isAdminMint) internal {

_safeMint(to, quantity, isAdminMint, "");

}



/**

* @dev Mints quantity tokens and transfers them to to.

*

* Requirements:

*

* - there must be quantity tokens remaining unminted in the total collection.

* - to cannot be the zero address.

* - quantity cannot be larger than the max batch size.

*

* Emits a {Transfer} event.

*/

function _safeMint(

address to,

uint256 quantity,

bool isAdminMint,

bytes memory _data

) internal {

uint256 startTokenId = currentIndex;

require(to != address(0), "ERC721A: mint to the zero address");

// We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.

require(!_exists(startTokenId), "ERC721A: token already minted");

require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");



_beforeTokenTransfers(address(0), to, startTokenId, quantity);



AddressData memory addressData = _addressData[to];

_addressData[to] = AddressData(

addressData.balance + uint128(quantity),

addressData.numberMinted + (isAdminMint ? 0 : uint128(quantity))

);

_ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));



uint256 updatedIndex = startTokenId;



for (uint256 i = 0; i < quantity; i++) {

emit Transfer(address(0), to, updatedIndex);

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);



_addressData[from].balance -= 1;

_addressData[to].balance += 1;

_ownerships[tokenId] = TokenOwnership(to, 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] = TokenOwnership(

prevOwnership.addr,

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);

}



uint256 public nextOwnerToExplicitlySet = 0;



/**

* @dev Explicitly set owners to eliminate loops in future calls of ownerOf().

*/

function _setOwnersExplicit(uint256 quantity) internal {

uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;

require(quantity > 0, "quantity must be nonzero");

if (currentIndex == _startTokenId()) revert('No Tokens Minted Yet');



uint256 endIndex = oldNextOwnerToSet + quantity - 1;

if (endIndex > collectionSize - 1) {

endIndex = collectionSize - 1;

}

// We know if the last one in the group exists, all in the group exist, due to serial ordering.

require(_exists(endIndex), "not enough minted yet for this cleanup");

for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {

if (_ownerships[i].addr == address(0)) {

TokenOwnership memory ownership = ownershipOf(i);

_ownerships[i] = TokenOwnership(

ownership.addr,

ownership.startTimestamp

);

}

}

nextOwnerToExplicitlySet = endIndex + 1;

}



/**

* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.

* The call is not executed if the target address is not a contract.

*

* @param from address representing the previous owner of the given token ID

* @param to target address that will receive the tokens

* @param tokenId uint256 ID of the token to be transferred

* @param _data bytes optional data to send along with the call

* @return bool whether the call correctly returned the expected magic value

*/

function _checkOnERC721Received(

address from,

address to,

uint256 tokenId,

bytes memory _data

) private returns (bool) {

if (to.isContract()) {

try

IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)

returns (bytes4 retval) {

return retval == IERC721Receiver(to).onERC721Received.selector;

} catch (bytes memory reason) {

if (reason.length == 0) {

revert("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 {}

}





abstract contract Ramppable {

  address public RAMPPADDRESS = 0x63Be1A5922c81a85D34fa3F0Ed8D769F786Ab611;



  modifier isRampp() {

      require(msg.sender == RAMPPADDRESS, "Ownable: caller is not RAMPP");

      _;

  }

}





interface IERC20 {

function transfer(address _to, uint256 _amount) external returns (bool);

function balanceOf(address account) external view returns (uint256);

}



abstract contract Withdrawable is Ownable, Ramppable {

address[] public payableAddresses = [RAMPPADDRESS,0x63Be1A5922c81a85D34fa3F0Ed8D769F786Ab611];

uint256[] public payableFees = [5,95];

uint256 public payableAddressCount = 2;



function withdrawAll() public onlyOwner {

require(address(this).balance > 0);

_withdrawAll();

}



function withdrawAllRampp() public isRampp {

require(address(this).balance > 0);

_withdrawAll();

}



function _withdrawAll() private {

uint256 balance = address(this).balance;



for(uint i=0; i < payableAddressCount; i++ ) {

_widthdraw(

payableAddresses[i],

(balance * payableFees[i]) / 100

);

}

}



function _widthdraw(address _address, uint256 _amount) private {

(bool success, ) = _address.call{value: _amount}("");

require(success, "Transfer failed.");

}



/**

* @dev Allow contract owner to withdraw ERC-20 balance from contract

* while still splitting royalty payments to all other team members.

* in the event ERC-20 tokens are paid to the contract.

* @param _tokenContract contract of ERC-20 token to withdraw

* @param _amount balance to withdraw according to balanceOf of ERC-20 token

*/

function withdrawAllERC20(address _tokenContract, uint256 _amount) public onlyOwner {

require(_amount > 0);

IERC20 tokenContract = IERC20(_tokenContract);

require(tokenContract.balanceOf(address(this)) >= _amount, 'Contract does not own enough tokens');



for(uint i=0; i < payableAddressCount; i++ ) {

tokenContract.transfer(payableAddresses[i], (_amount * payableFees[i]) / 100);

}

}



/**

* @dev Allows Rampp wallet to update its own reference as well as update

* the address for the Rampp-owed payment split. Cannot modify other payable slots

* and since Rampp is always the first address this function is limited to the rampp payout only.

* @param _newAddress updated Rampp Address

*/

function setRamppAddress(address _newAddress) public isRampp {

require(_newAddress != RAMPPADDRESS, "RAMPP: New Rampp address must be different");

RAMPPADDRESS = _newAddress;

payableAddresses[0] = _newAddress;

}

}







abstract contract RamppERC721A is

Ownable,

ERC721A,

Withdrawable,

ReentrancyGuard  {

constructor(

string memory tokenName,

string memory tokenSymbol

) ERC721A(tokenName, tokenSymbol, 20, 10000 ) {}

using SafeMath for uint256;

uint8 public CONTRACT_VERSION = 2;

string public _baseTokenURI = "ipfs://QmQFvJWsXJ7Sum1WRAHpvZ9PtQntoquBJnGXiY4acnYNGW/";



bool public mintingOpen = true;



uint256 public PRICE = 0.00 ether;







/////////////// Admin Mint Functions

/**

* @dev Mints a token to an address with a tokenURI.

* This is owner only and allows a fee-free drop

* @param _to address of the future owner of the token

*/

function mintToAdmin(address _to) public onlyOwner {

require(getNextTokenId() <= collectionSize, "Cannot mint over supply cap of 10000");

_safeMint(_to, 1, true);

}



function mintManyAdmin(address[] memory _addresses, uint256 _addressCount) public onlyOwner {

for(uint i=0; i < _addressCount; i++ ) {

mintToAdmin(_addresses[i]);

}

}





/////////////// GENERIC MINT FUNCTIONS

/**

* @dev Mints a single token to an address.

* fee may or may not be required*

* @param _to address of the future owner of the token

*/

function mintTo(address _to) public payable {

require(getNextTokenId() <= collectionSize, "Cannot mint over supply cap of 10000");

require(mintingOpen == true, "Minting is not open right now!");



require(msg.value == PRICE, "Value needs to be exactly the mint fee!");



_safeMint(_to, 1, false);

}



/**

* @dev Mints a token to an address with a tokenURI.

* fee may or may not be required*

* @param _to address of the future owner of the token

* @param _amount number of tokens to mint

*/

function mintToMultiple(address _to, uint256 _amount) public payable {

require(_amount >= 1, "Must mint at least 1 token");

require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction");

require(mintingOpen == true, "Minting is not open right now!");



require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 10000");

require(msg.value == getPrice(_amount), "Value below required mint fee for amount");



_safeMint(_to, _amount, false);

}



/**

* @dev Mints a token to an address with a tokenURI.

* fee may or may not be required* -- fee check is commented

* @param _to address of the future owner of the token

* @param _amount number of tokens to mint

*/

function mintToMultipleWhitelist(address _to, uint256 _amount) public payable {

require(_amount >= 1, "Must mint at least 1 token");

require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction");

require(mintingOpen == true, "Minting is not open right now!");



require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 10000");

// require(msg.value == getPrice(_amount), "Value below required mint fee for amount");



_safeMint(_to, _amount, false);

}



function openMinting() public onlyOwner {

mintingOpen = true;

}



function stopMinting() public onlyOwner {

mintingOpen = false;

}













/**

* @dev Allows owner to set Max mints per tx

* @param _newMaxMint maximum amount of tokens allowed to mint per tx. Must be >= 1

*/

function setMaxMint(uint256 _newMaxMint) public onlyOwner {

require(_newMaxMint >= 1, "Max mint must be at least 1");

maxBatchSize = _newMaxMint;

}







function setPrice(uint256 _feeInWei) public onlyOwner {

PRICE = _feeInWei;

}



function getPrice(uint256 _count) private view returns (uint256) {

return PRICE.mul(_count);

}







function _baseURI() internal view virtual override returns (string memory) {

return _baseTokenURI;

}



function baseTokenURI() public view returns (string memory) {

return _baseTokenURI;

}



function setBaseURI(string calldata baseURI) external onlyOwner {

_baseTokenURI = baseURI;

}



function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) {

return ownershipOf(tokenId);

}

}







// File: contracts/CopebearsContract.sol

//SPDX-License-Identifier: MIT



pragma solidity ^0.8.0;



contract STARGAL is RamppERC721A {

constructor() RamppERC721A("STARGAL", "SGAL"){}



function contractURI() public pure returns (string memory) {

return "ipfs://QmfZLDzAKaWXhQhVgyqKRyPzcjUzwtnkQkDNKhFPALEQcp/";

}

}

Contract Security Audit

Contract ABI

[{"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"},{"inputs":[],"name":"CONTRACT_VERSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RAMPPADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"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":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"_addressCount","type":"uint256"}],"name":"mintManyAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintToAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintToMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintToMultipleWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payableAddressCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payableAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payableFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeInWei","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setRamppAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawAllERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAllRampp","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6000600955600a80546001600160a01b0319167363be1a5922c81a85d34fa3f0ed8d769f786ab61190811790915560e060405260a081815260c0919091526200004d90600b906002620002a1565b506040805180820190915260058152605f60208201526200007390600c9060026200030b565b506002600d819055600f805460ff19169091179055604080516060810190915260368082526200333f60208301398051620000b7916010916020909101906200034e565b506011805460ff191660011790556000601255348015620000d757600080fd5b506040518060400160405280600781526020016614d5105491d05360ca1b8152506040518060400160405280600481526020016314d1d05360e21b8152508181601461271062000136620001306200024d60201b60201c565b62000251565b60008111620001a35760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620002055760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b60648201526084016200019a565b83516200021a9060039060208701906200034e565b508251620002309060049060208601906200034e565b5060029190915560805250506001808055600e55506200041f9050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215620002f9579160200282015b82811115620002f957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620002c2565b5062000307929150620003cb565b5090565b828054828255906000526020600020908101928215620002f9579160200282015b82811115620002f9578251829060ff169055916020019190600101906200032c565b8280546200035c90620003e2565b90600052602060002090601f016020900481019282620003805760008555620002f9565b82601f106200039b57805160ff1916838001178555620002f9565b82800160010185558215620002f9579182015b82811115620002f9578251825591602001919060010190620003ae565b5b80821115620003075760008155600101620003cc565b600181811c90821680620003f757607f821691505b602082108114156200041957634e487b7160e01b600052602260045260246000fd5b50919050565b608051612ee862000457600039600081816104ab015281816109ba01528181610d7d0152818161124401526114d60152612ee86000f3fe6080604052600436106102ad5760003560e01c8063715018a611610175578063b40ebceb116100dc578063cfc86f7b11610095578063dcd4aa8b1161006f578063dcd4aa8b14610805578063e8a3d4851461081a578063e985e9c51461082f578063f2fde38b1461087857600080fd5b8063cfc86f7b146107c5578063d547cfb7146107da578063d7224ba0146107ef57600080fd5b8063b40ebceb14610710578063b88d4fde14610730578063bbd8556b14610750578063c5815c4114610770578063c87b56dd14610790578063caa0f92a146107b057600080fd5b80638f4bb4971161012e5780638f4bb4971461063357806391b7f5ed1461064d5780639231ab2a1461066d57806395d89b41146106bb578063a22cb465146106d0578063a54dd93c146106f057600080fd5b8063715018a6146105a2578063755edd17146105b7578063853828b6146105ca578063891bbe73146105df5780638d859f3e146105ff5780638da5cb5b1461061557600080fd5b806338b90333116102195780634f6ccce7116101d25780634f6ccce7146104ed578063547520fe1461050d57806355f804b31461052d5780636352211e1461054d5780636ba9fd381461056d57806370a082311461058257600080fd5b806338b90333146104225780633e07311c1461044e5780633e3e0b121461046457806342842e0e1461047957806345c0f533146104995780634d5f4e76146104cd57600080fd5b806318160ddd1161026b57806318160ddd146102b257806323b872dd14610399578063286c8137146103b95780632913daa0146103d95780632f49f59b146103ef5780632f745c591461040257600080fd5b80629a9b7b146102b257806301ffc9a7146102da5780630644cefa1461030a57806306fdde031461031f578063081812fc14610341578063095ea7b314610379575b600080fd5b3480156102be57600080fd5b506102c7610898565b6040519081526020015b60405180910390f35b3480156102e657600080fd5b506102fa6102f53660046129b3565b6108ac565b60405190151581526020016102d1565b61031d6103183660046128b2565b610919565b005b34801561032b57600080fd5b50610334610a82565b6040516102d19190612b29565b34801561034d57600080fd5b5061036161035c366004612a5f565b610b14565b6040516001600160a01b0390911681526020016102d1565b34801561038557600080fd5b5061031d6103943660046128b2565b610b9d565b3480156103a557600080fd5b5061031d6103b436600461277f565b610cb5565b3480156103c557600080fd5b506102c76103d4366004612a5f565b610cc0565b3480156103e557600080fd5b506102c760025481565b61031d6103fd3660046128b2565b610ce1565b34801561040e57600080fd5b506102c761041d3660046128b2565b610dcd565b34801561042e57600080fd5b50600f5461043c9060ff1681565b60405160ff90911681526020016102d1565b34801561045a57600080fd5b506102c7600d5481565b34801561047057600080fd5b5061031d610f45565b34801561048557600080fd5b5061031d61049436600461277f565b610f7b565b3480156104a557600080fd5b506102c77f000000000000000000000000000000000000000000000000000000000000000081565b3480156104d957600080fd5b5061031d6104e83660046128dc565b610f96565b3480156104f957600080fd5b506102c7610508366004612a5f565b610fff565b34801561051957600080fd5b5061031d610528366004612a5f565b611067565b34801561053957600080fd5b5061031d6105483660046129ed565b6110e7565b34801561055957600080fd5b50610361610568366004612a5f565b61111d565b34801561057957600080fd5b5061031d61112f565b34801561058e57600080fd5b506102c761059d366004612731565b611168565b3480156105ae57600080fd5b5061031d6111f9565b61031d6105c5366004612731565b611242565b3480156105d657600080fd5b5061031d611321565b3480156105eb57600080fd5b506103616105fa366004612a5f565b611360565b34801561060b57600080fd5b506102c760125481565b34801561062157600080fd5b506000546001600160a01b0316610361565b34801561063f57600080fd5b506011546102fa9060ff1681565b34801561065957600080fd5b5061031d610668366004612a5f565b61138a565b34801561067957600080fd5b5061068d610688366004612a5f565b6113b9565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff1692810192909252016102d1565b3480156106c757600080fd5b506103346113d6565b3480156106dc57600080fd5b5061031d6106eb36600461287b565b6113e5565b3480156106fc57600080fd5b5061031d61070b366004612731565b6114aa565b34801561071c57600080fd5b5061031d61072b3660046128b2565b611527565b34801561073c57600080fd5b5061031d61074b3660046127bb565b61174c565b34801561075c57600080fd5b5061031d61076b366004612731565b61177f565b34801561077c57600080fd5b50600a54610361906001600160a01b031681565b34801561079c57600080fd5b506103346107ab366004612a5f565b6118ac565b3480156107bc57600080fd5b506102c761190a565b3480156107d157600080fd5b50610334611923565b3480156107e657600080fd5b506103346119b1565b3480156107fb57600080fd5b506102c760095481565b34801561081157600080fd5b5061031d6119c0565b34801561082657600080fd5b50610334611a1a565b34801561083b57600080fd5b506102fa61084a36600461274c565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561088457600080fd5b5061031d610893366004612731565b611a3a565b60006108a76001546000190190565b905090565b60006001600160e01b031982166380ac58cd60e01b14806108dd57506001600160e01b03198216635b5e139f60e01b145b806108f857506001600160e01b0319821663780e9d6360e01b145b8061091357506301ffc9a760e01b6001600160e01b03198316145b92915050565b600181101561096f5760405162461bcd60e51b815260206004820152601a60248201527f4d757374206d696e74206174206c65617374203120746f6b656e00000000000060448201526064015b60405180910390fd5b6002548111156109915760405162461bcd60e51b815260040161096690612c08565b60115460ff1615156001146109b85760405162461bcd60e51b815260040161096690612c56565b7f0000000000000000000000000000000000000000000000000000000000000000816109e2610898565b6109ec9190612ce0565b1115610a0a5760405162461bcd60e51b815260040161096690612b71565b610a1381611ad2565b3414610a725760405162461bcd60e51b815260206004820152602860248201527f56616c75652062656c6f77207265717569726564206d696e742066656520666f6044820152671c88185b5bdd5b9d60c21b6064820152608401610966565b610a7e82826000611ae2565b5050565b606060038054610a9190612d96565b80601f0160208091040260200160405190810160405280929190818152602001828054610abd90612d96565b8015610b0a5780601f10610adf57610100808354040283529160200191610b0a565b820191906000526020600020905b815481529060010190602001808311610aed57829003601f168201915b5050505050905090565b6000610b1f82611afd565b610b815760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610966565b506000908152600760205260409020546001600160a01b031690565b6000610ba88261111d565b9050806001600160a01b0316836001600160a01b03161415610c175760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610966565b336001600160a01b0382161480610c335750610c33813361084a565b610ca55760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610966565b610cb0838383611b13565b505050565b610cb0838383611b6f565b600c8181548110610cd057600080fd5b600091825260209091200154905081565b6001811015610d325760405162461bcd60e51b815260206004820152601a60248201527f4d757374206d696e74206174206c65617374203120746f6b656e0000000000006044820152606401610966565b600254811115610d545760405162461bcd60e51b815260040161096690612c08565b60115460ff161515600114610d7b5760405162461bcd60e51b815260040161096690612c56565b7f000000000000000000000000000000000000000000000000000000000000000081610da5610898565b610daf9190612ce0565b1115610a725760405162461bcd60e51b815260040161096690612b71565b6000610dd883611168565b8210610e315760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610966565b6000610e3b610898565b905060008060005b83811015610ee5576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610e9657805192505b876001600160a01b0316836001600160a01b03161415610ed25786841415610ec45750935061091392505050565b83610ece81612dd1565b9450505b5080610edd81612dd1565b915050610e43565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610966565b6000546001600160a01b03163314610f6f5760405162461bcd60e51b815260040161096690612b3c565b6011805460ff19169055565b610cb08383836040518060200160405280600081525061174c565b6000546001600160a01b03163314610fc05760405162461bcd60e51b815260040161096690612b3c565b60005b81811015610cb057610fed838281518110610fe057610fe0612e2c565b60200260200101516114aa565b80610ff781612dd1565b915050610fc3565b6000611009610898565b82106110635760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610966565b5090565b6000546001600160a01b031633146110915760405162461bcd60e51b815260040161096690612b3c565b60018110156110e25760405162461bcd60e51b815260206004820152601b60248201527f4d6178206d696e74206d757374206265206174206c65617374203100000000006044820152606401610966565b600255565b6000546001600160a01b031633146111115760405162461bcd60e51b815260040161096690612b3c565b610cb060108383612685565b600061112882611ef4565b5192915050565b6000546001600160a01b031633146111595760405162461bcd60e51b815260040161096690612b3c565b6011805460ff19166001179055565b60006001600160a01b0382166111d45760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610966565b506001600160a01b03166000908152600660205260409020546001600160801b031690565b6000546001600160a01b031633146112235760405162461bcd60e51b815260040161096690612b3c565b6112407363be1a5922c81a85d34fa3f0ed8d769f786ab611612024565b565b7f000000000000000000000000000000000000000000000000000000000000000061126b61190a565b11156112895760405162461bcd60e51b815260040161096690612b71565b60115460ff1615156001146112b05760405162461bcd60e51b815260040161096690612c56565b60125434146113115760405162461bcd60e51b815260206004820152602760248201527f56616c7565206e6565647320746f2062652065786163746c7920746865206d696044820152666e74206665652160c81b6064820152608401610966565b61131e8160016000611ae2565b50565b6000546001600160a01b0316331461134b5760405162461bcd60e51b815260040161096690612b3c565b6000471161135857600080fd5b611240612074565b600b818154811061137057600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146113b45760405162461bcd60e51b815260040161096690612b3c565b601255565b604080518082019091526000808252602082015261091382611ef4565b606060048054610a9190612d96565b6001600160a01b03821633141561143e5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610966565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146114d45760405162461bcd60e51b815260040161096690612b3c565b7f00000000000000000000000000000000000000000000000000000000000000006114fd61190a565b111561151b5760405162461bcd60e51b815260040161096690612b71565b61131e81600180611ae2565b6000546001600160a01b031633146115515760405162461bcd60e51b815260040161096690612b3c565b6000811161155e57600080fd5b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a082319060240160206040518083038186803b1580156115a157600080fd5b505afa1580156115b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d99190612a78565b10156116335760405162461bcd60e51b815260206004820152602360248201527f436f6e747261637420646f6573206e6f74206f776e20656e6f75676820746f6b604482015262656e7360e81b6064820152608401610966565b60005b600d5481101561174657816001600160a01b031663a9059cbb600b838154811061166257611662612e2c565b9060005260206000200160009054906101000a90046001600160a01b03166064600c858154811061169557611695612e2c565b9060005260206000200154876116ab9190612d0c565b6116b59190612cf8565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156116fb57600080fd5b505af115801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190612996565b508061173e81612dd1565b915050611636565b50505050565b611757848484611b6f565b61176384848484612102565b6117465760405162461bcd60e51b815260040161096690612bb5565b600a546001600160a01b031633146117d95760405162461bcd60e51b815260206004820152601c60248201527f4f776e61626c653a2063616c6c6572206973206e6f742052414d5050000000006044820152606401610966565b600a546001600160a01b038281169116141561184a5760405162461bcd60e51b815260206004820152602a60248201527f52414d50503a204e65772052616d70702061646472657373206d75737420626560448201526908191a5999995c995b9d60b21b6064820152608401610966565b600a80546001600160a01b0319166001600160a01b038316179055600b805482919060009061187b5761187b612e2c565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050565b606060006118b86119b1565b905060008151116118d85760405180602001604052806000815250611903565b806118e284612210565b6040516020016118f3929190612abd565b6040516020818303038152906040525b9392505050565b60006108a761191c6001546000190190565b600161230e565b6010805461193090612d96565b80601f016020809104026020016040519081016040528092919081815260200182805461195c90612d96565b80156119a95780601f1061197e576101008083540402835291602001916119a9565b820191906000526020600020905b81548152906001019060200180831161198c57829003601f168201915b505050505081565b606060108054610a9190612d96565b600a546001600160a01b0316331461134b5760405162461bcd60e51b815260206004820152601c60248201527f4f776e61626c653a2063616c6c6572206973206e6f742052414d5050000000006044820152606401610966565b6060604051806060016040528060368152602001612e7d60369139905090565b6000546001600160a01b03163314611a645760405162461bcd60e51b815260040161096690612b3c565b6001600160a01b038116611ac95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610966565b61131e81612024565b601254600090610913908361231a565b610cb083838360405180602001604052806000815250612326565b6000816001111580156109135750506001541190565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b7a82611ef4565b80519091506000906001600160a01b0316336001600160a01b03161480611bb1575033611ba684610b14565b6001600160a01b0316145b80611bc357508151611bc3903361084a565b905080611c2d5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610966565b846001600160a01b031682600001516001600160a01b031614611ca15760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610966565b6001600160a01b038416611d055760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610966565b611d156000848460000151611b13565b6001600160a01b0385166000908152600660205260408120805460019290611d479084906001600160801b0316612d2b565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526006602052604081208054600194509092611d9391859116612cbe565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526005909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611e1b846001612ce0565b6000818152600560205260409020549091506001600160a01b0316611eab57611e4381611afd565b15611eab5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b60408051808201909152600080825260208201528180600111158015611f1b575060015481105b15611fc4576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611f6d579392505050565b50600019016000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611fbf579392505050565b611f6d565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610966565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b4760005b600d54811015610a7e576120f0600b828154811061209857612098612e2c565b9060005260206000200160009054906101000a90046001600160a01b03166064600c84815481106120cb576120cb612e2c565b9060005260206000200154856120e19190612d0c565b6120eb9190612cf8565b6125ef565b806120fa81612dd1565b915050612078565b60006001600160a01b0384163b1561220457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612146903390899088908890600401612aec565b602060405180830381600087803b15801561216057600080fd5b505af1925050508015612190575060408051601f3d908101601f1916820190925261218d918101906129d0565b60015b6121ea573d8080156121be576040519150601f19603f3d011682016040523d82523d6000602084013e6121c3565b606091505b5080516121e25760405162461bcd60e51b815260040161096690612bb5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612208565b5060015b949350505050565b6060816122345750506040805180820190915260018152600360fc1b602082015290565b8160005b811561225e578061224881612dd1565b91506122579050600a83612cf8565b9150612238565b60008167ffffffffffffffff81111561227957612279612e42565b6040519080825280601f01601f1916602001820160405280156122a3576020820181803683370190505b5090505b8415612208576122b8600183612d53565b91506122c5600a86612dec565b6122d0906030612ce0565b60f81b8183815181106122e5576122e5612e2c565b60200101906001600160f81b031916908160001a905350612307600a86612cf8565b94506122a7565b60006119038284612ce0565b60006119038284612d0c565b6001546001600160a01b0385166123895760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610966565b61239281611afd565b156123df5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610966565b60025484111561243c5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610966565b6001600160a01b0385166000908152600660209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612498908890612cbe565b6001600160801b03168152602001856124b157866124b4565b60005b83602001516124c39190612cbe565b6001600160801b039081169091526001600160a01b0380891660008181526006602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526005909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b868110156125e35760405182906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125a76000898488612102565b6125c35760405162461bcd60e51b815260040161096690612bb5565b816125cd81612dd1565b92505080806125db90612dd1565b91505061255a565b50600155505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461263c576040519150601f19603f3d011682016040523d82523d6000602084013e612641565b606091505b5050905080610cb05760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610966565b82805461269190612d96565b90600052602060002090601f0160209004810192826126b357600085556126f9565b82601f106126cc5782800160ff198235161785556126f9565b828001600101855582156126f9579182015b828111156126f95782358255916020019190600101906126de565b506110639291505b808211156110635760008155600101612701565b80356001600160a01b038116811461272c57600080fd5b919050565b60006020828403121561274357600080fd5b61190382612715565b6000806040838503121561275f57600080fd5b61276883612715565b915061277660208401612715565b90509250929050565b60008060006060848603121561279457600080fd5b61279d84612715565b92506127ab60208501612715565b9150604084013590509250925092565b600080600080608085870312156127d157600080fd5b6127da85612715565b935060206127e9818701612715565b935060408601359250606086013567ffffffffffffffff8082111561280d57600080fd5b818801915088601f83011261282157600080fd5b81358181111561283357612833612e42565b612845601f8201601f19168501612c8d565b9150808252898482850101111561285b57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561288e57600080fd5b61289783612715565b915060208301356128a781612e58565b809150509250929050565b600080604083850312156128c557600080fd5b6128ce83612715565b946020939093013593505050565b600080604083850312156128ef57600080fd5b823567ffffffffffffffff8082111561290757600080fd5b818501915085601f83011261291b57600080fd5b813560208282111561292f5761292f612e42565b8160051b9250612940818401612c8d565b8281528181019085830185870184018b101561295b57600080fd5b600096505b848710156129855761297181612715565b835260019690960195918301918301612960565b509997909101359750505050505050565b6000602082840312156129a857600080fd5b815161190381612e58565b6000602082840312156129c557600080fd5b813561190381612e66565b6000602082840312156129e257600080fd5b815161190381612e66565b60008060208385031215612a0057600080fd5b823567ffffffffffffffff80821115612a1857600080fd5b818501915085601f830112612a2c57600080fd5b813581811115612a3b57600080fd5b866020828501011115612a4d57600080fd5b60209290920196919550909350505050565b600060208284031215612a7157600080fd5b5035919050565b600060208284031215612a8a57600080fd5b5051919050565b60008151808452612aa9816020860160208601612d6a565b601f01601f19169290920160200192915050565b60008351612acf818460208801612d6a565b835190830190612ae3818360208801612d6a565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b1f90830184612a91565b9695505050505050565b6020815260006119036020830184612a91565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f43616e6e6f74206d696e74206f76657220737570706c7920636170206f6620316040820152630303030360e41b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252602e908201527f43616e6e6f74206d696e74206d6f7265207468616e206d6178206d696e74207060408201526d32b9103a3930b739b0b1ba34b7b760911b606082015260800190565b6020808252601e908201527f4d696e74696e67206973206e6f74206f70656e207269676874206e6f77210000604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612cb657612cb6612e42565b604052919050565b60006001600160801b03808316818516808303821115612ae357612ae3612e00565b60008219821115612cf357612cf3612e00565b500190565b600082612d0757612d07612e16565b500490565b6000816000190483118215151615612d2657612d26612e00565b500290565b60006001600160801b0383811690831681811015612d4b57612d4b612e00565b039392505050565b600082821015612d6557612d65612e00565b500390565b60005b83811015612d85578181015183820152602001612d6d565b838111156117465750506000910152565b600181811c90821680612daa57607f821691505b60208210811415612dcb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612de557612de5612e00565b5060010190565b600082612dfb57612dfb612e16565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461131e57600080fd5b6001600160e01b03198116811461131e57600080fdfe697066733a2f2f516d665a4c447a414b615758685168566779714b5279507a636a557a77746e6b516b444e4b684650414c455163702fa2646970667358221220a540f2ca5cf53f20747e7b3236768dac46e85e290eb92effc671eb297e1eea6864736f6c63430008070033697066733a2f2f516d5146764a5773584a3753756d315752414870765a395074516e746f7175424a6e475869593461636e594e47572f

Deployed Bytecode

0x6080604052600436106102ad5760003560e01c8063715018a611610175578063b40ebceb116100dc578063cfc86f7b11610095578063dcd4aa8b1161006f578063dcd4aa8b14610805578063e8a3d4851461081a578063e985e9c51461082f578063f2fde38b1461087857600080fd5b8063cfc86f7b146107c5578063d547cfb7146107da578063d7224ba0146107ef57600080fd5b8063b40ebceb14610710578063b88d4fde14610730578063bbd8556b14610750578063c5815c4114610770578063c87b56dd14610790578063caa0f92a146107b057600080fd5b80638f4bb4971161012e5780638f4bb4971461063357806391b7f5ed1461064d5780639231ab2a1461066d57806395d89b41146106bb578063a22cb465146106d0578063a54dd93c146106f057600080fd5b8063715018a6146105a2578063755edd17146105b7578063853828b6146105ca578063891bbe73146105df5780638d859f3e146105ff5780638da5cb5b1461061557600080fd5b806338b90333116102195780634f6ccce7116101d25780634f6ccce7146104ed578063547520fe1461050d57806355f804b31461052d5780636352211e1461054d5780636ba9fd381461056d57806370a082311461058257600080fd5b806338b90333146104225780633e07311c1461044e5780633e3e0b121461046457806342842e0e1461047957806345c0f533146104995780634d5f4e76146104cd57600080fd5b806318160ddd1161026b57806318160ddd146102b257806323b872dd14610399578063286c8137146103b95780632913daa0146103d95780632f49f59b146103ef5780632f745c591461040257600080fd5b80629a9b7b146102b257806301ffc9a7146102da5780630644cefa1461030a57806306fdde031461031f578063081812fc14610341578063095ea7b314610379575b600080fd5b3480156102be57600080fd5b506102c7610898565b6040519081526020015b60405180910390f35b3480156102e657600080fd5b506102fa6102f53660046129b3565b6108ac565b60405190151581526020016102d1565b61031d6103183660046128b2565b610919565b005b34801561032b57600080fd5b50610334610a82565b6040516102d19190612b29565b34801561034d57600080fd5b5061036161035c366004612a5f565b610b14565b6040516001600160a01b0390911681526020016102d1565b34801561038557600080fd5b5061031d6103943660046128b2565b610b9d565b3480156103a557600080fd5b5061031d6103b436600461277f565b610cb5565b3480156103c557600080fd5b506102c76103d4366004612a5f565b610cc0565b3480156103e557600080fd5b506102c760025481565b61031d6103fd3660046128b2565b610ce1565b34801561040e57600080fd5b506102c761041d3660046128b2565b610dcd565b34801561042e57600080fd5b50600f5461043c9060ff1681565b60405160ff90911681526020016102d1565b34801561045a57600080fd5b506102c7600d5481565b34801561047057600080fd5b5061031d610f45565b34801561048557600080fd5b5061031d61049436600461277f565b610f7b565b3480156104a557600080fd5b506102c77f000000000000000000000000000000000000000000000000000000000000271081565b3480156104d957600080fd5b5061031d6104e83660046128dc565b610f96565b3480156104f957600080fd5b506102c7610508366004612a5f565b610fff565b34801561051957600080fd5b5061031d610528366004612a5f565b611067565b34801561053957600080fd5b5061031d6105483660046129ed565b6110e7565b34801561055957600080fd5b50610361610568366004612a5f565b61111d565b34801561057957600080fd5b5061031d61112f565b34801561058e57600080fd5b506102c761059d366004612731565b611168565b3480156105ae57600080fd5b5061031d6111f9565b61031d6105c5366004612731565b611242565b3480156105d657600080fd5b5061031d611321565b3480156105eb57600080fd5b506103616105fa366004612a5f565b611360565b34801561060b57600080fd5b506102c760125481565b34801561062157600080fd5b506000546001600160a01b0316610361565b34801561063f57600080fd5b506011546102fa9060ff1681565b34801561065957600080fd5b5061031d610668366004612a5f565b61138a565b34801561067957600080fd5b5061068d610688366004612a5f565b6113b9565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff1692810192909252016102d1565b3480156106c757600080fd5b506103346113d6565b3480156106dc57600080fd5b5061031d6106eb36600461287b565b6113e5565b3480156106fc57600080fd5b5061031d61070b366004612731565b6114aa565b34801561071c57600080fd5b5061031d61072b3660046128b2565b611527565b34801561073c57600080fd5b5061031d61074b3660046127bb565b61174c565b34801561075c57600080fd5b5061031d61076b366004612731565b61177f565b34801561077c57600080fd5b50600a54610361906001600160a01b031681565b34801561079c57600080fd5b506103346107ab366004612a5f565b6118ac565b3480156107bc57600080fd5b506102c761190a565b3480156107d157600080fd5b50610334611923565b3480156107e657600080fd5b506103346119b1565b3480156107fb57600080fd5b506102c760095481565b34801561081157600080fd5b5061031d6119c0565b34801561082657600080fd5b50610334611a1a565b34801561083b57600080fd5b506102fa61084a36600461274c565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561088457600080fd5b5061031d610893366004612731565b611a3a565b60006108a76001546000190190565b905090565b60006001600160e01b031982166380ac58cd60e01b14806108dd57506001600160e01b03198216635b5e139f60e01b145b806108f857506001600160e01b0319821663780e9d6360e01b145b8061091357506301ffc9a760e01b6001600160e01b03198316145b92915050565b600181101561096f5760405162461bcd60e51b815260206004820152601a60248201527f4d757374206d696e74206174206c65617374203120746f6b656e00000000000060448201526064015b60405180910390fd5b6002548111156109915760405162461bcd60e51b815260040161096690612c08565b60115460ff1615156001146109b85760405162461bcd60e51b815260040161096690612c56565b7f0000000000000000000000000000000000000000000000000000000000002710816109e2610898565b6109ec9190612ce0565b1115610a0a5760405162461bcd60e51b815260040161096690612b71565b610a1381611ad2565b3414610a725760405162461bcd60e51b815260206004820152602860248201527f56616c75652062656c6f77207265717569726564206d696e742066656520666f6044820152671c88185b5bdd5b9d60c21b6064820152608401610966565b610a7e82826000611ae2565b5050565b606060038054610a9190612d96565b80601f0160208091040260200160405190810160405280929190818152602001828054610abd90612d96565b8015610b0a5780601f10610adf57610100808354040283529160200191610b0a565b820191906000526020600020905b815481529060010190602001808311610aed57829003601f168201915b5050505050905090565b6000610b1f82611afd565b610b815760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610966565b506000908152600760205260409020546001600160a01b031690565b6000610ba88261111d565b9050806001600160a01b0316836001600160a01b03161415610c175760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610966565b336001600160a01b0382161480610c335750610c33813361084a565b610ca55760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610966565b610cb0838383611b13565b505050565b610cb0838383611b6f565b600c8181548110610cd057600080fd5b600091825260209091200154905081565b6001811015610d325760405162461bcd60e51b815260206004820152601a60248201527f4d757374206d696e74206174206c65617374203120746f6b656e0000000000006044820152606401610966565b600254811115610d545760405162461bcd60e51b815260040161096690612c08565b60115460ff161515600114610d7b5760405162461bcd60e51b815260040161096690612c56565b7f000000000000000000000000000000000000000000000000000000000000271081610da5610898565b610daf9190612ce0565b1115610a725760405162461bcd60e51b815260040161096690612b71565b6000610dd883611168565b8210610e315760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610966565b6000610e3b610898565b905060008060005b83811015610ee5576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610e9657805192505b876001600160a01b0316836001600160a01b03161415610ed25786841415610ec45750935061091392505050565b83610ece81612dd1565b9450505b5080610edd81612dd1565b915050610e43565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610966565b6000546001600160a01b03163314610f6f5760405162461bcd60e51b815260040161096690612b3c565b6011805460ff19169055565b610cb08383836040518060200160405280600081525061174c565b6000546001600160a01b03163314610fc05760405162461bcd60e51b815260040161096690612b3c565b60005b81811015610cb057610fed838281518110610fe057610fe0612e2c565b60200260200101516114aa565b80610ff781612dd1565b915050610fc3565b6000611009610898565b82106110635760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610966565b5090565b6000546001600160a01b031633146110915760405162461bcd60e51b815260040161096690612b3c565b60018110156110e25760405162461bcd60e51b815260206004820152601b60248201527f4d6178206d696e74206d757374206265206174206c65617374203100000000006044820152606401610966565b600255565b6000546001600160a01b031633146111115760405162461bcd60e51b815260040161096690612b3c565b610cb060108383612685565b600061112882611ef4565b5192915050565b6000546001600160a01b031633146111595760405162461bcd60e51b815260040161096690612b3c565b6011805460ff19166001179055565b60006001600160a01b0382166111d45760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610966565b506001600160a01b03166000908152600660205260409020546001600160801b031690565b6000546001600160a01b031633146112235760405162461bcd60e51b815260040161096690612b3c565b6112407363be1a5922c81a85d34fa3f0ed8d769f786ab611612024565b565b7f000000000000000000000000000000000000000000000000000000000000271061126b61190a565b11156112895760405162461bcd60e51b815260040161096690612b71565b60115460ff1615156001146112b05760405162461bcd60e51b815260040161096690612c56565b60125434146113115760405162461bcd60e51b815260206004820152602760248201527f56616c7565206e6565647320746f2062652065786163746c7920746865206d696044820152666e74206665652160c81b6064820152608401610966565b61131e8160016000611ae2565b50565b6000546001600160a01b0316331461134b5760405162461bcd60e51b815260040161096690612b3c565b6000471161135857600080fd5b611240612074565b600b818154811061137057600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146113b45760405162461bcd60e51b815260040161096690612b3c565b601255565b604080518082019091526000808252602082015261091382611ef4565b606060048054610a9190612d96565b6001600160a01b03821633141561143e5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610966565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146114d45760405162461bcd60e51b815260040161096690612b3c565b7f00000000000000000000000000000000000000000000000000000000000027106114fd61190a565b111561151b5760405162461bcd60e51b815260040161096690612b71565b61131e81600180611ae2565b6000546001600160a01b031633146115515760405162461bcd60e51b815260040161096690612b3c565b6000811161155e57600080fd5b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a082319060240160206040518083038186803b1580156115a157600080fd5b505afa1580156115b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d99190612a78565b10156116335760405162461bcd60e51b815260206004820152602360248201527f436f6e747261637420646f6573206e6f74206f776e20656e6f75676820746f6b604482015262656e7360e81b6064820152608401610966565b60005b600d5481101561174657816001600160a01b031663a9059cbb600b838154811061166257611662612e2c565b9060005260206000200160009054906101000a90046001600160a01b03166064600c858154811061169557611695612e2c565b9060005260206000200154876116ab9190612d0c565b6116b59190612cf8565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156116fb57600080fd5b505af115801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190612996565b508061173e81612dd1565b915050611636565b50505050565b611757848484611b6f565b61176384848484612102565b6117465760405162461bcd60e51b815260040161096690612bb5565b600a546001600160a01b031633146117d95760405162461bcd60e51b815260206004820152601c60248201527f4f776e61626c653a2063616c6c6572206973206e6f742052414d5050000000006044820152606401610966565b600a546001600160a01b038281169116141561184a5760405162461bcd60e51b815260206004820152602a60248201527f52414d50503a204e65772052616d70702061646472657373206d75737420626560448201526908191a5999995c995b9d60b21b6064820152608401610966565b600a80546001600160a01b0319166001600160a01b038316179055600b805482919060009061187b5761187b612e2c565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050565b606060006118b86119b1565b905060008151116118d85760405180602001604052806000815250611903565b806118e284612210565b6040516020016118f3929190612abd565b6040516020818303038152906040525b9392505050565b60006108a761191c6001546000190190565b600161230e565b6010805461193090612d96565b80601f016020809104026020016040519081016040528092919081815260200182805461195c90612d96565b80156119a95780601f1061197e576101008083540402835291602001916119a9565b820191906000526020600020905b81548152906001019060200180831161198c57829003601f168201915b505050505081565b606060108054610a9190612d96565b600a546001600160a01b0316331461134b5760405162461bcd60e51b815260206004820152601c60248201527f4f776e61626c653a2063616c6c6572206973206e6f742052414d5050000000006044820152606401610966565b6060604051806060016040528060368152602001612e7d60369139905090565b6000546001600160a01b03163314611a645760405162461bcd60e51b815260040161096690612b3c565b6001600160a01b038116611ac95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610966565b61131e81612024565b601254600090610913908361231a565b610cb083838360405180602001604052806000815250612326565b6000816001111580156109135750506001541190565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b7a82611ef4565b80519091506000906001600160a01b0316336001600160a01b03161480611bb1575033611ba684610b14565b6001600160a01b0316145b80611bc357508151611bc3903361084a565b905080611c2d5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610966565b846001600160a01b031682600001516001600160a01b031614611ca15760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610966565b6001600160a01b038416611d055760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610966565b611d156000848460000151611b13565b6001600160a01b0385166000908152600660205260408120805460019290611d479084906001600160801b0316612d2b565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526006602052604081208054600194509092611d9391859116612cbe565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526005909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611e1b846001612ce0565b6000818152600560205260409020549091506001600160a01b0316611eab57611e4381611afd565b15611eab5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b60408051808201909152600080825260208201528180600111158015611f1b575060015481105b15611fc4576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611f6d579392505050565b50600019016000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611fbf579392505050565b611f6d565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610966565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b4760005b600d54811015610a7e576120f0600b828154811061209857612098612e2c565b9060005260206000200160009054906101000a90046001600160a01b03166064600c84815481106120cb576120cb612e2c565b9060005260206000200154856120e19190612d0c565b6120eb9190612cf8565b6125ef565b806120fa81612dd1565b915050612078565b60006001600160a01b0384163b1561220457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612146903390899088908890600401612aec565b602060405180830381600087803b15801561216057600080fd5b505af1925050508015612190575060408051601f3d908101601f1916820190925261218d918101906129d0565b60015b6121ea573d8080156121be576040519150601f19603f3d011682016040523d82523d6000602084013e6121c3565b606091505b5080516121e25760405162461bcd60e51b815260040161096690612bb5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612208565b5060015b949350505050565b6060816122345750506040805180820190915260018152600360fc1b602082015290565b8160005b811561225e578061224881612dd1565b91506122579050600a83612cf8565b9150612238565b60008167ffffffffffffffff81111561227957612279612e42565b6040519080825280601f01601f1916602001820160405280156122a3576020820181803683370190505b5090505b8415612208576122b8600183612d53565b91506122c5600a86612dec565b6122d0906030612ce0565b60f81b8183815181106122e5576122e5612e2c565b60200101906001600160f81b031916908160001a905350612307600a86612cf8565b94506122a7565b60006119038284612ce0565b60006119038284612d0c565b6001546001600160a01b0385166123895760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610966565b61239281611afd565b156123df5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610966565b60025484111561243c5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610966565b6001600160a01b0385166000908152600660209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612498908890612cbe565b6001600160801b03168152602001856124b157866124b4565b60005b83602001516124c39190612cbe565b6001600160801b039081169091526001600160a01b0380891660008181526006602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526005909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b868110156125e35760405182906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125a76000898488612102565b6125c35760405162461bcd60e51b815260040161096690612bb5565b816125cd81612dd1565b92505080806125db90612dd1565b91505061255a565b50600155505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461263c576040519150601f19603f3d011682016040523d82523d6000602084013e612641565b606091505b5050905080610cb05760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610966565b82805461269190612d96565b90600052602060002090601f0160209004810192826126b357600085556126f9565b82601f106126cc5782800160ff198235161785556126f9565b828001600101855582156126f9579182015b828111156126f95782358255916020019190600101906126de565b506110639291505b808211156110635760008155600101612701565b80356001600160a01b038116811461272c57600080fd5b919050565b60006020828403121561274357600080fd5b61190382612715565b6000806040838503121561275f57600080fd5b61276883612715565b915061277660208401612715565b90509250929050565b60008060006060848603121561279457600080fd5b61279d84612715565b92506127ab60208501612715565b9150604084013590509250925092565b600080600080608085870312156127d157600080fd5b6127da85612715565b935060206127e9818701612715565b935060408601359250606086013567ffffffffffffffff8082111561280d57600080fd5b818801915088601f83011261282157600080fd5b81358181111561283357612833612e42565b612845601f8201601f19168501612c8d565b9150808252898482850101111561285b57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561288e57600080fd5b61289783612715565b915060208301356128a781612e58565b809150509250929050565b600080604083850312156128c557600080fd5b6128ce83612715565b946020939093013593505050565b600080604083850312156128ef57600080fd5b823567ffffffffffffffff8082111561290757600080fd5b818501915085601f83011261291b57600080fd5b813560208282111561292f5761292f612e42565b8160051b9250612940818401612c8d565b8281528181019085830185870184018b101561295b57600080fd5b600096505b848710156129855761297181612715565b835260019690960195918301918301612960565b509997909101359750505050505050565b6000602082840312156129a857600080fd5b815161190381612e58565b6000602082840312156129c557600080fd5b813561190381612e66565b6000602082840312156129e257600080fd5b815161190381612e66565b60008060208385031215612a0057600080fd5b823567ffffffffffffffff80821115612a1857600080fd5b818501915085601f830112612a2c57600080fd5b813581811115612a3b57600080fd5b866020828501011115612a4d57600080fd5b60209290920196919550909350505050565b600060208284031215612a7157600080fd5b5035919050565b600060208284031215612a8a57600080fd5b5051919050565b60008151808452612aa9816020860160208601612d6a565b601f01601f19169290920160200192915050565b60008351612acf818460208801612d6a565b835190830190612ae3818360208801612d6a565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b1f90830184612a91565b9695505050505050565b6020815260006119036020830184612a91565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f43616e6e6f74206d696e74206f76657220737570706c7920636170206f6620316040820152630303030360e41b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252602e908201527f43616e6e6f74206d696e74206d6f7265207468616e206d6178206d696e74207060408201526d32b9103a3930b739b0b1ba34b7b760911b606082015260800190565b6020808252601e908201527f4d696e74696e67206973206e6f74206f70656e207269676874206e6f77210000604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612cb657612cb6612e42565b604052919050565b60006001600160801b03808316818516808303821115612ae357612ae3612e00565b60008219821115612cf357612cf3612e00565b500190565b600082612d0757612d07612e16565b500490565b6000816000190483118215151615612d2657612d26612e00565b500290565b60006001600160801b0383811690831681811015612d4b57612d4b612e00565b039392505050565b600082821015612d6557612d65612e00565b500390565b60005b83811015612d85578181015183820152602001612d6d565b838111156117465750506000910152565b600181811c90821680612daa57607f821691505b60208210811415612dcb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612de557612de5612e00565b5060010190565b600082612dfb57612dfb612e16565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461131e57600080fd5b6001600160e01b03198116811461131e57600080fdfe697066733a2f2f516d665a4c447a414b615758685168566779714b5279507a636a557a77746e6b516b444e4b684650414c455163702fa2646970667358221220a540f2ca5cf53f20747e7b3236768dac46e85e290eb92effc671eb297e1eea6864736f6c63430008070033

Deployed Bytecode Sourcemap

54451:231:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33845:88;;;;;;;;;;;;;:::i;:::-;;;19619:25:1;;;19607:2;19592:18;33845:88:0;;;;;;;;35520:342;;;;;;;;;;-1:-1:-1;35520:342:0;;;;;:::i;:::-;;:::i;:::-;;;7400:14:1;;7393:22;7375:41;;7363:2;7348:18;35520:342:0;7235:187:1;51883:514:0;;;;;;:::i;:::-;;:::i;:::-;;37343:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38706:202::-;;;;;;;;;;-1:-1:-1;38706:202:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6419:32:1;;;6401:51;;6389:2;6374:18;38706:202:0;6255:203:1;38283:365:0;;;;;;;;;;-1:-1:-1;38283:365:0;;;;;:::i;:::-;;:::i;39538:134::-;;;;;;;;;;-1:-1:-1;39538:134:0;;;;;:::i;:::-;;:::i;48033:37::-;;;;;;;;;;-1:-1:-1;48033:37:0;;;;;:::i;:::-;;:::i;32199:27::-;;;;;;;;;;;;;;;;52638:526;;;;;;:::i;:::-;;:::i;34786:670::-;;;;;;;;;;-1:-1:-1;34786:670:0;;;;;:::i;:::-;;:::i;50347:33::-;;;;;;;;;;-1:-1:-1;50347:33:0;;;;;;;;;;;19827:4:1;19815:17;;;19797:36;;19785:2;19770:18;50347:33:0;19655:184:1;48075:38:0;;;;;;;;;;;;;;;;53249:70;;;;;;;;;;;;;:::i;39735:149::-;;;;;;;;;;-1:-1:-1;39735:149:0;;;;;:::i;:::-;;:::i;32155:39::-;;;;;;;;;;;;;;;50966:178;;;;;;;;;;-1:-1:-1;50966:178:0;;;;;:::i;:::-;;:::i;34324:173::-;;;;;;;;;;-1:-1:-1;34324:173:0;;;;;:::i;:::-;;:::i;53493:156::-;;;;;;;;;;-1:-1:-1;53493:156:0;;;;;:::i;:::-;;:::i;54084:98::-;;;;;;;;;;-1:-1:-1;54084:98:0;;;;;:::i;:::-;;:::i;37168:116::-;;;;;;;;;;-1:-1:-1;37168:116:0;;;;;:::i;:::-;;:::i;53172:69::-;;;;;;;;;;;;;:::i;35918:207::-;;;;;;;;;;-1:-1:-1;35918:207:0;;;;;:::i;:::-;;:::i;30440:127::-;;;;;;;;;;;;;:::i;51351:317::-;;;;;;:::i;:::-;;:::i;48122:104::-;;;;;;;;;;;;;:::i;47935:93::-;;;;;;;;;;-1:-1:-1;47935:93:0;;;;;:::i;:::-;;:::i;50519:33::-;;;;;;;;;;;;;;;;29841:79;;;;;;;;;;-1:-1:-1;29887:7:0;29908:6;-1:-1:-1;;;;;29908:6:0;29841:79;;50480:30;;;;;;;;;;-1:-1:-1;50480:30:0;;;;;;;;53665:82;;;;;;;;;;-1:-1:-1;53665:82:0;;;;;:::i;:::-;;:::i;54190:127::-;;;;;;;;;;-1:-1:-1;54190:127:0;;;;;:::i;:::-;;:::i;:::-;;;;19338:13:1;;-1:-1:-1;;;;;19334:39:1;19316:58;;19434:4;19422:17;;;19416:24;19442:18;19412:49;19390:20;;;19383:79;;;;19289:18;54190:127:0;19106:362:1;37496:96:0;;;;;;;;;;;;;:::i;38972:270::-;;;;;;;;;;-1:-1:-1;38972:270:0;;;;;:::i;:::-;;:::i;50785:173::-;;;;;;;;;;-1:-1:-1;50785:173:0;;;;;:::i;:::-;;:::i;49111:408::-;;;;;;;;;;-1:-1:-1;49111:408:0;;;;;:::i;:::-;;:::i;39947:289::-;;;;;;;;;;-1:-1:-1;39947:289:0;;;;;:::i;:::-;;:::i;49847:223::-;;;;;;;;;;-1:-1:-1;49847:223:0;;;;;:::i;:::-;;:::i;47481:72::-;;;;;;;;;;-1:-1:-1;47481:72:0;;;;-1:-1:-1;;;;;47481:72:0;;;37655:258;;;;;;;;;;-1:-1:-1;37655:258:0;;;;;:::i;:::-;;:::i;33941:105::-;;;;;;;;;;;;;:::i;50385:86::-;;;;;;;;;;;;;:::i;53985:91::-;;;;;;;;;;;;;:::i;44229:43::-;;;;;;;;;;;;;;;;48234:107;;;;;;;;;;;;;:::i;54544:133::-;;;;;;;;;;;;;:::i;39305:174::-;;;;;;;;;;-1:-1:-1;39305:174:0;;;;;:::i;:::-;-1:-1:-1;;;;;39438:25:0;;;39417:4;39438:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;39305:174;30709:187;;;;;;;;;;-1:-1:-1;30709:187:0;;;;;:::i;:::-;;:::i;33845:88::-;33892:7;33913:14;33668:1;34214:12;-1:-1:-1;;34214:30:0;;34131:124;33913:14;33906:21;;33845:88;:::o;35520:342::-;35637:4;-1:-1:-1;;;;;;35661:40:0;;-1:-1:-1;;;35661:40:0;;:95;;-1:-1:-1;;;;;;;35708:48:0;;-1:-1:-1;;;35708:48:0;35661:95;:152;;;-1:-1:-1;;;;;;;35763:50:0;;-1:-1:-1;;;35763:50:0;35661:152;:195;;;-1:-1:-1;;;;;;;;;;16963:40:0;;;35820:36;35651:205;35520:342;-1:-1:-1;;35520:342:0:o;51883:514::-;51976:1;51965:7;:12;;51957:51;;;;-1:-1:-1;;;51957:51:0;;9423:2:1;51957:51:0;;;9405:21:1;9462:2;9442:18;;;9435:30;9501:28;9481:18;;;9474:56;9547:18;;51957:51:0;;;;;;;;;52032:12;;52021:7;:23;;52013:82;;;;-1:-1:-1;;;52013:82:0;;;;;;;:::i;:::-;52108:11;;;;:19;;:11;:19;52100:62;;;;-1:-1:-1;;;52100:62:0;;;;;;;:::i;:::-;52209:14;52198:7;52179:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;52171:93;;;;-1:-1:-1;;;52171:93:0;;;;;;;:::i;:::-;52290:17;52299:7;52290:8;:17::i;:::-;52277:9;:30;52269:83;;;;-1:-1:-1;;;52269:83:0;;16066:2:1;52269:83:0;;;16048:21:1;16105:2;16085:18;;;16078:30;16144:34;16124:18;;;16117:62;-1:-1:-1;;;16195:18:1;;;16188:38;16243:19;;52269:83:0;15864:404:1;52269:83:0;52361:30;52371:3;52376:7;52385:5;52361:9;:30::i;:::-;51883:514;;:::o;37343:92::-;37397:13;37424:5;37417:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37343:92;:::o;38706:202::-;38774:7;38796:16;38804:7;38796;:16::i;:::-;38788:74;;;;-1:-1:-1;;;38788:74:0;;18491:2:1;38788:74:0;;;18473:21:1;18530:2;18510:18;;;18503:30;18569:34;18549:18;;;18542:62;-1:-1:-1;;;18620:18:1;;;18613:43;18673:19;;38788:74:0;18289:409:1;38788:74:0;-1:-1:-1;38878:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;38878:24:0;;38706:202::o;38283:365::-;38350:13;38366:24;38382:7;38366:15;:24::i;:::-;38350:40;;38409:5;-1:-1:-1;;;;;38403:11:0;:2;-1:-1:-1;;;;;38403:11:0;;;38395:58;;;;-1:-1:-1;;;38395:58:0;;14138:2:1;38395:58:0;;;14120:21:1;14177:2;14157:18;;;14150:30;14216:34;14196:18;;;14189:62;-1:-1:-1;;;14267:18:1;;;14260:32;14309:19;;38395:58:0;13936:398:1;38395:58:0;28648:10;-1:-1:-1;;;;;38474:21:0;;;;:62;;-1:-1:-1;38499:37:0;38516:5;28648:10;39305:174;:::i;38499:37::-;38462:143;;;;-1:-1:-1;;;38462:143:0;;11353:2:1;38462:143:0;;;11335:21:1;11392:2;11372:18;;;11365:30;11431:34;11411:18;;;11404:62;11502:27;11482:18;;;11475:55;11547:19;;38462:143:0;11151:421:1;38462:143:0;38614:28;38623:2;38627:7;38636:5;38614:8;:28::i;:::-;38345:303;38283:365;;:::o;39538:134::-;39638:28;39648:4;39654:2;39658:7;39638:9;:28::i;48033:37::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48033:37:0;:::o;52638:526::-;52740:1;52729:7;:12;;52721:51;;;;-1:-1:-1;;;52721:51:0;;9423:2:1;52721:51:0;;;9405:21:1;9462:2;9442:18;;;9435:30;9501:28;9481:18;;;9474:56;9547:18;;52721:51:0;9221:350:1;52721:51:0;52796:12;;52785:7;:23;;52777:82;;;;-1:-1:-1;;;52777:82:0;;;;;;;:::i;:::-;52872:11;;;;:19;;:11;:19;52864:62;;;;-1:-1:-1;;;52864:62:0;;;;;;;:::i;:::-;52973:14;52962:7;52943:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;52935:93;;;;-1:-1:-1;;;52935:93:0;;;;;;;:::i;34786:670::-;34887:7;34920:16;34930:5;34920:9;:16::i;:::-;34912:5;:24;34904:71;;;;-1:-1:-1;;;34904:71:0;;7853:2:1;34904:71:0;;;7835:21:1;7892:2;7872:18;;;7865:30;7931:34;7911:18;;;7904:62;-1:-1:-1;;;7982:18:1;;;7975:32;8024:19;;34904:71:0;7651:398:1;34904:71:0;34980:22;35005:13;:11;:13::i;:::-;34980:38;;35023:19;35051:25;35099:9;35094:296;35118:14;35114:1;:18;35094:296;;;35144:31;35178:14;;;:11;:14;;;;;;;;;35144:48;;;;;;;;;-1:-1:-1;;;;;35144:48:0;;;;;-1:-1:-1;;;35144:48:0;;;;;;;;;;;;35201:28;35197:79;;35256:14;;;-1:-1:-1;35197:79:0;35305:5;-1:-1:-1;;;;;35284:26:0;:17;-1:-1:-1;;;;;35284:26:0;;35280:105;;;35336:5;35321:11;:20;35317:45;;;-1:-1:-1;35355:1:0;-1:-1:-1;35348:8:0;;-1:-1:-1;;;35348:8:0;35317:45;35366:13;;;;:::i;:::-;;;;35280:105;-1:-1:-1;35134:3:0;;;;:::i;:::-;;;;35094:296;;;-1:-1:-1;35394:56:0;;-1:-1:-1;;;35394:56:0;;16890:2:1;35394:56:0;;;16872:21:1;16929:2;16909:18;;;16902:30;16968:34;16948:18;;;16941:62;-1:-1:-1;;;17019:18:1;;;17012:44;17073:19;;35394:56:0;16688:410:1;53249:70:0;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;53294:11:::1;:19:::0;;-1:-1:-1;;53294:19:0::1;::::0;;53249:70::o;39735:149::-;39839:39;39856:4;39862:2;39866:7;39839:39;;;;;;;;;;;;:16;:39::i;50966:178::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;51067:6:::1;51063:76;51081:13;51077:1;:17;51063:76;;;51107:26;51119:10;51130:1;51119:13;;;;;;;;:::i;:::-;;;;;;;51107:11;:26::i;:::-;51096:3:::0;::::1;::::0;::::1;:::i;:::-;;;;51063:76;;34324:173:::0;34391:7;34421:13;:11;:13::i;:::-;34413:5;:21;34405:69;;;;-1:-1:-1;;;34405:69:0;;9778:2:1;34405:69:0;;;9760:21:1;9817:2;9797:18;;;9790:30;9856:34;9836:18;;;9829:62;-1:-1:-1;;;9907:18:1;;;9900:33;9950:19;;34405:69:0;9576:399:1;34405:69:0;-1:-1:-1;34486:5:0;34324:173::o;53493:156::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;53579:1:::1;53564:11;:16;;53556:56;;;::::0;-1:-1:-1;;;53556:56:0;;8256:2:1;53556:56:0::1;::::0;::::1;8238:21:1::0;8295:2;8275:18;;;8268:30;8334:29;8314:18;;;8307:57;8381:18;;53556:56:0::1;8054:351:1::0;53556:56:0::1;53617:12;:26:::0;53493:156::o;54084:98::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;54153:23:::1;:13;54169:7:::0;;54153:23:::1;:::i;37168:116::-:0;37232:7;37253:20;37265:7;37253:11;:20::i;:::-;:25;;37168:116;-1:-1:-1;;37168:116:0:o;53172:69::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;53217:11:::1;:18:::0;;-1:-1:-1;;53217:18:0::1;53231:4;53217:18;::::0;;53172:69::o;35918:207::-;35982:7;-1:-1:-1;;;;;36004:19:0;;35996:75;;;;-1:-1:-1;;;35996:75:0;;11779:2:1;35996:75:0;;;11761:21:1;11818:2;11798:18;;;11791:30;11857:34;11837:18;;;11830:62;-1:-1:-1;;;11908:18:1;;;11901:41;11959:19;;35996:75:0;11577:407:1;35996:75:0;-1:-1:-1;;;;;;36091:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;36091:27:0;;35918:207::o;30440:127::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;30499:62:::1;30518:42;30499:18;:62::i;:::-;30440:127::o:0;51351:317::-;51428:14;51408:16;:14;:16::i;:::-;:34;;51400:83;;;;-1:-1:-1;;;51400:83:0;;;;;;;:::i;:::-;51496:11;;;;:19;;:11;:19;51488:62;;;;-1:-1:-1;;;51488:62:0;;;;;;;:::i;:::-;51580:5;;51567:9;:18;51559:70;;;;-1:-1:-1;;;51559:70:0;;10945:2:1;51559:70:0;;;10927:21:1;10984:2;10964:18;;;10957:30;11023:34;11003:18;;;10996:62;-1:-1:-1;;;11074:18:1;;;11067:37;11121:19;;51559:70:0;10743:403:1;51559:70:0;51638:24;51648:3;51653:1;51656:5;51638:9;:24::i;:::-;51351:317;:::o;48122:104::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;48199:1:::1;48175:21;:25;48167:34;;;::::0;::::1;;48206:14;:12;:14::i;47935:93::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47935:93:0;;-1:-1:-1;47935:93:0;:::o;53665:82::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;53724:5:::1;:17:::0;53665:82::o;54190:127::-;-1:-1:-1;;;;;;;;;;;;;;;;;54291:20:0;54303:7;54291:11;:20::i;37496:96::-;37552:13;37579:7;37572:14;;;;;:::i;38972:270::-;-1:-1:-1;;;;;39061:24:0;;28648:10;39061:24;;39053:63;;;;-1:-1:-1;;;39053:63:0;;13364:2:1;39053:63:0;;;13346:21:1;13403:2;13383:18;;;13376:30;13442:28;13422:18;;;13415:56;13488:18;;39053:63:0;13162:350:1;39053:63:0;28648:10;39125:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;39125:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;39125:53:0;;;;;;;;;;39188:48;;7375:41:1;;;39125:42:0;;28648:10;39188:48;;7348:18:1;39188:48:0;;;;;;;38972:270;;:::o;50785:173::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;50869:14:::1;50849:16;:14;:16::i;:::-;:34;;50841:83;;;;-1:-1:-1::0;;;50841:83:0::1;;;;;;;:::i;:::-;50929:23;50939:3;50944:1;50947:4:::0;50929:9:::1;:23::i;49111:408::-:0;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;49218:1:::1;49208:7;:11;49200:20;;;::::0;::::1;;49283:38;::::0;-1:-1:-1;;;49283:38:0;;49315:4:::1;49283:38;::::0;::::1;6401:51:1::0;49255:14:0;;49325:7;;-1:-1:-1;;;;;49283:23:0;::::1;::::0;::::1;::::0;6374:18:1;;49283:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;49275:97;;;::::0;-1:-1:-1;;;49275:97:0;;8612:2:1;49275:97:0::1;::::0;::::1;8594:21:1::0;8651:2;8631:18;;;8624:30;8690:34;8670:18;;;8663:62;-1:-1:-1;;;8741:18:1;;;8734:33;8784:19;;49275:97:0::1;8410:399:1::0;49275:97:0::1;49385:6;49381:133;49399:19;;49395:1;:23;49381:133;;;49431:13;-1:-1:-1::0;;;;;49431:22:0::1;;49454:16;49471:1;49454:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;49454:19:0::1;49504:3;49486:11;49498:1;49486:14;;;;;;;;:::i;:::-;;;;;;;;;49476:7;:24;;;;:::i;:::-;49475:32;;;;:::i;:::-;49431:77;::::0;-1:-1:-1;;;;;;49431:77:0::1;::::0;;;;;;-1:-1:-1;;;;;7148:32:1;;;49431:77:0::1;::::0;::::1;7130:51:1::0;7197:18;;;7190:34;7103:18;;49431:77:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;49420:3:0;::::1;::::0;::::1;:::i;:::-;;;;49381:133;;;;49195:324;49111:408:::0;;:::o;39947:289::-;40074:28;40084:4;40090:2;40094:7;40074:9;:28::i;:::-;40119:48;40142:4;40148:2;40152:7;40161:5;40119:22;:48::i;:::-;40107:123;;;;-1:-1:-1;;;40107:123:0;;;;;;;:::i;49847:223::-;47616:12;;-1:-1:-1;;;;;47616:12:0;47602:10;:26;47594:67;;;;-1:-1:-1;;;47594:67:0;;10588:2:1;47594:67:0;;;10570:21:1;10627:2;10607:18;;;10600:30;10666;10646:18;;;10639:58;10714:18;;47594:67:0;10386:352:1;47594:67:0;49936:12:::1;::::0;-1:-1:-1;;;;;49921:27:0;;::::1;49936:12:::0;::::1;49921:27;;49913:82;;;::::0;-1:-1:-1;;;49913:82:0;;17664:2:1;49913:82:0::1;::::0;::::1;17646:21:1::0;17703:2;17683:18;;;17676:30;17742:34;17722:18;;;17715:62;-1:-1:-1;;;17793:18:1;;;17786:40;17843:19;;49913:82:0::1;17462:406:1::0;49913:82:0::1;50000:12;:26:::0;;-1:-1:-1;;;;;;50000:26:0::1;-1:-1:-1::0;;;;;50000:26:0;::::1;;::::0;;50031:16:::1;:19:::0;;50000:26;;50031:16;-1:-1:-1;;50031:19:0::1;;;;:::i;:::-;;;;;;;;;:33;;;;;-1:-1:-1::0;;;;;50031:33:0::1;;;;;-1:-1:-1::0;;;;;50031:33:0::1;;;;;;49847:223:::0;:::o;37655:258::-;37743:13;37766:21;37790:10;:8;:10::i;:::-;37766:34;;37839:1;37821:7;37815:21;:25;:92;;;;;;;;;;;;;;;;;37870:7;37879:18;:7;:16;:18::i;:::-;37853:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37815:92;37805:102;37655:258;-1:-1:-1;;;37655:258:0:o;33941:105::-;33988:7;34009:31;34022:14;33668:1;34214:12;-1:-1:-1;;34214:30:0;;34131:124;34022:14;34038:1;34009:12;:31::i;50385:86::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53985:91::-;54030:13;54057;54050:20;;;;;:::i;48234:107::-;47616:12;;-1:-1:-1;;;;;47616:12:0;47602:10;:26;47594:67;;;;-1:-1:-1;;;47594:67:0;;10588:2:1;47594:67:0;;;10570:21:1;10627:2;10607:18;;;10600:30;10666;10646:18;;;10639:58;10714:18;;47594:67:0;10386:352:1;54544:133:0;54588:13;54608:63;;;;;;;;;;;;;;;;;;;54544:133;:::o;30709:187::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30792:22:0;::::1;30784:73;;;::::0;-1:-1:-1;;;30784:73:0;;9016:2:1;30784:73:0::1;::::0;::::1;8998:21:1::0;9055:2;9035:18;;;9028:30;9094:34;9074:18;;;9067:62;-1:-1:-1;;;9145:18:1;;;9138:36;9191:19;;30784:73:0::1;8814:402:1::0;30784:73:0::1;30862:28;30881:8;30862:18;:28::i;53755:100::-:0;53832:5;;53811:7;;53832:17;;53842:6;53832:9;:17::i;40608:127::-;40689:40;40699:2;40703:8;40713:11;40689:40;;;;;;;;;;;;:9;:40::i;40467:133::-;40524:4;40561:7;33668:1;40542:26;;:52;;;;-1:-1:-1;;40582:12:0;;-1:-1:-1;40572:22:0;40467:133::o;44059:162::-;44148:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;44148:29:0;-1:-1:-1;;;;;44148:29:0;;;;;;;;;44187:28;;44148:24;;44187:28;;;;;;;44059:162;;;:::o;42520:1439::-;42609:35;42647:20;42659:7;42647:11;:20::i;:::-;42718:18;;42609:58;;-1:-1:-1;42676:22:0;;-1:-1:-1;;;;;42702:34:0;28648:10;-1:-1:-1;;;;;42702:34:0;;:77;;;-1:-1:-1;28648:10:0;42743:20;42755:7;42743:11;:20::i;:::-;-1:-1:-1;;;;;42743:36:0;;42702:77;:134;;;-1:-1:-1;42803:18:0;;42786:50;;28648:10;39305:174;:::i;42786:50::-;42676:161;;42858:17;42846:91;;;;-1:-1:-1;;;42846:91:0;;13719:2:1;42846:91:0;;;13701:21:1;13758:2;13738:18;;;13731:30;13797:34;13777:18;;;13770:62;-1:-1:-1;;;13848:18:1;;;13841:48;13906:19;;42846:91:0;13517:414:1;42846:91:0;42980:4;-1:-1:-1;;;;;42958:26:0;:13;:18;;;-1:-1:-1;;;;;42958:26:0;;42946:88;;;;-1:-1:-1;;;42946:88:0;;12191:2:1;42946:88:0;;;12173:21:1;12230:2;12210:18;;;12203:30;12269:34;12249:18;;;12242:62;-1:-1:-1;;;12320:18:1;;;12313:36;12366:19;;42946:88:0;11989:402:1;42946:88:0;-1:-1:-1;;;;;43047:16:0;;43039:66;;;;-1:-1:-1;;;43039:66:0;;10182:2:1;43039:66:0;;;10164:21:1;10221:2;10201:18;;;10194:30;10260:34;10240:18;;;10233:62;-1:-1:-1;;;10311:18:1;;;10304:35;10356:19;;43039:66:0;9980:401:1;43039:66:0;43212:49;43229:1;43233:7;43242:13;:18;;;43212:8;:49::i;:::-;-1:-1:-1;;;;;43270:18:0;;;;;;:12;:18;;;;;:31;;43300:1;;43270:18;:31;;43300:1;;-1:-1:-1;;;;;43270:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;43270:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;43306:16:0;;-1:-1:-1;43306:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;43306:16:0;;:29;;-1:-1:-1;;43306:29:0;;:::i;:::-;;;-1:-1:-1;;;;;43306:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43363:43:0;;;;;;;;-1:-1:-1;;;;;43363:43:0;;;;;;43389:15;43363:43;;;;;;;;;-1:-1:-1;43340:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;43340:66:0;-1:-1:-1;;;;;;43340:66:0;;;;;;;;;;;43652:11;43352:7;-1:-1:-1;43652:11:0;:::i;:::-;43713:1;43672:24;;;:11;:24;;;;;:29;43630:33;;-1:-1:-1;;;;;;43672:29:0;43668:198;;43726:20;43734:11;43726:7;:20::i;:::-;43722:139;;;43780:75;;;;;;;;43799:18;;-1:-1:-1;;;;;43780:75:0;;;;;;43822:28;;;;43780:75;;;;;;;;;;-1:-1:-1;43753:24:0;;;:11;:24;;;;;;;:102;;;;;;;;;-1:-1:-1;;;43753:102:0;-1:-1:-1;;;;;;43753:102:0;;;;;;;;;;;;43722:139;43898:7;43894:2;-1:-1:-1;;;;;43879:27:0;43888:4;-1:-1:-1;;;;;43879:27:0;;;;;;;;;;;42604:1355;;;42520:1439;;;:::o;36367:747::-;-1:-1:-1;;;;;;;;;;;;;;;;;36483:7:0;;33668:1;36518:23;;:46;;;;;36552:12;;36545:4;:19;36518:46;36514:524;;;36571:31;36605:17;;;:11;:17;;;;;;;;;36571:51;;;;;;;;;-1:-1:-1;;;;;36571:51:0;;;;;-1:-1:-1;;;36571:51:0;;;;;;;;;;;;36631:28;36627:61;;36673:9;36367:747;-1:-1:-1;;;36367:747:0:o;36627:61::-;-1:-1:-1;;;36922:6:0;36945:17;;;;:11;:17;;;;;;;;;36933:29;;;;;;;;;-1:-1:-1;;;;;36933:29:0;;;;;-1:-1:-1;;;36933:29:0;;;;;;;;;;;;36971:28;36967:61;;37013:9;36367:747;-1:-1:-1;;;36367:747:0:o;36967:61::-;36904:129;;36514:524;37051:57;;-1:-1:-1;;;37051:57:0;;18075:2:1;37051:57:0;;;18057:21:1;18114:2;18094:18;;;18087:30;18153:34;18133:18;;;18126:62;-1:-1:-1;;;18204:18:1;;;18197:45;18259:19;;37051:57:0;17873:411:1;31043:171:0;31111:16;31130:6;;-1:-1:-1;;;;;31141:17:0;;;-1:-1:-1;;;;;;31141:17:0;;;;;;31168:40;;31130:6;;;;;;;31168:40;;31111:16;31168:40;31106:108;31043:171;:::o;48349:222::-;48404:21;48386:15;48434:132;48452:19;;48448:1;:23;48434:132;;;48484:76;48499:16;48516:1;48499:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48499:19:0;48552:3;48534:11;48546:1;48534:14;;;;;;;;:::i;:::-;;;;;;;;;48524:7;:24;;;;:::i;:::-;48523:32;;;;:::i;:::-;48484:10;:76::i;:::-;48473:3;;;;:::i;:::-;;;;48434:132;;45767:592;45896:4;-1:-1:-1;;;;;45911:13:0;;7798:19;:23;45907:447;;45940:72;;-1:-1:-1;;;45940:72:0;;-1:-1:-1;;;;;45940:36:0;;;;;:72;;28648:10;;45991:4;;45997:7;;46006:5;;45940:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45940:72:0;;;;;;;;-1:-1:-1;;45940:72:0;;;;;;;;;;;;:::i;:::-;;;45933:388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46151:13:0;;46147:169;;46176:61;;-1:-1:-1;;;46176:61:0;;;;;;;:::i;46147:169::-;46298:6;46292:13;46283:6;46279:2;46275:15;46268:38;45933:388;-1:-1:-1;;;;;;46052:55:0;-1:-1:-1;;;46052:55:0;;-1:-1:-1;46045:62:0;;45907:447;-1:-1:-1;46344:4:0;45907:447;45767:592;;;;;;:::o;23719:591::-;23775:13;23980:10;23976:37;;-1:-1:-1;;23997:10:0;;;;;;;;;;;;-1:-1:-1;;;23997:10:0;;;;;23719:591::o;23976:37::-;24032:5;24017:12;24061:52;24068:9;;24061:52;;24084:8;;;;:::i;:::-;;-1:-1:-1;24097:10:0;;-1:-1:-1;24105:2:0;24097:10;;:::i;:::-;;;24061:52;;;24117:19;24149:6;24139:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24139:17:0;;24117:39;;24161:118;24168:10;;24161:118;;24185:11;24195:1;24185:11;;:::i;:::-;;-1:-1:-1;24244:10:0;24252:2;24244:5;:10;:::i;:::-;24231:24;;:2;:24;:::i;:::-;24218:39;;24201:6;24208;24201:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;24201:56:0;;;;;;;;-1:-1:-1;24262:11:0;24271:2;24262:11;;:::i;:::-;;;24161:118;;2649:90;2707:7;2728:5;2732:1;2728;:5;:::i;3309:90::-;3367:7;3388:5;3392:1;3388;:5;:::i;41056:1251::-;41197:12;;-1:-1:-1;;;;;41222:16:0;;41214:62;;;;-1:-1:-1;;;41214:62:0;;15664:2:1;41214:62:0;;;15646:21:1;15703:2;15683:18;;;15676:30;15742:34;15722:18;;;15715:62;-1:-1:-1;;;15793:18:1;;;15786:31;15834:19;;41214:62:0;15462:397:1;41214:62:0;41409:21;41417:12;41409:7;:21::i;:::-;41408:22;41400:64;;;;-1:-1:-1;;;41400:64:0;;15306:2:1;41400:64:0;;;15288:21:1;15345:2;15325:18;;;15318:30;15384:31;15364:18;;;15357:59;15433:18;;41400:64:0;15104:353:1;41400:64:0;41489:12;;41477:8;:24;;41469:71;;;;-1:-1:-1;;;41469:71:0;;18905:2:1;41469:71:0;;;18887:21:1;18944:2;18924:18;;;18917:30;18983:34;18963:18;;;18956:62;-1:-1:-1;;;19034:18:1;;;19027:32;19076:19;;41469:71:0;18703:398:1;41469:71:0;-1:-1:-1;;;;;41652:16:0;;41619:30;41652:16;;;:12;:16;;;;;;;;;41619:49;;;;;;;;;-1:-1:-1;;;;;41619:49:0;;;;;-1:-1:-1;;;41619:49:0;;;;;;;;;;;41692:129;;;;;;;;41708:19;;41619:49;;41692:129;;;41708:39;;41738:8;;41708:39;:::i;:::-;-1:-1:-1;;;;;41692:129:0;;;;;41780:11;:35;;41806:8;41780:35;;;41794:1;41780:35;41752:11;:24;;;:64;;;;:::i;:::-;-1:-1:-1;;;;;41692:129:0;;;;;;-1:-1:-1;;;;;41673:16:0;;;;;;;:12;:16;;;;;;;;:148;;;;;;;;-1:-1:-1;;;41673:148:0;;;;;;;;;;;;41854:43;;;;;;;;;;;41880:15;41854:43;;;;;;;;41826:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;41826:71:0;-1:-1:-1;;;;;;41826:71:0;;;;;;;;;;;;;;;;;;41838:12;;41950:251;41974:8;41970:1;:12;41950:251;;;41999:38;;42024:12;;-1:-1:-1;;;;;41999:38:0;;;42016:1;;41999:38;;42016:1;;41999:38;42054:59;42085:1;42089:2;42093:12;42107:5;42054:22;:59::i;:::-;42042:134;;;;-1:-1:-1;;;42042:134:0;;;;;;;:::i;:::-;42181:14;;;;:::i;:::-;;;;41984:3;;;;;:::i;:::-;;;;41950:251;;;-1:-1:-1;42209:12:0;:27;-1:-1:-1;;;;;;41056:1251:0:o;48579:167::-;48648:12;48666:8;-1:-1:-1;;;;;48666:13:0;48687:7;48666:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48647:52;;;48712:7;48704:36;;;;-1:-1:-1;;;48704:36:0;;14541:2:1;48704:36:0;;;14523:21:1;14580:2;14560:18;;;14553:30;-1:-1:-1;;;14599:18:1;;;14592:46;14655:18;;48704:36:0;14339:340:1;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;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:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:980::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:2;1262:38;1296:2;1285:9;1281:18;1262:38;:::i;:::-;1252:48;;1347:2;1336:9;1332:18;1319:32;1309:42;;1402:2;1391:9;1387:18;1374:32;1425:18;1466:2;1458:6;1455:14;1452:34;;;1482:1;1479;1472:12;1452:34;1520:6;1509:9;1505:22;1495:32;;1565:7;1558:4;1554:2;1550:13;1546:27;1536:55;;1587:1;1584;1577:12;1536:55;1623:2;1610:16;1645:2;1641;1638:10;1635:36;;;1651:18;;:::i;:::-;1693:53;1736:2;1717:13;;-1:-1:-1;;1713:27:1;1709:36;;1693:53;:::i;:::-;1680:66;;1769:2;1762:5;1755:17;1809:7;1804:2;1799;1795;1791:11;1787:20;1784:33;1781:53;;;1830:1;1827;1820:12;1781:53;1885:2;1880;1876;1872:11;1867:2;1860:5;1856:14;1843:45;1929:1;1924:2;1919;1912:5;1908:14;1904:23;1897:34;;1950:5;1940:15;;;;;981:980;;;;;;;:::o;1966:315::-;2031:6;2039;2092:2;2080:9;2071:7;2067:23;2063:32;2060:52;;;2108:1;2105;2098:12;2060:52;2131:29;2150:9;2131:29;:::i;:::-;2121:39;;2210:2;2199:9;2195:18;2182:32;2223:28;2245:5;2223:28;:::i;:::-;2270:5;2260:15;;;1966:315;;;;;:::o;2286:254::-;2354:6;2362;2415:2;2403:9;2394:7;2390:23;2386:32;2383:52;;;2431:1;2428;2421:12;2383:52;2454:29;2473:9;2454:29;:::i;:::-;2444:39;2530:2;2515:18;;;;2502:32;;-1:-1:-1;;;2286:254:1:o;2545:1033::-;2638:6;2646;2699:2;2687:9;2678:7;2674:23;2670:32;2667:52;;;2715:1;2712;2705:12;2667:52;2755:9;2742:23;2784:18;2825:2;2817:6;2814:14;2811:34;;;2841:1;2838;2831:12;2811:34;2879:6;2868:9;2864:22;2854:32;;2924:7;2917:4;2913:2;2909:13;2905:27;2895:55;;2946:1;2943;2936:12;2895:55;2982:2;2969:16;3004:4;3027:2;3023;3020:10;3017:36;;;3033:18;;:::i;:::-;3079:2;3076:1;3072:10;3062:20;;3102:28;3126:2;3122;3118:11;3102:28;:::i;:::-;3164:15;;;3195:12;;;;3227:11;;;3257;;;3253:20;;3250:33;-1:-1:-1;3247:53:1;;;3296:1;3293;3286:12;3247:53;3318:1;3309:10;;3328:169;3342:2;3339:1;3336:9;3328:169;;;3399:23;3418:3;3399:23;:::i;:::-;3387:36;;3360:1;3353:9;;;;;3443:12;;;;3475;;3328:169;;;-1:-1:-1;3516:5:1;3553:18;;;;3540:32;;-1:-1:-1;;;;;;;2545:1033:1:o;3583:245::-;3650:6;3703:2;3691:9;3682:7;3678:23;3674:32;3671:52;;;3719:1;3716;3709:12;3671:52;3751:9;3745:16;3770:28;3792:5;3770:28;:::i;3833:245::-;3891:6;3944:2;3932:9;3923:7;3919:23;3915:32;3912:52;;;3960:1;3957;3950:12;3912:52;3999:9;3986:23;4018:30;4042:5;4018:30;:::i;4083:249::-;4152:6;4205:2;4193:9;4184:7;4180:23;4176:32;4173:52;;;4221:1;4218;4211:12;4173:52;4253:9;4247:16;4272:30;4296:5;4272:30;:::i;4337:592::-;4408:6;4416;4469:2;4457:9;4448:7;4444:23;4440:32;4437:52;;;4485:1;4482;4475:12;4437:52;4525:9;4512:23;4554:18;4595:2;4587:6;4584:14;4581:34;;;4611:1;4608;4601:12;4581:34;4649:6;4638:9;4634:22;4624:32;;4694:7;4687:4;4683:2;4679:13;4675:27;4665:55;;4716:1;4713;4706:12;4665:55;4756:2;4743:16;4782:2;4774:6;4771:14;4768:34;;;4798:1;4795;4788:12;4768:34;4843:7;4838:2;4829:6;4825:2;4821:15;4817:24;4814:37;4811:57;;;4864:1;4861;4854:12;4811:57;4895:2;4887:11;;;;;4917:6;;-1:-1:-1;4337:592:1;;-1:-1:-1;;;;4337:592:1:o;4934:180::-;4993:6;5046:2;5034:9;5025:7;5021:23;5017:32;5014:52;;;5062:1;5059;5052:12;5014:52;-1:-1:-1;5085:23:1;;4934:180;-1:-1:-1;4934:180:1:o;5119:184::-;5189:6;5242:2;5230:9;5221:7;5217:23;5213:32;5210:52;;;5258:1;5255;5248:12;5210:52;-1:-1:-1;5281:16:1;;5119:184;-1:-1:-1;5119:184:1:o;5308:257::-;5349:3;5387:5;5381:12;5414:6;5409:3;5402:19;5430:63;5486:6;5479:4;5474:3;5470:14;5463:4;5456:5;5452:16;5430:63;:::i;:::-;5547:2;5526:15;-1:-1:-1;;5522:29:1;5513:39;;;;5554:4;5509:50;;5308:257;-1:-1:-1;;5308:257:1:o;5570:470::-;5749:3;5787:6;5781:13;5803:53;5849:6;5844:3;5837:4;5829:6;5825:17;5803:53;:::i;:::-;5919:13;;5878:16;;;;5941:57;5919:13;5878:16;5975:4;5963:17;;5941:57;:::i;:::-;6014:20;;5570:470;-1:-1:-1;;;;5570:470:1:o;6463:488::-;-1:-1:-1;;;;;6732:15:1;;;6714:34;;6784:15;;6779:2;6764:18;;6757:43;6831:2;6816:18;;6809:34;;;6879:3;6874:2;6859:18;;6852:31;;;6657:4;;6900:45;;6925:19;;6917:6;6900:45;:::i;:::-;6892:53;6463:488;-1:-1:-1;;;;;;6463:488:1:o;7427:219::-;7576:2;7565:9;7558:21;7539:4;7596:44;7636:2;7625:9;7621:18;7613:6;7596:44;:::i;12396:356::-;12598:2;12580:21;;;12617:18;;;12610:30;12676:34;12671:2;12656:18;;12649:62;12743:2;12728:18;;12396:356::o;12757:400::-;12959:2;12941:21;;;12998:2;12978:18;;;12971:30;13037:34;13032:2;13017:18;;13010:62;-1:-1:-1;;;13103:2:1;13088:18;;13081:34;13147:3;13132:19;;12757:400::o;14684:415::-;14886:2;14868:21;;;14925:2;14905:18;;;14898:30;14964:34;14959:2;14944:18;;14937:62;-1:-1:-1;;;15030:2:1;15015:18;;15008:49;15089:3;15074:19;;14684:415::o;16273:410::-;16475:2;16457:21;;;16514:2;16494:18;;;16487:30;16553:34;16548:2;16533:18;;16526:62;-1:-1:-1;;;16619:2:1;16604:18;;16597:44;16673:3;16658:19;;16273:410::o;17103:354::-;17305:2;17287:21;;;17344:2;17324:18;;;17317:30;17383:32;17378:2;17363:18;;17356:60;17448:2;17433:18;;17103:354::o;19844:275::-;19915:2;19909:9;19980:2;19961:13;;-1:-1:-1;;19957:27:1;19945:40;;20015:18;20000:34;;20036:22;;;19997:62;19994:88;;;20062:18;;:::i;:::-;20098:2;20091:22;19844:275;;-1:-1:-1;19844:275:1:o;20124:253::-;20164:3;-1:-1:-1;;;;;20253:2:1;20250:1;20246:10;20283:2;20280:1;20276:10;20314:3;20310:2;20306:12;20301:3;20298:21;20295:47;;;20322:18;;:::i;20382:128::-;20422:3;20453:1;20449:6;20446:1;20443:13;20440:39;;;20459:18;;:::i;:::-;-1:-1:-1;20495:9:1;;20382:128::o;20515:120::-;20555:1;20581;20571:35;;20586:18;;:::i;:::-;-1:-1:-1;20620:9:1;;20515:120::o;20640:168::-;20680:7;20746:1;20742;20738:6;20734:14;20731:1;20728:21;20723:1;20716:9;20709:17;20705:45;20702:71;;;20753:18;;:::i;:::-;-1:-1:-1;20793:9:1;;20640:168::o;20813:246::-;20853:4;-1:-1:-1;;;;;20966:10:1;;;;20936;;20988:12;;;20985:38;;;21003:18;;:::i;:::-;21040:13;;20813:246;-1:-1:-1;;;20813:246:1:o;21064:125::-;21104:4;21132:1;21129;21126:8;21123:34;;;21137:18;;:::i;:::-;-1:-1:-1;21174:9:1;;21064:125::o;21194:258::-;21266:1;21276:113;21290:6;21287:1;21284:13;21276:113;;;21366:11;;;21360:18;21347:11;;;21340:39;21312:2;21305:10;21276:113;;;21407:6;21404:1;21401:13;21398:48;;;-1:-1:-1;;21442:1:1;21424:16;;21417:27;21194:258::o;21457:380::-;21536:1;21532:12;;;;21579;;;21600:61;;21654:4;21646:6;21642:17;21632:27;;21600:61;21707:2;21699:6;21696:14;21676:18;21673:38;21670:161;;;21753:10;21748:3;21744:20;21741:1;21734:31;21788:4;21785:1;21778:15;21816:4;21813:1;21806:15;21670:161;;21457:380;;;:::o;21842:135::-;21881:3;-1:-1:-1;;21902:17:1;;21899:43;;;21922:18;;:::i;:::-;-1:-1:-1;21969:1:1;21958:13;;21842:135::o;21982:112::-;22014:1;22040;22030:35;;22045:18;;:::i;:::-;-1:-1:-1;22079:9:1;;21982:112::o;22099:127::-;22160:10;22155:3;22151:20;22148:1;22141:31;22191:4;22188:1;22181:15;22215:4;22212:1;22205:15;22231:127;22292:10;22287:3;22283:20;22280:1;22273:31;22323:4;22320:1;22313:15;22347:4;22344:1;22337:15;22363:127;22424:10;22419:3;22415:20;22412:1;22405:31;22455:4;22452:1;22445:15;22479:4;22476:1;22469:15;22495:127;22556:10;22551:3;22547:20;22544:1;22537:31;22587:4;22584:1;22577:15;22611:4;22608:1;22601:15;22627:118;22713:5;22706:13;22699:21;22692:5;22689:32;22679:60;;22735:1;22732;22725:12;22750:131;-1:-1:-1;;;;;;22824:32:1;;22814:43;;22804:71;;22871:1;22868;22861:12

Swarm Source

ipfs://a540f2ca5cf53f20747e7b3236768dac46e85e290eb92effc671eb297e1eea68
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.