More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 2,445 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 128595399 | 13 days ago | IN | 0 ETH | 0.000003102564 | ||||
Set Approval For... | 128595321 | 13 days ago | IN | 0 ETH | 0.000003755645 | ||||
Set Approval For... | 128294259 | 20 days ago | IN | 0 ETH | 0.000000921533 | ||||
Set Approval For... | 128090116 | 25 days ago | IN | 0 ETH | 0.000001395832 | ||||
Set Approval For... | 127595067 | 37 days ago | IN | 0 ETH | 0.000000324991 | ||||
Set Approval For... | 127567136 | 37 days ago | IN | 0 ETH | 0.000001039715 | ||||
Set Approval For... | 127567130 | 37 days ago | IN | 0 ETH | 0.000001002312 | ||||
Set Approval For... | 127566443 | 37 days ago | IN | 0 ETH | 0.000001945317 | ||||
Set Approval For... | 127470319 | 40 days ago | IN | 0 ETH | 0.000000065926 | ||||
Set Approval For... | 127313843 | 43 days ago | IN | 0 ETH | 0.000000359145 | ||||
Set Approval For... | 127190098 | 46 days ago | IN | 0 ETH | 0.000000068103 | ||||
Set Approval For... | 127184752 | 46 days ago | IN | 0 ETH | 0.000000088774 | ||||
Safe Transfer Fr... | 127052150 | 49 days ago | IN | 0 ETH | 0.000000310847 | ||||
Safe Transfer Fr... | 127010513 | 50 days ago | IN | 0 ETH | 0.000000904086 | ||||
Set Approval For... | 127009619 | 50 days ago | IN | 0 ETH | 0.000000904759 | ||||
Set Approval For... | 126950527 | 52 days ago | IN | 0 ETH | 0.000000090863 | ||||
Set Approval For... | 126835818 | 54 days ago | IN | 0 ETH | 0.000000923584 | ||||
Set Approval For... | 126787368 | 55 days ago | IN | 0 ETH | 0.000000401419 | ||||
Set Approval For... | 126778539 | 56 days ago | IN | 0 ETH | 0.000000211836 | ||||
Set Approval For... | 126771879 | 56 days ago | IN | 0 ETH | 0.000000230598 | ||||
Set Approval For... | 126642518 | 59 days ago | IN | 0 ETH | 0.000000138358 | ||||
Safe Transfer Fr... | 125837457 | 77 days ago | IN | 0 ETH | 0.000000528806 | ||||
Set Approval For... | 125514221 | 85 days ago | IN | 0 ETH | 0.000000084981 | ||||
Set Approval For... | 125373694 | 88 days ago | IN | 0 ETH | 0.000000042251 | ||||
Set Approval For... | 124846137 | 100 days ago | IN | 0 ETH | 0.000000143557 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
107438879 | 503 days ago | 0 ETH | ||||
107438879 | 503 days ago | 0 ETH | ||||
107438879 | 503 days ago | 0 ETH | ||||
107438879 | 503 days ago | 0 ETH | ||||
107438879 | 503 days ago | 0 ETH | ||||
107438879 | 503 days ago | 0 ETH | ||||
107389471 | 504 days ago | 0 ETH | ||||
107342891 | 505 days ago | 0 ETH | ||||
107277040 | 507 days ago | 0 ETH | ||||
107204465 | 509 days ago | 0 ETH | ||||
107204465 | 509 days ago | 0 ETH | ||||
107204412 | 509 days ago | 0 ETH | ||||
107179270 | 509 days ago | 0 ETH | ||||
107108097 | 511 days ago | 0 ETH | ||||
107037461 | 513 days ago | 0 ETH | ||||
106929319 | 515 days ago | 0 ETH | ||||
106907572 | 516 days ago | 0 ETH | ||||
106889697 | 516 days ago | 0 ETH | ||||
106889697 | 516 days ago | 0 ETH | ||||
106889697 | 516 days ago | 0 ETH | ||||
106889268 | 516 days ago | 0 ETH | ||||
106889150 | 516 days ago | 0 ETH | ||||
106803349 | 518 days ago | 0 ETH | ||||
106802811 | 518 days ago | 0 ETH | ||||
106785638 | 518 days ago | 0 ETH |
Loading...
Loading
Contract Name:
L2StateOfMindContract
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at optimistic.etherscan.io on 2022-08-29 */ //*********************************************************************// //*********************************************************************// // // __ ___ _____ __ __ ____ ______ ____ __ // / / |__ \/ ___// /_____ _/ /____ / __ \/ __/ |/ (_)___ ____/ / // / / __/ /\__ \/ __/ __ `/ __/ _ \/ / / / /_/ /|_/ / / __ \/ __ / // / /___/ __/___/ / /_/ /_/ / /_/ __/ /_/ / __/ / / / / / / / /_/ / // /_____/____/____/\__/\__,_/\__/\___/\____/_/ /_/ /_/_/_/ /_/\__,_/ // // //*********************************************************************// //*********************************************************************// //-------------DEPENDENCIES--------------------------// // 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(address(0)); } /** * @dev Transfers ownership of the contract to a new account (newOwner). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (newOwner). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } //-------------END DEPENDENCIES------------------------// // Rampp Contracts v2.1 (Teams.sol) pragma solidity ^0.8.0; /** * Teams is a contract implementation to extend upon Ownable that allows multiple controllers * of a single contract to modify specific mint settings but not have overall ownership of the contract. * This will easily allow cross-collaboration via Mintplex.xyz. **/ abstract contract Teams is Ownable{ mapping (address => bool) internal team; /** * @dev Adds an address to the team. Allows them to execute protected functions * @param _address the ETH address to add, cannot be 0x and cannot be in team already **/ function addToTeam(address _address) public onlyOwner { require(_address != address(0), "Invalid address"); require(!inTeam(_address), "This address is already in your team."); team[_address] = true; } /** * @dev Removes an address to the team. * @param _address the ETH address to remove, cannot be 0x and must be in team **/ function removeFromTeam(address _address) public onlyOwner { require(_address != address(0), "Invalid address"); require(inTeam(_address), "This address is not in your team currently."); team[_address] = false; } /** * @dev Check if an address is valid and active in the team * @param _address ETH address to check for truthiness **/ function inTeam(address _address) public view returns (bool) { require(_address != address(0), "Invalid address to check."); return team[_address] == true; } /** * @dev Throws if called by any account other than the owner or team member. */ modifier onlyTeamOrOwner() { bool _isOwner = owner() == _msgSender(); bool _isTeam = inTeam(_msgSender()); require(_isOwner || _isTeam, "Team: caller is not the owner or in Team."); _; } } pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a 'leaf' can be proved to be a part of a Merkle tree * defined by 'root'. For this, a 'proof' must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from 'leaf' using 'proof'. A 'proof' is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: Allowlist.sol pragma solidity ^0.8.0; abstract contract Allowlist is Teams { bytes32 public merkleRoot; bool public onlyAllowlistMode = false; /** * @dev Update merkle root to reflect changes in Allowlist * @param _newMerkleRoot new merkle root to reflect most recent Allowlist */ function updateMerkleRoot(bytes32 _newMerkleRoot) public onlyTeamOrOwner { require(_newMerkleRoot != merkleRoot, "Merkle root will be unchanged!"); merkleRoot = _newMerkleRoot; } /** * @dev Check the proof of an address if valid for merkle root * @param _to address to check for proof * @param _merkleProof Proof of the address to validate against root and leaf */ function isAllowlisted(address _to, bytes32[] calldata _merkleProof) public view returns(bool) { require(merkleRoot != 0, "Merkle root is not set!"); bytes32 leaf = keccak256(abi.encodePacked(_to)); return MerkleProof.verify(_merkleProof, merkleRoot, leaf); } function enableAllowlistOnlyMode() public onlyTeamOrOwner { onlyAllowlistMode = true; } function disableAllowlistOnlyMode() public onlyTeamOrOwner { onlyAllowlistMode = false; } } /** * @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, Teams { 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 Mapping of restricted operator approvals set by contract Owner * This serves as an optional addition to ERC-721 so * that the contract owner can elect to prevent specific addresses/contracts * from being marked as the approver for a token. The reason for this * is that some projects may want to retain control of where their tokens can/can not be listed * either due to ethics, loyalty, or wanting trades to only occur on their personal marketplace. * By default, there are no restrictions. The contract owner must deliberatly block an address */ mapping(address => bool) public restrictedApprovalAddresses; /** * @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 _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 Sets the value for an address to be in the restricted approval address pool. * Setting an address to true will disable token owners from being able to mark the address * for approval for trading. This would be used in theory to prevent token owners from listing * on specific marketplaces or protcols. Only modifible by the contract owner/team. * @param _address the marketplace/user to modify restriction status of * @param _isRestricted restriction status of the _address to be set. true => Restricted, false => Open */ function setApprovalRestriction(address _address, bool _isRestricted) public onlyTeamOrOwner { restrictedApprovalAddresses[_address] = _isRestricted; } /** * @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(restrictedApprovalAddresses[to] == false, "ERC721RestrictedApproval: Address to approve has been restricted by contract owner and is not allowed to be marked for approval"); 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"); require(restrictedApprovalAddresses[operator] == false, "ERC721RestrictedApproval: Operator address has been restricted by contract owner and is not allowed to be marked for approval"); _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"); // For admin mints we do not want to enforce the maxBatchSize limit if (isAdminMint == false) { 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 = 0xa9dAC8f3aEDC55D0FE707B86B8A45d246858d2E1; modifier isRampp() { require(msg.sender == RAMPPADDRESS, "Ownable: caller is not RAMPP"); _; } } /** TimedDrop.sol * This feature will allow the owner to be able to set timed drops for both the public and allowlist mint (if applicable). * It is bound by the block timestamp. The owner is able to determine if the feature should be used as all * with the "enforcePublicDropTime" and "enforceAllowlistDropTime" variables. If the feature is disabled the implmented * *DropTimePassed() functions will always return true. Otherwise calculation is done to check if time has passed. */ abstract contract TimedDrop is Teams { bool public enforcePublicDropTime = true; uint256 public publicDropTime = 1661817600; /** * @dev Allow the contract owner to set the public time to mint. * @param _newDropTime timestamp since Epoch in seconds you want public drop to happen */ function setPublicDropTime(uint256 _newDropTime) public onlyTeamOrOwner { require(_newDropTime > block.timestamp, "Drop date must be in future! Otherwise call disablePublicDropTime!"); publicDropTime = _newDropTime; } function usePublicDropTime() public onlyTeamOrOwner { enforcePublicDropTime = true; } function disablePublicDropTime() public onlyTeamOrOwner { enforcePublicDropTime = false; } /** * @dev determine if the public droptime has passed. * if the feature is disabled then assume the time has passed. */ function publicDropTimePassed() public view returns(bool) { if(enforcePublicDropTime == false) { return true; } return block.timestamp >= publicDropTime; } // Allowlist implementation of the Timed Drop feature bool public enforceAllowlistDropTime = true; uint256 public allowlistDropTime = 1661796000; /** * @dev Allow the contract owner to set the allowlist time to mint. * @param _newDropTime timestamp since Epoch in seconds you want public drop to happen */ function setAllowlistDropTime(uint256 _newDropTime) public onlyTeamOrOwner { require(_newDropTime > block.timestamp, "Drop date must be in future! Otherwise call disableAllowlistDropTime!"); allowlistDropTime = _newDropTime; } function useAllowlistDropTime() public onlyTeamOrOwner { enforceAllowlistDropTime = true; } function disableAllowlistDropTime() public onlyTeamOrOwner { enforceAllowlistDropTime = false; } function allowlistDropTimePassed() public view returns(bool) { if(enforceAllowlistDropTime == false) { return true; } return block.timestamp >= allowlistDropTime; } } interface IERC20 { function allowance(address owner, address spender) external view returns (uint256); function transfer(address _to, uint256 _amount) external returns (bool); function balanceOf(address account) external view returns (uint256); function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: WithdrawableV2 // This abstract allows the contract to be able to mint and ingest ERC-20 payments for mints. // ERC-20 Payouts are limited to a single payout address. This feature // will charge a small flat fee in native currency that is not subject to regular rev sharing. // This contract also covers the normal functionality of accepting native base currency rev-sharing abstract contract WithdrawableV2 is Teams, Ramppable { struct acceptedERC20 { bool isActive; uint256 chargeAmount; } mapping(address => acceptedERC20) private allowedTokenContracts; address[] public payableAddresses = [RAMPPADDRESS,0x79FF559431891cfa36Fa1E7589c845F2B8831201]; address[] public surchargePayableAddresses = [RAMPPADDRESS]; address public erc20Payable = 0x79FF559431891cfa36Fa1E7589c845F2B8831201; uint256[] public payableFees = [0,100]; uint256[] public surchargePayableFees = [100]; uint256 public payableAddressCount = 2; uint256 public surchargePayableAddressCount = 1; uint256 public ramppSurchargeBalance = 0 ether; uint256 public ramppSurchargeFee = 0 ether; bool public onlyERC20MintingMode = false; /** * @dev Calculates the true payable balance of the contract as the * value on contract may be from ERC-20 mint surcharges and not * public mint charges - which are not eligable for rev share & user withdrawl */ function calcAvailableBalance() public view returns(uint256) { return address(this).balance - ramppSurchargeBalance; } function withdrawAll() public onlyTeamOrOwner { require(calcAvailableBalance() > 0); _withdrawAll(); } function withdrawAllRampp() public isRampp { require(calcAvailableBalance() > 0); _withdrawAll(); } function _withdrawAll() private { uint256 balance = calcAvailableBalance(); 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 This function is similiar to the regular withdraw but operates only on the * balance that is available to surcharge payout addresses. This would be Rampp + partners **/ function _withdrawAllSurcharges() private { uint256 balance = ramppSurchargeBalance; if(balance == 0) { return; } for(uint i=0; i < surchargePayableAddressCount; i++ ) { _widthdraw( surchargePayableAddresses[i], (balance * surchargePayableFees[i]) / 100 ); } ramppSurchargeBalance = 0 ether; } /** * @dev Allow contract owner to withdraw ERC-20 balance from contract * in the event ERC-20 tokens are paid to the contract for mints. This will * send the tokens to the payout as well as payout the surcharge fee to Rampp * @param _tokenContract contract of ERC-20 token to withdraw * @param _amountToWithdraw balance to withdraw according to balanceOf of ERC-20 token in wei */ function withdrawERC20(address _tokenContract, uint256 _amountToWithdraw) public onlyTeamOrOwner { require(_amountToWithdraw > 0); IERC20 tokenContract = IERC20(_tokenContract); require(tokenContract.balanceOf(address(this)) >= _amountToWithdraw, "WithdrawV2: Contract does not own enough tokens"); tokenContract.transfer(erc20Payable, _amountToWithdraw); // Payout ERC-20 tokens to recipient _withdrawAllSurcharges(); } /** * @dev Allow Rampp to be able to withdraw only its ERC-20 payment surcharges from the contract. */ function withdrawRamppSurcharges() public isRampp { require(ramppSurchargeBalance > 0, "WithdrawableV2: No Rampp surcharges in balance."); _withdrawAllSurcharges(); } /** * @dev Helper function to increment Rampp surcharge balance when ERC-20 payment is made. */ function addSurcharge() internal { ramppSurchargeBalance += ramppSurchargeFee; } /** * @dev Helper function to enforce Rampp surcharge fee when ERC-20 mint is made. */ function hasSurcharge() internal returns(bool) { return msg.value == ramppSurchargeFee; } /** * @dev Set surcharge fee for using ERC-20 payments on contract * @param _newSurcharge is the new surcharge value of native currency in wei to facilitate ERC-20 payments */ function setRamppSurcharge(uint256 _newSurcharge) public isRampp { ramppSurchargeFee = _newSurcharge; } /** * @dev check if an ERC-20 contract is a valid payable contract for executing a mint. * @param _erc20TokenContract address of ERC-20 contract in question */ function isApprovedForERC20Payments(address _erc20TokenContract) public view returns(bool) { return allowedTokenContracts[_erc20TokenContract].isActive == true; } /** * @dev get the value of tokens to transfer for user of an ERC-20 * @param _erc20TokenContract address of ERC-20 contract in question */ function chargeAmountForERC20(address _erc20TokenContract) public view returns(uint256) { require(isApprovedForERC20Payments(_erc20TokenContract), "This ERC-20 contract is not approved to make payments on this contract!"); return allowedTokenContracts[_erc20TokenContract].chargeAmount; } /** * @dev Explicity sets and ERC-20 contract as an allowed payment method for minting * @param _erc20TokenContract address of ERC-20 contract in question * @param _isActive default status of if contract should be allowed to accept payments * @param _chargeAmountInTokens fee (in tokens) to charge for mints for this specific ERC-20 token */ function addOrUpdateERC20ContractAsPayment(address _erc20TokenContract, bool _isActive, uint256 _chargeAmountInTokens) public onlyTeamOrOwner { allowedTokenContracts[_erc20TokenContract].isActive = _isActive; allowedTokenContracts[_erc20TokenContract].chargeAmount = _chargeAmountInTokens; } /** * @dev Add an ERC-20 contract as being a valid payment method. If passed a contract which has not been added * it will assume the default value of zero. This should not be used to create new payment tokens. * @param _erc20TokenContract address of ERC-20 contract in question */ function enableERC20ContractAsPayment(address _erc20TokenContract) public onlyTeamOrOwner { allowedTokenContracts[_erc20TokenContract].isActive = true; } /** * @dev Disable an ERC-20 contract as being a valid payment method. If passed a contract which has not been added * it will assume the default value of zero. This should not be used to create new payment tokens. * @param _erc20TokenContract address of ERC-20 contract in question */ function disableERC20ContractAsPayment(address _erc20TokenContract) public onlyTeamOrOwner { allowedTokenContracts[_erc20TokenContract].isActive = false; } /** * @dev Enable only ERC-20 payments for minting on this contract */ function enableERC20OnlyMinting() public onlyTeamOrOwner { onlyERC20MintingMode = true; } /** * @dev Disable only ERC-20 payments for minting on this contract */ function disableERC20OnlyMinting() public onlyTeamOrOwner { onlyERC20MintingMode = false; } /** * @dev Set the payout of the ERC-20 token payout to a specific address * @param _newErc20Payable new payout addresses of ERC-20 tokens */ function setERC20PayableAddress(address _newErc20Payable) public onlyTeamOrOwner { require(_newErc20Payable != address(0), "WithdrawableV2: new ERC-20 payout cannot be the zero address"); require(_newErc20Payable != erc20Payable, "WithdrawableV2: new ERC-20 payout is same as current payout"); erc20Payable = _newErc20Payable; } /** * @dev Reset the Rampp surcharge total to zero regardless of value on contract currently. */ function resetRamppSurchargeBalance() public isRampp { ramppSurchargeBalance = 0 ether; } /** * @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, "WithdrawableV2: New Rampp address must be different"); RAMPPADDRESS = _newAddress; payableAddresses[0] = _newAddress; } } // File: isFeeable.sol abstract contract Feeable is Teams { uint256 public PRICE = 0.02 ether; function setPrice(uint256 _feeInWei) public onlyTeamOrOwner { PRICE = _feeInWei; } function getPrice(uint256 _count) public view returns (uint256) { return PRICE * _count; } } abstract contract RamppERC721A is Ownable, Teams, ERC721A, WithdrawableV2, ReentrancyGuard , Feeable , Allowlist , TimedDrop { constructor( string memory tokenName, string memory tokenSymbol ) ERC721A(tokenName, tokenSymbol, 1, 2022) { } uint8 public CONTRACT_VERSION = 2; string public _baseTokenURI = "ipfs://bafybeieeqqe42bk5jhyvoksixjlvbv7gakl654hob4k2ut33pyz3xohple/"; bool public mintingOpen = true; uint256 public MAX_WALLET_MINTS = 1; /////////////// 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 * @param _qty amount of tokens to drop the owner */ function mintToAdminV2(address _to, uint256 _qty) public onlyTeamOrOwner{ require(_qty > 0, "Must mint at least 1 token."); require(currentTokenId() + _qty <= collectionSize, "Cannot mint over supply cap of 2022"); _safeMint(_to, _qty, true); } /////////////// 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(onlyERC20MintingMode == false, "Only minting with ERC-20 tokens is enabled."); require(getNextTokenId() <= collectionSize, "Cannot mint over supply cap of 2022"); require(mintingOpen == true && onlyAllowlistMode == false, "Public minting is not open right now!"); require(publicDropTimePassed() == true, "Public drop time has not passed!"); require(canMintAmount(_to, 1), "Wallet address is over the maximum allowed mints"); require(msg.value == getPrice(1), "Value needs to be exactly the mint fee!"); _safeMint(_to, 1, false); } /** * @dev Mints tokens to an address in batch. * 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(onlyERC20MintingMode == false, "Only minting with ERC-20 tokens is enabled."); require(_amount >= 1, "Must mint at least 1 token"); require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction"); require(mintingOpen == true && onlyAllowlistMode == false, "Public minting is not open right now!"); require(publicDropTimePassed() == true, "Public drop time has not passed!"); require(canMintAmount(_to, _amount), "Wallet address is over the maximum allowed mints"); require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 2022"); require(msg.value == getPrice(_amount), "Value below required mint fee for amount"); _safeMint(_to, _amount, false); } /** * @dev Mints tokens to an address in batch using an ERC-20 token for payment * fee may or may not be required* * @param _to address of the future owner of the token * @param _amount number of tokens to mint * @param _erc20TokenContract erc-20 token contract to mint with */ function mintToMultipleERC20(address _to, uint256 _amount, address _erc20TokenContract) public payable { require(_amount >= 1, "Must mint at least 1 token"); require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction"); require(getNextTokenId() <= collectionSize, "Cannot mint over supply cap of 2022"); require(mintingOpen == true && onlyAllowlistMode == false, "Public minting is not open right now!"); require(publicDropTimePassed() == true, "Public drop time has not passed!"); require(canMintAmount(_to, 1), "Wallet address is over the maximum allowed mints"); // ERC-20 Specific pre-flight checks require(isApprovedForERC20Payments(_erc20TokenContract), "ERC-20 Token is not approved for minting!"); uint256 tokensQtyToTransfer = chargeAmountForERC20(_erc20TokenContract) * _amount; IERC20 payableToken = IERC20(_erc20TokenContract); require(payableToken.balanceOf(_to) >= tokensQtyToTransfer, "Buyer does not own enough of token to complete purchase"); require(payableToken.allowance(_to, address(this)) >= tokensQtyToTransfer, "Buyer did not approve enough of ERC-20 token to complete purchase"); require(hasSurcharge(), "Fee for ERC-20 payment not provided!"); bool transferComplete = payableToken.transferFrom(_to, address(this), tokensQtyToTransfer); require(transferComplete, "ERC-20 token was unable to be transferred"); _safeMint(_to, _amount, false); addSurcharge(); } function openMinting() public onlyTeamOrOwner { mintingOpen = true; } function stopMinting() public onlyTeamOrOwner { mintingOpen = false; } ///////////// ALLOWLIST MINTING FUNCTIONS /** * @dev Mints tokens to an address using an allowlist. * fee may or may not be required* * @param _to address of the future owner of the token * @param _merkleProof merkle proof array */ function mintToAL(address _to, bytes32[] calldata _merkleProof) public payable { require(onlyERC20MintingMode == false, "Only minting with ERC-20 tokens is enabled."); require(onlyAllowlistMode == true && mintingOpen == true, "Allowlist minting is closed"); require(isAllowlisted(_to, _merkleProof), "Address is not in Allowlist!"); require(getNextTokenId() <= collectionSize, "Cannot mint over supply cap of 2022"); require(canMintAmount(_to, 1), "Wallet address is over the maximum allowed mints"); require(msg.value == getPrice(1), "Value needs to be exactly the mint fee!"); require(allowlistDropTimePassed() == true, "Allowlist drop time has not passed!"); _safeMint(_to, 1, false); } /** * @dev Mints tokens to an address using an allowlist. * fee may or may not be required* * @param _to address of the future owner of the token * @param _amount number of tokens to mint * @param _merkleProof merkle proof array */ function mintToMultipleAL(address _to, uint256 _amount, bytes32[] calldata _merkleProof) public payable { require(onlyERC20MintingMode == false, "Only minting with ERC-20 tokens is enabled."); require(onlyAllowlistMode == true && mintingOpen == true, "Allowlist minting is closed"); require(isAllowlisted(_to, _merkleProof), "Address is not in Allowlist!"); require(_amount >= 1, "Must mint at least 1 token"); require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction"); require(canMintAmount(_to, _amount), "Wallet address is over the maximum allowed mints"); require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 2022"); require(msg.value == getPrice(_amount), "Value below required mint fee for amount"); require(allowlistDropTimePassed() == true, "Allowlist drop time has not passed!"); _safeMint(_to, _amount, false); } /** * @dev Mints tokens to an address using an allowlist. * fee may or may not be required* * @param _to address of the future owner of the token * @param _amount number of tokens to mint * @param _merkleProof merkle proof array * @param _erc20TokenContract erc-20 token contract to mint with */ function mintToMultipleERC20AL(address _to, uint256 _amount, bytes32[] calldata _merkleProof, address _erc20TokenContract) public payable { require(onlyAllowlistMode == true && mintingOpen == true, "Allowlist minting is closed"); require(isAllowlisted(_to, _merkleProof), "Address is not in Allowlist!"); require(_amount >= 1, "Must mint at least 1 token"); require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction"); require(canMintAmount(_to, _amount), "Wallet address is over the maximum allowed mints"); require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 2022"); require(allowlistDropTimePassed() == true, "Allowlist drop time has not passed!"); // ERC-20 Specific pre-flight checks require(isApprovedForERC20Payments(_erc20TokenContract), "ERC-20 Token is not approved for minting!"); uint256 tokensQtyToTransfer = chargeAmountForERC20(_erc20TokenContract) * _amount; IERC20 payableToken = IERC20(_erc20TokenContract); require(payableToken.balanceOf(_to) >= tokensQtyToTransfer, "Buyer does not own enough of token to complete purchase"); require(payableToken.allowance(_to, address(this)) >= tokensQtyToTransfer, "Buyer did not approve enough of ERC-20 token to complete purchase"); require(hasSurcharge(), "Fee for ERC-20 payment not provided!"); bool transferComplete = payableToken.transferFrom(_to, address(this), tokensQtyToTransfer); require(transferComplete, "ERC-20 token was unable to be transferred"); _safeMint(_to, _amount, false); addSurcharge(); } /** * @dev Enable allowlist minting fully by enabling both flags * This is a convenience function for the Rampp user */ function openAllowlistMint() public onlyTeamOrOwner { enableAllowlistOnlyMode(); mintingOpen = true; } /** * @dev Close allowlist minting fully by disabling both flags * This is a convenience function for the Rampp user */ function closeAllowlistMint() public onlyTeamOrOwner { disableAllowlistOnlyMode(); mintingOpen = false; } /** * @dev Check if wallet over MAX_WALLET_MINTS * @param _address address in question to check if minted count exceeds max */ function canMintAmount(address _address, uint256 _amount) public view returns(bool) { require(_amount >= 1, "Amount must be greater than or equal to 1"); return (_numberMinted(_address) + _amount) <= MAX_WALLET_MINTS; } /** * @dev Update the maximum amount of tokens that can be minted by a unique wallet * @param _newWalletMax the new max of tokens a wallet can mint. Must be >= 1 */ function setWalletMax(uint256 _newWalletMax) public onlyTeamOrOwner { require(_newWalletMax >= 1, "Max mints per wallet must be at least 1"); MAX_WALLET_MINTS = _newWalletMax; } /** * @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 onlyTeamOrOwner { require(_newMaxMint >= 1, "Max mint must be at least 1"); maxBatchSize = _newMaxMint; } 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 onlyTeamOrOwner { _baseTokenURI = baseURI; } function getOwnershipData(uint256 tokenId) external view returns(TokenOwnership memory) { return ownershipOf(tokenId); } } // File: contracts/L2StateOfMindContract.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract L2StateOfMindContract is RamppERC721A { constructor() RamppERC721A("L2StateOfMind", "L222"){} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CONTRACT_VERSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WALLET_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_erc20TokenContract","type":"address"},{"internalType":"bool","name":"_isActive","type":"bool"},{"internalType":"uint256","name":"_chargeAmountInTokens","type":"uint256"}],"name":"addOrUpdateERC20ContractAsPayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addToTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowlistDropTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistDropTimePassed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"calcAvailableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"canMintAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20TokenContract","type":"address"}],"name":"chargeAmountForERC20","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeAllowlistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableAllowlistDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableAllowlistOnlyMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20TokenContract","type":"address"}],"name":"disableERC20ContractAsPayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableERC20OnlyMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePublicDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAllowlistOnlyMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20TokenContract","type":"address"}],"name":"enableERC20ContractAsPayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableERC20OnlyMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enforceAllowlistDropTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enforcePublicDropTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20Payable","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint256","name":"_count","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"inTeam","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isAllowlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20TokenContract","type":"address"}],"name":"isApprovedForERC20Payments","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintToAL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"mintToAdminV2","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"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintToMultipleAL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_erc20TokenContract","type":"address"}],"name":"mintToMultipleERC20","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"address","name":"_erc20TokenContract","type":"address"}],"name":"mintToMultipleERC20AL","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":"onlyAllowlistMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyERC20MintingMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openAllowlistMint","outputs":[],"stateMutability":"nonpayable","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":"publicDropTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicDropTimePassed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ramppSurchargeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ramppSurchargeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeFromTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetRamppSurchargeBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"restrictedApprovalAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDropTime","type":"uint256"}],"name":"setAllowlistDropTime","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":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isRestricted","type":"bool"}],"name":"setApprovalRestriction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newErc20Payable","type":"address"}],"name":"setERC20PayableAddress","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":"uint256","name":"_newDropTime","type":"uint256"}],"name":"setPublicDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setRamppAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSurcharge","type":"uint256"}],"name":"setRamppSurcharge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWalletMax","type":"uint256"}],"name":"setWalletMax","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":"surchargePayableAddressCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"surchargePayableAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"surchargePayableFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newMerkleRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useAllowlistDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usePublicDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAllRampp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_amountToWithdraw","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRamppSurcharges","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6000600b55600c80546001600160a01b03191673a9dac8f3aedc55d0fe707b86b8a45d246858d2e190811790915560e060405260a09081527379ff559431891cfa36fa1e7589c845f2b883120160c0526200005f90600e9060026200037d565b506040805160208101909152600c546001600160a01b031681526200008990600f9060016200037d565b50601080546001600160a01b0319167379ff559431891cfa36fa1e7589c845f2b8831201179055604080518082019091526000815260646020820152620000d5906011906002620003e7565b50604080516020810190915260648152620000f5906012906001620003e7565b506002601381905560016014819055600060158190556016556017805460ff1990811690915566470de4df820000601955601b805461ffff191661010017905563630d5300601c55601d8054821690921790915563630cfea0601e55601f805490911690911790556040805160808101909152604380825262005d2a602083013980516200018a91602091908201906200042a565b506021805460ff19166001908117909155602255348015620001ab57600080fd5b506040518060400160405280600d81526020016c130c94dd185d1953d9935a5b99609a1b815250604051806040016040528060048152602001632619191960e11b815250818160016107e6620002106200020a6200032960201b60201c565b6200032d565b600081116200027d5760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620002df5760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840162000274565b8351620002f49060049060208701906200042a565b5082516200030a9060059060208601906200042a565b5060039190915560805250506001600281905560185550620004fb9050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215620003d5579160200282015b82811115620003d557825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200039e565b50620003e3929150620004a7565b5090565b828054828255906000526020600020908101928215620003d5579160200282015b82811115620003d5578251829060ff1690559160200191906001019062000408565b8280546200043890620004be565b90600052602060002090601f0160209004810192826200045c5760008555620003d5565b82601f106200047757805160ff1916838001178555620003d5565b82800160010185558215620003d5579182015b82811115620003d55782518255916020019190600101906200048a565b5b80821115620003e35760008155600101620004a8565b600181811c90821680620004d357607f821691505b60208210811415620004f557634e487b7160e01b600052602260045260246000fd5b50919050565b6080516157e262000548600039600081816108cf015281816111f80152818161167b01528181611d5e01528181611f190152818161239201528181612860015261377e01526157e26000f3fe6080604052600436106105575760003560e01c80637fb8c6d3116102bd578063c5815c4111610180578063dfdedf69116100e7578063f05045c8116100a0578063f70be5e21161007a578063f70be5e214610ff7578063f8c0fd201461100c578063fd19eaf014611021578063fe154b2d1461104157600080fd5b8063f05045c814610f97578063f2fde38b14610fb7578063f703166314610fd757600080fd5b8063dfdedf6914610ebf578063e692893314610edf578063e6c6990a14610ef4578063e757223014610f0e578063e985e9c514610f2e578063ee54be9614610f7757600080fd5b8063d547cfb711610139578063d547cfb714610e37578063d7224ba014610e4c578063d83ae33214610e62578063d8d2412014610e82578063dcd4aa8b14610e97578063df213e8a14610eac57600080fd5b8063c5815c4114610d8d578063c87b56dd14610dad578063caa0f92a14610dcd578063cacf084214610de2578063cfc86f7b14610e02578063d266f3a914610e1757600080fd5b806395d89b4111610224578063b88d4fde116101dd578063b88d4fde14610cee578063b94b237614610d0e578063bb1876a814610d23578063bbd8556b14610d38578063bc05748e14610d58578063c3fb11c914610d6d57600080fd5b806395d89b4114610c44578063a1af10ca14610c59578063a1db978214610c79578063a22cb46514610c99578063a91bd1a914610cb9578063afe5608b14610cd957600080fd5b80638da5cb5b116102765780638da5cb5b14610b605780638f4bb49714610b7e5780638ff4013f14610b9857806391b7f5ed14610bb857806391c4b57414610bd85780639231ab2a14610bf757600080fd5b80637fb8c6d314610ac057806383c81c4114610ae0578063853828b614610b00578063891bbe7314610b1557806389f26d5814610b355780638d859f3e14610b4a57600080fd5b80633e3e0b1211610420578063547520fe116103875780636ba9fd381161034057806370a082311161031a57806370a0823114610a63578063715018a614610a83578063755edd1714610a9857806379ab3c8914610aab57600080fd5b80636ba9fd3814610a235780636d3de80614610a385780636eaf834414610a4d57600080fd5b8063547520fe1461098157806355228ca7146109a157806355f804b3146109bb57806358feaa59146109db57806360986a71146109f05780636352211e14610a0357600080fd5b806345c0f533116103d957806345c0f533146108bd578063464c3428146108f157806346f41ed5146109115780634783f0ef1461092b5780634ab8b5dd1461094b5780634f6ccce71461096157600080fd5b80633e3e0b121461081d57806340ccc0821461083257806342842e0e1461085257806343696f1814610872578063447abc7a1461089257806344eed881146108a757600080fd5b806323b872dd116104c45780632f745c591161047d5780632f745c5914610768578063330067861461078857806338b90333146107a85780633c003254146107d45780633d3f9c57146107e75780633e07311c1461080757600080fd5b806323b872dd146106d1578063286c8137146106f15780632913daa0146107115780632a000d4e146107275780632b5269b41461073d5780632eb4a7ab1461075257600080fd5b8063081812fc11610516578063081812fc14610653578063095ea7b3146106735780630c863bb61461069357806316b88a1d146106a857806318160ddd146105995780631aa4ba67146106bb57600080fd5b8062641e481461055c5780629a9b7b1461059957806301ffc9a7146105bc578063043a2a40146105ec5780630644cefa1461061c57806306fdde0314610631575b600080fd5b34801561056857600080fd5b5061057c610577366004614ac9565b611057565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156105a557600080fd5b506105ae611081565b604051908152602001610590565b3480156105c857600080fd5b506105dc6105d7366004614af8565b611095565b6040519015158152602001610590565b3480156105f857600080fd5b506105dc610607366004614b31565b600a6020526000908152604090205460ff1681565b61062f61062a366004614b4c565b611102565b005b34801561063d57600080fd5b5061064661127f565b6040516105909190614bce565b34801561065f57600080fd5b5061057c61066e366004614ac9565b611311565b34801561067f57600080fd5b5061062f61068e366004614b4c565b61139a565b34801561069f57600080fd5b506105dc61158d565b61062f6106b6366004614c2c565b6115af565b3480156106c757600080fd5b506105ae601e5481565b3480156106dd57600080fd5b5061062f6106ec366004614c9a565b611958565b3480156106fd57600080fd5b506105ae61070c366004614ac9565b611963565b34801561071d57600080fd5b506105ae60035481565b34801561073357600080fd5b506105ae60155481565b34801561074957600080fd5b5061062f611984565b34801561075e57600080fd5b506105ae601a5481565b34801561077457600080fd5b506105ae610783366004614b4c565b611a22565b34801561079457600080fd5b506105dc6107a3366004614cd6565b611b99565b3480156107b457600080fd5b50601f546107c29060ff1681565b60405160ff9091168152602001610590565b61062f6107e2366004614d28565b611c6f565b3480156107f357600080fd5b506105dc610802366004614b31565b611e10565b34801561081357600080fd5b506105ae60135481565b34801561082957600080fd5b5061062f611e33565b34801561083e57600080fd5b5061062f61084d366004614b4c565b611e84565b34801561085e57600080fd5b5061062f61086d366004614c9a565b611f75565b34801561087e57600080fd5b5061062f61088d366004614b31565b611f90565b34801561089e57600080fd5b506105ae61208d565b3480156108b357600080fd5b506105ae601c5481565b3480156108c957600080fd5b506105ae7f000000000000000000000000000000000000000000000000000000000000000081565b3480156108fd57600080fd5b5061062f61090c366004614b31565b61209d565b34801561091d57600080fd5b506017546105dc9060ff1681565b34801561093757600080fd5b5061062f610946366004614ac9565b612106565b34801561095757600080fd5b506105ae60225481565b34801561096d57600080fd5b506105ae61097c366004614ac9565b6121a2565b34801561098d57600080fd5b5061062f61099c366004614ac9565b61220a565b3480156109ad57600080fd5b50601d546105dc9060ff1681565b3480156109c757600080fd5b5061062f6109d6366004614d81565b6122a5565b3480156109e757600080fd5b5061062f6122fb565b61062f6109fe366004614df2565b61234d565b348015610a0f57600080fd5b5061057c610a1e366004614ac9565b6126bf565b348015610a2f57600080fd5b5061062f6126d1565b348015610a4457600080fd5b5061062f612725565b348015610a5957600080fd5b506105ae60165481565b348015610a6f57600080fd5b506105ae610a7e366004614b31565b612776565b348015610a8f57600080fd5b5061062f612807565b61062f610aa6366004614b31565b61283b565b348015610ab757600080fd5b5061062f612963565b348015610acc57600080fd5b5060105461057c906001600160a01b031681565b348015610aec57600080fd5b5061062f610afb366004614e3c565b6129b7565b348015610b0c57600080fd5b5061062f612a27565b348015610b2157600080fd5b5061057c610b30366004614ac9565b612a86565b348015610b4157600080fd5b5061062f612a96565b348015610b5657600080fd5b506105ae60195481565b348015610b6c57600080fd5b506000546001600160a01b031661057c565b348015610b8a57600080fd5b506021546105dc9060ff1681565b348015610ba457600080fd5b5061062f610bb3366004614ac9565b612aea565b348015610bc457600080fd5b5061062f610bd3366004614ac9565b612b95565b348015610be457600080fd5b50601b546105dc90610100900460ff1681565b348015610c0357600080fd5b50610c17610c12366004614ac9565b612bdf565b6040805182516001600160a01b031681526020928301516001600160401b03169281019290925201610590565b348015610c5057600080fd5b50610646612bfc565b348015610c6557600080fd5b506105dc610c74366004614b31565b612c0b565b348015610c8557600080fd5b5061062f610c94366004614b4c565b612c88565b348015610ca557600080fd5b5061062f610cb4366004614e3c565b612e48565b348015610cc557600080fd5b5061062f610cd4366004614b31565b612fe8565b348015610ce557600080fd5b5061062f61314f565b348015610cfa57600080fd5b5061062f610d09366004614e89565b61319a565b348015610d1a57600080fd5b5061062f6131cd565b348015610d2f57600080fd5b5061062f61321e565b348015610d4457600080fd5b5061062f610d53366004614b31565b61326f565b348015610d6457600080fd5b5061062f613375565b348015610d7957600080fd5b5061062f610d88366004614ac9565b6133cb565b348015610d9957600080fd5b50600c5461057c906001600160a01b031681565b348015610db957600080fd5b50610646610dc8366004614ac9565b6133fa565b348015610dd957600080fd5b506105ae613458565b348015610dee57600080fd5b5061062f610dfd366004614b31565b613472565b348015610e0e57600080fd5b506106466134d8565b348015610e2357600080fd5b506105ae610e32366004614b31565b613566565b348015610e4357600080fd5b50610646613612565b348015610e5857600080fd5b506105ae600b5481565b348015610e6e57600080fd5b5061062f610e7d366004614f64565b613621565b348015610e8e57600080fd5b506105dc613695565b348015610ea357600080fd5b5061062f6136b2565b61062f610eba366004614cd6565b6136f8565b348015610ecb57600080fd5b5061062f610eda366004614b31565b613848565b348015610eeb57600080fd5b5061062f613944565b348015610f0057600080fd5b50601b546105dc9060ff1681565b348015610f1a57600080fd5b506105ae610f29366004614ac9565b613998565b348015610f3a57600080fd5b506105dc610f49366004614fa3565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b348015610f8357600080fd5b5061062f610f92366004614ac9565b6139a8565b348015610fa357600080fd5b506105ae610fb2366004614ac9565b613a72565b348015610fc357600080fd5b5061062f610fd2366004614b31565b613a82565b348015610fe357600080fd5b5061062f610ff2366004614ac9565b613b1a565b34801561100357600080fd5b5061062f613be7565b34801561101857600080fd5b5061062f613c18565b34801561102d57600080fd5b506105dc61103c366004614b4c565b613c63565b34801561104d57600080fd5b506105ae60145481565b600f818154811061106757600080fd5b6000918252602090912001546001600160a01b0316905081565b60006110906002546000190190565b905090565b60006001600160e01b031982166380ac58cd60e01b14806110c657506001600160e01b03198216635b5e139f60e01b145b806110e157506001600160e01b0319821663780e9d6360e01b145b806110fc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60175460ff161561112e5760405162461bcd60e51b815260040161112590614fd6565b60405180910390fd5b600181101561114f5760405162461bcd60e51b815260040161112590615021565b6003548111156111715760405162461bcd60e51b815260040161112590615058565b60215460ff161515600114801561118b5750601b5460ff16155b6111a75760405162461bcd60e51b8152600401611125906150a6565b6111af61158d565b15156001146111d05760405162461bcd60e51b8152600401611125906150eb565b6111da8282613c63565b6111f65760405162461bcd60e51b815260040161112590615120565b7f000000000000000000000000000000000000000000000000000000000000000081611220611081565b61122a9190615186565b11156112485760405162461bcd60e51b81526004016111259061519e565b61125181613998565b341461126f5760405162461bcd60e51b8152600401611125906151e1565b61127b82826000613ce8565b5050565b60606004805461128e90615229565b80601f01602080910402602001604051908101604052809291908181526020018280546112ba90615229565b80156113075780601f106112dc57610100808354040283529160200191611307565b820191906000526020600020905b8154815290600101906020018083116112ea57829003601f168201915b5050505050905090565b600061131c82613d03565b61137e5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401611125565b506000908152600860205260409020546001600160a01b031690565b60006113a5826126bf565b9050806001600160a01b0316836001600160a01b031614156114145760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401611125565b6001600160a01b0383166000908152600a602052604090205460ff16156114ef5760405162461bcd60e51b815260206004820152607f60248201527f45524337323152657374726963746564417070726f76616c3a2041646472657360448201527f7320746f20617070726f766520686173206265656e207265737472696374656460648201527f20627920636f6e7472616374206f776e657220616e64206973206e6f7420616c60848201527f6c6f77656420746f206265206d61726b656420666f7220617070726f76616c0060a482015260c401611125565b336001600160a01b038216148061150b575061150b8133610f49565b61157d5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401611125565b611588838383613d19565b505050565b601b54600090610100900460ff166115a55750600190565b50601c5442101590565b601b5460ff16151560011480156115cd575060215460ff1615156001145b6115e95760405162461bcd60e51b815260040161112590615264565b6115f4858484611b99565b6116105760405162461bcd60e51b81526004016111259061529b565b60018410156116315760405162461bcd60e51b815260040161112590615021565b6003548411156116535760405162461bcd60e51b815260040161112590615058565b61165d8585613c63565b6116795760405162461bcd60e51b815260040161112590615120565b7f0000000000000000000000000000000000000000000000000000000000000000846116a3611081565b6116ad9190615186565b11156116cb5760405162461bcd60e51b81526004016111259061519e565b6116d3613695565b15156001146116f45760405162461bcd60e51b8152600401611125906152d2565b6116fd81611e10565b6117195760405162461bcd60e51b815260040161112590615315565b60008461172583613566565b61172f919061535e565b6040516370a0823160e01b81526001600160a01b03888116600483015291925083918391908316906370a082319060240160206040518083038186803b15801561177857600080fd5b505afa15801561178c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b0919061537d565b10156117ce5760405162461bcd60e51b815260040161112590615396565b604051636eb1769f60e11b81526001600160a01b03888116600483015230602483015283919083169063dd62ed3e9060440160206040518083038186803b15801561181857600080fd5b505afa15801561182c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611850919061537d565b101561186e5760405162461bcd60e51b8152600401611125906153f3565b601654341461188f5760405162461bcd60e51b81526004016111259061545a565b6040516323b872dd60e01b81526001600160a01b03888116600483015230602483015260448201849052600091908316906323b872dd90606401602060405180830381600087803b1580156118e357600080fd5b505af11580156118f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191b919061549e565b90508061193a5760405162461bcd60e51b8152600401611125906154bb565b61194688886000613ce8565b61194e613d75565b5050505050505050565b611588838383613d90565b6011818154811061197357600080fd5b600091825260209091200154905081565b600c546001600160a01b031633146119ae5760405162461bcd60e51b815260040161112590615504565b600060155411611a185760405162461bcd60e51b815260206004820152602f60248201527f576974686472617761626c6556323a204e6f2052616d7070207375726368617260448201526e33b2b99034b7103130b630b731b29760891b6064820152608401611125565b611a20614110565b565b6000611a2d83612776565b8210611a865760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401611125565b6000611a90611081565b905060008060005b83811015611b39576000818152600660209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611aea57805192505b876001600160a01b0316836001600160a01b03161415611b265786841415611b18575093506110fc92505050565b83611b228161553b565b9450505b5080611b318161553b565b915050611a98565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401611125565b601a54600090611beb5760405162461bcd60e51b815260206004820152601760248201527f4d65726b6c6520726f6f74206973206e6f7420736574210000000000000000006044820152606401611125565b6040516bffffffffffffffffffffffff19606086901b166020820152600090603401604051602081830303815290604052805190602001209050611c6684848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601a5491508490506141b1565b95945050505050565b60175460ff1615611c925760405162461bcd60e51b815260040161112590614fd6565b601b5460ff1615156001148015611cb0575060215460ff1615156001145b611ccc5760405162461bcd60e51b815260040161112590615264565b611cd7848383611b99565b611cf35760405162461bcd60e51b81526004016111259061529b565b6001831015611d145760405162461bcd60e51b815260040161112590615021565b600354831115611d365760405162461bcd60e51b815260040161112590615058565b611d408484613c63565b611d5c5760405162461bcd60e51b815260040161112590615120565b7f000000000000000000000000000000000000000000000000000000000000000083611d86611081565b611d909190615186565b1115611dae5760405162461bcd60e51b81526004016111259061519e565b611db783613998565b3414611dd55760405162461bcd60e51b8152600401611125906151e1565b611ddd613695565b1515600114611dfe5760405162461bcd60e51b8152600401611125906152d2565b611e0a84846000613ce8565b50505050565b6001600160a01b03166000908152600d602052604090205460ff16151560011490565b600080546001600160a01b0316339081149190611e4f90612c0b565b90508180611e5a5750805b611e765760405162461bcd60e51b815260040161112590615556565b50506021805460ff19169055565b600080546001600160a01b0316339081149190611ea090612c0b565b90508180611eab5750805b611ec75760405162461bcd60e51b815260040161112590615556565b60008311611f175760405162461bcd60e51b815260206004820152601b60248201527f4d757374206d696e74206174206c65617374203120746f6b656e2e00000000006044820152606401611125565b7f000000000000000000000000000000000000000000000000000000000000000083611f41611081565b611f4b9190615186565b1115611f695760405162461bcd60e51b81526004016111259061519e565b611e0a84846001613ce8565b6115888383836040518060200160405280600081525061319a565b6000546001600160a01b03163314611fba5760405162461bcd60e51b81526004016111259061559f565b6001600160a01b0381166120025760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401611125565b61200b81612c0b565b156120665760405162461bcd60e51b815260206004820152602560248201527f54686973206164647265737320697320616c726561647920696e20796f7572206044820152643a32b0b69760d91b6064820152608401611125565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b60006015544761109091906155d4565b600080546001600160a01b03163390811491906120b990612c0b565b905081806120c45750805b6120e05760405162461bcd60e51b815260040161112590615556565b50506001600160a01b03166000908152600d60205260409020805460ff19166001179055565b600080546001600160a01b031633908114919061212290612c0b565b9050818061212d5750805b6121495760405162461bcd60e51b815260040161112590615556565b601a5483141561219b5760405162461bcd60e51b815260206004820152601e60248201527f4d65726b6c6520726f6f742077696c6c20626520756e6368616e6765642100006044820152606401611125565b5050601a55565b60006121ac611081565b82106122065760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401611125565b5090565b600080546001600160a01b031633908114919061222690612c0b565b905081806122315750805b61224d5760405162461bcd60e51b815260040161112590615556565b600183101561229e5760405162461bcd60e51b815260206004820152601b60248201527f4d6178206d696e74206d757374206265206174206c65617374203100000000006044820152606401611125565b5050600355565b600080546001600160a01b03163390811491906122c190612c0b565b905081806122cc5750805b6122e85760405162461bcd60e51b815260040161112590615556565b6122f460208585614a39565b5050505050565b600080546001600160a01b031633908114919061231790612c0b565b905081806123225750805b61233e5760405162461bcd60e51b815260040161112590615556565b5050601b805461ff0019169055565b600182101561236e5760405162461bcd60e51b815260040161112590615021565b6003548211156123905760405162461bcd60e51b815260040161112590615058565b7f00000000000000000000000000000000000000000000000000000000000000006123b9613458565b11156123d75760405162461bcd60e51b81526004016111259061519e565b60215460ff16151560011480156123f15750601b5460ff16155b61240d5760405162461bcd60e51b8152600401611125906150a6565b61241561158d565b15156001146124365760405162461bcd60e51b8152600401611125906150eb565b612441836001613c63565b61245d5760405162461bcd60e51b815260040161112590615120565b61246681611e10565b6124825760405162461bcd60e51b815260040161112590615315565b60008261248e83613566565b612498919061535e565b6040516370a0823160e01b81526001600160a01b03868116600483015291925083918391908316906370a082319060240160206040518083038186803b1580156124e157600080fd5b505afa1580156124f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612519919061537d565b10156125375760405162461bcd60e51b815260040161112590615396565b604051636eb1769f60e11b81526001600160a01b03868116600483015230602483015283919083169063dd62ed3e9060440160206040518083038186803b15801561258157600080fd5b505afa158015612595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b9919061537d565b10156125d75760405162461bcd60e51b8152600401611125906153f3565b60165434146125f85760405162461bcd60e51b81526004016111259061545a565b6040516323b872dd60e01b81526001600160a01b03868116600483015230602483015260448201849052600091908316906323b872dd90606401602060405180830381600087803b15801561264c57600080fd5b505af1158015612660573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612684919061549e565b9050806126a35760405162461bcd60e51b8152600401611125906154bb565b6126af86866000613ce8565b6126b7613d75565b505050505050565b60006126ca826141c7565b5192915050565b600080546001600160a01b03163390811491906126ed90612c0b565b905081806126f85750805b6127145760405162461bcd60e51b815260040161112590615556565b50506021805460ff19166001179055565b600080546001600160a01b031633908114919061274190612c0b565b9050818061274c5750805b6127685760405162461bcd60e51b815260040161112590615556565b5050601b805460ff19169055565b60006001600160a01b0382166127e25760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401611125565b506001600160a01b03166000908152600760205260409020546001600160801b031690565b6000546001600160a01b031633146128315760405162461bcd60e51b81526004016111259061559f565b611a2060006142f5565b60175460ff161561285e5760405162461bcd60e51b815260040161112590614fd6565b7f0000000000000000000000000000000000000000000000000000000000000000612887613458565b11156128a55760405162461bcd60e51b81526004016111259061519e565b60215460ff16151560011480156128bf5750601b5460ff16155b6128db5760405162461bcd60e51b8152600401611125906150a6565b6128e361158d565b15156001146129045760405162461bcd60e51b8152600401611125906150eb565b61290f816001613c63565b61292b5760405162461bcd60e51b815260040161112590615120565b6129356001613998565b34146129535760405162461bcd60e51b8152600401611125906155eb565b6129608160016000613ce8565b50565b600080546001600160a01b031633908114919061297f90612c0b565b9050818061298a5750805b6129a65760405162461bcd60e51b815260040161112590615556565b5050601b805460ff19166001179055565b600080546001600160a01b03163390811491906129d390612c0b565b905081806129de5750805b6129fa5760405162461bcd60e51b815260040161112590615556565b50506001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b600080546001600160a01b0316339081149190612a4390612c0b565b90508180612a4e5750805b612a6a5760405162461bcd60e51b815260040161112590615556565b6000612a7461208d565b11612a7e57600080fd5b61127b614345565b600e818154811061106757600080fd5b600080546001600160a01b0316339081149190612ab290612c0b565b90508180612abd5750805b612ad95760405162461bcd60e51b815260040161112590615556565b50506017805460ff19166001179055565b600080546001600160a01b0316339081149190612b0690612c0b565b90508180612b115750805b612b2d5760405162461bcd60e51b815260040161112590615556565b6001831015612b8e5760405162461bcd60e51b815260206004820152602760248201527f4d6178206d696e7473207065722077616c6c6574206d757374206265206174206044820152666c65617374203160c81b6064820152608401611125565b5050602255565b600080546001600160a01b0316339081149190612bb190612c0b565b90508180612bbc5750805b612bd85760405162461bcd60e51b815260040161112590615556565b5050601955565b60408051808201909152600080825260208201526110fc826141c7565b60606005805461128e90615229565b60006001600160a01b038216612c635760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206164647265737320746f20636865636b2e000000000000006044820152606401611125565b506001600160a01b031660009081526001602081905260409091205460ff1615151490565b600080546001600160a01b0316339081149190612ca490612c0b565b90508180612caf5750805b612ccb5760405162461bcd60e51b815260040161112590615556565b60008311612cd857600080fd5b6040516370a0823160e01b8152306004820152849084906001600160a01b038316906370a082319060240160206040518083038186803b158015612d1b57600080fd5b505afa158015612d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d53919061537d565b1015612db95760405162461bcd60e51b815260206004820152602f60248201527f576974686472617756323a20436f6e747261637420646f6573206e6f74206f7760448201526e6e20656e6f75676820746f6b656e7360881b6064820152608401611125565b60105460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018690529082169063a9059cbb90604401602060405180830381600087803b158015612e0757600080fd5b505af1158015612e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3f919061549e565b506122f4614110565b6001600160a01b038216331415612ea15760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401611125565b6001600160a01b0382166000908152600a602052604090205460ff1615612f7c5760405162461bcd60e51b815260206004820152607d60248201527f45524337323152657374726963746564417070726f76616c3a204f706572617460448201527f6f72206164647265737320686173206265656e2072657374726963746564206260648201527f7920636f6e7472616374206f776e657220616e64206973206e6f7420616c6c6f60848201527f77656420746f206265206d61726b656420666f7220617070726f76616c00000060a482015260c401611125565b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600080546001600160a01b031633908114919061300490612c0b565b9050818061300f5750805b61302b5760405162461bcd60e51b815260040161112590615556565b6001600160a01b0383166130a75760405162461bcd60e51b815260206004820152603c60248201527f576974686472617761626c6556323a206e6577204552432d3230207061796f7560448201527f742063616e6e6f7420626520746865207a65726f2061646472657373000000006064820152608401611125565b6010546001600160a01b038481169116141561312b5760405162461bcd60e51b815260206004820152603b60248201527f576974686472617761626c6556323a206e6577204552432d3230207061796f7560448201527f742069732073616d652061732063757272656e74207061796f757400000000006064820152608401611125565b5050601080546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b031633908114919061316b90612c0b565b905081806131765750805b6131925760405162461bcd60e51b815260040161112590615556565b611e76612725565b6131a5848484613d90565b6131b1848484846143b9565b611e0a5760405162461bcd60e51b815260040161112590615632565b600080546001600160a01b03163390811491906131e990612c0b565b905081806131f45750805b6132105760405162461bcd60e51b815260040161112590615556565b50506017805460ff19169055565b600080546001600160a01b031633908114919061323a90612c0b565b905081806132455750805b6132615760405162461bcd60e51b815260040161112590615556565b5050601d805460ff19169055565b600c546001600160a01b031633146132995760405162461bcd60e51b815260040161112590615504565b600c546001600160a01b03828116911614156133135760405162461bcd60e51b815260206004820152603360248201527f576974686472617761626c6556323a204e65772052616d7070206164647265736044820152721cc81b5d5cdd08189948191a5999995c995b9d606a1b6064820152608401611125565b600c80546001600160a01b0319166001600160a01b038316179055600e805482919060009061334457613344615685565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050565b600080546001600160a01b031633908114919061339190612c0b565b9050818061339c5750805b6133b85760405162461bcd60e51b815260040161112590615556565b5050601b805461ff001916610100179055565b600c546001600160a01b031633146133f55760405162461bcd60e51b815260040161112590615504565b601655565b60606000613406613612565b905060008151116134265760405180602001604052806000815250613451565b80613430846144c7565b60405160200161344192919061569b565b6040516020818303038152906040525b9392505050565b60006134676002546000190190565b611090906001615186565b600080546001600160a01b031633908114919061348e90612c0b565b905081806134995750805b6134b55760405162461bcd60e51b815260040161112590615556565b50506001600160a01b03166000908152600d60205260409020805460ff19169055565b602080546134e590615229565b80601f016020809104026020016040519081016040528092919081815260200182805461351190615229565b801561355e5780601f106135335761010080835404028352916020019161355e565b820191906000526020600020905b81548152906001019060200180831161354157829003601f168201915b505050505081565b600061357182611e10565b6135f35760405162461bcd60e51b815260206004820152604760248201527f54686973204552432d323020636f6e7472616374206973206e6f74206170707260448201527f6f76656420746f206d616b65207061796d656e7473206f6e207468697320636f6064820152666e74726163742160c81b608482015260a401611125565b506001600160a01b03166000908152600d602052604090206001015490565b60606020805461128e90615229565b600080546001600160a01b031633908114919061363d90612c0b565b905081806136485750805b6136645760405162461bcd60e51b815260040161112590615556565b50506001600160a01b03929092166000908152600d60205260409020805460ff191691151591909117815560010155565b601d5460009060ff166136a85750600190565b50601e5442101590565b600c546001600160a01b031633146136dc5760405162461bcd60e51b815260040161112590615504565b60006136e661208d565b116136f057600080fd5b611a20614345565b60175460ff161561371b5760405162461bcd60e51b815260040161112590614fd6565b601b5460ff1615156001148015613739575060215460ff1615156001145b6137555760405162461bcd60e51b815260040161112590615264565b613760838383611b99565b61377c5760405162461bcd60e51b81526004016111259061529b565b7f00000000000000000000000000000000000000000000000000000000000000006137a5613458565b11156137c35760405162461bcd60e51b81526004016111259061519e565b6137ce836001613c63565b6137ea5760405162461bcd60e51b815260040161112590615120565b6137f46001613998565b34146138125760405162461bcd60e51b8152600401611125906155eb565b61381a613695565b151560011461383b5760405162461bcd60e51b8152600401611125906152d2565b6115888360016000613ce8565b6000546001600160a01b031633146138725760405162461bcd60e51b81526004016111259061559f565b6001600160a01b0381166138ba5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401611125565b6138c381612c0b565b6139235760405162461bcd60e51b815260206004820152602b60248201527f546869732061646472657373206973206e6f7420696e20796f7572207465616d60448201526a1031bab93932b73a363c9760a91b6064820152608401611125565b6001600160a01b03166000908152600160205260409020805460ff19169055565b600080546001600160a01b031633908114919061396090612c0b565b9050818061396b5750805b6139875760405162461bcd60e51b815260040161112590615556565b5050601d805460ff19166001179055565b6000816019546110fc919061535e565b600080546001600160a01b03163390811491906139c490612c0b565b905081806139cf5750805b6139eb5760405162461bcd60e51b815260040161112590615556565b428311613a6b5760405162461bcd60e51b815260206004820152604260248201527f44726f702064617465206d75737420626520696e2066757475726521204f746860448201527f6572776973652063616c6c2064697361626c655075626c696344726f7054696d606482015261652160f01b608482015260a401611125565b5050601c55565b6012818154811061197357600080fd5b6000546001600160a01b03163314613aac5760405162461bcd60e51b81526004016111259061559f565b6001600160a01b038116613b115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611125565b612960816142f5565b600080546001600160a01b0316339081149190613b3690612c0b565b90508180613b415750805b613b5d5760405162461bcd60e51b815260040161112590615556565b428311613be05760405162461bcd60e51b815260206004820152604560248201527f44726f702064617465206d75737420626520696e2066757475726521204f746860448201527f6572776973652063616c6c2064697361626c65416c6c6f776c69737444726f7060648201526454696d652160d81b608482015260a401611125565b5050601e55565b600c546001600160a01b03163314613c115760405162461bcd60e51b815260040161112590615504565b6000601555565b600080546001600160a01b0316339081149190613c3490612c0b565b90508180613c3f5750805b613c5b5760405162461bcd60e51b815260040161112590615556565b612714612963565b60006001821015613cc85760405162461bcd60e51b815260206004820152602960248201527f416d6f756e74206d7573742062652067726561746572207468616e206f7220656044820152687175616c20746f203160b81b6064820152608401611125565b60225482613cd5856145c4565b613cdf9190615186565b11159392505050565b61158883838360405180602001604052806000815250614662565b6000816001111580156110fc5750506002541190565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60165460156000828254613d899190615186565b9091555050565b6000613d9b826141c7565b80519091506000906001600160a01b0316336001600160a01b03161480613dd2575033613dc784611311565b6001600160a01b0316145b80613de457508151613de49033610f49565b905080613e4e5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401611125565b846001600160a01b031682600001516001600160a01b031614613ec25760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401611125565b6001600160a01b038416613f265760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401611125565b613f366000848460000151613d19565b6001600160a01b0385166000908152600760205260408120805460019290613f689084906001600160801b03166156ca565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526007602052604081208054600194509092613fb4918591166156f2565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526006909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561403b846001615186565b6000818152600660205260409020549091506001600160a01b03166140ca5761406381613d03565b156140ca5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600690935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126b7565b6015548061411b5750565b60005b6014548110156141a857614196600f828154811061413e5761413e615685565b9060005260206000200160009054906101000a90046001600160a01b031660646012848154811061417157614171615685565b906000526020600020015485614187919061535e565b614191919061572a565b61492f565b806141a08161553b565b91505061411e565b50506000601555565b6000826141be85846149c5565b14949350505050565b604080518082019091526000808252602082015281806001111580156141ee575060025481105b15614295576000818152600660209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561423f579392505050565b50600019016000818152600660209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215614290579392505050565b61423f565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401611125565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061434f61208d565b905060005b60135481101561127b576143a7600e828154811061437457614374615685565b9060005260206000200160009054906101000a90046001600160a01b031660646011848154811061417157614171615685565b806143b18161553b565b915050614354565b60006001600160a01b0384163b156144bb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906143fd90339089908890889060040161573e565b602060405180830381600087803b15801561441757600080fd5b505af1925050508015614447575060408051601f3d908101601f191682019092526144449181019061577b565b60015b6144a1573d808015614475576040519150601f19603f3d011682016040523d82523d6000602084013e61447a565b606091505b5080516144995760405162461bcd60e51b815260040161112590615632565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506144bf565b5060015b949350505050565b6060816144eb5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561451557806144ff8161553b565b915061450e9050600a8361572a565b91506144ef565b6000816001600160401b0381111561452f5761452f614e73565b6040519080825280601f01601f191660200182016040528015614559576020820181803683370190505b5090505b84156144bf5761456e6001836155d4565b915061457b600a86615798565b614586906030615186565b60f81b81838151811061459b5761459b615685565b60200101906001600160f81b031916908160001a9053506145bd600a8661572a565b945061455d565b60006001600160a01b0382166146365760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401611125565b506001600160a01b0316600090815260076020526040902054600160801b90046001600160801b031690565b6002546001600160a01b0385166146c55760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401611125565b6146ce81613d03565b1561471b5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401611125565b8261477d5760035484111561477d5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401611125565b6001600160a01b0385166000908152600760209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906147d99088906156f2565b6001600160801b03168152602001856147f257866147f5565b60005b836020015161480491906156f2565b6001600160801b039081169091526001600160a01b0380891660008181526007602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526006909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b868110156149235760405182906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46148e760008984886143b9565b6149035760405162461bcd60e51b815260040161112590615632565b8161490d8161553b565b925050808061491b9061553b565b91505061489a565b50600255505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461497c576040519150601f19603f3d011682016040523d82523d6000602084013e614981565b606091505b50509050806115885760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401611125565b600081815b8451811015614a315760008582815181106149e7576149e7615685565b60200260200101519050808311614a0d5760008381526020829052604090209250614a1e565b600081815260208490526040902092505b5080614a298161553b565b9150506149ca565b509392505050565b828054614a4590615229565b90600052602060002090601f016020900481019282614a675760008555614aad565b82601f10614a805782800160ff19823516178555614aad565b82800160010185558215614aad579182015b82811115614aad578235825591602001919060010190614a92565b506122069291505b808211156122065760008155600101614ab5565b600060208284031215614adb57600080fd5b5035919050565b6001600160e01b03198116811461296057600080fd5b600060208284031215614b0a57600080fd5b813561345181614ae2565b80356001600160a01b0381168114614b2c57600080fd5b919050565b600060208284031215614b4357600080fd5b61345182614b15565b60008060408385031215614b5f57600080fd5b614b6883614b15565b946020939093013593505050565b60005b83811015614b91578181015183820152602001614b79565b83811115611e0a5750506000910152565b60008151808452614bba816020860160208601614b76565b601f01601f19169290920160200192915050565b6020815260006134516020830184614ba2565b60008083601f840112614bf357600080fd5b5081356001600160401b03811115614c0a57600080fd5b6020830191508360208260051b8501011115614c2557600080fd5b9250929050565b600080600080600060808688031215614c4457600080fd5b614c4d86614b15565b94506020860135935060408601356001600160401b03811115614c6f57600080fd5b614c7b88828901614be1565b9094509250614c8e905060608701614b15565b90509295509295909350565b600080600060608486031215614caf57600080fd5b614cb884614b15565b9250614cc660208501614b15565b9150604084013590509250925092565b600080600060408486031215614ceb57600080fd5b614cf484614b15565b925060208401356001600160401b03811115614d0f57600080fd5b614d1b86828701614be1565b9497909650939450505050565b60008060008060608587031215614d3e57600080fd5b614d4785614b15565b93506020850135925060408501356001600160401b03811115614d6957600080fd5b614d7587828801614be1565b95989497509550505050565b60008060208385031215614d9457600080fd5b82356001600160401b0380821115614dab57600080fd5b818501915085601f830112614dbf57600080fd5b813581811115614dce57600080fd5b866020828501011115614de057600080fd5b60209290920196919550909350505050565b600080600060608486031215614e0757600080fd5b614e1084614b15565b925060208401359150614e2560408501614b15565b90509250925092565b801515811461296057600080fd5b60008060408385031215614e4f57600080fd5b614e5883614b15565b91506020830135614e6881614e2e565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215614e9f57600080fd5b614ea885614b15565b9350614eb660208601614b15565b92506040850135915060608501356001600160401b0380821115614ed957600080fd5b818701915087601f830112614eed57600080fd5b813581811115614eff57614eff614e73565b604051601f8201601f19908116603f01168101908382118183101715614f2757614f27614e73565b816040528281528a6020848701011115614f4057600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080600060608486031215614f7957600080fd5b614f8284614b15565b92506020840135614f9281614e2e565b929592945050506040919091013590565b60008060408385031215614fb657600080fd5b614fbf83614b15565b9150614fcd60208401614b15565b90509250929050565b6020808252602b908201527f4f6e6c79206d696e74696e672077697468204552432d323020746f6b656e732060408201526a34b99032b730b13632b21760a91b606082015260800190565b6020808252601a908201527f4d757374206d696e74206174206c65617374203120746f6b656e000000000000604082015260600190565b6020808252602e908201527f43616e6e6f74206d696e74206d6f7265207468616e206d6178206d696e74207060408201526d32b9103a3930b739b0b1ba34b7b760911b606082015260800190565b60208082526025908201527f5075626c6963206d696e74696e67206973206e6f74206f70656e207269676874604082015264206e6f772160d81b606082015260800190565b6020808252818101527f5075626c69632064726f702074696d6520686173206e6f742070617373656421604082015260600190565b60208082526030908201527f57616c6c65742061646472657373206973206f76657220746865206d6178696d60408201526f756d20616c6c6f776564206d696e747360801b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561519957615199615170565b500190565b60208082526023908201527f43616e6e6f74206d696e74206f76657220737570706c7920636170206f66203260408201526218191960e91b606082015260800190565b60208082526028908201527f56616c75652062656c6f77207265717569726564206d696e742066656520666f6040820152671c88185b5bdd5b9d60c21b606082015260800190565b600181811c9082168061523d57607f821691505b6020821081141561525e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601b908201527f416c6c6f776c697374206d696e74696e6720697320636c6f7365640000000000604082015260600190565b6020808252601c908201527f41646472657373206973206e6f7420696e20416c6c6f776c6973742100000000604082015260600190565b60208082526023908201527f416c6c6f776c6973742064726f702074696d6520686173206e6f74207061737360408201526265642160e81b606082015260800190565b60208082526029908201527f4552432d323020546f6b656e206973206e6f7420617070726f76656420666f72604082015268206d696e74696e672160b81b606082015260800190565b600081600019048311821515161561537857615378615170565b500290565b60006020828403121561538f57600080fd5b5051919050565b60208082526037908201527f427579657220646f6573206e6f74206f776e20656e6f756768206f6620746f6b60408201527f656e20746f20636f6d706c657465207075726368617365000000000000000000606082015260800190565b60208082526041908201527f427579657220646964206e6f7420617070726f766520656e6f756768206f662060408201527f4552432d323020746f6b656e20746f20636f6d706c65746520707572636861736060820152606560f81b608082015260a00190565b60208082526024908201527f46656520666f72204552432d3230207061796d656e74206e6f742070726f76696040820152636465642160e01b606082015260800190565b6000602082840312156154b057600080fd5b815161345181614e2e565b60208082526029908201527f4552432d323020746f6b656e2077617320756e61626c6520746f206265207472604082015268185b9cd9995c9c995960ba1b606082015260800190565b6020808252601c908201527f4f776e61626c653a2063616c6c6572206973206e6f742052414d505000000000604082015260600190565b600060001982141561554f5761554f615170565b5060010190565b60208082526029908201527f5465616d3a2063616c6c6572206973206e6f7420746865206f776e6572206f726040820152681034b7102a32b0b69760b91b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000828210156155e6576155e6615170565b500390565b60208082526027908201527f56616c7565206e6565647320746f2062652065786163746c7920746865206d696040820152666e74206665652160c81b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600083516156ad818460208801614b76565b8351908301906156c1818360208801614b76565b01949350505050565b60006001600160801b03838116908316818110156156ea576156ea615170565b039392505050565b60006001600160801b038083168185168083038211156156c1576156c1615170565b634e487b7160e01b600052601260045260246000fd5b60008261573957615739615714565b500490565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061577190830184614ba2565b9695505050505050565b60006020828403121561578d57600080fd5b815161345181614ae2565b6000826157a7576157a7615714565b50069056fea264697066735822122095bc8b83c43665d8e9575e689ae4932eaf8044d757af14b0a2a27e0247e7822e64736f6c63430008090033697066733a2f2f6261667962656965657171653432626b356a6879766f6b7369786a6c7662763767616b6c363534686f62346b327574333370797a33786f68706c652f000000000000000000000000d131f1bcdd547e067af447dd3c36c99d6be9fdeb
Deployed Bytecode
0x6080604052600436106105575760003560e01c80637fb8c6d3116102bd578063c5815c4111610180578063dfdedf69116100e7578063f05045c8116100a0578063f70be5e21161007a578063f70be5e214610ff7578063f8c0fd201461100c578063fd19eaf014611021578063fe154b2d1461104157600080fd5b8063f05045c814610f97578063f2fde38b14610fb7578063f703166314610fd757600080fd5b8063dfdedf6914610ebf578063e692893314610edf578063e6c6990a14610ef4578063e757223014610f0e578063e985e9c514610f2e578063ee54be9614610f7757600080fd5b8063d547cfb711610139578063d547cfb714610e37578063d7224ba014610e4c578063d83ae33214610e62578063d8d2412014610e82578063dcd4aa8b14610e97578063df213e8a14610eac57600080fd5b8063c5815c4114610d8d578063c87b56dd14610dad578063caa0f92a14610dcd578063cacf084214610de2578063cfc86f7b14610e02578063d266f3a914610e1757600080fd5b806395d89b4111610224578063b88d4fde116101dd578063b88d4fde14610cee578063b94b237614610d0e578063bb1876a814610d23578063bbd8556b14610d38578063bc05748e14610d58578063c3fb11c914610d6d57600080fd5b806395d89b4114610c44578063a1af10ca14610c59578063a1db978214610c79578063a22cb46514610c99578063a91bd1a914610cb9578063afe5608b14610cd957600080fd5b80638da5cb5b116102765780638da5cb5b14610b605780638f4bb49714610b7e5780638ff4013f14610b9857806391b7f5ed14610bb857806391c4b57414610bd85780639231ab2a14610bf757600080fd5b80637fb8c6d314610ac057806383c81c4114610ae0578063853828b614610b00578063891bbe7314610b1557806389f26d5814610b355780638d859f3e14610b4a57600080fd5b80633e3e0b1211610420578063547520fe116103875780636ba9fd381161034057806370a082311161031a57806370a0823114610a63578063715018a614610a83578063755edd1714610a9857806379ab3c8914610aab57600080fd5b80636ba9fd3814610a235780636d3de80614610a385780636eaf834414610a4d57600080fd5b8063547520fe1461098157806355228ca7146109a157806355f804b3146109bb57806358feaa59146109db57806360986a71146109f05780636352211e14610a0357600080fd5b806345c0f533116103d957806345c0f533146108bd578063464c3428146108f157806346f41ed5146109115780634783f0ef1461092b5780634ab8b5dd1461094b5780634f6ccce71461096157600080fd5b80633e3e0b121461081d57806340ccc0821461083257806342842e0e1461085257806343696f1814610872578063447abc7a1461089257806344eed881146108a757600080fd5b806323b872dd116104c45780632f745c591161047d5780632f745c5914610768578063330067861461078857806338b90333146107a85780633c003254146107d45780633d3f9c57146107e75780633e07311c1461080757600080fd5b806323b872dd146106d1578063286c8137146106f15780632913daa0146107115780632a000d4e146107275780632b5269b41461073d5780632eb4a7ab1461075257600080fd5b8063081812fc11610516578063081812fc14610653578063095ea7b3146106735780630c863bb61461069357806316b88a1d146106a857806318160ddd146105995780631aa4ba67146106bb57600080fd5b8062641e481461055c5780629a9b7b1461059957806301ffc9a7146105bc578063043a2a40146105ec5780630644cefa1461061c57806306fdde0314610631575b600080fd5b34801561056857600080fd5b5061057c610577366004614ac9565b611057565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156105a557600080fd5b506105ae611081565b604051908152602001610590565b3480156105c857600080fd5b506105dc6105d7366004614af8565b611095565b6040519015158152602001610590565b3480156105f857600080fd5b506105dc610607366004614b31565b600a6020526000908152604090205460ff1681565b61062f61062a366004614b4c565b611102565b005b34801561063d57600080fd5b5061064661127f565b6040516105909190614bce565b34801561065f57600080fd5b5061057c61066e366004614ac9565b611311565b34801561067f57600080fd5b5061062f61068e366004614b4c565b61139a565b34801561069f57600080fd5b506105dc61158d565b61062f6106b6366004614c2c565b6115af565b3480156106c757600080fd5b506105ae601e5481565b3480156106dd57600080fd5b5061062f6106ec366004614c9a565b611958565b3480156106fd57600080fd5b506105ae61070c366004614ac9565b611963565b34801561071d57600080fd5b506105ae60035481565b34801561073357600080fd5b506105ae60155481565b34801561074957600080fd5b5061062f611984565b34801561075e57600080fd5b506105ae601a5481565b34801561077457600080fd5b506105ae610783366004614b4c565b611a22565b34801561079457600080fd5b506105dc6107a3366004614cd6565b611b99565b3480156107b457600080fd5b50601f546107c29060ff1681565b60405160ff9091168152602001610590565b61062f6107e2366004614d28565b611c6f565b3480156107f357600080fd5b506105dc610802366004614b31565b611e10565b34801561081357600080fd5b506105ae60135481565b34801561082957600080fd5b5061062f611e33565b34801561083e57600080fd5b5061062f61084d366004614b4c565b611e84565b34801561085e57600080fd5b5061062f61086d366004614c9a565b611f75565b34801561087e57600080fd5b5061062f61088d366004614b31565b611f90565b34801561089e57600080fd5b506105ae61208d565b3480156108b357600080fd5b506105ae601c5481565b3480156108c957600080fd5b506105ae7f00000000000000000000000000000000000000000000000000000000000007e681565b3480156108fd57600080fd5b5061062f61090c366004614b31565b61209d565b34801561091d57600080fd5b506017546105dc9060ff1681565b34801561093757600080fd5b5061062f610946366004614ac9565b612106565b34801561095757600080fd5b506105ae60225481565b34801561096d57600080fd5b506105ae61097c366004614ac9565b6121a2565b34801561098d57600080fd5b5061062f61099c366004614ac9565b61220a565b3480156109ad57600080fd5b50601d546105dc9060ff1681565b3480156109c757600080fd5b5061062f6109d6366004614d81565b6122a5565b3480156109e757600080fd5b5061062f6122fb565b61062f6109fe366004614df2565b61234d565b348015610a0f57600080fd5b5061057c610a1e366004614ac9565b6126bf565b348015610a2f57600080fd5b5061062f6126d1565b348015610a4457600080fd5b5061062f612725565b348015610a5957600080fd5b506105ae60165481565b348015610a6f57600080fd5b506105ae610a7e366004614b31565b612776565b348015610a8f57600080fd5b5061062f612807565b61062f610aa6366004614b31565b61283b565b348015610ab757600080fd5b5061062f612963565b348015610acc57600080fd5b5060105461057c906001600160a01b031681565b348015610aec57600080fd5b5061062f610afb366004614e3c565b6129b7565b348015610b0c57600080fd5b5061062f612a27565b348015610b2157600080fd5b5061057c610b30366004614ac9565b612a86565b348015610b4157600080fd5b5061062f612a96565b348015610b5657600080fd5b506105ae60195481565b348015610b6c57600080fd5b506000546001600160a01b031661057c565b348015610b8a57600080fd5b506021546105dc9060ff1681565b348015610ba457600080fd5b5061062f610bb3366004614ac9565b612aea565b348015610bc457600080fd5b5061062f610bd3366004614ac9565b612b95565b348015610be457600080fd5b50601b546105dc90610100900460ff1681565b348015610c0357600080fd5b50610c17610c12366004614ac9565b612bdf565b6040805182516001600160a01b031681526020928301516001600160401b03169281019290925201610590565b348015610c5057600080fd5b50610646612bfc565b348015610c6557600080fd5b506105dc610c74366004614b31565b612c0b565b348015610c8557600080fd5b5061062f610c94366004614b4c565b612c88565b348015610ca557600080fd5b5061062f610cb4366004614e3c565b612e48565b348015610cc557600080fd5b5061062f610cd4366004614b31565b612fe8565b348015610ce557600080fd5b5061062f61314f565b348015610cfa57600080fd5b5061062f610d09366004614e89565b61319a565b348015610d1a57600080fd5b5061062f6131cd565b348015610d2f57600080fd5b5061062f61321e565b348015610d4457600080fd5b5061062f610d53366004614b31565b61326f565b348015610d6457600080fd5b5061062f613375565b348015610d7957600080fd5b5061062f610d88366004614ac9565b6133cb565b348015610d9957600080fd5b50600c5461057c906001600160a01b031681565b348015610db957600080fd5b50610646610dc8366004614ac9565b6133fa565b348015610dd957600080fd5b506105ae613458565b348015610dee57600080fd5b5061062f610dfd366004614b31565b613472565b348015610e0e57600080fd5b506106466134d8565b348015610e2357600080fd5b506105ae610e32366004614b31565b613566565b348015610e4357600080fd5b50610646613612565b348015610e5857600080fd5b506105ae600b5481565b348015610e6e57600080fd5b5061062f610e7d366004614f64565b613621565b348015610e8e57600080fd5b506105dc613695565b348015610ea357600080fd5b5061062f6136b2565b61062f610eba366004614cd6565b6136f8565b348015610ecb57600080fd5b5061062f610eda366004614b31565b613848565b348015610eeb57600080fd5b5061062f613944565b348015610f0057600080fd5b50601b546105dc9060ff1681565b348015610f1a57600080fd5b506105ae610f29366004614ac9565b613998565b348015610f3a57600080fd5b506105dc610f49366004614fa3565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b348015610f8357600080fd5b5061062f610f92366004614ac9565b6139a8565b348015610fa357600080fd5b506105ae610fb2366004614ac9565b613a72565b348015610fc357600080fd5b5061062f610fd2366004614b31565b613a82565b348015610fe357600080fd5b5061062f610ff2366004614ac9565b613b1a565b34801561100357600080fd5b5061062f613be7565b34801561101857600080fd5b5061062f613c18565b34801561102d57600080fd5b506105dc61103c366004614b4c565b613c63565b34801561104d57600080fd5b506105ae60145481565b600f818154811061106757600080fd5b6000918252602090912001546001600160a01b0316905081565b60006110906002546000190190565b905090565b60006001600160e01b031982166380ac58cd60e01b14806110c657506001600160e01b03198216635b5e139f60e01b145b806110e157506001600160e01b0319821663780e9d6360e01b145b806110fc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60175460ff161561112e5760405162461bcd60e51b815260040161112590614fd6565b60405180910390fd5b600181101561114f5760405162461bcd60e51b815260040161112590615021565b6003548111156111715760405162461bcd60e51b815260040161112590615058565b60215460ff161515600114801561118b5750601b5460ff16155b6111a75760405162461bcd60e51b8152600401611125906150a6565b6111af61158d565b15156001146111d05760405162461bcd60e51b8152600401611125906150eb565b6111da8282613c63565b6111f65760405162461bcd60e51b815260040161112590615120565b7f00000000000000000000000000000000000000000000000000000000000007e681611220611081565b61122a9190615186565b11156112485760405162461bcd60e51b81526004016111259061519e565b61125181613998565b341461126f5760405162461bcd60e51b8152600401611125906151e1565b61127b82826000613ce8565b5050565b60606004805461128e90615229565b80601f01602080910402602001604051908101604052809291908181526020018280546112ba90615229565b80156113075780601f106112dc57610100808354040283529160200191611307565b820191906000526020600020905b8154815290600101906020018083116112ea57829003601f168201915b5050505050905090565b600061131c82613d03565b61137e5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401611125565b506000908152600860205260409020546001600160a01b031690565b60006113a5826126bf565b9050806001600160a01b0316836001600160a01b031614156114145760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401611125565b6001600160a01b0383166000908152600a602052604090205460ff16156114ef5760405162461bcd60e51b815260206004820152607f60248201527f45524337323152657374726963746564417070726f76616c3a2041646472657360448201527f7320746f20617070726f766520686173206265656e207265737472696374656460648201527f20627920636f6e7472616374206f776e657220616e64206973206e6f7420616c60848201527f6c6f77656420746f206265206d61726b656420666f7220617070726f76616c0060a482015260c401611125565b336001600160a01b038216148061150b575061150b8133610f49565b61157d5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401611125565b611588838383613d19565b505050565b601b54600090610100900460ff166115a55750600190565b50601c5442101590565b601b5460ff16151560011480156115cd575060215460ff1615156001145b6115e95760405162461bcd60e51b815260040161112590615264565b6115f4858484611b99565b6116105760405162461bcd60e51b81526004016111259061529b565b60018410156116315760405162461bcd60e51b815260040161112590615021565b6003548411156116535760405162461bcd60e51b815260040161112590615058565b61165d8585613c63565b6116795760405162461bcd60e51b815260040161112590615120565b7f00000000000000000000000000000000000000000000000000000000000007e6846116a3611081565b6116ad9190615186565b11156116cb5760405162461bcd60e51b81526004016111259061519e565b6116d3613695565b15156001146116f45760405162461bcd60e51b8152600401611125906152d2565b6116fd81611e10565b6117195760405162461bcd60e51b815260040161112590615315565b60008461172583613566565b61172f919061535e565b6040516370a0823160e01b81526001600160a01b03888116600483015291925083918391908316906370a082319060240160206040518083038186803b15801561177857600080fd5b505afa15801561178c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b0919061537d565b10156117ce5760405162461bcd60e51b815260040161112590615396565b604051636eb1769f60e11b81526001600160a01b03888116600483015230602483015283919083169063dd62ed3e9060440160206040518083038186803b15801561181857600080fd5b505afa15801561182c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611850919061537d565b101561186e5760405162461bcd60e51b8152600401611125906153f3565b601654341461188f5760405162461bcd60e51b81526004016111259061545a565b6040516323b872dd60e01b81526001600160a01b03888116600483015230602483015260448201849052600091908316906323b872dd90606401602060405180830381600087803b1580156118e357600080fd5b505af11580156118f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191b919061549e565b90508061193a5760405162461bcd60e51b8152600401611125906154bb565b61194688886000613ce8565b61194e613d75565b5050505050505050565b611588838383613d90565b6011818154811061197357600080fd5b600091825260209091200154905081565b600c546001600160a01b031633146119ae5760405162461bcd60e51b815260040161112590615504565b600060155411611a185760405162461bcd60e51b815260206004820152602f60248201527f576974686472617761626c6556323a204e6f2052616d7070207375726368617260448201526e33b2b99034b7103130b630b731b29760891b6064820152608401611125565b611a20614110565b565b6000611a2d83612776565b8210611a865760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401611125565b6000611a90611081565b905060008060005b83811015611b39576000818152600660209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611aea57805192505b876001600160a01b0316836001600160a01b03161415611b265786841415611b18575093506110fc92505050565b83611b228161553b565b9450505b5080611b318161553b565b915050611a98565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401611125565b601a54600090611beb5760405162461bcd60e51b815260206004820152601760248201527f4d65726b6c6520726f6f74206973206e6f7420736574210000000000000000006044820152606401611125565b6040516bffffffffffffffffffffffff19606086901b166020820152600090603401604051602081830303815290604052805190602001209050611c6684848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601a5491508490506141b1565b95945050505050565b60175460ff1615611c925760405162461bcd60e51b815260040161112590614fd6565b601b5460ff1615156001148015611cb0575060215460ff1615156001145b611ccc5760405162461bcd60e51b815260040161112590615264565b611cd7848383611b99565b611cf35760405162461bcd60e51b81526004016111259061529b565b6001831015611d145760405162461bcd60e51b815260040161112590615021565b600354831115611d365760405162461bcd60e51b815260040161112590615058565b611d408484613c63565b611d5c5760405162461bcd60e51b815260040161112590615120565b7f00000000000000000000000000000000000000000000000000000000000007e683611d86611081565b611d909190615186565b1115611dae5760405162461bcd60e51b81526004016111259061519e565b611db783613998565b3414611dd55760405162461bcd60e51b8152600401611125906151e1565b611ddd613695565b1515600114611dfe5760405162461bcd60e51b8152600401611125906152d2565b611e0a84846000613ce8565b50505050565b6001600160a01b03166000908152600d602052604090205460ff16151560011490565b600080546001600160a01b0316339081149190611e4f90612c0b565b90508180611e5a5750805b611e765760405162461bcd60e51b815260040161112590615556565b50506021805460ff19169055565b600080546001600160a01b0316339081149190611ea090612c0b565b90508180611eab5750805b611ec75760405162461bcd60e51b815260040161112590615556565b60008311611f175760405162461bcd60e51b815260206004820152601b60248201527f4d757374206d696e74206174206c65617374203120746f6b656e2e00000000006044820152606401611125565b7f00000000000000000000000000000000000000000000000000000000000007e683611f41611081565b611f4b9190615186565b1115611f695760405162461bcd60e51b81526004016111259061519e565b611e0a84846001613ce8565b6115888383836040518060200160405280600081525061319a565b6000546001600160a01b03163314611fba5760405162461bcd60e51b81526004016111259061559f565b6001600160a01b0381166120025760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401611125565b61200b81612c0b565b156120665760405162461bcd60e51b815260206004820152602560248201527f54686973206164647265737320697320616c726561647920696e20796f7572206044820152643a32b0b69760d91b6064820152608401611125565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b60006015544761109091906155d4565b600080546001600160a01b03163390811491906120b990612c0b565b905081806120c45750805b6120e05760405162461bcd60e51b815260040161112590615556565b50506001600160a01b03166000908152600d60205260409020805460ff19166001179055565b600080546001600160a01b031633908114919061212290612c0b565b9050818061212d5750805b6121495760405162461bcd60e51b815260040161112590615556565b601a5483141561219b5760405162461bcd60e51b815260206004820152601e60248201527f4d65726b6c6520726f6f742077696c6c20626520756e6368616e6765642100006044820152606401611125565b5050601a55565b60006121ac611081565b82106122065760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401611125565b5090565b600080546001600160a01b031633908114919061222690612c0b565b905081806122315750805b61224d5760405162461bcd60e51b815260040161112590615556565b600183101561229e5760405162461bcd60e51b815260206004820152601b60248201527f4d6178206d696e74206d757374206265206174206c65617374203100000000006044820152606401611125565b5050600355565b600080546001600160a01b03163390811491906122c190612c0b565b905081806122cc5750805b6122e85760405162461bcd60e51b815260040161112590615556565b6122f460208585614a39565b5050505050565b600080546001600160a01b031633908114919061231790612c0b565b905081806123225750805b61233e5760405162461bcd60e51b815260040161112590615556565b5050601b805461ff0019169055565b600182101561236e5760405162461bcd60e51b815260040161112590615021565b6003548211156123905760405162461bcd60e51b815260040161112590615058565b7f00000000000000000000000000000000000000000000000000000000000007e66123b9613458565b11156123d75760405162461bcd60e51b81526004016111259061519e565b60215460ff16151560011480156123f15750601b5460ff16155b61240d5760405162461bcd60e51b8152600401611125906150a6565b61241561158d565b15156001146124365760405162461bcd60e51b8152600401611125906150eb565b612441836001613c63565b61245d5760405162461bcd60e51b815260040161112590615120565b61246681611e10565b6124825760405162461bcd60e51b815260040161112590615315565b60008261248e83613566565b612498919061535e565b6040516370a0823160e01b81526001600160a01b03868116600483015291925083918391908316906370a082319060240160206040518083038186803b1580156124e157600080fd5b505afa1580156124f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612519919061537d565b10156125375760405162461bcd60e51b815260040161112590615396565b604051636eb1769f60e11b81526001600160a01b03868116600483015230602483015283919083169063dd62ed3e9060440160206040518083038186803b15801561258157600080fd5b505afa158015612595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b9919061537d565b10156125d75760405162461bcd60e51b8152600401611125906153f3565b60165434146125f85760405162461bcd60e51b81526004016111259061545a565b6040516323b872dd60e01b81526001600160a01b03868116600483015230602483015260448201849052600091908316906323b872dd90606401602060405180830381600087803b15801561264c57600080fd5b505af1158015612660573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612684919061549e565b9050806126a35760405162461bcd60e51b8152600401611125906154bb565b6126af86866000613ce8565b6126b7613d75565b505050505050565b60006126ca826141c7565b5192915050565b600080546001600160a01b03163390811491906126ed90612c0b565b905081806126f85750805b6127145760405162461bcd60e51b815260040161112590615556565b50506021805460ff19166001179055565b600080546001600160a01b031633908114919061274190612c0b565b9050818061274c5750805b6127685760405162461bcd60e51b815260040161112590615556565b5050601b805460ff19169055565b60006001600160a01b0382166127e25760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401611125565b506001600160a01b03166000908152600760205260409020546001600160801b031690565b6000546001600160a01b031633146128315760405162461bcd60e51b81526004016111259061559f565b611a2060006142f5565b60175460ff161561285e5760405162461bcd60e51b815260040161112590614fd6565b7f00000000000000000000000000000000000000000000000000000000000007e6612887613458565b11156128a55760405162461bcd60e51b81526004016111259061519e565b60215460ff16151560011480156128bf5750601b5460ff16155b6128db5760405162461bcd60e51b8152600401611125906150a6565b6128e361158d565b15156001146129045760405162461bcd60e51b8152600401611125906150eb565b61290f816001613c63565b61292b5760405162461bcd60e51b815260040161112590615120565b6129356001613998565b34146129535760405162461bcd60e51b8152600401611125906155eb565b6129608160016000613ce8565b50565b600080546001600160a01b031633908114919061297f90612c0b565b9050818061298a5750805b6129a65760405162461bcd60e51b815260040161112590615556565b5050601b805460ff19166001179055565b600080546001600160a01b03163390811491906129d390612c0b565b905081806129de5750805b6129fa5760405162461bcd60e51b815260040161112590615556565b50506001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b600080546001600160a01b0316339081149190612a4390612c0b565b90508180612a4e5750805b612a6a5760405162461bcd60e51b815260040161112590615556565b6000612a7461208d565b11612a7e57600080fd5b61127b614345565b600e818154811061106757600080fd5b600080546001600160a01b0316339081149190612ab290612c0b565b90508180612abd5750805b612ad95760405162461bcd60e51b815260040161112590615556565b50506017805460ff19166001179055565b600080546001600160a01b0316339081149190612b0690612c0b565b90508180612b115750805b612b2d5760405162461bcd60e51b815260040161112590615556565b6001831015612b8e5760405162461bcd60e51b815260206004820152602760248201527f4d6178206d696e7473207065722077616c6c6574206d757374206265206174206044820152666c65617374203160c81b6064820152608401611125565b5050602255565b600080546001600160a01b0316339081149190612bb190612c0b565b90508180612bbc5750805b612bd85760405162461bcd60e51b815260040161112590615556565b5050601955565b60408051808201909152600080825260208201526110fc826141c7565b60606005805461128e90615229565b60006001600160a01b038216612c635760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206164647265737320746f20636865636b2e000000000000006044820152606401611125565b506001600160a01b031660009081526001602081905260409091205460ff1615151490565b600080546001600160a01b0316339081149190612ca490612c0b565b90508180612caf5750805b612ccb5760405162461bcd60e51b815260040161112590615556565b60008311612cd857600080fd5b6040516370a0823160e01b8152306004820152849084906001600160a01b038316906370a082319060240160206040518083038186803b158015612d1b57600080fd5b505afa158015612d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d53919061537d565b1015612db95760405162461bcd60e51b815260206004820152602f60248201527f576974686472617756323a20436f6e747261637420646f6573206e6f74206f7760448201526e6e20656e6f75676820746f6b656e7360881b6064820152608401611125565b60105460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018690529082169063a9059cbb90604401602060405180830381600087803b158015612e0757600080fd5b505af1158015612e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3f919061549e565b506122f4614110565b6001600160a01b038216331415612ea15760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401611125565b6001600160a01b0382166000908152600a602052604090205460ff1615612f7c5760405162461bcd60e51b815260206004820152607d60248201527f45524337323152657374726963746564417070726f76616c3a204f706572617460448201527f6f72206164647265737320686173206265656e2072657374726963746564206260648201527f7920636f6e7472616374206f776e657220616e64206973206e6f7420616c6c6f60848201527f77656420746f206265206d61726b656420666f7220617070726f76616c00000060a482015260c401611125565b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600080546001600160a01b031633908114919061300490612c0b565b9050818061300f5750805b61302b5760405162461bcd60e51b815260040161112590615556565b6001600160a01b0383166130a75760405162461bcd60e51b815260206004820152603c60248201527f576974686472617761626c6556323a206e6577204552432d3230207061796f7560448201527f742063616e6e6f7420626520746865207a65726f2061646472657373000000006064820152608401611125565b6010546001600160a01b038481169116141561312b5760405162461bcd60e51b815260206004820152603b60248201527f576974686472617761626c6556323a206e6577204552432d3230207061796f7560448201527f742069732073616d652061732063757272656e74207061796f757400000000006064820152608401611125565b5050601080546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b031633908114919061316b90612c0b565b905081806131765750805b6131925760405162461bcd60e51b815260040161112590615556565b611e76612725565b6131a5848484613d90565b6131b1848484846143b9565b611e0a5760405162461bcd60e51b815260040161112590615632565b600080546001600160a01b03163390811491906131e990612c0b565b905081806131f45750805b6132105760405162461bcd60e51b815260040161112590615556565b50506017805460ff19169055565b600080546001600160a01b031633908114919061323a90612c0b565b905081806132455750805b6132615760405162461bcd60e51b815260040161112590615556565b5050601d805460ff19169055565b600c546001600160a01b031633146132995760405162461bcd60e51b815260040161112590615504565b600c546001600160a01b03828116911614156133135760405162461bcd60e51b815260206004820152603360248201527f576974686472617761626c6556323a204e65772052616d7070206164647265736044820152721cc81b5d5cdd08189948191a5999995c995b9d606a1b6064820152608401611125565b600c80546001600160a01b0319166001600160a01b038316179055600e805482919060009061334457613344615685565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050565b600080546001600160a01b031633908114919061339190612c0b565b9050818061339c5750805b6133b85760405162461bcd60e51b815260040161112590615556565b5050601b805461ff001916610100179055565b600c546001600160a01b031633146133f55760405162461bcd60e51b815260040161112590615504565b601655565b60606000613406613612565b905060008151116134265760405180602001604052806000815250613451565b80613430846144c7565b60405160200161344192919061569b565b6040516020818303038152906040525b9392505050565b60006134676002546000190190565b611090906001615186565b600080546001600160a01b031633908114919061348e90612c0b565b905081806134995750805b6134b55760405162461bcd60e51b815260040161112590615556565b50506001600160a01b03166000908152600d60205260409020805460ff19169055565b602080546134e590615229565b80601f016020809104026020016040519081016040528092919081815260200182805461351190615229565b801561355e5780601f106135335761010080835404028352916020019161355e565b820191906000526020600020905b81548152906001019060200180831161354157829003601f168201915b505050505081565b600061357182611e10565b6135f35760405162461bcd60e51b815260206004820152604760248201527f54686973204552432d323020636f6e7472616374206973206e6f74206170707260448201527f6f76656420746f206d616b65207061796d656e7473206f6e207468697320636f6064820152666e74726163742160c81b608482015260a401611125565b506001600160a01b03166000908152600d602052604090206001015490565b60606020805461128e90615229565b600080546001600160a01b031633908114919061363d90612c0b565b905081806136485750805b6136645760405162461bcd60e51b815260040161112590615556565b50506001600160a01b03929092166000908152600d60205260409020805460ff191691151591909117815560010155565b601d5460009060ff166136a85750600190565b50601e5442101590565b600c546001600160a01b031633146136dc5760405162461bcd60e51b815260040161112590615504565b60006136e661208d565b116136f057600080fd5b611a20614345565b60175460ff161561371b5760405162461bcd60e51b815260040161112590614fd6565b601b5460ff1615156001148015613739575060215460ff1615156001145b6137555760405162461bcd60e51b815260040161112590615264565b613760838383611b99565b61377c5760405162461bcd60e51b81526004016111259061529b565b7f00000000000000000000000000000000000000000000000000000000000007e66137a5613458565b11156137c35760405162461bcd60e51b81526004016111259061519e565b6137ce836001613c63565b6137ea5760405162461bcd60e51b815260040161112590615120565b6137f46001613998565b34146138125760405162461bcd60e51b8152600401611125906155eb565b61381a613695565b151560011461383b5760405162461bcd60e51b8152600401611125906152d2565b6115888360016000613ce8565b6000546001600160a01b031633146138725760405162461bcd60e51b81526004016111259061559f565b6001600160a01b0381166138ba5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401611125565b6138c381612c0b565b6139235760405162461bcd60e51b815260206004820152602b60248201527f546869732061646472657373206973206e6f7420696e20796f7572207465616d60448201526a1031bab93932b73a363c9760a91b6064820152608401611125565b6001600160a01b03166000908152600160205260409020805460ff19169055565b600080546001600160a01b031633908114919061396090612c0b565b9050818061396b5750805b6139875760405162461bcd60e51b815260040161112590615556565b5050601d805460ff19166001179055565b6000816019546110fc919061535e565b600080546001600160a01b03163390811491906139c490612c0b565b905081806139cf5750805b6139eb5760405162461bcd60e51b815260040161112590615556565b428311613a6b5760405162461bcd60e51b815260206004820152604260248201527f44726f702064617465206d75737420626520696e2066757475726521204f746860448201527f6572776973652063616c6c2064697361626c655075626c696344726f7054696d606482015261652160f01b608482015260a401611125565b5050601c55565b6012818154811061197357600080fd5b6000546001600160a01b03163314613aac5760405162461bcd60e51b81526004016111259061559f565b6001600160a01b038116613b115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611125565b612960816142f5565b600080546001600160a01b0316339081149190613b3690612c0b565b90508180613b415750805b613b5d5760405162461bcd60e51b815260040161112590615556565b428311613be05760405162461bcd60e51b815260206004820152604560248201527f44726f702064617465206d75737420626520696e2066757475726521204f746860448201527f6572776973652063616c6c2064697361626c65416c6c6f776c69737444726f7060648201526454696d652160d81b608482015260a401611125565b5050601e55565b600c546001600160a01b03163314613c115760405162461bcd60e51b815260040161112590615504565b6000601555565b600080546001600160a01b0316339081149190613c3490612c0b565b90508180613c3f5750805b613c5b5760405162461bcd60e51b815260040161112590615556565b612714612963565b60006001821015613cc85760405162461bcd60e51b815260206004820152602960248201527f416d6f756e74206d7573742062652067726561746572207468616e206f7220656044820152687175616c20746f203160b81b6064820152608401611125565b60225482613cd5856145c4565b613cdf9190615186565b11159392505050565b61158883838360405180602001604052806000815250614662565b6000816001111580156110fc5750506002541190565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60165460156000828254613d899190615186565b9091555050565b6000613d9b826141c7565b80519091506000906001600160a01b0316336001600160a01b03161480613dd2575033613dc784611311565b6001600160a01b0316145b80613de457508151613de49033610f49565b905080613e4e5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401611125565b846001600160a01b031682600001516001600160a01b031614613ec25760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401611125565b6001600160a01b038416613f265760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401611125565b613f366000848460000151613d19565b6001600160a01b0385166000908152600760205260408120805460019290613f689084906001600160801b03166156ca565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526007602052604081208054600194509092613fb4918591166156f2565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526006909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561403b846001615186565b6000818152600660205260409020549091506001600160a01b03166140ca5761406381613d03565b156140ca5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600690935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126b7565b6015548061411b5750565b60005b6014548110156141a857614196600f828154811061413e5761413e615685565b9060005260206000200160009054906101000a90046001600160a01b031660646012848154811061417157614171615685565b906000526020600020015485614187919061535e565b614191919061572a565b61492f565b806141a08161553b565b91505061411e565b50506000601555565b6000826141be85846149c5565b14949350505050565b604080518082019091526000808252602082015281806001111580156141ee575060025481105b15614295576000818152600660209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561423f579392505050565b50600019016000818152600660209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215614290579392505050565b61423f565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401611125565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061434f61208d565b905060005b60135481101561127b576143a7600e828154811061437457614374615685565b9060005260206000200160009054906101000a90046001600160a01b031660646011848154811061417157614171615685565b806143b18161553b565b915050614354565b60006001600160a01b0384163b156144bb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906143fd90339089908890889060040161573e565b602060405180830381600087803b15801561441757600080fd5b505af1925050508015614447575060408051601f3d908101601f191682019092526144449181019061577b565b60015b6144a1573d808015614475576040519150601f19603f3d011682016040523d82523d6000602084013e61447a565b606091505b5080516144995760405162461bcd60e51b815260040161112590615632565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506144bf565b5060015b949350505050565b6060816144eb5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561451557806144ff8161553b565b915061450e9050600a8361572a565b91506144ef565b6000816001600160401b0381111561452f5761452f614e73565b6040519080825280601f01601f191660200182016040528015614559576020820181803683370190505b5090505b84156144bf5761456e6001836155d4565b915061457b600a86615798565b614586906030615186565b60f81b81838151811061459b5761459b615685565b60200101906001600160f81b031916908160001a9053506145bd600a8661572a565b945061455d565b60006001600160a01b0382166146365760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401611125565b506001600160a01b0316600090815260076020526040902054600160801b90046001600160801b031690565b6002546001600160a01b0385166146c55760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401611125565b6146ce81613d03565b1561471b5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401611125565b8261477d5760035484111561477d5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401611125565b6001600160a01b0385166000908152600760209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906147d99088906156f2565b6001600160801b03168152602001856147f257866147f5565b60005b836020015161480491906156f2565b6001600160801b039081169091526001600160a01b0380891660008181526007602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526006909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b868110156149235760405182906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46148e760008984886143b9565b6149035760405162461bcd60e51b815260040161112590615632565b8161490d8161553b565b925050808061491b9061553b565b91505061489a565b50600255505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461497c576040519150601f19603f3d011682016040523d82523d6000602084013e614981565b606091505b50509050806115885760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401611125565b600081815b8451811015614a315760008582815181106149e7576149e7615685565b60200260200101519050808311614a0d5760008381526020829052604090209250614a1e565b600081815260208490526040902092505b5080614a298161553b565b9150506149ca565b509392505050565b828054614a4590615229565b90600052602060002090601f016020900481019282614a675760008555614aad565b82601f10614a805782800160ff19823516178555614aad565b82800160010185558215614aad579182015b82811115614aad578235825591602001919060010190614a92565b506122069291505b808211156122065760008155600101614ab5565b600060208284031215614adb57600080fd5b5035919050565b6001600160e01b03198116811461296057600080fd5b600060208284031215614b0a57600080fd5b813561345181614ae2565b80356001600160a01b0381168114614b2c57600080fd5b919050565b600060208284031215614b4357600080fd5b61345182614b15565b60008060408385031215614b5f57600080fd5b614b6883614b15565b946020939093013593505050565b60005b83811015614b91578181015183820152602001614b79565b83811115611e0a5750506000910152565b60008151808452614bba816020860160208601614b76565b601f01601f19169290920160200192915050565b6020815260006134516020830184614ba2565b60008083601f840112614bf357600080fd5b5081356001600160401b03811115614c0a57600080fd5b6020830191508360208260051b8501011115614c2557600080fd5b9250929050565b600080600080600060808688031215614c4457600080fd5b614c4d86614b15565b94506020860135935060408601356001600160401b03811115614c6f57600080fd5b614c7b88828901614be1565b9094509250614c8e905060608701614b15565b90509295509295909350565b600080600060608486031215614caf57600080fd5b614cb884614b15565b9250614cc660208501614b15565b9150604084013590509250925092565b600080600060408486031215614ceb57600080fd5b614cf484614b15565b925060208401356001600160401b03811115614d0f57600080fd5b614d1b86828701614be1565b9497909650939450505050565b60008060008060608587031215614d3e57600080fd5b614d4785614b15565b93506020850135925060408501356001600160401b03811115614d6957600080fd5b614d7587828801614be1565b95989497509550505050565b60008060208385031215614d9457600080fd5b82356001600160401b0380821115614dab57600080fd5b818501915085601f830112614dbf57600080fd5b813581811115614dce57600080fd5b866020828501011115614de057600080fd5b60209290920196919550909350505050565b600080600060608486031215614e0757600080fd5b614e1084614b15565b925060208401359150614e2560408501614b15565b90509250925092565b801515811461296057600080fd5b60008060408385031215614e4f57600080fd5b614e5883614b15565b91506020830135614e6881614e2e565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215614e9f57600080fd5b614ea885614b15565b9350614eb660208601614b15565b92506040850135915060608501356001600160401b0380821115614ed957600080fd5b818701915087601f830112614eed57600080fd5b813581811115614eff57614eff614e73565b604051601f8201601f19908116603f01168101908382118183101715614f2757614f27614e73565b816040528281528a6020848701011115614f4057600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080600060608486031215614f7957600080fd5b614f8284614b15565b92506020840135614f9281614e2e565b929592945050506040919091013590565b60008060408385031215614fb657600080fd5b614fbf83614b15565b9150614fcd60208401614b15565b90509250929050565b6020808252602b908201527f4f6e6c79206d696e74696e672077697468204552432d323020746f6b656e732060408201526a34b99032b730b13632b21760a91b606082015260800190565b6020808252601a908201527f4d757374206d696e74206174206c65617374203120746f6b656e000000000000604082015260600190565b6020808252602e908201527f43616e6e6f74206d696e74206d6f7265207468616e206d6178206d696e74207060408201526d32b9103a3930b739b0b1ba34b7b760911b606082015260800190565b60208082526025908201527f5075626c6963206d696e74696e67206973206e6f74206f70656e207269676874604082015264206e6f772160d81b606082015260800190565b6020808252818101527f5075626c69632064726f702074696d6520686173206e6f742070617373656421604082015260600190565b60208082526030908201527f57616c6c65742061646472657373206973206f76657220746865206d6178696d60408201526f756d20616c6c6f776564206d696e747360801b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561519957615199615170565b500190565b60208082526023908201527f43616e6e6f74206d696e74206f76657220737570706c7920636170206f66203260408201526218191960e91b606082015260800190565b60208082526028908201527f56616c75652062656c6f77207265717569726564206d696e742066656520666f6040820152671c88185b5bdd5b9d60c21b606082015260800190565b600181811c9082168061523d57607f821691505b6020821081141561525e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601b908201527f416c6c6f776c697374206d696e74696e6720697320636c6f7365640000000000604082015260600190565b6020808252601c908201527f41646472657373206973206e6f7420696e20416c6c6f776c6973742100000000604082015260600190565b60208082526023908201527f416c6c6f776c6973742064726f702074696d6520686173206e6f74207061737360408201526265642160e81b606082015260800190565b60208082526029908201527f4552432d323020546f6b656e206973206e6f7420617070726f76656420666f72604082015268206d696e74696e672160b81b606082015260800190565b600081600019048311821515161561537857615378615170565b500290565b60006020828403121561538f57600080fd5b5051919050565b60208082526037908201527f427579657220646f6573206e6f74206f776e20656e6f756768206f6620746f6b60408201527f656e20746f20636f6d706c657465207075726368617365000000000000000000606082015260800190565b60208082526041908201527f427579657220646964206e6f7420617070726f766520656e6f756768206f662060408201527f4552432d323020746f6b656e20746f20636f6d706c65746520707572636861736060820152606560f81b608082015260a00190565b60208082526024908201527f46656520666f72204552432d3230207061796d656e74206e6f742070726f76696040820152636465642160e01b606082015260800190565b6000602082840312156154b057600080fd5b815161345181614e2e565b60208082526029908201527f4552432d323020746f6b656e2077617320756e61626c6520746f206265207472604082015268185b9cd9995c9c995960ba1b606082015260800190565b6020808252601c908201527f4f776e61626c653a2063616c6c6572206973206e6f742052414d505000000000604082015260600190565b600060001982141561554f5761554f615170565b5060010190565b60208082526029908201527f5465616d3a2063616c6c6572206973206e6f7420746865206f776e6572206f726040820152681034b7102a32b0b69760b91b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000828210156155e6576155e6615170565b500390565b60208082526027908201527f56616c7565206e6565647320746f2062652065786163746c7920746865206d696040820152666e74206665652160c81b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600083516156ad818460208801614b76565b8351908301906156c1818360208801614b76565b01949350505050565b60006001600160801b03838116908316818110156156ea576156ea615170565b039392505050565b60006001600160801b038083168185168083038211156156c1576156c1615170565b634e487b7160e01b600052601260045260246000fd5b60008261573957615739615714565b500490565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061577190830184614ba2565b9695505050505050565b60006020828403121561578d57600080fd5b815161345181614ae2565b6000826157a7576157a7615714565b50069056fea264697066735822122095bc8b83c43665d8e9575e689ae4932eaf8044d757af14b0a2a27e0247e7822e64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d131f1bcdd547e067af447dd3c36c99d6be9fdeb
-----Decoded View---------------
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d131f1bcdd547e067af447dd3c36c99d6be9fdeb
Deployed Bytecode Sourcemap
75710:110:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55575:59;;;;;;;;;;-1:-1:-1;55575:59:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;363:32:1;;;345:51;;333:2;318:18;55575:59:0;;;;;;;;36101:90;;;;;;;;;;;;;:::i;:::-;;;553:25:1;;;541:2;526:18;36101:90:0;407:177:1;37853:370:0;;;;;;;;;;-1:-1:-1;37853:370:0;;;;;:::i;:::-;;:::i;:::-;;;1140:14:1;;1133:22;1115:41;;1103:2;1088:18;37853:370:0;975:187:1;35057:59:0;;;;;;;;;;-1:-1:-1;35057:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;66161:863;;;;;;:::i;:::-;;:::i;:::-;;39918:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42249:204::-;;;;;;;;;;-1:-1:-1;42249:204:0;;;;;:::i;:::-;;:::i;41625:566::-;;;;;;;;;;-1:-1:-1;41625:566:0;;;;;:::i;:::-;;:::i;53346:180::-;;;;;;;;;;;;;:::i;71730:1685::-;;;;;;:::i;:::-;;:::i;53639:45::-;;;;;;;;;;;;;;;;43290:142;;;;;;;;;;-1:-1:-1;43290:142:0;;;;;:::i;:::-;;:::i;55716:38::-;;;;;;;;;;-1:-1:-1;55716:38:0;;;;;:::i;:::-;;:::i;33786:27::-;;;;;;;;;;;;;;;;55904:46;;;;;;;;;;;;;;;;58670:179;;;;;;;;;;;;;:::i;31704:25::-;;;;;;;;;;;;;;;;37045:744;;;;;;;;;;-1:-1:-1;37045:744:0;;;;;:::i;:::-;;:::i;32363:287::-;;;;;;;;;;-1:-1:-1;32363:287:0;;;;;:::i;:::-;;:::i;64248:33::-;;;;;;;;;;-1:-1:-1;64248:33:0;;;;;;;;;;;4780:4:1;4768:17;;;4750:36;;4738:2;4723:18;64248:33:0;4608:184:1;70407:979:0;;;;;;:::i;:::-;;:::i;59733:170::-;;;;;;;;;;-1:-1:-1;59733:170:0;;;;;:::i;:::-;;:::i;55809:38::-;;;;;;;;;;;;;;;;68999:84;;;;;;;;;;;;;:::i;64781:280::-;;;;;;;;;;-1:-1:-1;64781:280:0;;;;;:::i;:::-;;:::i;43495:157::-;;;;;;;;;;-1:-1:-1;43495:157:0;;;;;:::i;:::-;;:::i;27809:223::-;;;;;;;;;;-1:-1:-1;27809:223:0;;;;;:::i;:::-;;:::i;56283:126::-;;;;;;;;;;;;;:::i;52554:42::-;;;;;;;;;;;;;;;;33742:39;;;;;;;;;;;;;;;61335:161;;;;;;;;;;-1:-1:-1;61335:161:0;;;;;:::i;:::-;;:::i;56002:40::-;;;;;;;;;;-1:-1:-1;56002:40:0;;;;;;;;31943:197;;;;;;;;;;-1:-1:-1;31943:197:0;;;;;:::i;:::-;;:::i;64445:35::-;;;;;;;;;;;;;;;;36577:177;;;;;;;;;;-1:-1:-1;36577:177:0;;;;;:::i;:::-;;:::i;74942:179::-;;;;;;;;;;-1:-1:-1;74942:179:0;;;;;:::i;:::-;;:::i;53591:43::-;;;;;;;;;;-1:-1:-1;53591:43:0;;;;;;;;75350:106;;;;;;;;;;-1:-1:-1;75350:106:0;;;;;:::i;:::-;;:::i;53109:98::-;;;;;;;;;;;;;:::i;67351:1549::-;;;;;;:::i;:::-;;:::i;39741:118::-;;;;;;;;;;-1:-1:-1;39741:118:0;;;;;:::i;:::-;;:::i;68908:83::-;;;;;;;;;;;;;:::i;32771:103::-;;;;;;;;;;;;;:::i;55955:42::-;;;;;;;;;;;;;;;;38279:211;;;;;;;;;;-1:-1:-1;38279:211:0;;;;;:::i;:::-;;:::i;26323:103::-;;;;;;;;;;;;;:::i;65280:662::-;;;;;;:::i;:::-;;:::i;32664:99::-;;;;;;;;;;;;;:::i;55639:72::-;;;;;;;;;;-1:-1:-1;55639:72:0;;;;-1:-1:-1;;;;;55639:72:0;;;41412:159;;;;;;;;;;-1:-1:-1;41412:159:0;;;;;:::i;:::-;;:::i;56415:119::-;;;;;;;;;;;;;:::i;55477:93::-;;;;;;;;;;-1:-1:-1;55477:93:0;;;;;:::i;:::-;;:::i;62052:97::-;;;;;;;;;;;;;:::i;63691:33::-;;;;;;;;;;;;;;;;25674:87;;;;;;;;;;-1:-1:-1;25720:7:0;25747:6;-1:-1:-1;;;;;25747:6:0;25674:87;;64396:30;;;;;;;;;;-1:-1:-1;64396:30:0;;;;;;;;74566:200;;;;;;;;;;-1:-1:-1;74566:200:0;;;;;:::i;:::-;;:::i;63731:90::-;;;;;;;;;;-1:-1:-1;63731:90:0;;;;;:::i;:::-;;:::i;52509:40::-;;;;;;;;;;-1:-1:-1;52509:40:0;;;;;;;;;;;75462:128;;;;;;;;;;-1:-1:-1;75462:128:0;;;;;:::i;:::-;;:::i;:::-;;;;7171:13:1;;-1:-1:-1;;;;;7167:39:1;7149:58;;7267:4;7255:17;;;7249:24;-1:-1:-1;;;;;7245:49:1;7223:20;;;7216:79;;;;7122:18;75462:128:0;6939:362:1;40073:98:0;;;;;;;;;;;;;:::i;28548:188::-;;;;;;;;;;-1:-1:-1;28548:188:0;;;;;:::i;:::-;;:::i;58104:448::-;;;;;;;;;;-1:-1:-1;58104:448:0;;;;;:::i;:::-;;:::i;42517:465::-;;;;;;;;;;-1:-1:-1;42517:465:0;;;;;:::i;:::-;;:::i;62495:346::-;;;;;;;;;;-1:-1:-1;62495:346:0;;;;;:::i;:::-;;:::i;73842:128::-;;;;;;;;;;;;;:::i;43715:311::-;;;;;;;;;;-1:-1:-1;43715:311:0;;;;;:::i;:::-;;:::i;62236:99::-;;;;;;;;;;;;;:::i;54213:104::-;;;;;;;;;;;;;:::i;63376:238::-;;;;;;;;;;-1:-1:-1;63376:238:0;;;;;:::i;:::-;;:::i;53010:93::-;;;;;;;;;;;;;:::i;59444:111::-;;;;;;;;;;-1:-1:-1;59444:111:0;;;;;:::i;:::-;;:::i;51775:72::-;;;;;;;;;;-1:-1:-1;51775:72:0;;;;-1:-1:-1;;;;;51775:72:0;;;40234:288;;;;;;;;;;-1:-1:-1;40234:288:0;;;;;:::i;:::-;;:::i;36197:96::-;;;;;;;;;;;;;:::i;61803:163::-;;;;;;;;;;-1:-1:-1;61803:163:0;;;;;:::i;:::-;;:::i;64288:99::-;;;;;;;;;;;;;:::i;60061:301::-;;;;;;;;;;-1:-1:-1;60061:301:0;;;;;:::i;:::-;;:::i;75252:92::-;;;;;;;;;;;;;:::i;48323:43::-;;;;;;;;;;;;;;;;60728:304;;;;;;;;;;-1:-1:-1;60728:304:0;;;;;:::i;:::-;;:::i;54323:191::-;;;;;;;;;;;;;:::i;56542:116::-;;;;;;;;;;;;;:::i;69364:768::-;;;;;;:::i;:::-;;:::i;28175:234::-;;;;;;;;;;-1:-1:-1;28175:234:0;;;;;:::i;:::-;;:::i;54108:99::-;;;;;;;;;;;;;:::i;31736:37::-;;;;;;;;;;-1:-1:-1;31736:37:0;;;;;;;;63827:98;;;;;;;;;;-1:-1:-1;63827:98:0;;;;;:::i;:::-;;:::i;43045:186::-;;;;;;;;;;-1:-1:-1;43045:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;43190:25:0;;;43167:4;43190:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;43045:186;52774:230;;;;;;;;;;-1:-1:-1;52774:230:0;;;;;:::i;:::-;;:::i;55759:45::-;;;;;;;;;;-1:-1:-1;55759:45:0;;;;;:::i;:::-;;:::i;26579:201::-;;;;;;;;;;-1:-1:-1;26579:201:0;;;;;:::i;:::-;;:::i;53863:239::-;;;;;;;;;;-1:-1:-1;53863:239:0;;;;;:::i;:::-;;:::i;62953:97::-;;;;;;;;;;;;;:::i;73566:125::-;;;;;;;;;;;;;:::i;74131:242::-;;;;;;;;;;-1:-1:-1;74131:242:0;;;;;:::i;:::-;;:::i;55852:47::-;;;;;;;;;;;;;;;;55575:59;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55575:59:0;;-1:-1:-1;55575:59:0;:::o;36101:90::-;36148:7;36171:14;36465:12;;-1:-1:-1;;36465:30:0;;36376:132;36171:14;36164:21;;36101:90;:::o;37853:370::-;37980:4;-1:-1:-1;;;;;;38010:40:0;;-1:-1:-1;;;38010:40:0;;:99;;-1:-1:-1;;;;;;;38061:48:0;;-1:-1:-1;;;38061:48:0;38010:99;:160;;;-1:-1:-1;;;;;;;38120:50:0;;-1:-1:-1;;;38120:50:0;38010:160;:207;;;-1:-1:-1;;;;;;;;;;12168:40:0;;;38181:36;37996:221;37853:370;-1:-1:-1;;37853:370:0:o;66161:863::-;66249:20;;;;:29;66241:85;;;;-1:-1:-1;;;66241:85:0;;;;;;;:::i;:::-;;;;;;;;;66356:1;66345:7;:12;;66337:51;;;;-1:-1:-1;;;66337:51:0;;;;;;;:::i;:::-;66418:12;;66407:7;:23;;66399:82;;;;-1:-1:-1;;;66399:82:0;;;;;;;:::i;:::-;66500:11;;;;:19;;:11;:19;:49;;;;-1:-1:-1;66523:17:0;;;;:26;66500:49;66492:99;;;;-1:-1:-1;;;66492:99:0;;;;;;;:::i;:::-;66610:22;:20;:22::i;:::-;:30;;66636:4;66610:30;66602:75;;;;-1:-1:-1;;;66602:75:0;;;;;;;:::i;:::-;66696:27;66710:3;66715:7;66696:13;:27::i;:::-;66688:88;;;;-1:-1:-1;;;66688:88:0;;;;;;;:::i;:::-;66825:14;66814:7;66795:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;66787:92;;;;-1:-1:-1;;;66787:92:0;;;;;;;:::i;:::-;66911:17;66920:7;66911:8;:17::i;:::-;66898:9;:30;66890:83;;;;-1:-1:-1;;;66890:83:0;;;;;;;:::i;:::-;66986:30;66996:3;67001:7;67010:5;66986:9;:30::i;:::-;66161:863;;:::o;39918:94::-;39972:13;40001:5;39994:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39918:94;:::o;42249:204::-;42317:7;42341:16;42349:7;42341;:16::i;:::-;42333:74;;;;-1:-1:-1;;;42333:74:0;;13265:2:1;42333:74:0;;;13247:21:1;13304:2;13284:18;;;13277:30;13343:34;13323:18;;;13316:62;-1:-1:-1;;;13394:18:1;;;13387:43;13447:19;;42333:74:0;13063:409:1;42333:74:0;-1:-1:-1;42423:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42423:24:0;;42249:204::o;41625:566::-;41694:13;41710:24;41726:7;41710:15;:24::i;:::-;41694:40;;41755:5;-1:-1:-1;;;;;41749:11:0;:2;-1:-1:-1;;;;;41749:11:0;;;41741:58;;;;-1:-1:-1;;;41741:58:0;;13679:2:1;41741:58:0;;;13661:21:1;13718:2;13698:18;;;13691:30;13757:34;13737:18;;;13730:62;-1:-1:-1;;;13808:18:1;;;13801:32;13850:19;;41741:58:0;13477:398:1;41741:58:0;-1:-1:-1;;;;;41814:31:0;;;;;;:27;:31;;;;;;;;:40;41806:180;;;;-1:-1:-1;;;41806:180:0;;14082:2:1;41806:180:0;;;14064:21:1;14121:3;14101:18;;;14094:31;14161:34;14141:18;;;14134:62;14232:34;14212:18;;;14205:62;14304:34;14283:19;;;14276:63;14376:33;14355:19;;;14348:62;14427:19;;41806:180:0;13880:572:1;41806:180:0;24480:10;-1:-1:-1;;;;;42011:21:0;;;;:62;;-1:-1:-1;42036:37:0;42053:5;24480:10;43045:186;:::i;42036:37::-;41995:153;;;;-1:-1:-1;;;41995:153:0;;14659:2:1;41995:153:0;;;14641:21:1;14698:2;14678:18;;;14671:30;14737:34;14717:18;;;14710:62;14808:27;14788:18;;;14781:55;14853:19;;41995:153:0;14457:421:1;41995:153:0;42157:28;42166:2;42170:7;42179:5;42157:8;:28::i;:::-;41687:504;41625:566;;:::o;53346:180::-;53414:21;;53398:4;;53414:21;;;;;53411:63;;-1:-1:-1;53462:4:0;;53346:180::o;53411:63::-;-1:-1:-1;53506:14:0;;53487:15;:33;;;53346:180::o;71730:1685::-;71885:17;;;;:25;;:17;:25;:48;;;;-1:-1:-1;71914:11:0;;;;:19;;:11;:19;71885:48;71877:88;;;;-1:-1:-1;;;71877:88:0;;;;;;;:::i;:::-;71982:32;71996:3;72001:12;;71982:13;:32::i;:::-;71974:73;;;;-1:-1:-1;;;71974:73:0;;;;;;;:::i;:::-;72075:1;72064:7;:12;;72056:51;;;;-1:-1:-1;;;72056:51:0;;;;;;;:::i;:::-;72135:12;;72124:7;:23;;72116:82;;;;-1:-1:-1;;;72116:82:0;;;;;;;:::i;:::-;72215:27;72229:3;72234:7;72215:13;:27::i;:::-;72207:88;;;;-1:-1:-1;;;72207:88:0;;;;;;;:::i;:::-;72342:14;72331:7;72312:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;72304:92;;;;-1:-1:-1;;;72304:92:0;;;;;;;:::i;:::-;72413:25;:23;:25::i;:::-;:33;;72442:4;72413:33;72405:81;;;;-1:-1:-1;;;72405:81:0;;;;;;;:::i;:::-;72553:47;72580:19;72553:26;:47::i;:::-;72545:101;;;;-1:-1:-1;;;72545:101:0;;;;;;;:::i;:::-;72655:27;72729:7;72685:41;72706:19;72685:20;:41::i;:::-;:51;;;;:::i;:::-;72817:27;;-1:-1:-1;;;72817:27:0;;-1:-1:-1;;;;;363:32:1;;;72817:27:0;;;345:51:1;72655:81:0;;-1:-1:-1;72774:19:0;;72655:81;;72817:22;;;;;;318:18:1;;72817:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;72809:118;;;;-1:-1:-1;;;72809:118:0;;;;;;;:::i;:::-;72944:42;;-1:-1:-1;;;72944:42:0;;-1:-1:-1;;;;;17426:15:1;;;72944:42:0;;;17408:34:1;72980:4:0;17458:18:1;;;17451:43;72990:19:0;;72944:22;;;;;;17343:18:1;;72944:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;72936:143;;;;-1:-1:-1;;;72936:143:0;;;;;;;:::i;:::-;59227:17;;59214:9;:30;73088:63;;;;-1:-1:-1;;;73088:63:0;;;;;;;:::i;:::-;73192:66;;-1:-1:-1;;;73192:66:0;;-1:-1:-1;;;;;18642:15:1;;;73192:66:0;;;18624:34:1;73231:4:0;18674:18:1;;;18667:43;18726:18;;;18719:34;;;73168:21:0;;73192:25;;;;;;18559:18:1;;73192:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73168:90;;73275:16;73267:70;;;;-1:-1:-1;;;73267:70:0;;;;;;;:::i;:::-;73354:30;73364:3;73369:7;73378:5;73354:9;:30::i;:::-;73393:14;:12;:14::i;:::-;71868:1547;;;71730:1685;;;;;:::o;43290:142::-;43398:28;43408:4;43414:2;43418:7;43398:9;:28::i;55716:38::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55716:38:0;:::o;58670:179::-;51904:12;;-1:-1:-1;;;;;51904:12:0;51890:10;:26;51882:67;;;;-1:-1:-1;;;51882:67:0;;;;;;;:::i;:::-;58759:1:::1;58735:21;;:25;58727:85;;;::::0;-1:-1:-1;;;58727:85:0;;19983:2:1;58727:85:0::1;::::0;::::1;19965:21:1::0;20022:2;20002:18;;;19995:30;20061:34;20041:18;;;20034:62;-1:-1:-1;;;20112:18:1;;;20105:45;20167:19;;58727:85:0::1;19781:411:1::0;58727:85:0::1;58819:24;:22;:24::i;:::-;58670:179::o:0;37045:744::-;37154:7;37189:16;37199:5;37189:9;:16::i;:::-;37181:5;:24;37173:71;;;;-1:-1:-1;;;37173:71:0;;20399:2:1;37173:71:0;;;20381:21:1;20438:2;20418:18;;;20411:30;20477:34;20457:18;;;20450:62;-1:-1:-1;;;20528:18:1;;;20521:32;20570:19;;37173:71:0;20197:398:1;37173:71:0;37251:22;37276:13;:11;:13::i;:::-;37251:38;;37296:19;37326:25;37376:9;37371:350;37395:14;37391:1;:18;37371:350;;;37425:31;37459:14;;;:11;:14;;;;;;;;;37425:48;;;;;;;;;-1:-1:-1;;;;;37425:48:0;;;;;-1:-1:-1;;;37425:48:0;;;-1:-1:-1;;;;;37425:48:0;;;;;;;;37486:28;37482:89;;37547:14;;;-1:-1:-1;37482:89:0;37604:5;-1:-1:-1;;;;;37583:26:0;:17;-1:-1:-1;;;;;37583:26:0;;37579:135;;;37641:5;37626:11;:20;37622:59;;;-1:-1:-1;37668:1:0;-1:-1:-1;37661:8:0;;-1:-1:-1;;;37661:8:0;37622:59;37691:13;;;;:::i;:::-;;;;37579:135;-1:-1:-1;37411:3:0;;;;:::i;:::-;;;;37371:350;;;-1:-1:-1;37727:56:0;;-1:-1:-1;;;37727:56:0;;20942:2:1;37727:56:0;;;20924:21:1;20981:2;20961:18;;;20954:30;21020:34;21000:18;;;20993:62;-1:-1:-1;;;21071:18:1;;;21064:44;21125:19;;37727:56:0;20740:410:1;32363:287:0;32475:10;;32452:4;;32467:51;;;;-1:-1:-1;;;32467:51:0;;21357:2:1;32467:51:0;;;21339:21:1;21396:2;21376:18;;;21369:30;21435:25;21415:18;;;21408:53;21478:18;;32467:51:0;21155:347:1;32467:51:0;32552:21;;-1:-1:-1;;21656:2:1;21652:15;;;21648:53;32552:21:0;;;21636:66:1;32527:12:0;;21718::1;;32552:21:0;;;;;;;;;;;;32542:32;;;;;;32527:47;;32592:50;32611:12;;32592:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32625:10:0;;;-1:-1:-1;32637:4:0;;-1:-1:-1;32592:18:0;:50::i;:::-;32585:57;32363:287;-1:-1:-1;;;;;32363:287:0:o;70407:979::-;70530:20;;;;:29;70522:85;;;;-1:-1:-1;;;70522:85:0;;;;;;;:::i;:::-;70626:17;;;;:25;;:17;:25;:48;;;;-1:-1:-1;70655:11:0;;;;:19;;:11;:19;70626:48;70618:88;;;;-1:-1:-1;;;70618:88:0;;;;;;;:::i;:::-;70725:32;70739:3;70744:12;;70725:13;:32::i;:::-;70717:73;;;;-1:-1:-1;;;70717:73:0;;;;;;;:::i;:::-;70820:1;70809:7;:12;;70801:51;;;;-1:-1:-1;;;70801:51:0;;;;;;;:::i;:::-;70882:12;;70871:7;:23;;70863:82;;;;-1:-1:-1;;;70863:82:0;;;;;;;:::i;:::-;70966:27;70980:3;70985:7;70966:13;:27::i;:::-;70958:88;;;;-1:-1:-1;;;70958:88:0;;;;;;;:::i;:::-;71095:14;71084:7;71065:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;71057:92;;;;-1:-1:-1;;;71057:92:0;;;;;;;:::i;:::-;71181:17;71190:7;71181:8;:17::i;:::-;71168:9;:30;71160:83;;;;-1:-1:-1;;;71160:83:0;;;;;;;:::i;:::-;71262:25;:23;:25::i;:::-;:33;;71291:4;71262:33;71254:81;;;;-1:-1:-1;;;71254:81:0;;;;;;;:::i;:::-;71348:30;71358:3;71363:7;71372:5;71348:9;:30::i;:::-;70407:979;;;;:::o;59733:170::-;-1:-1:-1;;;;;59838:42:0;59818:4;59838:42;;;:21;:42;;;;;:51;;;:59;;:51;:59;;59733:170::o;68999:84::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;69056:11:0::1;:19:::0;;-1:-1:-1;;69056:19:0::1;::::0;;68999:84::o;64781:280::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;64880:1:::1;64873:4;:8;64865:48;;;::::0;-1:-1:-1;;;64865:48:0;;22353:2:1;64865:48:0::1;::::0;::::1;22335:21:1::0;22392:2;22372:18;;;22365:30;22431:29;22411:18;;;22404:57;22478:18;;64865:48:0::1;22151:351:1::0;64865:48:0::1;64960:14;64952:4;64933:16;:14;:16::i;:::-;:23;;;;:::i;:::-;:41;;64925:89;;;;-1:-1:-1::0;;;64925:89:0::1;;;;;;;:::i;:::-;65026:26;65036:3;65041:4;65047;65026:9;:26::i;43495:157::-:0;43607:39;43624:4;43630:2;43634:7;43607:39;;;;;;;;;;;;:16;:39::i;27809:223::-;25720:7;25747:6;-1:-1:-1;;;;;25747:6:0;24480:10;25894:23;25886:68;;;;-1:-1:-1;;;25886:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27878:22:0;::::1;27870:50;;;::::0;-1:-1:-1;;;27870:50:0;;23070:2:1;27870:50:0::1;::::0;::::1;23052:21:1::0;23109:2;23089:18;;;23082:30;-1:-1:-1;;;23128:18:1;;;23121:45;23183:18;;27870:50:0::1;22868:339:1::0;27870:50:0::1;27936:16;27943:8;27936:6;:16::i;:::-;27935:17;27927:67;;;::::0;-1:-1:-1;;;27927:67:0;;23414:2:1;27927:67:0::1;::::0;::::1;23396:21:1::0;23453:2;23433:18;;;23426:30;23492:34;23472:18;;;23465:62;-1:-1:-1;;;23543:18:1;;;23536:35;23588:19;;27927:67:0::1;23212:401:1::0;27927:67:0::1;-1:-1:-1::0;;;;;28005:14:0::1;;::::0;;;28022:4:::1;28005:14;::::0;;;;;;;:21;;-1:-1:-1;;28005:21:0::1;::::0;;::::1;::::0;;27809:223::o;56283:126::-;56335:7;56382:21;;56358;:45;;;;:::i;61335:161::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;61432:42:0::1;;::::0;;;:21:::1;:42;::::0;;;;:58;;-1:-1:-1;;61432:58:0::1;61486:4;61432:58;::::0;;61335:161::o;31943:197::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;32051:10:::1;;32033:14;:28;;32025:71;;;::::0;-1:-1:-1;;;32025:71:0;;23950:2:1;32025:71:0::1;::::0;::::1;23932:21:1::0;23989:2;23969:18;;;23962:30;24028:32;24008:18;;;24001:60;24078:18;;32025:71:0::1;23748:354:1::0;32025:71:0::1;-1:-1:-1::0;;32105:10:0::1;:27:::0;31943:197::o;36577:177::-;36644:7;36676:13;:11;:13::i;:::-;36668:5;:21;36660:69;;;;-1:-1:-1;;;36660:69:0;;24309:2:1;36660:69:0;;;24291:21:1;24348:2;24328:18;;;24321:30;24387:34;24367:18;;;24360:62;-1:-1:-1;;;24438:18:1;;;24431:33;24481:19;;36660:69:0;24107:399:1;36660:69:0;-1:-1:-1;36743:5:0;36577:177::o;74942:179::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;75041:1:::1;75026:11;:16;;75018:56;;;::::0;-1:-1:-1;;;75018:56:0;;24713:2:1;75018:56:0::1;::::0;::::1;24695:21:1::0;24752:2;24732:18;;;24725:30;24791:29;24771:18;;;24764:57;24838:18;;75018:56:0::1;24511:351:1::0;75018:56:0::1;-1:-1:-1::0;;75086:12:0::1;:26:::0;74942:179::o;75350:106::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;75427:23:::1;:13;75443:7:::0;;75427:23:::1;:::i;:::-;;28861:182:::0;;75350:106;;:::o;53109:98::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;53172:21:0::1;:29:::0;;-1:-1:-1;;53172:29:0::1;::::0;;53109:98::o;67351:1549::-;67482:1;67471:7;:12;;67463:51;;;;-1:-1:-1;;;67463:51:0;;;;;;;:::i;:::-;67542:12;;67531:7;:23;;67523:82;;;;-1:-1:-1;;;67523:82:0;;;;;;;:::i;:::-;67642:14;67622:16;:14;:16::i;:::-;:34;;67614:82;;;;-1:-1:-1;;;67614:82:0;;;;;;;:::i;:::-;67713:11;;;;:19;;:11;:19;:49;;;;-1:-1:-1;67736:17:0;;;;:26;67713:49;67705:99;;;;-1:-1:-1;;;67705:99:0;;;;;;;:::i;:::-;67821:22;:20;:22::i;:::-;:30;;67847:4;67821:30;67813:75;;;;-1:-1:-1;;;67813:75:0;;;;;;;:::i;:::-;67905:21;67919:3;67924:1;67905:13;:21::i;:::-;67897:82;;;;-1:-1:-1;;;67897:82:0;;;;;;;:::i;:::-;68042:47;68069:19;68042:26;:47::i;:::-;68034:101;;;;-1:-1:-1;;;68034:101:0;;;;;;;:::i;:::-;68144:27;68218:7;68174:41;68195:19;68174:20;:41::i;:::-;:51;;;;:::i;:::-;68302:27;;-1:-1:-1;;;68302:27:0;;-1:-1:-1;;;;;363:32:1;;;68302:27:0;;;345:51:1;68144:81:0;;-1:-1:-1;68263:19:0;;68144:81;;68302:22;;;;;;318:18:1;;68302:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;68294:118;;;;-1:-1:-1;;;68294:118:0;;;;;;;:::i;:::-;68429:42;;-1:-1:-1;;;68429:42:0;;-1:-1:-1;;;;;17426:15:1;;;68429:42:0;;;17408:34:1;68465:4:0;17458:18:1;;;17451:43;68475:19:0;;68429:22;;;;;;17343:18:1;;68429:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;68421:143;;;;-1:-1:-1;;;68421:143:0;;;;;;;:::i;:::-;59227:17;;59214:9;:30;68573:63;;;;-1:-1:-1;;;68573:63:0;;;;;;;:::i;:::-;68677:66;;-1:-1:-1;;;68677:66:0;;-1:-1:-1;;;;;18642:15:1;;;68677:66:0;;;18624:34:1;68716:4:0;18674:18:1;;;18667:43;18726:18;;;18719:34;;;68653:21:0;;68677:25;;;;;;18559:18:1;;68677:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68653:90;;68760:16;68752:70;;;;-1:-1:-1;;;68752:70:0;;;;;;;:::i;:::-;68839:30;68849:3;68854:7;68863:5;68839:9;:30::i;:::-;68878:14;:12;:14::i;:::-;67454:1446;;;67351:1549;;;:::o;39741:118::-;39805:7;39828:20;39840:7;39828:11;:20::i;:::-;:25;;39741:118;-1:-1:-1;;39741:118:0:o;68908:83::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;68965:11:0::1;:18:::0;;-1:-1:-1;;68965:18:0::1;68979:4;68965:18;::::0;;68908:83::o;32771:103::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;32841:17:0::1;:25:::0;;-1:-1:-1;;32841:25:0::1;::::0;;32771:103::o;38279:211::-;38343:7;-1:-1:-1;;;;;38367:19:0;;38359:75;;;;-1:-1:-1;;;38359:75:0;;25069:2:1;38359:75:0;;;25051:21:1;25108:2;25088:18;;;25081:30;25147:34;25127:18;;;25120:62;-1:-1:-1;;;25198:18:1;;;25191:41;25249:19;;38359:75:0;24867:407:1;38359:75:0;-1:-1:-1;;;;;;38456:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;38456:27:0;;38279:211::o;26323:103::-;25720:7;25747:6;-1:-1:-1;;;;;25747:6:0;24480:10;25894:23;25886:68;;;;-1:-1:-1;;;25886:68:0;;;;;;;:::i;:::-;26388:30:::1;26415:1;26388:18;:30::i;65280:662::-:0;65343:20;;;;:29;65335:85;;;;-1:-1:-1;;;65335:85:0;;;;;;;:::i;:::-;65459:14;65439:16;:14;:16::i;:::-;:34;;65431:82;;;;-1:-1:-1;;;65431:82:0;;;;;;;:::i;:::-;65532:11;;;;:19;;:11;:19;:49;;;;-1:-1:-1;65555:17:0;;;;:26;65532:49;65524:99;;;;-1:-1:-1;;;65524:99:0;;;;;;;:::i;:::-;65642:22;:20;:22::i;:::-;:30;;65668:4;65642:30;65634:75;;;;-1:-1:-1;;;65634:75:0;;;;;;;:::i;:::-;65728:21;65742:3;65747:1;65728:13;:21::i;:::-;65720:82;;;;-1:-1:-1;;;65720:82:0;;;;;;;:::i;:::-;65834:11;65843:1;65834:8;:11::i;:::-;65821:9;:24;65813:76;;;;-1:-1:-1;;;65813:76:0;;;;;;;:::i;:::-;65910:24;65920:3;65925:1;65928:5;65910:9;:24::i;:::-;65280:662;:::o;32664:99::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;32731:17:0::1;:24:::0;;-1:-1:-1;;32731:24:0::1;32751:4;32731:24;::::0;;32664:99::o;41412:159::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;41512:37:0;;;::::1;;::::0;;;:27:::1;:37;::::0;;;;:53;;-1:-1:-1;;41512:53:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41412:159::o;56415:119::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;56503:1:::1;56478:22;:20;:22::i;:::-;:26;56470:35;;;::::0;::::1;;56514:14;:12;:14::i;55477:93::-:0;;;;;;;;;;;;62052:97;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;62116:20:0::1;:27:::0;;-1:-1:-1;;62116:27:0::1;62139:4;62116:27;::::0;;62052:97::o;74566:200::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;74670:1:::1;74653:13;:18;;74645:70;;;::::0;-1:-1:-1;;;74645:70:0;;25889:2:1;74645:70:0::1;::::0;::::1;25871:21:1::0;25928:2;25908:18;;;25901:30;25967:34;25947:18;;;25940:62;-1:-1:-1;;;26018:18:1;;;26011:37;26065:19;;74645:70:0::1;25687:403:1::0;74645:70:0::1;-1:-1:-1::0;;74726:16:0::1;:32:::0;74566:200::o;63731:90::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;63798:5:0::1;:17:::0;63731:90::o;75462:128::-;-1:-1:-1;;;;;;;;;;;;;;;;;75564:20:0;75576:7;75564:11;:20::i;40073:98::-;40129:13;40158:7;40151:14;;;;;:::i;28548:188::-;28618:4;-1:-1:-1;;;;;28642:22:0;;28634:60;;;;-1:-1:-1;;;28634:60:0;;26297:2:1;28634:60:0;;;26279:21:1;26336:2;26316:18;;;26309:30;26375:27;26355:18;;;26348:55;26420:18;;28634:60:0;26095:349:1;28634:60:0;-1:-1:-1;;;;;;28708:14:0;;;;;:4;:14;;;;;;;;;;;:22;;;;28548:188::o;58104:448::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;58236:1:::1;58216:17;:21;58208:30;;;::::0;::::1;;58305:38;::::0;-1:-1:-1;;;58305:38:0;;58337:4:::1;58305:38;::::0;::::1;345:51:1::0;58275:14:0;;58347:17;;-1:-1:-1;;;;;58305:23:0;::::1;::::0;::::1;::::0;318:18:1;;58305:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;58297:119;;;::::0;-1:-1:-1;;;58297:119:0;;26651:2:1;58297:119:0::1;::::0;::::1;26633:21:1::0;26690:2;26670:18;;;26663:30;26729:34;26709:18;;;26702:62;-1:-1:-1;;;26780:18:1;;;26773:45;26835:19;;58297:119:0::1;26449:411:1::0;58297:119:0::1;58446:12;::::0;58423:55:::1;::::0;-1:-1:-1;;;58423:55:0;;-1:-1:-1;;;;;58446:12:0;;::::1;58423:55;::::0;::::1;27039:51:1::0;27106:18;;;27099:34;;;58423:22:0;;::::1;::::0;::::1;::::0;27012:18:1;;58423:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58522:24;:22;:24::i;42517:465::-:0;-1:-1:-1;;;;;42608:24:0;;24480:10;42608:24;;42600:63;;;;-1:-1:-1;;;42600:63:0;;27346:2:1;42600:63:0;;;27328:21:1;27385:2;27365:18;;;27358:30;27424:28;27404:18;;;27397:56;27470:18;;42600:63:0;27144:350:1;42600:63:0;-1:-1:-1;;;;;42678:37:0;;;;;;:27;:37;;;;;;;;:46;42670:184;;;;-1:-1:-1;;;42670:184:0;;27701:2:1;42670:184:0;;;27683:21:1;27740:3;27720:18;;;27713:31;27780:34;27760:18;;;27753:62;27851:34;27831:18;;;27824:62;27923:34;27902:19;;;27895:63;27995:31;27974:19;;;27967:60;28044:19;;42670:184:0;27499:570:1;42670:184:0;24480:10;42863:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;42863:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;42863:53:0;;;;;;;;;;42928:48;;1115:41:1;;;42863:42:0;;24480:10;42928:48;;1088:18:1;42928:48:0;;;;;;;42517:465;;:::o;62495:346::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62591:30:0;::::1;62583:103;;;::::0;-1:-1:-1;;;62583:103:0;;28276:2:1;62583:103:0::1;::::0;::::1;28258:21:1::0;28315:2;28295:18;;;28288:30;28354:34;28334:18;;;28327:62;28425:30;28405:18;;;28398:58;28473:19;;62583:103:0::1;28074:424:1::0;62583:103:0::1;62721:12;::::0;-1:-1:-1;;;;;62701:32:0;;::::1;62721:12:::0;::::1;62701:32;;62693:104;;;::::0;-1:-1:-1;;;62693:104:0;;28705:2:1;62693:104:0::1;::::0;::::1;28687:21:1::0;28744:2;28724:18;;;28717:30;28783:34;28763:18;;;28756:62;28854:29;28834:18;;;28827:57;28901:19;;62693:104:0::1;28503:423:1::0;62693:104:0::1;-1:-1:-1::0;;62804:12:0::1;:31:::0;;-1:-1:-1;;;;;;62804:31:0::1;-1:-1:-1::0;;;;;62804:31:0;;;::::1;::::0;;;::::1;::::0;;62495:346::o;73842:128::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;73906:26:::1;:24;:26::i;43715:311::-:0;43852:28;43862:4;43868:2;43872:7;43852:9;:28::i;:::-;43903:48;43926:4;43932:2;43936:7;43945:5;43903:22;:48::i;:::-;43887:133;;;;-1:-1:-1;;;43887:133:0;;;;;;;:::i;62236:99::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;62301:20:0::1;:28:::0;;-1:-1:-1;;62301:28:0::1;::::0;;62236:99::o;54213:104::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;54279:24:0::1;:32:::0;;-1:-1:-1;;54279:32:0::1;::::0;;54213:104::o;63376:238::-;51904:12;;-1:-1:-1;;;;;51904:12:0;51890:10;:26;51882:67;;;;-1:-1:-1;;;51882:67:0;;;;;;;:::i;:::-;63467:12:::1;::::0;-1:-1:-1;;;;;63452:27:0;;::::1;63467:12:::0;::::1;63452:27;;63444:91;;;::::0;-1:-1:-1;;;63444:91:0;;29553:2:1;63444:91:0::1;::::0;::::1;29535:21:1::0;29592:2;29572:18;;;29565:30;29631:34;29611:18;;;29604:62;-1:-1:-1;;;29682:18:1;;;29675:49;29741:19;;63444:91:0::1;29351:415:1::0;63444:91:0::1;63542:12;:26:::0;;-1:-1:-1;;;;;;63542:26:0::1;-1:-1:-1::0;;;;;63542:26:0;::::1;;::::0;;63575:16:::1;:19:::0;;63542:26;;63575:16;-1:-1:-1;;63575:19:0::1;;;;:::i;:::-;;;;;;;;;:33;;;;;-1:-1:-1::0;;;;;63575:33:0::1;;;;;-1:-1:-1::0;;;;;63575:33:0::1;;;;;;63376:238:::0;:::o;53010:93::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;53069:21:0::1;:28:::0;;-1:-1:-1;;53069:28:0::1;;;::::0;;53010:93::o;59444:111::-;51904:12;;-1:-1:-1;;;;;51904:12:0;51890:10;:26;51882:67;;;;-1:-1:-1;;;51882:67:0;;;;;;;:::i;:::-;59516:17:::1;:33:::0;59444:111::o;40234:288::-;40332:13;40357:21;40381:10;:8;:10::i;:::-;40357:34;;40436:1;40418:7;40412:21;:25;:104;;;;;;;;;;;;;;;;;40473:7;40482:18;:7;:16;:18::i;:::-;40456:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40412:104;40398:118;40234:288;-1:-1:-1;;;40234:288:0:o;36197:96::-;36244:7;36269:14;36465:12;;-1:-1:-1;;36465:30:0;;36376:132;36269:14;:18;;36286:1;36269:18;:::i;61803:163::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;61901:42:0::1;61955:5;61901:42:::0;;;:21:::1;:42;::::0;;;;:59;;-1:-1:-1;;61901:59:0::1;::::0;;61803:163::o;64288:99::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60061:301::-;60140:7;60164:47;60191:19;60164:26;:47::i;:::-;60156:131;;;;-1:-1:-1;;;60156:131:0;;30580:2:1;60156:131:0;;;30562:21:1;30619:2;30599:18;;;30592:30;30658:34;30638:18;;;30631:62;30729:34;30709:18;;;30702:62;-1:-1:-1;;;30780:19:1;;;30773:38;30828:19;;60156:131:0;30378:475:1;60156:131:0;-1:-1:-1;;;;;;60301:42:0;;;;;:21;:42;;;;;:55;;;;60061:301::o;75252:92::-;75296:13;75325;75318:20;;;;;:::i;60728:304::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;60877:42:0;;;::::1;;::::0;;;:21:::1;:42;::::0;;;;:63;;-1:-1:-1;;60877:63:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;60947:55:0::1;:79:::0;60728:304::o;54323:191::-;54394:24;;54378:4;;54394:24;;54391:66;;-1:-1:-1;54445:4:0;;54323:191::o;54391:66::-;-1:-1:-1;54491:17:0;;54472:15;:36;;;54323:191::o;56542:116::-;51904:12;;-1:-1:-1;;;;;51904:12:0;51890:10;:26;51882:67;;;;-1:-1:-1;;;51882:67:0;;;;;;;:::i;:::-;56627:1:::1;56602:22;:20;:22::i;:::-;:26;56594:35;;;::::0;::::1;;56638:14;:12;:14::i;69364:768::-:0;69462:20;;;;:29;69454:85;;;;-1:-1:-1;;;69454:85:0;;;;;;;:::i;:::-;69558:17;;;;:25;;:17;:25;:48;;;;-1:-1:-1;69587:11:0;;;;:19;;:11;:19;69558:48;69550:88;;;;-1:-1:-1;;;69550:88:0;;;;;;;:::i;:::-;69657:32;69671:3;69676:12;;69657:13;:32::i;:::-;69649:73;;;;-1:-1:-1;;;69649:73:0;;;;;;;:::i;:::-;69761:14;69741:16;:14;:16::i;:::-;:34;;69733:82;;;;-1:-1:-1;;;69733:82:0;;;;;;;:::i;:::-;69834:21;69848:3;69853:1;69834:13;:21::i;:::-;69826:82;;;;-1:-1:-1;;;69826:82:0;;;;;;;:::i;:::-;69940:11;69949:1;69940:8;:11::i;:::-;69927:9;:24;69919:76;;;;-1:-1:-1;;;69919:76:0;;;;;;;:::i;:::-;70014:25;:23;:25::i;:::-;:33;;70043:4;70014:33;70006:81;;;;-1:-1:-1;;;70006:81:0;;;;;;;:::i;:::-;70100:24;70110:3;70115:1;70118:5;70100:9;:24::i;28175:234::-;25720:7;25747:6;-1:-1:-1;;;;;25747:6:0;24480:10;25894:23;25886:68;;;;-1:-1:-1;;;25886:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28249:22:0;::::1;28241:50;;;::::0;-1:-1:-1;;;28241:50:0;;23070:2:1;28241:50:0::1;::::0;::::1;23052:21:1::0;23109:2;23089:18;;;23082:30;-1:-1:-1;;;23128:18:1;;;23121:45;23183:18;;28241:50:0::1;22868:339:1::0;28241:50:0::1;28306:16;28313:8;28306:6;:16::i;:::-;28298:72;;;::::0;-1:-1:-1;;;28298:72:0;;31060:2:1;28298:72:0::1;::::0;::::1;31042:21:1::0;31099:2;31079:18;;;31072:30;31138:34;31118:18;;;31111:62;-1:-1:-1;;;31189:18:1;;;31182:41;31240:19;;28298:72:0::1;30858:407:1::0;28298:72:0::1;-1:-1:-1::0;;;;;28381:14:0::1;28398:5;28381:14:::0;;;:4:::1;:14;::::0;;;;:22;;-1:-1:-1;;28381:22:0::1;::::0;;28175:234::o;54108:99::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;-1:-1:-1;;54170:24:0::1;:31:::0;;-1:-1:-1;;54170:31:0::1;54197:4;54170:31;::::0;;54108:99::o;63827:98::-;63882:7;63913:6;63905:5;;:14;;;;:::i;52774:230::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;52876:15:::1;52861:12;:30;52853:109;;;::::0;-1:-1:-1;;;52853:109:0;;31472:2:1;52853:109:0::1;::::0;::::1;31454:21:1::0;31511:2;31491:18;;;31484:30;31550:34;31530:18;;;31523:62;31621:34;31601:18;;;31594:62;-1:-1:-1;;;31672:19:1;;;31665:33;31715:19;;52853:109:0::1;31270:470:1::0;52853:109:0::1;-1:-1:-1::0;;52969:14:0::1;:29:::0;52774:230::o;55759:45::-;;;;;;;;;;;;26579:201;25720:7;25747:6;-1:-1:-1;;;;;25747:6:0;24480:10;25894:23;25886:68;;;;-1:-1:-1;;;25886:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26668:22:0;::::1;26660:73;;;::::0;-1:-1:-1;;;26660:73:0;;31947:2:1;26660:73:0::1;::::0;::::1;31929:21:1::0;31986:2;31966:18;;;31959:30;32025:34;32005:18;;;31998:62;-1:-1:-1;;;32076:18:1;;;32069:36;32122:19;;26660:73:0::1;31745:402:1::0;26660:73:0::1;26744:28;26763:8;26744:18;:28::i;53863:239::-:0;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;53968:15:::1;53953:12;:30;53945:112;;;::::0;-1:-1:-1;;;53945:112:0;;32354:2:1;53945:112:0::1;::::0;::::1;32336:21:1::0;32393:2;32373:18;;;32366:30;32432:34;32412:18;;;32405:62;32503:34;32483:18;;;32476:62;-1:-1:-1;;;32554:19:1;;;32547:36;32600:19;;53945:112:0::1;32152:473:1::0;53945:112:0::1;-1:-1:-1::0;;54064:17:0::1;:32:::0;53863:239::o;62953:97::-;51904:12;;-1:-1:-1;;;;;51904:12:0;51890:10;:26;51882:67;;;;-1:-1:-1;;;51882:67:0;;;;;;;:::i;:::-;63037:7:::1;63013:21;:31:::0;62953:97::o;73566:125::-;28868:13;25747:6;;-1:-1:-1;;;;;25747:6:0;24480:10;28884:23;;;;28868:13;28929:20;;28548:188;:::i;28929:20::-;28914:35;;28964:8;:19;;;;28976:7;28964:19;28956:73;;;;-1:-1:-1;;;28956:73:0;;;;;;;:::i;:::-;73629:25:::1;:23;:25::i;74131:242::-:0;74209:4;74245:1;74234:7;:12;;74226:66;;;;-1:-1:-1;;;74226:66:0;;32832:2:1;74226:66:0;;;32814:21:1;32871:2;32851:18;;;32844:30;32910:34;32890:18;;;32883:62;-1:-1:-1;;;32961:18:1;;;32954:39;33010:19;;74226:66:0;32630:405:1;74226:66:0;74349:16;;74337:7;74311:23;74325:8;74311:13;:23::i;:::-;:33;;;;:::i;:::-;74310:55;;;74131:242;-1:-1:-1;;;74131:242:0:o;44402:129::-;44485:40;44495:2;44499:8;44509:11;44485:40;;;;;;;;;;;;:9;:40::i;44261:135::-;44318:4;44357:7;35924:1;44338:26;;:52;;;;-1:-1:-1;;44378:12:0;;-1:-1:-1;44368:22:0;44261:135::o;48145:172::-;48242:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;48242:29:0;-1:-1:-1;;;;;48242:29:0;;;;;;;;;48283:28;;48242:24;;48283:28;;;;;;;48145:172;;;:::o;58961:88::-;59026:17;;59001:21;;:42;;;;;;;:::i;:::-;;;;-1:-1:-1;;58961:88:0:o;46514:1529::-;46611:35;46649:20;46661:7;46649:11;:20::i;:::-;46720:18;;46611:58;;-1:-1:-1;46678:22:0;;-1:-1:-1;;;;;46704:34:0;24480:10;-1:-1:-1;;;;;46704:34:0;;:81;;;-1:-1:-1;24480:10:0;46749:20;46761:7;46749:11;:20::i;:::-;-1:-1:-1;;;;;46749:36:0;;46704:81;:142;;;-1:-1:-1;46813:18:0;;46796:50;;24480:10;43045:186;:::i;46796:50::-;46678:169;;46872:17;46856:101;;;;-1:-1:-1;;;46856:101:0;;33242:2:1;46856:101:0;;;33224:21:1;33281:2;33261:18;;;33254:30;33320:34;33300:18;;;33293:62;-1:-1:-1;;;33371:18:1;;;33364:48;33429:19;;46856:101:0;33040:414:1;46856:101:0;47004:4;-1:-1:-1;;;;;46982:26:0;:13;:18;;;-1:-1:-1;;;;;46982:26:0;;46966:98;;;;-1:-1:-1;;;46966:98:0;;33661:2:1;46966:98:0;;;33643:21:1;33700:2;33680:18;;;33673:30;33739:34;33719:18;;;33712:62;-1:-1:-1;;;33790:18:1;;;33783:36;33836:19;;46966:98:0;33459:402:1;46966:98:0;-1:-1:-1;;;;;47079:16:0;;47071:66;;;;-1:-1:-1;;;47071:66:0;;34068:2:1;47071:66:0;;;34050:21:1;34107:2;34087:18;;;34080:30;34146:34;34126:18;;;34119:62;-1:-1:-1;;;34197:18:1;;;34190:35;34242:19;;47071:66:0;33866:401:1;47071:66:0;47246:49;47263:1;47267:7;47276:13;:18;;;47246:8;:49::i;:::-;-1:-1:-1;;;;;47304:18:0;;;;;;:12;:18;;;;;:31;;47334:1;;47304:18;:31;;47334:1;;-1:-1:-1;;;;;47304:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;47304:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47342:16:0;;-1:-1:-1;47342:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;47342:16:0;;:29;;-1:-1:-1;;47342:29:0;;:::i;:::-;;;-1:-1:-1;;;;;47342:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47401:43:0;;;;;;;;-1:-1:-1;;;;;47401:43:0;;;;;-1:-1:-1;;;;;47427:15:0;47401:43;;;;;;;;;-1:-1:-1;47378:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;47378:66:0;-1:-1:-1;;;;;;47378:66:0;;;;;;;;;;;47694:11;47390:7;-1:-1:-1;47694:11:0;:::i;:::-;47757:1;47716:24;;;:11;:24;;;;;:29;47672:33;;-1:-1:-1;;;;;;47716:29:0;47712:236;;47774:20;47782:11;47774:7;:20::i;:::-;47770:171;;;47834:97;;;;;;;;47861:18;;-1:-1:-1;;;;;47834:97:0;;;;;;47892:28;;;;-1:-1:-1;;;;;47834:97:0;;;;;;;;;-1:-1:-1;47807:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;47807:124:0;-1:-1:-1;;;;;;47807:124:0;;;;;;;;;;;;47770:171;47980:7;47976:2;-1:-1:-1;;;;;47961:27:0;47970:4;-1:-1:-1;;;;;47961:27:0;;;;;;;;;;;47995:42;70407:979;57324:371;57391:21;;57422:12;57419:28;;57438:7;57324:371::o;57419:28::-;57463:6;57459:193;57477:28;;57473:1;:32;57459:193;;;57524:120;57549:25;57575:1;57549:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57549:28:0;57630:3;57603:20;57624:1;57603:23;;;;;;;;:::i;:::-;;;;;;;;;57593:7;:33;;;;:::i;:::-;57592:41;;;;:::i;:::-;57524:10;:120::i;:::-;57507:3;;;;:::i;:::-;;;;57459:193;;;-1:-1:-1;;57682:7:0;57658:21;:31;57324:371::o;30069:202::-;30202:4;30257;30228:25;30241:5;30248:4;30228:12;:25::i;:::-;:33;;30069:202;-1:-1:-1;;;;30069:202:0:o;38742:945::-;-1:-1:-1;;;;;;;;;;;;;;;;;38866:7:0;;35924:1;38907:23;;:46;;;;;38941:12;;38934:4;:19;38907:46;38903:706;;;38970:31;39004:17;;;:11;:17;;;;;;;;;38970:51;;;;;;;;;-1:-1:-1;;;;;38970:51:0;;;;;-1:-1:-1;;;38970:51:0;;;-1:-1:-1;;;;;38970:51:0;;;;;;;;39040:28;39036:85;;39096:9;38742:945;-1:-1:-1;;;38742:945:0:o;39036:85::-;-1:-1:-1;;;39417:6:0;39454:17;;;;:11;:17;;;;;;;;;39442:29;;;;;;;;;-1:-1:-1;;;;;39442:29:0;;;;;-1:-1:-1;;;39442:29:0;;;-1:-1:-1;;;;;39442:29:0;;;;;;;;39494:28;39490:93;;39554:9;38742:945;-1:-1:-1;;;38742:945:0:o;39490:93::-;39385:213;;38903:706;39624:57;;-1:-1:-1;;;39624:57:0;;35240:2:1;39624:57:0;;;35222:21:1;35279:2;35259:18;;;35252:30;35318:34;35298:18;;;35291:62;-1:-1:-1;;;35369:18:1;;;35362:45;35424:19;;39624:57:0;35038:411:1;26938:191:0;27012:16;27031:6;;-1:-1:-1;;;;;27048:17:0;;;-1:-1:-1;;;;;;27048:17:0;;;;;;27081:40;;27031:6;;;;;;;27081:40;;27012:16;27081:40;27001:128;26938:191;:::o;56664:279::-;56705:15;56723:22;:20;:22::i;:::-;56705:40;;56766:6;56762:176;56780:19;;56776:1;:23;56762:176;;;56820:108;56847:16;56864:1;56847:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56847:19:0;56912:3;56894:11;56906:1;56894:14;;;;;;;;:::i;56820:108::-;56801:3;;;;:::i;:::-;;;;56762:176;;49934:690;50071:4;-1:-1:-1;;;;;50088:13:0;;2343:19;:23;50084:535;;50127:72;;-1:-1:-1;;;50127:72:0;;-1:-1:-1;;;;;50127:36:0;;;;;:72;;24480:10;;50178:4;;50184:7;;50193:5;;50127:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50127:72:0;;;;;;;;-1:-1:-1;;50127:72:0;;;;;;;;;;;;:::i;:::-;;;50114:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50358:13:0;;50354:215;;50391:61;;-1:-1:-1;;;50391:61:0;;;;;;;:::i;50354:215::-;50537:6;50531:13;50522:6;50518:2;50514:15;50507:38;50114:464;-1:-1:-1;;;;;;50249:55:0;-1:-1:-1;;;50249:55:0;;-1:-1:-1;50242:62:0;;50084:535;-1:-1:-1;50607:4:0;50084:535;49934:690;;;;;;:::o;19231:723::-;19287:13;19508:10;19504:53;;-1:-1:-1;;19535:10:0;;;;;;;;;;;;-1:-1:-1;;;19535:10:0;;;;;19231:723::o;19504:53::-;19582:5;19567:12;19623:78;19630:9;;19623:78;;19656:8;;;;:::i;:::-;;-1:-1:-1;19679:10:0;;-1:-1:-1;19687:2:0;19679:10;;:::i;:::-;;;19623:78;;;19711:19;19743:6;-1:-1:-1;;;;;19733:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19733:17:0;;19711:39;;19761:154;19768:10;;19761:154;;19795:11;19805:1;19795:11;;:::i;:::-;;-1:-1:-1;19864:10:0;19872:2;19864:5;:10;:::i;:::-;19851:24;;:2;:24;:::i;:::-;19838:39;;19821:6;19828;19821:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;19821:56:0;;;;;;;;-1:-1:-1;19892:11:0;19901:2;19892:11;;:::i;:::-;;;19761:154;;38496:240;38557:7;-1:-1:-1;;;;;38589:19:0;;38573:102;;;;-1:-1:-1;;;38573:102:0;;36521:2:1;38573:102:0;;;36503:21:1;36560:2;36540:18;;;36533:30;36599:34;36579:18;;;36572:62;-1:-1:-1;;;36650:18:1;;;36643:47;36707:19;;38573:102:0;36319:413:1;38573:102:0;-1:-1:-1;;;;;;38697:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;38697:32:0;;-1:-1:-1;;;;;38697:32:0;;38496:240::o;44860:1434::-;45011:12;;-1:-1:-1;;;;;45038:16:0;;45030:62;;;;-1:-1:-1;;;45030:62:0;;36939:2:1;45030:62:0;;;36921:21:1;36978:2;36958:18;;;36951:30;37017:34;36997:18;;;36990:62;-1:-1:-1;;;37068:18:1;;;37061:31;37109:19;;45030:62:0;36737:397:1;45030:62:0;45229:21;45237:12;45229:7;:21::i;:::-;45228:22;45220:64;;;;-1:-1:-1;;;45220:64:0;;37341:2:1;45220:64:0;;;37323:21:1;37380:2;37360:18;;;37353:30;37419:31;37399:18;;;37392:59;37468:18;;45220:64:0;37139:353:1;45220:64:0;45370:20;45366:116;;45423:12;;45411:8;:24;;45403:71;;;;-1:-1:-1;;;45403:71:0;;37699:2:1;45403:71:0;;;37681:21:1;37738:2;37718:18;;;37711:30;37777:34;37757:18;;;37750:62;-1:-1:-1;;;37828:18:1;;;37821:32;37870:19;;45403:71:0;37497:398:1;45403:71:0;-1:-1:-1;;;;;45593:16:0;;45560:30;45593:16;;;:12;:16;;;;;;;;;45560:49;;;;;;;;;-1:-1:-1;;;;;45560:49:0;;;;;-1:-1:-1;;;45560:49:0;;;;;;;;;;;45635:139;;;;;;;;45655:19;;45560:49;;45635:139;;;45655:39;;45685:8;;45655:39;:::i;:::-;-1:-1:-1;;;;;45635:139:0;;;;;45731:11;:35;;45757:8;45731:35;;;45745:1;45731:35;45703:11;:24;;;:64;;;;:::i;:::-;-1:-1:-1;;;;;45635:139:0;;;;;;-1:-1:-1;;;;;45616:16:0;;;;;;;:12;:16;;;;;;;;:158;;;;;;;;-1:-1:-1;;;45616:158:0;;;;;;;;;;;;45809:43;;;;;;;;;;-1:-1:-1;;;;;45835:15:0;45809:43;;;;;;;;45781:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;45781:71:0;-1:-1:-1;;;;;;45781:71:0;;;;;;;;;;;;;;;;;;45793:12;;45905:281;45929:8;45925:1;:12;45905:281;;;45958:38;;45983:12;;-1:-1:-1;;;;;45958:38:0;;;45975:1;;45958:38;;45975:1;;45958:38;46023:59;46054:1;46058:2;46062:12;46076:5;46023:22;:59::i;:::-;46005:150;;;;-1:-1:-1;;;46005:150:0;;;;;;;:::i;:::-;46164:14;;;;:::i;:::-;;;;45939:3;;;;;:::i;:::-;;;;45905:281;;;-1:-1:-1;46194:12:0;:27;-1:-1:-1;;;;;;44860:1434:0:o;56951:175::-;57024:12;57042:8;-1:-1:-1;;;;;57042:13:0;57063:7;57042:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57023:52;;;57092:7;57084:36;;;;-1:-1:-1;;;57084:36:0;;38312:2:1;57084:36:0;;;38294:21:1;38351:2;38331:18;;;38324:30;-1:-1:-1;;;38370:18:1;;;38363:46;38426:18;;57084:36:0;38110:340:1;30643:701:0;30726:7;30771:4;30726:7;30788:515;30812:5;:12;30808:1;:16;30788:515;;;30848:20;30871:5;30877:1;30871:8;;;;;;;;:::i;:::-;;;;;;;30848:31;;30916:12;30900;:28;30896:394;;31422:13;31476:15;;;31514:4;31507:15;;;31563:4;31547:21;;31032:57;;30896:394;;;31422:13;31476:15;;;31514:4;31507:15;;;31563:4;31547:21;;31215:57;;30896:394;-1:-1:-1;30826:3:0;;;;:::i;:::-;;;;30788:515;;;-1:-1:-1;31322:12:0;30643:701;-1:-1:-1;;;30643:701:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:180:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;589:131::-;-1:-1:-1;;;;;;663:32:1;;653:43;;643:71;;710:1;707;700:12;725:245;783:6;836:2;824:9;815:7;811:23;807:32;804:52;;;852:1;849;842:12;804:52;891:9;878:23;910:30;934:5;910:30;:::i;1167:173::-;1235:20;;-1:-1:-1;;;;;1284:31:1;;1274:42;;1264:70;;1330:1;1327;1320:12;1264:70;1167:173;;;:::o;1345:186::-;1404:6;1457:2;1445:9;1436:7;1432:23;1428:32;1425:52;;;1473:1;1470;1463:12;1425:52;1496:29;1515:9;1496:29;:::i;1536:254::-;1604:6;1612;1665:2;1653:9;1644:7;1640:23;1636:32;1633:52;;;1681:1;1678;1671:12;1633:52;1704:29;1723:9;1704:29;:::i;:::-;1694:39;1780:2;1765:18;;;;1752:32;;-1:-1:-1;;;1536:254:1:o;1795:258::-;1867:1;1877:113;1891:6;1888:1;1885:13;1877:113;;;1967:11;;;1961:18;1948:11;;;1941:39;1913:2;1906:10;1877:113;;;2008:6;2005:1;2002:13;1999:48;;;-1:-1:-1;;2043:1:1;2025:16;;2018:27;1795:258::o;2058:::-;2100:3;2138:5;2132:12;2165:6;2160:3;2153:19;2181:63;2237:6;2230:4;2225:3;2221:14;2214:4;2207:5;2203:16;2181:63;:::i;:::-;2298:2;2277:15;-1:-1:-1;;2273:29:1;2264:39;;;;2305:4;2260:50;;2058:258;-1:-1:-1;;2058:258:1:o;2321:220::-;2470:2;2459:9;2452:21;2433:4;2490:45;2531:2;2520:9;2516:18;2508:6;2490:45;:::i;2546:367::-;2609:8;2619:6;2673:3;2666:4;2658:6;2654:17;2650:27;2640:55;;2691:1;2688;2681:12;2640:55;-1:-1:-1;2714:20:1;;-1:-1:-1;;;;;2746:30:1;;2743:50;;;2789:1;2786;2779:12;2743:50;2826:4;2818:6;2814:17;2802:29;;2886:3;2879:4;2869:6;2866:1;2862:14;2854:6;2850:27;2846:38;2843:47;2840:67;;;2903:1;2900;2893:12;2840:67;2546:367;;;;;:::o;2918:654::-;3031:6;3039;3047;3055;3063;3116:3;3104:9;3095:7;3091:23;3087:33;3084:53;;;3133:1;3130;3123:12;3084:53;3156:29;3175:9;3156:29;:::i;:::-;3146:39;;3232:2;3221:9;3217:18;3204:32;3194:42;;3287:2;3276:9;3272:18;3259:32;-1:-1:-1;;;;;3306:6:1;3303:30;3300:50;;;3346:1;3343;3336:12;3300:50;3385:70;3447:7;3438:6;3427:9;3423:22;3385:70;:::i;:::-;3474:8;;-1:-1:-1;3359:96:1;-1:-1:-1;3528:38:1;;-1:-1:-1;3562:2:1;3547:18;;3528:38;:::i;:::-;3518:48;;2918:654;;;;;;;;:::o;3577:328::-;3654:6;3662;3670;3723:2;3711:9;3702:7;3698:23;3694:32;3691:52;;;3739:1;3736;3729:12;3691:52;3762:29;3781:9;3762:29;:::i;:::-;3752:39;;3810:38;3844:2;3833:9;3829:18;3810:38;:::i;:::-;3800:48;;3895:2;3884:9;3880:18;3867:32;3857:42;;3577:328;;;;;:::o;4092:511::-;4187:6;4195;4203;4256:2;4244:9;4235:7;4231:23;4227:32;4224:52;;;4272:1;4269;4262:12;4224:52;4295:29;4314:9;4295:29;:::i;:::-;4285:39;;4375:2;4364:9;4360:18;4347:32;-1:-1:-1;;;;;4394:6:1;4391:30;4388:50;;;4434:1;4431;4424:12;4388:50;4473:70;4535:7;4526:6;4515:9;4511:22;4473:70;:::i;:::-;4092:511;;4562:8;;-1:-1:-1;4447:96:1;;-1:-1:-1;;;;4092:511:1:o;4797:579::-;4901:6;4909;4917;4925;4978:2;4966:9;4957:7;4953:23;4949:32;4946:52;;;4994:1;4991;4984:12;4946:52;5017:29;5036:9;5017:29;:::i;:::-;5007:39;;5093:2;5082:9;5078:18;5065:32;5055:42;;5148:2;5137:9;5133:18;5120:32;-1:-1:-1;;;;;5167:6:1;5164:30;5161:50;;;5207:1;5204;5197:12;5161:50;5246:70;5308:7;5299:6;5288:9;5284:22;5246:70;:::i;:::-;4797:579;;;;-1:-1:-1;5335:8:1;-1:-1:-1;;;;4797:579:1:o;5566:592::-;5637:6;5645;5698:2;5686:9;5677:7;5673:23;5669:32;5666:52;;;5714:1;5711;5704:12;5666:52;5754:9;5741:23;-1:-1:-1;;;;;5824:2:1;5816:6;5813:14;5810:34;;;5840:1;5837;5830:12;5810:34;5878:6;5867:9;5863:22;5853:32;;5923:7;5916:4;5912:2;5908:13;5904:27;5894:55;;5945:1;5942;5935:12;5894:55;5985:2;5972:16;6011:2;6003:6;6000:14;5997:34;;;6027:1;6024;6017:12;5997:34;6072:7;6067:2;6058:6;6054:2;6050:15;6046:24;6043:37;6040:57;;;6093:1;6090;6083:12;6040:57;6124:2;6116:11;;;;;6146:6;;-1:-1:-1;5566:592:1;;-1:-1:-1;;;;5566:592:1:o;6163:328::-;6240:6;6248;6256;6309:2;6297:9;6288:7;6284:23;6280:32;6277:52;;;6325:1;6322;6315:12;6277:52;6348:29;6367:9;6348:29;:::i;:::-;6338:39;;6424:2;6413:9;6409:18;6396:32;6386:42;;6447:38;6481:2;6470:9;6466:18;6447:38;:::i;:::-;6437:48;;6163:328;;;;;:::o;6496:118::-;6582:5;6575:13;6568:21;6561:5;6558:32;6548:60;;6604:1;6601;6594:12;6619:315;6684:6;6692;6745:2;6733:9;6724:7;6720:23;6716:32;6713:52;;;6761:1;6758;6751:12;6713:52;6784:29;6803:9;6784:29;:::i;:::-;6774:39;;6863:2;6852:9;6848:18;6835:32;6876:28;6898:5;6876:28;:::i;:::-;6923:5;6913:15;;;6619:315;;;;;:::o;7306:127::-;7367:10;7362:3;7358:20;7355:1;7348:31;7398:4;7395:1;7388:15;7422:4;7419:1;7412:15;7438:1138;7533:6;7541;7549;7557;7610:3;7598:9;7589:7;7585:23;7581:33;7578:53;;;7627:1;7624;7617:12;7578:53;7650:29;7669:9;7650:29;:::i;:::-;7640:39;;7698:38;7732:2;7721:9;7717:18;7698:38;:::i;:::-;7688:48;;7783:2;7772:9;7768:18;7755:32;7745:42;;7838:2;7827:9;7823:18;7810:32;-1:-1:-1;;;;;7902:2:1;7894:6;7891:14;7888:34;;;7918:1;7915;7908:12;7888:34;7956:6;7945:9;7941:22;7931:32;;8001:7;7994:4;7990:2;7986:13;7982:27;7972:55;;8023:1;8020;8013:12;7972:55;8059:2;8046:16;8081:2;8077;8074:10;8071:36;;;8087:18;;:::i;:::-;8162:2;8156:9;8130:2;8216:13;;-1:-1:-1;;8212:22:1;;;8236:2;8208:31;8204:40;8192:53;;;8260:18;;;8280:22;;;8257:46;8254:72;;;8306:18;;:::i;:::-;8346:10;8342:2;8335:22;8381:2;8373:6;8366:18;8421:7;8416:2;8411;8407;8403:11;8399:20;8396:33;8393:53;;;8442:1;8439;8432:12;8393:53;8498:2;8493;8489;8485:11;8480:2;8472:6;8468:15;8455:46;8543:1;8538:2;8533;8525:6;8521:15;8517:24;8510:35;8564:6;8554:16;;;;;;;7438:1138;;;;;;;:::o;8581:383::-;8655:6;8663;8671;8724:2;8712:9;8703:7;8699:23;8695:32;8692:52;;;8740:1;8737;8730:12;8692:52;8763:29;8782:9;8763:29;:::i;:::-;8753:39;;8842:2;8831:9;8827:18;8814:32;8855:28;8877:5;8855:28;:::i;:::-;8581:383;;8902:5;;-1:-1:-1;;;8954:2:1;8939:18;;;;8926:32;;8581:383::o;8969:260::-;9037:6;9045;9098:2;9086:9;9077:7;9073:23;9069:32;9066:52;;;9114:1;9111;9104:12;9066:52;9137:29;9156:9;9137:29;:::i;:::-;9127:39;;9185:38;9219:2;9208:9;9204:18;9185:38;:::i;:::-;9175:48;;8969:260;;;;;:::o;9234:407::-;9436:2;9418:21;;;9475:2;9455:18;;;9448:30;9514:34;9509:2;9494:18;;9487:62;-1:-1:-1;;;9580:2:1;9565:18;;9558:41;9631:3;9616:19;;9234:407::o;9646:350::-;9848:2;9830:21;;;9887:2;9867:18;;;9860:30;9926:28;9921:2;9906:18;;9899:56;9987:2;9972:18;;9646:350::o;10001:410::-;10203:2;10185:21;;;10242:2;10222:18;;;10215:30;10281:34;10276:2;10261:18;;10254:62;-1:-1:-1;;;10347:2:1;10332:18;;10325:44;10401:3;10386:19;;10001:410::o;10416:401::-;10618:2;10600:21;;;10657:2;10637:18;;;10630:30;10696:34;10691:2;10676:18;;10669:62;-1:-1:-1;;;10762:2:1;10747:18;;10740:35;10807:3;10792:19;;10416:401::o;10822:356::-;11024:2;11006:21;;;11043:18;;;11036:30;11102:34;11097:2;11082:18;;11075:62;11169:2;11154:18;;10822:356::o;11183:412::-;11385:2;11367:21;;;11424:2;11404:18;;;11397:30;11463:34;11458:2;11443:18;;11436:62;-1:-1:-1;;;11529:2:1;11514:18;;11507:46;11585:3;11570:19;;11183:412::o;11600:127::-;11661:10;11656:3;11652:20;11649:1;11642:31;11692:4;11689:1;11682:15;11716:4;11713:1;11706:15;11732:128;11772:3;11803:1;11799:6;11796:1;11793:13;11790:39;;;11809:18;;:::i;:::-;-1:-1:-1;11845:9:1;;11732:128::o;11865:399::-;12067:2;12049:21;;;12106:2;12086:18;;;12079:30;12145:34;12140:2;12125:18;;12118:62;-1:-1:-1;;;12211:2:1;12196:18;;12189:33;12254:3;12239:19;;11865:399::o;12269:404::-;12471:2;12453:21;;;12510:2;12490:18;;;12483:30;12549:34;12544:2;12529:18;;12522:62;-1:-1:-1;;;12615:2:1;12600:18;;12593:38;12663:3;12648:19;;12269:404::o;12678:380::-;12757:1;12753:12;;;;12800;;;12821:61;;12875:4;12867:6;12863:17;12853:27;;12821:61;12928:2;12920:6;12917:14;12897:18;12894:38;12891:161;;;12974:10;12969:3;12965:20;12962:1;12955:31;13009:4;13006:1;12999:15;13037:4;13034:1;13027:15;12891:161;;12678:380;;;:::o;14883:351::-;15085:2;15067:21;;;15124:2;15104:18;;;15097:30;15163:29;15158:2;15143:18;;15136:57;15225:2;15210:18;;14883:351::o;15239:352::-;15441:2;15423:21;;;15480:2;15460:18;;;15453:30;15519;15514:2;15499:18;;15492:58;15582:2;15567:18;;15239:352::o;15596:399::-;15798:2;15780:21;;;15837:2;15817:18;;;15810:30;15876:34;15871:2;15856:18;;15849:62;-1:-1:-1;;;15942:2:1;15927:18;;15920:33;15985:3;15970:19;;15596:399::o;16000:405::-;16202:2;16184:21;;;16241:2;16221:18;;;16214:30;16280:34;16275:2;16260:18;;16253:62;-1:-1:-1;;;16346:2:1;16331:18;;16324:39;16395:3;16380:19;;16000:405::o;16410:168::-;16450:7;16516:1;16512;16508:6;16504:14;16501:1;16498:21;16493:1;16486:9;16479:17;16475:45;16472:71;;;16523:18;;:::i;:::-;-1:-1:-1;16563:9:1;;16410:168::o;16583:184::-;16653:6;16706:2;16694:9;16685:7;16681:23;16677:32;16674:52;;;16722:1;16719;16712:12;16674:52;-1:-1:-1;16745:16:1;;16583:184;-1:-1:-1;16583:184:1:o;16772:419::-;16974:2;16956:21;;;17013:2;16993:18;;;16986:30;17052:34;17047:2;17032:18;;17025:62;17123:25;17118:2;17103:18;;17096:53;17181:3;17166:19;;16772:419::o;17505:469::-;17707:2;17689:21;;;17746:2;17726:18;;;17719:30;17785:34;17780:2;17765:18;;17758:62;17856:34;17851:2;17836:18;;17829:62;-1:-1:-1;;;17922:3:1;17907:19;;17900:32;17964:3;17949:19;;17505:469::o;17979:400::-;18181:2;18163:21;;;18220:2;18200:18;;;18193:30;18259:34;18254:2;18239:18;;18232:62;-1:-1:-1;;;18325:2:1;18310:18;;18303:34;18369:3;18354:19;;17979:400::o;18764:245::-;18831:6;18884:2;18872:9;18863:7;18859:23;18855:32;18852:52;;;18900:1;18897;18890:12;18852:52;18932:9;18926:16;18951:28;18973:5;18951:28;:::i;19014:405::-;19216:2;19198:21;;;19255:2;19235:18;;;19228:30;19294:34;19289:2;19274:18;;19267:62;-1:-1:-1;;;19360:2:1;19345:18;;19338:39;19409:3;19394:19;;19014:405::o;19424:352::-;19626:2;19608:21;;;19665:2;19645:18;;;19638:30;19704;19699:2;19684:18;;19677:58;19767:2;19752:18;;19424:352::o;20600:135::-;20639:3;-1:-1:-1;;20660:17:1;;20657:43;;;20680:18;;:::i;:::-;-1:-1:-1;20727:1:1;20716:13;;20600:135::o;21741:405::-;21943:2;21925:21;;;21982:2;21962:18;;;21955:30;22021:34;22016:2;22001:18;;21994:62;-1:-1:-1;;;22087:2:1;22072:18;;22065:39;22136:3;22121:19;;21741:405::o;22507:356::-;22709:2;22691:21;;;22728:18;;;22721:30;22787:34;22782:2;22767:18;;22760:62;22854:2;22839:18;;22507:356::o;23618:125::-;23658:4;23686:1;23683;23680:8;23677:34;;;23691:18;;:::i;:::-;-1:-1:-1;23728:9:1;;23618:125::o;25279:403::-;25481:2;25463:21;;;25520:2;25500:18;;;25493:30;25559:34;25554:2;25539:18;;25532:62;-1:-1:-1;;;25625:2:1;25610:18;;25603:37;25672:3;25657:19;;25279:403::o;28931:415::-;29133:2;29115:21;;;29172:2;29152:18;;;29145:30;29211:34;29206:2;29191:18;;29184:62;-1:-1:-1;;;29277:2:1;29262:18;;29255:49;29336:3;29321:19;;28931:415::o;29771:127::-;29832:10;29827:3;29823:20;29820:1;29813:31;29863:4;29860:1;29853:15;29887:4;29884:1;29877:15;29903:470;30082:3;30120:6;30114:13;30136:53;30182:6;30177:3;30170:4;30162:6;30158:17;30136:53;:::i;:::-;30252:13;;30211:16;;;;30274:57;30252:13;30211:16;30308:4;30296:17;;30274:57;:::i;:::-;30347:20;;29903:470;-1:-1:-1;;;;29903:470:1:o;34272:246::-;34312:4;-1:-1:-1;;;;;34425:10:1;;;;34395;;34447:12;;;34444:38;;;34462:18;;:::i;:::-;34499:13;;34272:246;-1:-1:-1;;;34272:246:1:o;34523:253::-;34563:3;-1:-1:-1;;;;;34652:2:1;34649:1;34645:10;34682:2;34679:1;34675:10;34713:3;34709:2;34705:12;34700:3;34697:21;34694:47;;;34721:18;;:::i;34781:127::-;34842:10;34837:3;34833:20;34830:1;34823:31;34873:4;34870:1;34863:15;34897:4;34894:1;34887:15;34913:120;34953:1;34979;34969:35;;34984:18;;:::i;:::-;-1:-1:-1;35018:9:1;;34913:120::o;35454:489::-;-1:-1:-1;;;;;35723:15:1;;;35705:34;;35775:15;;35770:2;35755:18;;35748:43;35822:2;35807:18;;35800:34;;;35870:3;35865:2;35850:18;;35843:31;;;35648:4;;35891:46;;35917:19;;35909:6;35891:46;:::i;:::-;35883:54;35454:489;-1:-1:-1;;;;;;35454:489:1:o;35948:249::-;36017:6;36070:2;36058:9;36049:7;36045:23;36041:32;36038:52;;;36086:1;36083;36076:12;36038:52;36118:9;36112:16;36137:30;36161:5;36137:30;:::i;36202:112::-;36234:1;36260;36250:35;;36265:18;;:::i;:::-;-1:-1:-1;36299:9:1;;36202:112::o
Swarm Source
ipfs://95bc8b83c43665d8e9575e689ae4932eaf8044d757af14b0a2a27e0247e7822e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.