Contract Overview
Balance:
0 Ether
EtherValue:
$0.00
More Info
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0xb3b9007b22daef37ef81731eda89c3c0bd29838052183b8e720b599c859b2b1f | Set Approval For... | 13900943 | 224 days 8 hrs ago | IN | 0x19bbb792667bc123f5d99c4f6077a06f79f6dbe4 | 0 Ether | 0.00671816 | ||
0x94d8e9c46fbee7da0dd2d5e3d1ccb15e948df3d4cf0e340ab7cbcb247581059f | Set Approval For... | 12312723 | 471 days 23 hrs ago | 0x3285f52b6e0846816b962ae96357fffec073e8b7 | IN | 0x19bbb792667bc123f5d99c4f6077a06f79f6dbe4 | 0 Ether | 0.00238418 | |
0x99314e03018c0988dd15d580d08283a770d18e6756065e6794aaa4abdc051a6e | Mint | 12280843 | 476 days 21 hrs ago | 0x3285f52b6e0846816b962ae96357fffec073e8b7 | IN | 0x19bbb792667bc123f5d99c4f6077a06f79f6dbe4 | 0 Ether | 0.01086651 | |
0xb4be21a4d530ad518474d21a0c27fe777b559901e39f4681699087aa95579d2d | 0x60806040 | 12280570 | 476 days 22 hrs ago | 0x3285f52b6e0846816b962ae96357fffec073e8b7 | IN | Create: SaunaLand | 0 Ether | 0.37143022 |
[ Download CSV Export ]
View more zero value Internal Transactions in Advanced View mode
Contract Name:
SaunaLand
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-21 */ // File: contracts/IApprovalProxy.sol pragma solidity ^0.8.0; interface IApprovalProxy { function setApprovalForAll( address _owner, address _spender, bool _approved ) external; function isApprovedForAll( address _owner, address _spender, bool _original ) external view returns (bool); } // File: contracts/openzeppelin-contracts/contracts/utils/Context.sol // SPDX-License-Identifier: MIT 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: contracts/openzeppelin-contracts/contracts/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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/openzeppelin-contracts/contracts/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: contracts/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: contracts/openzeppelin-contracts/contracts/access/AccessControl.sol pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping (address => bool) members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override { require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override { require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: contracts/openzeppelin-contracts/contracts/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: contracts/openzeppelin-contracts/contracts/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: contracts/openzeppelin-contracts/contracts/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: contracts/openzeppelin-contracts/contracts/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 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: contracts/openzeppelin-contracts/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/openzeppelin-contracts/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: contracts/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File: contracts/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721URIStorage.sol pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: contracts/NFTOasis.sol pragma solidity ^0.8.0; abstract contract NFTOasis is AccessControl, ERC721URIStorage, Ownable { using Strings for uint256; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); string private baseURI; IApprovalProxy public approvalProxy; event UpdateApprovalProxy(address _newProxyContract); constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol) { _setRoleAdmin(MINTER_ROLE, MINTER_ROLE); _setupRole(MINTER_ROLE, _msgSender()); } // mintable function mint(address to, uint256 tokenId) public { require( hasRole(MINTER_ROLE, _msgSender()), "ERC721Mintble: must have minter role to mint" ); _mint(to, tokenId); } function mint(address[] memory _toList, uint256[] memory _tokenIdList) external { require( _toList.length == _tokenIdList.length, "input length must be same" ); for (uint256 i = 0; i < _tokenIdList.length; i++) { mint(_toList[i], _tokenIdList[i]); } } function mintFor( address to, uint256 tokenId ) public { mint(to, tokenId); } function exists(uint256 tokenId) public view returns (bool) { return _exists(tokenId); } function setBaseURI(string memory __baseURI) external onlyOwner { baseURI = __baseURI; } function _baseURI() internal view override returns (string memory) { if (bytes(baseURI).length > 0) { return baseURI; } return string( abi.encodePacked( "https://metadata-oasis.financie.jp/metadata/", symbol(), "/" ) ); } function setApprovalProxy(address _new) public onlyOwner { approvalProxy = IApprovalProxy(_new); emit UpdateApprovalProxy(_new); } function setApprovalForAll(address _spender, bool _approved) public virtual override { if ( address(approvalProxy) != address(0x0) && Address.isContract(_spender) ) { approvalProxy.setApprovalForAll(msg.sender, _spender, _approved); } super.setApprovalForAll(_spender, _approved); } function isApprovedForAll(address _owner, address _spender) public view override returns (bool) { bool original = super.isApprovedForAll(_owner, _spender); if (address(approvalProxy) != address(0x0)) { return approvalProxy.isApprovedForAll(_owner, _spender, original); } return original; } function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, ERC721) returns (bool) { return AccessControl.supportsInterface(interfaceId) || ERC721.supportsInterface(interfaceId); } } // File: contracts/SaunaLand.sol pragma solidity 0.8.3; contract SaunaLand is NFTOasis { constructor() NFTOasis("SAUNA LAND", "SAUNALAND") {} }
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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newProxyContract","type":"address"}],"name":"UpdateApprovalProxy","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"approvalProxy","outputs":[{"internalType":"contract IApprovalProxy","name":"","type":"address"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_toList","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIdList","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"setApprovalProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252600a81526914d0555390481310539160b21b60208083019182528351808501909452600984526814d05553905310539160ba1b90840152815191929183918391620000699160019162000228565b5080516200007f90600290602084019062000228565b5050506000620000946200012060201b60201c565b600880546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000fd600080516020620025f58339815191528062000124565b62000118600080516020620025f58339815191523362000178565b50506200030b565b3390565b600082815260208190526040902060010154819060405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a460009182526020829052604090912060010155565b62000184828262000188565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000184576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001e43390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b8280546200023690620002ce565b90600052602060002090601f0160209004810192826200025a5760008555620002a5565b82601f106200027557805160ff1916838001178555620002a5565b82800160010185558215620002a5579182015b82811115620002a557825182559160200191906001019062000288565b50620002b3929150620002b7565b5090565b5b80821115620002b35760008155600101620002b8565b600181811c90821680620002e357607f821691505b602082108114156200030557634e487b7160e01b600052602260045260246000fd5b50919050565b6122da806200031b6000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063715018a611610104578063b88d4fde116100a2578063da1919b311610071578063da1919b31461040d578063e467f7e014610420578063e985e9c514610433578063f2fde38b14610446576101da565b8063b88d4fde146103ad578063c87b56dd146103c0578063d5391393146103d3578063d547741f146103fa576101da565b806395d89b41116100de57806395d89b41146103775780639bb5c9c31461037f578063a217fddf14610392578063a22cb4651461039a576101da565b8063715018a61461034b5780638da5cb5b1461035357806391d1485414610364576101da565b806336568abe1161017c5780634f558e791161014b5780634f558e79146102ff57806355f804b3146103125780636352211e1461032557806370a0823114610338576101da565b806336568abe146102b357806340c10f19146102c657806342842e0e146102d95780634dd09f33146102ec576101da565b8063095ea7b3116101b8578063095ea7b31461024757806323b872dd1461025c578063248a9ca31461026f5780632f2ff15d146102a0576101da565b806301ffc9a7146101df57806306fdde0314610207578063081812fc1461021c575b600080fd5b6101f26101ed366004611ea7565b610459565b60405190151581526020015b60405180910390f35b61020f61047b565b6040516101fe9190612022565b61022f61022a366004611e6d565b61050e565b6040516001600160a01b0390911681526020016101fe565b61025a610255366004611d67565b61059b565b005b61025a61026a366004611c7d565b6106b1565b61029261027d366004611e6d565b60009081526020819052604090206001015490565b6040519081526020016101fe565b61025a6102ae366004611e85565b6106e2565b61025a6102c1366004611e85565b610771565b61025a6102d4366004611d67565b6107eb565b61025a6102e7366004611c7d565b610880565b600a5461022f906001600160a01b031681565b6101f261030d366004611e6d565b61089b565b61025a610320366004611edf565b6108a6565b61022f610333366004611e6d565b6108e3565b610292610346366004611c31565b61095a565b61025a6109e1565b6008546001600160a01b031661022f565b6101f2610372366004611e85565b610a55565b61020f610a80565b61025a61038d366004611c31565b610a8f565b610292600081565b61025a6103a8366004611d31565b610b0d565b61025a6103bb366004611cb8565b610ba4565b61020f6103ce366004611e6d565b610bdc565b6102927f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61025a610408366004611e85565b610d47565b61025a61041b366004611d67565b610dc7565b61025a61042e366004611d90565b610dd1565b6101f2610441366004611c4b565b610e98565b61025a610454366004611c31565b610f55565b600061046482611040565b80610473575061047382611075565b90505b919050565b60606001805461048a906121d1565b80601f01602080910402602001604051908101604052809291908181526020018280546104b6906121d1565b80156105035780601f106104d857610100808354040283529160200191610503565b820191906000526020600020905b8154815290600101906020018083116104e657829003601f168201915b505050505090505b90565b6000610519826110b5565b61057f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006105a6826108e3565b9050806001600160a01b0316836001600160a01b031614156106145760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610576565b336001600160a01b0382161480610630575061063081336110d2565b6106a25760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610576565b6106ac8383611100565b505050565b6106bb338261116e565b6106d75760405162461bcd60e51b8152600401610576906120bc565b6106ac838383611230565b6000828152602081905260409020600101546106ff905b33610372565b6107635760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526e0818591b5a5b881d1bc819dc985b9d608a1b6064820152608401610576565b61076d82826113d0565b5050565b6001600160a01b03811633146107e15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610576565b61076d8282611454565b6108157f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610372565b6108765760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d696e74626c653a206d7573742068617665206d696e7465722060448201526b1c9bdb19481d1bc81b5a5b9d60a21b6064820152608401610576565b61076d82826114b9565b6106ac83838360405180602001604052806000815250610ba4565b6000610473826110b5565b6008546001600160a01b031633146108d05760405162461bcd60e51b815260040161057690612087565b805161076d906009906020840190611aba565b6000818152600360205260408120546001600160a01b0316806104735760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610576565b60006001600160a01b0382166109c55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610576565b506001600160a01b031660009081526004602052604090205490565b6008546001600160a01b03163314610a0b5760405162461bcd60e51b815260040161057690612087565b6008546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600880546001600160a01b0319169055565b6000828152602081815260408083206001600160a01b038516845290915290205460ff165b92915050565b60606002805461048a906121d1565b6008546001600160a01b03163314610ab95760405162461bcd60e51b815260040161057690612087565b600a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f12be4820d03362d1f48434d870b2fc1549b3a3d16d891eeaac7c3073f3ded8b79060200160405180910390a150565b600a546001600160a01b031615801590610b275750813b15155b15610b9a57600a54604051631b3b02e560e11b81523360048201526001600160a01b03848116602483015283151560448301529091169063367605ca90606401600060405180830381600087803b158015610b8157600080fd5b505af1158015610b95573d6000803e3d6000fd5b505050505b61076d82826115ec565b610bae338361116e565b610bca5760405162461bcd60e51b8152600401610576906120bc565b610bd6848484846116be565b50505050565b6060610be7826110b5565b610c4d5760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610576565b60008281526007602052604081208054610c66906121d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c92906121d1565b8015610cdf5780601f10610cb457610100808354040283529160200191610cdf565b820191906000526020600020905b815481529060010190602001808311610cc257829003601f168201915b505050505090506000610cf06116f1565b9050805160001415610d0457509050610476565b815115610d36578082604051602001610d1e929190611f51565b60405160208183030381529060405292505050610476565b610d3f846117c8565b949350505050565b600082815260208190526040902060010154610d62906106f9565b6107e15760405162461bcd60e51b815260206004820152603060248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526f2061646d696e20746f207265766f6b6560801b6064820152608401610576565b61076d82826107eb565b8051825114610e225760405162461bcd60e51b815260206004820152601960248201527f696e707574206c656e677468206d7573742062652073616d65000000000000006044820152606401610576565b60005b81518110156106ac57610e86838281518110610e5157634e487b7160e01b600052603260045260246000fd5b6020026020010151838381518110610e7957634e487b7160e01b600052603260045260246000fd5b60200260200101516107eb565b80610e908161220c565b915050610e25565b600080610ea584846110d2565b600a549091506001600160a01b031615610f4e57600a546040516346e67e2960e11b81526001600160a01b0386811660048301528581166024830152831515604483015290911690638dccfc529060640160206040518083038186803b158015610f0e57600080fd5b505afa158015610f22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f469190611e51565b915050610a7a565b9392505050565b6008546001600160a01b03163314610f7f5760405162461bcd60e51b815260040161057690612087565b6001600160a01b038116610fe45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610576565b6008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b03198216637965db0b60e01b148061047357506301ffc9a760e01b6001600160e01b0319831614610473565b60006001600160e01b031982166380ac58cd60e01b14806110a657506001600160e01b03198216635b5e139f60e01b145b80610473575061047382611040565b6000908152600360205260409020546001600160a01b0316151590565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611135826108e3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611179826110b5565b6111da5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610576565b60006111e5836108e3565b9050806001600160a01b0316846001600160a01b031614806112205750836001600160a01b03166112158461050e565b6001600160a01b0316145b80610d3f5750610d3f81856110d2565b826001600160a01b0316611243826108e3565b6001600160a01b0316146112ab5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610576565b6001600160a01b03821661130d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610576565b611318600082611100565b6001600160a01b038316600090815260046020526040812080546001929061134190849061218e565b90915550506001600160a01b038216600090815260046020526040812080546001929061136f908490612162565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6113da8282610a55565b61076d576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556114103390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61145e8282610a55565b1561076d576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b03821661150f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610576565b611518816110b5565b156115655760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610576565b6001600160a01b038216600090815260046020526040812080546001929061158e908490612162565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0382163314156116455760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610576565b3360008181526006602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116b2911515815260200190565b60405180910390a35050565b6116c9848484611230565b6116d584848484611892565b610bd65760405162461bcd60e51b815260040161057690612035565b6060600060098054611702906121d1565b9050111561179c5760098054611717906121d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611743906121d1565b80156117905780601f1061176557610100808354040283529160200191611790565b820191906000526020600020905b81548152906001019060200180831161177357829003601f168201915b5050505050905061050b565b6117a4610a80565b6040516020016117b49190611f80565b604051602081830303815290604052905090565b60606117d3826110b5565b6118375760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610576565b60006118416116f1565b905060008151116118615760405180602001604052806000815250610f4e565b8061186b8461199f565b60405160200161187c929190611f51565b6040516020818303038152906040529392505050565b60006001600160a01b0384163b1561199457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118d6903390899088908890600401611fe5565b602060405180830381600087803b1580156118f057600080fd5b505af1925050508015611920575060408051601f3d908101601f1916820190925261191d91810190611ec3565b60015b61197a573d80801561194e576040519150601f19603f3d011682016040523d82523d6000602084013e611953565b606091505b5080516119725760405162461bcd60e51b815260040161057690612035565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610d3f565b506001949350505050565b6060816119c457506040805180820190915260018152600360fc1b6020820152610476565b8160005b81156119ee57806119d88161220c565b91506119e79050600a8361217a565b91506119c8565b60008167ffffffffffffffff811115611a1757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611a41576020820181803683370190505b5090505b8415610d3f57611a5660018361218e565b9150611a63600a86612227565b611a6e906030612162565b60f81b818381518110611a9157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611ab3600a8661217a565b9450611a45565b828054611ac6906121d1565b90600052602060002090601f016020900481019282611ae85760008555611b2e565b82601f10611b0157805160ff1916838001178555611b2e565b82800160010185558215611b2e579182015b82811115611b2e578251825591602001919060010190611b13565b50611b3a929150611b3e565b5090565b5b80821115611b3a5760008155600101611b3f565b600067ffffffffffffffff831115611b6d57611b6d612267565b611b80601f8401601f191660200161210d565b9050828152838383011115611b9457600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461047657600080fd5b600082601f830112611bd2578081fd5b81356020611be7611be28361213e565b61210d565b80838252828201915082860187848660051b8901011115611c06578586fd5b855b85811015611c2457813584529284019290840190600101611c08565b5090979650505050505050565b600060208284031215611c42578081fd5b610f4e82611bab565b60008060408385031215611c5d578081fd5b611c6683611bab565b9150611c7460208401611bab565b90509250929050565b600080600060608486031215611c91578081fd5b611c9a84611bab565b9250611ca860208501611bab565b9150604084013590509250925092565b60008060008060808587031215611ccd578081fd5b611cd685611bab565b9350611ce460208601611bab565b925060408501359150606085013567ffffffffffffffff811115611d06578182fd5b8501601f81018713611d16578182fd5b611d2587823560208401611b53565b91505092959194509250565b60008060408385031215611d43578182fd5b611d4c83611bab565b91506020830135611d5c8161227d565b809150509250929050565b60008060408385031215611d79578182fd5b611d8283611bab565b946020939093013593505050565b60008060408385031215611da2578182fd5b823567ffffffffffffffff80821115611db9578384fd5b818501915085601f830112611dcc578384fd5b81356020611ddc611be28361213e565b8083825282820191508286018a848660051b8901011115611dfb578889fd5b8896505b84871015611e2457611e1081611bab565b835260019690960195918301918301611dff565b5096505086013592505080821115611e3a578283fd5b50611e4785828601611bc2565b9150509250929050565b600060208284031215611e62578081fd5b8151610f4e8161227d565b600060208284031215611e7e578081fd5b5035919050565b60008060408385031215611e97578182fd5b82359150611c7460208401611bab565b600060208284031215611eb8578081fd5b8135610f4e8161228e565b600060208284031215611ed4578081fd5b8151610f4e8161228e565b600060208284031215611ef0578081fd5b813567ffffffffffffffff811115611f06578182fd5b8201601f81018413611f16578182fd5b610d3f84823560208401611b53565b60008151808452611f3d8160208601602086016121a5565b601f01601f19169290920160200192915050565b60008351611f638184602088016121a5565b835190830190611f778183602088016121a5565b01949350505050565b60007f68747470733a2f2f6d657461646174612d6f617369732e66696e616e6369652e82526b6a702f6d657461646174612f60a01b60208301528251611fcd81602c8501602087016121a5565b602f60f81b602c939091019283015250602d01919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061201890830184611f25565b9695505050505050565b600060208252610f4e6020830184611f25565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561213657612136612267565b604052919050565b600067ffffffffffffffff82111561215857612158612267565b5060051b60200190565b600082198211156121755761217561223b565b500190565b60008261218957612189612251565b500490565b6000828210156121a0576121a061223b565b500390565b60005b838110156121c05781810151838201526020016121a8565b83811115610bd65750506000910152565b600181811c908216806121e557607f821691505b6020821081141561220657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156122205761222061223b565b5060010190565b60008261223657612236612251565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461228b57600080fd5b50565b6001600160e01b03198116811461228b57600080fdfea2646970667358221220a60ac0370f7578c5a92049da6f411f9611499cbe70cea764bb7b5190f3b6e68664736f6c634300080300339f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6
Deployed ByteCode Sourcemap
49101:93:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48729:301;;;;;;:::i;:::-;;:::i;:::-;;;9212:14:1;;9205:22;9187:41;;9175:2;9160:18;48729:301:0;;;;;;;;33005:100;;;:::i;:::-;;;;;;;:::i;34472:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8120:32:1;;;8102:51;;8090:2;8075:18;34472:221:0;8057:102:1;34002:404:0;;;;;;:::i;:::-;;:::i;:::-;;35362:305;;;;;;:::i;:::-;;:::i;9836:123::-;;;;;;:::i;:::-;9902:7;9929:12;;;;;;;;;;:22;;;;9836:123;;;;9385:25:1;;;9373:2;9358:18;9836:123:0;9340:76:1;10221:232:0;;;;;;:::i;:::-;;:::i;11440:218::-;;;;;;:::i;:::-;;:::i;46446:228::-;;;;;;:::i;:::-;;:::i;35738:151::-;;;;;;:::i;:::-;;:::i;46117:35::-;;;;;-1:-1:-1;;;;;46117:35:0;;;47157:102;;;;;;:::i;:::-;;:::i;47267:::-;;;;;;:::i;:::-;;:::i;32699:239::-;;;;;;:::i;:::-;;:::i;32429:208::-;;;;;;:::i;:::-;;:::i;3160:148::-;;;:::i;2509:87::-;2582:6;;-1:-1:-1;;;;;2582:6:0;2509:87;;9508:139;;;;;;:::i;:::-;;:::i;33174:104::-;;;:::i;47774:153::-;;;;;;:::i;:::-;;:::i;7964:49::-;;8009:4;7964:49;;47935:394;;;;;;:::i;:::-;;:::i;35960:285::-;;;;;;:::i;:::-;;:::i;44341:679::-;;;;;;:::i;:::-;;:::i;46017:62::-;;46055:24;46017:62;;10698:235;;;;;;:::i;:::-;;:::i;47035:114::-;;;;;;:::i;:::-;;:::i;46682:345::-;;;;;;:::i;:::-;;:::i;48337:384::-;;;;;;:::i;:::-;;:::i;3463:244::-;;;;;;:::i;:::-;;:::i;48729:301::-;48882:4;48924:44;48956:11;48924:31;:44::i;:::-;:98;;;;48985:37;49010:11;48985:24;:37::i;:::-;48904:118;;48729:301;;;;:::o;33005:100::-;33059:13;33092:5;33085:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33005:100;;:::o;34472:221::-;34548:7;34576:16;34584:7;34576;:16::i;:::-;34568:73;;;;-1:-1:-1;;;34568:73:0;;15289:2:1;34568:73:0;;;15271:21:1;15328:2;15308:18;;;15301:30;15367:34;15347:18;;;15340:62;-1:-1:-1;;;15418:18:1;;;15411:42;15470:19;;34568:73:0;;;;;;;;;-1:-1:-1;34661:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34661:24:0;;34472:221::o;34002:404::-;34083:13;34099:23;34114:7;34099:14;:23::i;:::-;34083:39;;34147:5;-1:-1:-1;;;;;34141:11:0;:2;-1:-1:-1;;;;;34141:11:0;;;34133:57;;;;-1:-1:-1;;;34133:57:0;;16889:2:1;34133:57:0;;;16871:21:1;16928:2;16908:18;;;16901:30;16967:34;16947:18;;;16940:62;-1:-1:-1;;;17018:18:1;;;17011:31;17059:19;;34133:57:0;16861:223:1;34133:57:0;1128:10;-1:-1:-1;;;;;34211:21:0;;;;:69;;-1:-1:-1;34236:44:0;34260:5;1128:10;34236:23;:44::i;:::-;34203:161;;;;-1:-1:-1;;;34203:161:0;;13264:2:1;34203:161:0;;;13246:21:1;13303:2;13283:18;;;13276:30;13342:34;13322:18;;;13315:62;13413:26;13393:18;;;13386:54;13457:19;;34203:161:0;13236:246:1;34203:161:0;34377:21;34386:2;34390:7;34377:8;:21::i;:::-;34002:404;;;:::o;35362:305::-;35523:41;1128:10;35556:7;35523:18;:41::i;:::-;35515:103;;;;-1:-1:-1;;;35515:103:0;;;;;;;:::i;:::-;35631:28;35641:4;35647:2;35651:7;35631:9;:28::i;10221:232::-;9902:7;9929:12;;;;;;;;;;:22;;;10314:41;;10322:18;1128:10;10342:12;1048:98;10314:41;10306:101;;;;-1:-1:-1;;;10306:101:0;;10076:2:1;10306:101:0;;;10058:21:1;10115:2;10095:18;;;10088:30;10154:34;10134:18;;;10127:62;-1:-1:-1;;;10205:18:1;;;10198:45;10260:19;;10306:101:0;10048:237:1;10306:101:0;10420:25;10431:4;10437:7;10420:10;:25::i;:::-;10221:232;;:::o;11440:218::-;-1:-1:-1;;;;;11536:23:0;;1128:10;11536:23;11528:83;;;;-1:-1:-1;;;11528:83:0;;18476:2:1;11528:83:0;;;18458:21:1;18515:2;18495:18;;;18488:30;18554:34;18534:18;;;18527:62;-1:-1:-1;;;18605:18:1;;;18598:45;18660:19;;11528:83:0;18448:237:1;11528:83:0;11624:26;11636:4;11642:7;11624:11;:26::i;46446:228::-;46529:34;46055:24;1128:10;46550:12;1048:98;46529:34;46507:128;;;;-1:-1:-1;;;46507:128:0;;18063:2:1;46507:128:0;;;18045:21:1;18102:2;18082:18;;;18075:30;18141:34;18121:18;;;18114:62;-1:-1:-1;;;18192:18:1;;;18185:42;18244:19;;46507:128:0;18035:234:1;46507:128:0;46648:18;46654:2;46658:7;46648:5;:18::i;35738:151::-;35842:39;35859:4;35865:2;35869:7;35842:39;;;;;;;;;;;;:16;:39::i;47157:102::-;47211:4;47235:16;47243:7;47235;:16::i;47267:102::-;2582:6;;-1:-1:-1;;;;;2582:6:0;1128:10;2729:23;2721:68;;;;-1:-1:-1;;;2721:68:0;;;;;;;:::i;:::-;47342:19;;::::1;::::0;:7:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;32699:239::-:0;32771:7;32807:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32807:16:0;32842:19;32834:73;;;;-1:-1:-1;;;32834:73:0;;14100:2:1;32834:73:0;;;14082:21:1;14139:2;14119:18;;;14112:30;14178:34;14158:18;;;14151:62;-1:-1:-1;;;14229:18:1;;;14222:39;14278:19;;32834:73:0;14072:231:1;32429:208:0;32501:7;-1:-1:-1;;;;;32529:19:0;;32521:74;;;;-1:-1:-1;;;32521:74:0;;13689:2:1;32521:74:0;;;13671:21:1;13728:2;13708:18;;;13701:30;13767:34;13747:18;;;13740:62;-1:-1:-1;;;13818:18:1;;;13811:40;13868:19;;32521:74:0;13661:232:1;32521:74:0;-1:-1:-1;;;;;;32613:16:0;;;;;:9;:16;;;;;;;32429:208::o;3160:148::-;2582:6;;-1:-1:-1;;;;;2582:6:0;1128:10;2729:23;2721:68;;;;-1:-1:-1;;;2721:68:0;;;;;;;:::i;:::-;3251:6:::1;::::0;3230:40:::1;::::0;3267:1:::1;::::0;-1:-1:-1;;;;;3251:6:0::1;::::0;3230:40:::1;::::0;3267:1;;3230:40:::1;3281:6;:19:::0;;-1:-1:-1;;;;;;3281:19:0::1;::::0;;3160:148::o;9508:139::-;9586:4;9610:12;;;;;;;;;;;-1:-1:-1;;;;;9610:29:0;;;;;;;;;;;;9508:139;;;;;:::o;33174:104::-;33230:13;33263:7;33256:14;;;;;:::i;47774:153::-;2582:6;;-1:-1:-1;;;;;2582:6:0;1128:10;2729:23;2721:68;;;;-1:-1:-1;;;2721:68:0;;;;;;;:::i;:::-;47842:13:::1;:36:::0;;-1:-1:-1;;;;;;47842:36:0::1;-1:-1:-1::0;;;;;47842:36:0;::::1;::::0;;::::1;::::0;;;47894:25:::1;::::0;8102:51:1;;;47894:25:0::1;::::0;8090:2:1;8075:18;47894:25:0::1;;;;;;;47774:153:::0;:::o;47935:394::-;48089:13;;-1:-1:-1;;;;;48089:13:0;48081:38;;;;:83;;-1:-1:-1;21739:20:0;;21778:8;;48136:28;48063:204;;;48191:13;;:64;;-1:-1:-1;;;48191:64:0;;48223:10;48191:64;;;8398:34:1;-1:-1:-1;;;;;8468:15:1;;;8448:18;;;8441:43;8527:14;;8520:22;8500:18;;;8493:50;48191:13:0;;;;:31;;8333:18:1;;48191:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48063:204;48277:44;48301:8;48311:9;48277:23;:44::i;35960:285::-;36092:41;1128:10;36125:7;36092:18;:41::i;:::-;36084:103;;;;-1:-1:-1;;;36084:103:0;;;;;;;:::i;:::-;36198:39;36212:4;36218:2;36222:7;36231:5;36198:13;:39::i;:::-;35960:285;;;;:::o;44341:679::-;44414:13;44448:16;44456:7;44448;:16::i;:::-;44440:78;;;;-1:-1:-1;;;44440:78:0;;14871:2:1;44440:78:0;;;14853:21:1;14910:2;14890:18;;;14883:30;14949:34;14929:18;;;14922:62;-1:-1:-1;;;15000:18:1;;;14993:47;15057:19;;44440:78:0;14843:239:1;44440:78:0;44531:23;44557:19;;;:10;:19;;;;;44531:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44587:18;44608:10;:8;:10::i;:::-;44587:31;;44700:4;44694:18;44716:1;44694:23;44690:72;;;-1:-1:-1;44741:9:0;-1:-1:-1;44734:16:0;;44690:72;44866:23;;:27;44862:108;;44941:4;44947:9;44924:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44910:48;;;;;;44862:108;44989:23;45004:7;44989:14;:23::i;:::-;44982:30;44341:679;-1:-1:-1;;;;44341:679:0:o;10698:235::-;9902:7;9929:12;;;;;;;;;;:22;;;10792:41;;10800:18;9836:123;10792:41;10784:102;;;;-1:-1:-1;;;10784:102:0;;12847:2:1;10784:102:0;;;12829:21:1;12886:2;12866:18;;;12859:30;12925:34;12905:18;;;12898:62;-1:-1:-1;;;12976:18:1;;;12969:46;13032:19;;10784:102:0;12819:238:1;47035:114:0;47124:17;47129:2;47133:7;47124:4;:17::i;46682:345::-;46827:12;:19;46809:7;:14;:37;46787:112;;;;-1:-1:-1;;;46787:112:0;;17709:2:1;46787:112:0;;;17691:21:1;17748:2;17728:18;;;17721:30;17787:27;17767:18;;;17760:55;17832:18;;46787:112:0;17681:175:1;46787:112:0;46915:9;46910:110;46934:12;:19;46930:1;:23;46910:110;;;46975:33;46980:7;46988:1;46980:10;;;;;;-1:-1:-1;;;46980:10:0;;;;;;;;;;;;;;;46992:12;47005:1;46992:15;;;;;;-1:-1:-1;;;46992:15:0;;;;;;;;;;;;;;;46975:4;:33::i;:::-;46955:3;;;;:::i;:::-;;;;46910:110;;48337:384;48463:4;48485:13;48501:40;48524:6;48532:8;48501:22;:40::i;:::-;48564:13;;48485:56;;-1:-1:-1;;;;;;48564:13:0;48556:38;48552:136;;48618:13;;:58;;-1:-1:-1;;;48618:58:0;;-1:-1:-1;;;;;8416:15:1;;;48618:58:0;;;8398:34:1;8468:15;;;8448:18;;;8441:43;8527:14;;8520:22;8500:18;;;8493:50;48618:13:0;;;;:30;;8333:18:1;;48618:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48611:65;;;;;48552:136;48705:8;48337:384;-1:-1:-1;;;48337:384:0:o;3463:244::-;2582:6;;-1:-1:-1;;;;;2582:6:0;1128:10;2729:23;2721:68;;;;-1:-1:-1;;;2721:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3552:22:0;::::1;3544:73;;;::::0;-1:-1:-1;;;3544:73:0;;10911:2:1;3544:73:0::1;::::0;::::1;10893:21:1::0;10950:2;10930:18;;;10923:30;10989:34;10969:18;;;10962:62;-1:-1:-1;;;11040:18:1;;;11033:36;11086:19;;3544:73:0::1;10883:228:1::0;3544:73:0::1;3654:6;::::0;3633:38:::1;::::0;-1:-1:-1;;;;;3633:38:0;;::::1;::::0;3654:6:::1;::::0;3633:38:::1;::::0;3654:6:::1;::::0;3633:38:::1;3682:6;:17:::0;;-1:-1:-1;;;;;;3682:17:0::1;-1:-1:-1::0;;;;;3682:17:0;;;::::1;::::0;;;::::1;::::0;;3463:244::o;9199:217::-;9284:4;-1:-1:-1;;;;;;9308:47:0;;-1:-1:-1;;;9308:47:0;;:100;;-1:-1:-1;;;;;;;;;;5508:40:0;;;9372:36;5399:157;32073:292;32175:4;-1:-1:-1;;;;;;32199:40:0;;-1:-1:-1;;;32199:40:0;;:105;;-1:-1:-1;;;;;;;32256:48:0;;-1:-1:-1;;;32256:48:0;32199:105;:158;;;;32321:36;32345:11;32321:23;:36::i;37712:127::-;37777:4;37801:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37801:16:0;:30;;;37712:127::o;35131:164::-;-1:-1:-1;;;;;35252:25:0;;;35228:4;35252:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;35131:164::o;41596:174::-;41671:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;41671:29:0;-1:-1:-1;;;;;41671:29:0;;;;;;;;:24;;41725:23;41671:24;41725:14;:23::i;:::-;-1:-1:-1;;;;;41716:46:0;;;;;;;;;;;41596:174;;:::o;38006:355::-;38099:4;38124:16;38132:7;38124;:16::i;:::-;38116:73;;;;-1:-1:-1;;;38116:73:0;;12434:2:1;38116:73:0;;;12416:21:1;12473:2;12453:18;;;12446:30;12512:34;12492:18;;;12485:62;-1:-1:-1;;;12563:18:1;;;12556:42;12615:19;;38116:73:0;12406:234:1;38116:73:0;38200:13;38216:23;38231:7;38216:14;:23::i;:::-;38200:39;;38269:5;-1:-1:-1;;;;;38258:16:0;:7;-1:-1:-1;;;;;38258:16:0;;:51;;;;38302:7;-1:-1:-1;;;;;38278:31:0;:20;38290:7;38278:11;:20::i;:::-;-1:-1:-1;;;;;38278:31:0;;38258:51;:94;;;;38313:39;38337:5;38344:7;38313:23;:39::i;40934:544::-;41059:4;-1:-1:-1;;;;;41032:31:0;:23;41047:7;41032:14;:23::i;:::-;-1:-1:-1;;;;;41032:31:0;;41024:85;;;;-1:-1:-1;;;41024:85:0;;16063:2:1;41024:85:0;;;16045:21:1;16102:2;16082:18;;;16075:30;16141:34;16121:18;;;16114:62;-1:-1:-1;;;16192:18:1;;;16185:39;16241:19;;41024:85:0;16035:231:1;41024:85:0;-1:-1:-1;;;;;41128:16:0;;41120:65;;;;-1:-1:-1;;;41120:65:0;;11675:2:1;41120:65:0;;;11657:21:1;11714:2;11694:18;;;11687:30;11753:34;11733:18;;;11726:62;-1:-1:-1;;;11804:18:1;;;11797:34;11848:19;;41120:65:0;11647:226:1;41120:65:0;41302:29;41319:1;41323:7;41302:8;:29::i;:::-;-1:-1:-1;;;;;41344:15:0;;;;;;:9;:15;;;;;:20;;41363:1;;41344:15;:20;;41363:1;;41344:20;:::i;:::-;;;;-1:-1:-1;;;;;;;41375:13:0;;;;;;:9;:13;;;;;:18;;41392:1;;41375:13;:18;;41392:1;;41375:18;:::i;:::-;;;;-1:-1:-1;;41404:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41404:21:0;-1:-1:-1;;;;;41404:21:0;;;;;;;;;41443:27;;41404:16;;41443:27;;;;;;;40934:544;;;:::o;12688:229::-;12763:22;12771:4;12777:7;12763;:22::i;:::-;12758:152;;12802:6;:12;;;;;;;;;;;-1:-1:-1;;;;;12802:29:0;;;;;;;;;:36;;-1:-1:-1;;12802:36:0;12834:4;12802:36;;;12885:12;1128:10;1048:98;;12885:12;-1:-1:-1;;;;;12858:40:0;12876:7;-1:-1:-1;;;;;12858:40:0;12870:4;12858:40;;;;;;;;;;12688:229;;:::o;12925:230::-;13000:22;13008:4;13014:7;13000;:22::i;:::-;12996:152;;;13071:5;13039:12;;;;;;;;;;;-1:-1:-1;;;;;13039:29:0;;;;;;;;;;:37;;-1:-1:-1;;13039:37:0;;;13096:40;1128:10;;13039:12;;13096:40;;13071:5;13096:40;12925:230;;:::o;39626:382::-;-1:-1:-1;;;;;39706:16:0;;39698:61;;;;-1:-1:-1;;;39698:61:0;;14510:2:1;39698:61:0;;;14492:21:1;;;14529:18;;;14522:30;14588:34;14568:18;;;14561:62;14640:18;;39698:61:0;14482:182:1;39698:61:0;39779:16;39787:7;39779;:16::i;:::-;39778:17;39770:58;;;;-1:-1:-1;;;39770:58:0;;11318:2:1;39770:58:0;;;11300:21:1;11357:2;11337:18;;;11330:30;11396;11376:18;;;11369:58;11444:18;;39770:58:0;11290:178:1;39770:58:0;-1:-1:-1;;;;;39899:13:0;;;;;;:9;:13;;;;;:18;;39916:1;;39899:13;:18;;39916:1;;39899:18;:::i;:::-;;;;-1:-1:-1;;39928:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39928:21:0;-1:-1:-1;;;;;39928:21:0;;;;;;;;39967:33;;39928:16;;;39967:33;;39928:16;;39967:33;39626:382;;:::o;34765:295::-;-1:-1:-1;;;;;34868:24:0;;1128:10;34868:24;;34860:62;;;;-1:-1:-1;;;34860:62:0;;12080:2:1;34860:62:0;;;12062:21:1;12119:2;12099:18;;;12092:30;12158:27;12138:18;;;12131:55;12203:18;;34860:62:0;12052:175:1;34860:62:0;1128:10;34935:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34935:42:0;;;;;;;;;;:53;;-1:-1:-1;;34935:53:0;;;;;;;:42;-1:-1:-1;;;;;35004:48:0;;35043:8;35004:48;;;;9212:14:1;9205:22;9187:41;;9175:2;9160:18;;9142:92;35004:48:0;;;;;;;;34765:295;;:::o;37127:272::-;37241:28;37251:4;37257:2;37261:7;37241:9;:28::i;:::-;37288:48;37311:4;37317:2;37321:7;37330:5;37288:22;:48::i;:::-;37280:111;;;;-1:-1:-1;;;37280:111:0;;;;;;;:::i;47377:389::-;47429:13;47483:1;47465:7;47459:21;;;;;:::i;:::-;;;:25;47455:72;;;47508:7;47501:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47455:72;47690:8;:6;:8::i;:::-;47582:161;;;;;;;;:::i;:::-;;;;;;;;;;;;;47537:221;;47377:389;:::o;33349:360::-;33422:13;33456:16;33464:7;33456;:16::i;:::-;33448:76;;;;-1:-1:-1;;;33448:76:0;;16473:2:1;33448:76:0;;;16455:21:1;16512:2;16492:18;;;16485:30;16551:34;16531:18;;;16524:62;-1:-1:-1;;;16602:18:1;;;16595:45;16657:19;;33448:76:0;16445:237:1;33448:76:0;33537:21;33561:10;:8;:10::i;:::-;33537:34;;33613:1;33595:7;33589:21;:25;:112;;;;;;;;;;;;;;;;;33654:7;33663:18;:7;:16;:18::i;:::-;33637:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33582:119;33349:360;-1:-1:-1;;;33349:360:0:o;42335:843::-;42456:4;-1:-1:-1;;;;;42482:13:0;;21739:20;21778:8;42478:693;;42518:72;;-1:-1:-1;;;42518:72:0;;-1:-1:-1;;;;;42518:36:0;;;;;:72;;1128:10;;42569:4;;42575:7;;42584:5;;42518:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42518:72:0;;;;;;;;-1:-1:-1;;42518:72:0;;;;;;;;;;;;:::i;:::-;;;42514:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42764:13:0;;42760:341;;42807:60;;-1:-1:-1;;;42807:60:0;;;;;;;:::i;42760:341::-;43051:6;43045:13;43036:6;43032:2;43028:15;43021:38;42514:602;-1:-1:-1;;;;;;42641:55:0;-1:-1:-1;;;42641:55:0;;-1:-1:-1;42634:62:0;;42478:693;-1:-1:-1;43155:4:0;42335:843;;;;;;:::o;28957:723::-;29013:13;29234:10;29230:53;;-1:-1:-1;29261:10:0;;;;;;;;;;;;-1:-1:-1;;;29261:10:0;;;;;;29230:53;29308:5;29293:12;29349:78;29356:9;;29349:78;;29382:8;;;;:::i;:::-;;-1:-1:-1;29405:10:0;;-1:-1:-1;29413:2:0;29405:10;;:::i;:::-;;;29349:78;;;29437:19;29469:6;29459:17;;;;;;-1:-1:-1;;;29459:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29459:17:0;;29437:39;;29487:154;29494:10;;29487:154;;29521:11;29531:1;29521:11;;:::i;:::-;;-1:-1:-1;29590:10:0;29598:2;29590:5;:10;:::i;:::-;29577:24;;:2;:24;:::i;:::-;29564:39;;29547:6;29554;29547:14;;;;;;-1:-1:-1;;;29547:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;29547:56:0;;;;;;;;-1:-1:-1;29618:11:0;29627:2;29618:11;;:::i;:::-;;;29487:154;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:2;;588:1;585;578:12;603:693;;710:3;703:4;695:6;691:17;687:27;677:2;;732:5;725;718:20;677:2;772:6;759:20;798:4;822:60;838:43;878:2;838:43;:::i;:::-;822:60;:::i;:::-;904:3;928:2;923:3;916:15;956:2;951:3;947:12;940:19;;991:2;983:6;979:15;1043:3;1038:2;1032;1029:1;1025:10;1017:6;1013:23;1009:32;1006:41;1003:2;;;1064:5;1057;1050:20;1003:2;1090:5;1104:163;1118:2;1115:1;1112:9;1104:163;;;1175:17;;1163:30;;1213:12;;;;1245;;;;1136:1;1129:9;1104:163;;;-1:-1:-1;1285:5:1;;667:629;-1:-1:-1;;;;;;;667:629:1:o;1301:196::-;;1413:2;1401:9;1392:7;1388:23;1384:32;1381:2;;;1434:6;1426;1419:22;1381:2;1462:29;1481:9;1462:29;:::i;1502:270::-;;;1631:2;1619:9;1610:7;1606:23;1602:32;1599:2;;;1652:6;1644;1637:22;1599:2;1680:29;1699:9;1680:29;:::i;:::-;1670:39;;1728:38;1762:2;1751:9;1747:18;1728:38;:::i;:::-;1718:48;;1589:183;;;;;:::o;1777:338::-;;;;1923:2;1911:9;1902:7;1898:23;1894:32;1891:2;;;1944:6;1936;1929:22;1891:2;1972:29;1991:9;1972:29;:::i;:::-;1962:39;;2020:38;2054:2;2043:9;2039:18;2020:38;:::i;:::-;2010:48;;2105:2;2094:9;2090:18;2077:32;2067:42;;1881:234;;;;;:::o;2120:696::-;;;;;2292:3;2280:9;2271:7;2267:23;2263:33;2260:2;;;2314:6;2306;2299:22;2260:2;2342:29;2361:9;2342:29;:::i;:::-;2332:39;;2390:38;2424:2;2413:9;2409:18;2390:38;:::i;:::-;2380:48;;2475:2;2464:9;2460:18;2447:32;2437:42;;2530:2;2519:9;2515:18;2502:32;2557:18;2549:6;2546:30;2543:2;;;2594:6;2586;2579:22;2543:2;2622:22;;2675:4;2667:13;;2663:27;-1:-1:-1;2653:2:1;;2709:6;2701;2694:22;2653:2;2737:73;2802:7;2797:2;2784:16;2779:2;2775;2771:11;2737:73;:::i;:::-;2727:83;;;2250:566;;;;;;;:::o;2821:325::-;;;2947:2;2935:9;2926:7;2922:23;2918:32;2915:2;;;2968:6;2960;2953:22;2915:2;2996:29;3015:9;2996:29;:::i;:::-;2986:39;;3075:2;3064:9;3060:18;3047:32;3088:28;3110:5;3088:28;:::i;:::-;3135:5;3125:15;;;2905:241;;;;;:::o;3151:264::-;;;3280:2;3268:9;3259:7;3255:23;3251:32;3248:2;;;3301:6;3293;3286:22;3248:2;3329:29;3348:9;3329:29;:::i;:::-;3319:39;3405:2;3390:18;;;;3377:32;;-1:-1:-1;;;3238:177:1:o;3420:1212::-;;;3599:2;3587:9;3578:7;3574:23;3570:32;3567:2;;;3620:6;3612;3605:22;3567:2;3665:9;3652:23;3694:18;3735:2;3727:6;3724:14;3721:2;;;3756:6;3748;3741:22;3721:2;3799:6;3788:9;3784:22;3774:32;;3844:7;3837:4;3833:2;3829:13;3825:27;3815:2;;3871:6;3863;3856:22;3815:2;3912;3899:16;3934:4;3958:60;3974:43;4014:2;3974:43;:::i;3958:60::-;4040:3;4064:2;4059:3;4052:15;4092:2;4087:3;4083:12;4076:19;;4123:2;4119;4115:11;4171:7;4166:2;4160;4157:1;4153:10;4149:2;4145:19;4141:28;4138:41;4135:2;;;4197:6;4189;4182:22;4135:2;4224:6;4215:15;;4239:169;4253:2;4250:1;4247:9;4239:169;;;4310:23;4329:3;4310:23;:::i;:::-;4298:36;;4271:1;4264:9;;;;;4354:12;;;;4386;;4239:169;;;-1:-1:-1;4427:5:1;-1:-1:-1;;4470:18:1;;4457:32;;-1:-1:-1;;4501:16:1;;;4498:2;;;4535:6;4527;4520:22;4498:2;;4563:63;4618:7;4607:8;4596:9;4592:24;4563:63;:::i;:::-;4553:73;;;3557:1075;;;;;:::o;4637:255::-;;4757:2;4745:9;4736:7;4732:23;4728:32;4725:2;;;4778:6;4770;4763:22;4725:2;4815:9;4809:16;4834:28;4856:5;4834:28;:::i;4897:190::-;;5009:2;4997:9;4988:7;4984:23;4980:32;4977:2;;;5030:6;5022;5015:22;4977:2;-1:-1:-1;5058:23:1;;4967:120;-1:-1:-1;4967:120:1:o;5092:264::-;;;5221:2;5209:9;5200:7;5196:23;5192:32;5189:2;;;5242:6;5234;5227:22;5189:2;5283:9;5270:23;5260:33;;5312:38;5346:2;5335:9;5331:18;5312:38;:::i;5361:255::-;;5472:2;5460:9;5451:7;5447:23;5443:32;5440:2;;;5493:6;5485;5478:22;5440:2;5537:9;5524:23;5556:30;5580:5;5556:30;:::i;5621:259::-;;5743:2;5731:9;5722:7;5718:23;5714:32;5711:2;;;5764:6;5756;5749:22;5711:2;5801:9;5795:16;5820:30;5844:5;5820:30;:::i;5885:480::-;;6007:2;5995:9;5986:7;5982:23;5978:32;5975:2;;;6028:6;6020;6013:22;5975:2;6073:9;6060:23;6106:18;6098:6;6095:30;6092:2;;;6143:6;6135;6128:22;6092:2;6171:22;;6224:4;6216:13;;6212:27;-1:-1:-1;6202:2:1;;6258:6;6250;6243:22;6202:2;6286:73;6351:7;6346:2;6333:16;6328:2;6324;6320:11;6286:73;:::i;6565:257::-;;6644:5;6638:12;6671:6;6666:3;6659:19;6687:63;6743:6;6736:4;6731:3;6727:14;6720:4;6713:5;6709:16;6687:63;:::i;:::-;6804:2;6783:15;-1:-1:-1;;6779:29:1;6770:39;;;;6811:4;6766:50;;6614:208;-1:-1:-1;;6614:208:1:o;6827:470::-;;7044:6;7038:13;7060:53;7106:6;7101:3;7094:4;7086:6;7082:17;7060:53;:::i;:::-;7176:13;;7135:16;;;;7198:57;7176:13;7135:16;7232:4;7220:17;;7198:57;:::i;:::-;7271:20;;7014:283;-1:-1:-1;;;;7014:283:1:o;7302:649::-;;7665:34;7660:3;7653:47;-1:-1:-1;;;7725:2:1;7720:3;7716:12;7709:36;7774:6;7768:13;7790:60;7843:6;7838:2;7833:3;7829:12;7824:2;7816:6;7812:15;7790:60;:::i;:::-;-1:-1:-1;;;7909:2:1;7869:16;;;;7901:11;;;7894:24;-1:-1:-1;7942:2:1;7934:11;;7643:308;-1:-1:-1;7643:308:1:o;8554:488::-;-1:-1:-1;;;;;8823:15:1;;;8805:34;;8875:15;;8870:2;8855:18;;8848:43;8922:2;8907:18;;8900:34;;;8970:3;8965:2;8950:18;;8943:31;;;8554:488;;8991:45;;9016:19;;9008:6;8991:45;:::i;:::-;8983:53;8757:285;-1:-1:-1;;;;;;8757:285:1:o;9650:219::-;;9799:2;9788:9;9781:21;9819:44;9859:2;9848:9;9844:18;9836:6;9819:44;:::i;10290:414::-;10492:2;10474:21;;;10531:2;10511:18;;;10504:30;10570:34;10565:2;10550:18;;10543:62;-1:-1:-1;;;10636:2:1;10621:18;;10614:48;10694:3;10679:19;;10464:240::o;15500:356::-;15702:2;15684:21;;;15721:18;;;15714:30;15780:34;15775:2;15760:18;;15753:62;15847:2;15832:18;;15674:182::o;17089:413::-;17291:2;17273:21;;;17330:2;17310:18;;;17303:30;17369:34;17364:2;17349:18;;17342:62;-1:-1:-1;;;17435:2:1;17420:18;;17413:47;17492:3;17477:19;;17263:239::o;18872:275::-;18943:2;18937:9;19008:2;18989:13;;-1:-1:-1;;18985:27:1;18973:40;;19043:18;19028:34;;19064:22;;;19025:62;19022:2;;;19090:18;;:::i;:::-;19126:2;19119:22;18917:230;;-1:-1:-1;18917:230:1:o;19152:183::-;;19245:18;19237:6;19234:30;19231:2;;;19267:18;;:::i;:::-;-1:-1:-1;19312:1:1;19308:14;19324:4;19304:25;;19221:114::o;19340:128::-;;19411:1;19407:6;19404:1;19401:13;19398:2;;;19417:18;;:::i;:::-;-1:-1:-1;19453:9:1;;19388:80::o;19473:120::-;;19539:1;19529:2;;19544:18;;:::i;:::-;-1:-1:-1;19578:9:1;;19519:74::o;19598:125::-;;19666:1;19663;19660:8;19657:2;;;19671:18;;:::i;:::-;-1:-1:-1;19708:9:1;;19647:76::o;19728:258::-;19800:1;19810:113;19824:6;19821:1;19818:13;19810:113;;;19900:11;;;19894:18;19881:11;;;19874:39;19846:2;19839:10;19810:113;;;19941:6;19938:1;19935:13;19932:2;;;-1:-1:-1;;19976:1:1;19958:16;;19951:27;19781:205::o;19991:380::-;20070:1;20066:12;;;;20113;;;20134:2;;20188:4;20180:6;20176:17;20166:27;;20134:2;20241;20233:6;20230:14;20210:18;20207:38;20204:2;;;20287:10;20282:3;20278:20;20275:1;20268:31;20322:4;20319:1;20312:15;20350:4;20347:1;20340:15;20204:2;;20046:325;;;:::o;20376:135::-;;-1:-1:-1;;20436:17:1;;20433:2;;;20456:18;;:::i;:::-;-1:-1:-1;20503:1:1;20492:13;;20423:88::o;20516:112::-;;20574:1;20564:2;;20579:18;;:::i;:::-;-1:-1:-1;20613:9:1;;20554:74::o;20633:127::-;20694:10;20689:3;20685:20;20682:1;20675:31;20725:4;20722:1;20715:15;20749:4;20746:1;20739:15;20765:127;20826:10;20821:3;20817:20;20814:1;20807:31;20857:4;20854:1;20847:15;20881:4;20878:1;20871:15;20897:127;20958:10;20953:3;20949:20;20946:1;20939:31;20989:4;20986:1;20979:15;21013:4;21010:1;21003:15;21029:118;21115:5;21108:13;21101:21;21094:5;21091:32;21081:2;;21137:1;21134;21127:12;21081:2;21071:76;:::o;21152:131::-;-1:-1:-1;;;;;;21226:32:1;;21216:43;;21206:2;;21273:1;21270;21263:12
Swarm Source
ipfs://a60ac0370f7578c5a92049da6f411f9611499cbe70cea764bb7b5190f3b6e686
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
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.